summaryrefslogtreecommitdiffstats
path: root/kword/KWTableStyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kword/KWTableStyle.cpp')
-rw-r--r--kword/KWTableStyle.cpp219
1 files changed, 219 insertions, 0 deletions
diff --git a/kword/KWTableStyle.cpp b/kword/KWTableStyle.cpp
new file mode 100644
index 00000000..d8bb83a8
--- /dev/null
+++ b/kword/KWTableStyle.cpp
@@ -0,0 +1,219 @@
+/* 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 <qdom.h>
+
+KWTableStyleCollection::KWTableStyleCollection()
+ : KoUserStyleCollection( QString::fromLatin1( "table" ) )
+{
+}
+
+void KWTableStyleCollection::saveOasis( KoGenStyles& mainStyles, KoSavingContext& savingContext ) const
+{
+ if ( !isDefault() ) {
+ for ( QValueList<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 )
+{
+ QValueVector<QDomElement> userStyles = context.oasisStyles().userStyles();
+ bool defaultStyleDeleted = false;
+ int stylesLoaded = 0;
+ for (unsigned int item = 0; item < userStyles.count(); item++) {
+ QDomElement styleElem = userStyles[item];
+ Q_ASSERT( !styleElem.isNull() );
+
+ if ( styleElem.attributeNS( KoXmlNS::style, "family", QString::null ) != "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( QString::null, 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 QString & name, KoParagStyle * _paragStyle, KWFrameStyle * _frameStyle )
+ : KoUserStyle( name )
+{
+ m_paragStyle = _paragStyle;
+ m_frameStyle = _frameStyle;
+}
+
+KWTableStyle::KWTableStyle( QDomElement & parentElem, KWDocument *_doc, int /*docVersion*/ )
+ : KoUserStyle( QString::null )
+{
+ QDomElement 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(QColor("white"));
+ standardFrameStyle->setTopBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
+ standardFrameStyle->setRightBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
+ standardFrameStyle->setLeftBorder(KoBorder(QColor("black"),KoBorder::SOLID,0));
+ standardFrameStyle->setBottomBorder(KoBorder(QColor("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( QDomElement & parentElem )
+{
+ QDomDocument doc = parentElem.ownerDocument();
+ QDomElement 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( QDomElement & 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;
+ QString 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( QDomElement & styleElem, KoOasisContext& context, const KoStyleCollection& paragraphStyles, const KWFrameStyleCollection& frameStyles )
+{
+ // Load name
+ m_name = styleElem.attributeNS( KoXmlNS::style, "name", QString::null );
+ m_displayName = styleElem.attributeNS( KoXmlNS::style, "display-name", QString::null );
+ 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 QString 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 QString 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();
+}