1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23 #include "precompiled_rptxml.hxx"
24
25 #include "xmlExport.hxx"
26 #include "xmlAutoStyle.hxx"
27 #include <xmloff/ProgressBarHelper.hxx>
28 #include <comphelper/sequence.hxx>
29 #include <xmloff/xmltoken.hxx>
30 #include <xmloff/txtimp.hxx>
31 #include <xmloff/xmlnmspe.hxx>
32 #include <xmloff/xmluconv.hxx>
33 #include <xmloff/nmspmap.hxx>
34 #include <comphelper/types.hxx>
35 #include "xmlEnums.hxx"
36 #include <xmloff/nmspmap.hxx>
37 #include <xmloff/xmluconv.hxx>
38 #include <xmloff/txtprmap.hxx>
39 #include <xmloff/numehelp.hxx>
40 #include "xmlHelper.hxx"
41 #include "xmlstrings.hrc"
42 #include "xmlPropertyHandler.hxx"
43 #include <com/sun/star/awt/ImagePosition.hpp>
44 #include <com/sun/star/util/NumberFormat.hpp>
45 #include <com/sun/star/style/ParagraphAdjust.hpp>
46 #include <com/sun/star/awt/TextAlign.hpp>
47 #include <com/sun/star/report/GroupOn.hpp>
48 #include <com/sun/star/report/XFixedText.hpp>
49 #include <com/sun/star/report/XImageControl.hpp>
50 #include <com/sun/star/report/XShape.hpp>
51 #include <com/sun/star/drawing/XShape.hpp>
52 #include <com/sun/star/drawing/XShapes.hpp>
53 #include <com/sun/star/report/XFunction.hpp>
54 #include <com/sun/star/awt/FontDescriptor.hpp>
55 #include <com/sun/star/text/TextContentAnchorType.hpp>
56 #include <com/sun/star/table/BorderLine.hpp>
57 #include <com/sun/star/report/XFixedLine.hpp>
58 #include <com/sun/star/frame/XController.hpp>
59 #include "RptDef.hxx"
60 // for locking SolarMutex: svapp + mutex
61 #include <vcl/svapp.hxx>
62 #include <vos/mutex.hxx>
63
64 #include <boost/bind.hpp>
65
66 //--------------------------------------------------------------------------
67 namespace rptxml
68 {
69 using namespace xmloff;
70 using namespace comphelper;
71 using namespace ::com::sun::star;
72 using namespace ::com::sun::star::report;
73 using namespace ::com::sun::star::uno;
74 using namespace ::com::sun::star::util;
75 using namespace ::com::sun::star::xml;
76
77 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)78 Reference< XInterface > ORptExportHelper::create(Reference< XComponentContext > const & xContext)
79 {
80 return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_SETTINGS ));
81 }
82 //---------------------------------------------------------------------
getImplementationName_Static()83 ::rtl::OUString ORptExportHelper::getImplementationName_Static( ) throw (RuntimeException)
84 {
85 return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLSettingsExporter");
86 }
87 //---------------------------------------------------------------------
getSupportedServiceNames_Static()88 Sequence< ::rtl::OUString > ORptExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
89 {
90 Sequence< ::rtl::OUString > aSupported(1);
91 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
92 return aSupported;
93 }
94 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)95 Reference< XInterface > ORptContentExportHelper::create(Reference< XComponentContext > const & xContext)
96 {
97 return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_CONTENT ));
98 }
99 //---------------------------------------------------------------------
getImplementationName_Static()100 ::rtl::OUString ORptContentExportHelper::getImplementationName_Static( ) throw (RuntimeException)
101 {
102 return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLContentExporter");
103 }
104 //---------------------------------------------------------------------
getSupportedServiceNames_Static()105 Sequence< ::rtl::OUString > ORptContentExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
106 {
107 Sequence< ::rtl::OUString > aSupported(1);
108 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
109 return aSupported;
110 }
111
112 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)113 Reference< XInterface > ORptStylesExportHelper::create(Reference< XComponentContext > const & xContext)
114 {
115 return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_STYLES | EXPORT_MASTERSTYLES | EXPORT_AUTOSTYLES |
116 EXPORT_FONTDECLS|EXPORT_OASIS ));
117 }
118 //---------------------------------------------------------------------
getImplementationName_Static()119 ::rtl::OUString ORptStylesExportHelper::getImplementationName_Static( ) throw (RuntimeException)
120 {
121 return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLStylesExporter");
122 }
123 //---------------------------------------------------------------------
getSupportedServiceNames_Static()124 Sequence< ::rtl::OUString > ORptStylesExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
125 {
126 Sequence< ::rtl::OUString > aSupported(1);
127 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
128 return aSupported;
129 }
130
131 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)132 Reference< XInterface > ORptMetaExportHelper::create(Reference< XComponentContext > const & xContext)
133 {
134 return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_META ));
135 }
136 //---------------------------------------------------------------------
getImplementationName_Static()137 ::rtl::OUString ORptMetaExportHelper::getImplementationName_Static( ) throw (RuntimeException)
138 {
139 return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLMetaExporter");
140 }
141 //---------------------------------------------------------------------
getSupportedServiceNames_Static()142 Sequence< ::rtl::OUString > ORptMetaExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
143 {
144 Sequence< ::rtl::OUString > aSupported(1);
145 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
146 return aSupported;
147 }
148
149 //---------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)150 Reference< XInterface > ODBFullExportHelper::create(Reference< XComponentContext > const & xContext)
151 {
152 return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_ALL));
153 }
154 //---------------------------------------------------------------------
getImplementationName_Static()155 ::rtl::OUString ODBFullExportHelper::getImplementationName_Static( ) throw (RuntimeException)
156 {
157 return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLFullExporter");
158 }
159 //---------------------------------------------------------------------
getSupportedServiceNames_Static()160 Sequence< ::rtl::OUString > ODBFullExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException)
161 {
162 Sequence< ::rtl::OUString > aSupported(1);
163 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter");
164 return aSupported;
165 }
166
167 //---------------------------------------------------------------------
168
169 class OSpecialHanldeXMLExportPropertyMapper : public SvXMLExportPropertyMapper
170 {
171 public:
OSpecialHanldeXMLExportPropertyMapper(const UniReference<XMLPropertySetMapper> & rMapper)172 OSpecialHanldeXMLExportPropertyMapper(const UniReference< XMLPropertySetMapper >& rMapper) : SvXMLExportPropertyMapper(rMapper )
173 {
174 }
175 /** this method is called for every item that has the
176 MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
handleSpecialItem(SvXMLAttributeList &,const XMLPropertyState &,const SvXMLUnitConverter &,const SvXMLNamespaceMap &,const::std::vector<XMLPropertyState> * =0,sal_uInt32=0) const177 virtual void handleSpecialItem(
178 SvXMLAttributeList& /*rAttrList*/,
179 const XMLPropertyState& /*rProperty*/,
180 const SvXMLUnitConverter& /*rUnitConverter*/,
181 const SvXMLNamespaceMap& /*rNamespaceMap*/,
182 const ::std::vector< XMLPropertyState >* /*pProperties*/ = 0,
183 sal_uInt32 /*nIdx*/ = 0 ) const
184 {
185 // nothing to do here
186 }
187 };
188 // -----------------------------------------------------------------------------
lcl_adjustColumnSpanOverRows(ORptExport::TSectionsGrid & _rGrid)189 void lcl_adjustColumnSpanOverRows(ORptExport::TSectionsGrid& _rGrid)
190 {
191 ORptExport::TSectionsGrid::iterator aSectionIter = _rGrid.begin();
192 ORptExport::TSectionsGrid::iterator aSectionEnd = _rGrid.end();
193 for (;aSectionIter != aSectionEnd ; ++aSectionIter)
194 {
195 ORptExport::TGrid::iterator aRowIter = aSectionIter->second.begin();
196 ORptExport::TGrid::iterator aRowEnd = aSectionIter->second.end();
197 for (; aRowIter != aRowEnd; ++aRowIter)
198 {
199 if ( aRowIter->first )
200 {
201 ::std::vector< ORptExport::TCell >::iterator aColIter = aRowIter->second.begin();
202 ::std::vector< ORptExport::TCell >::iterator aColEnd = aRowIter->second.end();
203 for (; aColIter != aColEnd; ++aColIter)
204 {
205 if ( aColIter->nRowSpan > 1 )
206 {
207 sal_Int32 nColSpan = aColIter->nColSpan;
208 sal_Int32 nColIndex = aColIter - aRowIter->second.begin();
209 for (sal_Int32 i = 1; i < aColIter->nRowSpan; ++i)
210 {
211 (aRowIter+i)->second[nColIndex].nColSpan = nColSpan;
212 }
213 }
214 }
215 }
216 }
217 }
218 }
219 // -----------------------------------------------------------------------------
ORptExport(const Reference<XMultiServiceFactory> & _rxMSF,sal_uInt16 nExportFlag)220 ORptExport::ORptExport(const Reference< XMultiServiceFactory >& _rxMSF,sal_uInt16 nExportFlag)
221 : SvXMLExport( _rxMSF,MAP_100TH_MM,XML_REPORT, EXPORT_OASIS)
222 ,m_bAllreadyFilled(sal_False)
223 {
224 setExportFlags( EXPORT_OASIS | nExportFlag);
225 GetMM100UnitConverter().setCoreMeasureUnit(MAP_100TH_MM);
226 GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM);
227
228 // (getExportFlags() & EXPORT_CONTENT) != 0 ? : XML_N_OOO
229 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE ), XML_NAMESPACE_OFFICE );
230 _GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
231
232 _GetNamespaceMap().Add( GetXMLToken(XML_NP_RPT), GetXMLToken(XML_N_RPT), XML_NAMESPACE_REPORT );
233 _GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG_COMPAT), XML_NAMESPACE_SVG );
234 _GetNamespaceMap().Add( GetXMLToken(XML_NP_FORM), GetXMLToken(XML_N_FORM), XML_NAMESPACE_FORM );
235 _GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW );
236 _GetNamespaceMap().Add( GetXMLToken(XML_NP_TEXT), GetXMLToken(XML_N_TEXT), XML_NAMESPACE_TEXT );
237
238
239 if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS) ) != 0 )
240 _GetNamespaceMap().Add( GetXMLToken(XML_NP_FO), GetXMLToken(XML_N_FO_COMPAT), XML_NAMESPACE_FO );
241
242 if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS) ) != 0 )
243 {
244 _GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
245 }
246 if( (getExportFlags() & EXPORT_SETTINGS) != 0 )
247 {
248 _GetNamespaceMap().Add( GetXMLToken(XML_NP_CONFIG), GetXMLToken(XML_N_CONFIG), XML_NAMESPACE_CONFIG );
249 }
250
251 if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS) ) != 0 )
252 {
253 _GetNamespaceMap().Add( GetXMLToken(XML_NP_STYLE), GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE );
254 }
255 // RDFa: needed for content and header/footer styles
256 if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
257 {
258 _GetNamespaceMap().Add( GetXMLToken(XML_NP_XHTML),GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML );
259 }
260 // GRDDL: to convert RDFa and meta.xml to RDF
261 if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
262 {
263 _GetNamespaceMap().Add( GetXMLToken(XML_NP_GRDDL),GetXMLToken(XML_N_GRDDL), XML_NAMESPACE_GRDDL );
264 }
265
266 _GetNamespaceMap().Add( GetXMLToken(XML_NP_TABLE), GetXMLToken(XML_N_TABLE), XML_NAMESPACE_TABLE );
267 _GetNamespaceMap().Add( GetXMLToken(XML_NP_NUMBER), GetXMLToken(XML_N_NUMBER), XML_NAMESPACE_NUMBER );
268
269 m_sTableStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_STYLE_NAME) );
270 m_sColumnStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_COLUMN) );
271 m_sCellStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_REPORT, GetXMLToken(XML_STYLE_NAME) );
272
273
274 m_xPropHdlFactory = new OXMLRptPropHdlFactory();
275 UniReference < XMLPropertyHandlerFactory> xFac = new ::xmloff::OControlPropertyHandlerFactory();
276 UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper1 = new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(),xFac);
277 UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper2 = new XMLTextPropertySetMapper(TEXT_PROP_MAP_TABLE_DEFAULTS );
278 xTableStylesPropertySetMapper1->AddMapperEntry(xTableStylesPropertySetMapper2);
279
280 m_xTableStylesExportPropertySetMapper = new SvXMLExportPropertyMapper(xTableStylesPropertySetMapper1);
281 //m_xTableStylesExportPropertySetMapper->ChainExportMapper(xTableStylesPropertySetMapper2);
282
283 m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap();
284 m_xCellStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(m_xCellStylesPropertySetMapper);
285 m_xCellStylesExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this));
286
287 UniReference < XMLPropertySetMapper > xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory);
288 m_xColumnStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xColumnStylesPropertySetMapper);
289
290 UniReference < XMLPropertySetMapper > xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory);
291 m_xRowStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xRowStylesPropertySetMapper);
292
293 UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA ));
294 m_xParaPropMapper = new OSpecialHanldeXMLExportPropertyMapper( xPropMapper);
295 // m_xParaPropMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this));
296
297 ::rtl::OUString sFamily( GetXMLToken(XML_PARAGRAPH) );
298 ::rtl::OUString aPrefix( String( 'P' ) );
299 GetAutoStylePool()->AddFamily( XML_STYLE_FAMILY_TEXT_PARAGRAPH, sFamily,
300 m_xParaPropMapper, aPrefix );
301
302 GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_CELL, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME)),
303 m_xCellStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX)));
304 GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_COLUMN, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME)),
305 m_xColumnStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX)));
306 GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_ROW, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_NAME)),
307 m_xRowStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX)));
308 GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_TABLE, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_NAME)),
309 m_xTableStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_PREFIX)));
310 }
311 // -----------------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)312 Reference< XInterface > ORptExport::create(Reference< XComponentContext > const & xContext)
313 {
314 return *(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY)));
315 }
316
317 // -----------------------------------------------------------------------------
getImplementationName_Static()318 ::rtl::OUString ORptExport::getImplementationName_Static( ) throw(uno::RuntimeException)
319 {
320 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.report.ExportFilter"));
321 }
322
323 //--------------------------------------------------------------------------
getImplementationName()324 ::rtl::OUString SAL_CALL ORptExport::getImplementationName( ) throw(uno::RuntimeException)
325 {
326 return getImplementationName_Static();
327 }
328 //--------------------------------------------------------------------------
getSupportedServiceNames_Static()329 uno::Sequence< ::rtl::OUString > ORptExport::getSupportedServiceNames_Static( ) throw(uno::RuntimeException)
330 {
331 uno::Sequence< ::rtl::OUString > aServices(1);
332 aServices.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ExportFilter"));
333
334 return aServices;
335 }
336 //--------------------------------------------------------------------------
getSupportedServiceNames()337 uno::Sequence< ::rtl::OUString > SAL_CALL ORptExport::getSupportedServiceNames( ) throw(uno::RuntimeException)
338 {
339 return getSupportedServiceNames_Static();
340 }
341 //------------------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)342 sal_Bool SAL_CALL ORptExport::supportsService(const ::rtl::OUString& ServiceName) throw( uno::RuntimeException )
343 {
344 return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_Static());
345 }
346 // -----------------------------------------------------------------------------
exportFunctions(const Reference<XIndexAccess> & _xFunctions)347 void ORptExport::exportFunctions(const Reference<XIndexAccess>& _xFunctions)
348 {
349 const sal_Int32 nCount = _xFunctions->getCount();
350 for (sal_Int32 i = 0; i< nCount; ++i)
351 {
352 uno::Reference< report::XFunction> xFunction(_xFunctions->getByIndex(i),uno::UNO_QUERY_THROW);
353 OSL_ENSURE(xFunction.is(),"Function object is NULL!");
354 exportFunction(xFunction);
355 }
356 }
357 // -----------------------------------------------------------------------------
exportFunction(const uno::Reference<XFunction> & _xFunction)358 void ORptExport::exportFunction(const uno::Reference< XFunction>& _xFunction)
359 {
360 exportFormula(XML_FORMULA,_xFunction->getFormula());
361 beans::Optional< ::rtl::OUString> aInitial = _xFunction->getInitialFormula();
362 if ( aInitial.IsPresent && aInitial.Value.getLength() )
363 exportFormula(XML_INITIAL_FORMULA ,aInitial.Value );
364 AddAttribute( XML_NAMESPACE_REPORT, XML_NAME , _xFunction->getName() );
365 if ( _xFunction->getPreEvaluated() )
366 AddAttribute( XML_NAMESPACE_REPORT, XML_PRE_EVALUATED , XML_TRUE );
367 if ( _xFunction->getDeepTraversing() )
368 AddAttribute( XML_NAMESPACE_REPORT, XML_DEEP_TRAVERSING , XML_TRUE );
369
370 SvXMLElementExport aFunction(*this,XML_NAMESPACE_REPORT, XML_FUNCTION, sal_True, sal_True);
371 }
372 // -----------------------------------------------------------------------------
exportMasterDetailFields(const Reference<XReportComponent> & _xReportComponet)373 void ORptExport::exportMasterDetailFields(const Reference<XReportComponent>& _xReportComponet)
374 {
375 const uno::Sequence< ::rtl::OUString> aMasterFields = _xReportComponet->getMasterFields();
376 if ( aMasterFields.getLength() )
377 {
378 SvXMLElementExport aElement(*this,XML_NAMESPACE_REPORT, XML_MASTER_DETAIL_FIELDS, sal_True, sal_True);
379 const uno::Sequence< ::rtl::OUString> aDetailFields = _xReportComponet->getDetailFields();
380
381 OSL_ENSURE(aDetailFields.getLength() == aMasterFields.getLength(),"not equal length for master and detail fields!");
382
383 const ::rtl::OUString* pDetailFieldsIter = aDetailFields.getConstArray();
384 const ::rtl::OUString* pIter = aMasterFields.getConstArray();
385 const ::rtl::OUString* pEnd = pIter + aMasterFields.getLength();
386 for(;pIter != pEnd;++pIter,++pDetailFieldsIter)
387 {
388 AddAttribute( XML_NAMESPACE_REPORT, XML_MASTER , *pIter );
389 if ( pDetailFieldsIter->getLength() )
390 AddAttribute( XML_NAMESPACE_REPORT, XML_DETAIL , *pDetailFieldsIter );
391 SvXMLElementExport aPair(*this,XML_NAMESPACE_REPORT, XML_MASTER_DETAIL_FIELD, sal_True, sal_True);
392 }
393 }
394 }
395 // -----------------------------------------------------------------------------
exportReport(const Reference<XReportDefinition> & _xReportDefinition)396 void ORptExport::exportReport(const Reference<XReportDefinition>& _xReportDefinition)
397 {
398 if ( _xReportDefinition.is() )
399 {
400 exportFunctions(_xReportDefinition->getFunctions().get());
401 exportGroupsExpressionAsFunction(_xReportDefinition->getGroups());
402 //exportMasterDetailFields(_xReportDefinition.get());
403
404 if ( _xReportDefinition->getReportHeaderOn() )
405 {
406 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_REPORT_HEADER, sal_True, sal_True);
407 exportSection(_xReportDefinition->getReportHeader());
408 } // if ( _xReportDefinition->getReportHeaderOn() )
409 if ( _xReportDefinition->getPageHeaderOn() )
410 {
411 ::rtl::OUStringBuffer sValue;
412 sal_uInt16 nRet = _xReportDefinition->getPageHeaderOption();
413 const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetReportPrintOptions();
414 if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) )
415 AddAttribute(XML_NAMESPACE_REPORT, XML_PAGE_PRINT_OPTION,sValue.makeStringAndClear());
416
417 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_PAGE_HEADER, sal_True, sal_True);
418 exportSection(_xReportDefinition->getPageHeader(),true);
419 } // if ( _xReportDefinition->getPageHeaderOn() )
420
421 exportGroup(_xReportDefinition,0);
422
423 if ( _xReportDefinition->getPageFooterOn() )
424 {
425 ::rtl::OUStringBuffer sValue;
426 sal_uInt16 nRet = _xReportDefinition->getPageFooterOption();
427 const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetReportPrintOptions();
428 if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) )
429 AddAttribute(XML_NAMESPACE_REPORT, XML_PAGE_PRINT_OPTION,sValue.makeStringAndClear());
430 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_PAGE_FOOTER, sal_True, sal_True);
431 exportSection(_xReportDefinition->getPageFooter(),true);
432 } // if ( _xReportDefinition->getPageFooterOn() )
433 if ( _xReportDefinition->getReportFooterOn() )
434 {
435 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_REPORT_FOOTER, sal_True, sal_True);
436 exportSection(_xReportDefinition->getReportFooter());
437 } // if ( _xReportDefinition->getReportFooterOn() )
438 }
439 }
440 // -----------------------------------------------------------------------------
exportComponent(const Reference<XReportComponent> & _xReportComponent)441 void ORptExport::exportComponent(const Reference<XReportComponent>& _xReportComponent)
442 {
443 OSL_ENSURE(_xReportComponent.is(),"No component interface!");
444 if ( !_xReportComponent.is() )
445 return;
446
447 AddAttribute(XML_NAMESPACE_DRAW, XML_NAME,_xReportComponent->getName());
448
449 SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_REPORT_COMPONENT, sal_False, sal_False);
450 }
451 // -----------------------------------------------------------------------------
exportFormatConditions(const Reference<XReportControlModel> & _xReportElement)452 void ORptExport::exportFormatConditions(const Reference<XReportControlModel>& _xReportElement)
453 {
454 OSL_ENSURE(_xReportElement.is(),"_xReportElement is NULL -> GPF");
455 ::rtl::OUString sDataField = convertFormula(_xReportElement->getDataField());
456 const sal_Int32 nCount = _xReportElement->getCount();
457 try
458 {
459 for (sal_Int32 i = 0; i < nCount ; ++i)
460 {
461 uno::Reference< report::XFormatCondition > xCond(_xReportElement->getByIndex(i),uno::UNO_QUERY);
462 if ( !xCond->getEnabled() )
463 AddAttribute(XML_NAMESPACE_REPORT, XML_ENABLED,XML_FALSE);
464
465 AddAttribute(XML_NAMESPACE_REPORT, XML_FORMULA,xCond->getFormula());
466
467 exportStyleName(xCond.get(),GetAttrList(),m_sCellStyle);
468 SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_FORMAT_CONDITION, sal_True, sal_True);
469 } // for (sal_Int32 i = 0; i < nCount ; ++i)
470 }
471 catch(uno::Exception&)
472 {
473 OSL_ENSURE(0,"Can not access format condition!");
474 }
475 }
476 // -----------------------------------------------------------------------------
exportReportElement(const Reference<XReportControlModel> & _xReportElement)477 void ORptExport::exportReportElement(const Reference<XReportControlModel>& _xReportElement)
478 {
479 OSL_ENSURE(_xReportElement.is(),"_xReportElement is NULL -> GPF");
480 if ( _xReportElement->getPrintWhenGroupChange() )
481 AddAttribute(XML_NAMESPACE_REPORT, XML_PRINT_ONLY_WHEN_GROUP_CHANGE, XML_TRUE );
482
483 if ( !_xReportElement->getPrintRepeatedValues() )
484 AddAttribute(XML_NAMESPACE_REPORT, XML_PRINT_REPEATED_VALUES,XML_FALSE);
485
486 SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_REPORT_ELEMENT, sal_True, sal_True);
487 if ( _xReportElement->getCount() )
488 {
489 exportFormatConditions(_xReportElement);
490 }
491
492 ::rtl::OUString sExpr = _xReportElement->getConditionalPrintExpression();
493 if ( sExpr.getLength() )
494 {
495 exportFormula(XML_FORMULA,sExpr);
496 SvXMLElementExport aPrintExpr(*this,XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION, sal_True, sal_True);
497 } // if ( sExpr.getLength() )
498
499 // only export when parent exists
500 uno::Reference< report::XSection> xParent(_xReportElement->getParent(),uno::UNO_QUERY);
501 if ( xParent.is() )
502 exportComponent(_xReportElement.get());
503 }
504 // -----------------------------------------------------------------------------
lcl_calculate(const::std::vector<sal_Int32> & _aPosX,const::std::vector<sal_Int32> & _aPosY,ORptExport::TGrid & _rColumns)505 void lcl_calculate(const ::std::vector<sal_Int32>& _aPosX,const ::std::vector<sal_Int32>& _aPosY,ORptExport::TGrid& _rColumns)
506 {
507 sal_Int32 nCountX = _aPosX.size() - 1;
508 sal_Int32 nCountY = _aPosY.size() - 1;
509 for (sal_Int32 j = 0; j < nCountY; ++j)
510 {
511 sal_Int32 nHeight = _aPosY[j+1] - _aPosY[j];
512 if ( nHeight )
513 for (sal_Int32 i = 0; i < nCountX ; ++i)
514 {
515 _rColumns[j].second[i] = ORptExport::TCell(_aPosX[i+1] - _aPosX[i],nHeight,1,1);
516 _rColumns[j].second[i].bSet = sal_True;
517 }
518 }
519 }
520 // -----------------------------------------------------------------------------
collectStyleNames(sal_Int32 _nFamily,const::std::vector<sal_Int32> & _aSize,ORptExport::TStringVec & _rStyleNames)521 void ORptExport::collectStyleNames(sal_Int32 _nFamily,const ::std::vector< sal_Int32>& _aSize, ORptExport::TStringVec& _rStyleNames)
522 {
523 ::std::vector< XMLPropertyState > aPropertyStates;
524 aPropertyStates.push_back(XMLPropertyState(0));
525 ::std::vector<sal_Int32>::const_iterator aIter = _aSize.begin();
526 ::std::vector<sal_Int32>::const_iterator aIter2 = aIter + 1;
527 ::std::vector<sal_Int32>::const_iterator aEnd = _aSize.end();
528 for (;aIter2 != aEnd ; ++aIter,++aIter2)
529 {
530 sal_Int32 nValue = static_cast<sal_Int32>(*aIter2 - *aIter);
531 aPropertyStates[0].maValue <<= nValue;
532 _rStyleNames.push_back(GetAutoStylePool()->Add(_nFamily, aPropertyStates ));
533 }
534 }
535 // -----------------------------------------------------------------------------
exportSectionAutoStyle(const Reference<XSection> & _xProp)536 void ORptExport::exportSectionAutoStyle(const Reference<XSection>& _xProp)
537 {
538 OSL_ENSURE(_xProp != NULL,"Section is NULL -> GPF");
539 exportAutoStyle(_xProp);
540
541 Reference<XReportDefinition> xReport = _xProp->getReportDefinition();
542 const awt::Size aSize = rptui::getStyleProperty<awt::Size>(xReport,PROPERTY_PAPERSIZE);
543 const sal_Int32 nOffset = rptui::getStyleProperty<sal_Int32>(xReport,PROPERTY_LEFTMARGIN);
544 const sal_Int32 nCount = _xProp->getCount();
545
546 ::std::vector<sal_Int32> aColumnPos;
547 aColumnPos.reserve(2*(nCount + 1));
548 aColumnPos.push_back(nOffset);
549 aColumnPos.push_back(aSize.Width - rptui::getStyleProperty<sal_Int32>(xReport,PROPERTY_RIGHTMARGIN));
550
551 ::std::vector<sal_Int32> aRowPos;
552 aRowPos.reserve(2*(nCount + 1));
553 aRowPos.push_back(0);
554 aRowPos.push_back(_xProp->getHeight());
555
556 sal_Int32 i;
557 for (i = 0 ; i< nCount ; ++i)
558 {
559 Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY);
560 uno::Reference< XShape> xShape(xReportElement,uno::UNO_QUERY);
561 if ( xShape.is() )
562 continue;
563 OSL_ENSURE( xReportElement.is(),"NULL Element in Section!" );
564 if ( !xReportElement.is() )
565 continue;
566 sal_Int32 nX = xReportElement->getPositionX();
567 aColumnPos.push_back(nX);
568 Reference<XFixedLine> xFixedLine(xReportElement,uno::UNO_QUERY);
569 if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical
570 {
571 sal_Int32 nWidth = static_cast<sal_Int32>(xReportElement->getWidth()*0.5);
572 nX += nWidth;
573 aColumnPos.push_back(nX);
574 nX += xReportElement->getWidth() - nWidth;
575 }
576 else
577 nX += xReportElement->getWidth();
578 aColumnPos.push_back(nX); // --nX why?
579
580 sal_Int32 nY = xReportElement->getPositionY();
581 aRowPos.push_back(nY);
582 nY += xReportElement->getHeight();
583 aRowPos.push_back(nY); // --nY why?
584 }
585
586 ::std::sort(aColumnPos.begin(),aColumnPos.end(),::std::less<sal_Int32>());
587 aColumnPos.erase(::std::unique(aColumnPos.begin(),aColumnPos.end()),aColumnPos.end());
588
589 ::std::sort(aRowPos.begin(),aRowPos.end(),::std::less<sal_Int32>());
590 aRowPos.erase(::std::unique(aRowPos.begin(),aRowPos.end()),aRowPos.end());
591
592 TSectionsGrid::iterator aInsert = m_aSectionsGrid.insert(
593 TSectionsGrid::value_type(
594 _xProp.get(),
595 TGrid(aRowPos.size() - 1,TGrid::value_type(sal_False,TRow(aColumnPos.size() - 1)))
596 )
597 ).first;
598 lcl_calculate(aColumnPos,aRowPos,aInsert->second);
599
600 TGridStyleMap::iterator aPos = m_aColumnStyleNames.insert(TGridStyleMap::value_type(_xProp.get(),TStringVec())).first;
601 collectStyleNames(XML_STYLE_FAMILY_TABLE_COLUMN,aColumnPos,aPos->second);
602 aPos = m_aRowStyleNames.insert(TGridStyleMap::value_type(_xProp.get(),TStringVec())).first;
603 collectStyleNames(XML_STYLE_FAMILY_TABLE_ROW,aRowPos,aPos->second);
604
605 sal_Int32 x1 = 0;
606 sal_Int32 y1 = 0;
607 sal_Int32 x2 = 0;
608 sal_Int32 y2 = 0;
609 sal_Int32 xi = 0;
610 sal_Int32 yi = 0;
611 bool isOverlap = false;
612
613 for (i = 0 ; i< nCount ; ++i)
614 {
615 Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY);
616 uno::Reference< XShape> xShape(xReportElement,uno::UNO_QUERY);
617 if ( xShape.is() )
618 continue;
619 sal_Int32 nPos = xReportElement->getPositionX();
620 x1 = (::std::find(aColumnPos.begin(),aColumnPos.end(),nPos) - aColumnPos.begin());
621 Reference<XFixedLine> xFixedLine(xReportElement,uno::UNO_QUERY);
622 if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical
623 nPos += static_cast<sal_Int32>(xReportElement->getWidth()*0.5);
624 else
625 nPos += xReportElement->getWidth(); // -1 why
626 x2 = (::std::find(aColumnPos.begin(),aColumnPos.end(),nPos) - aColumnPos.begin());
627
628 nPos = xReportElement->getPositionY();
629 y1 = (::std::find(aRowPos.begin(),aRowPos.end(),nPos) - aRowPos.begin());
630 nPos += xReportElement->getHeight(); // -1 why?
631 y2 = (::std::find(aRowPos.begin(),aRowPos.end(),nPos) - aRowPos.begin());
632
633 isOverlap = false;
634 yi = y1;
635 while(yi < y2 && !isOverlap) // find overlapping controls
636 {
637 xi = x1;
638 while(xi < x2 && !isOverlap)
639 {
640 if ( aInsert->second[yi].second[xi].xElement.is() )
641 {
642 isOverlap = true;
643 }
644 ++xi;
645 }
646 ++yi;
647 }
648
649 if (!isOverlap)
650 {
651 yi = y1;
652 while(yi < y2)
653 {
654 xi = x1;
655 while(xi < x2)
656 {
657 aInsert->second[yi].second[xi] = TCell();
658 ++xi;
659 }
660 aInsert->second[yi].first = sal_True;
661 ++yi;
662 }
663
664 if (x2 - x1 != 0 && y2 - y1 != 0)
665 {
666 awt::Size aElementSize = xReportElement->getSize();
667 if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical
668 aElementSize.Width = static_cast<sal_Int32>(xFixedLine->getWidth()*0.5);
669
670 sal_Int32 nColSpan = x2 - x1;
671 sal_Int32 nRowSpan = y2 - y1;
672 aInsert->second[y1].second[x1] =
673 TCell(
674 aElementSize.Width , // -1 why?
675 aElementSize.Height, // -1 why?
676 nColSpan,
677 nRowSpan,
678 xReportElement
679 );
680 }
681 }
682 }
683
684 lcl_adjustColumnSpanOverRows(m_aSectionsGrid);
685 exportReportComponentAutoStyles(_xProp);
686 }
687 // -----------------------------------------------------------------------------
exportReportComponentAutoStyles(const Reference<XSection> & _xProp)688 void ORptExport::exportReportComponentAutoStyles(const Reference<XSection>& _xProp)
689 {
690 const sal_Int32 nCount = _xProp->getCount();
691 for (sal_Int32 i = 0 ; i< nCount ; ++i)
692 {
693 const Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY);
694 const Reference< report::XShape > xShape(xReportElement,uno::UNO_QUERY);
695 if ( xShape.is() )
696 {
697 UniReference< XMLShapeExport > xShapeExport = GetShapeExport();
698 xShapeExport->seekShapes(_xProp.get());
699 vos::OGuard aGuard(Application::GetSolarMutex());
700 xShapeExport->collectShapeAutoStyles(xShape.get());
701 }
702 else
703 {
704 exportAutoStyle(xReportElement.get());
705
706 Reference<XFormattedField> xFormattedField(xReportElement,uno::UNO_QUERY);
707 if ( xFormattedField.is() )
708 {
709 try
710 {
711 const sal_Int32 nFormatCount = xFormattedField->getCount();
712 for (sal_Int32 j = 0; j < nFormatCount ; ++j)
713 {
714 uno::Reference< report::XFormatCondition > xCond(xFormattedField->getByIndex(j),uno::UNO_QUERY);
715 exportAutoStyle(xCond.get(),xFormattedField);
716 } // for (sal_Int32 j = 0; j < nCount ; ++j)
717 }
718 catch(uno::Exception&)
719 {
720 OSL_ENSURE(0,"Can not access format condition!");
721 }
722 }
723 }
724 }
725 }
726 // -----------------------------------------------------------------------------
exportSection(const Reference<XSection> & _xSection,bool bHeader)727 void ORptExport::exportSection(const Reference<XSection>& _xSection,bool bHeader)
728 {
729 OSL_ENSURE(_xSection.is(),"Section is NULL -> GPF");
730 ::rtl::OUStringBuffer sValue;
731 AddAttribute(XML_NAMESPACE_TABLE, XML_NAME,_xSection->getName());
732
733 if ( !_xSection->getVisible() )
734 AddAttribute(XML_NAMESPACE_REPORT, XML_VISIBLE,XML_FALSE);
735
736 if ( !bHeader )
737 {
738 sal_uInt16 nRet = _xSection->getForceNewPage();
739 const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetForceNewPageOptions();
740 if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) )
741 AddAttribute(XML_NAMESPACE_REPORT, XML_FORCE_NEW_PAGE,sValue.makeStringAndClear());
742
743 nRet = _xSection->getNewRowOrCol();
744 if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) )
745 AddAttribute(XML_NAMESPACE_REPORT, XML_FORCE_NEW_COLUMN,sValue.makeStringAndClear());
746 if ( _xSection->getKeepTogether() )
747 AddAttribute(XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER, XML_TRUE );
748 }
749
750 exportStyleName(_xSection.get(),GetAttrList(),m_sTableStyle);
751
752 /// TODO export as table layout
753 SvXMLElementExport aComponents(*this,XML_NAMESPACE_TABLE, XML_TABLE, sal_True, sal_True);
754
755 ::rtl::OUString sExpr = _xSection->getConditionalPrintExpression();
756 if ( sExpr.getLength() )
757 {
758 exportFormula(XML_FORMULA,sExpr);
759 SvXMLElementExport aPrintExpr(*this,XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION, sal_True, sal_False);
760 }
761
762 exportContainer(_xSection);
763 }
764 // -----------------------------------------------------------------------------
exportTableColumns(const Reference<XSection> & _xSection)765 void ORptExport::exportTableColumns(const Reference< XSection>& _xSection)
766 {
767 SvXMLElementExport aColumns(*this,XML_NAMESPACE_TABLE, XML_TABLE_COLUMNS, sal_True, sal_True);
768 TGridStyleMap::iterator aColFind = m_aColumnStyleNames.find(_xSection.get());
769 OSL_ENSURE(aColFind != m_aColumnStyleNames.end(),"ORptExport::exportTableColumns: Section not found in m_aColumnStyleNames!");
770 if ( aColFind == m_aColumnStyleNames.end() )
771 return;
772
773 TStringVec::iterator aColIter = aColFind->second.begin();
774 TStringVec::iterator aColEnd = aColFind->second.end();
775 for (; aColIter != aColEnd; ++aColIter)
776 {
777 AddAttribute( m_sTableStyle,*aColIter );
778 SvXMLElementExport aColumn(*this,XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True);
779 }
780 }
781 // -----------------------------------------------------------------------------
exportContainer(const Reference<XSection> & _xSection)782 void ORptExport::exportContainer(const Reference< XSection>& _xSection)
783 {
784 OSL_ENSURE(_xSection.is(),"Section is NULL -> GPF");
785
786 exportTableColumns(_xSection);
787
788 TSectionsGrid::iterator aFind = m_aSectionsGrid.find(_xSection.get());
789 OSL_ENSURE(aFind != m_aSectionsGrid.end(),"ORptExport::exportContainer: Section not found in grid!");
790 if ( aFind == m_aSectionsGrid.end() )
791 return;
792 TGrid::iterator aRowIter = aFind->second.begin();
793 TGrid::iterator aRowEnd = aFind->second.end();
794
795 sal_Int32 nEmptyCellColSpan = 0;
796 TGridStyleMap::iterator aRowFind = m_aRowStyleNames.find(_xSection.get());
797 TStringVec::iterator aHeightIter = aRowFind->second.begin();
798 OSL_ENSURE(aRowFind->second.size() == aFind->second.size(),"Different count for rows");
799
800 bool bShapeHandled = false;
801 ::std::map<sal_Int32,sal_Int32> aRowSpan;
802 for (sal_Int32 j = 0; aRowIter != aRowEnd; ++aRowIter,++j,++aHeightIter)
803 {
804 AddAttribute( m_sTableStyle,*aHeightIter );
805 SvXMLElementExport aRow(*this,XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True);
806 if ( aRowIter->first )
807 {
808 ::std::vector< TCell >::iterator aColIter = aRowIter->second.begin();
809 ::std::vector< TCell >::iterator aColEnd = aRowIter->second.end();
810 nEmptyCellColSpan = 0;
811 for (; aColIter != aColEnd; ++aColIter)
812 {
813 sal_Bool bCoveredCell = sal_False;
814 sal_Int32 nColSpan = 0;
815 sal_Int32 nColIndex = aColIter - aRowIter->second.begin();
816 ::std::map<sal_Int32,sal_Int32>::iterator aRowSpanFind = aRowSpan.find(nColIndex);
817 if ( aRowSpanFind != aRowSpan.end() )
818 {
819 #if OSL_DEBUG_LEVEL > 0
820 sal_Int32 nRowSpan = aRowSpanFind->second;
821 nRowSpan = nRowSpan;
822 sal_Int32 nColSpanTemp = aColIter->nColSpan;
823 (void) nColSpanTemp;
824 #endif
825 nColSpan = 1;
826 if ( !--(aRowSpanFind->second) )
827 aRowSpan.erase(aRowSpanFind);
828
829 if ( aColIter->nColSpan > 1 )
830 nColSpan += aColIter->nColSpan - 1;
831
832 bCoveredCell = sal_True;
833 aColIter = aColIter + (aColIter->nColSpan - 1);
834 }
835 else if ( aColIter->bSet )
836 {
837 if ( nEmptyCellColSpan > 0 )
838 {
839 AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) );
840 bCoveredCell = sal_True;
841 nColSpan = nEmptyCellColSpan - 1;
842 nEmptyCellColSpan = 0;
843 }
844 sal_Int32 nSpan = aColIter->nColSpan;
845 if ( nSpan > 1 )
846 {
847 AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nSpan) );
848 nColSpan = nSpan - 1;
849 bCoveredCell = sal_True;
850 }
851 nSpan = aColIter->nRowSpan;
852 if ( nSpan > 1 )
853 {
854 AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_ROWS_SPANNED,implConvertNumber(nSpan) );
855 aRowSpan[nColIndex] = nSpan - 1;
856 }
857 if ( aColIter->xElement.is() )
858 exportStyleName(aColIter->xElement.get(),GetAttrList(),m_sTableStyle);
859
860 // start <table:table-cell>
861 Reference<XFormattedField> xFormattedField(aColIter->xElement,uno::UNO_QUERY);
862 if ( xFormattedField.is() )
863 {
864 sal_Int32 nFormatKey = xFormattedField->getFormatKey();
865 if ( 0 != nFormatKey )
866 {
867 XMLNumberFormatAttributesExportHelper aHelper(GetNumberFormatsSupplier(),*this);
868 sal_Bool bIsStandard = sal_False;
869 ::rtl::OUString sEmpty;
870 if ( util::NumberFormat::TEXT == aHelper.GetCellType(nFormatKey,bIsStandard) )
871 aHelper.SetNumberFormatAttributes(sEmpty, sEmpty);
872 else
873 aHelper.SetNumberFormatAttributes(nFormatKey, 0.0,sal_False);
874 }
875 }
876 SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_False);
877
878 if ( aColIter->xElement.is() )
879 {
880 // start <text:p>
881 SvXMLElementExport aParagraphContent(*this,XML_NAMESPACE_TEXT, XML_P, sal_True,sal_False);
882 Reference<XServiceInfo> xElement(aColIter->xElement,uno::UNO_QUERY);
883 Reference<XReportComponent> xReportComponent = aColIter->xElement;
884
885 if ( !bShapeHandled )
886 {
887 bShapeHandled = true;
888 exportShapes(_xSection,false);
889 }
890 uno::Reference< XShape > xShape(xElement,uno::UNO_QUERY);
891 uno::Reference< XFixedLine > xFixedLine(xElement,uno::UNO_QUERY);
892 if ( !xShape.is() && !xFixedLine.is() )
893 {
894 Reference<XReportControlModel> xReportElement(xElement,uno::UNO_QUERY);
895 Reference<XReportDefinition> xReportDefinition(xElement,uno::UNO_QUERY);
896 Reference< XImageControl > xImage(xElement,uno::UNO_QUERY);
897 Reference<XSection> xSection(xElement,uno::UNO_QUERY);
898
899 XMLTokenEnum eToken = XML_SECTION;
900 sal_Bool bExportData = sal_False;
901 if ( xElement->supportsService(SERVICE_FIXEDTEXT) )
902 {
903 eToken = XML_FIXED_CONTENT;
904 }
905 else if ( xElement->supportsService(SERVICE_FORMATTEDFIELD) )
906 {
907 eToken = XML_FORMATTED_TEXT;
908 bExportData = sal_True;
909 }
910 else if ( xElement->supportsService(SERVICE_IMAGECONTROL) )
911 {
912 eToken = XML_IMAGE;
913 ::rtl::OUString sTargetLocation = xImage->getImageURL();
914 if ( sTargetLocation.getLength() )
915 {
916 sTargetLocation = GetRelativeReference(sTargetLocation);
917 AddAttribute(XML_NAMESPACE_FORM, XML_IMAGE_DATA,sTargetLocation);
918 }
919 bExportData = sal_True;
920 ::rtl::OUStringBuffer sValue;
921 const SvXMLEnumMapEntry* aXML_ImageScaleEnumMap = OXMLHelper::GetImageScaleOptions();
922 if ( SvXMLUnitConverter::convertEnum( sValue, xImage->getScaleMode(),aXML_ImageScaleEnumMap ) )
923 AddAttribute(XML_NAMESPACE_REPORT, XML_SCALE, sValue.makeStringAndClear() );
924 }
925 else if ( xReportDefinition.is() )
926 {
927 eToken = XML_SUB_DOCUMENT;
928 }
929 else if ( xSection.is() )
930 {
931 }
932
933 bool bPageSet = false;
934 if ( bExportData )
935 {
936 bPageSet = exportFormula(XML_FORMULA,xReportElement->getDataField());
937 if ( bPageSet )
938 eToken = XML_FIXED_CONTENT;
939 else if ( eToken == XML_IMAGE )
940 AddAttribute(XML_NAMESPACE_REPORT, XML_PRESERVE_IRI, xImage->getPreserveIRI() ? XML_TRUE : XML_FALSE );
941 }
942
943 //if ( !bPageSet )
944 {
945 // start <report:eToken>
946 SvXMLElementExport aComponents(*this,XML_NAMESPACE_REPORT, eToken, sal_False, sal_False);
947 if ( eToken == XML_FIXED_CONTENT )
948 exportParagraph(xReportElement);
949 if ( xReportElement.is() )
950 exportReportElement(xReportElement);
951
952 if ( eToken == XML_GROUP && xSection.is() )
953 exportContainer(xSection);
954 else if ( eToken == XML_SUB_DOCUMENT && xReportDefinition.is() )
955 {
956 SvXMLElementExport aOfficeElement( *this, XML_NAMESPACE_OFFICE, XML_BODY,sal_True, sal_True );
957 SvXMLElementExport aElem( *this, sal_True,
958 XML_NAMESPACE_OFFICE, XML_REPORT,
959 sal_True, sal_True );
960
961 exportReportAttributes(xReportDefinition);
962 exportReport(xReportDefinition);
963 }
964 else if ( xSection.is() )
965 exportSection(xSection);
966 }
967 }
968 } // if ( aColIter->xElement.is() )
969 else if ( !bShapeHandled )
970 {
971 bShapeHandled = true;
972 exportShapes(_xSection);
973 }
974 aColIter = aColIter + (aColIter->nColSpan - 1);
975 }
976 else
977 ++nEmptyCellColSpan;
978 if ( bCoveredCell )
979 {
980 for (sal_Int32 k = 0; k < nColSpan; ++k)
981 {
982 SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True);
983 }
984
985 }
986 } // for (sal_Int32 i = 0 ; i< nCount ; ++i)
987 if ( nEmptyCellColSpan )
988 {
989 {
990 AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) );
991 SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True);
992 if ( !bShapeHandled )
993 {
994 bShapeHandled = true;
995 exportShapes(_xSection);
996 }
997 }
998 for (sal_Int32 k = 0; k < nEmptyCellColSpan; ++k)
999 {
1000 SvXMLElementExport aCoveredCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True);
1001 }
1002 nEmptyCellColSpan = 0;
1003 }
1004 }
1005 else
1006 { // empty rows
1007 nEmptyCellColSpan = aRowIter->second.size();
1008 if ( nEmptyCellColSpan )
1009 {
1010 {
1011 AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) );
1012 SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True);
1013 if ( !bShapeHandled )
1014 {
1015 bShapeHandled = true;
1016 exportShapes(_xSection);
1017 }
1018 }
1019 for (sal_Int32 k = 1; k < nEmptyCellColSpan; ++k)
1020 {
1021 SvXMLElementExport aCoveredCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True);
1022 }
1023 nEmptyCellColSpan = 0;
1024 }
1025 }
1026 }
1027 }
1028 // -----------------------------------------------------------------------------
convertFormula(const::rtl::OUString & _sFormula)1029 ::rtl::OUString ORptExport::convertFormula(const ::rtl::OUString& _sFormula)
1030 {
1031 ::rtl::OUString sFormula = _sFormula;
1032 if ( _sFormula.equalsAsciiL("rpt:",4) )
1033 sFormula = ::rtl::OUString();
1034 //sal_Int32 nLength = _sFormula.getLength();
1035 //if ( nLength )
1036 //{
1037 // sal_Int32 nPos = 0;
1038 // if ( _sFormula.matchAsciiL("=",1) != 0 )
1039 // {
1040 // nPos = 1;
1041 // --nLength;
1042 // }
1043 // bool bFormula = _sFormula.indexOf('[') != -1 || _sFormula.indexOf('(') != -1;
1044 // if ( bFormula )
1045 // sFormula = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:")) + _sFormula.copy(nPos,nLength);
1046 // else
1047 // sFormula = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("field:[")) + _sFormula.copy(nPos,nLength) + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]"));;
1048 //}
1049 return sFormula;
1050 }
1051 // -----------------------------------------------------------------------------
exportFormula(enum::xmloff::token::XMLTokenEnum eName,const::rtl::OUString & _sFormula)1052 bool ORptExport::exportFormula(enum ::xmloff::token::XMLTokenEnum eName,const ::rtl::OUString& _sFormula)
1053 {
1054 const ::rtl::OUString sFieldData = convertFormula(_sFormula);
1055 static const ::rtl::OUString s_sPageNumber(RTL_CONSTASCII_USTRINGPARAM("PageNumber()"));
1056 static const ::rtl::OUString s_sPageCount(RTL_CONSTASCII_USTRINGPARAM("PageCount()"));
1057 sal_Int32 nPageNumberIndex = sFieldData.indexOf(s_sPageNumber);
1058 sal_Int32 nPageCountIndex = sFieldData.indexOf(s_sPageCount);
1059 bool bRet = nPageNumberIndex != -1 || nPageCountIndex != -1;
1060 if ( !bRet )
1061 AddAttribute(XML_NAMESPACE_REPORT, eName,sFieldData);
1062
1063 return bRet;
1064 }
1065 // -----------------------------------------------------------------------------
exportStyleName(XPropertySet * _xProp,SvXMLAttributeList & _rAtt,const::rtl::OUString & _sName)1066 void ORptExport::exportStyleName(XPropertySet* _xProp,SvXMLAttributeList& _rAtt,const ::rtl::OUString& _sName)
1067 {
1068 Reference<XPropertySet> xFind(_xProp);
1069 TPropertyStyleMap::iterator aFind = m_aAutoStyleNames.find(xFind);
1070 if ( aFind != m_aAutoStyleNames.end() )
1071 {
1072 _rAtt.AddAttribute( _sName,
1073 aFind->second );
1074 m_aAutoStyleNames.erase(aFind);
1075 }
1076 }
1077 // -----------------------------------------------------------------------------
exportGroup(const Reference<XReportDefinition> & _xReportDefinition,sal_Int32 _nPos,sal_Bool _bExportAutoStyle)1078 sal_Bool ORptExport::exportGroup(const Reference<XReportDefinition>& _xReportDefinition,sal_Int32 _nPos,sal_Bool _bExportAutoStyle)
1079 {
1080 sal_Bool bGroupExported = sal_False;
1081 if ( _xReportDefinition.is() )
1082 {
1083 Reference< XGroups > xGroups = _xReportDefinition->getGroups();
1084 if ( xGroups.is() )
1085 {
1086 sal_Int32 nCount = xGroups->getCount();
1087 if ( _nPos >= 0 && _nPos < nCount )
1088 {
1089 bGroupExported = sal_True;
1090 Reference<XGroup> xGroup(xGroups->getByIndex(_nPos),uno::UNO_QUERY);
1091 OSL_ENSURE(xGroup.is(),"No Group prepare for GPF");
1092 if ( _bExportAutoStyle )
1093 {
1094 if ( xGroup->getHeaderOn() )
1095 exportSectionAutoStyle(xGroup->getHeader());
1096 exportGroup(_xReportDefinition,_nPos+1,_bExportAutoStyle);
1097 if ( xGroup->getFooterOn() )
1098 exportSectionAutoStyle(xGroup->getFooter());
1099 }
1100 else
1101 {
1102 if ( xGroup->getSortAscending() )
1103 AddAttribute(XML_NAMESPACE_REPORT, XML_SORT_ASCENDING, XML_TRUE );
1104
1105 if ( xGroup->getStartNewColumn() )
1106 AddAttribute(XML_NAMESPACE_REPORT, XML_START_NEW_COLUMN, XML_TRUE);
1107 if ( xGroup->getResetPageNumber() )
1108 AddAttribute(XML_NAMESPACE_REPORT, XML_RESET_PAGE_NUMBER, XML_TRUE );
1109
1110 ::rtl::OUString sExpression = xGroup->getExpression();
1111 if ( sExpression.getLength() )
1112 {
1113 static ::rtl::OUString s_sQuote(RTL_CONSTASCII_USTRINGPARAM("\"\""));
1114 sal_Int32 nIndex = sExpression.indexOf('"');
1115 while ( nIndex > -1 )
1116 {
1117 sExpression = sExpression.replaceAt(nIndex,1,s_sQuote);
1118 nIndex = sExpression.indexOf('"',nIndex+2);
1119 }
1120 ::rtl::OUString sFormula(RTL_CONSTASCII_USTRINGPARAM("rpt:HASCHANGED(\""));
1121
1122 TGroupFunctionMap::iterator aGroupFind = m_aGroupFunctionMap.find(xGroup);
1123 if ( aGroupFind != m_aGroupFunctionMap.end() )
1124 sExpression = aGroupFind->second->getName();
1125 sFormula += sExpression;
1126 sFormula += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\")"));
1127 sExpression = sFormula;
1128 }
1129 AddAttribute(XML_NAMESPACE_REPORT, XML_GROUP_EXPRESSION,sExpression);
1130 sal_Int16 nRet = xGroup->getKeepTogether();
1131 ::rtl::OUStringBuffer sValue;
1132 const SvXMLEnumMapEntry* aXML_KeepTogetherEnumMap = OXMLHelper::GetKeepTogetherOptions();
1133 if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_KeepTogetherEnumMap ) )
1134 AddAttribute(XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER,sValue.makeStringAndClear());
1135
1136 SvXMLElementExport aGroup(*this,XML_NAMESPACE_REPORT, XML_GROUP, sal_True, sal_True);
1137 exportFunctions(xGroup->getFunctions().get());
1138 if ( xGroup->getHeaderOn() )
1139 {
1140 Reference<XSection> xSection = xGroup->getHeader();
1141 if ( xSection->getRepeatSection() )
1142 AddAttribute(XML_NAMESPACE_REPORT, XML_REPEAT_SECTION,XML_TRUE );
1143 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_GROUP_HEADER, sal_True, sal_True);
1144 exportSection(xSection);
1145 }
1146 exportGroup(_xReportDefinition,_nPos+1,_bExportAutoStyle);
1147 if ( xGroup->getFooterOn() )
1148 {
1149 Reference<XSection> xSection = xGroup->getFooter();
1150 if ( xSection->getRepeatSection() )
1151 AddAttribute(XML_NAMESPACE_REPORT, XML_REPEAT_SECTION,XML_TRUE );
1152 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_GROUP_FOOTER, sal_True, sal_True);
1153 exportSection(xSection);
1154 } // if ( xGroup->getFooterOn() )
1155 }
1156 }
1157 else if ( _bExportAutoStyle )
1158 {
1159 exportSectionAutoStyle(_xReportDefinition->getDetail());
1160 }
1161 else
1162 {
1163 SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_DETAIL, sal_True, sal_True);
1164 exportSection(_xReportDefinition->getDetail());
1165 }
1166 }
1167 }
1168 return bGroupExported;
1169 }
1170 // -----------------------------------------------------------------------------
exportAutoStyle(XPropertySet * _xProp,const Reference<XFormattedField> & _xParentFormattedField)1171 void ORptExport::exportAutoStyle(XPropertySet* _xProp,const Reference<XFormattedField>& _xParentFormattedField)
1172 {
1173 const uno::Reference<report::XReportControlFormat> xFormat(_xProp,uno::UNO_QUERY);
1174 if ( xFormat.is() )
1175 {
1176 try
1177 {
1178 const awt::FontDescriptor aFont = xFormat->getFontDescriptor();
1179 OSL_ENSURE(aFont.Name.getLength(),"No Font Name !");
1180 GetFontAutoStylePool()->Add(aFont.Name,aFont.StyleName,aFont.Family,aFont.Pitch,aFont.CharSet );
1181 }
1182 catch(beans::UnknownPropertyException&)
1183 {
1184 // not interested in
1185 }
1186 }
1187 const uno::Reference< report::XShape> xShape(_xProp,uno::UNO_QUERY);
1188 if ( xShape.is() )
1189 {
1190 ::std::vector< XMLPropertyState > aPropertyStates( m_xParaPropMapper->Filter(_xProp) );
1191 if ( !aPropertyStates.empty() )
1192 m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( XML_STYLE_FAMILY_TEXT_PARAGRAPH, aPropertyStates )));
1193 }
1194 ::std::vector< XMLPropertyState > aPropertyStates( m_xCellStylesExportPropertySetMapper->Filter(_xProp) );
1195 Reference<XFixedLine> xFixedLine(_xProp,uno::UNO_QUERY);
1196 if ( xFixedLine.is() )
1197 {
1198 uno::Reference<beans::XPropertySet> xBorderProp = OXMLHelper::createBorderPropertySet();
1199 table::BorderLine aValue;
1200 aValue.Color = COL_BLACK;
1201 aValue.InnerLineWidth = aValue.LineDistance = 0;
1202 aValue.OuterLineWidth = 2;
1203
1204 awt::Point aPos = xFixedLine->getPosition();
1205 awt::Size aSize = xFixedLine->getSize();
1206 sal_Int32 nSectionHeight = xFixedLine->getSection()->getHeight();
1207
1208 ::rtl::OUString sBorderProp;
1209 ::std::vector< ::rtl::OUString> aProps;
1210 if ( xFixedLine->getOrientation() == 1 ) // vertical
1211 {
1212 // check if border should be left
1213 if ( !aPos.X )
1214 {
1215 sBorderProp = PROPERTY_BORDERLEFT;
1216 aProps.push_back(PROPERTY_BORDERRIGHT);
1217 }
1218 else
1219 {
1220 sBorderProp = PROPERTY_BORDERRIGHT;
1221 aProps.push_back(PROPERTY_BORDERLEFT);
1222 }
1223 aProps.push_back(PROPERTY_BORDERTOP);
1224 aProps.push_back(PROPERTY_BORDERBOTTOM);
1225 }
1226 else // horizontal
1227 {
1228 // check if border should be bottom
1229 if ( (aPos.Y + aSize.Height) == nSectionHeight )
1230 {
1231 sBorderProp = PROPERTY_BORDERBOTTOM;
1232 aProps.push_back(PROPERTY_BORDERTOP);
1233 }
1234 else
1235 {
1236 sBorderProp = PROPERTY_BORDERTOP;
1237 aProps.push_back(PROPERTY_BORDERBOTTOM);
1238 }
1239 aProps.push_back(PROPERTY_BORDERRIGHT);
1240 aProps.push_back(PROPERTY_BORDERLEFT);
1241 }
1242
1243 xBorderProp->setPropertyValue(sBorderProp,uno::makeAny(aValue));
1244
1245 aValue.Color = aValue.OuterLineWidth = 0;
1246 uno::Any aEmpty;
1247 aEmpty <<= aValue;
1248 ::std::for_each(aProps.begin(),aProps.end(),
1249 ::boost::bind(&beans::XPropertySet::setPropertyValue,xBorderProp,_1,aEmpty));
1250
1251 ::std::vector< XMLPropertyState > aBorderStates(m_xCellStylesExportPropertySetMapper->Filter(xBorderProp));
1252 ::std::copy(aBorderStates.begin(),aBorderStates.end(),::std::back_inserter(aPropertyStates));
1253 }
1254 else
1255 {
1256 //sal_Int32 nTextAlignIndex = m_xCellStylesExportPropertySetMapper->getPropertySetMapper()->FindEntryIndex( CTF_SD_SHAPE_PARA_ADJUST );
1257 //if ( nTextAlignIndex != -1 )
1258 //{
1259 // ::std::vector< XMLPropertyState >::iterator aIter = aPropertyStates.begin();
1260 // ::std::vector< XMLPropertyState >::iterator aEnd = aPropertyStates.end();
1261 // for (; aIter != aEnd; ++aIter)
1262 // {
1263 // if ( aIter->mnIndex == nTextAlignIndex )
1264 // {
1265 // sal_Int16 nTextAlign = 0;
1266 // aIter->maValue >>= nTextAlign;
1267 // switch(nTextAlign)
1268 // {
1269 // case awt::TextAlign::LEFT:
1270 // nTextAlign = style::ParagraphAdjust_LEFT;
1271 // break;
1272 // case awt::TextAlign::CENTER:
1273 // nTextAlign = style::ParagraphAdjust_CENTER;
1274 // break;
1275 // case awt::TextAlign::RIGHT:
1276 // nTextAlign = style::ParagraphAdjust_RIGHT;
1277 // break;
1278 // default:
1279 // OSL_ENSURE(0,"Illegal text alignment value!");
1280 // break;
1281 // }
1282 // aIter->maValue <<= nTextAlign;
1283 // break;
1284 // }
1285 // }
1286 //}
1287 const Reference<XFormattedField> xFormattedField(_xProp,uno::UNO_QUERY);
1288 if ( (_xParentFormattedField.is() || xFormattedField.is()) && !aPropertyStates.empty() )
1289 {
1290 sal_Int32 nNumberFormat = 0;
1291 if ( _xParentFormattedField.is() )
1292 nNumberFormat = _xParentFormattedField->getFormatKey();
1293 else
1294 nNumberFormat = xFormattedField->getFormatKey();
1295 {
1296 sal_Int32 nStyleMapIndex = m_xCellStylesExportPropertySetMapper->getPropertySetMapper()->FindEntryIndex( CTF_RPT_NUMBERFORMAT );
1297 addDataStyle(nNumberFormat);
1298 XMLPropertyState aNumberStyleState( nStyleMapIndex, uno::makeAny( getDataStyleName(nNumberFormat) ) );
1299 aPropertyStates.push_back( aNumberStyleState );
1300 }
1301 }
1302 }
1303
1304
1305 if ( !aPropertyStates.empty() )
1306 m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( XML_STYLE_FAMILY_TABLE_CELL, aPropertyStates )));
1307 }
1308 // -----------------------------------------------------------------------------
exportAutoStyle(const Reference<XSection> & _xProp)1309 void ORptExport::exportAutoStyle(const Reference<XSection>& _xProp)
1310 {
1311 ::std::vector< XMLPropertyState > aPropertyStates( m_xTableStylesExportPropertySetMapper->Filter(_xProp.get()) );
1312 if ( !aPropertyStates.empty() )
1313 m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp.get(),GetAutoStylePool()->Add( XML_STYLE_FAMILY_TABLE_TABLE, aPropertyStates )));
1314 }
1315 // -----------------------------------------------------------------------------
SetBodyAttributes()1316 void ORptExport::SetBodyAttributes()
1317 {
1318 Reference<XReportDefinition> xProp(getReportDefinition());
1319 exportReportAttributes(xProp);
1320 }
1321 // -----------------------------------------------------------------------------
exportReportAttributes(const Reference<XReportDefinition> & _xReport)1322 void ORptExport::exportReportAttributes(const Reference<XReportDefinition>& _xReport)
1323 {
1324 if ( _xReport.is() )
1325 {
1326 ::rtl::OUStringBuffer sValue;
1327 const SvXMLEnumMapEntry* aXML_CommnadTypeEnumMap = OXMLHelper::GetCommandTypeOptions();
1328 if ( SvXMLUnitConverter::convertEnum( sValue, static_cast<sal_uInt16>(_xReport->getCommandType()),aXML_CommnadTypeEnumMap ) )
1329 AddAttribute(XML_NAMESPACE_REPORT, XML_COMMAND_TYPE,sValue.makeStringAndClear());
1330
1331 ::rtl::OUString sComamnd = _xReport->getCommand();
1332 if ( sComamnd.getLength() )
1333 AddAttribute(XML_NAMESPACE_REPORT, XML_COMMAND, sComamnd);
1334
1335 ::rtl::OUString sFilter( _xReport->getFilter() );
1336 if ( sFilter.getLength() )
1337 AddAttribute( XML_NAMESPACE_REPORT, XML_FILTER, sFilter );
1338
1339 AddAttribute(XML_NAMESPACE_OFFICE, XML_MIMETYPE,_xReport->getMimeType());
1340
1341 sal_Bool bEscapeProcessing( _xReport->getEscapeProcessing() );
1342 if ( !bEscapeProcessing )
1343 AddAttribute( XML_NAMESPACE_REPORT, XML_ESCAPE_PROCESSING, ::xmloff::token::GetXMLToken( XML_FALSE ) );
1344
1345 ::rtl::OUString sName = _xReport->getCaption();
1346 if ( sName.getLength() )
1347 AddAttribute(XML_NAMESPACE_OFFICE, XML_CAPTION,sName);
1348 sName = _xReport->getName();
1349 if ( sName.getLength() )
1350 AddAttribute(XML_NAMESPACE_DRAW, XML_NAME,sName);
1351 }
1352 }
1353 // -----------------------------------------------------------------------------
_ExportContent()1354 void ORptExport::_ExportContent()
1355 {
1356 exportReport(getReportDefinition());
1357 }
1358 // -----------------------------------------------------------------------------
_ExportMasterStyles()1359 void ORptExport::_ExportMasterStyles()
1360 {
1361 GetPageExport()->exportMasterStyles( sal_True );
1362 }
1363 // -----------------------------------------------------------------------------
collectComponentStyles()1364 void ORptExport::collectComponentStyles()
1365 {
1366 if ( m_bAllreadyFilled )
1367 return;
1368
1369 m_bAllreadyFilled = sal_True;
1370 Reference<XReportDefinition> xProp(getReportDefinition());
1371 if ( xProp.is() )
1372 {
1373 uno::Reference< report::XSection> xParent(xProp->getParent(),uno::UNO_QUERY);
1374 if ( xParent.is() )
1375 exportAutoStyle(xProp.get());
1376
1377 if ( xProp->getReportHeaderOn() )
1378 exportSectionAutoStyle(xProp->getReportHeader());
1379 if ( xProp->getPageHeaderOn() )
1380 exportSectionAutoStyle(xProp->getPageHeader());
1381
1382 exportGroup(xProp,0,sal_True);
1383
1384 if ( xProp->getPageFooterOn() )
1385 exportSectionAutoStyle(xProp->getPageFooter());
1386 if ( xProp->getReportFooterOn() )
1387 exportSectionAutoStyle(xProp->getReportFooter());
1388 }
1389 }
1390 // -----------------------------------------------------------------------------
_ExportAutoStyles()1391 void ORptExport::_ExportAutoStyles()
1392 {
1393 // there are no styles that require their own autostyles
1394 if ( getExportFlags() & EXPORT_CONTENT )
1395 {
1396 collectComponentStyles();
1397 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_TABLE
1398 ,GetDocHandler()
1399 ,GetMM100UnitConverter()
1400 ,GetNamespaceMap()
1401 );
1402 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_COLUMN
1403 ,GetDocHandler()
1404 ,GetMM100UnitConverter()
1405 ,GetNamespaceMap()
1406 );
1407 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_ROW
1408 ,GetDocHandler()
1409 ,GetMM100UnitConverter()
1410 ,GetNamespaceMap()
1411 );
1412
1413 GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_CELL
1414 ,GetDocHandler()
1415 ,GetMM100UnitConverter()
1416 ,GetNamespaceMap()
1417 );
1418
1419
1420 /*GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_REPORT_ID
1421 ,GetDocHandler()
1422 ,GetMM100UnitConverter()
1423 ,GetNamespaceMap()
1424 );*/
1425 exportDataStyles();
1426 GetShapeExport()->exportAutoStyles();
1427 }
1428 // exported in _ExportMasterStyles
1429 if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 )
1430 GetPageExport()->collectAutoStyles( sal_False );
1431 if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 )
1432 GetPageExport()->exportAutoStyles();
1433 }
1434 // -----------------------------------------------------------------------------
_ExportStyles(sal_Bool bUsed)1435 void ORptExport::_ExportStyles(sal_Bool bUsed)
1436 {
1437 SvXMLExport::_ExportStyles(bUsed);
1438
1439 // write draw:style-name for object graphic-styles
1440 GetShapeExport()->ExportGraphicDefaults();
1441 }
1442 // -----------------------------------------------------------------------------
exportDoc(enum::xmloff::token::XMLTokenEnum eClass)1443 sal_uInt32 ORptExport::exportDoc(enum ::xmloff::token::XMLTokenEnum eClass)
1444 {
1445 return SvXMLExport::exportDoc( eClass );
1446 }
1447 // -----------------------------------------------------------------------------
implConvertNumber(sal_Int32 _nValue)1448 ::rtl::OUString ORptExport::implConvertNumber(sal_Int32 _nValue)
1449 {
1450 ::rtl::OUStringBuffer aBuffer;
1451 GetMM100UnitConverter().convertNumber(aBuffer, _nValue);
1452 return aBuffer.makeStringAndClear();
1453 }
1454 // -----------------------------------------------------------------------------
GetCellStylePropertyMapper() const1455 UniReference < XMLPropertySetMapper > ORptExport::GetCellStylePropertyMapper() const
1456 {
1457 return m_xCellStylesPropertySetMapper;
1458 }
1459 // -----------------------------------------------------------------------------
CreateAutoStylePool()1460 SvXMLAutoStylePoolP* ORptExport::CreateAutoStylePool()
1461 {
1462 return new OXMLAutoStylePoolP(*this);
1463 }
1464 // -----------------------------------------------------------------------------
setSourceDocument(const Reference<XComponent> & xDoc)1465 void SAL_CALL ORptExport::setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException)
1466 {
1467 m_xReportDefinition.set(xDoc,UNO_QUERY_THROW);
1468 OSL_ENSURE(m_xReportDefinition.is(),"DataSource is NULL!");
1469
1470 SvXMLExport::setSourceDocument(xDoc);
1471 }
1472 // -----------------------------------------------------------------------------
_ExportFontDecls()1473 void ORptExport::_ExportFontDecls()
1474 {
1475 GetFontAutoStylePool(); // make sure the pool is created
1476 collectComponentStyles();
1477 SvXMLExport::_ExportFontDecls();
1478 }
1479 // -----------------------------------------------------------------------------
exportParagraph(const Reference<XReportControlModel> & _xReportElement)1480 void ORptExport::exportParagraph(const Reference< XReportControlModel >& _xReportElement)
1481 {
1482 OSL_PRECOND(_xReportElement.is(),"Element is null!");
1483 // start <text:p>
1484 SvXMLElementExport aParagraphContent(*this,XML_NAMESPACE_TEXT, XML_P, sal_False, sal_False);
1485 if ( Reference<XFormattedField>(_xReportElement,uno::UNO_QUERY).is() )
1486 {
1487 ::rtl::OUString sFieldData = _xReportElement->getDataField();
1488 static const ::rtl::OUString s_sPageNumber(RTL_CONSTASCII_USTRINGPARAM("PageNumber()"));
1489 static const ::rtl::OUString s_sPageCount(RTL_CONSTASCII_USTRINGPARAM("PageCount()"));
1490 static const ::rtl::OUString s_sReportPrefix(RTL_CONSTASCII_USTRINGPARAM("rpt:"));
1491 static const ::rtl::OUString s_sConcatOperator(RTL_CONSTASCII_USTRINGPARAM("&"));
1492 sFieldData = sFieldData.copy(s_sReportPrefix.getLength(),sFieldData.getLength() - s_sReportPrefix.getLength());
1493 sal_Int32 nPageNumberIndex = sFieldData.indexOf(s_sPageNumber);
1494 if ( nPageNumberIndex != -1 )
1495 {
1496 sal_Int32 nIndex = 0;
1497 do
1498 {
1499 ::rtl::OUString sToken = sFieldData.getToken( 0, '&', nIndex );
1500 sToken = sToken.trim();
1501 if ( sToken.getLength() )
1502 {
1503 if ( sToken == s_sPageNumber )
1504 {
1505 static const ::rtl::OUString s_sCurrent(RTL_CONSTASCII_USTRINGPARAM("current"));
1506 AddAttribute(XML_NAMESPACE_TEXT, XML_SELECT_PAGE, s_sCurrent );
1507 SvXMLElementExport aPageNumber(*this,XML_NAMESPACE_TEXT, XML_PAGE_NUMBER, sal_False, sal_False);
1508 Characters(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1")));
1509 }
1510 else if ( sToken == s_sPageCount )
1511 {
1512 SvXMLElementExport aPageNumber(*this,XML_NAMESPACE_TEXT, XML_PAGE_COUNT, sal_False, sal_False);
1513 Characters(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1")));
1514 }
1515 else
1516 {
1517
1518 if ( sToken.indexOf('"') == 0 && sToken.lastIndexOf('"') == sToken.getLength()-1 )
1519 sToken = sToken.copy(1,sToken.getLength()-2);
1520
1521 sal_Bool bPrevCharIsSpace = sal_False;
1522 GetTextParagraphExport()->exportText(sToken,bPrevCharIsSpace);
1523 }
1524 }
1525 }
1526 while ( nIndex >= 0 );
1527 }
1528 }
1529 Reference< XFixedText > xFT(_xReportElement,UNO_QUERY);
1530 if ( xFT.is() )
1531 {
1532 ::rtl::OUString sExpr = xFT->getLabel();
1533 sal_Bool bPrevCharIsSpace = sal_False;
1534 GetTextParagraphExport()->exportText(sExpr,bPrevCharIsSpace);
1535 }
1536 }
1537 // -----------------------------------------------------------------------------
CreateShapeExport()1538 XMLShapeExport* ORptExport::CreateShapeExport()
1539 {
1540 XMLShapeExport* pShapeExport = new XMLShapeExport( *this, XMLTextParagraphExport::CreateShapeExtPropMapper( *this ) );
1541 return pShapeExport;
1542 }
1543 // -----------------------------------------------------------------------------
exportShapes(const Reference<XSection> & _xSection,bool _bAddParagraph)1544 void ORptExport::exportShapes(const Reference< XSection>& _xSection,bool _bAddParagraph)
1545 {
1546 UniReference< XMLShapeExport > xShapeExport = GetShapeExport();
1547 xShapeExport->seekShapes(_xSection.get());
1548 const sal_Int32 nCount = _xSection->getCount();
1549 ::std::auto_ptr<SvXMLElementExport> pParagraphContent;
1550 if ( _bAddParagraph )
1551 pParagraphContent.reset(new SvXMLElementExport(*this,XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False));
1552
1553 awt::Point aRefPoint;
1554 aRefPoint.X = rptui::getStyleProperty<sal_Int32>(_xSection->getReportDefinition(),PROPERTY_LEFTMARGIN);
1555 for (sal_Int32 i = 0; i < nCount; ++i)
1556 {
1557 uno::Reference< XShape > xShape(_xSection->getByIndex(i),uno::UNO_QUERY);
1558 if ( xShape.is() )
1559 {
1560 ::std::auto_ptr<SvXMLElementExport> pSubDocument;
1561 uno::Reference< frame::XModel> xModel(xShape->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Model"))),uno::UNO_QUERY);
1562 if ( xModel.is() ) // special handling for chart object
1563 {
1564 pSubDocument.reset(new SvXMLElementExport(*this,XML_NAMESPACE_REPORT, XML_SUB_DOCUMENT, sal_False, sal_False));
1565 exportMasterDetailFields(xShape.get());
1566 exportReportElement(xShape.get());
1567 }
1568
1569 AddAttribute( XML_NAMESPACE_TEXT, XML_ANCHOR_TYPE, XML_PARAGRAPH );
1570 xShapeExport->exportShape(xShape.get(),SEF_DEFAULT|SEF_EXPORT_NO_WS,&aRefPoint);
1571 }
1572 }
1573 }
1574 // -----------------------------------------------------------------------------
exportGroupsExpressionAsFunction(const Reference<XGroups> & _xGroups)1575 void ORptExport::exportGroupsExpressionAsFunction(const Reference< XGroups>& _xGroups)
1576 {
1577 if ( _xGroups.is() )
1578 {
1579 uno::Reference< XFunctions> xFunctions = _xGroups->getReportDefinition()->getFunctions();
1580 const sal_Int32 nCount = _xGroups->getCount();
1581 for (sal_Int32 i = 0; i < nCount; ++i)
1582 {
1583 uno::Reference< XGroup> xGroup(_xGroups->getByIndex(i),uno::UNO_QUERY_THROW);
1584 const ::sal_Int16 nGroupOn = xGroup->getGroupOn();
1585 if ( nGroupOn != report::GroupOn::DEFAULT )
1586 {
1587 uno::Reference< XFunction> xFunction = xFunctions->createFunction();
1588 ::rtl::OUString sFunction,sPrefix,sPostfix;
1589 ::rtl::OUString sExpression = xGroup->getExpression();
1590 ::rtl::OUString sFunctionName;
1591 switch(nGroupOn)
1592 {
1593 case report::GroupOn::PREFIX_CHARACTERS:
1594 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LEFT"));
1595 sPrefix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";")) + ::rtl::OUString::valueOf(xGroup->getGroupInterval());
1596 break;
1597 case report::GroupOn::YEAR:
1598 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("YEAR"));
1599 break;
1600 case report::GroupOn::QUARTAL:
1601 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INT((MONTH"));
1602 sPostfix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-1)/3)+1"));
1603 sFunctionName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("QUARTAL_")) + sExpression;
1604 break;
1605 case report::GroupOn::MONTH:
1606 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MONTH"));
1607 break;
1608 case report::GroupOn::WEEK:
1609 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WEEK"));
1610 break;
1611 case report::GroupOn::DAY:
1612 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DAY"));
1613 break;
1614 case report::GroupOn::HOUR:
1615 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HOUR"));
1616 break;
1617 case report::GroupOn::MINUTE:
1618 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MINUTE"));
1619 break;
1620 case report::GroupOn::INTERVAL:
1621 {
1622 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INT"));
1623 uno::Reference< XFunction> xCountFunction = xFunctions->createFunction();
1624 xCountFunction->setInitialFormula(beans::Optional< ::rtl::OUString>(sal_True,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:1"))));
1625 ::rtl::OUString sCountName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_count_")) + sExpression;
1626 xCountFunction->setName(sCountName);
1627 xCountFunction->setFormula(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:[")) + sCountName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("] + 1")));
1628 exportFunction(xCountFunction);
1629 sExpression = sCountName;
1630 sPrefix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" / ")) + ::rtl::OUString::valueOf(xGroup->getGroupInterval());
1631 sFunctionName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_")) + sExpression;
1632 }
1633 break;
1634 default:
1635 ;
1636 }
1637 if ( !sFunctionName.getLength() )
1638 sFunctionName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_")) + sExpression;
1639 if ( sFunction.getLength() )
1640 {
1641 sal_Unicode pReplaceChars[] = { '(',')',';',',','+','-','[',']','/','*'};
1642 for(sal_uInt32 j= 0; j < sizeof(pReplaceChars)/sizeof(pReplaceChars[0]);++j)
1643 sFunctionName = sFunctionName.replace(pReplaceChars[j],'_');
1644
1645 xFunction->setName(sFunctionName);
1646 sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:")) + sFunction;
1647 sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(["));
1648 sFunction += sExpression;
1649 sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]"));
1650
1651 if ( sPrefix.getLength() )
1652 sFunction += sPrefix;
1653 sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")"));
1654 if ( sPostfix.getLength() )
1655 sFunction += sPostfix;
1656 xFunction->setFormula(sFunction);
1657 exportFunction(xFunction);
1658 m_aGroupFunctionMap.insert(TGroupFunctionMap::value_type(xGroup,xFunction));
1659 }
1660 }
1661 }
1662 }
1663 }
1664
1665 // -----------------------------------------------------------------------------
1666 }// rptxml
1667 // -----------------------------------------------------------------------------
1668
1669