/* This file is part of the KDE project Copyright (C) 2003 Percy Leonhardt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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 "stylefactory.h" #include #include #include #include StyleFactory::StyleFactory() { m_strokeDashStyles.setAutoDelete( true ); m_gradientStyles.setAutoDelete( true ); m_hatchStyles.setAutoDelete( true ); m_markerStyles.setAutoDelete( true ); m_fillImageStyles.setAutoDelete( true ); m_listStyles.setAutoDelete( true ); m_pageStyles.setAutoDelete( true ); m_textStyles.setAutoDelete( true ); m_graphicStyles.setAutoDelete( true ); m_paragraphStyles.setAutoDelete( true ); m_pageMasterStyles.setAutoDelete( true ); // create standard graphic style GraphicStyle * graphicStyle; graphicStyle = new GraphicStyle ( "standard", "solid", "0cm", "0x000000", "hidden", "0.3cm", "0.3cm", "0x808080", "0cm", "0cm", "0cm", "0cm", "0x000000", "false", "none", "Thorndale", "24pt", "normal", "none", "none", "normal", "100%", "start", "solid", "0x00b8ff", "false" ); m_graphicStyles.append( graphicStyle ); } StyleFactory::~StyleFactory() { } void StyleFactory::addOfficeStyles( TQDomDocument & doc, TQDomElement & styles ) { StrokeDashStyle * sd; for ( sd = m_strokeDashStyles.first(); sd ; sd = m_strokeDashStyles.next() ) sd->toXML( doc, styles ); GradientStyle * g; for ( g = m_gradientStyles.first(); g ; g = m_gradientStyles.next() ) g->toXML( doc, styles ); MarkerStyle * m; for ( m = m_markerStyles.first(); m ; m = m_markerStyles.next() ) m->toXML( doc, styles ); HatchStyle * h; for ( h = m_hatchStyles.first(); h ; h = m_hatchStyles.next() ) h->toXML( doc, styles ); GraphicStyle * gr; gr = m_graphicStyles.first(); // skip the "standard" style gr->toXML( doc, styles ); } void StyleFactory::addOfficeMaster( TQDomDocument & doc, TQDomElement & master ) { PageMasterStyle * p; for ( p = m_pageMasterStyles.first(); p ; p = m_pageMasterStyles.next() ) { TQDomElement masterPage = doc.createElement( "style:master-page" ); masterPage.setAttribute( "style:name", p->style() ); masterPage.setAttribute( "style:page-master-name", p->name() ); masterPage.setAttribute( "draw:style-name", "dp1" ); master.appendChild( masterPage ); } } void StyleFactory::addOfficeAutomatic( TQDomDocument & doc, TQDomElement & automatic ) { PageMasterStyle * p; for ( p = m_pageMasterStyles.first(); p ; p = m_pageMasterStyles.next() ) { p->toXML( doc, automatic ); } } void StyleFactory::addAutomaticStyles( TQDomDocument & doc, TQDomElement & autoStyles ) { ListStyle * l; for ( l = m_listStyles.first(); l ; l = m_listStyles.next() ) l->toXML( doc, autoStyles ); PageStyle * p; for ( p = m_pageStyles.first(); p ; p = m_pageStyles.next() ) p->toXML( doc, autoStyles ); TextStyle * t; for ( t = m_textStyles.first(); t ; t = m_textStyles.next() ) t->toXML( doc, autoStyles ); GraphicStyle * g; g = m_graphicStyles.first(); // skip the "standard" style for ( g = m_graphicStyles.next(); g ; g = m_graphicStyles.next() ) g->toXML( doc, autoStyles ); ParagraphStyle * pg; for ( pg = m_paragraphStyles.first(); pg ; pg = m_paragraphStyles.next() ) pg->toXML( doc, autoStyles ); } TQString StyleFactory::createStrokeDashStyle( int style ) { StrokeDashStyle * newStrokeDashStyle, * sd; newStrokeDashStyle = new StrokeDashStyle( style ); for ( sd = m_strokeDashStyles.first(); sd ; sd = m_strokeDashStyles.next() ) { if ( sd->name() == newStrokeDashStyle->name() ) { delete newStrokeDashStyle; return sd->name(); } } m_strokeDashStyles.append( newStrokeDashStyle ); return newStrokeDashStyle->name(); } TQString StyleFactory::createGradientStyle( TQDomElement & gradient ) { GradientStyle * newGradientStyle, * g; newGradientStyle = new GradientStyle( gradient, m_gradientStyles.count() + 1 ); for ( g = m_gradientStyles.first(); g ; g = m_gradientStyles.next() ) { if ( g->name() == newGradientStyle->name() ) { delete newGradientStyle; return g->name(); } } m_gradientStyles.append( newGradientStyle ); return newGradientStyle->name(); } TQString StyleFactory::createMarkerStyle( int style ) { MarkerStyle * newMarkerStyle, * m; newMarkerStyle = new MarkerStyle( style ); for ( m = m_markerStyles.first(); m ; m = m_markerStyles.next() ) { if ( m->name() == newMarkerStyle->name() ) { delete newMarkerStyle; return m->name(); } } m_markerStyles.append( newMarkerStyle ); return newMarkerStyle->name(); } TQString StyleFactory::createHatchStyle( int style, TQString & color ) { HatchStyle * newHatchStyle, * h; newHatchStyle = new HatchStyle( style, color ); for ( h = m_hatchStyles.first(); h ; h = m_hatchStyles.next() ) { if ( h->name() == newHatchStyle->name() ) { delete newHatchStyle; return h->name(); } } m_hatchStyles.append( newHatchStyle ); return newHatchStyle->name(); } TQString StyleFactory::createListStyle( TQDomElement & e ) { ListStyle * newListStyle, * l; newListStyle = new ListStyle( e, m_listStyles.count() + 1 ); for ( l = m_listStyles.first(); l ; l = m_listStyles.next() ) { if ( *l == *newListStyle ) { delete newListStyle; return l->name(); } } m_listStyles.append( newListStyle ); return newListStyle->name(); } TQString StyleFactory::createPageStyle( TQDomElement & e ) { PageStyle * newPageStyle, * p; newPageStyle = new PageStyle( this, e, m_pageStyles.count() + 1 ); for ( p = m_pageStyles.first(); p ; p = m_pageStyles.next() ) { if ( *p == *newPageStyle ) { delete newPageStyle; return p->name(); } } m_pageStyles.append( newPageStyle ); return newPageStyle->name(); } TQString StyleFactory::createTextStyle( TQDomElement & e ) { TextStyle * newTextStyle, * t; newTextStyle = new TextStyle( e, m_textStyles.count() + 1 ); for ( t = m_textStyles.first(); t ; t = m_textStyles.next() ) { if ( *t == *newTextStyle ) { delete newTextStyle; return t->name(); } } m_textStyles.append( newTextStyle ); return newTextStyle->name(); } TQString StyleFactory::createGraphicStyle( TQDomElement & e ) { GraphicStyle * newGraphicStyle, * g; newGraphicStyle = new GraphicStyle( this, e, m_graphicStyles.count() ); for ( g = m_graphicStyles.first(); g ; g = m_graphicStyles.next() ) { if ( *g == *newGraphicStyle ) { delete newGraphicStyle; return g->name(); } } m_graphicStyles.append( newGraphicStyle ); return newGraphicStyle->name(); } TQString StyleFactory::createParagraphStyle( TQDomElement & e ) { ParagraphStyle * newParagraphStyle, * p; newParagraphStyle = new ParagraphStyle( e, m_paragraphStyles.count() + 1 ); for ( p = m_paragraphStyles.first(); p ; p = m_paragraphStyles.next() ) { if ( *p == *newParagraphStyle ) { delete newParagraphStyle; return p->name(); } } m_paragraphStyles.append( newParagraphStyle ); return newParagraphStyle->name(); } TQString StyleFactory::createPageMasterStyle( TQDomElement & e ) { PageMasterStyle * newPMStyle, * p; newPMStyle = new PageMasterStyle( e, m_pageMasterStyles.count() ); for ( p = m_pageMasterStyles.first(); p ; p = m_pageMasterStyles.next() ) { if ( *p == *newPMStyle ) { delete newPMStyle; return p->style(); } } m_pageMasterStyles.append( newPMStyle ); return newPMStyle->style(); } TQString StyleFactory::toCM( const TQString & point ) { double pt = point.toFloat(); double cm = KoUnit::toCM( pt ); return TQString( "%1cm" ).arg ( cm ); } StrokeDashStyle::StrokeDashStyle( int style ) { switch ( style ) { case 2: m_name = "Fine Dashed"; m_style = "rect"; m_dots1 = "1"; m_dots1_length = "0.508cm"; m_dots2 = "1"; m_dots2_length = "0.508cm"; m_distance = "0.508cm"; break; case 3: m_name = "Fine Dotted"; m_style = "rect"; m_dots1 = "1"; m_distance = "0.257cm"; break; case 4: m_name = "Ultrafine 1 Dot 1 Dash"; m_style = "rect"; m_dots1 = "1"; m_dots1_length = "0.051cm"; m_dots2 = "1"; m_dots2_length = "0.254cm"; m_distance = "0.127cm"; break; case 5: m_name = "2 Dots 1 Dash"; m_style = "rect"; m_dots1 = "2"; m_dots2 = "1"; m_dots2_length = "0.203cm"; m_distance = "0.203cm"; break; } } void StrokeDashStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement strokeDash = doc.createElement( "draw:stroke-dash" ); strokeDash.setAttribute( "draw:name", m_name ); if ( !m_style.isNull() ) strokeDash.setAttribute( "draw:style", m_style ); if ( !m_dots1.isNull() ) strokeDash.setAttribute( "draw:dots1", m_dots1 ); if ( !m_dots1_length.isNull() ) strokeDash.setAttribute( "draw:dots1-length", m_dots1_length ); if ( !m_dots2.isNull() ) strokeDash.setAttribute( "draw:dots2", m_dots2 ); if ( !m_dots2_length.isNull() ) strokeDash.setAttribute( "draw:dots2-length", m_dots2_length ); if ( !m_distance.isNull() ) strokeDash.setAttribute( "draw:distance", m_distance ); e.appendChild( strokeDash ); } GradientStyle::GradientStyle( TQDomElement & gradient, int index ) { m_name = TQString( "Gradient %1" ).arg( index ); m_start_intensity = "100%"; m_end_intensity = "100%"; m_border = "0%"; int type = 1; if ( gradient.nodeName() == "PAGE" ) { // gradient from page background TQDomElement backColor1 = gradient.namedItem( "BACKCOLOR1" ).toElement(); TQDomElement backColor2 = gradient.namedItem( "BACKCOLOR2" ).toElement(); TQDomElement bcType = gradient.namedItem( "BCTYPE" ).toElement(); TQDomElement bGradient = gradient.namedItem( "BGRADIENT" ).toElement(); if ( !backColor1.isNull() ) m_start_color = backColor1.attribute( "color" ); if ( !backColor2.isNull() ) m_end_color = backColor2.attribute( "color" ); if ( !bcType.isNull() ) type = bcType.attribute( "value" ).toInt(); if ( !bGradient.isNull() ) { if ( bGradient.attribute( "unbalanced" ) == "0" ) { m_cx = "50%"; m_cy = "50%"; } else { int cx = bGradient.attribute( "xfactor" ).toInt(); int cy = bGradient.attribute( "yfactor" ).toInt(); m_cx = TQString( "%1%" ).arg( cx / 4 + 50 ); m_cy = TQString( "%1%" ).arg( cy / 4 + 50 ); } } } else { // gradient from object if ( gradient.hasAttribute( "color1" ) ) m_start_color = gradient.attribute( "color1" ); if ( gradient.hasAttribute( "color2" ) ) m_end_color = gradient.attribute( "color2" ); if ( gradient.hasAttribute( "type" ) ) type = gradient.attribute( "type" ).toInt(); if ( gradient.hasAttribute( "unbalanced" ) ) { if ( gradient.attribute( "unbalanced" ) == "0" ) { m_cx = "50%"; m_cy = "50%"; } else { int cx = gradient.attribute( "xfactor" ).toInt(); int cy = gradient.attribute( "yfactor" ).toInt(); m_cx = TQString( "%1%" ).arg( cx / 4 + 50 ); m_cy = TQString( "%1%" ).arg( cy / 4 + 50 ); } } } switch ( type ) { case 1: m_style = "linear"; m_angle = "0"; break; case 2: m_style = "linear"; m_angle = "900"; break; case 3: m_style = "linear"; m_angle = "450"; break; case 4: m_style = "linear"; m_angle = "135"; break; case 5: m_style = "radial"; m_angle = "0"; break; case 6: m_style = "square"; m_angle = "0"; break; case 7: m_style = "axial"; m_angle = "0"; break; } } void GradientStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement gradient = doc.createElement( "draw:gradient" ); gradient.setAttribute( "draw:name", m_name ); if ( !m_style.isNull() ) gradient.setAttribute( "draw:style", m_style ); if ( !m_start_color.isNull() ) gradient.setAttribute( "draw:start-color", m_start_color ); if ( !m_end_color.isNull() ) gradient.setAttribute( "draw:end-color", m_end_color ); if ( !m_start_intensity.isNull() ) gradient.setAttribute( "draw:start-intensity", m_start_intensity ); if ( !m_end_intensity.isNull() ) gradient.setAttribute( "draw:end-intensity", m_end_intensity ); if ( !m_angle.isNull() ) gradient.setAttribute( "draw:angle", m_angle ); if ( !m_border.isNull() ) gradient.setAttribute( "draw:border", m_border ); if ( !m_cx.isNull() ) gradient.setAttribute( "draw:cx", m_cx ); if ( !m_cy.isNull() ) gradient.setAttribute( "draw:cy", m_cy ); e.appendChild( gradient ); } MarkerStyle::MarkerStyle( int style ) { // Markers are not working because OOImpress depends on the sequence // of the attributes in the draw:marker tag. svg:ViewBox has to be in // front of svg:d in order to work. switch ( style ) { case 1: m_name = "Arrow"; m_viewBox = "0 0 20 30"; m_d = "m10 0-10 30h20z"; break; case 2: m_name = "Square"; m_viewBox = "0 0 10 10"; m_d = "m0 0h10v10h-10z"; break; case 3: m_name = "Circle"; m_viewBox = "0 0 1131 1131"; m_d = "m462 1118-102-29-102-51-93-72-72-93-51-102-29-102-13-105 13-102 29-106 51-102 72-89 93-72 102-50 102-34 106-9 101 9 106 34 98 50 93 72 72 89 51 102 29 106 13 102-13 105-29 102-51 102-72 93-93 72-98 51-106 29-101 13z"; break; case 4: m_name = "Line Arrow"; m_viewBox = "0 0 1122 2243"; m_d = "m0 2108v17 17l12 42 30 34 38 21 43 4 29-8 30-21 25-26 13-34 343-1532 339 1520 13 42 29 34 39 21 42 4 42-12 34-30 21-42v-39-12l-4 4-440-1998-9-42-25-39-38-25-43-8-42 8-38 25-26 39-8 42z"; break; case 5: m_name = "Dimension Lines"; m_viewBox = "0 0 836 110"; m_d = "m0 0h278 278 280v36 36 38h-278-278-280v-36-36z"; break; case 6: case 7: m_name = "Double Arrow"; m_viewBox = "0 0 1131 1918"; m_d = "m737 1131h394l-564-1131-567 1131h398l-398 787h1131z"; break; } } void MarkerStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement marker = doc.createElement( "draw:marker" ); marker.setAttribute( "draw:name", m_name ); if ( !m_viewBox.isNull() ) marker.setAttribute( "svg:viewBox", m_viewBox ); if ( !m_d.isNull() ) marker.setAttribute( "svg:d", m_d ); e.appendChild( marker ); } HatchStyle::HatchStyle( int style, TQString & color ) { m_color = color; switch ( style ) { case 9: m_name = m_color + " 0 Degrees"; m_style = "single"; m_distance = "0.102cm"; m_rotation = "0"; break; case 10: m_name = m_color + " 90 Degrees"; m_style = "single"; m_distance = "0.102cm"; m_rotation = "900"; break; case 11: m_name = m_color + " Crossed 0 Degrees"; m_style = "double"; m_distance = "0.076cm"; m_rotation = "900"; break; case 12: m_name = m_color + " 45 Degrees"; m_style = "single"; m_distance = "0.102cm"; m_rotation = "450"; break; case 13: m_name = m_color + " -45 Degrees"; m_style = "single"; m_distance = "0.102cm"; m_rotation = "3150"; break; case 14: m_name = m_color + " Crossed 45 Degrees"; m_style = "double"; m_distance = "0.076cm"; m_rotation = "450"; break; } } void HatchStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement hatch = doc.createElement( "draw:hatch" ); hatch.setAttribute( "draw:name", m_name ); if ( !m_style.isNull() ) hatch.setAttribute( "draw:style", m_style ); if ( !m_color.isNull() ) hatch.setAttribute( "draw:color", m_color ); if ( !m_distance.isNull() ) hatch.setAttribute( "draw:distance", m_distance ); if ( !m_rotation.isNull() ) hatch.setAttribute( "draw:rotation", m_rotation ); e.appendChild( hatch ); } FillImageStyle::FillImageStyle( TQString & name ) { } void FillImageStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { } PageMasterStyle::PageMasterStyle( TQDomElement & e, const uint index ) { TQDomNode borders = e.namedItem( "PAPERBORDERS" ); TQDomElement b = borders.toElement(); m_name = TQString( "PM%1" ).arg( index ); m_style = TQString( "Default%1" ).arg( index ); m_margin_top = StyleFactory::toCM( b.attribute( "ptTop" ) ); m_margin_bottom = StyleFactory::toCM( b.attribute( "ptBottom" ) ); m_margin_left = StyleFactory::toCM( b.attribute( "ptLeft" ) ); m_margin_right = StyleFactory::toCM( b.attribute( "ptRight" ) ); m_page_width = StyleFactory::toCM( e.attribute( "ptWidth" ) ); m_page_height = StyleFactory::toCM( e.attribute( "ptHeight" ) ); m_orientation = "landscape"; } void PageMasterStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement style = doc.createElement( "style:page-master" ); style.setAttribute( "style:name", "PM0" ); TQDomElement properties = doc.createElement( "style:properties" ); properties.setAttribute( "fo:margin-top", m_margin_top ); properties.setAttribute( "fo:margin-bottom", m_margin_bottom ); properties.setAttribute( "fo:margin-left", m_margin_left ); properties.setAttribute( "fo:margin-right", m_margin_right ); properties.setAttribute( "fo:page-width", m_page_width ); properties.setAttribute( "fo:page-height", m_page_height ); properties.setAttribute( "fo:print-orientation", m_orientation ); style.appendChild( properties ); e.appendChild( style ); } bool PageMasterStyle::operator==( const PageMasterStyle & pageMasterStyle ) const { return ( m_margin_top == pageMasterStyle.m_margin_top && m_margin_bottom == pageMasterStyle.m_margin_bottom && m_margin_left == pageMasterStyle.m_margin_left && m_margin_right == pageMasterStyle.m_margin_right && m_page_width == pageMasterStyle.m_page_width && m_page_height == pageMasterStyle.m_page_height && m_orientation == pageMasterStyle.m_orientation ); } PageStyle::PageStyle( StyleFactory * styleFactory, TQDomElement & e, const uint index ) { TQDomElement backMaster = e.namedItem( "BACKMASTER" ).toElement(); if( !backMaster.isNull()) { int tmp=0; if(backMaster.hasAttribute("displayBackground")) tmp = backMaster.attribute("displayBackground").toInt(); m_bg_visible = (tmp==1) ? "true" : "false"; tmp = 0; if(backMaster.hasAttribute("displayMasterPageObject")) tmp = backMaster.attribute("displayMasterPageObject").toInt(); m_bg_objects_visible = (tmp==1) ? "true" : "false"; } else { m_bg_visible = "true"; m_bg_objects_visible = "true"; } m_name = TQString( "dp%1" ).arg( index ); // check if this is an empty page tag if ( !e.hasChildNodes() ) return; TQDomElement backType = e.namedItem( "BACKTYPE" ).toElement(); if ( backType.isNull() || backType.attribute( "value" ) == "0" ) { // color TQDomElement bcType = e.namedItem( "BCTYPE" ).toElement(); if ( bcType.isNull() || bcType.attribute( "value" ) == "0" ) { // plain TQDomElement backColor = e.namedItem( "BACKCOLOR1" ).toElement(); m_fill = "solid"; m_fill_color = backColor.attribute( "color" ); } else { // gradient m_fill = "gradient"; m_fill_gradient_name = styleFactory->createGradientStyle( e ); } } else { // picture } TQDomElement pageDuration = e.namedItem( "PGTIMER" ).toElement(); if ( !pageDuration.isNull() ) { TQTime time; time = time.addSecs( pageDuration.attribute("timer").toInt() ); TQString hours( TQString::number( time.hour() ).rightJustify( 2, '0' ) ); TQString ms( TQString::number( time.minute() ).rightJustify( 2, '0' ) ); TQString sec( TQString::number( time.second() ).rightJustify( 2, '0' ) ); //ISO8601 chapter 5.5.3.2 //TQDate doesn't encode it as this format. m_page_duration = TQString( "PT%1H%2M%3S" ).arg( hours ).arg( ms ).arg( sec ); } TQDomElement pageEffect = e.namedItem( "PGEFFECT" ).toElement(); if ( !pageEffect.isNull() ) { int tmp=0; if(pageEffect.hasAttribute("value")) tmp=pageEffect.attribute("value").toInt(); kdDebug(30518)<<" tmp :"<= 2 && style <= 5 ) { m_stroke = "dash"; m_stroke_dash = styleFactory->createStrokeDashStyle( style ); } else m_stroke = "none"; } if ( !brush.isNull() ) { TQDomElement b = brush.toElement(); m_fill_color = b.attribute( "color" ); int style = b.attribute( "style" ).toInt(); if ( style == 1 ) m_fill = "solid"; else if ( style >= 9 && style <= 14 ) { m_fill = "hatch"; m_fill_hatch_name = styleFactory->createHatchStyle( style, m_fill_color ); } else if ( style >= 2 && style <= 8 ) { if ( style == 2 ) m_transparency = "94%"; else if ( style == 3 ) m_transparency = "88%"; else if ( style == 4 ) m_transparency = "63%"; else if ( style == 5 ) m_transparency = "50%"; else if ( style == 6 ) m_transparency = "37%"; else if ( style == 7 ) m_transparency = "12%"; else if ( style == 8 ) m_transparency = "6%"; } } else if ( !gradient.isNull() ) { TQDomElement g = gradient.toElement(); m_fill = "gradient"; m_fill_gradient_name = styleFactory->createGradientStyle( g ); } else m_fill = "none"; if ( !linebegin.isNull() ) { TQDomElement lb = linebegin.toElement(); m_marker_start_width = "0.25cm"; int style = lb.attribute( "value" ).toInt(); m_marker_start = styleFactory->createMarkerStyle( style ); } if ( !lineend.isNull() ) { TQDomElement le = lineend.toElement(); m_marker_end_width = "0.25cm"; int style = le.attribute( "value" ).toInt(); m_marker_end = styleFactory->createMarkerStyle( style ); } if ( !shadow.isNull() ) { TQDomElement s = shadow.toElement(); m_shadow = "visible"; m_shadow_color = s.attribute( "color" ); int direction = s.attribute( "direction" ).toInt(); TQString distance = StyleFactory::toCM( s.attribute( "distance" ) ); switch ( direction ) { case 1: m_shadow_offset_x = "-" + distance; m_shadow_offset_y = "-" + distance; break; case 2: m_shadow_offset_x = "0cm"; m_shadow_offset_y = "-" + distance; break; case 3: m_shadow_offset_x = distance; m_shadow_offset_y = "-" + distance; break; case 4: m_shadow_offset_x = distance; m_shadow_offset_y = "0cm"; break; case 5: m_shadow_offset_x = distance; m_shadow_offset_y = distance; break; case 6: m_shadow_offset_x = "0cm"; m_shadow_offset_y = distance; break; case 7: m_shadow_offset_x = "-" + distance; m_shadow_offset_y = distance; break; case 8: m_shadow_offset_x = "-" + distance; m_shadow_offset_y = "0cm"; break; } } } GraphicStyle::GraphicStyle( const char * name, const char * stroke, const char * stroke_color, const char * stroke_width, const char * shadow, const char * shadow_offset_x, const char * shadow_offset_y, const char * shadow_color, const char * margin_left, const char * margin_right, const char * margin_top, const char * margin_bottom, const char * color, const char * text_outline, const char * text_crossing_out, const char * font_family, const char * font_size, const char * font_style, const char * text_shadow, const char * text_underline, const char * font_weight, const char * line_height, const char * text_align, const char * fill, const char * fill_color, const char * enable_numbering ) : m_name( name ) , m_stroke( stroke ) , m_stroke_color( stroke_color ) , m_stroke_width( stroke_width ) , m_shadow( shadow ) , m_shadow_offset_x( shadow_offset_x ) , m_shadow_offset_y( shadow_offset_y ) , m_shadow_color( shadow_color ) , m_margin_left( margin_left ) , m_margin_right( margin_right ) , m_margin_top( margin_top ) , m_margin_bottom( margin_bottom ) , m_color( color ) , m_text_outline( text_outline ) , m_text_crossing_out( text_crossing_out ) , m_font_family( font_family ) , m_font_size( font_size ) , m_font_style( font_style ) , m_text_shadow( text_shadow ) , m_text_underline( text_underline ) , m_font_weight( font_weight ) , m_line_height( line_height ) , m_text_align( text_align ) , m_fill( fill ) , m_fill_color( fill_color ) , m_enable_numbering( enable_numbering ) { } void GraphicStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement style = doc.createElement( "style:style" ); style.setAttribute( "style:name", m_name ); style.setAttribute( "style:family", "graphics" ); if ( m_name != "standard" ) style.setAttribute( "style:parent-style-name", "standard" ); TQDomElement properties = doc.createElement( "style:properties" ); if ( !m_stroke.isNull() ) properties.setAttribute( "draw:stroke", m_stroke ); if ( !m_stroke_dash.isNull() ) properties.setAttribute( "draw:stroke-dash", m_stroke_dash ); if ( !m_stroke_color.isNull() ) properties.setAttribute( "svg:stroke-color", m_stroke_color ); if ( !m_stroke_width.isNull() ) properties.setAttribute( "svg:stroke-width", m_stroke_width ); if ( !m_shadow.isNull() ) properties.setAttribute( "draw:shadow", m_shadow ); if ( !m_shadow_offset_x.isNull() ) properties.setAttribute( "draw:shadow-offset-x", m_shadow_offset_x ); if ( !m_shadow_offset_y.isNull() ) properties.setAttribute( "draw:shadow-offset-y", m_shadow_offset_y ); if ( !m_shadow_color.isNull() ) properties.setAttribute( "draw:shadow-color", m_shadow_color ); if ( !m_margin_left.isNull() ) properties.setAttribute( "fo:margin-left", m_margin_left ); if ( !m_margin_right.isNull() ) properties.setAttribute( "fo:margin-right", m_margin_right ); if ( !m_margin_top.isNull() ) properties.setAttribute( "fo:margin-top", m_margin_top ); if ( !m_margin_bottom.isNull() ) properties.setAttribute( "fo:margin-bottom", m_margin_bottom ); if ( !m_color.isNull() ) properties.setAttribute( "fo:color", m_color ); if ( !m_text_outline.isNull() ) properties.setAttribute( "style:text-outline", m_text_outline ); if ( !m_text_crossing_out.isNull() ) properties.setAttribute( "style:text-crossing-out", m_text_crossing_out ); if ( !m_font_family.isNull() ) properties.setAttribute( "fo:font-family", m_font_family ); if ( !m_font_size.isNull() ) properties.setAttribute( "fo:font-size", m_font_size ); if ( !m_font_style.isNull() ) properties.setAttribute( "fo:font-style", m_font_style ); if ( !m_text_shadow.isNull() ) properties.setAttribute( "fo:text-shadow", m_text_shadow ); if ( !m_text_underline.isNull() ) properties.setAttribute( "style:text-underline", m_text_underline ); if ( !m_font_weight.isNull() ) properties.setAttribute( "fo:font-weight", m_font_weight ); if ( !m_line_height.isNull() ) properties.setAttribute( "fo:line-height", m_line_height ); if ( !m_text_align.isNull() ) properties.setAttribute( "fo:text-align", m_text_align ); if ( !m_fill.isNull() ) properties.setAttribute( "draw:fill", m_fill ); if ( !m_fill_color.isNull() ) properties.setAttribute( "draw:fill-color", m_fill_color ); if ( !m_fill_hatch_name.isNull() ) properties.setAttribute( "draw:fill-hatch-name", m_fill_hatch_name ); if ( !m_enable_numbering.isNull() ) properties.setAttribute( "text:enable-numbering", m_enable_numbering ); if ( !m_marker_start.isNull() ) properties.setAttribute( "draw:marker-start", m_marker_start ); if ( !m_marker_start_width.isNull() ) properties.setAttribute( "draw:marker-start-width", m_marker_start_width ); if ( !m_marker_end.isNull() ) properties.setAttribute( "draw:marker-end", m_marker_end ); if ( !m_marker_end_width.isNull() ) properties.setAttribute( "draw:marker-end-width", m_marker_end_width ); if ( !m_fill_gradient_name.isNull() ) properties.setAttribute( "draw:fill-gradient-name", m_fill_gradient_name ); if ( !m_transparency.isNull() ) properties.setAttribute( "draw:transparency", m_transparency ); if ( !m_textAlignment.isNull() ) properties.setAttribute( "draw:textarea-vertical-align", m_textAlignment ); if ( !m_textMarginLeft.isNull() ) properties.setAttribute( "fo:padding-left", m_textMarginLeft ); if ( !m_textMarginBottom.isNull() ) properties.setAttribute( "fo:padding-bottom", m_textMarginBottom ); if ( !m_textMarginTop.isNull() ) properties.setAttribute( "fo:padding-top", m_textMarginTop ); if ( !m_textMarginRight.isNull() ) properties.setAttribute( "fo:padding-right", m_textMarginRight ); style.appendChild( properties ); e.appendChild( style ); } bool GraphicStyle::operator==( const GraphicStyle & graphicStyle ) const { return ( m_stroke == graphicStyle.m_stroke && m_stroke_dash == graphicStyle.m_stroke_dash && m_stroke_color == graphicStyle.m_stroke_color && m_stroke_width == graphicStyle.m_stroke_width && m_shadow == graphicStyle.m_shadow && m_shadow_offset_x == graphicStyle.m_shadow_offset_x && m_shadow_offset_y == graphicStyle.m_shadow_offset_y && m_shadow_color == graphicStyle.m_shadow_color && m_margin_left == graphicStyle.m_margin_left && m_margin_right == graphicStyle.m_margin_right && m_margin_top == graphicStyle.m_margin_top && m_margin_bottom == graphicStyle.m_margin_bottom && m_color == graphicStyle.m_color && m_text_outline == graphicStyle.m_text_outline && m_text_crossing_out == graphicStyle.m_text_crossing_out && m_font_family == graphicStyle.m_font_family && m_font_size == graphicStyle.m_font_size && m_font_style == graphicStyle.m_font_style && m_text_shadow == graphicStyle.m_text_shadow && m_text_underline == graphicStyle.m_text_underline && m_font_weight == graphicStyle.m_font_weight && m_line_height == graphicStyle.m_line_height && m_text_align == graphicStyle.m_text_align && m_fill == graphicStyle.m_fill && m_fill_color == graphicStyle.m_fill_color && m_fill_hatch_name == graphicStyle.m_fill_hatch_name && m_enable_numbering == graphicStyle.m_enable_numbering && m_marker_start == graphicStyle.m_marker_start && m_marker_start_width == graphicStyle.m_marker_start_width && m_marker_end == graphicStyle.m_marker_end && m_marker_end_width == graphicStyle.m_marker_end_width && m_fill_gradient_name == graphicStyle.m_fill_gradient_name && m_transparency == graphicStyle.m_transparency && m_textAlignment == graphicStyle.m_textAlignment && m_textMarginLeft == graphicStyle.m_textMarginLeft && m_textMarginBottom == graphicStyle.m_textMarginBottom && m_textMarginTop == graphicStyle.m_textMarginTop && m_textMarginRight == graphicStyle.m_textMarginRight); } ParagraphStyle::ParagraphStyle( TQDomElement & e, const uint index ) { // some defaults that may be overwritten m_margin_left = "0cm"; m_margin_right = "0cm"; m_text_indent = "0cm"; TQDomNode shadow = e.namedItem( "SHADOW" ); TQDomNode indents = e.namedItem( "INDENTS" ); TQDomNode offsets = e.namedItem( "OFFSETS" ); TQDomNode leftBorder = e.namedItem( "LEFTBORDER" ); TQDomNode rightBorder = e.namedItem( "RIGHTBORDER" ); TQDomNode topBorder = e.namedItem( "TOPBORDER" ); TQDomNode bottomBorder = e.namedItem( "BOTTOMBORDER" ); TQDomNode lineSpacing = e.namedItem( "LINESPACING" ); TQDomNode counter = e.namedItem( "COUNTER" ); m_name = TQString( "P%1" ).arg( index ); if ( e.hasAttribute( "align" ) ) { int align = e.attribute( "align" ).toInt(); switch ( align ) { case 0: // left m_text_align = "start"; break; case 2: // right m_text_align = "end"; break; case 4: // center m_text_align = "center"; break; case 8: // justify m_text_align = "justify"; break; } } if ( !shadow.isNull() ) { TQDomElement s = shadow.toElement(); TQString distance = TQString( "%1pt" ).arg( s.attribute( "distance" ) ); m_text_shadow = distance + " " + distance; } if ( !indents.isNull() ) { TQDomElement i = indents.toElement(); m_margin_left = StyleFactory::toCM( i.attribute( "left" ) ); m_margin_right = StyleFactory::toCM( i.attribute( "right" ) ); m_text_indent = StyleFactory::toCM( i.attribute( "first" ) ); } if ( !offsets.isNull() ) { TQDomElement o = offsets.toElement(); m_margin_top = StyleFactory::toCM( o.attribute( "before" ) ); m_margin_bottom = StyleFactory::toCM( o.attribute( "after" ) ); } if ( !leftBorder.isNull() ) m_border_left = parseBorder( leftBorder.toElement() ); if ( !rightBorder.isNull() ) m_border_right = parseBorder( rightBorder.toElement() ); if ( !topBorder.isNull() ) m_border_top = parseBorder( topBorder.toElement() ); if ( !bottomBorder.isNull() ) m_border_bottom = parseBorder( bottomBorder.toElement() ); if ( !lineSpacing.isNull() ) { TQDomElement l = lineSpacing.toElement(); TQString type = l.attribute( "type" ); if ( type == "single" ) m_line_height = "100%"; else if ( type == "oneandhalf" ) m_line_height = "150%"; else if ( type == "double" ) m_line_height = "200%"; else if ( type == "multiple" ) m_line_height = TQString( "%1%" ).arg( l.attribute( "spacingvalue" ).toInt() * 100 ); else if ( type == "custom" ) m_line_spacing = StyleFactory::toCM( l.attribute( "spacingvalue" ) ); else if ( type == "atleast" ) m_line_height_at_least = StyleFactory::toCM( l.attribute( "spacingvalue" ) ); } if ( !counter.isNull() ) m_enable_numbering = "true"; } void ParagraphStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement style = doc.createElement( "style:style" ); style.setAttribute( "style:name", m_name ); style.setAttribute( "style:family", "paragraph" ); TQDomElement properties = doc.createElement( "style:properties" ); if ( !m_margin_left.isNull() ) properties.setAttribute( "fo:margin-left", m_margin_left ); if ( !m_margin_right.isNull() ) properties.setAttribute( "fo:margin-right", m_margin_right ); if ( !m_text_indent.isNull() ) properties.setAttribute( "fo:text-indent", m_text_indent ); if ( !m_text_align.isNull() ) properties.setAttribute( "fo:text-align", m_text_align ); if ( !m_enable_numbering.isNull() ) properties.setAttribute( "text:enable-numbering", m_enable_numbering ); if ( !m_text_shadow.isNull() ) properties.setAttribute( "fo:text-shadow", m_text_shadow ); if ( !m_margin_top.isNull() ) properties.setAttribute( "fo:margin-top", m_margin_top ); if ( !m_margin_bottom.isNull() ) properties.setAttribute( "fo:margin-bottom", m_margin_bottom ); if ( !m_border_left.isNull() ) properties.setAttribute( "fo:border-left", m_border_left ); if ( !m_border_right.isNull() ) properties.setAttribute( "fo:border-right", m_border_right ); if ( !m_border_top.isNull() ) properties.setAttribute( "fo:border-top", m_border_top ); if ( !m_border_bottom.isNull() ) properties.setAttribute( "fo:border-bottom", m_border_bottom ); if ( !m_line_height.isNull() ) properties.setAttribute( "fo:line-height", m_line_height ); if ( !m_line_height_at_least.isNull() ) properties.setAttribute( "style:line-height-at-least", m_line_height_at_least ); if ( !m_line_spacing.isNull() ) properties.setAttribute( "style:line-spacing", m_line_spacing ); style.appendChild( properties ); e.appendChild( style ); } bool ParagraphStyle::operator==( const ParagraphStyle & paragraphStyle ) const { return ( m_margin_left == paragraphStyle.m_margin_left && m_margin_right == paragraphStyle.m_margin_right && m_text_indent == paragraphStyle.m_text_indent && m_text_align == paragraphStyle.m_text_align && m_enable_numbering == paragraphStyle.m_enable_numbering && m_text_shadow == paragraphStyle.m_text_shadow && m_margin_top == paragraphStyle.m_margin_top && m_margin_bottom == paragraphStyle.m_margin_bottom && m_border_left == paragraphStyle.m_border_left && m_border_right == paragraphStyle.m_border_right && m_border_top == paragraphStyle.m_border_top && m_border_bottom == paragraphStyle.m_border_bottom && m_line_height == paragraphStyle.m_line_height && m_line_height_at_least == paragraphStyle.m_line_height_at_least && m_line_spacing == paragraphStyle.m_line_spacing ); } TQString ParagraphStyle::parseBorder( TQDomElement e ) { TQString style; int _style = e.attribute( "style" ).toInt(); if ( _style == 5 ) style = "double"; else style = "solid"; TQString width = StyleFactory::toCM( e.attribute( "width" ) ); TQColor color( e.attribute( "red" ).toInt(), e.attribute( "green" ).toInt(), e.attribute( "blue" ).toInt() ); return TQString( "%1 %2 %3" ).arg( width ).arg( style ).arg( color.name() ); } ListStyle::ListStyle( TQDomElement & e, const uint index ) { // setting some default values m_min_label_width = 0.6; m_color = "#000000"; m_font_size = "100%"; m_name = TQString( "L%1" ).arg( index ); if ( e.hasAttribute( "type" ) ) { int type = e.attribute( "type" ).toInt(); switch ( type ) { case 1: // arabic numbers m_listLevelStyle = LLS_NUMBER; m_num_suffix = "."; m_num_format = "1"; break; case 2: // lower alphabetical m_listLevelStyle = LLS_NUMBER; m_num_suffix = "."; m_num_format = "a"; break; case 3: // upper alphabetical m_listLevelStyle = LLS_NUMBER; m_num_suffix = "."; m_num_format = "A"; break; case 4: // lower roman m_listLevelStyle = LLS_NUMBER; m_num_suffix = "."; m_num_format = "i"; break; case 5: // upper roman m_listLevelStyle = LLS_NUMBER; m_num_suffix = "."; m_num_format = "I"; break; case 6: // custom m_listLevelStyle = LLS_BULLET; if ( e.hasAttribute( "text" ) ) m_bullet_char = e.attribute( "text" ); break; case 8: // circle bullet m_listLevelStyle = LLS_BULLET; break; case 9: // square bullet m_listLevelStyle = LLS_BULLET; break; case 10: // disc bullet m_listLevelStyle = LLS_BULLET; break; case 11: // box bullet m_listLevelStyle = LLS_BULLET; break; } } if ( e.hasAttribute( "bulletfont" ) ) m_font_family = e.attribute( "bulletfont" ); } void ListStyle::toXML( TQDomDocument & doc, TQDomElement & e ) const { TQDomElement style = doc.createElement( "text:list-style" ); style.setAttribute( "style:name", m_name ); for ( int level = 1; level <= 10; level++ ) { TQDomElement listLevelStyle; if ( m_listLevelStyle == LLS_NUMBER ) { listLevelStyle = doc.createElement( "text:list-level-style-number" ); listLevelStyle.setAttribute( "text:level", level ); if ( !m_num_suffix.isNull() ) listLevelStyle.setAttribute( "style:num-suffix", m_num_suffix ); if ( !m_num_format.isNull() ) listLevelStyle.setAttribute( "style:num-format", m_num_format ); } else { listLevelStyle = doc.createElement( "text:list-level-style-bullet" ); listLevelStyle.setAttribute( "text:level", level ); if ( !m_bullet_char.isNull() ) listLevelStyle.setAttribute( "text:bullet-char", m_bullet_char ); } TQDomElement properties = doc.createElement( "style:properties" ); if ( level > 1 ) { properties.setAttribute( "text:min-label-width", TQString( "%1cm" ).arg( m_min_label_width ) ); properties.setAttribute( "text:space-before", TQString( "%1cm" ).arg( m_min_label_width * ( level - 1 ) ) ); } if ( !m_color.isNull() ) properties.setAttribute( "fo:color", m_color ); if ( !m_font_size.isNull() ) properties.setAttribute( "fo:font-size", m_font_size ); if ( !m_font_family.isNull() ) properties.setAttribute( "fo:font-family", m_font_family ); listLevelStyle.appendChild( properties ); style.appendChild( listLevelStyle ); } e.appendChild( style ); } bool ListStyle::operator==( const ListStyle & listStyle ) const { return ( m_listLevelStyle == listStyle.m_listLevelStyle && m_num_suffix == listStyle.m_num_suffix && m_num_format == listStyle.m_num_format && m_bullet_char == listStyle.m_bullet_char && m_min_label_width == listStyle.m_min_label_width && m_color == listStyle.m_color && m_font_size == listStyle.m_font_size && m_font_family == listStyle.m_font_family ); }