/* This file is part of the KDE project Copyright (C) 2004-2006 David Faure 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 #include #include #include "KoDom.h" #include "KoXmlNS.h" #include "KoGenStyles.h" #include #include #include #include #include class KoOasisStyles::Private { public: // The key of the map is the family TQMap > m_styles; TQMap > 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 TQDomDocument& doc, bool stylesDotXml ) { const TQDomElement docElement = doc.documentElement(); // We used to have the office:version check here, but better let the apps do that TQDomElement 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; TQDomElement 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; TQDomNode masterStyles = KoDom::namedItemNS( docElement, KoXmlNS::office, "master-styles" ); if ( !masterStyles.isNull() ) { TQDomElement master; forEachElement( master, masterStyles ) { if ( master.localName() == "master-page" && master.namespaceURI() == KoXmlNS::style ) { const TQString name = master.attributeNS( KoXmlNS::style, "name", TQString() ); kdDebug(30003) << "Master style: '" << name << "' loaded " << endl; m_masterPages.insert( name, new TQDomElement( 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 TQDomElement officeStyle = KoDom::namedItemNS( docElement, KoXmlNS::office, "styles" ); if ( !officeStyle.isNull() ) { m_officeStyle = officeStyle; insertOfficeStyles( m_officeStyle ); } //kdDebug(30003) << "Styles read in." << endl; } TQValueVector KoOasisStyles::userStyles() const { TQValueVector vec; // Collect user styles unsigned int i = 0; TQDomElement e; forEachElement( e, m_officeStyle ) { if ( e.localName() == "style" && e.namespaceURI() == KoXmlNS::style ) { vec.resize( i+1 ); vec[i++] = e; } } return vec; } const TQDict& KoOasisStyles::styles(const TQString& 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 TQDomElement& styles ) { TQDomElement e; forEachElement( e, styles ) { const TQString localName = e.localName(); const TQString 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 TQString name = e.attributeNS( KoXmlNS::draw, "name", TQString() ); Q_ASSERT( !name.isEmpty() ); TQDomElement* ep = new TQDomElement( e ); m_drawStyles.insert( name, ep ); } else insertStyle( e, false ); } } void KoOasisStyles::insertStyles( const TQDomElement& styles, bool styleAutoStyles ) { //kdDebug(30003) << "Inserting styles from " << styles.tagName() << endl; TQDomElement e; forEachElement( e, styles ) insertStyle( e, styleAutoStyles ); } void KoOasisStyles::insertStyle( const TQDomElement& e, bool styleAutoStyles ) { const TQString localName = e.localName(); const TQString ns = e.namespaceURI(); const TQString name = e.attributeNS( KoXmlNS::style, "name", TQString() ); if ( ns == KoXmlNS::style && localName == "style" ) { const TQString family = e.attributeNS( KoXmlNS::style, "family", TQString() ); if ( styleAutoStyles ) { TQDict& 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 TQDomElement( e ) ); //kdDebug(30003) << "Style: '" << name << "' loaded as a style auto style" << endl; } else { TQDict& dict = d->m_styles[ family ]; dict.setAutoDelete( true ); if ( dict.find( name ) != 0 ) kdDebug(30003) << "Style: '" << name << "' already exists" << endl; dict.insert( name, new TQDomElement( 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 TQDomElement( e ) ); } else if ( localName == "default-style" && ns == KoXmlNS::style ) { const TQString family = e.attributeNS( KoXmlNS::style, "family", TQString() ); if ( !family.isEmpty() ) m_defaultStyle.insert( family, new TQDomElement( e ) ); } else if ( localName == "list-style" && ns == KoXmlNS::text ) { m_listStyles.insert( name, new TQDomElement( 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 TQt format: see qdate.html // OpenCalcImport::loadFormat has similar code, but slower, intermixed with other stuff, // lacking long-textual forms. void KoOasisStyles::importDataStyle( const TQDomElement& parent ) { NumericStyleFormat dataStyle; const TQString 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; TQString format; int precision = -1; int leadingZ = 1; bool thousandsSep = false; //todo negred //bool negRed = false; bool ok = false; int i = 0; TQDomElement e; TQString prefix; TQString suffix; forEachElement( e, parent ) { if ( e.namespaceURI() != KoXmlNS::number ) continue; TQString localName = e.localName(); const TQString numberStyle = e.attributeNS( KoXmlNS::number, "style", TQString() ); 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", TQString() ) == "true" ) { format += shortForm ? "PPP" : "PPPP"; } // TODO the spec has a strange mention of number:format-source else if ( e.attributeNS( KoXmlNS::number, "textual", TQString() ) == "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 TQt } 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 :"<€ // 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", TQString() ).toInt( &ok ); if ( ok ) precision = d; } if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) ) { int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", TQString() ).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", TQString() ).toInt( &ok ); if ( ok ) precision = d; } if ( e.hasAttributeNS( KoXmlNS::number, "min-integer-digits" ) ) { int d = e.attributeNS( KoXmlNS::number, "min-integer-digits", TQString() ).toInt( &ok ); if ( ok ) leadingZ = d; } if ( e.hasAttributeNS( KoXmlNS::number, "min-exponent-digits" ) ) { int d = e.attributeNS( KoXmlNS::number, "min-exponent-digits", TQString() ).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", TQString() ).toInt( &ok ); if ( ok ) integer = d; } if ( e.hasAttributeNS( KoXmlNS::number, "min-numerator-digits" ) ) { int d = e.attributeNS( KoXmlNS::number, "min-numerator-digits", TQString() ).toInt( &ok ); if ( ok ) numerator = d; } if ( e.hasAttributeNS( KoXmlNS::number, "min-denominator-digits" ) ) { int d = e.attributeNS( KoXmlNS::number, "min-denominator-digits", TQString() ).toInt( &ok ); if ( ok ) denominator = d; } if ( e.hasAttributeNS( KoXmlNS::number, "denominator-value" ) ) { int d = e.attributeNS( KoXmlNS::number, "denominator-value", TQString() ).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+=TQString::number( denominatorValue ); else { for ( i = 0; i < denominator; ++i ) format+='?'; } } // Not needed: // // we handle painting negative numbers in red differently } const TQString styleName = parent.attributeNS( KoXmlNS::style, "name", TQString() ); kdDebug(30003) << "data style: " << styleName << " qt format=" << format << endl; if ( !prefix.isEmpty() ) { kdDebug(30003)<<" format.left( prefix.length() ) :"< 0 ); addTextNumber( text, elementWriter ); } bool KoOasisStyles::saveOasisKlocaleTimeFormat( KoXmlWriter &elementWriter, TQString & format, TQString & 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, TQString & format, TQString & 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; } TQString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const TQString & _format, bool klocaleFormat, const TQString & _prefix, const TQString & _suffix ) { Q_UNUSED(_prefix); Q_UNUSED(_suffix); kdDebug(30003)<<"TQString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 0 ); addTextNumber( text, elementWriter ); } TQString elementContents = TQString::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, TQString & format, TQString & text ) { kdDebug(30003)<<"KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, TQString & format, TQString & text ) :"< 0 ); addTextNumber( text, elementWriter ); } TQString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const TQString & _format, bool klocaleFormat, const TQString & _prefix, const TQString & _suffix ) { Q_UNUSED(_prefix); Q_UNUSED(_suffix); kdDebug(30003)<<"TQString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 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 ); // 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 ) ) { TQString elem( format[0] ); format = format.remove( 0, 1 ); if ( elem == "\\" ) { antislash = true; } else { text += elem; antislash = false; } } } } while ( format.length() > 0 ); addTextNumber( text, elementWriter ); } TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() ); currentStyle.addChildElement( "number", elementContents ); return mainStyles.lookup( currentStyle, "N" ); } TQString KoOasisStyles::saveOasisFractionStyle( KoGenStyles &mainStyles, const TQString & _format, const TQString &_prefix, const TQString &_suffix ) { kdDebug(30003)<<"TQString saveOasisFractionStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 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 ); TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() ); currentStyle.addChildElement( "number", elementContents ); return mainStyles.lookup( currentStyle, "N" ); } TQString KoOasisStyles::saveOasisNumberStyle( KoGenStyles &mainStyles, const TQString & _format, const TQString &_prefix, const TQString &_suffix ) { kdDebug(30003)<<"TQString saveOasisNumberStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 0 ); text= _prefix ; addTextNumber(text, elementWriter ); elementWriter.startElement( "number:number" ); kdDebug(30003)<<" decimalplaces :"< // //% // kdDebug(30003)<<"TQString saveOasisPercentageStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 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(TQString( "%" ), elementWriter ); text =_suffix ; addTextNumber(text, elementWriter ); addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix ); TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() ); currentStyle.addChildElement( "number", elementContents ); return mainStyles.lookup( currentStyle, "N" ); } TQString KoOasisStyles::saveOasisScientificStyle( KoGenStyles &mainStyles, const TQString & _format, const TQString &_prefix, const TQString &_suffix ) { // // // //example 000,000e+0000 kdDebug(30003)<<"TQString saveOasisScientificStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 0 ); text = _prefix ; addTextNumber(text, elementWriter ); elementWriter.startElement( "number:scientific-number" ); kdDebug(30003)<<" decimalplace :"< // // //VEB // kdDebug(30003)<<"TQString saveOasisCurrencyStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 0 ); text = _prefix ; addTextNumber(text, elementWriter ); elementWriter.startElement( "number:number" ); kdDebug(30003)<<" decimalplaces :"< // /// kdDebug(30003)<<"TQString saveOasisTextStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format< 0 ); text = _prefix ; addTextNumber(text, elementWriter ); elementWriter.startElement( "number:text-style" ); text = _suffix ; addTextNumber(text, elementWriter ); addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix ); elementWriter.endElement(); TQString elementContents = TQString::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 TQString &_suffix, const TQString &_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 TQBrush & brush ) { if ( brush.style() == TQt::SolidPattern ) { styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense1Pattern ) { styleFill.addProperty( "draw:transparency", "94%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense2Pattern ) { styleFill.addProperty( "draw:transparency", "88%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense3Pattern ) { styleFill.addProperty( "draw:transparency", "63%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense4Pattern ) { styleFill.addProperty( "draw:transparency", "50%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense5Pattern ) { styleFill.addProperty( "draw:transparency", "37%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::Dense6Pattern ) { styleFill.addProperty( "draw:transparency", "12%" ); styleFill.addProperty( "draw:fill","solid" ); styleFill.addProperty( "draw:fill-color", brush.color().name() ); } else if ( brush.style() == TQt::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 ) ); } } TQString KoOasisStyles::saveOasisHatchStyle( KoGenStyles& mainStyles, const TQBrush &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 TQt::HorPattern: hatchStyle.addAttribute( "draw:style", "single" ); hatchStyle.addAttribute( "draw:rotation", 0); break; case TQt::BDiagPattern: hatchStyle.addAttribute( "draw:style", "single" ); hatchStyle.addAttribute( "draw:rotation", 450); break; case TQt::VerPattern: hatchStyle.addAttribute( "draw:style", "single" ); hatchStyle.addAttribute( "draw:rotation", 900); break; case TQt::FDiagPattern: hatchStyle.addAttribute( "draw:style", "single" ); hatchStyle.addAttribute( "draw:rotation", 1350); break; case TQt::CrossPattern: hatchStyle.addAttribute( "draw:style", "double" ); hatchStyle.addAttribute( "draw:rotation", 0); break; case TQt::DiagCrossPattern: hatchStyle.addAttribute( "draw:style", "double" ); hatchStyle.addAttribute( "draw:rotation", 450); break; default: break; } return mainStyles.lookup( hatchStyle, "hatch" ); } TQBrush KoOasisStyles::loadOasisFillStyle( const KoStyleStack &styleStack, const TQString & fill, const KoOasisStyles & oasisStyles ) { TQBrush tmpBrush; if ( fill == "solid" ) { tmpBrush.setStyle(static_cast( 1 ) ); if ( styleStack.hasAttributeNS( KoXmlNS::draw, "fill-color" ) ) tmpBrush.setColor(styleStack.attributeNS( KoXmlNS::draw, "fill-color" ) ); if ( styleStack.hasAttributeNS( KoXmlNS::draw, "transparency" ) ) { TQString transparency = styleStack.attributeNS( KoXmlNS::draw, "transparency" ); if ( transparency == "94%" ) { tmpBrush.setStyle(TQt::Dense1Pattern); } else if ( transparency == "88%" ) { tmpBrush.setStyle(TQt::Dense2Pattern); } else if ( transparency == "63%" ) { tmpBrush.setStyle(TQt::Dense3Pattern); } else if ( transparency == "50%" ) { tmpBrush.setStyle(TQt::Dense4Pattern); } else if ( transparency == "37%" ) { tmpBrush.setStyle(TQt::Dense5Pattern); } else if ( transparency == "12%" ) { tmpBrush.setStyle(TQt::Dense6Pattern); } else if ( transparency == "6%" ) { tmpBrush.setStyle(TQt::Dense7Pattern); } else kdDebug()<<" transparency is not defined into kpresenter :"<hasAttributeNS( KoXmlNS::draw, "rotation" )) { angle = (draw->attributeNS( KoXmlNS::draw, "rotation", TQString() ).toInt())/10; kdDebug()<<"angle :"<hasAttributeNS( KoXmlNS::draw, "color" ) ) { //kdDebug()<<" draw:color :"<attributeNS( KoXmlNS::draw, "color", TQString() )<attributeNS( KoXmlNS::draw, "color", TQString() ) ); } 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 TQString styleHash = draw->attributeNS( KoXmlNS::draw, "style", TQString() ); if( styleHash == "single") { switch( angle ) { case 0: case 180: tmpBrush.setStyle(TQt::HorPattern ); break; case 45: case 225: tmpBrush.setStyle(TQt::BDiagPattern ); break; case 90: case 270: tmpBrush.setStyle(TQt::VerPattern ); break; case 135: case 315: tmpBrush.setStyle(TQt::FDiagPattern ); break; default: //todo fixme when we will have a kopaint kdDebug()<<" draw:rotation 'angle' : "<m_styles[ family ][ styleName ]; if ( style && !family.isEmpty() ) { const TQString styleFamily = style->attributeNS( KoXmlNS::style, "family", TQString() ); if ( styleFamily != family ) { kdWarning() << "KoOasisStyles: was looking for style " << styleName << " in family " << family << " but got " << styleFamily << endl; } } return style; } const TQDomElement* KoOasisStyles::findStyleAutoStyle( const TQString& styleName, const TQString& family ) const { const TQDomElement* style = d->m_stylesAutoStyles[ family ][ styleName ]; if ( style ) { const TQString styleFamily = style->attributeNS( KoXmlNS::style, "family", TQString() ); if ( styleFamily != family ) { kdWarning() << "KoOasisStyles: was looking for style " << styleName << " in family " << family << " but got " << styleFamily << endl; } } return style; }