summaryrefslogtreecommitdiffstats
path: root/filters/kspread/opencalc/opencalcstyleexport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kspread/opencalc/opencalcstyleexport.cpp')
-rw-r--r--filters/kspread/opencalc/opencalcstyleexport.cpp546
1 files changed, 546 insertions, 0 deletions
diff --git a/filters/kspread/opencalc/opencalcstyleexport.cpp b/filters/kspread/opencalc/opencalcstyleexport.cpp
new file mode 100644
index 000000000..9585ae139
--- /dev/null
+++ b/filters/kspread/opencalc/opencalcstyleexport.cpp
@@ -0,0 +1,546 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Norbert Andres <nandres@web.de>
+
+ 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; either
+ version 2 of the License, or (at your option) any later version.
+
+ 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 <opencalcstyleexport.h>
+
+#include <KoGlobal.h>
+
+#include <kspread_cell.h>
+#include <kspread_doc.h>
+#include <kspread_format.h>
+#include <kspread_sheet.h>
+#include <kspread_style.h>
+#include <kspread_style_manager.h>
+
+#include <tqdom.h>
+
+using namespace KSpread;
+
+OpenCalcStyles::OpenCalcStyles()
+{
+ m_cellStyles.setAutoDelete( true );
+ m_columnStyles.setAutoDelete( true );
+ m_numberStyles.setAutoDelete( true );
+ m_rowStyles.setAutoDelete( true );
+ m_sheetStyles.setAutoDelete( true );
+
+ m_fontList.setAutoDelete( true );
+}
+
+OpenCalcStyles::~OpenCalcStyles()
+{
+}
+
+void OpenCalcStyles::writeStyles( TQDomDocument & doc, TQDomElement & autoStyles )
+{
+ addColumnStyles( doc, autoStyles );
+ addRowStyles( doc, autoStyles );
+ addSheetStyles( doc, autoStyles );
+ addNumberStyles( doc, autoStyles );
+ addCellStyles( doc, autoStyles );
+}
+
+void OpenCalcStyles::writeFontDecl( TQDomDocument & doc, TQDomElement & fontDecls )
+{
+ TQFont * f = m_fontList.first();
+ while ( f )
+ {
+ TQDomElement fontDecl = doc.createElement( "style:font-decl" );
+
+ fontDecl.setAttribute( "style:name", f->family() );
+ fontDecl.setAttribute( "fo:font-family", f->family() );
+ fontDecl.setAttribute( "style:font-pitch", ( f->fixedPitch() ? "fixed" : "variable" ) );
+
+ // missing:
+ // style:font-charset="x-symbol" style:font-family-generic="swiss"
+ // style:font-style-name= "Bold/Standard/Regular"
+
+ fontDecls.appendChild( fontDecl );
+
+ f = m_fontList.next();
+ }
+}
+
+void OpenCalcStyles::addFont( TQFont const & font, bool def )
+{
+ if ( def )
+ m_defaultFont = font;
+
+ TQFont * f = m_fontList.first();
+ while ( f )
+ {
+ if ( f->family() == font.family() )
+ return;
+
+ f = m_fontList.next();
+ }
+
+ f = new TQFont( font );
+ m_fontList.append( f );
+}
+
+TQString OpenCalcStyles::cellStyle( CellStyle const & cs )
+{
+ CellStyle * t = m_cellStyles.first();
+ while ( t )
+ {
+ if ( CellStyle::isEqual( t, cs ) )
+ return t->name;
+
+ t = m_cellStyles.next();
+ }
+
+ t = new CellStyle();
+ t->copyData( cs );
+
+ m_cellStyles.append( t );
+
+ t->name = TQString( "ce%1" ).arg( m_cellStyles.count() );
+
+ return t->name;
+}
+
+TQString OpenCalcStyles::columnStyle( ColumnStyle const & cs )
+{
+ ColumnStyle * t = m_columnStyles.first();
+ while ( t )
+ {
+ if ( ColumnStyle::isEqual( t, cs ) )
+ return t->name;
+
+ t = m_columnStyles.next();
+ }
+
+ t = new ColumnStyle();
+ t->copyData( cs );
+
+ m_columnStyles.append( t );
+
+ t->name = TQString( "co%1" ).arg( m_columnStyles.count() );
+
+ return t->name;
+}
+
+TQString OpenCalcStyles::numberStyle( NumberStyle const & )
+{
+ return "";
+}
+
+TQString OpenCalcStyles::rowStyle( RowStyle const & rs )
+{
+ RowStyle * t = m_rowStyles.first();
+ while ( t )
+ {
+ if ( RowStyle::isEqual( t, rs ) )
+ return t->name;
+
+ t = m_rowStyles.next();
+ }
+
+ t = new RowStyle();
+ t->copyData( rs );
+
+ m_rowStyles.append( t );
+
+ t->name = TQString( "ro%1" ).arg( m_rowStyles.count() );
+
+ return t->name;
+}
+
+TQString OpenCalcStyles::sheetStyle( SheetStyle const & ts )
+{
+ SheetStyle * t = m_sheetStyles.first();
+ while ( t )
+ {
+ if ( SheetStyle::isEqual( t, ts ) )
+ return t->name;
+
+ t = m_sheetStyles.next();
+ }
+
+ t = new SheetStyle();
+ t->copyData( ts );
+
+ m_sheetStyles.append( t );
+
+ t->name = TQString( "ta%1" ).arg( m_sheetStyles.count() );
+
+ return t->name;
+}
+
+TQString convertPenToString( TQPen const & pen )
+{
+ TQString s( TQString( "%1cm solid " ).arg( pen.width() * 0.035 ) );
+ s += pen.color().name();
+
+ return s;
+}
+
+void OpenCalcStyles::addCellStyles( TQDomDocument & doc, TQDomElement & autoStyles )
+{
+ CellStyle * t = m_cellStyles.first();
+ while ( t )
+ {
+ TQDomElement ts = doc.createElement( "style:style" );
+ ts.setAttribute( "style:name", t->name );
+ ts.setAttribute( "style:family", "table-cell" );
+ ts.setAttribute( "style:parent-style-name", "Default" );
+ if ( t->numberStyle.length() > 0 )
+ ts.setAttribute( "style:data-style-name", t->numberStyle );
+
+ TQDomElement prop = doc.createElement( "style:properties" );
+
+ if ( t->font.family() != m_defaultFont.family() )
+ prop.setAttribute( "style:font-name", t->font.family() );
+
+ if ( t->font.bold() != m_defaultFont.bold() )
+ prop.setAttribute( "fo:font-weight", ( t->font.bold() ? "bold" : "light" ) );
+
+ prop.setAttribute( "fo:font-size", TQString( "%1pt" ).arg( t->font.pointSize() ) );
+
+ if ( t->font.underline() != m_defaultFont.underline() )
+ {
+ prop.setAttribute( "style:text-underline", ( t->font.underline() ? "single" : "none" ) );
+ if ( t->font.underline() )
+ prop.setAttribute( "style:text-underline-color", "font-color" );
+ }
+
+ if ( t->font.italic() != m_defaultFont.italic() )
+ prop.setAttribute( "fo:font-style", ( t->font.italic() ? "italic" : "none" ) );
+
+ if ( t->font.strikeOut() != m_defaultFont.strikeOut() )
+ prop.setAttribute( "style:text-crossing-out", ( t->font.strikeOut() ? "single-line" : "none" ) );
+
+ if ( t->color.name() != "#000000" )
+ prop.setAttribute( "fo:color", t->color.name() );
+
+ if ( t->bgColor.name() != "#ffffff" )
+ prop.setAttribute( "fo:background-color", t->bgColor.name() );
+
+ if ( t->alignX != Format::Undefined )
+ {
+ TQString value;
+ if ( t->alignX == Format::Center )
+ value = "center";
+ else if ( t->alignX == Format::Right )
+ value = "end";
+ else if ( t->alignX == Format::Left )
+ value = "start";
+ prop.setAttribute( "fo:text-align", value );
+ }
+
+ if ( t->alignY != Format::Bottom ) // default in OpenCalc
+ prop.setAttribute( "fo:vertical-align", ( t->alignY == Format::Middle ? "middle" : "top" ) );
+
+ if ( t->indent > 0.0 )
+ {
+ prop.setAttribute( "fo:margin-left", TQString( "%1pt" ).arg( t->indent ) );
+ if ( t->alignX == Format::Undefined )
+ prop.setAttribute( "fo:text-align", "start" );
+ }
+
+ if ( t->wrap )
+ prop.setAttribute( "fo:wrap-option", "wrap" );
+
+ if ( t->vertical )
+ {
+ prop.setAttribute( "fo:direction", "ttb" );
+ prop.setAttribute( "style:rotation-angle", "0" );
+ }
+
+ if ( t->angle != 0 )
+ prop.setAttribute( "style:rotation-angle", TQString::number( t->angle ) );
+
+ if ( !t->print )
+ prop.setAttribute( "style:print-content", "false" );
+
+ if ( t->hideAll )
+ prop.setAttribute( "style:cell-protect", "hidden-and-protected" );
+ else
+ if ( t->notProtected && !t->hideFormula )
+ prop.setAttribute( "style:cell-protect", "none" );
+ else
+ if ( t->notProtected && t->hideFormula )
+ prop.setAttribute( "style:cell-protect", "formula-hidden" );
+ else if ( t->hideFormula )
+ prop.setAttribute( "style:cell-protect", "protected formula-hidden" );
+ else if ( !t->notProtected )
+ prop.setAttribute( "style:cell-protect", "protected" );
+
+
+ if ( ( t->left == t->right ) && ( t->left == t->top ) && ( t->left == t->bottom ) )
+ {
+ if ( ( t->left.width() != 0 ) && ( t->left.style() != TQt::NoPen ) )
+ prop.setAttribute( "fo:border", convertPenToString( t->left ) );
+ }
+ else
+ {
+ if ( ( t->left.width() != 0 ) && ( t->left.style() != TQt::NoPen ) )
+ prop.setAttribute( "fo:border-left", convertPenToString( t->left ) );
+
+ if ( ( t->right.width() != 0 ) && ( t->right.style() != TQt::NoPen ) )
+ prop.setAttribute( "fo:border-right", convertPenToString( t->right ) );
+
+ if ( ( t->top.width() != 0 ) && ( t->top.style() != TQt::NoPen ) )
+ prop.setAttribute( "fo:border-top", convertPenToString( t->top ) );
+
+ if ( ( t->bottom.width() != 0 ) && ( t->bottom.style() != TQt::NoPen ) )
+ prop.setAttribute( "fo:border-bottom", convertPenToString( t->bottom ) );
+ }
+
+ ts.appendChild( prop );
+ autoStyles.appendChild( ts );
+
+ t = m_cellStyles.next();
+ }
+}
+
+void OpenCalcStyles::addColumnStyles( TQDomDocument & doc, TQDomElement & autoStyles )
+{
+ ColumnStyle * t = m_columnStyles.first();
+ while ( t )
+ {
+ TQDomElement ts = doc.createElement( "style:style" );
+ ts.setAttribute( "style:name", t->name );
+ ts.setAttribute( "style:family", "table-column" );
+
+ TQDomElement prop = doc.createElement( "style:properties" );
+ if ( t->breakB != ::Style::none )
+ prop.setAttribute( "fo:break-before", ( t->breakB == ::Style::automatic ? "auto" : "page" ) );
+ prop.setAttribute( "style:column-width", TQString( "%1cm" ).arg( t->size ) );
+
+ ts.appendChild( prop );
+ autoStyles.appendChild( ts );
+
+ t = m_columnStyles.next();
+ }
+}
+
+void OpenCalcStyles::addNumberStyles( TQDomDocument & /*doc*/, TQDomElement & /*autoStyles*/ )
+{
+}
+
+void OpenCalcStyles::addRowStyles( TQDomDocument & doc, TQDomElement & autoStyles )
+{
+ RowStyle * t = m_rowStyles.first();
+ while ( t )
+ {
+ TQDomElement ts = doc.createElement( "style:style" );
+ ts.setAttribute( "style:name", t->name );
+ ts.setAttribute( "style:family", "table-row" );
+
+ TQDomElement prop = doc.createElement( "style:properties" );
+ prop.setAttribute( "style:row-height", TQString( "%1cm" ).arg( t->size ) );
+ if ( t->breakB != ::Style::none )
+ prop.setAttribute( "fo:break-before", ( t->breakB == ::Style::automatic ? "auto" : "page" ) );
+
+ ts.appendChild( prop );
+ autoStyles.appendChild( ts );
+
+ t = m_rowStyles.next();
+ }
+}
+
+void OpenCalcStyles::addSheetStyles( TQDomDocument & doc, TQDomElement & autoStyles )
+{
+ SheetStyle * t = m_sheetStyles.first();
+ while ( t )
+ {
+ TQDomElement ts = doc.createElement( "style:style" );
+ ts.setAttribute( "style:name", t->name );
+ ts.setAttribute( "style:family", "table" );
+ ts.setAttribute( "style:master-page-name", "Default" );
+
+ TQDomElement prop = doc.createElement( "style:properties" );
+ prop.setAttribute( "table:display", ( t->visible ? "true" : "false" ) );
+
+ ts.appendChild( prop );
+ autoStyles.appendChild( ts );
+
+ t = m_sheetStyles.next();
+ }
+}
+
+bool SheetStyle::isEqual( SheetStyle const * const t1, SheetStyle const & t2 )
+{
+ if ( t1->visible == t2.visible )
+ return true;
+
+ return false;
+}
+
+CellStyle::CellStyle()
+ : color( TQt::black ),
+ bgColor( TQt::white ),
+ indent( -1.0 ),
+ wrap( false ),
+ vertical( false ),
+ angle( 0 ),
+ print( true ),
+ left ( TQt::black, 0, TQt::NoPen ),
+ right( TQt::black, 0, TQt::NoPen ),
+ top ( TQt::black, 0, TQt::NoPen ),
+ bottom( TQt::black, 0, TQt::NoPen ),
+ hideAll( false ),
+ hideFormula( false ),
+ notProtected ( false ),
+ alignX( Format::Undefined ),
+ alignY( Format::Middle )
+{
+}
+
+void CellStyle::copyData( CellStyle const & ts )
+{
+ font = ts.font;
+ numberStyle = ts.numberStyle;
+ color = ts.color;
+ bgColor = ts.bgColor;
+ indent = ts.indent;
+ wrap = ts.wrap;
+ vertical = ts.vertical;
+ angle = ts.angle;
+ print = ts.print;
+ left = ts.left;
+ right = ts.right;
+ top = ts.top;
+ bottom = ts.bottom;
+ hideAll = ts.hideAll;
+ hideFormula = ts.hideFormula;
+ notProtected = ts.notProtected;
+ alignX = ts.alignX;
+ alignY = ts.alignY;
+}
+
+bool CellStyle::isEqual( CellStyle const * const t1, CellStyle const & t2 )
+{
+ if ( ( t1->font == t2.font ) && ( t1->numberStyle == t2.numberStyle )
+ && ( t1->color == t2.color ) && ( t1->bgColor == t2.bgColor )
+ && ( t1->alignX == t2.alignX ) && ( t1->alignY == t2.alignY )
+ && ( t1->indent == t2.indent ) && ( t1->wrap == t2.wrap )
+ && ( t1->vertical == t2.vertical ) && ( t1->angle == t2.angle )
+ && ( t1->print == t2.print ) && ( t1->left == t2.left )
+ && ( t1->right == t2.right ) && ( t1->top == t2.top )
+ && ( t1->bottom == t2.bottom ) && ( t1->hideAll == t2.hideAll )
+ && ( t1->hideFormula == t2.hideFormula ) && ( t1->notProtected == t2.notProtected )
+ )
+ return true;
+
+ return false;
+}
+
+// all except the number style
+void CellStyle::loadData( CellStyle & cs, Cell const * const cell )
+{
+ int col = cell->column();
+ int row = cell->row();
+
+ Format * f = new Format( 0, cell->sheet()->doc()->styleManager()->defaultStyle() );
+
+ TQFont font = cell->format()->textFont( col, row );
+ if ( font != f->font() )
+ cs.font = font;
+
+ TQColor color = cell->format()->textColor( col, row );
+ if ( color != f->textColor( col, row ) )
+ cs.color = color;
+
+ TQColor bgColor = cell->bgColor( col, row );
+ if ( bgColor != f->bgColor( col, row ) )
+ cs.bgColor = bgColor;
+
+ if ( cell->format()->hasProperty( Format::PAlign ) || !cell->format()->hasNoFallBackProperties( Format::PAlign ) )
+ cs.alignX = cell->format()->align( col, row );
+
+ if ( cell->format()->hasProperty( Format::PAlignY ) || !cell->format()->hasNoFallBackProperties( Format::PAlignY ) )
+ cs.alignY = cell->format()->alignY( col, row );
+
+ if ( cell->format()->hasProperty( Format::PIndent ) || !cell->format()->hasNoFallBackProperties( Format::PIndent ) )
+ cs.indent = cell->format()->getIndent( col, row );
+
+ if ( cell->format()->hasProperty( Format::PAngle ) || !cell->format()->hasNoFallBackProperties( Format::PAngle ) )
+ cs.angle = -cell->format()->getAngle( col, row );
+
+ if ( cell->format()->hasProperty( Format::PMultiRow ) || !cell->format()->hasNoFallBackProperties( Format::PMultiRow ) )
+ cs.wrap = cell->format()->multiRow( col, row );
+
+ if ( cell->format()->hasProperty( Format::PVerticalText )
+ || !cell->format()->hasNoFallBackProperties( Format::PVerticalText ) )
+ cs.vertical = cell->format()->verticalText( col, row );
+
+ if ( cell->format()->hasProperty( Format::PDontPrintText )
+ || !cell->format()->hasNoFallBackProperties( Format::PDontPrintText ) )
+ cs.print = !cell->format()->getDontprintText( col, row );
+
+ if ( cell->format()->hasProperty( Format::PLeftBorder ) || !cell->format()->hasNoFallBackProperties( Format::PLeftBorder ) )
+ cs.left = cell->leftBorderPen( col, row );
+
+ if ( cell->format()->hasProperty( Format::PRightBorder ) || !cell->format()->hasNoFallBackProperties( Format::PRightBorder ) )
+ cs.right = cell->rightBorderPen( col, row );
+
+ if ( cell->format()->hasProperty( Format::PTopBorder ) || !cell->format()->hasNoFallBackProperties( Format::PTopBorder ) )
+ cs.top = cell->topBorderPen( col, row );
+
+ if ( cell->format()->hasProperty( Format::PBottomBorder ) || !cell->format()->hasNoFallBackProperties( Format::PBottomBorder ) )
+ cs.bottom = cell->bottomBorderPen( col, row );
+
+ if ( cell->format()->hasProperty( Format::PNotProtected ) || !cell->format()->hasNoFallBackProperties( Format::PNotProtected ) )
+ cs.notProtected = cell->format()->notProtected( col, row );
+
+ if ( cell->format()->hasProperty( Format::PHideAll ) || !cell->format()->hasNoFallBackProperties( Format::PHideAll ) )
+ cs.hideAll = cell->format()->isHideAll( col, row );
+
+ if ( cell->format()->hasProperty( Format::PHideFormula ) || !cell->format()->hasNoFallBackProperties( Format::PHideFormula ) )
+ cs.hideFormula = cell->format()->isHideFormula( col, row );
+}
+
+bool NumberStyle::isEqual( NumberStyle const * const t1, NumberStyle const & t2 )
+{
+ if ( ( t1->type == t2.type ) && ( t1->pattern == t2.pattern ) )
+ return true;
+
+ return false;
+}
+
+void ColumnStyle::copyData( ColumnStyle const & cs )
+{
+ breakB = cs.breakB;
+ size = cs.size;
+}
+
+bool ColumnStyle::isEqual( ColumnStyle const * const c1, ColumnStyle const & c2 )
+{
+ if ( ( c1->breakB == c2.breakB ) && ( c1->size == c2.size ) )
+ return true;
+
+ return false;
+}
+
+void RowStyle::copyData( RowStyle const & cs )
+{
+ breakB = cs.breakB;
+ size = cs.size;
+}
+
+bool RowStyle::isEqual( RowStyle const * const c1, RowStyle const & c2 )
+{
+ if ( ( c1->breakB == c2.breakB ) && ( c1->size == c2.size ) )
+ return true;
+
+ return false;
+}