lib Library API Documentation

koOasisStyles.cc

00001 /* This file is part of the KDE project
00002    Copyright (C) 2004 David Faure <faure@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include "koOasisStyles.h"
00020 #include <koxmlwriter.h>
00021 #include <kdebug.h>
00022 #include <qdom.h>
00023 #include "kodom.h"
00024 #include "koxmlns.h"
00025 #include "koGenStyles.h"
00026 #include <qbuffer.h>
00027 #include <kglobal.h>
00028 #include <klocale.h>
00029 #include <qbrush.h>
00030 #include <koStyleStack.h>
00031 
00032 KoOasisStyles::KoOasisStyles()
00033 {
00034     m_styles.setAutoDelete( true );
00035     m_defaultStyle.setAutoDelete( true );
00036     m_masterPages.setAutoDelete( true );
00037     m_listStyles.setAutoDelete( true );
00038     m_drawStyles.setAutoDelete( true );
00039 }
00040 
00041 KoOasisStyles::~KoOasisStyles()
00042 {
00043 
00044 }
00045 
00046 void KoOasisStyles::createStyleMap( const QDomDocument& doc )
00047 {
00048    const QDomElement docElement  = doc.documentElement();
00049     // We used to have the office:version check here, but better let the apps do that
00050     QDomElement fontStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "font-decls" );
00051 
00052     if ( !fontStyles.isNull() ) {
00053         //kdDebug(30003) << "Starting reading in font-decl..." << endl;
00054         insertStyles( fontStyles );
00055     }// else
00056     //   kdDebug(30003) << "No items found" << endl;
00057 
00058     //kdDebug(30003) << "Starting reading in office:automatic-styles" << endl;
00059 
00060     QDomElement autoStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "automatic-styles" );
00061     if ( !autoStyles.isNull() ) {
00062         insertStyles( autoStyles );
00063     }// else
00064     //    kdDebug(30003) << "No items found" << endl;
00065 
00066 
00067     //kdDebug(30003) << "Reading in master styles" << endl;
00068 
00069     QDomNode masterStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "master-styles" );
00070 
00071     if ( !masterStyles.isNull() ) {
00072         QDomElement master;
00073         forEachElement( master, masterStyles )
00074         {
00075             if ( master.localName() == "master-page" &&
00076                  master.namespaceURI() == KoXmlNS::style ) {
00077                 const QString name = master.attributeNS( KoXmlNS::style, "name", QString::null );
00078                 kdDebug(30003) << "Master style: '" << name << "' loaded " << endl;
00079                 m_masterPages.insert( name, new QDomElement( master ) );
00080             } else
00081                 // OASIS docu mentions style:handout-master and draw:layer-set here
00082                 kdWarning(30003) << "Unknown tag " << master.tagName() << " in office:master-styles" << endl;
00083         }
00084     }
00085 
00086 
00087     kdDebug(30003) << "Starting reading in office:styles" << endl;
00088 
00089     const QDomElement officeStyle = KoDom::namedItemNS( docElement, KoXmlNS::office, "styles" );
00090 
00091     if ( !officeStyle.isNull() ) {
00092         m_officeStyle = officeStyle;
00093         insertOfficeStyles( m_officeStyle );
00094 
00095     }
00096 
00097     //kdDebug(30003) << "Styles read in." << endl;
00098 }
00099 
00100 QValueVector<QDomElement> KoOasisStyles::userStyles() const
00101 {
00102     QValueVector<QDomElement> vec;
00103     // Collect user styles
00104     unsigned int i = 0;
00105     QDomElement e;
00106     forEachElement( e, m_officeStyle )
00107     {
00108         if ( e.localName() == "style" &&
00109              e.namespaceURI() == KoXmlNS::style )
00110         {
00111             vec.resize( i+1 );
00112             vec[i++] = e;
00113         }
00114     }
00115     return vec;
00116 }
00117 
00118 void KoOasisStyles::insertOfficeStyles( const QDomElement& styles )
00119 {
00120     QDomElement e;
00121     forEachElement( e, styles )
00122     {
00123         const QString localName = e.localName();
00124         const QString ns = e.namespaceURI();
00125         if ( ( ns == KoXmlNS::svg && (
00126                    localName == "linearGradient"
00127                    || localName == "radialGradient" ) )
00128              || ( ns == KoXmlNS::draw && (
00129                       localName == "gradient"
00130                       || localName == "hatch"
00131                       || localName == "fill-image"
00132                       || localName == "marker"
00133                       || localName == "stroke-dash"
00134                       || localName == "opacity" ) )
00135              )
00136         {
00137             const QString name = e.attributeNS( KoXmlNS::draw, "name", QString::null );
00138             Q_ASSERT( !name.isEmpty() );
00139             QDomElement* ep = new QDomElement( e );
00140             m_drawStyles.insert( name, ep );
00141         }
00142         else
00143             insertStyle( e );
00144     }
00145 }
00146 
00147 
00148 void KoOasisStyles::insertStyles( const QDomElement& styles )
00149 {
00150     //kdDebug(30003) << "Inserting styles from " << styles.tagName() << endl;
00151     QDomElement e;
00152     forEachElement( e, styles )
00153         insertStyle( e );
00154 }
00155 
00156 void KoOasisStyles::insertStyle( const QDomElement& e )
00157 {
00158     const QString localName = e.localName();
00159     const QString ns = e.namespaceURI();
00160 
00161     const QString name = e.attributeNS( KoXmlNS::style, "name", QString::null );
00162     if ( ns == KoXmlNS::style && (
00163                 localName == "style"
00164              || localName == "page-master" // OO-1.1 compatibility (probably not useful)
00165              || localName == "page-layout"
00166              || localName == "font-decl"
00167              || localName == "presentation-page-layout" ) )
00168     {
00169         if ( m_styles.find( name ) != 0 )
00170         {
00171             kdDebug(30003) << "Style: '" << name << "' allready exists" << endl;
00172         }
00173         m_styles.insert( name, new QDomElement( e ) );
00174         //kdDebug(30003) << "Style: '" << name << "' loaded " << endl;
00175     } else if ( localName == "default-style" && ns == KoXmlNS::style ) {
00176         const QString family = e.attributeNS( KoXmlNS::style, "family", QString::null );
00177         if ( !family.isEmpty() )
00178             m_defaultStyle.insert( family, new QDomElement( e ) );
00179     } else if ( localName == "list-style" && ns == KoXmlNS::text ) {
00180         m_listStyles.insert( name, new QDomElement( e ) );
00181         //kdDebug(30003) << "List style: '" << name << "' loaded " << endl;
00182     } else if ( ns == KoXmlNS::number && (
00183                    localName == "number-style"
00184                 || localName == "currency-style"
00185                 || localName == "percentage-style"
00186                 || localName == "boolean-style"
00187                 || localName == "text-style"
00188                 || localName == "date-style"
00189                 || localName == "time-style" ) ) {
00190         importDataStyle( e );
00191     }
00192     // The rest (text:*-configuration and text:outline-style) is to be done by the apps.
00193 }
00194 
00195 // OO spec 2.5.4. p68. Conversion to Qt format: see qdate.html
00196 // OpenCalcImport::loadFormat has similar code, but slower, intermixed with other stuff,
00197 // lacking long-textual forms.
00198 void KoOasisStyles::importDataStyle( const QDomElement& parent )
00199 {
00200     QString format;
00201     int precision = 0;
00202     int leadingZ  = 1;
00203     bool thousandsSep = false;
00204     //todo negred
00205     bool negRed = false;
00206     bool ok = false;
00207     int i = 0;
00208     QDomElement e;
00209     QString prefix;
00210     QString suffix;
00211     forEachElement( e, parent )
00212     {
00213         if ( e.namespaceURI() != KoXmlNS::number )
00214             continue;
00215         QString localName = e.localName();
00216         const QString numberStyle = e.attributeNS( KoXmlNS::number, "style", QString::null );
00217         const bool shortForm = numberStyle == "short" || numberStyle.isEmpty();
00218         if ( localName == "day" ) {
00219             format += shortForm ? "d" : "dd";
00220         } else if ( localName == "day-of-week" ) {
00221             format += shortForm ? "ddd" : "dddd";
00222         } else if ( localName == "month" ) {
00223             if ( e.attributeNS( KoXmlNS::number, "possessive-form", QString::null ) == "true" ) {
00224                 format += shortForm ? "PPP" : "PPPP";
00225             }
00226             // TODO the spec has a strange mention of number:format-source
00227             else if ( e.attributeNS( KoXmlNS::number, "textual", QString::null ) == "true" ) {
00228                 format += shortForm ? "MMM" : "MMMM";
00229             } else { // month number
00230                 format += shortForm ? "M" : "MM";
00231             }
00232         } else if ( localName == "year" ) {
00233             format += shortForm ? "yy" : "yyyy";
00234         } else if ( localName == "era" ) {
00235             //TODO I don't know what is it... (define into oo spec)
00236         } else if ( localName == "week-of-year" || localName == "quarter") {
00237             // ### not supported in Qt
00238         } else if ( localName == "hours" ) {
00239             format += shortForm ? "h" : "hh";
00240         } else if ( localName == "minutes" ) {
00241             format += shortForm ? "m" : "mm";
00242         } else if ( localName == "seconds" ) {
00243             format += shortForm ? "s" : "ss";
00244         } else if ( localName == "am-pm" ) {
00245             format += "ap";
00246         } else if ( localName == "text" ) { // litteral
00247             format += e.text();
00248         } else if ( localName == "suffix" ) {
00249             suffix = e.text();
00250             kdDebug()<<" suffix :"<<suffix<<endl;
00251         } else if ( localName == "prefix" ) {
00252             prefix = e.text();
00253             kdDebug()<<" prefix :"<<prefix<<endl;
00254         } else if ( localName == "currency-symbol" ) {
00255             format += e.text();
00256             //TODO
00257             // number:language="de" number:country="DE">€</number:currency-symbol>
00258         } else if ( localName == "number" ) {
00259             // TODO: number:grouping="true"
00260             if ( e.hasAttributeNS( KoXmlNS::number, "decimal-places" ) )
00261             {
00262                 int d = e.attributeNS( KoXmlNS::number, "decimal-places", QString::null ).toInt( &ok );
00263                 if ( ok )
00264                     precision = d;
00265             }
00266             if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
00267             {
00268                 int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
00269                 if ( ok )
00270                     leadingZ = d;
00271             }
00272             if ( thousandsSep && leadingZ <= 3 )
00273             {
00274                 format += "#,";
00275                 for ( i = leadingZ; i <= 3; ++i )
00276                     format += '#';
00277             }
00278             for ( i = 1; i <= leadingZ; ++i )
00279             {
00280                 format +=  '0';
00281                 if ( ( i % 3 == 0 ) && thousandsSep )
00282                     format =+ ',' ;
00283             }
00284             format += '.';
00285             for ( i = 0; i < precision; ++i )
00286                 format += '0';
00287         }
00288         else if ( localName == "scientific-number" ) {
00289             int exp = 2;
00290 
00291             if ( e.hasAttributeNS( KoXmlNS::number, "decimal-places" ) )
00292             {
00293                 int d = e.attributeNS( KoXmlNS::number, "decimal-places", QString::null ).toInt( &ok );
00294                 if ( ok )
00295                     precision = d;
00296             }
00297 
00298             if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
00299             {
00300                 int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
00301                 if ( ok )
00302                     leadingZ = d;
00303             }
00304 
00305             if ( e.hasAttributeNS( KoXmlNS::number, "min-exponent-digits" ) )
00306             {
00307                 int d = e.attributeNS( KoXmlNS::number, "min-exponent-digits", QString::null ).toInt( &ok );
00308                 if ( ok )
00309                     exp = d;
00310                 if ( exp <= 0 )
00311                     exp = 1;
00312             }
00313 
00314             if ( thousandsSep && leadingZ <= 3 )
00315             {
00316                 format += "#,";
00317                 for ( i = leadingZ; i <= 3; ++i )
00318                     format += '#';
00319             }
00320 
00321             for ( i = 1; i <= leadingZ; ++i )
00322             {
00323                 format+='0';
00324                 if ( ( i % 3 == 0 ) && thousandsSep )
00325                     format+=',';
00326             }
00327 
00328             format+='.';
00329             for ( i = 0; i < precision; ++i )
00330                 format+='0';
00331 
00332             format+="E+";
00333             for ( i = 0; i < exp; ++i )
00334                 format+='0';
00335         } else if ( localName == "fraction" ) {
00336                 int integer = 0;
00337                 int numerator = 1;
00338                 int denominator = 1;
00339                 int denominatorValue=0;
00340                 if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) )
00341                 {
00342                     int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", QString::null ).toInt( &ok );
00343                     if ( ok )
00344                         integer = d;
00345                 }
00346                 if ( e.hasAttributeNS( KoXmlNS::number, "min-numerator-digits" ) )
00347                 {
00348                     int d = e.attributeNS( KoXmlNS::number, "min-numerator-digits", QString::null ).toInt( &ok );
00349                     if ( ok )
00350                         numerator = d;
00351                 }
00352                 if ( e.hasAttributeNS( KoXmlNS::number, "min-denominator-digits" ) )
00353                 {
00354                     int d = e.attributeNS( KoXmlNS::number, "min-denominator-digits", QString::null ).toInt( &ok );
00355                     if ( ok )
00356                         denominator = d;
00357                 }
00358                 if ( e.hasAttributeNS( KoXmlNS::number, "denominator-value" ) )
00359                 {
00360                     int d = e.attributeNS( KoXmlNS::number, "denominator-value", QString::null ).toInt( &ok );
00361                     if ( ok )
00362                         denominatorValue = d;
00363                 }
00364 
00365                 for ( i = 0; i < integer; ++i )
00366                     format+='#';
00367 
00368                 format+=' ';
00369 
00370                 for ( i = 0; i < numerator; ++i )
00371                     format+='?';
00372 
00373                 format+='/';
00374 
00375                 if ( denominatorValue != 0 )
00376                     format+=QString::number( denominatorValue );
00377                 else
00378                 {
00379                     for ( i = 0; i < denominator; ++i )
00380                         format+='?';
00381                 }
00382             }
00383         // Not needed:
00384         //  <style:map style:condition="value()&gt;=0" style:apply-style-name="N106P0"/>
00385         // we handle painting negative numbers in red differently
00386 
00387     }
00388 
00389     const QString styleName = parent.attributeNS( KoXmlNS::style, "name", QString::null );
00390     kdDebug(30003) << "datetime style: " << styleName << " qt format=" << format << endl;
00391     if ( !prefix.isEmpty() )
00392     {
00393         kdDebug(30003)<<" format.left( prefix.length() ) :"<<format.left( prefix.length() )<<" prefix :"<<prefix<<endl;
00394         if ( format.left( prefix.length() )==prefix )
00395         {
00396             format = format.right( format.length()-prefix.length() );
00397         }
00398         else
00399             prefix = QString::null;
00400     }
00401     if ( !suffix.isEmpty() )
00402     {
00403         kdDebug(30003)<<"format.right( suffix.length() ) :"<<format.right( suffix.length() )<<" suffix :"<<suffix<<endl;
00404         if ( format.right( suffix.length() )==suffix )
00405         {
00406             format = format.left( format.length()-suffix.length() );
00407         }
00408         else
00409             suffix = QString::null;
00410     }
00411     NumericStyleFormat numeric;
00412     numeric.formatStr=format;
00413     numeric.prefix=prefix;
00414     numeric.suffix=suffix;
00415     kdDebug()<<" finish insert format :"<<format<<" prefix :"<<prefix<<" suffix :"<<suffix<<endl;
00416     m_dataFormats.insert( styleName, numeric );
00417 }
00418 
00419 #define addTextNumber( text, elementWriter ) { \
00420         if ( !text.isEmpty() ) \
00421         { \
00422             elementWriter.startElement( "number:text" ); \
00423             elementWriter.addTextNode( text ); \
00424             elementWriter.endElement(); \
00425             text=""; \
00426         } \
00427 }
00428 
00429 void KoOasisStyles::parseOasisTimeKlocale(KoXmlWriter &elementWriter, QString & format, QString & text )
00430 {
00431     kdDebug(30003)<<"parseOasisTimeKlocale(KoXmlWriter &elementWriter, QString & format, QString & text ) :"<<format<<endl;
00432     do
00433     {
00434         if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
00435         {
00436             text += format[0];
00437             format = format.remove( 0, 1 );
00438         }
00439     }
00440     while ( format.length() > 0 );
00441     addTextNumber( text, elementWriter );
00442 }
00443 
00444 bool KoOasisStyles::saveOasisKlocaleTimeFormat( KoXmlWriter &elementWriter, QString & format, QString & text )
00445 {
00446     bool changed = false;
00447     if ( format.startsWith( "%H" ) ) //hh
00448     {
00449         //hour in 24h
00450         addTextNumber( text, elementWriter );
00451 
00452         elementWriter.startElement( "number:hours" );
00453         elementWriter.addAttribute( "number:style", "long" );
00454         elementWriter.endElement();
00455         format = format.remove( 0, 2 );
00456         changed = true;
00457     }
00458     else if ( format.startsWith( "%k" ) )//h
00459     {
00460         addTextNumber( text, elementWriter );
00461 
00462         elementWriter.startElement( "number:hours" );
00463         elementWriter.addAttribute( "number:style", "short" );
00464         elementWriter.endElement();
00465         format = format.remove( 0, 2 );
00466         changed = true;
00467     }
00468     else if ( format.startsWith( "%I" ) )// ?????
00469     {
00470         //TODO hour in 12h
00471         changed = true;
00472     }
00473     else if ( format.startsWith( "%l" ) )
00474     {
00475         //TODO hour in 12h with 1 digit
00476         changed = true;
00477     }
00478     else if ( format.startsWith( "%M" ) )// mm
00479     {
00480         addTextNumber( text, elementWriter );
00481 
00482         elementWriter.startElement( "number:minutes" );
00483         elementWriter.addAttribute( "number:style", "long" );
00484         elementWriter.endElement();
00485         format = format.remove( 0, 2 );
00486         changed = true;
00487 
00488     }
00489     else if ( format.startsWith( "%S" ) ) //ss
00490     {
00491         addTextNumber( text, elementWriter );
00492 
00493         elementWriter.startElement( "number:seconds" );
00494         elementWriter.addAttribute( "number:style", "long" );
00495         elementWriter.endElement();
00496         format = format.remove( 0, 2 );
00497         changed = true;
00498     }
00499     else if ( format.startsWith( "%p" ) )
00500     {
00501         //TODO am or pm
00502         addTextNumber( text, elementWriter );
00503 
00504         elementWriter.startElement( "number:am-pm" );
00505         elementWriter.endElement();
00506         format = format.remove( 0, 2 );
00507         changed = true;
00508     }
00509     return changed;
00510 }
00511 
00512 
00513 bool KoOasisStyles::saveOasisTimeFormat( KoXmlWriter &elementWriter, QString & format, QString & text, bool &antislash )
00514 {
00515     bool changed = false;
00516     //we can also add time to date.
00517     if ( antislash )
00518     {
00519         text+=format[0];
00520         format = format.remove( 0, 1 );
00521         antislash = false;
00522         changed = true;
00523     }
00524     else if ( format.startsWith( "hh" ) )
00525     {
00526         addTextNumber( text, elementWriter );
00527 
00528         elementWriter.startElement( "number:hours" );
00529         elementWriter.addAttribute( "number:style", "long" );
00530         elementWriter.endElement();
00531         format = format.remove( 0, 2 );
00532         changed = true;
00533     }
00534     else if ( format.startsWith( "h" ) )
00535     {
00536         addTextNumber( text, elementWriter );
00537 
00538         elementWriter.startElement( "number:hours" );
00539         elementWriter.addAttribute( "number:style", "short" );
00540         elementWriter.endElement();
00541         format = format.remove( 0, 1 );
00542         changed = true;
00543     }
00544     else if ( format.startsWith( "mm" ) )
00545     {
00546         addTextNumber( text, elementWriter );
00547 
00548         elementWriter.startElement( "number:minutes" );
00549         elementWriter.addAttribute( "number:style", "long" );
00550         elementWriter.endElement();
00551         format = format.remove( 0, 2 );
00552         changed = true;
00553     }
00554     else if ( format.startsWith( "m" ) )
00555     {
00556         addTextNumber( text, elementWriter );
00557 
00558         elementWriter.startElement( "number:minutes" );
00559         elementWriter.addAttribute( "number:style", "short" );
00560         elementWriter.endElement();
00561         format = format.remove( 0, 1 );
00562         changed = true;
00563     }
00564     else if ( format.startsWith( "ss" ) )
00565     {
00566         addTextNumber( text, elementWriter );
00567 
00568         elementWriter.startElement( "number:seconds" );
00569         elementWriter.addAttribute( "number:style", "long" );
00570         elementWriter.endElement();
00571         format = format.remove( 0, 2 );
00572         changed = true;
00573     }
00574     else if ( format.startsWith( "s" ) )
00575     {
00576         addTextNumber( text, elementWriter );
00577 
00578         elementWriter.startElement( "number:seconds" );
00579         elementWriter.addAttribute( "number:style", "short" );
00580         elementWriter.endElement();
00581         format = format.remove( 0, 1 );
00582         changed = true;
00583     }
00584     else if ( format.startsWith( "ap" ) )
00585     {
00586         addTextNumber( text, elementWriter );
00587 
00588         elementWriter.startElement( "number:am-pm" );
00589         elementWriter.endElement();
00590         format = format.remove( 0, 2 );
00591         changed = true;
00592     }
00593     return changed;
00594 }
00595 
00596 QString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const QString & _format, bool klocaleFormat )
00597 {
00598     kdDebug(30003)<<"QString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
00599     QString format( _format );
00600     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TIME );
00601     QBuffer buffer;
00602     buffer.open( IO_WriteOnly );
00603     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
00604     QString text;
00605     if ( klocaleFormat )
00606     {
00607         parseOasisTimeKlocale( elementWriter, format, text );
00608     }
00609     else
00610     {
00611         bool antislash = false;
00612         do
00613         {
00614             if ( !saveOasisTimeFormat( elementWriter, format, text, antislash ) )
00615             {
00616                 QString elem( format[0] );
00617                 format = format.remove( 0, 1 );
00618                 if ( elem == "\\" )
00619                 {
00620                      antislash = true;
00621                 }
00622                 else
00623                 {
00624                     text += elem;
00625                     antislash = false;
00626                 }
00627             }
00628         }
00629         while ( format.length() > 0 );
00630         addTextNumber( text, elementWriter );
00631     }
00632     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
00633     currentStyle.addChildElement( "number", elementContents );
00634     return mainStyles.lookup( currentStyle, "N" );
00635 }
00636 
00637 //convert klocale string to good format
00638 void KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, QString & format, QString & text )
00639 {
00640     kdDebug(30003)<<"KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, QString & format, QString & text ) :"<<format<<endl;
00641     do
00642     {
00643         if ( format.startsWith( "%Y" ) )
00644         {
00645             addTextNumber( text, elementWriter );
00646             elementWriter.startElement( "number:year" );
00647             elementWriter.addAttribute( "number:style", "long" );
00648             elementWriter.endElement();
00649             format = format.remove( 0, 2 );
00650         }
00651         else if ( format.startsWith( "%y" ) )
00652         {
00653 
00654             addTextNumber( text, elementWriter );
00655 
00656             elementWriter.startElement( "number:year" );
00657             elementWriter.addAttribute( "number:style", "short" );
00658             elementWriter.endElement();
00659             format = format.remove( 0, 2 );
00660         }
00661         else if ( format.startsWith( "%n" ) )
00662         {
00663             addTextNumber( text, elementWriter );
00664             elementWriter.startElement( "number:month" );
00665             elementWriter.addAttribute( "number:style", "short" );
00666             elementWriter.addAttribute( "number:textual", "false");
00667             elementWriter.endElement();
00668             format = format.remove( 0, 2 );
00669         }
00670         else if ( format.startsWith( "%m" ) )
00671         {
00672             addTextNumber( text, elementWriter );
00673             elementWriter.startElement( "number:month" );
00674             elementWriter.addAttribute( "number:style", "long" );
00675             elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
00676             elementWriter.endElement();
00677             format = format.remove( 0, 2 );
00678         }
00679         else if ( format.startsWith( "%e" ) )
00680         {
00681             addTextNumber( text, elementWriter );
00682 
00683             elementWriter.startElement( "number:day" );
00684             elementWriter.addAttribute( "number:style", "short" );
00685             elementWriter.endElement();
00686             format = format.remove( 0, 2 );
00687         }
00688         else if ( format.startsWith( "%d" ) )
00689         {
00690             addTextNumber( text, elementWriter );
00691 
00692             elementWriter.startElement( "number:day" );
00693             elementWriter.addAttribute( "number:style", "long" );
00694             elementWriter.endElement();
00695             format = format.remove( 0, 2 );
00696         }
00697         else if ( format.startsWith( "%b" ) )
00698         {
00699             addTextNumber( text, elementWriter );
00700             elementWriter.startElement( "number:month" );
00701             elementWriter.addAttribute( "number:style", "short" );
00702             elementWriter.addAttribute( "number:textual", "true");
00703             elementWriter.endElement();
00704             format = format.remove( 0, 2 );
00705         }
00706         else if ( format.startsWith( "%B" ) )
00707         {
00708             addTextNumber( text, elementWriter );
00709             elementWriter.startElement( "number:month" );
00710             elementWriter.addAttribute( "number:style", "long" );
00711             elementWriter.addAttribute( "number:textual", "true");
00712             elementWriter.endElement();
00713             format = format.remove( 0, 2 );
00714         }
00715         else if ( format.startsWith( "%a" ) )
00716         {
00717             addTextNumber( text, elementWriter );
00718             elementWriter.startElement( "number:day-of-week" );
00719             elementWriter.addAttribute( "number:style", "short" );
00720             elementWriter.endElement();
00721 
00722             format = format.remove( 0, 2 );
00723         }
00724         else if ( format.startsWith( "%A" ) )
00725         {
00726             addTextNumber( text, elementWriter );
00727             elementWriter.startElement( "number:day-of-week" );
00728             elementWriter.addAttribute( "number:style", "long" );
00729             elementWriter.endElement();
00730             format = format.remove( 0, 2 );
00731         }
00732         else
00733         {
00734             if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
00735             {
00736                 text += format[0];
00737                 format = format.remove( 0, 1 );
00738             }
00739         }
00740     }
00741     while ( format.length() > 0 );
00742     addTextNumber( text, elementWriter );
00743 }
00744 
00745 QString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const QString & _format, bool klocaleFormat )
00746 {
00747     kdDebug(30003)<<"QString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
00748     QString format( _format );
00749 
00750     // Not supported into Qt: "era" "week-of-year" "quarter"
00751 
00752     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_DATE );
00753     QBuffer buffer;
00754     buffer.open( IO_WriteOnly );
00755     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
00756     QString text;
00757     if ( klocaleFormat )
00758     {
00759         parseOasisDateKlocale( elementWriter, format, text );
00760     }
00761     else
00762     {
00763         bool antislash = false;
00764         do
00765         {
00766             if ( antislash )
00767             {
00768                 text+=format[0];
00769                 format = format.remove( 0, 1 );
00770             }
00771             //TODO implement loading ! What is it ?
00772             else if ( format.startsWith( "MMMMM" ) )
00773             {
00774                 addTextNumber( text, elementWriter );
00775                 elementWriter.startElement( "number:month" );
00776                 elementWriter.addAttribute( "number:textual", "true");
00777                 elementWriter.endElement();
00778                 format = format.remove( 0, 5 );
00779             }
00780             else if ( format.startsWith( "MMMM" ) )
00781             {
00782                 addTextNumber( text, elementWriter );
00783                 elementWriter.startElement( "number:month" );
00784                 elementWriter.addAttribute( "number:style", "long" );
00785                 elementWriter.addAttribute( "number:textual", "true");
00786                 elementWriter.endElement();
00787                 format = format.remove( 0, 4 );
00788             }
00789             else if ( format.startsWith( "MMM" ) )
00790             {
00791                 addTextNumber( text, elementWriter );
00792                 elementWriter.startElement( "number:month" );
00793                 elementWriter.addAttribute( "number:style", "short" );
00794                 elementWriter.addAttribute( "number:textual", "true");
00795                 elementWriter.endElement();
00796                 format = format.remove( 0, 3 );
00797             }
00798             else if ( format.startsWith( "MM" ) )
00799             {
00800                 addTextNumber( text, elementWriter );
00801                 elementWriter.startElement( "number:month" );
00802                 elementWriter.addAttribute( "number:style", "long" );
00803                 elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
00804                 elementWriter.endElement();
00805                 format = format.remove( 0, 2 );
00806             }
00807             else if ( format.startsWith( "M" ) )
00808             {
00809                 addTextNumber( text, elementWriter );
00810                 elementWriter.startElement( "number:month" );
00811                 elementWriter.addAttribute( "number:style", "short" );
00812                 elementWriter.addAttribute( "number:textual", "false");
00813                 elementWriter.endElement();
00814                 format = format.remove( 0, 1 );
00815             }
00816             else if ( format.startsWith( "PPPP" ) )
00817             {
00818                 addTextNumber( text, elementWriter );
00819                 //<number:month number:possessive-form="true" number:textual="true" number:style="long"/>
00820                 elementWriter.startElement( "number:month" );
00821                 elementWriter.addAttribute( "number:style", "short" );
00822                 elementWriter.addAttribute( "number:textual", "false");
00823                 elementWriter.addAttribute( "number:possessive-form", "true" );
00824                 elementWriter.endElement();
00825                 format = format.remove( 0, 4 );
00826             }
00827             else if ( format.startsWith( "PPP" ) )
00828             {
00829                 addTextNumber( text, elementWriter );
00830                 //<number:month number:possessive-form="true" number:textual="true" number:style="short"/>
00831                 elementWriter.startElement( "number:month" );
00832                 elementWriter.addAttribute( "number:possessive-form", "true" );
00833 
00834                 elementWriter.addAttribute( "number:style", "short" );
00835                 elementWriter.addAttribute( "number:textual", "false");
00836                 elementWriter.endElement();
00837                 format = format.remove( 0, 3 );
00838             }
00839             else if ( format.startsWith( "dddd" ) )
00840             {
00841                 addTextNumber( text, elementWriter );
00842 
00843                 elementWriter.startElement( "number:day-of-week" );
00844                 elementWriter.addAttribute( "number:style", "long" );
00845                 elementWriter.endElement();
00846                 format = format.remove( 0, 4 );
00847             }
00848             else if ( format.startsWith( "ddd" ) )
00849             {
00850                 addTextNumber( text, elementWriter );
00851 
00852                 elementWriter.startElement( "number:day-of-week" );
00853                 elementWriter.addAttribute( "number:style", "short" );
00854                 elementWriter.endElement();
00855                 format = format.remove( 0, 3 );
00856             }
00857             else if ( format.startsWith( "dd" ) )
00858             {
00859                 addTextNumber( text, elementWriter );
00860 
00861                 elementWriter.startElement( "number:day" );
00862                 elementWriter.addAttribute( "number:style", "long" );
00863                 elementWriter.endElement();
00864                 format = format.remove( 0, 2 );
00865             }
00866             else if ( format.startsWith( "d" ) )
00867             {
00868                 addTextNumber( text, elementWriter );
00869 
00870                 elementWriter.startElement( "number:day" );
00871                 elementWriter.addAttribute( "number:style", "short" );
00872                 elementWriter.endElement();
00873                 format = format.remove( 0, 1 );
00874             }
00875             else if ( format.startsWith( "yyyy" ) )
00876             {
00877                 addTextNumber( text, elementWriter );
00878 
00879                 elementWriter.startElement( "number:year" );
00880                 elementWriter.addAttribute( "number:style", "long" );
00881                 elementWriter.endElement();
00882                 format = format.remove( 0, 4 );
00883             }
00884             else if ( format.startsWith( "yy" ) )
00885             {
00886                 addTextNumber( text, elementWriter );
00887 
00888                 elementWriter.startElement( "number:year" );
00889                 elementWriter.addAttribute( "number:style", "short" );
00890                 elementWriter.endElement();
00891                 format = format.remove( 0, 2 );
00892             }
00893             else
00894             {
00895                 if ( !saveOasisTimeFormat( elementWriter, format, text,antislash ) )
00896                 {
00897                     QString elem( format[0] );
00898                     format = format.remove( 0, 1 );
00899                     if ( elem == "\\" )
00900                     {
00901                         antislash = true;
00902                     }
00903                     else
00904                     {
00905                         text += elem;
00906                         antislash = false;
00907                     }
00908                 }
00909             }
00910         }
00911         while ( format.length() > 0 );
00912         addTextNumber( text, elementWriter );
00913     }
00914 
00915     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
00916     currentStyle.addChildElement( "number", elementContents );
00917     return mainStyles.lookup( currentStyle, "N" );
00918 }
00919 
00920 
00921 QString KoOasisStyles::saveOasisFractionStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
00922 {
00923     kdDebug(30003)<<"QString saveOasisFractionStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
00924     QString format( _format );
00925 
00926     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_FRACTION );
00927     QBuffer buffer;
00928     buffer.open( IO_WriteOnly );
00929     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
00930     QString text;
00931     int integer = 0;
00932     int numerator = 0;
00933     int denominator = 0;
00934     int denominatorValue = 0;
00935     bool beforeSlash = true;
00936     do
00937     {
00938         if ( format[0]=='#' )
00939             integer++;
00940         else if ( format[0]=='/' )
00941             beforeSlash = false;
00942         else if ( format[0]=='?' )
00943         {
00944             if ( beforeSlash )
00945                 numerator++;
00946             else
00947                 denominator++;
00948         }
00949         else
00950         {
00951             bool ok;
00952             int value = format.toInt( &ok );
00953             if ( ok )
00954             {
00955                 denominatorValue=value;
00956                 break;
00957             }
00958         }
00959         format.remove( 0,1 );
00960     }
00961     while ( format.length() > 0 );
00962 
00963     text= _prefix;
00964     addTextNumber(text, elementWriter );
00965 
00966     elementWriter.startElement( "number:fraction" );
00967     elementWriter.addAttribute( "number:min-integer-digits", integer );
00968     elementWriter.addAttribute( "number:min-numerator-digits",numerator );
00969     elementWriter.addAttribute( "number:min-denominator-digits",denominator );
00970     if ( denominatorValue != 0 )
00971         elementWriter.addAttribute( "number:denominator-value",denominatorValue );
00972     elementWriter.endElement();
00973 
00974     addKofficeNumericStyleExtension( elementWriter, _suffix, _prefix );
00975 
00976     text=_suffix;
00977     addTextNumber(text, elementWriter );
00978 
00979     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
00980     currentStyle.addChildElement( "number", elementContents );
00981     return mainStyles.lookup( currentStyle, "N" );
00982 }
00983 
00984 
00985 QString KoOasisStyles::saveOasisPercentageStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
00986 {
00987     //<number:percentage-style style:name="N11">
00988     //<number:number number:decimal-places="2" number:min-integer-digits="1"/>
00989     //<number:text>%</number:text>
00990     //</number:percentage-style>
00991 
00992     kdDebug(30003)<<"QString saveOasisPercentageStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
00993     QString format( _format );
00994 
00995     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_PERCENTAGE );
00996     QBuffer buffer;
00997     buffer.open( IO_WriteOnly );
00998     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
00999     QString text;
01000     int decimalplaces = 0;
01001     int integerdigits = 0;
01002     bool beforeSeparator = true;
01003     do
01004     {
01005         if ( format[0]=='.' || format[0]==',' )
01006             beforeSeparator = true;
01007         else if ( format[0]=='0' && beforeSeparator )
01008             integerdigits++;
01009         else if ( format[0]=='0' && !beforeSeparator )
01010             decimalplaces++;
01011         else
01012             kdDebug(30003)<<" error format 0 \n";
01013         format.remove( 0,1 );
01014     }
01015     while ( format.length() > 0 );
01016     text= _prefix ;
01017     addTextNumber(text, elementWriter );
01018     elementWriter.startElement( "number:number" );
01019     elementWriter.addAttribute( "number:decimal-places", decimalplaces );
01020     elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
01021     elementWriter.endElement();
01022 
01023     addTextNumber(QString( "%" ), elementWriter );
01024 
01025     text =_suffix ;
01026     addTextNumber(text, elementWriter );
01027     addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
01028 
01029     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
01030     currentStyle.addChildElement( "number", elementContents );
01031     return mainStyles.lookup( currentStyle, "N" );
01032 
01033 }
01034 
01035 QString KoOasisStyles::saveOasisScientificStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
01036 {
01037     //<number:number-style style:name="N60">
01038     //<number:scientific-number number:decimal-places="2" number:min-integer-digits="1" number:min-exponent-digits="3"/>
01039     //</number:number-style>
01040 
01041     //example 000,000e+0000
01042     kdDebug(30003)<<"QString saveOasisScientificStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
01043     QString format( _format );
01044 
01045     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_SCIENTIFIC );
01046     QBuffer buffer;
01047     buffer.open( IO_WriteOnly );
01048     int decimalplace = 0;
01049     int integerdigits = 0;
01050     int exponentdigits = 0;
01051     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
01052     QString text;
01053     bool beforeSeparator = true;
01054     bool exponential = false;
01055     bool positive = true;
01056     do
01057     {
01058         if ( !exponential )
01059         {
01060             if ( format[0]=='0' && beforeSeparator )
01061                 integerdigits++;
01062             else if ( format[0]==',' || format[0]=='.' )
01063                 beforeSeparator = false;
01064             else if (  format[0]=='0' && !beforeSeparator )
01065                 decimalplace++;
01066             else if ( format[0].lower()=='e' )
01067             {
01068                 format.remove( 0, 1 );
01069                 if ( format[0]=='+' )
01070                     positive = true;
01071                 else if ( format[0]=='-' )
01072                     positive = false;
01073                 else
01074                     kdDebug(30003)<<"Error into scientific number\n";
01075                 exponential = true;
01076             }
01077         }
01078         else
01079         {
01080             if ( format[0]=='0' && positive )
01081                 exponentdigits++;
01082             else if ( format[0]=='0' && !positive )
01083                 exponentdigits--;
01084             else
01085                 kdDebug(30003)<<" error into scientific number exponential value\n";
01086         }
01087         format.remove( 0,1 );
01088     }
01089     while ( format.length() > 0 );
01090     text =  _prefix ;
01091     addTextNumber(text, elementWriter );
01092 
01093     elementWriter.startElement( "number:scientific-number" );
01094     kdDebug(30003)<<" decimalplace :"<<decimalplace<<" integerdigits :"<<integerdigits<<" exponentdigits :"<<exponentdigits<<endl;
01095     elementWriter.addAttribute( "number:decimal-places", decimalplace );
01096     elementWriter.addAttribute( "number:min-integer-digits",integerdigits );
01097     elementWriter.addAttribute( "number:min-exponent-digits",exponentdigits );
01098     elementWriter.endElement();
01099 
01100     text = _suffix;
01101     addTextNumber(text, elementWriter );
01102     addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
01103 
01104     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
01105     currentStyle.addChildElement( "number", elementContents );
01106     return mainStyles.lookup( currentStyle, "N" );
01107 }
01108 
01109 QString KoOasisStyles::saveOasisCurrencyStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
01110 {
01111 
01112     //<number:currency-style style:name="N107P0" style:volatile="true">
01113     //<number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true"/>
01114     //<number:text> </number:text>
01115     //<number:currency-symbol>VEB</number:currency-symbol>
01116     //</number:currency-style>
01117 
01118     kdDebug(30003)<<"QString saveOasisCurrencyStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
01119     QString format( _format );
01120 
01121     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_CURRENCY );
01122     QBuffer buffer;
01123     buffer.open( IO_WriteOnly );
01124     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
01125     QString text;
01126     do
01127     {
01128         format.remove( 0,1 );
01129     }
01130     while ( format.length() > 0 );
01131     text =  _prefix ;
01132     addTextNumber(text, elementWriter );
01133 
01134     elementWriter.startElement( "number:currency-style" );
01135 
01136     text =  _suffix ;
01137     addTextNumber(text, elementWriter );
01138     addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
01139     elementWriter.endElement();
01140 
01141     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
01142     currentStyle.addChildElement( "number", elementContents );
01143     return mainStyles.lookup( currentStyle, "N" );
01144 }
01145 
01146 QString KoOasisStyles::saveOasisTextStyle( KoGenStyles &mainStyles, const QString & _format, const QString &_prefix, const QString &_suffix )
01147 {
01148 
01149     //<number:text-style style:name="N100">
01150     //<number:text-content/>
01152 
01153     kdDebug(30003)<<"QString saveOasisTextStyle( KoGenStyles &mainStyles, const QString & _format ) :"<<_format<<endl;
01154     QString format( _format );
01155 
01156     KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TEXT );
01157     QBuffer buffer;
01158     buffer.open( IO_WriteOnly );
01159     KoXmlWriter elementWriter( &buffer );  // TODO pass indentation level
01160     QString text;
01161     do
01162     {
01163         format.remove( 0,1 );
01164     }
01165     while ( format.length() > 0 );
01166     text =  _prefix ;
01167     addTextNumber(text, elementWriter );
01168 
01169     elementWriter.startElement( "number:text-style" );
01170 
01171     text =  _suffix ;
01172     addTextNumber(text, elementWriter );
01173     addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
01174     elementWriter.endElement();
01175 
01176     QString elementContents = QString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
01177     currentStyle.addChildElement( "number", elementContents );
01178     return mainStyles.lookup( currentStyle, "N" );
01179 }
01180 
01181 //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.
01182 void KoOasisStyles::addKofficeNumericStyleExtension( KoXmlWriter & elementWriter, const QString &_suffix, const QString &_prefix )
01183  {
01184      if ( !_suffix.isEmpty() )
01185      {
01186          elementWriter.startElement( "number:suffix" );
01187          elementWriter.addTextNode( _suffix );
01188          elementWriter.endElement();
01189      }
01190      if ( !_prefix.isEmpty() )
01191      {
01192          elementWriter.startElement( "number:prefix" );
01193          elementWriter.addTextNode( _prefix );
01194          elementWriter.endElement();
01195      }
01196 }
01197 
01198 void KoOasisStyles::saveOasisFillStyle( KoGenStyle &styleFill, KoGenStyles& mainStyles, const QBrush & brush )
01199 {
01200     if ( brush.style() == Qt::SolidPattern )
01201     {
01202         styleFill.addProperty( "draw:fill","solid" );
01203         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01204     }
01205     else if ( brush.style() == Qt::Dense1Pattern )
01206     {
01207         styleFill.addProperty( "draw:transparency", "94%" );
01208         styleFill.addProperty( "draw:fill","solid" );
01209         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01210     }
01211     else if ( brush.style() == Qt::Dense2Pattern )
01212     {
01213         styleFill.addProperty( "draw:transparency", "88%" );
01214         styleFill.addProperty( "draw:fill","solid" );
01215         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01216     }
01217     else if ( brush.style() == Qt::Dense3Pattern )
01218     {
01219         styleFill.addProperty( "draw:transparency", "63%" );
01220         styleFill.addProperty( "draw:fill","solid" );
01221         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01222     }
01223     else if ( brush.style() == Qt::Dense4Pattern )
01224     {
01225         styleFill.addProperty( "draw:transparency", "50%" );
01226         styleFill.addProperty( "draw:fill","solid" );
01227         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01228     }
01229     else if ( brush.style() == Qt::Dense5Pattern )
01230     {
01231         styleFill.addProperty( "draw:transparency", "37%" );
01232         styleFill.addProperty( "draw:fill","solid" );
01233         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01234     }
01235     else if ( brush.style() == Qt::Dense6Pattern )
01236     {
01237         styleFill.addProperty( "draw:transparency", "12%" );
01238         styleFill.addProperty( "draw:fill","solid" );
01239         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01240     }
01241     else if ( brush.style() == Qt::Dense7Pattern )
01242     {
01243         styleFill.addProperty( "draw:transparency", "6%" );
01244         styleFill.addProperty( "draw:fill","solid" );
01245         styleFill.addProperty( "draw:fill-color", brush.color().name() );
01246     }
01247     else //otherstyle
01248     {
01249         styleFill.addProperty( "draw:fill","hatch" );
01250         styleFill.addProperty( "draw:fill-hatch-name", saveOasisHatchStyle( mainStyles,brush ) );
01251     }
01252 
01253 }
01254 
01255 QString KoOasisStyles::saveOasisHatchStyle( KoGenStyles& mainStyles, const QBrush &brush )
01256 {
01257     KoGenStyle hatchStyle( KoGenStyle::STYLE_HATCH /*no family name*/);
01258     hatchStyle.addAttribute( "draw:color", brush.color().name() );
01259     //hatchStyle.addAttribute( "draw:distance", m_distance ); not implemented into kpresenter
01260     switch( brush.style() )
01261     {
01262     case Qt::HorPattern:
01263         hatchStyle.addAttribute( "draw:style", "single" );
01264         hatchStyle.addAttribute( "draw:rotation", 0);
01265         break;
01266     case Qt::BDiagPattern:
01267         hatchStyle.addAttribute( "draw:style", "single" );
01268         hatchStyle.addAttribute( "draw:rotation", 450);
01269         break;
01270     case Qt::VerPattern:
01271         hatchStyle.addAttribute( "draw:style", "single" );
01272         hatchStyle.addAttribute( "draw:rotation", 900);
01273         break;
01274     case Qt::FDiagPattern:
01275         hatchStyle.addAttribute( "draw:style", "single" );
01276         hatchStyle.addAttribute( "draw:rotation", 1350);
01277         break;
01278     case Qt::CrossPattern:
01279         hatchStyle.addAttribute( "draw:style", "double" );
01280         hatchStyle.addAttribute( "draw:rotation", 0);
01281         break;
01282     case Qt::DiagCrossPattern:
01283         hatchStyle.addAttribute( "draw:style", "double" );
01284         hatchStyle.addAttribute( "draw:rotation", 450);
01285         break;
01286     default:
01287         break;
01288     }
01289 
01290     return mainStyles.lookup( hatchStyle, "hatch" );
01291 }
01292 
01293 QBrush KoOasisStyles::loadOasisFillStyle( const KoStyleStack &styleStack, const QString & fill, const KoOasisStyles & oasisStyles )
01294 {
01295     QBrush tmpBrush;
01296     if ( fill == "solid" )
01297     {
01298         tmpBrush.setStyle(static_cast<Qt::BrushStyle>( 1 ) );
01299         if ( styleStack.hasAttributeNS( KoXmlNS::draw, "fill-color" ) )
01300             tmpBrush.setColor(styleStack.attributeNS( KoXmlNS::draw, "fill-color" ) );
01301         if ( styleStack.hasAttributeNS( KoXmlNS::draw, "transparency" ) )
01302         {
01303             QString transparency = styleStack.attributeNS( KoXmlNS::draw, "transparency" );
01304             if ( transparency == "94%" )
01305             {
01306                 tmpBrush.setStyle(Qt::Dense1Pattern);
01307             }
01308             else if ( transparency == "88%" )
01309             {
01310                 tmpBrush.setStyle(Qt::Dense2Pattern);
01311             }
01312             else if ( transparency == "63%" )
01313             {
01314                 tmpBrush.setStyle(Qt::Dense3Pattern);
01315 
01316             }
01317             else if ( transparency == "50%" )
01318             {
01319                 tmpBrush.setStyle(Qt::Dense4Pattern);
01320 
01321             }
01322             else if ( transparency == "37%" )
01323             {
01324                 tmpBrush.setStyle(Qt::Dense5Pattern);
01325 
01326             }
01327             else if ( transparency == "12%" )
01328             {
01329                 tmpBrush.setStyle(Qt::Dense6Pattern);
01330 
01331             }
01332             else if ( transparency == "6%" )
01333             {
01334                 tmpBrush.setStyle(Qt::Dense7Pattern);
01335 
01336             }
01337             else
01338                 kdDebug()<<" transparency is not defined into kpresenter :"<<transparency<<endl;
01339         }
01340     }
01341     else if ( fill == "hatch" )
01342     {
01343         QString style = styleStack.attributeNS( KoXmlNS::draw, "fill-hatch-name" );
01344         kdDebug()<<" hatch style is  : "<<style<<endl;
01345 
01346         //type not defined by default
01347         //try to use style.
01348         QDomElement* draw = oasisStyles.drawStyles()[style];
01349         if ( draw)
01350         {
01351             kdDebug()<<"We have a style\n";
01352             int angle = 0;
01353             if( draw->hasAttributeNS( KoXmlNS::draw, "rotation" ))
01354             {
01355                 angle = (draw->attributeNS( KoXmlNS::draw, "rotation", QString::null ).toInt())/10;
01356                 kdDebug()<<"angle :"<<angle<<endl;
01357             }
01358             if(draw->hasAttributeNS( KoXmlNS::draw, "color" ) )
01359             {
01360                 //kdDebug()<<" draw:color :"<<draw->attributeNS( KoXmlNS::draw, "color", QString::null )<<endl;
01361                 tmpBrush.setColor(draw->attributeNS( KoXmlNS::draw, "color", QString::null ) );
01362             }
01363             if( draw->hasAttributeNS( KoXmlNS::draw, "distance" ))
01364             {
01365                 //todo implemente it into kpresenter
01366             }
01367             if( draw->hasAttributeNS( KoXmlNS::draw, "display-name"))
01368             {
01369                 //todo implement it into kpresenter
01370             }
01371             if( draw->hasAttributeNS( KoXmlNS::draw, "style" ))
01372             {
01373                 //todo implemente it into kpresenter
01374                 QString styleHash = draw->attributeNS( KoXmlNS::draw, "style", QString::null );
01375                 if( styleHash == "single")
01376                 {
01377                     switch( angle )
01378                     {
01379                     case 0:
01380                     case 180:
01381                         tmpBrush.setStyle(Qt::HorPattern );
01382                         break;
01383                     case 45:
01384                     case 225:
01385                         tmpBrush.setStyle(Qt::BDiagPattern );
01386                         break;
01387                     case 90:
01388                     case 270:
01389                         tmpBrush.setStyle(Qt::VerPattern );
01390                         break;
01391                     case 135:
01392                     case 315:
01393                         tmpBrush.setStyle(Qt::FDiagPattern );
01394                         break;
01395                     default:
01396                         //todo fixme when we will have a kopaint
01397                         kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
01398                         break;
01399                     }
01400                 }
01401                 else if( styleHash == "double")
01402                 {
01403                     switch( angle )
01404                     {
01405                     case 0:
01406                     case 180:
01407                     case 90:
01408                     case 270:
01409                         tmpBrush.setStyle(Qt::CrossPattern );
01410                         break;
01411                     case 45:
01412                     case 135:
01413                     case 225:
01414                     case 315:
01415                         tmpBrush.setStyle(Qt::DiagCrossPattern );
01416                         break;
01417                     default:
01418                         //todo fixme when we will have a kopaint
01419                         kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
01420                         break;
01421                     }
01422 
01423                 }
01424                 else if( styleHash == "triple")
01425                 {
01426                     kdDebug()<<" it is not implemented :( \n";
01427                 }
01428             }
01429         }
01430     }
01431     return tmpBrush;
01432 }
01433 
01434 QDomElement* KoOasisStyles::defaultStyle( const QString& family ) const
01435 {
01436     return m_defaultStyle[family];
01437 }
KDE Logo
This file is part of the documentation for lib Library Version 1.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Feb 13 09:40:02 2006 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003