28#include <dcopobject.h>
33#include <KoXmlWriter.h>
35#include <KoOasisLoadingContext.h>
42#include "kchart_params.h"
43#include "kchart_part.h"
44#include "KChartParamsIface.h"
51KChartParams::KChartParams( KChartPart *_part )
56 m_firstRowAsLabel =
false;
57 m_firstColAsLabel =
false;
67KChartParams::~KChartParams()
76TQString KChartParams::chartTypeToString( ChartType _type)
const
79 if (_type == BarLines )
87KChartParams::ChartType
88KChartParams::stringToChartType(
const TQString& _string )
91 if ( _string ==
"BarLines" )
99void KChartParams::setFirstRowAsLabel(
bool _val )
101 m_firstRowAsLabel = _val;
105 if ( m_part->canChangeValue() )
108 m_part->doSetData( *m_part->data(),
109 m_firstRowAsLabel, m_firstColAsLabel );
112void KChartParams::setFirstColAsLabel(
bool _val )
114 m_firstColAsLabel = _val;
118 if ( m_part->canChangeValue() )
121 m_part->doSetData( *m_part->data(),
122 m_firstRowAsLabel, m_firstColAsLabel );
126DCOPObject* KChartParams::dcopObject()
129 m_dcop =
new KChartParamsIface(
this );
140 const char *oasisClass;
141 KChartParams::ChartType chartType;
142} oasisChartTypes[] = {
143 {
"chart:bar", KChartParams::Bar },
144 {
"chart:line", KChartParams::Line },
145 {
"chart:area", KChartParams::Area },
146 {
"chart:circle", KChartParams::Pie },
151 {
"chart:ring", KChartParams::Ring },
152 {
"chart:radar", KChartParams::Polar }
160static const unsigned int numOasisChartTypes
161 =
sizeof oasisChartTypes /
sizeof *oasisChartTypes;
165 KoOasisLoadingContext loadingContext(
this, oasisStyles, store );
166 KoStyleStack &styleStack = loadingContext.styleStack();
169 styleStack.setTypeProperties(
"graphic" );
170 loadingContext.fillStyleStack( chartElem, KoXmlNS::chart,
"style-name" );
172 const TQString fillColor = styleStack.attributeNS( KoXmlNS::draw,
"fill-color" );
173 kDebug() <<
"fillColor=" << fillColor << endl;
175 styleStack.restore();
181void KChartParams::loadOasisFont( KoOasisLoadingContext& context, TQFont& font, TQColor& color )
183 KoStyleStack& styleStack = context.styleStack();
184 styleStack.setTypeProperties(
"text" );
186 if ( styleStack.hasAttributeNS( KoXmlNS::fo,
"color" ) ) {
187 color.setNamedColor( styleStack.attributeNS( KoXmlNS::fo,
"color" ) );
189 if ( styleStack.hasAttributeNS( KoXmlNS::fo,
"font-family" )
190 || styleStack.hasAttributeNS( KoXmlNS::style,
"font-name" ) ) {
192 TQString fontName = styleStack.attributeNS( KoXmlNS::fo,
"font-family" ).remove(
"'" );
193 if ( fontName.isEmpty() ) {
196 fontName = styleStack.attributeNS( KoXmlNS::style,
"font-name" ).remove(
"'" );
200 if ( fontName ==
"Thorndale" )
201 fontName =
"Times New Roman";
203 fontName.remove( TQRegExp(
"\\sCE$" ) );
204 font.setFamily( fontName );
206 if ( styleStack.hasAttributeNS( KoXmlNS::fo,
"font-size" ) ) {
207 double pointSize = styleStack.fontSize();
208 font.setPointSizeFloat( pointSize );
209 kdDebug(35001) <<
"font size: " << pointSize << endl;
211 if ( styleStack.hasAttributeNS( KoXmlNS::fo,
"font-weight" ) ) {
212 TQString fontWeight = styleStack.attributeNS( KoXmlNS::fo,
"font-weight" );
214 if ( fontWeight ==
"normal" )
216 else if ( fontWeight ==
"bold" )
221 boldness = fontWeight.toInt() / 10;
222 font.setWeight( boldness );
224 if ( styleStack.hasAttributeNS( KoXmlNS::fo,
"font-style" ) ) {
225 if ( styleStack.attributeNS( KoXmlNS::fo,
"font-style" ) ==
"italic" ||
226 styleStack.attributeNS( KoXmlNS::fo,
"font-style" ) ==
"oblique" ) {
227 font.setItalic(
true );
232bool KChartParams::loadOasis(
const TQDomElement &chartElem,
233 KoOasisLoadingContext &loadingContext,
234 TQString &errorMessage,
237 const TQString chartClass = chartElem.attributeNS( KoXmlNS::chart,
238 "class", TQString() );
239 bool knownType =
false;
242 for (
unsigned int i = 0 ; i < numOasisChartTypes ; ++i ) {
243 if ( chartClass == oasisChartTypes[i].oasisClass ) {
244 kdDebug(35001) <<
"found chart of type " << chartClass << endl;
247 setChartType( oasisChartTypes[i].chartType );
255 errorMessage = i18n(
"Unknown chart type %1" ).arg( chartClass );
256 kdDebug(35001) << errorMessage << endl;
261 TQDomElement titleElem = KoDom::namedItemNS( chartElem,
262 KoXmlNS::chart,
"title" );
263 if ( !titleElem.isNull() ) {
264 loadingContext.styleStack().save();
265 loadingContext.fillStyleStack( titleElem, KoXmlNS::chart,
"style-name",
"chart" );
268 loadOasisFont( loadingContext, font, color );
269 setHeaderFooterFont( KDChartParams::HdFtPosHeader, font,
true, font.pointSize()*4 );
270 setHeaderFooterColor( KDChartParams::HdFtPosHeader, color );
271 loadingContext.styleStack().restore();
273 TQDomElement pElem = KoDom::namedItemNS( titleElem,
274 KoXmlNS::text,
"p" );
275 setHeader1Text( pElem.text() );
279 TQDomElement subtitleElem = KoDom::namedItemNS( chartElem, KoXmlNS::chart,
281 if ( !subtitleElem.isNull() ) {
282 loadingContext.styleStack().save();
283 loadingContext.fillStyleStack( subtitleElem, KoXmlNS::chart,
"style-name",
"chart" );
286 loadOasisFont( loadingContext, font, color );
287 setHeaderFooterFont( KDChartParams::HdFtPosHeader2, font,
true, font.pointSize()*4 );
288 setHeaderFooterColor( KDChartParams::HdFtPosHeader2, color );
289 loadingContext.styleStack().restore();
291 TQDomElement pElem = KoDom::namedItemNS( subtitleElem,
292 KoXmlNS::text,
"p" );
293 setHeader2Text( pElem.text() );
297 TQDomElement footerElem = KoDom::namedItemNS( chartElem, KoXmlNS::chart,
299 if ( !footerElem.isNull() ) {
300 loadingContext.styleStack().save();
301 loadingContext.fillStyleStack( footerElem, KoXmlNS::chart,
"style-name",
"chart" );
304 loadOasisFont( loadingContext, font, color );
305 setHeaderFooterFont( KDChartParams::HdFtPosFooter, font,
true, font.pointSize()*4 );
306 setHeaderFooterColor( KDChartParams::HdFtPosFooter, color );
307 loadingContext.styleStack().restore();
309 TQDomElement pElem = KoDom::namedItemNS( footerElem,
310 KoXmlNS::text,
"p" );
311 setFooterText( pElem.text() );
315 TQDomElement legendElem = KoDom::namedItemNS( chartElem, KoXmlNS::chart,
317 if ( !legendElem.isNull() )
319 loadingContext.styleStack().save();
320 loadingContext.fillStyleStack( legendElem, KoXmlNS::chart,
"style-name",
"chart" );
323 loadOasisFont( loadingContext, font, color );
325 setLegendFont( font,
false );
326 setLegendFontRelSize( font.pointSize()*4 );
327 setLegendTitleFont( font,
false);
328 setLegendTitleFontRelSize( font.pointSize()*4 );
329 setLegendTextColor( color );
330 setLegendTitleTextColor( color );
331 loadingContext.styleStack().restore();
333 if ( legendElem.hasAttributeNS( KoXmlNS::chart,
"legend-position" ) )
335 lp = legendElem.attributeNS( KoXmlNS::chart,
"legend-position", TQString() );
338 if ( legendElem.hasAttributeNS( KoXmlNS::chart,
"legend-align" ) )
340 lalign = legendElem.attributeNS( KoXmlNS::chart,
"legend-align", TQString() );
343 LegendPosition lpos = NoLegend;
345 if ( lalign ==
"start" )
349 else if ( lalign ==
"end" )
358 lpos = LegendTopLeftLeft;
359 else if ( align == 2 )
360 lpos = LegendBottomLeftLeft;
362 else if ( lp ==
"end" )
366 lpos = LegendTopRightRight;
367 else if ( align == 2 )
368 lpos = LegendBottomRightRight;
370 else if ( lp ==
"top" )
374 lpos = LegendTopLeftTop;
375 else if ( align == 2 )
376 lpos = LegendTopRightTop;
378 else if ( lp ==
"bottom" )
382 lpos = LegendBottomLeftBottom;
383 else if ( align == 2 )
384 lpos = LegendBottomRightBottom;
386 else if ( lp ==
"top-start" )
388 lpos = LegendTopLeft;
390 else if ( lp ==
"bottom-start" )
392 lpos = LegendBottomLeft;
394 else if ( lp ==
"top-end" )
396 lpos = LegendTopRight;
398 else if ( lp ==
"bottom-end" )
400 lpos = LegendBottomRight;
403 setLegendPosition( lpos );
405 if ( legendElem.hasAttributeNS( KoXmlNS::koffice,
"title" ) )
407 setLegendTitleText( legendElem.attributeNS( KoXmlNS::koffice,
"title", TQString() ) );
412 setLegendPosition( NoLegend );
416 TQDomElement plotareaElem = KoDom::namedItemNS( chartElem,
417 KoXmlNS::chart,
"plot-area" );
418 if ( !plotareaElem.isNull() ) {
419 return loadOasisPlotarea( plotareaElem, loadingContext, errorMessage );
426bool KChartParams::loadOasisPlotarea(
const TQDomElement &plotareaElem,
427 KoOasisLoadingContext &loadingContext,
428 TQString &errorMessage )
440 tmp = plotareaElem.attributeNS( KoXmlNS::chart,
441 "data-source-has-labels", TQString() );
442 m_firstRowAsLabel =
false;
443 m_firstColAsLabel =
false;
444 if ( tmp ==
"none" || tmp ==
"" )
446 else if ( tmp ==
"row" )
447 m_firstRowAsLabel =
true;
448 else if ( tmp ==
"column" )
449 m_firstColAsLabel =
true;
450 else if ( tmp ==
"both" ) {
451 m_firstRowAsLabel =
true;
452 m_firstColAsLabel =
true;
455 errorMessage =
"Unknown value for chart:data-source-has-labels:"
463 KoStyleStack &styleStack = loadingContext.styleStack();
466 tmp = plotareaElem.attributeNS( KoXmlNS::chart,
"style-name",
470 styleStack.setTypeProperties(
"chart" );
471 loadingContext.fillStyleStack( plotareaElem, KoXmlNS::chart,
"style-name",
"chart" );
473 if ( styleStack.attributeNS( KoXmlNS::chart,
"three-dimensional" ) ==
"true" ) {
474 setThreeDBars(
true );
475 setThreeDLines(
true );
476 setThreeDPies(
true );
479 setThreeDBars(
false );
480 setThreeDLines(
false );
481 setThreeDPies(
false );
484 switch ( m_chartType ) {
490 tmp = styleStack.attributeNS( KoXmlNS::chart,
"vertical" );
496 if ( styleStack.attributeNS( KoXmlNS::chart,
"stacked" ) ==
"true" )
497 setBarChartSubType( BarStacked );
498 else if ( styleStack.attributeNS( KoXmlNS::chart,
"percentage" ) ==
"true" )
499 setBarChartSubType( BarPercent );
501 setBarChartSubType( BarNormal );
515 if ( styleStack.attributeNS( KoXmlNS::chart,
"stacked" ) ==
"true" )
516 setLineChartSubType( LineStacked );
517 else if ( styleStack.attributeNS( KoXmlNS::chart,
"percentage" ) ==
"true" )
518 setLineChartSubType( LinePercent );
520 setLineChartSubType( LineNormal );
534 if ( styleStack.attributeNS( KoXmlNS::chart,
"stacked" ) ==
"true" )
535 setAreaChartSubType( AreaStacked );
536 else if ( styleStack.attributeNS( KoXmlNS::chart,
"percentage" ) ==
"true" )
537 setAreaChartSubType( AreaPercent );
539 setAreaChartSubType( AreaNormal );
579 if ( styleStack.attributeNS( KoXmlNS::chart,
"series-source" ) ==
"rows" ) {
580 setDataDirection( DataRows );
589 styleStack.restore();
594 TQDomElement xAxisElem;
595 TQDomElement yAxisElem;
597 TQDomElement axisElem;
598 forEachElement( axisElem, plotareaElem ) {
601 if ( axisElem.tagName() !=
"axis" )
604 tmp = axisElem.attributeNS( KoXmlNS::chart,
"name",
608 if ( tmp ==
"primary-x" )
609 xAxisElem = axisElem;
610 else if ( tmp ==
"primary-y" )
611 yAxisElem = axisElem;
618 if ( m_chartType != Pie
619 && !loadOasisAxis( xAxisElem, loadingContext, errorMessage,
620 KDChartAxisParams::AxisPosBottom) )
622 if ( !loadOasisAxis( yAxisElem, loadingContext, errorMessage,
623 KDChartAxisParams::AxisPosLeft) )
630 const TQString fillColor = styleStack.attributeNS( KoXmlNS::draw,
632 kdDebug() <<
"fillColor=" << fillColor << endl;
641bool KChartParams::loadOasisAxis(
const TQDomElement &axisElem,
642 KoOasisLoadingContext &loadingContext,
643 TQString &errorMessage,
644 KDChartAxisParams::AxisPos axisPos )
646 Q_UNUSED( errorMessage );
649 TQDomElement tmpElem;
650 KoStyleStack &styleStack = loadingContext.styleStack();
656 TQDomElement titleElem = KoDom::namedItemNS( axisElem,
657 KoXmlNS::chart,
"title" );
658 if ( !titleElem.isNull() ) {
659 tmpElem = KoDom::namedItemNS( titleElem, KoXmlNS::text,
"p" );
660 setAxisTitle( axisPos, tmpElem.text() );
670 tmp = axisElem.attributeNS( KoXmlNS::chart,
"style-name", TQString() );
674 styleStack.setTypeProperties(
"chart" );
675 loadingContext.fillStyleStack( axisElem, KoXmlNS::chart,
"style-name",
"chart" );
710 styleStack.restore();
720void KChartParams::saveOasis( KoXmlWriter* bodyWriter, KoGenStyles& mainStyles )
const
722 bool knownType =
false;
723 for (
unsigned int i = 0 ; i < numOasisChartTypes ; ++i ) {
724 if ( m_chartType == oasisChartTypes[i].chartType ) {
725 bodyWriter->addAttribute(
"chart:class", oasisChartTypes[i].oasisClass );
732 kdError(32001) <<
"Unknown chart type in KChartParams::saveOasis, extend oasisChartTypes!" << endl;
735 bodyWriter->startElement(
"chart:title" );
736 TQRect rect( headerFooterRect( KDChartParams::HdFtPosHeader ) );
737 bodyWriter->addAttributePt(
"svg:x", rect.x() );
738 bodyWriter->addAttributePt(
"svg:y", rect.y() );
739 bodyWriter->addAttribute(
"chart:style-name", saveOasisFont( mainStyles, header1Font(), headerFooterColor( KDChartParams::HdFtPosHeader ) ) );
740 bodyWriter->startElement(
"text:p" );
741 bodyWriter->addTextNode( header1Text() );
742 bodyWriter->endElement();
743 bodyWriter->endElement();
745 TQString subTitle( header2Text() );
746 if ( !subTitle.isEmpty() ) {
748 kdDebug(32001) <<
"header rect: " << headerFooterRect( KDChartParams::HdFtPosHeader2 ) << endl;
749 TQRect rect( headerFooterRect( KDChartParams::HdFtPosHeader2 ) );
750 bodyWriter->startElement(
"chart:subtitle" );
751 bodyWriter->addAttributePt(
"svg:x", rect.x() );
752 bodyWriter->addAttributePt(
"svg:y", rect.y() );
753 bodyWriter->addAttribute(
"chart:style-name",
754 saveOasisFont( mainStyles,
756 headerFooterColor( KDChartParams::HdFtPosHeader2 ) ) );
758 bodyWriter->startElement(
"text:p" );
759 bodyWriter->addTextNode( subTitle );
760 bodyWriter->endElement();
761 bodyWriter->endElement();
765 TQString footer( footerText() );
766 if ( !footer.isEmpty() ) {
767 TQRect rect( headerFooterRect( KDChartParams::HdFtPosFooter ) );
768 bodyWriter->startElement(
"chart:footer" );
769 bodyWriter->addAttributePt(
"svg:x", rect.x() );
770 bodyWriter->addAttributePt(
"svg:y", rect.y() );
771 bodyWriter->addAttribute(
"chart:style-name",
772 saveOasisFont( mainStyles,
774 headerFooterColor( KDChartParams::HdFtPosFooter ) ) );
776 bodyWriter->startElement(
"text:p" );
777 bodyWriter->addTextNode( footer );
778 bodyWriter->endElement();
779 bodyWriter->endElement();
783 LegendPosition lpos = legendPosition();
784 if ( lpos != NoLegend ) {
785 bodyWriter->startElement(
"chart:legend" );
808 case LegendTopLeftTop:
812 case LegendTopLeftLeft:
819 case LegendTopRightTop:
823 case LegendTopRightRight:
827 case LegendBottomLeft:
830 case LegendBottomLeftBottom:
834 case LegendBottomLeftLeft:
838 case LegendBottomRight:
841 case LegendBottomRightBottom:
845 case LegendBottomRightRight:
855 bodyWriter->addAttribute(
"chart:legend-position", lp );
856 bodyWriter->addAttribute(
"chart:legend-align", lalign );
857 bodyWriter->addAttribute(
"chart:style-name",
858 saveOasisFont( mainStyles,
860 legendTextColor() ) );
861 bodyWriter->addAttribute(
"koffice:title", legendTitleText() );
862 bodyWriter->endElement();
865 bodyWriter->startElement(
"chart:plot-area" );
866 saveOasisPlotArea( bodyWriter, mainStyles );
867 bodyWriter->endElement();
873void KChartParams::saveOasisPlotArea( KoXmlWriter* bodyWriter, KoGenStyles& mainStyles )
const
875 TQString dataSourceHasLabels;
876 if ( m_firstRowAsLabel )
877 if ( m_firstColAsLabel )
878 dataSourceHasLabels =
"both";
880 dataSourceHasLabels =
"row";
882 if ( m_firstColAsLabel )
883 dataSourceHasLabels =
"column";
885 dataSourceHasLabels =
"none";
886 bodyWriter->addAttribute(
"chart:data-source-has-labels", dataSourceHasLabels );
889 KoGenStyle plotAreaStyle( KoGenStyle::STYLE_AUTO,
"chart" );
891 switch ( m_chartType ) {
896 switch( barChartSubType() ) {
898 plotAreaStyle.addProperty(
"chart:stacked",
"true" );
901 plotAreaStyle.addProperty(
"chart:percentage",
"true" );
908 plotAreaStyle.addProperty(
"chart:vertical",
"false" );
909 plotAreaStyle.addProperty(
"chart:lines-used", 0 );
912 plotAreaStyle.addProperty(
"chart:three-dimensional",
"true" );
915 switch( lineChartSubType() ) {
917 plotAreaStyle.addProperty(
"chart:stacked",
"true" );
920 plotAreaStyle.addProperty(
"chart:percentage",
"true" );
925 plotAreaStyle.addProperty(
"chart:symbol-type",
"automatic" );
928 plotAreaStyle.addProperty(
"chart:three-dimensional",
"true" );
933 switch( areaChartSubType() ) {
935 plotAreaStyle.addProperty(
"chart:stacked",
"true" );
938 plotAreaStyle.addProperty(
"chart:percentage",
"true" );
949 plotAreaStyle.addProperty(
"chart:three-dimensional",
"true" );
967 plotAreaStyle.addProperty(
"chart:series-source",
968 ( dataDirection() == DataRows ) ?
"rows" :
"columns" );
971 const TQString styleName = mainStyles.lookup( plotAreaStyle,
"ch" );
973 bodyWriter->addAttribute(
"chart:style-name", styleName );
975 saveOasisAxis( bodyWriter, mainStyles, KDChartAxisParams::AxisPosBottom,
"x" );
976 saveOasisAxis( bodyWriter, mainStyles, KDChartAxisParams::AxisPosLeft,
"y" );
984void KChartParams::saveOasisAxis( KoXmlWriter* bodyWriter,
985 KoGenStyles& mainStyles,
986 KDChartAxisParams::AxisPos axisPos,
987 const char* axisName )
const
989 bodyWriter->startElement(
"chart:axis" );
991 bodyWriter->addAttribute(
"chart:dimension", axisName );
992 bodyWriter->addAttribute(
"chart:name", TQCString(
"primary-" ) + axisName );
994 KoGenStyle axisStyle( KoGenStyle::STYLE_AUTO,
"chart" );
997 axisStyle.addProperty(
"chart:display-label",
"true" );
1000 const TQString styleName = mainStyles.lookup( axisStyle,
"ch" );
1001 bodyWriter->addAttribute(
"chart:style-name", styleName );
1004 TQString tmpStr = axisTitle( axisPos );
1005 if ( tmpStr !=
"" ) {
1006 bodyWriter->startElement(
"chart:title" );
1010 bodyWriter->startElement(
"text:p" );
1011 bodyWriter->addTextNode( tmpStr
1012 .remove( TQRegExp(
"^<qt><center>" ) )
1013 .remove( TQRegExp(
"</center></qt>$" ) ) );
1014 bodyWriter->endElement();
1016 bodyWriter->endElement();
1023 bodyWriter->endElement();
1027TQString KChartParams::saveOasisFont( KoGenStyles& mainStyles,
const TQFont& font,
const TQColor& color )
const
1029 KoGenStyle::PropertyType tt = KoGenStyle::TextType;
1030 KoGenStyle autoStyle( KoGenStyle::STYLE_AUTO,
"chart", 0 );
1031 autoStyle.addProperty(
"fo:font-family", font.family(), tt );
1032 autoStyle.addPropertyPt(
"fo:font-size", font.pointSize(), tt );
1033 autoStyle.addProperty(
"fo:color", color.isValid() ? color.name() :
"#000000", tt );
1034 int w = font.weight();
1035 autoStyle.addProperty(
"fo:font-weight", w == 50 ?
"normal" : w == 75 ?
"bold" : TQString::number( tqRound( w / 10 ) * 100 ), tt );
1036 autoStyle.addProperty(
"fo:font-style", font.italic() ?
"italic" :
"normal", tt );
1038 return mainStyles.lookup( autoStyle,
"ch", KoGenStyles::ForceNumbering );
Provide access to the chart axis parameters.
Header for all common chart parameters.
Bundles the display parameters of a chart.
static ChartType stringToChartType(const TQString &string)
Converts the specified string to a chart type enum value.
static TQString chartTypeToString(ChartType type)
Converts the specified chart type enum to a string representation.