|
|
|
/* This file is part of the KDE project
|
|
|
|
Copyright (C) 2002 Nash Hoogwater <nrhoogwater@wanadoo.nl>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Library General Public
|
|
|
|
License as published by the Free Software Foundation; using
|
|
|
|
version 2 of the License.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Library General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "KWTableStyle.h"
|
|
|
|
#include "KWDocument.h"
|
|
|
|
#include "KWFrame.h"
|
|
|
|
|
|
|
|
#include <KoGenStyles.h>
|
|
|
|
#include <KoOasisStyles.h>
|
|
|
|
#include <KoOasisContext.h>
|
|
|
|
#include <KoXmlNS.h>
|
|
|
|
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <tqdom.h>
|
|
|
|
|
|
|
|
KWTableStyleCollection::KWTableStyleCollection()
|
|
|
|
: KoUserStyleCollection( TQString::tqfromLatin1( "table" ) )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void KWTableStyleCollection::saveOasis( KoGenStyles& mainStyles, KoSavingContext& savingContext ) const
|
|
|
|
{
|
|
|
|
if ( !isDefault() ) {
|
|
|
|
for ( TQValueList<KoUserStyle *>::const_iterator styleIt = m_styleList.begin(), styleEnd = m_styleList.end() ; styleIt != styleEnd ; ++styleIt )
|
|
|
|
{
|
|
|
|
KWTableStyle* style = static_cast<KWTableStyle *>( *styleIt );
|
|
|
|
style->saveOasis( mainStyles, savingContext );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int KWTableStyleCollection::loadOasisStyles( KoOasisContext& context, const KoStyleCollection& paragraphStyles, const KWFrameStyleCollection& frameStyles )
|
|
|
|
{
|
|
|
|
TQValueVector<TQDomElement> userStyles = context.oasisStyles().userStyles();
|
|
|
|
bool defaultStyleDeleted = false;
|
|
|
|
int stylesLoaded = 0;
|
|
|
|
for (unsigned int item = 0; item < userStyles.count(); item++) {
|
|
|
|
TQDomElement styleElem = userStyles[item];
|
|
|
|
Q_ASSERT( !styleElem.isNull() );
|
|
|
|
|
|
|
|
if ( styleElem.attributeNS( KoXmlNS::style, "family", TQString() ) != "table-cell" )
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ( !defaultStyleDeleted ) {
|
|
|
|
KWTableStyle *s = findStyle( defaultStyleName() );
|
|
|
|
//kdDebug() << "KWTableStyleCollection::loadOasisStyles looking for " << defaultStyleName() << ", to delete it. Found " << s << endl;
|
|
|
|
if(s) // delete the standard style.
|
|
|
|
removeStyle(s);
|
|
|
|
defaultStyleDeleted = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
KWTableStyle *sty = new KWTableStyle( TQString(), 0, 0 );
|
|
|
|
// Load the style
|
|
|
|
sty->loadOasis( styleElem, context, paragraphStyles, frameStyles );
|
|
|
|
// Style created, now let's try to add it
|
|
|
|
sty = static_cast<KWTableStyle *>( addStyle( sty ) );
|
|
|
|
|
|
|
|
kdDebug() << " Loaded table cell style " << sty->name() << " - now " << count() << " styles" << endl;
|
|
|
|
++stylesLoaded;
|
|
|
|
}
|
|
|
|
return stylesLoaded;
|
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************************************/
|
|
|
|
/* Class: KWTableStyle */
|
|
|
|
/******************************************************************/
|
|
|
|
|
|
|
|
KWTableStyle::KWTableStyle( const TQString & name, KoParagStyle * _paragStyle, KWFrameStyle * _frameStyle )
|
|
|
|
: KoUserStyle( name )
|
|
|
|
{
|
|
|
|
m_paragStyle = _paragStyle;
|
|
|
|
m_frameStyle = _frameStyle;
|
|
|
|
}
|
|
|
|
|
|
|
|
KWTableStyle::KWTableStyle( TQDomElement & parentElem, KWDocument *_doc, int /*docVersion*/ )
|
|
|
|
: KoUserStyle( TQString() )
|
|
|
|
{
|
|
|
|
TQDomElement element = parentElem.namedItem( "NAME" ).toElement();
|
|
|
|
if ( ( !element.isNull() ) && ( element.hasAttribute("value") ) ) {
|
|
|
|
m_name = element.attribute( "value" );
|
|
|
|
m_displayName = i18n( "Style name", m_name.utf8() );
|
|
|
|
} else
|
|
|
|
kdWarning() << "No NAME tag in table style!" << endl;
|
|
|
|
|
|
|
|
element = parentElem.namedItem( "PFRAMESTYLE" ).toElement();
|
|
|
|
m_frameStyle = 0;
|
|
|
|
if ( ( !element.isNull() ) && ( element.hasAttribute("name") ) )
|
|
|
|
m_frameStyle = _doc->frameStyleCollection()->findStyleByDisplayName( element.attribute( "name" ) );
|
|
|
|
|
|
|
|
if ( !m_frameStyle ) {
|
|
|
|
if ( !_doc->frameStyleCollection()->isEmpty() )
|
|
|
|
m_frameStyle = _doc->frameStyleCollection()->frameStyleAt( 0 );
|
|
|
|
else { // Isn't possible ( I hope )
|
|
|
|
KWFrameStyle * standardFrameStyle = new KWFrameStyle( "Plain" );
|
|
|
|
standardFrameStyle->setBackgroundColor(TQColor("white"));
|
|
|
|
standardFrameStyle->setTopBorder(KoBorder(TQColor("black"),KoBorder::SOLID,0));
|
|
|
|
standardFrameStyle->setRightBorder(KoBorder(TQColor("black"),KoBorder::SOLID,0));
|
|
|
|
standardFrameStyle->setLeftBorder(KoBorder(TQColor("black"),KoBorder::SOLID,0));
|
|
|
|
standardFrameStyle->setBottomBorder(KoBorder(TQColor("black"),KoBorder::SOLID,0));
|
|
|
|
_doc->frameStyleCollection()->addStyle( standardFrameStyle );
|
|
|
|
m_frameStyle = _doc->frameStyleCollection()->frameStyleAt( 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
element = parentElem.namedItem( "PSTYLE" ).toElement();
|
|
|
|
m_paragStyle = 0;
|
|
|
|
if ( ( !element.isNull() ) && ( element.hasAttribute("name") ) )
|
|
|
|
m_paragStyle = _doc->styleCollection()->findStyleByDisplayName( element.attribute( "name" ) );
|
|
|
|
|
|
|
|
if ( !m_paragStyle ) {
|
|
|
|
if ( _doc->styleCollection()->styleList().count()>0 )
|
|
|
|
m_paragStyle = _doc->styleCollection()->styleAt( 0 );
|
|
|
|
else { // Isn't possible ( I hope )
|
|
|
|
KoParagStyle * standardStyle = new KoParagStyle( "Standard" );
|
|
|
|
standardStyle->format().setFont( _doc->defaultFont() );
|
|
|
|
_doc->styleCollection()->addStyle( standardStyle );
|
|
|
|
m_paragStyle = _doc->styleCollection()->styleAt( 0 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KWTableStyle::operator=( const KWTableStyle &rhs )
|
|
|
|
{
|
|
|
|
KoUserStyle::operator=( rhs );
|
|
|
|
m_paragStyle = rhs.paragraphStyle();
|
|
|
|
m_frameStyle = rhs.frameStyle();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KWTableStyle::saveTableStyle( TQDomElement & parentElem )
|
|
|
|
{
|
|
|
|
TQDomDocument doc = parentElem.ownerDocument();
|
|
|
|
TQDomElement element = doc.createElement( "NAME" );
|
|
|
|
parentElem.appendChild( element );
|
|
|
|
element.setAttribute( "value", displayName() );
|
|
|
|
|
|
|
|
if (m_frameStyle)
|
|
|
|
{
|
|
|
|
element = doc.createElement( "PFRAMESTYLE" );
|
|
|
|
parentElem.appendChild( element );
|
|
|
|
element.setAttribute( "name", m_frameStyle->displayName() );
|
|
|
|
}
|
|
|
|
if (m_paragStyle)
|
|
|
|
{
|
|
|
|
element = doc.createElement( "PSTYLE" );
|
|
|
|
parentElem.appendChild( element );
|
|
|
|
element.setAttribute( "name", m_paragStyle->displayName() );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
KWTableStyle *KWTableStyle::loadStyle( TQDomElement & parentElem, KWDocument *_doc, int docVersion )
|
|
|
|
{
|
|
|
|
return new KWTableStyle( parentElem, _doc, docVersion );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KWTableStyle::saveOasis( KoGenStyles& mainStyles, KoSavingContext& /*savingContext*/ ) const
|
|
|
|
{
|
|
|
|
KoGenStyle tableCellStyle( KWDocument::STYLE_TABLE_CELL_USER, "table-cell" );
|
|
|
|
tableCellStyle.addAttribute( "style:display-name", displayName() );
|
|
|
|
if ( m_frameStyle )
|
|
|
|
tableCellStyle.addProperty( "koffice:frame-style-name", m_frameStyle->name() );
|
|
|
|
if ( m_paragStyle )
|
|
|
|
tableCellStyle.addProperty( "koffice:paragraph-style-name", m_paragStyle->name() );
|
|
|
|
|
|
|
|
// try to preserve existing internal name, if it looks adequate (no spaces)
|
|
|
|
// ## TODO: check XML-Schemacs NCName conformity
|
|
|
|
const bool nameIsConform = !m_name.isEmpty() && m_name.find( ' ' ) == -1;
|
|
|
|
TQString newName;
|
|
|
|
if ( nameIsConform )
|
|
|
|
newName = mainStyles.lookup( tableCellStyle, m_name, KoGenStyles::DontForceNumbering );
|
|
|
|
else
|
|
|
|
newName = mainStyles.lookup( tableCellStyle, "tc" );
|
|
|
|
const_cast<KWTableStyle*>( this )->m_name = newName;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KWTableStyle::loadOasis( TQDomElement & styleElem, KoOasisContext& context, const KoStyleCollection& paragraphStyles, const KWFrameStyleCollection& frameStyles )
|
|
|
|
{
|
|
|
|
// Load name
|
|
|
|
m_name = styleElem.attributeNS( KoXmlNS::style, "name", TQString() );
|
|
|
|
m_displayName = styleElem.attributeNS( KoXmlNS::style, "display-name", TQString() );
|
|
|
|
if ( m_displayName.isEmpty() )
|
|
|
|
m_displayName = m_name;
|
|
|
|
kdDebug() << k_funcinfo << m_name << " " << m_displayName << endl;
|
|
|
|
|
|
|
|
KoStyleStack& styleStack = context.styleStack();
|
|
|
|
styleStack.setTypeProperties( "table-cell" );
|
|
|
|
|
|
|
|
styleStack.save();
|
|
|
|
context.addStyles( &styleElem, "table-cell" ); // Load all parents - only because we don't support inheritance.
|
|
|
|
|
|
|
|
const TQString frameStyleName = styleStack.attributeNS( KoXmlNS::koffice, "frame-style-name" );
|
|
|
|
m_frameStyle = frameStyles.findStyle( frameStyleName );
|
|
|
|
if ( !m_frameStyle )
|
|
|
|
kdWarning(32001) << "Frame style " << frameStyleName << " not found!" << endl;
|
|
|
|
|
|
|
|
const TQString paragraphStyleName = styleStack.attributeNS( KoXmlNS::koffice, "paragraph-style-name" );
|
|
|
|
m_paragStyle = paragraphStyles.findStyle( paragraphStyleName );
|
|
|
|
if ( !m_paragStyle )
|
|
|
|
kdWarning(32001) << "Paragraph style " << paragraphStyleName << " not found!" << endl;
|
|
|
|
|
|
|
|
styleStack.restore();
|
|
|
|
}
|