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.
1605 lines
58 KiB
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()>=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;
|
|
}
|