summaryrefslogtreecommitdiffstats
path: root/lib/kofficecore/KoOasisStyles.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kofficecore/KoOasisStyles.cpp')
-rw-r--r--lib/kofficecore/KoOasisStyles.cpp1604
1 files changed, 1604 insertions, 0 deletions
diff --git a/lib/kofficecore/KoOasisStyles.cpp b/lib/kofficecore/KoOasisStyles.cpp
new file mode 100644
index 000000000..3a0187670
--- /dev/null
+++ b/lib/kofficecore/KoOasisStyles.cpp
@@ -0,0 +1,1604 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004-2006 David Faure <faure@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ 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 "KoOasisStyles.h"
+#include <KoXmlWriter.h>
+#include <kdebug.h>
+#include <qdom.h>
+#include "KoDom.h"
+#include "KoXmlNS.h"
+#include "KoGenStyles.h"
+#include <qbuffer.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <qbrush.h>
+#include <KoStyleStack.h>
+
+class KoOasisStyles::Private
+{
+public:
+ // The key of the map is the family
+ QMap<QString, QDict<QDomElement> > m_styles;
+ QMap<QString, QDict<QDomElement> > m_stylesAutoStyles;
+};
+
+KoOasisStyles::KoOasisStyles()
+ : d( new Private )
+{
+ m_defaultStyle.setAutoDelete( true );
+ m_masterPages.setAutoDelete( true );
+ m_listStyles.setAutoDelete( true );
+ m_drawStyles.setAutoDelete( true );
+}
+
+KoOasisStyles::~KoOasisStyles()
+{
+ delete d;
+}
+
+void KoOasisStyles::createStyleMap( const QDomDocument& doc, bool stylesDotXml )
+{
+ const QDomElement docElement = doc.documentElement();
+ // We used to have the office:version check here, but better let the apps do that
+ QDomElement fontStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "font-decls" );
+
+ if ( !fontStyles.isNull() ) {
+ //kdDebug(30003) << "Starting reading in font-decl..." << endl;
+ insertStyles( fontStyles, false );
+ }// else
+ // kdDebug(30003) << "No items found" << endl;
+
+ //kdDebug(30003) << "Starting reading in office:automatic-styles. stylesDotXml=" << stylesDotXml << endl;
+
+ QDomElement autoStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "automatic-styles" );
+ if ( !autoStyles.isNull() ) {
+ insertStyles( autoStyles, stylesDotXml );
+ }// else
+ // kdDebug(30003) << "No items found" << endl;
+
+
+ //kdDebug(30003) << "Reading in master styles" << endl;
+
+ QDomNode masterStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "master-styles" );
+
+ if ( !masterStyles.isNull() ) {
+ QDomElement master;
+ forEachElement( master, masterStyles )
+ {
+ if ( master.localName() == "master-page" &&
+ master.namespaceURI() == KoXmlNS::style ) {
+ const QString name = master.attributeNS( KoXmlNS::style, "name", QString::null );
+ kdDebug(30003) << "Master style: '" << name << "' loaded " << endl;
+ m_masterPages.insert( name, new QDomElement( master ) );
+ } else
+ // OASIS docu mentions style:handout-master and draw:layer-set here
+ kdWarning(30003) << "Unknown tag " << master.tagName() << " in office:master-styles" << endl;
+ }
+ }
+
+
+ kdDebug(30003) << "Starting reading in office:styles" << endl;
+
+ const QDomElement officeStyle = KoDom::namedItemNS( docElement, KoXmlNS::office, "styles" );
+
+ if ( !officeStyle.isNull() ) {
+ m_officeStyle = officeStyle;
+ insertOfficeStyles( m_officeStyle );
+
+ }
+
+ //kdDebug(30003) << "Styles read in." << endl;
+}
+
+QValueVector<QDomElement> KoOasisStyles::userStyles() const
+{
+ QValueVector<QDomElement> vec;
+ // Collect user styles
+ unsigned int i = 0;
+ QDomElement e;
+ forEachElement( e, m_officeStyle )
+ {
+ if ( e.localName() == "style" &&
+ e.namespaceURI() == KoXmlNS::style )
+ {
+ vec.resize( i+1 );
+ vec[i++] = e;
+ }
+ }
+ return vec;
+}
+
+const QDict<QDomElement>& KoOasisStyles::styles(const QString& family) const
+{
+ // hmm this can create an empty item in the map, but otherwise we couldn't
+ // return a const reference.
+ return d->m_styles[family];
+}
+
+void KoOasisStyles::insertOfficeStyles( const QDomElement& styles )
+{
+ QDomElement e;
+ forEachElement( e, styles )
+ {
+ const QString localName = e.localName();
+ const QString ns = e.namespaceURI();
+ if ( ( ns == KoXmlNS::svg && (
+ localName == "linearGradient"
+ || localName == "radialGradient" ) )
+ || ( ns == KoXmlNS::draw && (
+ localName == "gradient"
+ || localName == "hatch"
+ || localName == "fill-image"
+ || localName == "marker"
+ || localName == "stroke-dash"
+ || localName == "opacity" ) )
+ )
+ {
+ const QString name = e.attributeNS( KoXmlNS::draw, "name", QString::null );
+ Q_ASSERT( !name.isEmpty() );
+ QDomElement* ep = new QDomElement( e );
+ m_drawStyles.insert( name, ep );
+ }
+ else
+ insertStyle( e, false );
+ }
+}
+
+
+void KoOasisStyles::insertStyles( const QDomElement& styles, bool styleAutoStyles )
+{
+ //kdDebug(30003) << "Inserting styles from " << styles.tagName() << endl;
+ QDomElement e;
+ forEachElement( e, styles )
+ insertStyle( e, styleAutoStyles );
+}
+
+void KoOasisStyles::insertStyle( const QDomElement& e, bool styleAutoStyles )
+{
+ const QString localName = e.localName();
+ const QString ns = e.namespaceURI();
+
+ const QString name = e.attributeNS( KoXmlNS::style, "name", QString::null );
+ if ( ns == KoXmlNS::style && localName == "style" ) {
+ const QString family = e.attributeNS( KoXmlNS::style, "family", QString::null );
+
+ if ( styleAutoStyles ) {
+ QDict<QDomElement>& dict = d->m_stylesAutoStyles[ family ];
+ dict.setAutoDelete( true );
+ if ( dict.find( name ) != 0 )
+ kdDebug(30003) << "Auto-style: '" << name << "' already exists" << endl;
+ dict.insert( name, new QDomElement( e ) );
+ //kdDebug(30003) << "Style: '" << name << "' loaded as a style auto style" << endl;
+ } else {
+ QDict<QDomElement>& dict = d->m_styles[ family ];
+ dict.setAutoDelete( true );
+
+ if ( dict.find( name ) != 0 )
+ kdDebug(30003) << "Style: '" << name << "' already exists" << endl;
+ dict.insert( name, new QDomElement( e ) );
+ //kdDebug(30003) << "Style: '" << name << "' loaded " << endl;
+ }
+ } else if ( ns == KoXmlNS::style && (
+ localName == "page-layout"
+ || localName == "font-decl"
+ || localName == "presentation-page-layout" ) )
+ {
+ if ( m_styles.find( name ) != 0 )
+ kdDebug(30003) << "Style: '" << name << "' already exists" << endl;
+ m_styles.insert( name, new QDomElement( e ) );
+ } else if ( localName == "default-style" && ns == KoXmlNS::style ) {
+ const QString family = e.attributeNS( KoXmlNS::style, "family", QString::null );
+ if ( !family.isEmpty() )
+ m_defaultStyle.insert( family, new QDomElement( e ) );
+ } else if ( localName == "list-style" && ns == KoXmlNS::text ) {
+ m_listStyles.insert( name, new QDomElement( e ) );
+ //kdDebug(30003) << "List style: '" << name << "' loaded " << endl;
+ } else if ( ns == KoXmlNS::number && (
+ localName == "number-style"
+ || localName == "currency-style"
+ || localName == "percentage-style"
+ || localName == "boolean-style"
+ || localName == "text-style"
+ || localName == "date-style"
+ || localName == "time-style" ) ) {
+ importDataStyle( e );
+ }
+ // The rest (text:*-configuration and text:outline-style) is to be done by the apps.
+}
+
+// OO spec 2.5.4. p68. Conversion to Qt format: see qdate.html
+// OpenCalcImport::loadFormat has similar code, but slower, intermixed with other stuff,
+// lacking long-textual forms.
+void KoOasisStyles::importDataStyle( const QDomElement& parent )
+{
+ NumericStyleFormat dataStyle;
+
+ const QString localName = parent.localName();
+ if (localName == "number-style")
+ dataStyle.type = NumericStyleFormat::Number;
+ else if (localName == "currency-style")
+ dataStyle.type = NumericStyleFormat::Currency;
+ else if (localName == "percentage-style")
+ dataStyle.type = NumericStyleFormat::Percentage;
+ else if (localName == "boolean-style")
+ dataStyle.type = NumericStyleFormat::Boolean;
+ else if (localName == "text-style")
+ dataStyle.type = NumericStyleFormat::Text;
+ else if (localName == "date-style")
+ dataStyle.type = NumericStyleFormat::Date;
+ else if (localName == "time-style")
+ dataStyle.type = NumericStyleFormat::Time;
+
+ QString format;
+ int precision = -1;
+ int leadingZ = 1;
+ bool thousandsSep = false;
+ //todo negred
+ //bool negRed = false;
+ bool ok = false;
+ int i = 0;
+ QDomElement e;
+ QString prefix;
+ QString suffix;
+ forEachElement( e, parent )
+ {
+ if ( e.namespaceURI() != KoXmlNS::number )
+ continue;
+ QString localName = e.localName();
+ const QString numberStyle = e.attributeNS( KoXmlNS::number, "style", QString::null );
+ const bool shortForm = numberStyle == "short" || numberStyle.isEmpty();
+ if ( localName == "day" ) {
+ format += shortForm ? "d" : "dd";
+ } else if ( localName == "day-of-week" ) {
+ format += shortForm ? "ddd" : "dddd";
+ } else if ( localName == "month" ) {
+ if ( e.attributeNS( KoXmlNS::number, "possessive-form", QString::null ) == "true" ) {
+ format += shortForm ? "PPP" : "PPPP";
+ }
+ // TODO the spec has a strange mention of number:format-source
+ else if ( e.attributeNS( KoXmlNS::number, "textual", QString::null ) == "true" ) {
+ format += shortForm ? "MMM" : "MMMM";
+ } else { // month number
+ format += shortForm ? "M" : "MM";
+ }
+ } else if ( localName == "year" ) {
+ format += shortForm ? "yy" : "yyyy";
+ } else if ( localName == "era" ) {
+ //TODO I don't know what is it... (define into oo spec)
+ } else if ( localName == "week-of-year" || localName == "quarter") {
+ // ### not supported in Qt
+ } else if ( localName == "hours" ) {
+ format += shortForm ? "h" : "hh";
+ } else if ( localName == "minutes" ) {
+ format += shortForm ? "m" : "mm";
+ } else if ( localName == "seconds" ) {
+ format += shortForm ? "s" : "ss";
+ } else if ( localName == "am-pm" ) {
+ format += "ap";
+ } else if ( localName == "text" ) { // litteral
+ format += e.text();
+ } else if ( localName == "suffix" ) {
+ suffix = e.text();
+ kdDebug()<<" suffix :"<<suffix<<endl;
+ } else if ( localName == "prefix" ) {
+ prefix = e.text();
+ kdDebug()<<" prefix :"<<prefix<<endl;
+ } else if ( localName == "currency-symbol" ) {
+ dataStyle.currencySymbol = e.text();
+ kdDebug()<<" currency-symbol: "<<dataStyle.currencySymbol<<endl;
+ format += e.text();
+ //TODO
+ // number:language="de" number:country="DE">€</number:currency-symbol>
+ // Stefan: localization of the symbol?
+ } else if ( localName == "number" ) {
+ // TODO: number:grouping="true"
+ if ( e.hasAttributeNS( KoXmlNS::number, "decimal-places" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "decimal-places", QString::null ).toInt( &ok );
+ if ( ok )
+ precision = d;
+ }
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ leadingZ = d;
+ }
+ if ( thousandsSep && leadingZ <= 3 )
+ {
+ format += "#,";
+ for ( i = leadingZ; i <= 3; ++i )
+ format += '#';
+ }
+ for ( i = 1; i <= leadingZ; ++i )
+ {
+ format += '0';
+ if ( ( i % 3 == 0 ) && thousandsSep )
+ format =+ ',' ;
+ }
+ if (precision > -1)
+ {
+ format += '.';
+ for ( i = 0; i < precision; ++i )
+ format += '0';
+ }
+ }
+ else if ( localName == "scientific-number" ) {
+ if (dataStyle.type == NumericStyleFormat::Number)
+ dataStyle.type = NumericStyleFormat::Scientific;
+ int exp = 2;
+
+ if ( e.hasAttributeNS( KoXmlNS::number, "decimal-places" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "decimal-places", QString::null ).toInt( &ok );
+ if ( ok )
+ precision = d;
+ }
+
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ leadingZ = d;
+ }
+
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-exponent-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-exponent-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ exp = d;
+ if ( exp <= 0 )
+ exp = 1;
+ }
+
+ if ( thousandsSep && leadingZ <= 3 )
+ {
+ format += "#,";
+ for ( i = leadingZ; i <= 3; ++i )
+ format += '#';
+ }
+
+ for ( i = 1; i <= leadingZ; ++i )
+ {
+ format+='0';
+ if ( ( i % 3 == 0 ) && thousandsSep )
+ format+=',';
+ }
+
+ if (precision > -1)
+ {
+ format += '.';
+ for ( i = 0; i < precision; ++i )
+ format += '0';
+ }
+
+ format+="E+";
+ for ( i = 0; i < exp; ++i )
+ format+='0';
+ } else if ( localName == "fraction" ) {
+ if (dataStyle.type == NumericStyleFormat::Number)
+ dataStyle.type = NumericStyleFormat::Fraction;
+ int integer = 0;
+ int numerator = 1;
+ int denominator = 1;
+ int denominatorValue=0;
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ integer = d;
+ }
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-numerator-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-numerator-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ numerator = d;
+ }
+ if ( e.hasAttributeNS( KoXmlNS::number, "min-denominator-digits" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "min-denominator-digits", QString::null ).toInt( &ok );
+ if ( ok )
+ denominator = d;
+ }
+ if ( e.hasAttributeNS( KoXmlNS::number, "denominator-value" ) )
+ {
+ int d = e.attributeNS( KoXmlNS::number, "denominator-value", QString::null ).toInt( &ok );
+ if ( ok )
+ denominatorValue = d;
+ }
+
+ for ( i = 0; i < integer; ++i )
+ format+='#';
+
+ format+=' ';
+
+ for ( i = 0; i < numerator; ++i )
+ format+='?';
+
+ format+='/';
+
+ if ( denominatorValue != 0 )
+ format+=QString::number( denominatorValue );
+ else
+ {
+ for ( i = 0; i < denominator; ++i )
+ format+='?';
+ }
+ }
+ // Not needed:
+ // <style:map style:condition="value()&gt;=0" style:apply-style-name="N106P0"/>
+ // we handle painting negative numbers in red differently
+
+ }
+
+ const QString styleName = parent.attributeNS( KoXmlNS::style, "name", QString::null );
+ kdDebug(30003) << "data style: " << styleName << " qt format=" << format << endl;
+ if ( !prefix.isEmpty() )
+ {
+ kdDebug(30003)<<" format.left( prefix.length() ) :"<<format.left( prefix.length() )<<" prefix :"<<prefix<<endl;
+ if ( format.left( prefix.length() )==prefix )
+ {
+ format = format.right( format.length()-prefix.length() );
+ }
+ else
+ prefix = QString::null;
+ }
+ if ( !suffix.isEmpty() )
+ {
+ kdDebug(30003)<<"format.right( suffix.length() ) :"<<format.right( suffix.length() )<<" suffix :"<<suffix<<endl;
+ if ( format.right( suffix.length() )==suffix )
+ {
+ format = format.left( format.length()-suffix.length() );
+ }
+ else
+ suffix = QString::null;
+ }
+
+ dataStyle.formatStr = format;
+ dataStyle.prefix = prefix;
+ dataStyle.suffix = suffix;
+ dataStyle.precision = precision;
+ kdDebug()<<" finish insert format :"<<format<<" prefix :"<<prefix<<" suffix :"<<suffix<<endl;
+ m_dataFormats.insert( styleName, dataStyle );
+}
+
+#define addTextNumber( text, elementWriter ) { \
+ if ( !text.isEmpty() ) \
+ { \
+ elementWriter.startElement( "number:text" ); \
+ elementWriter.addTextNode( text ); \
+ elementWriter.endElement(); \
+ text=""; \
+ } \
+}
+
+void KoOasisStyles::parseOasisTimeKlocale(KoXmlWriter &elementWriter, QString & format, QString & text )
+{
+ kdDebug(30003)<<"parseOasisTimeKlocale(KoXmlWriter &elementWriter, QString & format, QString & text ) :"<<format<<endl;
+ do
+ {
+ if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
+ {
+ text += format[0];
+ format = format.remove( 0, 1 );
+ }
+ }
+ while ( format.length() > 0 );
+ addTextNumber( text, elementWriter );
+}
+
+bool KoOasisStyles::saveOasisKlocaleTimeFormat( KoXmlWriter &elementWriter, QString & format, QString & text )
+{
+ bool changed = false;
+ if ( format.startsWith( "%H" ) ) //hh
+ {
+ //hour in 24h
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:hours" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "%k" ) )//h
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:hours" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "%I" ) )// ?????
+ {
+ //TODO hour in 12h
+ changed = true;
+ }
+ else if ( format.startsWith( "%l" ) )
+ {
+ //TODO hour in 12h with 1 digit
+ changed = true;
+ }
+ else if ( format.startsWith( "%M" ) )// mm
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:minutes" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+
+ }
+ else if ( format.startsWith( "%S" ) ) //ss
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:seconds" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "%p" ) )
+ {
+ //TODO am or pm
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:am-pm" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ return changed;
+}
+
+
+bool KoOasisStyles::saveOasisTimeFormat( KoXmlWriter &elementWriter, QString & format, QString & text, bool &antislash )
+{
+ bool changed = false;
+ //we can also add time to date.
+ if ( antislash )
+ {
+ text+=format[0];
+ format = format.remove( 0, 1 );
+ antislash = false;
+ changed = true;
+ }
+ else if ( format.startsWith( "hh" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:hours" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "h" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:hours" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 1 );
+ changed = true;
+ }
+ else if ( format.startsWith( "mm" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:minutes" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "m" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:minutes" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 1 );
+ changed = true;
+ }
+ else if ( format.startsWith( "ss" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:seconds" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ else if ( format.startsWith( "s" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:seconds" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 1 );
+ changed = true;
+ }
+ else if ( format.startsWith( "ap" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:am-pm" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ changed = true;
+ }
+ return changed;
+}
+
+QString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const QString & _format, bool klocaleFormat,
+ const QString & _prefix, const QString & _suffix )
+{
+ Q_UNUSED(_prefix);
+ Q_UNUSED(_suffix);
+ kdDebug(30003)<<"QString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TIME );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ if ( klocaleFormat )
+ {
+ parseOasisTimeKlocale( elementWriter, format, text );
+ }
+ else
+ {
+ bool antislash = false;
+ do
+ {
+ if ( !saveOasisTimeFormat( elementWriter, format, text, antislash ) )
+ {
+ QString elem( format[0] );
+ format = format.remove( 0, 1 );
+ if ( elem == "\\" )
+ {
+ antislash = true;
+ }
+ else
+ {
+ text += elem;
+ antislash = false;
+ }
+ }
+ }
+ while ( format.length() > 0 );
+ addTextNumber( text, elementWriter );
+ }
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+//convert klocale string to good format
+void KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, QString & format, QString & text )
+{
+ kdDebug(30003)<<"KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, QString & format, QString & text ) :"<<format<<endl;
+ do
+ {
+ if ( format.startsWith( "%Y" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:year" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%y" ) )
+ {
+
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:year" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%n" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "false");
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%m" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%e" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%d" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%b" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "true");
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%B" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.addAttribute( "number:textual", "true");
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%a" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:day-of-week" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "%A" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:day-of-week" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else
+ {
+ if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
+ {
+ text += format[0];
+ format = format.remove( 0, 1 );
+ }
+ }
+ }
+ while ( format.length() > 0 );
+ addTextNumber( text, elementWriter );
+}
+
+QString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const QString & _format, bool klocaleFormat,
+ const QString & _prefix, const QString & _suffix )
+{
+ Q_UNUSED(_prefix);
+ Q_UNUSED(_suffix);
+ kdDebug(30003)<<"QString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ // Not supported into Qt: "era" "week-of-year" "quarter"
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_DATE );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ if ( klocaleFormat )
+ {
+ parseOasisDateKlocale( elementWriter, format, text );
+ }
+ else
+ {
+ bool antislash = false;
+ do
+ {
+ if ( antislash )
+ {
+ text+=format[0];
+ format = format.remove( 0, 1 );
+ }
+ //TODO implement loading ! What is it ?
+ else if ( format.startsWith( "MMMMM" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:textual", "true");
+ elementWriter.endElement();
+ format = format.remove( 0, 5 );
+ }
+ else if ( format.startsWith( "MMMM" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.addAttribute( "number:textual", "true");
+ elementWriter.endElement();
+ format = format.remove( 0, 4 );
+ }
+ else if ( format.startsWith( "MMM" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "true");
+ elementWriter.endElement();
+ format = format.remove( 0, 3 );
+ }
+ else if ( format.startsWith( "MM" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "M" ) )
+ {
+ addTextNumber( text, elementWriter );
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "false");
+ elementWriter.endElement();
+ format = format.remove( 0, 1 );
+ }
+ else if ( format.startsWith( "PPPP" ) )
+ {
+ addTextNumber( text, elementWriter );
+ //<number:month number:possessive-form="true" number:textual="true" number:style="long"/>
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "false");
+ elementWriter.addAttribute( "number:possessive-form", "true" );
+ elementWriter.endElement();
+ format = format.remove( 0, 4 );
+ }
+ else if ( format.startsWith( "PPP" ) )
+ {
+ addTextNumber( text, elementWriter );
+ //<number:month number:possessive-form="true" number:textual="true" number:style="short"/>
+ elementWriter.startElement( "number:month" );
+ elementWriter.addAttribute( "number:possessive-form", "true" );
+
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.addAttribute( "number:textual", "false");
+ elementWriter.endElement();
+ format = format.remove( 0, 3 );
+ }
+ else if ( format.startsWith( "dddd" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day-of-week" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 4 );
+ }
+ else if ( format.startsWith( "ddd" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day-of-week" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 3 );
+ }
+ else if ( format.startsWith( "dd" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else if ( format.startsWith( "d" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:day" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 1 );
+ }
+ else if ( format.startsWith( "yyyy" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:year" );
+ elementWriter.addAttribute( "number:style", "long" );
+ elementWriter.endElement();
+ format = format.remove( 0, 4 );
+ }
+ else if ( format.startsWith( "yy" ) )
+ {
+ addTextNumber( text, elementWriter );
+
+ elementWriter.startElement( "number:year" );
+ elementWriter.addAttribute( "number:style", "short" );
+ elementWriter.endElement();
+ format = format.remove( 0, 2 );
+ }
+ else
+ {
+ if ( !saveOasisTimeFormat( elementWriter, format, text,antislash ) )
+ {
+ QString elem( format[0] );
+ format = format.remove( 0, 1 );
+ if ( elem == "\\" )
+ {
+ antislash = true;
+ }
+ else
+ {
+ text += elem;
+ antislash = false;
+ }
+ }
+ }
+ }
+ while ( format.length() > 0 );
+ addTextNumber( text, elementWriter );
+ }
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+
+QString KoOasisStyles::saveOasisFractionStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
+{
+ kdDebug(30003)<<"QString saveOasisFractionStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_FRACTION );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ int integer = 0;
+ int numerator = 0;
+ int denominator = 0;
+ int denominatorValue = 0;
+ bool beforeSlash = true;
+ do
+ {
+ if ( format[0]=='#' )
+ integer++;
+ else if ( format[0]=='/' )
+ beforeSlash = false;
+ else if ( format[0]=='?' )
+ {
+ if ( beforeSlash )
+ numerator++;
+ else
+ denominator++;
+ }
+ else
+ {
+ bool ok;
+ int value = format.toInt( &ok );
+ if ( ok )
+ {
+ denominatorValue=value;
+ break;
+ }
+ }
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+
+ text= _prefix;
+ addTextNumber(text, elementWriter );
+
+ elementWriter.startElement( "number:fraction" );
+ elementWriter.addAttribute( "number:min-integer-digits", integer );
+ elementWriter.addAttribute( "number:min-numerator-digits",numerator );
+ elementWriter.addAttribute( "number:min-denominator-digits",denominator );
+ if ( denominatorValue != 0 )
+ elementWriter.addAttribute( "number:denominator-value",denominatorValue );
+ elementWriter.endElement();
+
+ addKofficeNumericStyleExtension( elementWriter, _suffix, _prefix );
+
+ text=_suffix;
+ addTextNumber(text, elementWriter );
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+
+QString KoOasisStyles::saveOasisNumberStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
+{
+ kdDebug(30003)<<"QString saveOasisNumberStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_NUMBER );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ int decimalplaces = 0;
+ int integerdigits = 0;
+ bool beforeSeparator = true;
+ do
+ {
+ if ( format[0]=='.' || format[0]==',' )
+ beforeSeparator = false;
+ else if ( format[0]=='0' && beforeSeparator )
+ integerdigits++;
+ else if ( format[0]=='0' && !beforeSeparator )
+ decimalplaces++;
+ else
+ kdDebug(30003)<<" error format 0 \n";
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+ text= _prefix ;
+ addTextNumber(text, elementWriter );
+ elementWriter.startElement( "number:number" );
+ kdDebug(30003)<<" decimalplaces :"<<decimalplaces<<" integerdigits :"<<integerdigits<<endl;
+ if (!beforeSeparator)
+ elementWriter.addAttribute( "number:decimal-places", decimalplaces );
+ elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
+ elementWriter.endElement();
+
+ text =_suffix ;
+ addTextNumber(text, elementWriter );
+ addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+QString KoOasisStyles::saveOasisPercentageStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
+{
+ //<number:percentage-style style:name="N11">
+ //<number:number number:decimal-places="2" number:min-integer-digits="1"/>
+ //<number:text>%</number:text>
+ //</number:percentage-style>
+
+ kdDebug(30003)<<"QString saveOasisPercentageStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_PERCENTAGE );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ int decimalplaces = 0;
+ int integerdigits = 0;
+ bool beforeSeparator = true;
+ do
+ {
+ if ( format[0]=='.' || format[0]==',' )
+ beforeSeparator = false;
+ else if ( format[0]=='0' && beforeSeparator )
+ integerdigits++;
+ else if ( format[0]=='0' && !beforeSeparator )
+ decimalplaces++;
+ else
+ kdDebug(30003)<<" error format 0 \n";
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+ text= _prefix ;
+ addTextNumber(text, elementWriter );
+ elementWriter.startElement( "number:number" );
+ if (!beforeSeparator)
+ elementWriter.addAttribute( "number:decimal-places", decimalplaces );
+ elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
+ elementWriter.endElement();
+
+ addTextNumber(QString( "%" ), elementWriter );
+
+ text =_suffix ;
+ addTextNumber(text, elementWriter );
+ addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+
+}
+
+QString KoOasisStyles::saveOasisScientificStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
+{
+ //<number:number-style style:name="N60">
+ //<number:scientific-number number:decimal-places="2" number:min-integer-digits="1" number:min-exponent-digits="3"/>
+ //</number:number-style>
+
+ //example 000,000e+0000
+ kdDebug(30003)<<"QString saveOasisScientificStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_SCIENTIFIC );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ int decimalplace = 0;
+ int integerdigits = 0;
+ int exponentdigits = 0;
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ bool beforeSeparator = true;
+ bool exponential = false;
+ bool positive = true;
+ do
+ {
+ if ( !exponential )
+ {
+ if ( format[0]=='0' && beforeSeparator )
+ integerdigits++;
+ else if ( format[0]==',' || format[0]=='.' )
+ beforeSeparator = false;
+ else if ( format[0]=='0' && !beforeSeparator )
+ decimalplace++;
+ else if ( format[0].lower()=='e' )
+ {
+ format.remove( 0, 1 );
+ if ( format[0]=='+' )
+ positive = true;
+ else if ( format[0]=='-' )
+ positive = false;
+ else
+ kdDebug(30003)<<"Error into scientific number\n";
+ exponential = true;
+ }
+ }
+ else
+ {
+ if ( format[0]=='0' && positive )
+ exponentdigits++;
+ else if ( format[0]=='0' && !positive )
+ exponentdigits--;
+ else
+ kdDebug(30003)<<" error into scientific number exponential value\n";
+ }
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+ text = _prefix ;
+ addTextNumber(text, elementWriter );
+
+ elementWriter.startElement( "number:scientific-number" );
+ kdDebug(30003)<<" decimalplace :"<<decimalplace<<" integerdigits :"<<integerdigits<<" exponentdigits :"<<exponentdigits<<endl;
+ if (!beforeSeparator)
+ elementWriter.addAttribute( "number:decimal-places", decimalplace );
+ elementWriter.addAttribute( "number:min-integer-digits",integerdigits );
+ elementWriter.addAttribute( "number:min-exponent-digits",exponentdigits );
+ elementWriter.endElement();
+
+ text = _suffix;
+ addTextNumber(text, elementWriter );
+ addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+QString KoOasisStyles::saveOasisCurrencyStyle( KoGenStyles &mainStyles,
+ const QString & _format, const QString &symbol,
+ const QString &_prefix, const QString &_suffix )
+{
+
+ //<number:currency-style style:name="N107P0" style:volatile="true">
+ //<number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true"/>
+ //<number:text> </number:text>
+ //<number:currency-symbol>VEB</number:currency-symbol>
+ //</number:currency-style>
+
+ kdDebug(30003)<<"QString saveOasisCurrencyStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_CURRENCY );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ int decimalplaces = 0;
+ int integerdigits = 0;
+ bool beforeSeparator = true;
+ do
+ {
+ if ( format[0]=='.' || format[0]==',' )
+ beforeSeparator = false;
+ else if ( format[0]=='0' && beforeSeparator )
+ integerdigits++;
+ else if ( format[0]=='0' && !beforeSeparator )
+ decimalplaces++;
+ else
+ kdDebug(30003)<<" error format 0 \n";
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+
+ text = _prefix ;
+ addTextNumber(text, elementWriter );
+
+ elementWriter.startElement( "number:number" );
+ kdDebug(30003)<<" decimalplaces :"<<decimalplaces<<" integerdigits :"<<integerdigits<<endl;
+ if (!beforeSeparator)
+ elementWriter.addAttribute( "number:decimal-places", decimalplaces );
+ elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
+ elementWriter.endElement();
+
+ text = _suffix ;
+ addTextNumber(text, elementWriter );
+ addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
+
+ elementWriter.startElement( "number:currency-symbol" );
+ kdDebug(30003) << " currency-symbol: " << symbol << endl;
+ elementWriter.addTextNode( symbol.utf8() );
+ elementWriter.endElement();
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+QString KoOasisStyles::saveOasisTextStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
+{
+
+ //<number:text-style style:name="N100">
+ //<number:text-content/>
+ ///</number:text-style>
+
+ kdDebug(30003)<<"QString saveOasisTextStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
+ QString format( _format );
+
+ KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TEXT );
+ QBuffer buffer;
+ buffer.open( IO_WriteOnly );
+ KoXmlWriter elementWriter( &buffer ); // TODO pass indentation level
+ QString text;
+ do
+ {
+ format.remove( 0,1 );
+ }
+ while ( format.length() > 0 );
+ text = _prefix ;
+ addTextNumber(text, elementWriter );
+
+ elementWriter.startElement( "number:text-style" );
+
+ text = _suffix ;
+ addTextNumber(text, elementWriter );
+ addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
+ elementWriter.endElement();
+
+ QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
+ currentStyle.addChildElement( "number", elementContents );
+ return mainStyles.lookup( currentStyle, "N" );
+}
+
+//This is an extension of numeric style. For the moment we used namespace of oasis format for specific koffice extention. change it for the futur.
+void KoOasisStyles::addKofficeNumericStyleExtension( KoXmlWriter & elementWriter, const QString &_suffix, const QString &_prefix )
+ {
+ if ( !_suffix.isEmpty() )
+ {
+ elementWriter.startElement( "number:suffix" );
+ elementWriter.addTextNode( _suffix );
+ elementWriter.endElement();
+ }
+ if ( !_prefix.isEmpty() )
+ {
+ elementWriter.startElement( "number:prefix" );
+ elementWriter.addTextNode( _prefix );
+ elementWriter.endElement();
+ }
+}
+
+void KoOasisStyles::saveOasisFillStyle( KoGenStyle &styleFill, KoGenStyles& mainStyles, const QBrush & brush )
+{
+ if ( brush.style() == Qt::SolidPattern )
+ {
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense1Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "94%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense2Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "88%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense3Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "63%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense4Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "50%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense5Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "37%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense6Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "12%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else if ( brush.style() == Qt::Dense7Pattern )
+ {
+ styleFill.addProperty( "draw:transparency", "6%" );
+ styleFill.addProperty( "draw:fill","solid" );
+ styleFill.addProperty( "draw:fill-color", brush.color().name() );
+ }
+ else //otherstyle
+ {
+ styleFill.addProperty( "draw:fill","hatch" );
+ styleFill.addProperty( "draw:fill-hatch-name", saveOasisHatchStyle( mainStyles,brush ) );
+ }
+
+}
+
+QString KoOasisStyles::saveOasisHatchStyle( KoGenStyles& mainStyles, const QBrush &brush )
+{
+ KoGenStyle hatchStyle( KoGenStyle::STYLE_HATCH /*no family name*/);
+ hatchStyle.addAttribute( "draw:color", brush.color().name() );
+ //hatchStyle.addAttribute( "draw:distance", m_distance ); not implemented into kpresenter
+ switch( brush.style() )
+ {
+ case Qt::HorPattern:
+ hatchStyle.addAttribute( "draw:style", "single" );
+ hatchStyle.addAttribute( "draw:rotation", 0);
+ break;
+ case Qt::BDiagPattern:
+ hatchStyle.addAttribute( "draw:style", "single" );
+ hatchStyle.addAttribute( "draw:rotation", 450);
+ break;
+ case Qt::VerPattern:
+ hatchStyle.addAttribute( "draw:style", "single" );
+ hatchStyle.addAttribute( "draw:rotation", 900);
+ break;
+ case Qt::FDiagPattern:
+ hatchStyle.addAttribute( "draw:style", "single" );
+ hatchStyle.addAttribute( "draw:rotation", 1350);
+ break;
+ case Qt::CrossPattern:
+ hatchStyle.addAttribute( "draw:style", "double" );
+ hatchStyle.addAttribute( "draw:rotation", 0);
+ break;
+ case Qt::DiagCrossPattern:
+ hatchStyle.addAttribute( "draw:style", "double" );
+ hatchStyle.addAttribute( "draw:rotation", 450);
+ break;
+ default:
+ break;
+ }
+
+ return mainStyles.lookup( hatchStyle, "hatch" );
+}
+
+QBrush KoOasisStyles::loadOasisFillStyle( const KoStyleStack &styleStack, const QString & fill, const KoOasisStyles & oasisStyles )
+{
+ QBrush tmpBrush;
+ if ( fill == "solid" )
+ {
+ tmpBrush.setStyle(static_cast<Qt::BrushStyle>( 1 ) );
+ if ( styleStack.hasAttributeNS( KoXmlNS::draw, "fill-color" ) )
+ tmpBrush.setColor(styleStack.attributeNS( KoXmlNS::draw, "fill-color" ) );
+ if ( styleStack.hasAttributeNS( KoXmlNS::draw, "transparency" ) )
+ {
+ QString transparency = styleStack.attributeNS( KoXmlNS::draw, "transparency" );
+ if ( transparency == "94%" )
+ {
+ tmpBrush.setStyle(Qt::Dense1Pattern);
+ }
+ else if ( transparency == "88%" )
+ {
+ tmpBrush.setStyle(Qt::Dense2Pattern);
+ }
+ else if ( transparency == "63%" )
+ {
+ tmpBrush.setStyle(Qt::Dense3Pattern);
+
+ }
+ else if ( transparency == "50%" )
+ {
+ tmpBrush.setStyle(Qt::Dense4Pattern);
+
+ }
+ else if ( transparency == "37%" )
+ {
+ tmpBrush.setStyle(Qt::Dense5Pattern);
+
+ }
+ else if ( transparency == "12%" )
+ {
+ tmpBrush.setStyle(Qt::Dense6Pattern);
+
+ }
+ else if ( transparency == "6%" )
+ {
+ tmpBrush.setStyle(Qt::Dense7Pattern);
+
+ }
+ else
+ kdDebug()<<" transparency is not defined into kpresenter :"<<transparency<<endl;
+ }
+ }
+ else if ( fill == "hatch" )
+ {
+ QString style = styleStack.attributeNS( KoXmlNS::draw, "fill-hatch-name" );
+ kdDebug()<<" hatch style is : "<<style<<endl;
+
+ //type not defined by default
+ //try to use style.
+ QDomElement* draw = oasisStyles.drawStyles()[style];
+ if ( draw)
+ {
+ kdDebug()<<"We have a style\n";
+ int angle = 0;
+ if( draw->hasAttributeNS( KoXmlNS::draw, "rotation" ))
+ {
+ angle = (draw->attributeNS( KoXmlNS::draw, "rotation", QString::null ).toInt())/10;
+ kdDebug()<<"angle :"<<angle<<endl;
+ }
+ if(draw->hasAttributeNS( KoXmlNS::draw, "color" ) )
+ {
+ //kdDebug()<<" draw:color :"<<draw->attributeNS( KoXmlNS::draw, "color", QString::null )<<endl;
+ tmpBrush.setColor(draw->attributeNS( KoXmlNS::draw, "color", QString::null ) );
+ }
+ if( draw->hasAttributeNS( KoXmlNS::draw, "distance" ))
+ {
+ //todo implemente it into kpresenter
+ }
+ if( draw->hasAttributeNS( KoXmlNS::draw, "display-name"))
+ {
+ //todo implement it into kpresenter
+ }
+ if( draw->hasAttributeNS( KoXmlNS::draw, "style" ))
+ {
+ //todo implemente it into kpresenter
+ QString styleHash = draw->attributeNS( KoXmlNS::draw, "style", QString::null );
+ if( styleHash == "single")
+ {
+ switch( angle )
+ {
+ case 0:
+ case 180:
+ tmpBrush.setStyle(Qt::HorPattern );
+ break;
+ case 45:
+ case 225:
+ tmpBrush.setStyle(Qt::BDiagPattern );
+ break;
+ case 90:
+ case 270:
+ tmpBrush.setStyle(Qt::VerPattern );
+ break;
+ case 135:
+ case 315:
+ tmpBrush.setStyle(Qt::FDiagPattern );
+ break;
+ default:
+ //todo fixme when we will have a kopaint
+ kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
+ break;
+ }
+ }
+ else if( styleHash == "double")
+ {
+ switch( angle )
+ {
+ case 0:
+ case 180:
+ case 90:
+ case 270:
+ tmpBrush.setStyle(Qt::CrossPattern );
+ break;
+ case 45:
+ case 135:
+ case 225:
+ case 315:
+ tmpBrush.setStyle(Qt::DiagCrossPattern );
+ break;
+ default:
+ //todo fixme when we will have a kopaint
+ kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
+ break;
+ }
+
+ }
+ else if( styleHash == "triple")
+ {
+ kdDebug()<<" it is not implemented :( \n";
+ }
+ }
+ }
+ }
+ return tmpBrush;
+}
+
+const QDomElement* KoOasisStyles::defaultStyle( const QString& family ) const
+{
+ return m_defaultStyle[family];
+}
+
+const QDomElement* KoOasisStyles::findStyle( const QString& name ) const
+{
+ return m_styles[ name ];
+}
+
+const QDomElement* KoOasisStyles::findStyle( const QString& styleName, const QString& family ) const
+{
+ const QDomElement* style = d->m_styles[ family ][ styleName ];
+ if ( style && !family.isEmpty() ) {
+ const QString styleFamily = style->attributeNS( KoXmlNS::style, "family", QString::null );
+ if ( styleFamily != family ) {
+ kdWarning() << "KoOasisStyles: was looking for style " << styleName
+ << " in family " << family << " but got " << styleFamily << endl;
+ }
+ }
+ return style;
+}
+
+const QDomElement* KoOasisStyles::findStyleAutoStyle( const QString& styleName, const QString& family ) const
+{
+ const QDomElement* style = d->m_stylesAutoStyles[ family ][ styleName ];
+ if ( style ) {
+ const QString styleFamily = style->attributeNS( KoXmlNS::style, "family", QString::null );
+ if ( styleFamily != family ) {
+ kdWarning() << "KoOasisStyles: was looking for style " << styleName
+ << " in family " << family << " but got " << styleFamily << endl;
+ }
+ }
+ return style;
+}