19#include "KoOasisStyles.h"
20#include <KoXmlWriter.h>
25#include "KoGenStyles.h"
30#include <KoStyleStack.h>
32class KoOasisStyles::Private
36 TQMap<TQString, TQDict<TQDomElement> > m_styles;
37 TQMap<TQString, TQDict<TQDomElement> > m_stylesAutoStyles;
40KoOasisStyles::KoOasisStyles()
43 m_defaultStyle.setAutoDelete(
true );
44 m_masterPages.setAutoDelete(
true );
45 m_listStyles.setAutoDelete(
true );
46 m_drawStyles.setAutoDelete(
true );
49KoOasisStyles::~KoOasisStyles()
56 const TQDomElement docElement = doc.documentElement();
58 TQDomElement fontStyles =
KoDom::namedItemNS( docElement, KoXmlNS::office,
"font-decls" );
60 if ( !fontStyles.isNull() ) {
62 insertStyles( fontStyles,
false );
68 TQDomElement autoStyles =
KoDom::namedItemNS( docElement, KoXmlNS::office,
"automatic-styles" );
69 if ( !autoStyles.isNull() ) {
70 insertStyles( autoStyles, stylesDotXml );
77 TQDomNode masterStyles =
KoDom::namedItemNS( docElement, KoXmlNS::office,
"master-styles" );
79 if ( !masterStyles.isNull() ) {
81 forEachElement( master, masterStyles )
83 if ( master.localName() ==
"master-page" &&
84 master.namespaceURI() == KoXmlNS::style ) {
85 const TQString name = master.attributeNS( KoXmlNS::style,
"name", TQString() );
86 kdDebug(30003) <<
"Master style: '" << name <<
"' loaded " << endl;
87 m_masterPages.insert( name,
new TQDomElement( master ) );
90 kdWarning(30003) <<
"Unknown tag " << master.tagName() <<
" in office:master-styles" << endl;
95 kdDebug(30003) <<
"Starting reading in office:styles" << endl;
101 insertOfficeStyles( m_officeStyle );
110 TQValueVector<TQDomElement> vec;
114 forEachElement( e, m_officeStyle )
116 if ( e.localName() ==
"style" &&
117 e.namespaceURI() == KoXmlNS::style )
130 return d->m_styles[family];
133void KoOasisStyles::insertOfficeStyles(
const TQDomElement& styles )
136 forEachElement( e,
styles )
138 const TQString localName = e.localName();
139 const TQString ns = e.namespaceURI();
140 if ( ( ns == KoXmlNS::svg && (
141 localName ==
"linearGradient"
142 || localName ==
"radialGradient" ) )
143 || ( ns == KoXmlNS::draw && (
144 localName ==
"gradient"
145 || localName ==
"hatch"
146 || localName ==
"fill-image"
147 || localName ==
"marker"
148 || localName ==
"stroke-dash"
149 || localName ==
"opacity" ) )
152 const TQString name = e.attributeNS( KoXmlNS::draw,
"name", TQString() );
153 Q_ASSERT( !name.isEmpty() );
154 TQDomElement* ep =
new TQDomElement( e );
155 m_drawStyles.insert( name, ep );
158 insertStyle( e,
false );
163void KoOasisStyles::insertStyles(
const TQDomElement& styles,
bool styleAutoStyles )
167 forEachElement( e,
styles )
168 insertStyle( e, styleAutoStyles );
171void KoOasisStyles::insertStyle(
const TQDomElement& e,
bool styleAutoStyles )
173 const TQString localName = e.localName();
174 const TQString ns = e.namespaceURI();
176 const TQString
name = e.attributeNS( KoXmlNS::style,
"name", TQString() );
177 if ( ns == KoXmlNS::style && localName ==
"style" ) {
178 const TQString family = e.attributeNS( KoXmlNS::style,
"family", TQString() );
180 if ( styleAutoStyles ) {
181 TQDict<TQDomElement>& dict = d->m_stylesAutoStyles[ family ];
182 dict.setAutoDelete(
true );
183 if ( dict.find( name ) != 0 )
184 kdDebug(30003) <<
"Auto-style: '" <<
name <<
"' already exists" << endl;
185 dict.insert( name,
new TQDomElement( e ) );
188 TQDict<TQDomElement>& dict = d->m_styles[ family ];
189 dict.setAutoDelete(
true );
191 if ( dict.find( name ) != 0 )
192 kdDebug(30003) <<
"Style: '" <<
name <<
"' already exists" << endl;
193 dict.insert( name,
new TQDomElement( e ) );
196 }
else if ( ns == KoXmlNS::style && (
197 localName ==
"page-layout"
198 || localName ==
"font-decl"
199 || localName ==
"presentation-page-layout" ) )
201 if ( m_styles.find( name ) != 0 )
202 kdDebug(30003) <<
"Style: '" <<
name <<
"' already exists" << endl;
203 m_styles.insert( name,
new TQDomElement( e ) );
204 }
else if ( localName ==
"default-style" && ns == KoXmlNS::style ) {
205 const TQString family = e.attributeNS( KoXmlNS::style,
"family", TQString() );
206 if ( !family.isEmpty() )
207 m_defaultStyle.insert( family,
new TQDomElement( e ) );
208 }
else if ( localName ==
"list-style" && ns == KoXmlNS::text ) {
209 m_listStyles.insert( name,
new TQDomElement( e ) );
211 }
else if ( ns == KoXmlNS::number && (
212 localName ==
"number-style"
213 || localName ==
"currency-style"
214 || localName ==
"percentage-style"
215 || localName ==
"boolean-style"
216 || localName ==
"text-style"
217 || localName ==
"date-style"
218 || localName ==
"time-style" ) ) {
219 importDataStyle( e );
227void KoOasisStyles::importDataStyle(
const TQDomElement& parent )
231 const TQString localName = parent.localName();
232 if (localName ==
"number-style")
233 dataStyle.type = NumericStyleFormat::Number;
234 else if (localName ==
"currency-style")
235 dataStyle.type = NumericStyleFormat::Currency;
236 else if (localName ==
"percentage-style")
237 dataStyle.type = NumericStyleFormat::Percentage;
238 else if (localName ==
"boolean-style")
239 dataStyle.type = NumericStyleFormat::Boolean;
240 else if (localName ==
"text-style")
241 dataStyle.type = NumericStyleFormat::Text;
242 else if (localName ==
"date-style")
243 dataStyle.type = NumericStyleFormat::Date;
244 else if (localName ==
"time-style")
245 dataStyle.type = NumericStyleFormat::Time;
250 bool thousandsSep =
false;
258 forEachElement( e, parent )
260 if ( e.namespaceURI() != KoXmlNS::number )
262 TQString localName = e.localName();
263 const TQString numberStyle = e.attributeNS( KoXmlNS::number,
"style", TQString() );
264 const bool shortForm = numberStyle ==
"short" || numberStyle.isEmpty();
265 if ( localName ==
"day" ) {
266 format += shortForm ?
"d" :
"dd";
267 }
else if ( localName ==
"day-of-week" ) {
268 format += shortForm ?
"ddd" :
"dddd";
269 }
else if ( localName ==
"month" ) {
270 if ( e.attributeNS( KoXmlNS::number,
"possessive-form", TQString() ) ==
"true" ) {
271 format += shortForm ?
"PPP" :
"PPPP";
274 else if ( e.attributeNS( KoXmlNS::number,
"textual", TQString() ) ==
"true" ) {
275 format += shortForm ?
"MMM" :
"MMMM";
277 format += shortForm ?
"M" :
"MM";
279 }
else if ( localName ==
"year" ) {
280 format += shortForm ?
"yy" :
"yyyy";
281 }
else if ( localName ==
"era" ) {
283 }
else if ( localName ==
"week-of-year" || localName ==
"quarter") {
285 }
else if ( localName ==
"hours" ) {
286 format += shortForm ?
"h" :
"hh";
287 }
else if ( localName ==
"minutes" ) {
288 format += shortForm ?
"m" :
"mm";
289 }
else if ( localName ==
"seconds" ) {
290 format += shortForm ?
"s" :
"ss";
291 }
else if ( localName ==
"am-pm" ) {
293 }
else if ( localName ==
"text" ) {
295 }
else if ( localName ==
"suffix" ) {
297 kdDebug()<<
" suffix :"<<suffix<<endl;
298 }
else if ( localName ==
"prefix" ) {
300 kdDebug()<<
" prefix :"<<prefix<<endl;
301 }
else if ( localName ==
"currency-symbol" ) {
302 dataStyle.currencySymbol = e.text();
303 kdDebug()<<
" currency-symbol: "<<dataStyle.currencySymbol<<endl;
308 }
else if ( localName ==
"number" ) {
310 if ( e.hasAttributeNS( KoXmlNS::number,
"decimal-places" ) )
312 int d = e.attributeNS( KoXmlNS::number,
"decimal-places", TQString() ).toInt( &ok );
316 if ( e.hasAttributeNS( KoXmlNS::number,
"min-integer-digits" ) )
318 int d = e.attributeNS( KoXmlNS::number,
"min-integer-digits", TQString() ).toInt( &ok );
322 if ( thousandsSep && leadingZ <= 3 )
325 for ( i = leadingZ; i <= 3; ++i )
328 for ( i = 1; i <= leadingZ; ++i )
331 if ( ( i % 3 == 0 ) && thousandsSep )
337 for ( i = 0; i < precision; ++i )
341 else if ( localName ==
"scientific-number" ) {
342 if (dataStyle.type == NumericStyleFormat::Number)
343 dataStyle.type = NumericStyleFormat::Scientific;
346 if ( e.hasAttributeNS( KoXmlNS::number,
"decimal-places" ) )
348 int d = e.attributeNS( KoXmlNS::number,
"decimal-places", TQString() ).toInt( &ok );
353 if ( e.hasAttributeNS( KoXmlNS::number,
"min-integer-digits" ) )
355 int d = e.attributeNS( KoXmlNS::number,
"min-integer-digits", TQString() ).toInt( &ok );
360 if ( e.hasAttributeNS( KoXmlNS::number,
"min-exponent-digits" ) )
362 int d = e.attributeNS( KoXmlNS::number,
"min-exponent-digits", TQString() ).toInt( &ok );
369 if ( thousandsSep && leadingZ <= 3 )
372 for ( i = leadingZ; i <= 3; ++i )
376 for ( i = 1; i <= leadingZ; ++i )
379 if ( ( i % 3 == 0 ) && thousandsSep )
386 for ( i = 0; i < precision; ++i )
391 for ( i = 0; i < exp; ++i )
393 }
else if ( localName ==
"fraction" ) {
394 if (dataStyle.type == NumericStyleFormat::Number)
395 dataStyle.type = NumericStyleFormat::Fraction;
399 int denominatorValue=0;
400 if ( e.hasAttributeNS( KoXmlNS::number,
"min-integer-digits" ) )
402 int d = e.attributeNS( KoXmlNS::number,
"min-integer-digits", TQString() ).toInt( &ok );
406 if ( e.hasAttributeNS( KoXmlNS::number,
"min-numerator-digits" ) )
408 int d = e.attributeNS( KoXmlNS::number,
"min-numerator-digits", TQString() ).toInt( &ok );
412 if ( e.hasAttributeNS( KoXmlNS::number,
"min-denominator-digits" ) )
414 int d = e.attributeNS( KoXmlNS::number,
"min-denominator-digits", TQString() ).toInt( &ok );
418 if ( e.hasAttributeNS( KoXmlNS::number,
"denominator-value" ) )
420 int d = e.attributeNS( KoXmlNS::number,
"denominator-value", TQString() ).toInt( &ok );
422 denominatorValue = d;
425 for ( i = 0; i < integer; ++i )
430 for ( i = 0; i < numerator; ++i )
435 if ( denominatorValue != 0 )
436 format+=TQString::number( denominatorValue );
439 for ( i = 0; i < denominator; ++i )
449 const TQString styleName = parent.attributeNS( KoXmlNS::style,
"name", TQString() );
450 kdDebug(30003) <<
"data style: " << styleName <<
" qt format=" << format << endl;
451 if ( !prefix.isEmpty() )
453 kdDebug(30003)<<
" format.left( prefix.length() ) :"<<format.left( prefix.length() )<<
" prefix :"<<prefix<<endl;
454 if ( format.left( prefix.length() )==prefix )
456 format = format.right( format.length()-prefix.length() );
461 if ( !suffix.isEmpty() )
463 kdDebug(30003)<<
"format.right( suffix.length() ) :"<<format.right( suffix.length() )<<
" suffix :"<<suffix<<endl;
464 if ( format.right( suffix.length() )==suffix )
466 format = format.left( format.length()-suffix.length() );
472 dataStyle.formatStr = format;
473 dataStyle.prefix = prefix;
474 dataStyle.suffix = suffix;
475 dataStyle.precision = precision;
476 kdDebug()<<
" finish insert format :"<<format<<
" prefix :"<<prefix<<
" suffix :"<<suffix<<endl;
477 m_dataFormats.insert( styleName, dataStyle );
480#define addTextNumber( text, elementWriter ) { \
481 if ( !text.isEmpty() ) \
483 elementWriter.startElement( "number:text" ); \
484 elementWriter.addTextNode( text ); \
485 elementWriter.endElement(); \
490void KoOasisStyles::parseOasisTimeKlocale(
KoXmlWriter &elementWriter, TQString & format, TQString & text )
492 kdDebug(30003)<<
"parseOasisTimeKlocale(KoXmlWriter &elementWriter, TQString & format, TQString & text ) :"<<format<<endl;
495 if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
498 format = format.remove( 0, 1 );
501 while ( format.length() > 0 );
502 addTextNumber( text, elementWriter );
505bool KoOasisStyles::saveOasisKlocaleTimeFormat(
KoXmlWriter &elementWriter, TQString & format, TQString & text )
507 bool changed =
false;
508 if ( format.startsWith(
"%H" ) )
511 addTextNumber( text, elementWriter );
516 format = format.remove( 0, 2 );
519 else if ( format.startsWith(
"%k" ) )
521 addTextNumber( text, elementWriter );
526 format = format.remove( 0, 2 );
529 else if ( format.startsWith(
"%I" ) )
534 else if ( format.startsWith(
"%l" ) )
539 else if ( format.startsWith(
"%M" ) )
541 addTextNumber( text, elementWriter );
546 format = format.remove( 0, 2 );
550 else if ( format.startsWith(
"%S" ) )
552 addTextNumber( text, elementWriter );
557 format = format.remove( 0, 2 );
560 else if ( format.startsWith(
"%p" ) )
563 addTextNumber( text, elementWriter );
567 format = format.remove( 0, 2 );
574bool KoOasisStyles::saveOasisTimeFormat(
KoXmlWriter &elementWriter, TQString & format, TQString & text,
bool &antislash )
576 bool changed =
false;
581 format = format.remove( 0, 1 );
585 else if ( format.startsWith(
"hh" ) )
587 addTextNumber( text, elementWriter );
592 format = format.remove( 0, 2 );
595 else if ( format.startsWith(
"h" ) )
597 addTextNumber( text, elementWriter );
602 format = format.remove( 0, 1 );
605 else if ( format.startsWith(
"mm" ) )
607 addTextNumber( text, elementWriter );
612 format = format.remove( 0, 2 );
615 else if ( format.startsWith(
"m" ) )
617 addTextNumber( text, elementWriter );
622 format = format.remove( 0, 1 );
625 else if ( format.startsWith(
"ss" ) )
627 addTextNumber( text, elementWriter );
632 format = format.remove( 0, 2 );
635 else if ( format.startsWith(
"s" ) )
637 addTextNumber( text, elementWriter );
642 format = format.remove( 0, 1 );
645 else if ( format.startsWith(
"ap" ) )
647 addTextNumber( text, elementWriter );
651 format = format.remove( 0, 2 );
657TQString KoOasisStyles::saveOasisTimeStyle(
KoGenStyles &mainStyles,
const TQString & _format,
bool klocaleFormat,
658 const TQString & _prefix,
const TQString & _suffix )
662 kdDebug(30003)<<
"TQString KoOasisStyles::saveOasisTimeStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
663 TQString format( _format );
664 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TIME );
666 buffer.open( IO_WriteOnly );
667 KoXmlWriter elementWriter( &buffer );
671 parseOasisTimeKlocale( elementWriter, format, text );
675 bool antislash =
false;
678 if ( !saveOasisTimeFormat( elementWriter, format, text, antislash ) )
680 TQString elem( format[0] );
681 format = format.remove( 0, 1 );
693 while ( format.length() > 0 );
694 addTextNumber( text, elementWriter );
696 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
697 currentStyle.addChildElement(
"number", elementContents );
698 return mainStyles.
lookup( currentStyle,
"N" );
702void KoOasisStyles::parseOasisDateKlocale(
KoXmlWriter &elementWriter, TQString & format, TQString & text )
704 kdDebug(30003)<<
"KoOasisStyles::parseOasisDateKlocale(KoXmlWriter &elementWriter, TQString & format, TQString & text ) :"<<format<<endl;
707 if ( format.startsWith(
"%Y" ) )
709 addTextNumber( text, elementWriter );
713 format = format.remove( 0, 2 );
715 else if ( format.startsWith(
"%y" ) )
718 addTextNumber( text, elementWriter );
723 format = format.remove( 0, 2 );
725 else if ( format.startsWith(
"%n" ) )
727 addTextNumber( text, elementWriter );
732 format = format.remove( 0, 2 );
734 else if ( format.startsWith(
"%m" ) )
736 addTextNumber( text, elementWriter );
741 format = format.remove( 0, 2 );
743 else if ( format.startsWith(
"%e" ) )
745 addTextNumber( text, elementWriter );
750 format = format.remove( 0, 2 );
752 else if ( format.startsWith(
"%d" ) )
754 addTextNumber( text, elementWriter );
759 format = format.remove( 0, 2 );
761 else if ( format.startsWith(
"%b" ) )
763 addTextNumber( text, elementWriter );
768 format = format.remove( 0, 2 );
770 else if ( format.startsWith(
"%B" ) )
772 addTextNumber( text, elementWriter );
777 format = format.remove( 0, 2 );
779 else if ( format.startsWith(
"%a" ) )
781 addTextNumber( text, elementWriter );
786 format = format.remove( 0, 2 );
788 else if ( format.startsWith(
"%A" ) )
790 addTextNumber( text, elementWriter );
794 format = format.remove( 0, 2 );
798 if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
801 format = format.remove( 0, 1 );
805 while ( format.length() > 0 );
806 addTextNumber( text, elementWriter );
809TQString KoOasisStyles::saveOasisDateStyle(
KoGenStyles &mainStyles,
const TQString & _format,
bool klocaleFormat,
810 const TQString & _prefix,
const TQString & _suffix )
814 kdDebug(30003)<<
"TQString KoOasisStyles::saveOasisDateStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
815 TQString format( _format );
819 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_DATE );
821 buffer.open( IO_WriteOnly );
822 KoXmlWriter elementWriter( &buffer );
826 parseOasisDateKlocale( elementWriter, format, text );
830 bool antislash =
false;
836 format = format.remove( 0, 1 );
839 else if ( format.startsWith(
"MMMMM" ) )
841 addTextNumber( text, elementWriter );
845 format = format.remove( 0, 5 );
847 else if ( format.startsWith(
"MMMM" ) )
849 addTextNumber( text, elementWriter );
854 format = format.remove( 0, 4 );
856 else if ( format.startsWith(
"MMM" ) )
858 addTextNumber( text, elementWriter );
863 format = format.remove( 0, 3 );
865 else if ( format.startsWith(
"MM" ) )
867 addTextNumber( text, elementWriter );
872 format = format.remove( 0, 2 );
874 else if ( format.startsWith(
"M" ) )
876 addTextNumber( text, elementWriter );
881 format = format.remove( 0, 1 );
883 else if ( format.startsWith(
"PPPP" ) )
885 addTextNumber( text, elementWriter );
890 elementWriter.
addAttribute(
"number:possessive-form",
"true" );
892 format = format.remove( 0, 4 );
894 else if ( format.startsWith(
"PPP" ) )
896 addTextNumber( text, elementWriter );
899 elementWriter.
addAttribute(
"number:possessive-form",
"true" );
904 format = format.remove( 0, 3 );
906 else if ( format.startsWith(
"dddd" ) )
908 addTextNumber( text, elementWriter );
913 format = format.remove( 0, 4 );
915 else if ( format.startsWith(
"ddd" ) )
917 addTextNumber( text, elementWriter );
922 format = format.remove( 0, 3 );
924 else if ( format.startsWith(
"dd" ) )
926 addTextNumber( text, elementWriter );
931 format = format.remove( 0, 2 );
933 else if ( format.startsWith(
"d" ) )
935 addTextNumber( text, elementWriter );
940 format = format.remove( 0, 1 );
942 else if ( format.startsWith(
"yyyy" ) )
944 addTextNumber( text, elementWriter );
949 format = format.remove( 0, 4 );
951 else if ( format.startsWith(
"yy" ) )
953 addTextNumber( text, elementWriter );
958 format = format.remove( 0, 2 );
962 if ( !saveOasisTimeFormat( elementWriter, format, text,antislash ) )
964 TQString elem( format[0] );
965 format = format.remove( 0, 1 );
978 while ( format.length() > 0 );
979 addTextNumber( text, elementWriter );
982 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
983 currentStyle.addChildElement(
"number", elementContents );
984 return mainStyles.
lookup( currentStyle,
"N" );
988TQString KoOasisStyles::saveOasisFractionStyle(
KoGenStyles &mainStyles,
const TQString & _format,
const TQString &_prefix,
const TQString &_suffix )
990 kdDebug(30003)<<
"TQString saveOasisFractionStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
991 TQString format( _format );
993 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_FRACTION );
995 buffer.open( IO_WriteOnly );
996 KoXmlWriter elementWriter( &buffer );
1000 int denominator = 0;
1001 int denominatorValue = 0;
1002 bool beforeSlash =
true;
1005 if ( format[0]==
'#' )
1007 else if ( format[0]==
'/' )
1008 beforeSlash =
false;
1009 else if ( format[0]==
'?' )
1019 int value = format.toInt( &ok );
1022 denominatorValue=value;
1026 format.remove( 0,1 );
1028 while ( format.length() > 0 );
1031 addTextNumber(text, elementWriter );
1034 elementWriter.
addAttribute(
"number:min-integer-digits", integer );
1035 elementWriter.
addAttribute(
"number:min-numerator-digits",numerator );
1036 elementWriter.
addAttribute(
"number:min-denominator-digits",denominator );
1037 if ( denominatorValue != 0 )
1038 elementWriter.
addAttribute(
"number:denominator-value",denominatorValue );
1041 addKofficeNumericStyleExtension( elementWriter, _suffix, _prefix );
1044 addTextNumber(text, elementWriter );
1046 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1047 currentStyle.addChildElement(
"number", elementContents );
1048 return mainStyles.
lookup( currentStyle,
"N" );
1052TQString KoOasisStyles::saveOasisNumberStyle(
KoGenStyles &mainStyles,
const TQString & _format,
const TQString &_prefix,
const TQString &_suffix )
1054 kdDebug(30003)<<
"TQString saveOasisNumberStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
1055 TQString format( _format );
1057 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_NUMBER );
1059 buffer.open( IO_WriteOnly );
1060 KoXmlWriter elementWriter( &buffer );
1062 int decimalplaces = 0;
1063 int integerdigits = 0;
1064 bool beforeSeparator =
true;
1067 if ( format[0]==
'.' || format[0]==
',' )
1068 beforeSeparator =
false;
1069 else if ( format[0]==
'0' && beforeSeparator )
1071 else if ( format[0]==
'0' && !beforeSeparator )
1074 kdDebug(30003)<<
" error format 0 \n";
1075 format.remove( 0,1 );
1077 while ( format.length() > 0 );
1079 addTextNumber(text, elementWriter );
1081 kdDebug(30003)<<
" decimalplaces :"<<decimalplaces<<
" integerdigits :"<<integerdigits<<endl;
1082 if (!beforeSeparator)
1083 elementWriter.
addAttribute(
"number:decimal-places", decimalplaces );
1084 elementWriter.
addAttribute(
"number:min-integer-digits", integerdigits );
1088 addTextNumber(text, elementWriter );
1089 addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
1091 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1092 currentStyle.addChildElement(
"number", elementContents );
1093 return mainStyles.
lookup( currentStyle,
"N" );
1096TQString KoOasisStyles::saveOasisPercentageStyle(
KoGenStyles &mainStyles,
const TQString & _format,
const TQString &_prefix,
const TQString &_suffix )
1103 kdDebug(30003)<<
"TQString saveOasisPercentageStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
1104 TQString format( _format );
1106 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_PERCENTAGE );
1108 buffer.open( IO_WriteOnly );
1109 KoXmlWriter elementWriter( &buffer );
1111 int decimalplaces = 0;
1112 int integerdigits = 0;
1113 bool beforeSeparator =
true;
1116 if ( format[0]==
'.' || format[0]==
',' )
1117 beforeSeparator =
false;
1118 else if ( format[0]==
'0' && beforeSeparator )
1120 else if ( format[0]==
'0' && !beforeSeparator )
1123 kdDebug(30003)<<
" error format 0 \n";
1124 format.remove( 0,1 );
1126 while ( format.length() > 0 );
1128 addTextNumber(text, elementWriter );
1130 if (!beforeSeparator)
1131 elementWriter.
addAttribute(
"number:decimal-places", decimalplaces );
1132 elementWriter.
addAttribute(
"number:min-integer-digits", integerdigits );
1135 addTextNumber(TQString(
"%" ), elementWriter );
1138 addTextNumber(text, elementWriter );
1139 addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
1141 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1142 currentStyle.addChildElement(
"number", elementContents );
1143 return mainStyles.
lookup( currentStyle,
"N" );
1147TQString KoOasisStyles::saveOasisScientificStyle(
KoGenStyles &mainStyles,
const TQString & _format,
const TQString &_prefix,
const TQString &_suffix )
1154 kdDebug(30003)<<
"TQString saveOasisScientificStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
1155 TQString format( _format );
1157 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_SCIENTIFIC );
1159 buffer.open( IO_WriteOnly );
1160 int decimalplace = 0;
1161 int integerdigits = 0;
1162 int exponentdigits = 0;
1163 KoXmlWriter elementWriter( &buffer );
1165 bool beforeSeparator =
true;
1166 bool exponential =
false;
1167 bool positive =
true;
1172 if ( format[0]==
'0' && beforeSeparator )
1174 else if ( format[0]==
',' || format[0]==
'.' )
1175 beforeSeparator =
false;
1176 else if ( format[0]==
'0' && !beforeSeparator )
1178 else if ( format[0].lower()==
'e' )
1180 format.remove( 0, 1 );
1181 if ( format[0]==
'+' )
1183 else if ( format[0]==
'-' )
1186 kdDebug(30003)<<
"Error into scientific number\n";
1192 if ( format[0]==
'0' && positive )
1194 else if ( format[0]==
'0' && !positive )
1197 kdDebug(30003)<<
" error into scientific number exponential value\n";
1199 format.remove( 0,1 );
1201 while ( format.length() > 0 );
1203 addTextNumber(text, elementWriter );
1205 elementWriter.
startElement(
"number:scientific-number" );
1206 kdDebug(30003)<<
" decimalplace :"<<decimalplace<<
" integerdigits :"<<integerdigits<<
" exponentdigits :"<<exponentdigits<<endl;
1207 if (!beforeSeparator)
1208 elementWriter.
addAttribute(
"number:decimal-places", decimalplace );
1209 elementWriter.
addAttribute(
"number:min-integer-digits",integerdigits );
1210 elementWriter.
addAttribute(
"number:min-exponent-digits",exponentdigits );
1214 addTextNumber(text, elementWriter );
1215 addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
1217 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1218 currentStyle.addChildElement(
"number", elementContents );
1219 return mainStyles.
lookup( currentStyle,
"N" );
1222TQString KoOasisStyles::saveOasisCurrencyStyle(
KoGenStyles &mainStyles,
1223 const TQString & _format,
const TQString &symbol,
1224 const TQString &_prefix,
const TQString &_suffix )
1233 kdDebug(30003)<<
"TQString saveOasisCurrencyStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
1234 TQString format( _format );
1236 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_CURRENCY );
1238 buffer.open( IO_WriteOnly );
1239 KoXmlWriter elementWriter( &buffer );
1241 int decimalplaces = 0;
1242 int integerdigits = 0;
1243 bool beforeSeparator =
true;
1246 if ( format[0]==
'.' || format[0]==
',' )
1247 beforeSeparator =
false;
1248 else if ( format[0]==
'0' && beforeSeparator )
1250 else if ( format[0]==
'0' && !beforeSeparator )
1253 kdDebug(30003)<<
" error format 0 \n";
1254 format.remove( 0,1 );
1256 while ( format.length() > 0 );
1259 addTextNumber(text, elementWriter );
1262 kdDebug(30003)<<
" decimalplaces :"<<decimalplaces<<
" integerdigits :"<<integerdigits<<endl;
1263 if (!beforeSeparator)
1264 elementWriter.
addAttribute(
"number:decimal-places", decimalplaces );
1265 elementWriter.
addAttribute(
"number:min-integer-digits", integerdigits );
1269 addTextNumber(text, elementWriter );
1270 addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
1272 elementWriter.
startElement(
"number:currency-symbol" );
1273 kdDebug(30003) <<
" currency-symbol: " << symbol << endl;
1277 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1278 currentStyle.addChildElement(
"number", elementContents );
1279 return mainStyles.
lookup( currentStyle,
"N" );
1289 kdDebug(30003)<<
"TQString saveOasisTextStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
1290 TQString format( _format );
1292 KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TEXT );
1294 buffer.open( IO_WriteOnly );
1299 format.remove( 0,1 );
1301 while ( format.length() > 0 );
1303 addTextNumber(text, elementWriter );
1308 addTextNumber(text, elementWriter );
1309 addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
1312 TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
1314 return mainStyles.
lookup( currentStyle,
"N" );
1318void KoOasisStyles::addKofficeNumericStyleExtension(
KoXmlWriter & elementWriter,
const TQString &_suffix,
const TQString &_prefix )
1320 if ( !_suffix.isEmpty() )
1326 if ( !_prefix.isEmpty() )
1334void KoOasisStyles::saveOasisFillStyle(
KoGenStyle &styleFill,
KoGenStyles& mainStyles,
const TQBrush & brush )
1336 if ( brush.style() == TQt::SolidPattern )
1339 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1341 else if ( brush.style() == TQt::Dense1Pattern )
1343 styleFill.
addProperty(
"draw:transparency",
"94%" );
1345 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1347 else if ( brush.style() == TQt::Dense2Pattern )
1349 styleFill.
addProperty(
"draw:transparency",
"88%" );
1351 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1353 else if ( brush.style() == TQt::Dense3Pattern )
1355 styleFill.
addProperty(
"draw:transparency",
"63%" );
1357 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1359 else if ( brush.style() == TQt::Dense4Pattern )
1361 styleFill.
addProperty(
"draw:transparency",
"50%" );
1363 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1365 else if ( brush.style() == TQt::Dense5Pattern )
1367 styleFill.
addProperty(
"draw:transparency",
"37%" );
1369 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1371 else if ( brush.style() == TQt::Dense6Pattern )
1373 styleFill.
addProperty(
"draw:transparency",
"12%" );
1375 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1377 else if ( brush.style() == TQt::Dense7Pattern )
1379 styleFill.
addProperty(
"draw:transparency",
"6%" );
1381 styleFill.
addProperty(
"draw:fill-color", brush.color().name() );
1386 styleFill.
addProperty(
"draw:fill-hatch-name", saveOasisHatchStyle( mainStyles,brush ) );
1391TQString KoOasisStyles::saveOasisHatchStyle(
KoGenStyles& mainStyles,
const TQBrush &brush )
1393 KoGenStyle hatchStyle( KoGenStyle::STYLE_HATCH );
1394 hatchStyle.addAttribute(
"draw:color", brush.color().name() );
1396 switch( brush.style() )
1398 case TQt::HorPattern:
1399 hatchStyle.addAttribute(
"draw:style",
"single" );
1400 hatchStyle.addAttribute(
"draw:rotation", 0);
1402 case TQt::BDiagPattern:
1403 hatchStyle.addAttribute(
"draw:style",
"single" );
1404 hatchStyle.addAttribute(
"draw:rotation", 450);
1406 case TQt::VerPattern:
1407 hatchStyle.addAttribute(
"draw:style",
"single" );
1408 hatchStyle.addAttribute(
"draw:rotation", 900);
1410 case TQt::FDiagPattern:
1411 hatchStyle.addAttribute(
"draw:style",
"single" );
1412 hatchStyle.addAttribute(
"draw:rotation", 1350);
1414 case TQt::CrossPattern:
1415 hatchStyle.addAttribute(
"draw:style",
"double" );
1416 hatchStyle.addAttribute(
"draw:rotation", 0);
1418 case TQt::DiagCrossPattern:
1419 hatchStyle.addAttribute(
"draw:style",
"double" );
1420 hatchStyle.addAttribute(
"draw:rotation", 450);
1426 return mainStyles.
lookup( hatchStyle,
"hatch" );
1429TQBrush KoOasisStyles::loadOasisFillStyle(
const KoStyleStack &styleStack,
const TQString & fill,
const KoOasisStyles & oasisStyles )
1432 if ( fill ==
"solid" )
1434 tmpBrush.setStyle(
static_cast<TQt::BrushStyle
>( 1 ) );
1436 tmpBrush.setColor(styleStack.
attributeNS( KoXmlNS::draw,
"fill-color" ) );
1437 if ( styleStack.
hasAttributeNS( KoXmlNS::draw,
"transparency" ) )
1439 TQString transparency = styleStack.
attributeNS( KoXmlNS::draw,
"transparency" );
1440 if ( transparency ==
"94%" )
1442 tmpBrush.setStyle(TQt::Dense1Pattern);
1444 else if ( transparency ==
"88%" )
1446 tmpBrush.setStyle(TQt::Dense2Pattern);
1448 else if ( transparency ==
"63%" )
1450 tmpBrush.setStyle(TQt::Dense3Pattern);
1453 else if ( transparency ==
"50%" )
1455 tmpBrush.setStyle(TQt::Dense4Pattern);
1458 else if ( transparency ==
"37%" )
1460 tmpBrush.setStyle(TQt::Dense5Pattern);
1463 else if ( transparency ==
"12%" )
1465 tmpBrush.setStyle(TQt::Dense6Pattern);
1468 else if ( transparency ==
"6%" )
1470 tmpBrush.setStyle(TQt::Dense7Pattern);
1474 kdDebug()<<
" transparency is not defined into kpresenter :"<<transparency<<endl;
1477 else if ( fill ==
"hatch" )
1479 TQString style = styleStack.
attributeNS( KoXmlNS::draw,
"fill-hatch-name" );
1480 kdDebug()<<
" hatch style is : "<<style<<endl;
1484 TQDomElement* draw = oasisStyles.
drawStyles()[style];
1487 kdDebug()<<
"We have a style\n";
1489 if( draw->hasAttributeNS( KoXmlNS::draw,
"rotation" ))
1491 angle = (draw->attributeNS( KoXmlNS::draw,
"rotation", TQString() ).toInt())/10;
1492 kdDebug()<<
"angle :"<<angle<<endl;
1494 if(draw->hasAttributeNS( KoXmlNS::draw,
"color" ) )
1497 tmpBrush.setColor(draw->attributeNS( KoXmlNS::draw,
"color", TQString() ) );
1499 if( draw->hasAttributeNS( KoXmlNS::draw,
"distance" ))
1503 if( draw->hasAttributeNS( KoXmlNS::draw,
"display-name"))
1507 if( draw->hasAttributeNS( KoXmlNS::draw,
"style" ))
1510 TQString styleHash = draw->attributeNS( KoXmlNS::draw,
"style", TQString() );
1511 if( styleHash ==
"single")
1517 tmpBrush.setStyle(TQt::HorPattern );
1521 tmpBrush.setStyle(TQt::BDiagPattern );
1525 tmpBrush.setStyle(TQt::VerPattern );
1529 tmpBrush.setStyle(TQt::FDiagPattern );
1533 kdDebug()<<
" draw:rotation 'angle' : "<<angle<<endl;
1537 else if( styleHash ==
"double")
1545 tmpBrush.setStyle(TQt::CrossPattern );
1551 tmpBrush.setStyle(TQt::DiagCrossPattern );
1555 kdDebug()<<
" draw:rotation 'angle' : "<<angle<<endl;
1560 else if( styleHash ==
"triple")
1562 kdDebug()<<
" it is not implemented :( \n";
1572 return m_defaultStyle[family];
1577 return m_styles[ name ];
1582 const TQDomElement* style = d->m_styles[ family ][ styleName ];
1583 if ( style && !family.isEmpty() ) {
1584 const TQString styleFamily = style->attributeNS( KoXmlNS::style,
"family", TQString() );
1585 if ( styleFamily != family ) {
1586 kdWarning() <<
"KoOasisStyles: was looking for style " << styleName
1587 <<
" in family " << family <<
" but got " << styleFamily << endl;
1595 const TQDomElement* style = d->m_stylesAutoStyles[ family ][ styleName ];
1597 const TQString styleFamily = style->attributeNS( KoXmlNS::style,
"family", TQString() );
1598 if ( styleFamily != family ) {
1599 kdWarning() <<
"KoOasisStyles: was looking for style " << styleName
1600 <<
" in family " << family <<
" but got " << styleFamily << endl;
void addChildElement(const TQString &elementName, const TQString &elementContents)
Add a child element to the style properties.
void addProperty(const TQString &propName, const TQString &propValue, PropertyType type=DefaultType)
Add a property to the style.
Repository of styles used during saving of OASIS/OOo file.
TQString lookup(const KoGenStyle &style, const TQString &name=TQString(), int flags=NoFlag)
Look up a style in the collection, inserting it if necessary.
Repository of styles used during loading of OASIS/OOo file.
const TQDict< TQDomElement > & drawStyles() const
static TQString saveOasisTextStyle(KoGenStyles &mainStyles, const TQString &_format, const TQString &_prefix=TQString(), const TQString &_suffix=TQString())
const TQDomElement & officeStyle() const
TQValueVector< TQDomElement > userStyles() const
const TQDict< TQDomElement > & styles(const TQString &family) const
const TQDomElement * findStyleAutoStyle(const TQString &name, const TQString &family) const
Similar to findStyle but for auto-styles in styles.xml only.
const TQDomElement * findStyle(const TQString &name) const
Look up a style by name.
void createStyleMap(const TQDomDocument &doc, bool stylesDotXml)
Look into doc for styles and remember them.
const TQDomElement * defaultStyle(const TQString &family) const
This class implements a stack for the different styles of an object.
bool hasAttributeNS(const char *nsURI, const char *localName, const char *detail=0) const
Check if any of the styles on the stack has an attribute called 'name'-'detail' where detail is e....
TQString attributeNS(const char *nsURI, const char *localName, const char *detail=0) const
Search for the attribute called 'name', starting on top of the stack, and return it.
A class for writing out XML (to any TQIODevice), with a special attention on performance.
void startElement(const char *tagName, bool indentInside=true)
Start a new element, as a child of the current element.
void addTextNode(const TQString &str)
Overloaded version of addTextNode( const char* ), which is a bit slower because it needs to convert s...
void endElement()
Terminate the current element.
void addAttribute(const char *attrName, const TQString &value)
Overloaded version of addAttribute( const char*, const char* ), which is a bit slower because it need...
const char * name(StdAction id)
KOFFICECORE_EXPORT TQDomElement namedItemNS(const TQDomNode &node, const char *nsURI, const char *localName)
A namespace-aware version of TQDomNode::namedItem(), which also takes care of casting to a TQDomEleme...