You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/lib/kofficecore/KoOasisStyles.cpp

1605 lines
58 KiB

/* This file is part of the KDE project
Copyright (C) 2004-2006 David Faure <faure@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KoOasisStyles.h"
#include <KoXmlWriter.h>
#include <kdebug.h>
#include <tqdom.h>
#include "KoDom.h"
#include "KoXmlNS.h"
#include "KoGenStyles.h"
#include <tqbuffer.h>
#include <kglobal.h>
#include <klocale.h>
#include <tqbrush.h>
#include <KoStyleStack.h>
class KoOasisStyles::Private
{
public:
// The key of the map is the family
TQMap<TQString, TQDict<TQDomElement> > m_styles;
TQMap<TQString, TQDict<TQDomElement> > 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<TQDomElement> KoOasisStyles::userStyles() const
{
TQValueVector<TQDomElement> 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<TQDomElement>& 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<TQDomElement>& dict = d->m_stylesAutoStyles[ family ];
dict.setAutoDelete( true );
if ( dict.tqfind( 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<TQDomElement>& dict = d->m_styles[ family ];
dict.setAutoDelete( true );
if ( dict.tqfind( 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-tqlayout"
|| localName == "font-decl"
|| localName == "presentation-page-tqlayout" ) )
{
if ( m_styles.tqfind( 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& tqparent )
{
NumericStyleFormat dataStyle;
const TQString localName = tqparent.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, tqparent )
{
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 :"<<suffix<<endl;
} else if ( localName == "prefix" ) {
prefix = e.text();
kdDebug()<<" prefix :"<<prefix<<endl;
} else if ( localName == "currency-symbol" ) {
dataStyle.currencySymbol = e.text();
kdDebug()<<" currency-symbol: "<<dataStyle.currencySymbol<<endl;
format += e.text();
//TODO
// number:language="de" number:country="DE">€</number:currency-symbol>
// Stefan: localization of the symbol?
} else if ( localName == "number" ) {
// TODO: number:grouping="true"
if ( e.hasAttributeNS( KoXmlNS::number, "decimal-places" ) )
{
int d = e.attributeNS( KoXmlNS::number, "decimal-places", 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:
// <style:map style:condition="value()&gt;=0" style:apply-style-name="N106P0"/>
// we handle painting negative numbers in red differently
}
const TQString styleName = tqparent.attributeNS( KoXmlNS::style, "name", TQString() );
kdDebug(30003) << "data style: " << styleName << " qt format=" << format << endl;
if ( !prefix.isEmpty() )
{
kdDebug(30003)<<" format.left( prefix.length() ) :"<<format.left( prefix.length() )<<" prefix :"<<prefix<<endl;
if ( format.left( prefix.length() )==prefix )
{
format = format.right( format.length()-prefix.length() );
}
else
prefix = TQString();
}
if ( !suffix.isEmpty() )
{
kdDebug(30003)<<"format.right( suffix.length() ) :"<<format.right( suffix.length() )<<" suffix :"<<suffix<<endl;
if ( format.right( suffix.length() )==suffix )
{
format = format.left( format.length()-suffix.length() );
}
else
suffix = TQString();
}
dataStyle.formatStr = format;
dataStyle.prefix = prefix;
dataStyle.suffix = suffix;
dataStyle.precision = precision;
kdDebug()<<" finish insert format :"<<format<<" prefix :"<<prefix<<" suffix :"<<suffix<<endl;
m_dataFormats.insert( styleName, dataStyle );
}
#define addTextNumber( text, elementWriter ) { \
if ( !text.isEmpty() ) \
{ \
elementWriter.startElement( "number:text" ); \
elementWriter.addTextNode( text ); \
elementWriter.endElement(); \
text=""; \
} \
}
void KoOasisStyles::parseOasisTimeKlocale(KoXmlWriter &elementWriter, TQString & format, TQString & text )
{
kdDebug(30003)<<"parseOasisTimeKlocale(KoXmlWriter &elementWriter, TQString & format, TQString & text ) :"<<format<<endl;
do
{
if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
{
text += format[0];
format = format.remove( 0, 1 );
}
}
while ( format.length() > 0 );
addTextNumber( text, elementWriter );
}
bool KoOasisStyles::saveOasisKlocaleTimeFormat( KoXmlWriter &elementWriter, 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<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TIME );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
if ( klocaleFormat )
{
parseOasisTimeKlocale( elementWriter, format, text );
}
else
{
bool antislash = false;
do
{
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" );
}
//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 ) :"<<format<<endl;
do
{
if ( format.startsWith( "%Y" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:year" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%y" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:year" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%n" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "false");
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%m" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%e" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%d" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%b" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "true");
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%B" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.addAttribute( "number:textual", "true");
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%a" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day-of-week" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "%A" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day-of-week" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else
{
if ( !saveOasisKlocaleTimeFormat( elementWriter, format, text ) )
{
text += format[0];
format = format.remove( 0, 1 );
}
}
}
while ( format.length() > 0 );
addTextNumber( text, elementWriter );
}
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<<endl;
TQString format( _format );
// Not supported into TQt: "era" "week-of-year" "quarter"
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_DATE );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
if ( klocaleFormat )
{
parseOasisDateKlocale( elementWriter, format, text );
}
else
{
bool antislash = false;
do
{
if ( antislash )
{
text+=format[0];
format = format.remove( 0, 1 );
}
//TODO implement loading ! What is it ?
else if ( format.startsWith( "MMMMM" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:textual", "true");
elementWriter.endElement();
format = format.remove( 0, 5 );
}
else if ( format.startsWith( "MMMM" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.addAttribute( "number:textual", "true");
elementWriter.endElement();
format = format.remove( 0, 4 );
}
else if ( format.startsWith( "MMM" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "true");
elementWriter.endElement();
format = format.remove( 0, 3 );
}
else if ( format.startsWith( "MM" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.addAttribute( "number:textual", "false"); //not necessary remove it
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "M" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "false");
elementWriter.endElement();
format = format.remove( 0, 1 );
}
else if ( format.startsWith( "PPPP" ) )
{
addTextNumber( text, elementWriter );
//<number:month number:possessive-form="true" number:textual="true" number:style="long"/>
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "false");
elementWriter.addAttribute( "number:possessive-form", "true" );
elementWriter.endElement();
format = format.remove( 0, 4 );
}
else if ( format.startsWith( "PPP" ) )
{
addTextNumber( text, elementWriter );
//<number:month number:possessive-form="true" number:textual="true" number:style="short"/>
elementWriter.startElement( "number:month" );
elementWriter.addAttribute( "number:possessive-form", "true" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.addAttribute( "number:textual", "false");
elementWriter.endElement();
format = format.remove( 0, 3 );
}
else if ( format.startsWith( "dddd" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day-of-week" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 4 );
}
else if ( format.startsWith( "ddd" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day-of-week" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 3 );
}
else if ( format.startsWith( "dd" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else if ( format.startsWith( "d" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:day" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 1 );
}
else if ( format.startsWith( "yyyy" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:year" );
elementWriter.addAttribute( "number:style", "long" );
elementWriter.endElement();
format = format.remove( 0, 4 );
}
else if ( format.startsWith( "yy" ) )
{
addTextNumber( text, elementWriter );
elementWriter.startElement( "number:year" );
elementWriter.addAttribute( "number:style", "short" );
elementWriter.endElement();
format = format.remove( 0, 2 );
}
else
{
if ( !saveOasisTimeFormat( elementWriter, format, text,antislash ) )
{
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<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_FRACTION );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
int integer = 0;
int numerator = 0;
int denominator = 0;
int denominatorValue = 0;
bool beforeSlash = true;
do
{
if ( format[0]=='#' )
integer++;
else if ( format[0]=='/' )
beforeSlash = false;
else if ( format[0]=='?' )
{
if ( beforeSlash )
numerator++;
else
denominator++;
}
else
{
bool ok;
int value = format.toInt( &ok );
if ( ok )
{
denominatorValue=value;
break;
}
}
format.remove( 0,1 );
}
while ( format.length() > 0 );
text= _prefix;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:fraction" );
elementWriter.addAttribute( "number:min-integer-digits", integer );
elementWriter.addAttribute( "number:min-numerator-digits",numerator );
elementWriter.addAttribute( "number:min-denominator-digits",denominator );
if ( denominatorValue != 0 )
elementWriter.addAttribute( "number:denominator-value",denominatorValue );
elementWriter.endElement();
addKofficeNumericStyleExtension( elementWriter, _suffix, _prefix );
text=_suffix;
addTextNumber(text, elementWriter );
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<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_NUMBER );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
int decimalplaces = 0;
int integerdigits = 0;
bool beforeSeparator = true;
do
{
if ( format[0]=='.' || format[0]==',' )
beforeSeparator = false;
else if ( format[0]=='0' && beforeSeparator )
integerdigits++;
else if ( format[0]=='0' && !beforeSeparator )
decimalplaces++;
else
kdDebug(30003)<<" error format 0 \n";
format.remove( 0,1 );
}
while ( format.length() > 0 );
text= _prefix ;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:number" );
kdDebug(30003)<<" decimalplaces :"<<decimalplaces<<" integerdigits :"<<integerdigits<<endl;
if (!beforeSeparator)
elementWriter.addAttribute( "number:decimal-places", decimalplaces );
elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
elementWriter.endElement();
text =_suffix ;
addTextNumber(text, elementWriter );
addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
currentStyle.addChildElement( "number", elementContents );
return mainStyles.lookup( currentStyle, "N" );
}
TQString KoOasisStyles::saveOasisPercentageStyle( KoGenStyles &mainStyles, const TQString & _format, const TQString &_prefix, const TQString &_suffix )
{
//<number:percentage-style style:name="N11">
//<number:number number:decimal-places="2" number:min-integer-digits="1"/>
//<number:text>%</number:text>
//</number:percentage-style>
kdDebug(30003)<<"TQString saveOasisPercentageStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_PERCENTAGE );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
int decimalplaces = 0;
int integerdigits = 0;
bool beforeSeparator = true;
do
{
if ( format[0]=='.' || format[0]==',' )
beforeSeparator = false;
else if ( format[0]=='0' && beforeSeparator )
integerdigits++;
else if ( format[0]=='0' && !beforeSeparator )
decimalplaces++;
else
kdDebug(30003)<<" error format 0 \n";
format.remove( 0,1 );
}
while ( format.length() > 0 );
text= _prefix ;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:number" );
if (!beforeSeparator)
elementWriter.addAttribute( "number:decimal-places", decimalplaces );
elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
elementWriter.endElement();
addTextNumber(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 )
{
//<number:number-style style:name="N60">
//<number:scientific-number number:decimal-places="2" number:min-integer-digits="1" number:min-exponent-digits="3"/>
//</number:number-style>
//example 000,000e+0000
kdDebug(30003)<<"TQString saveOasisScientificStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_SCIENTIFIC );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
int decimalplace = 0;
int integerdigits = 0;
int exponentdigits = 0;
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
bool beforeSeparator = true;
bool exponential = false;
bool positive = true;
do
{
if ( !exponential )
{
if ( format[0]=='0' && beforeSeparator )
integerdigits++;
else if ( format[0]==',' || format[0]=='.' )
beforeSeparator = false;
else if ( format[0]=='0' && !beforeSeparator )
decimalplace++;
else if ( format[0].lower()=='e' )
{
format.remove( 0, 1 );
if ( format[0]=='+' )
positive = true;
else if ( format[0]=='-' )
positive = false;
else
kdDebug(30003)<<"Error into scientific number\n";
exponential = true;
}
}
else
{
if ( format[0]=='0' && positive )
exponentdigits++;
else if ( format[0]=='0' && !positive )
exponentdigits--;
else
kdDebug(30003)<<" error into scientific number exponential value\n";
}
format.remove( 0,1 );
}
while ( format.length() > 0 );
text = _prefix ;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:scientific-number" );
kdDebug(30003)<<" decimalplace :"<<decimalplace<<" integerdigits :"<<integerdigits<<" exponentdigits :"<<exponentdigits<<endl;
if (!beforeSeparator)
elementWriter.addAttribute( "number:decimal-places", decimalplace );
elementWriter.addAttribute( "number:min-integer-digits",integerdigits );
elementWriter.addAttribute( "number:min-exponent-digits",exponentdigits );
elementWriter.endElement();
text = _suffix;
addTextNumber(text, elementWriter );
addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
currentStyle.addChildElement( "number", elementContents );
return mainStyles.lookup( currentStyle, "N" );
}
TQString KoOasisStyles::saveOasisCurrencyStyle( KoGenStyles &mainStyles,
const TQString & _format, const TQString &symbol,
const TQString &_prefix, const TQString &_suffix )
{
//<number:currency-style style:name="N107P0" style:volatile="true">
//<number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true"/>
//<number:text> </number:text>
//<number:currency-symbol>VEB</number:currency-symbol>
//</number:currency-style>
kdDebug(30003)<<"TQString saveOasisCurrencyStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_CURRENCY );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
int decimalplaces = 0;
int integerdigits = 0;
bool beforeSeparator = true;
do
{
if ( format[0]=='.' || format[0]==',' )
beforeSeparator = false;
else if ( format[0]=='0' && beforeSeparator )
integerdigits++;
else if ( format[0]=='0' && !beforeSeparator )
decimalplaces++;
else
kdDebug(30003)<<" error format 0 \n";
format.remove( 0,1 );
}
while ( format.length() > 0 );
text = _prefix ;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:number" );
kdDebug(30003)<<" decimalplaces :"<<decimalplaces<<" integerdigits :"<<integerdigits<<endl;
if (!beforeSeparator)
elementWriter.addAttribute( "number:decimal-places", decimalplaces );
elementWriter.addAttribute( "number:min-integer-digits", integerdigits );
elementWriter.endElement();
text = _suffix ;
addTextNumber(text, elementWriter );
addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
elementWriter.startElement( "number:currency-symbol" );
kdDebug(30003) << " currency-symbol: " << symbol << endl;
elementWriter.addTextNode( symbol.utf8() );
elementWriter.endElement();
TQString elementContents = TQString::fromUtf8( buffer.buffer(), buffer.buffer().size() );
currentStyle.addChildElement( "number", elementContents );
return mainStyles.lookup( currentStyle, "N" );
}
TQString KoOasisStyles::saveOasisTextStyle( KoGenStyles &mainStyles, const TQString & _format, const TQString &_prefix, const TQString &_suffix )
{
//<number:text-style style:name="N100">
//<number:text-content/>
///</number:text-style>
kdDebug(30003)<<"TQString saveOasisTextStyle( KoGenStyles &mainStyles, const TQString & _format ) :"<<_format<<endl;
TQString format( _format );
KoGenStyle currentStyle( KoGenStyle::STYLE_NUMERIC_TEXT );
TQBuffer buffer;
buffer.open( IO_WriteOnly );
KoXmlWriter elementWriter( TQT_TQIODEVICE(&buffer) ); // TODO pass indentation level
TQString text;
do
{
format.remove( 0,1 );
}
while ( format.length() > 0 );
text = _prefix ;
addTextNumber(text, elementWriter );
elementWriter.startElement( "number:text-style" );
text = _suffix ;
addTextNumber(text, elementWriter );
addKofficeNumericStyleExtension( elementWriter, _suffix,_prefix );
elementWriter.endElement();
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<Qt::BrushStyle>( 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(Qt::Dense1Pattern);
}
else if ( transparency == "88%" )
{
tmpBrush.setStyle(Qt::Dense2Pattern);
}
else if ( transparency == "63%" )
{
tmpBrush.setStyle(Qt::Dense3Pattern);
}
else if ( transparency == "50%" )
{
tmpBrush.setStyle(Qt::Dense4Pattern);
}
else if ( transparency == "37%" )
{
tmpBrush.setStyle(Qt::Dense5Pattern);
}
else if ( transparency == "12%" )
{
tmpBrush.setStyle(Qt::Dense6Pattern);
}
else if ( transparency == "6%" )
{
tmpBrush.setStyle(Qt::Dense7Pattern);
}
else
kdDebug()<<" transparency is not defined into kpresenter :"<<transparency<<endl;
}
}
else if ( fill == "hatch" )
{
TQString style = styleStack.attributeNS( KoXmlNS::draw, "fill-hatch-name" );
kdDebug()<<" hatch style is : "<<style<<endl;
//type not defined by default
//try to use style.
TQDomElement* draw = oasisStyles.drawStyles()[style];
if ( draw)
{
kdDebug()<<"We have a style\n";
int angle = 0;
if( draw->hasAttributeNS( KoXmlNS::draw, "rotation" ))
{
angle = (draw->attributeNS( KoXmlNS::draw, "rotation", TQString() ).toInt())/10;
kdDebug()<<"angle :"<<angle<<endl;
}
if(draw->hasAttributeNS( KoXmlNS::draw, "color" ) )
{
//kdDebug()<<" draw:color :"<<draw->attributeNS( KoXmlNS::draw, "color", TQString() )<<endl;
tmpBrush.setColor(draw->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(Qt::HorPattern );
break;
case 45:
case 225:
tmpBrush.setStyle(Qt::BDiagPattern );
break;
case 90:
case 270:
tmpBrush.setStyle(Qt::VerPattern );
break;
case 135:
case 315:
tmpBrush.setStyle(Qt::FDiagPattern );
break;
default:
//todo fixme when we will have a kopaint
kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
break;
}
}
else if( styleHash == "double")
{
switch( angle )
{
case 0:
case 180:
case 90:
case 270:
tmpBrush.setStyle(Qt::CrossPattern );
break;
case 45:
case 135:
case 225:
case 315:
tmpBrush.setStyle(Qt::DiagCrossPattern );
break;
default:
//todo fixme when we will have a kopaint
kdDebug()<<" draw:rotation 'angle' : "<<angle<<endl;
break;
}
}
else if( styleHash == "triple")
{
kdDebug()<<" it is not implemented :( \n";
}
}
}
}
return tmpBrush;
}
const TQDomElement* KoOasisStyles::defaultStyle( const TQString& family ) const
{
return m_defaultStyle[family];
}
const TQDomElement* KoOasisStyles::findStyle( const TQString& name ) const
{
return m_styles[ name ];
}
const TQDomElement* KoOasisStyles::findStyle( const TQString& styleName, const TQString& family ) const
{
const TQDomElement* style = d->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;
}