1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*63bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*63bba73cSAndrew Rist * distributed with this work for additional information
6*63bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*63bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist * with the License. You may obtain a copy of the License at
10*63bba73cSAndrew Rist *
11*63bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*63bba73cSAndrew Rist *
13*63bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist * KIND, either express or implied. See the License for the
17*63bba73cSAndrew Rist * specific language governing permissions and limitations
18*63bba73cSAndrew Rist * under the License.
19*63bba73cSAndrew Rist *
20*63bba73cSAndrew Rist *************************************************************/
21*63bba73cSAndrew Rist
22*63bba73cSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir #include "SchXMLLegendContext.hxx"
27cdf0e10cSrcweir #include "SchXMLEnumConverter.hxx"
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <xmloff/xmlnmspe.hxx>
30cdf0e10cSrcweir #include <xmloff/xmlement.hxx>
31cdf0e10cSrcweir #include <xmloff/prstylei.hxx>
32cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
33cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include <tools/debug.hxx>
36cdf0e10cSrcweir
37cdf0e10cSrcweir #include <com/sun/star/chart/ChartLegendPosition.hpp>
38cdf0e10cSrcweir #include <com/sun/star/chart/ChartLegendExpansion.hpp>
39cdf0e10cSrcweir #include <com/sun/star/drawing/FillStyle.hpp>
40cdf0e10cSrcweir
41cdf0e10cSrcweir using namespace ::xmloff::token;
42cdf0e10cSrcweir using namespace com::sun::star;
43cdf0e10cSrcweir
44cdf0e10cSrcweir using rtl::OUString;
45cdf0e10cSrcweir using com::sun::star::uno::Reference;
46cdf0e10cSrcweir
47cdf0e10cSrcweir //----------------------------------------
48cdf0e10cSrcweir
49cdf0e10cSrcweir namespace
50cdf0e10cSrcweir {
51cdf0e10cSrcweir
52cdf0e10cSrcweir enum LegendAttributeTokens
53cdf0e10cSrcweir {
54cdf0e10cSrcweir XML_TOK_LEGEND_POSITION,
55cdf0e10cSrcweir XML_TOK_LEGEND_X,
56cdf0e10cSrcweir XML_TOK_LEGEND_Y,
57cdf0e10cSrcweir XML_TOK_LEGEND_STYLE_NAME,
58cdf0e10cSrcweir XML_TOK_LEGEND_EXPANSION,
59cdf0e10cSrcweir XML_TOK_LEGEND_EXPANSION_ASPECT_RATIO,
60cdf0e10cSrcweir XML_TOK_LEGEND_WIDTH,
61cdf0e10cSrcweir XML_TOK_LEGEND_WIDTH_EXT,
62cdf0e10cSrcweir XML_TOK_LEGEND_HEIGHT,
63cdf0e10cSrcweir XML_TOK_LEGEND_HEIGHT_EXT
64cdf0e10cSrcweir };
65cdf0e10cSrcweir
66cdf0e10cSrcweir SvXMLTokenMapEntry aLegendAttributeTokenMap[] =
67cdf0e10cSrcweir {
68cdf0e10cSrcweir { XML_NAMESPACE_CHART, XML_LEGEND_POSITION, XML_TOK_LEGEND_POSITION },
69cdf0e10cSrcweir { XML_NAMESPACE_SVG, XML_X, XML_TOK_LEGEND_X },
70cdf0e10cSrcweir { XML_NAMESPACE_SVG, XML_Y, XML_TOK_LEGEND_Y },
71cdf0e10cSrcweir { XML_NAMESPACE_CHART, XML_STYLE_NAME, XML_TOK_LEGEND_STYLE_NAME },
72cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_LEGEND_EXPANSION, XML_TOK_LEGEND_EXPANSION },
73cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_LEGEND_EXPANSION_ASPECT_RATIO, XML_TOK_LEGEND_EXPANSION_ASPECT_RATIO },
74cdf0e10cSrcweir { XML_NAMESPACE_SVG, XML_WIDTH, XML_TOK_LEGEND_WIDTH },
75cdf0e10cSrcweir { XML_NAMESPACE_CHART_EXT, XML_WIDTH, XML_TOK_LEGEND_WIDTH_EXT },
76cdf0e10cSrcweir { XML_NAMESPACE_SVG, XML_HEIGHT, XML_TOK_LEGEND_HEIGHT },
77cdf0e10cSrcweir { XML_NAMESPACE_CHART_EXT, XML_HEIGHT, XML_TOK_LEGEND_HEIGHT_EXT },
78cdf0e10cSrcweir XML_TOKEN_MAP_END
79cdf0e10cSrcweir };
80cdf0e10cSrcweir
81cdf0e10cSrcweir class LegendAttributeTokenMap : public SvXMLTokenMap
82cdf0e10cSrcweir {
83cdf0e10cSrcweir public:
LegendAttributeTokenMap()84cdf0e10cSrcweir LegendAttributeTokenMap(): SvXMLTokenMap( aLegendAttributeTokenMap ) {}
~LegendAttributeTokenMap()85cdf0e10cSrcweir virtual ~LegendAttributeTokenMap() {}
86cdf0e10cSrcweir };
87cdf0e10cSrcweir
88cdf0e10cSrcweir //a LegendAttributeTokenMap Singleton
89cdf0e10cSrcweir struct theLegendAttributeTokenMap : public rtl::Static< LegendAttributeTokenMap, theLegendAttributeTokenMap > {};
90cdf0e10cSrcweir
91cdf0e10cSrcweir }//end anonymous namespace
92cdf0e10cSrcweir
93cdf0e10cSrcweir //----------------------------------------
94cdf0e10cSrcweir
SchXMLLegendContext(SchXMLImportHelper & rImpHelper,SvXMLImport & rImport,const rtl::OUString & rLocalName)95cdf0e10cSrcweir SchXMLLegendContext::SchXMLLegendContext( SchXMLImportHelper& rImpHelper, SvXMLImport& rImport, const rtl::OUString& rLocalName ) :
96cdf0e10cSrcweir SvXMLImportContext( rImport, XML_NAMESPACE_CHART, rLocalName ),
97cdf0e10cSrcweir mrImportHelper( rImpHelper )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir }
100cdf0e10cSrcweir
StartElement(const uno::Reference<xml::sax::XAttributeList> & xAttrList)101cdf0e10cSrcweir void SchXMLLegendContext::StartElement( const uno::Reference< xml::sax::XAttributeList >& xAttrList )
102cdf0e10cSrcweir {
103cdf0e10cSrcweir uno::Reference< chart::XChartDocument > xDoc = mrImportHelper.GetChartDocument();
104cdf0e10cSrcweir if( !xDoc.is() )
105cdf0e10cSrcweir return;
106cdf0e10cSrcweir
107cdf0e10cSrcweir // turn on legend
108cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xDocProp( xDoc, uno::UNO_QUERY );
109cdf0e10cSrcweir if( xDocProp.is() )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir try
112cdf0e10cSrcweir {
113cdf0e10cSrcweir xDocProp->setPropertyValue( rtl::OUString::createFromAscii( "HasLegend" ), uno::makeAny( sal_True ) );
114cdf0e10cSrcweir }
115cdf0e10cSrcweir catch( beans::UnknownPropertyException )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir DBG_ERROR( "Property HasLegend not found" );
118cdf0e10cSrcweir }
119cdf0e10cSrcweir }
120cdf0e10cSrcweir
121cdf0e10cSrcweir uno::Reference< drawing::XShape > xLegendShape( xDoc->getLegend(), uno::UNO_QUERY );
122cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xLegendProps( xLegendShape, uno::UNO_QUERY );
123cdf0e10cSrcweir if( !xLegendShape.is() || !xLegendProps.is() )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir DBG_ERROR( "legend could not be created" );
126cdf0e10cSrcweir return;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir
129cdf0e10cSrcweir // parse attributes
130cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is()? xAttrList->getLength(): 0;
131cdf0e10cSrcweir const SvXMLTokenMap& rAttrTokenMap = theLegendAttributeTokenMap::get();
132cdf0e10cSrcweir
133cdf0e10cSrcweir awt::Point aLegendPos;
134cdf0e10cSrcweir bool bHasXPosition=false;
135cdf0e10cSrcweir bool bHasYPosition=false;
136cdf0e10cSrcweir awt::Size aLegendSize;
137cdf0e10cSrcweir bool bHasWidth=false;
138cdf0e10cSrcweir bool bHasHeight=false;
139cdf0e10cSrcweir chart::ChartLegendExpansion nLegendExpansion = chart::ChartLegendExpansion_HIGH;
140cdf0e10cSrcweir bool bHasExpansion=false;
141cdf0e10cSrcweir
142cdf0e10cSrcweir rtl::OUString sAutoStyleName;
143cdf0e10cSrcweir uno::Any aAny;
144cdf0e10cSrcweir
145cdf0e10cSrcweir for( sal_Int16 i = 0; i < nAttrCount; i++ )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir rtl::OUString sAttrName = xAttrList->getNameByIndex( i );
148cdf0e10cSrcweir rtl::OUString aLocalName;
149cdf0e10cSrcweir rtl::OUString aValue = xAttrList->getValueByIndex( i );
150cdf0e10cSrcweir sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
151cdf0e10cSrcweir
152cdf0e10cSrcweir switch( rAttrTokenMap.Get( nPrefix, aLocalName ))
153cdf0e10cSrcweir {
154cdf0e10cSrcweir case XML_TOK_LEGEND_POSITION:
155cdf0e10cSrcweir {
156cdf0e10cSrcweir try
157cdf0e10cSrcweir {
158cdf0e10cSrcweir if( SchXMLEnumConverter::getLegendPositionConverter().importXML( aValue, aAny, GetImport().GetMM100UnitConverter() ) )
159cdf0e10cSrcweir xLegendProps->setPropertyValue( rtl::OUString::createFromAscii( "Alignment" ), aAny );
160cdf0e10cSrcweir }
161cdf0e10cSrcweir catch( beans::UnknownPropertyException )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir DBG_ERROR( "Property Alignment (legend) not found" );
164cdf0e10cSrcweir }
165cdf0e10cSrcweir }
166cdf0e10cSrcweir break;
167cdf0e10cSrcweir
168cdf0e10cSrcweir case XML_TOK_LEGEND_X:
169cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure( aLegendPos.X, aValue );
170cdf0e10cSrcweir bHasXPosition = true;
171cdf0e10cSrcweir break;
172cdf0e10cSrcweir case XML_TOK_LEGEND_Y:
173cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure( aLegendPos.Y, aValue );
174cdf0e10cSrcweir bHasYPosition = true;
175cdf0e10cSrcweir break;
176cdf0e10cSrcweir case XML_TOK_LEGEND_STYLE_NAME:
177cdf0e10cSrcweir sAutoStyleName = aValue;
178cdf0e10cSrcweir break;
179cdf0e10cSrcweir case XML_TOK_LEGEND_EXPANSION:
180cdf0e10cSrcweir SchXMLEnumConverter::getLegendPositionConverter().importXML( aValue, aAny, GetImport().GetMM100UnitConverter() );
181cdf0e10cSrcweir bHasExpansion = (aAny>>=nLegendExpansion);
182cdf0e10cSrcweir break;
183cdf0e10cSrcweir case XML_TOK_LEGEND_EXPANSION_ASPECT_RATIO:
184cdf0e10cSrcweir break;
185cdf0e10cSrcweir case XML_TOK_LEGEND_WIDTH:
186cdf0e10cSrcweir case XML_TOK_LEGEND_WIDTH_EXT:
187cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure( aLegendSize.Width, aValue );
188cdf0e10cSrcweir bHasWidth = true;
189cdf0e10cSrcweir break;
190cdf0e10cSrcweir case XML_TOK_LEGEND_HEIGHT:
191cdf0e10cSrcweir case XML_TOK_LEGEND_HEIGHT_EXT:
192cdf0e10cSrcweir GetImport().GetMM100UnitConverter().convertMeasure( aLegendSize.Height, aValue );
193cdf0e10cSrcweir bHasHeight = true;
194cdf0e10cSrcweir break;
195cdf0e10cSrcweir default:
196cdf0e10cSrcweir break;
197cdf0e10cSrcweir }
198cdf0e10cSrcweir }
199cdf0e10cSrcweir
200cdf0e10cSrcweir if( bHasXPosition && bHasYPosition )
201cdf0e10cSrcweir xLegendShape->setPosition( aLegendPos );
202cdf0e10cSrcweir
203cdf0e10cSrcweir if( bHasExpansion && nLegendExpansion!= chart::ChartLegendExpansion_CUSTOM )
204cdf0e10cSrcweir xLegendProps->setPropertyValue( rtl::OUString::createFromAscii( "Expansion" ), uno::makeAny(nLegendExpansion) );
205cdf0e10cSrcweir else if( bHasHeight && bHasWidth )
206cdf0e10cSrcweir xLegendShape->setSize( aLegendSize );
207cdf0e10cSrcweir
208cdf0e10cSrcweir // the fill style has the default "none" in XML, but "solid" in the model.
209cdf0e10cSrcweir xLegendProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" )), uno::makeAny( drawing::FillStyle_NONE ));
210cdf0e10cSrcweir
211cdf0e10cSrcweir // set auto-styles for Legend
212cdf0e10cSrcweir const SvXMLStylesContext* pStylesCtxt = mrImportHelper.GetAutoStylesContext();
213cdf0e10cSrcweir if( pStylesCtxt )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir const SvXMLStyleContext* pStyle = pStylesCtxt->FindStyleChildContext(
216cdf0e10cSrcweir mrImportHelper.GetChartFamilyID(), sAutoStyleName );
217cdf0e10cSrcweir
218cdf0e10cSrcweir if( pStyle && pStyle->ISA( XMLPropStyleContext ))
219cdf0e10cSrcweir (( XMLPropStyleContext* )pStyle )->FillPropertySet( xLegendProps );
220cdf0e10cSrcweir }
221cdf0e10cSrcweir }
222cdf0e10cSrcweir
~SchXMLLegendContext()223cdf0e10cSrcweir SchXMLLegendContext::~SchXMLLegendContext()
224cdf0e10cSrcweir {
225cdf0e10cSrcweir }
226