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