| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #include "precompiled_reportdesign.hxx" |
| |
| #include "xmlExport.hxx" |
| #include "xmlAutoStyle.hxx" |
| #include <xmloff/ProgressBarHelper.hxx> |
| #include <comphelper/sequence.hxx> |
| #include <xmloff/xmltoken.hxx> |
| #include <xmloff/txtimp.hxx> |
| #include <xmloff/xmlnmspe.hxx> |
| #include <xmloff/xmluconv.hxx> |
| #include <xmloff/nmspmap.hxx> |
| #include <comphelper/types.hxx> |
| #include "xmlEnums.hxx" |
| #include <xmloff/nmspmap.hxx> |
| #include <xmloff/xmluconv.hxx> |
| #include <xmloff/txtprmap.hxx> |
| #include <xmloff/numehelp.hxx> |
| #include "xmlHelper.hxx" |
| #include "xmlstrings.hrc" |
| #include "xmlPropertyHandler.hxx" |
| #include <com/sun/star/awt/ImagePosition.hpp> |
| #include <com/sun/star/util/NumberFormat.hpp> |
| #include <com/sun/star/style/ParagraphAdjust.hpp> |
| #include <com/sun/star/awt/TextAlign.hpp> |
| #include <com/sun/star/report/GroupOn.hpp> |
| #include <com/sun/star/report/XFixedText.hpp> |
| #include <com/sun/star/report/XImageControl.hpp> |
| #include <com/sun/star/report/XShape.hpp> |
| #include <com/sun/star/drawing/XShape.hpp> |
| #include <com/sun/star/drawing/XShapes.hpp> |
| #include <com/sun/star/report/XFunction.hpp> |
| #include <com/sun/star/awt/FontDescriptor.hpp> |
| #include <com/sun/star/text/TextContentAnchorType.hpp> |
| #include <com/sun/star/table/BorderLine.hpp> |
| #include <com/sun/star/report/XFixedLine.hpp> |
| #include <com/sun/star/frame/XController.hpp> |
| #include "RptDef.hxx" |
| // for locking SolarMutex: svapp + mutex |
| #include <vcl/svapp.hxx> |
| #include <vos/mutex.hxx> |
| |
| #include <boost/bind.hpp> |
| |
| //-------------------------------------------------------------------------- |
| namespace rptxml |
| { |
| using namespace xmloff; |
| using namespace comphelper; |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::report; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::util; |
| using namespace ::com::sun::star::xml; |
| |
| //--------------------------------------------------------------------- |
| Reference< XInterface > ORptExportHelper::create(Reference< XComponentContext > const & xContext) |
| { |
| return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_SETTINGS )); |
| } |
| //--------------------------------------------------------------------- |
| ::rtl::OUString ORptExportHelper::getImplementationName_Static( ) throw (RuntimeException) |
| { |
| return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLSettingsExporter"); |
| } |
| //--------------------------------------------------------------------- |
| Sequence< ::rtl::OUString > ORptExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException) |
| { |
| Sequence< ::rtl::OUString > aSupported(1); |
| aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter"); |
| return aSupported; |
| } |
| //--------------------------------------------------------------------- |
| Reference< XInterface > ORptContentExportHelper::create(Reference< XComponentContext > const & xContext) |
| { |
| return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_CONTENT )); |
| } |
| //--------------------------------------------------------------------- |
| ::rtl::OUString ORptContentExportHelper::getImplementationName_Static( ) throw (RuntimeException) |
| { |
| return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLContentExporter"); |
| } |
| //--------------------------------------------------------------------- |
| Sequence< ::rtl::OUString > ORptContentExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException) |
| { |
| Sequence< ::rtl::OUString > aSupported(1); |
| aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter"); |
| return aSupported; |
| } |
| |
| //--------------------------------------------------------------------- |
| Reference< XInterface > ORptStylesExportHelper::create(Reference< XComponentContext > const & xContext) |
| { |
| return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_STYLES | EXPORT_MASTERSTYLES | EXPORT_AUTOSTYLES | |
| EXPORT_FONTDECLS|EXPORT_OASIS )); |
| } |
| //--------------------------------------------------------------------- |
| ::rtl::OUString ORptStylesExportHelper::getImplementationName_Static( ) throw (RuntimeException) |
| { |
| return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLStylesExporter"); |
| } |
| //--------------------------------------------------------------------- |
| Sequence< ::rtl::OUString > ORptStylesExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException) |
| { |
| Sequence< ::rtl::OUString > aSupported(1); |
| aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter"); |
| return aSupported; |
| } |
| |
| //--------------------------------------------------------------------- |
| Reference< XInterface > ORptMetaExportHelper::create(Reference< XComponentContext > const & xContext) |
| { |
| return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_META )); |
| } |
| //--------------------------------------------------------------------- |
| ::rtl::OUString ORptMetaExportHelper::getImplementationName_Static( ) throw (RuntimeException) |
| { |
| return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLMetaExporter"); |
| } |
| //--------------------------------------------------------------------- |
| Sequence< ::rtl::OUString > ORptMetaExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException) |
| { |
| Sequence< ::rtl::OUString > aSupported(1); |
| aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter"); |
| return aSupported; |
| } |
| |
| //--------------------------------------------------------------------- |
| Reference< XInterface > ODBFullExportHelper::create(Reference< XComponentContext > const & xContext) |
| { |
| return static_cast< XServiceInfo* >(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY),EXPORT_ALL)); |
| } |
| //--------------------------------------------------------------------- |
| ::rtl::OUString ODBFullExportHelper::getImplementationName_Static( ) throw (RuntimeException) |
| { |
| return ::rtl::OUString::createFromAscii("com.sun.star.comp.report.XMLFullExporter"); |
| } |
| //--------------------------------------------------------------------- |
| Sequence< ::rtl::OUString > ODBFullExportHelper::getSupportedServiceNames_Static( ) throw(RuntimeException) |
| { |
| Sequence< ::rtl::OUString > aSupported(1); |
| aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.ExportFilter"); |
| return aSupported; |
| } |
| |
| //--------------------------------------------------------------------- |
| |
| class OSpecialHanldeXMLExportPropertyMapper : public SvXMLExportPropertyMapper |
| { |
| public: |
| OSpecialHanldeXMLExportPropertyMapper(const UniReference< XMLPropertySetMapper >& rMapper) : SvXMLExportPropertyMapper(rMapper ) |
| { |
| } |
| /** this method is called for every item that has the |
| MID_FLAG_SPECIAL_ITEM_EXPORT flag set */ |
| virtual void handleSpecialItem( |
| SvXMLAttributeList& /*rAttrList*/, |
| const XMLPropertyState& /*rProperty*/, |
| const SvXMLUnitConverter& /*rUnitConverter*/, |
| const SvXMLNamespaceMap& /*rNamespaceMap*/, |
| const ::std::vector< XMLPropertyState >* /*pProperties*/ = 0, |
| sal_uInt32 /*nIdx*/ = 0 ) const |
| { |
| // nothing to do here |
| } |
| }; |
| // ----------------------------------------------------------------------------- |
| void lcl_adjustColumnSpanOverRows(ORptExport::TSectionsGrid& _rGrid) |
| { |
| ORptExport::TSectionsGrid::iterator aSectionIter = _rGrid.begin(); |
| ORptExport::TSectionsGrid::iterator aSectionEnd = _rGrid.end(); |
| for (;aSectionIter != aSectionEnd ; ++aSectionIter) |
| { |
| ORptExport::TGrid::iterator aRowIter = aSectionIter->second.begin(); |
| ORptExport::TGrid::iterator aRowEnd = aSectionIter->second.end(); |
| for (; aRowIter != aRowEnd; ++aRowIter) |
| { |
| if ( aRowIter->first ) |
| { |
| ::std::vector< ORptExport::TCell >::iterator aColIter = aRowIter->second.begin(); |
| ::std::vector< ORptExport::TCell >::iterator aColEnd = aRowIter->second.end(); |
| for (; aColIter != aColEnd; ++aColIter) |
| { |
| if ( aColIter->nRowSpan > 1 ) |
| { |
| sal_Int32 nColSpan = aColIter->nColSpan; |
| sal_Int32 nColIndex = aColIter - aRowIter->second.begin(); |
| for (sal_Int32 i = 1; i < aColIter->nRowSpan; ++i) |
| { |
| (aRowIter+i)->second[nColIndex].nColSpan = nColSpan; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| ORptExport::ORptExport(const Reference< XMultiServiceFactory >& _rxMSF,sal_uInt16 nExportFlag) |
| : SvXMLExport( _rxMSF,MAP_100TH_MM,XML_REPORT, EXPORT_OASIS) |
| ,m_bAllreadyFilled(sal_False) |
| { |
| setExportFlags( EXPORT_OASIS | nExportFlag); |
| GetMM100UnitConverter().setCoreMeasureUnit(MAP_100TH_MM); |
| GetMM100UnitConverter().setXMLMeasureUnit(MAP_CM); |
| |
| // (getExportFlags() & EXPORT_CONTENT) != 0 ? : XML_N_OOO |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE ), XML_NAMESPACE_OFFICE ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); |
| |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_RPT), GetXMLToken(XML_N_RPT), XML_NAMESPACE_REPORT ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG_COMPAT), XML_NAMESPACE_SVG ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_FORM), GetXMLToken(XML_N_FORM), XML_NAMESPACE_FORM ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_TEXT), GetXMLToken(XML_N_TEXT), XML_NAMESPACE_TEXT ); |
| |
| |
| if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS) ) != 0 ) |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_FO), GetXMLToken(XML_N_FO_COMPAT), XML_NAMESPACE_FO ); |
| |
| if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_SETTINGS) ) != 0 ) |
| { |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); |
| } |
| if( (getExportFlags() & EXPORT_SETTINGS) != 0 ) |
| { |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_CONFIG), GetXMLToken(XML_N_CONFIG), XML_NAMESPACE_CONFIG ); |
| } |
| |
| if( (getExportFlags() & (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_FONTDECLS) ) != 0 ) |
| { |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_STYLE), GetXMLToken(XML_N_STYLE), XML_NAMESPACE_STYLE ); |
| } |
| // RDFa: needed for content and header/footer styles |
| if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 ) |
| { |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_XHTML),GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML ); |
| } |
| // GRDDL: to convert RDFa and meta.xml to RDF |
| if( (getExportFlags() & (EXPORT_META|EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 ) |
| { |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_GRDDL),GetXMLToken(XML_N_GRDDL), XML_NAMESPACE_GRDDL ); |
| } |
| |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_TABLE), GetXMLToken(XML_N_TABLE), XML_NAMESPACE_TABLE ); |
| _GetNamespaceMap().Add( GetXMLToken(XML_NP_NUMBER), GetXMLToken(XML_N_NUMBER), XML_NAMESPACE_NUMBER ); |
| |
| m_sTableStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_STYLE_NAME) ); |
| m_sColumnStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_COLUMN) ); |
| m_sCellStyle = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_REPORT, GetXMLToken(XML_STYLE_NAME) ); |
| |
| |
| m_xPropHdlFactory = new OXMLRptPropHdlFactory(); |
| UniReference < XMLPropertyHandlerFactory> xFac = new ::xmloff::OControlPropertyHandlerFactory(); |
| UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper1 = new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(),xFac); |
| UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper2 = new XMLTextPropertySetMapper(TEXT_PROP_MAP_TABLE_DEFAULTS ); |
| xTableStylesPropertySetMapper1->AddMapperEntry(xTableStylesPropertySetMapper2); |
| |
| m_xTableStylesExportPropertySetMapper = new SvXMLExportPropertyMapper(xTableStylesPropertySetMapper1); |
| //m_xTableStylesExportPropertySetMapper->ChainExportMapper(xTableStylesPropertySetMapper2); |
| |
| m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap(); |
| m_xCellStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(m_xCellStylesPropertySetMapper); |
| m_xCellStylesExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); |
| |
| UniReference < XMLPropertySetMapper > xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory); |
| m_xColumnStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xColumnStylesPropertySetMapper); |
| |
| UniReference < XMLPropertySetMapper > xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory); |
| m_xRowStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xRowStylesPropertySetMapper); |
| |
| UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA )); |
| m_xParaPropMapper = new OSpecialHanldeXMLExportPropertyMapper( xPropMapper); |
| // m_xParaPropMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); |
| |
| ::rtl::OUString sFamily( GetXMLToken(XML_PARAGRAPH) ); |
| ::rtl::OUString aPrefix( String( 'P' ) ); |
| GetAutoStylePool()->AddFamily( XML_STYLE_FAMILY_TEXT_PARAGRAPH, sFamily, |
| m_xParaPropMapper, aPrefix ); |
| |
| GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_CELL, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME)), |
| m_xCellStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX))); |
| GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_COLUMN, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME)), |
| m_xColumnStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX))); |
| GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_ROW, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_NAME)), |
| m_xRowStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX))); |
| GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_TABLE, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_NAME)), |
| m_xTableStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_PREFIX))); |
| } |
| // ----------------------------------------------------------------------------- |
| Reference< XInterface > ORptExport::create(Reference< XComponentContext > const & xContext) |
| { |
| return *(new ORptExport(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY))); |
| } |
| |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ORptExport::getImplementationName_Static( ) throw(uno::RuntimeException) |
| { |
| return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.report.ExportFilter")); |
| } |
| |
| //-------------------------------------------------------------------------- |
| ::rtl::OUString SAL_CALL ORptExport::getImplementationName( ) throw(uno::RuntimeException) |
| { |
| return getImplementationName_Static(); |
| } |
| //-------------------------------------------------------------------------- |
| uno::Sequence< ::rtl::OUString > ORptExport::getSupportedServiceNames_Static( ) throw(uno::RuntimeException) |
| { |
| uno::Sequence< ::rtl::OUString > aServices(1); |
| aServices.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ExportFilter")); |
| |
| return aServices; |
| } |
| //-------------------------------------------------------------------------- |
| uno::Sequence< ::rtl::OUString > SAL_CALL ORptExport::getSupportedServiceNames( ) throw(uno::RuntimeException) |
| { |
| return getSupportedServiceNames_Static(); |
| } |
| //------------------------------------------------------------------------------ |
| sal_Bool SAL_CALL ORptExport::supportsService(const ::rtl::OUString& ServiceName) throw( uno::RuntimeException ) |
| { |
| return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_Static()); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportFunctions(const Reference<XIndexAccess>& _xFunctions) |
| { |
| const sal_Int32 nCount = _xFunctions->getCount(); |
| for (sal_Int32 i = 0; i< nCount; ++i) |
| { |
| uno::Reference< report::XFunction> xFunction(_xFunctions->getByIndex(i),uno::UNO_QUERY_THROW); |
| OSL_ENSURE(xFunction.is(),"Function object is NULL!"); |
| exportFunction(xFunction); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportFunction(const uno::Reference< XFunction>& _xFunction) |
| { |
| exportFormula(XML_FORMULA,_xFunction->getFormula()); |
| beans::Optional< ::rtl::OUString> aInitial = _xFunction->getInitialFormula(); |
| if ( aInitial.IsPresent && aInitial.Value.getLength() ) |
| exportFormula(XML_INITIAL_FORMULA ,aInitial.Value ); |
| AddAttribute( XML_NAMESPACE_REPORT, XML_NAME , _xFunction->getName() ); |
| if ( _xFunction->getPreEvaluated() ) |
| AddAttribute( XML_NAMESPACE_REPORT, XML_PRE_EVALUATED , XML_TRUE ); |
| if ( _xFunction->getDeepTraversing() ) |
| AddAttribute( XML_NAMESPACE_REPORT, XML_DEEP_TRAVERSING , XML_TRUE ); |
| |
| SvXMLElementExport aFunction(*this,XML_NAMESPACE_REPORT, XML_FUNCTION, sal_True, sal_True); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportMasterDetailFields(const Reference<XReportComponent>& _xReportComponet) |
| { |
| const uno::Sequence< ::rtl::OUString> aMasterFields = _xReportComponet->getMasterFields(); |
| if ( aMasterFields.getLength() ) |
| { |
| SvXMLElementExport aElement(*this,XML_NAMESPACE_REPORT, XML_MASTER_DETAIL_FIELDS, sal_True, sal_True); |
| const uno::Sequence< ::rtl::OUString> aDetailFields = _xReportComponet->getDetailFields(); |
| |
| OSL_ENSURE(aDetailFields.getLength() == aMasterFields.getLength(),"not equal length for master and detail fields!"); |
| |
| const ::rtl::OUString* pDetailFieldsIter = aDetailFields.getConstArray(); |
| const ::rtl::OUString* pIter = aMasterFields.getConstArray(); |
| const ::rtl::OUString* pEnd = pIter + aMasterFields.getLength(); |
| for(;pIter != pEnd;++pIter,++pDetailFieldsIter) |
| { |
| AddAttribute( XML_NAMESPACE_REPORT, XML_MASTER , *pIter ); |
| if ( pDetailFieldsIter->getLength() ) |
| AddAttribute( XML_NAMESPACE_REPORT, XML_DETAIL , *pDetailFieldsIter ); |
| SvXMLElementExport aPair(*this,XML_NAMESPACE_REPORT, XML_MASTER_DETAIL_FIELD, sal_True, sal_True); |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportReport(const Reference<XReportDefinition>& _xReportDefinition) |
| { |
| if ( _xReportDefinition.is() ) |
| { |
| exportFunctions(_xReportDefinition->getFunctions().get()); |
| exportGroupsExpressionAsFunction(_xReportDefinition->getGroups()); |
| //exportMasterDetailFields(_xReportDefinition.get()); |
| |
| if ( _xReportDefinition->getReportHeaderOn() ) |
| { |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_REPORT_HEADER, sal_True, sal_True); |
| exportSection(_xReportDefinition->getReportHeader()); |
| } // if ( _xReportDefinition->getReportHeaderOn() ) |
| if ( _xReportDefinition->getPageHeaderOn() ) |
| { |
| ::rtl::OUStringBuffer sValue; |
| sal_uInt16 nRet = _xReportDefinition->getPageHeaderOption(); |
| const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetReportPrintOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_PAGE_PRINT_OPTION,sValue.makeStringAndClear()); |
| |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_PAGE_HEADER, sal_True, sal_True); |
| exportSection(_xReportDefinition->getPageHeader(),true); |
| } // if ( _xReportDefinition->getPageHeaderOn() ) |
| |
| exportGroup(_xReportDefinition,0); |
| |
| if ( _xReportDefinition->getPageFooterOn() ) |
| { |
| ::rtl::OUStringBuffer sValue; |
| sal_uInt16 nRet = _xReportDefinition->getPageFooterOption(); |
| const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetReportPrintOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_PAGE_PRINT_OPTION,sValue.makeStringAndClear()); |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_PAGE_FOOTER, sal_True, sal_True); |
| exportSection(_xReportDefinition->getPageFooter(),true); |
| } // if ( _xReportDefinition->getPageFooterOn() ) |
| if ( _xReportDefinition->getReportFooterOn() ) |
| { |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_REPORT_FOOTER, sal_True, sal_True); |
| exportSection(_xReportDefinition->getReportFooter()); |
| } // if ( _xReportDefinition->getReportFooterOn() ) |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportComponent(const Reference<XReportComponent>& _xReportComponent) |
| { |
| OSL_ENSURE(_xReportComponent.is(),"No component interface!"); |
| if ( !_xReportComponent.is() ) |
| return; |
| |
| AddAttribute(XML_NAMESPACE_DRAW, XML_NAME,_xReportComponent->getName()); |
| |
| SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_REPORT_COMPONENT, sal_False, sal_False); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportFormatConditions(const Reference<XReportControlModel>& _xReportElement) |
| { |
| OSL_ENSURE(_xReportElement.is(),"_xReportElement is NULL -> GPF"); |
| ::rtl::OUString sDataField = convertFormula(_xReportElement->getDataField()); |
| const sal_Int32 nCount = _xReportElement->getCount(); |
| try |
| { |
| for (sal_Int32 i = 0; i < nCount ; ++i) |
| { |
| uno::Reference< report::XFormatCondition > xCond(_xReportElement->getByIndex(i),uno::UNO_QUERY); |
| if ( !xCond->getEnabled() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_ENABLED,XML_FALSE); |
| |
| AddAttribute(XML_NAMESPACE_REPORT, XML_FORMULA,xCond->getFormula()); |
| |
| exportStyleName(xCond.get(),GetAttrList(),m_sCellStyle); |
| SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_FORMAT_CONDITION, sal_True, sal_True); |
| } // for (sal_Int32 i = 0; i < nCount ; ++i) |
| } |
| catch(uno::Exception&) |
| { |
| OSL_ENSURE(0,"Can not access format condition!"); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportReportElement(const Reference<XReportControlModel>& _xReportElement) |
| { |
| OSL_ENSURE(_xReportElement.is(),"_xReportElement is NULL -> GPF"); |
| if ( _xReportElement->getPrintWhenGroupChange() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_PRINT_ONLY_WHEN_GROUP_CHANGE, XML_TRUE ); |
| |
| if ( !_xReportElement->getPrintRepeatedValues() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_PRINT_REPEATED_VALUES,XML_FALSE); |
| |
| SvXMLElementExport aElem(*this,XML_NAMESPACE_REPORT, XML_REPORT_ELEMENT, sal_True, sal_True); |
| if ( _xReportElement->getCount() ) |
| { |
| exportFormatConditions(_xReportElement); |
| } |
| |
| ::rtl::OUString sExpr = _xReportElement->getConditionalPrintExpression(); |
| if ( sExpr.getLength() ) |
| { |
| exportFormula(XML_FORMULA,sExpr); |
| SvXMLElementExport aPrintExpr(*this,XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION, sal_True, sal_True); |
| } // if ( sExpr.getLength() ) |
| |
| // only export when parent exists |
| uno::Reference< report::XSection> xParent(_xReportElement->getParent(),uno::UNO_QUERY); |
| if ( xParent.is() ) |
| exportComponent(_xReportElement.get()); |
| } |
| // ----------------------------------------------------------------------------- |
| void lcl_calculate(const ::std::vector<sal_Int32>& _aPosX,const ::std::vector<sal_Int32>& _aPosY,ORptExport::TGrid& _rColumns) |
| { |
| sal_Int32 nCountX = _aPosX.size() - 1; |
| sal_Int32 nCountY = _aPosY.size() - 1; |
| for (sal_Int32 j = 0; j < nCountY; ++j) |
| { |
| sal_Int32 nHeight = _aPosY[j+1] - _aPosY[j]; |
| if ( nHeight ) |
| for (sal_Int32 i = 0; i < nCountX ; ++i) |
| { |
| _rColumns[j].second[i] = ORptExport::TCell(_aPosX[i+1] - _aPosX[i],nHeight,1,1); |
| _rColumns[j].second[i].bSet = sal_True; |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::collectStyleNames(sal_Int32 _nFamily,const ::std::vector< sal_Int32>& _aSize, ORptExport::TStringVec& _rStyleNames) |
| { |
| ::std::vector< XMLPropertyState > aPropertyStates; |
| aPropertyStates.push_back(XMLPropertyState(0)); |
| ::std::vector<sal_Int32>::const_iterator aIter = _aSize.begin(); |
| ::std::vector<sal_Int32>::const_iterator aIter2 = aIter + 1; |
| ::std::vector<sal_Int32>::const_iterator aEnd = _aSize.end(); |
| for (;aIter2 != aEnd ; ++aIter,++aIter2) |
| { |
| sal_Int32 nValue = static_cast<sal_Int32>(*aIter2 - *aIter); |
| aPropertyStates[0].maValue <<= nValue; |
| _rStyleNames.push_back(GetAutoStylePool()->Add(_nFamily, aPropertyStates )); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportSectionAutoStyle(const Reference<XSection>& _xProp) |
| { |
| OSL_ENSURE(_xProp != NULL,"Section is NULL -> GPF"); |
| exportAutoStyle(_xProp); |
| |
| Reference<XReportDefinition> xReport = _xProp->getReportDefinition(); |
| const awt::Size aSize = rptui::getStyleProperty<awt::Size>(xReport,PROPERTY_PAPERSIZE); |
| const sal_Int32 nOffset = rptui::getStyleProperty<sal_Int32>(xReport,PROPERTY_LEFTMARGIN); |
| const sal_Int32 nCount = _xProp->getCount(); |
| |
| ::std::vector<sal_Int32> aColumnPos; |
| aColumnPos.reserve(2*(nCount + 1)); |
| aColumnPos.push_back(nOffset); |
| aColumnPos.push_back(aSize.Width - rptui::getStyleProperty<sal_Int32>(xReport,PROPERTY_RIGHTMARGIN)); |
| |
| ::std::vector<sal_Int32> aRowPos; |
| aRowPos.reserve(2*(nCount + 1)); |
| aRowPos.push_back(0); |
| aRowPos.push_back(_xProp->getHeight()); |
| |
| sal_Int32 i; |
| for (i = 0 ; i< nCount ; ++i) |
| { |
| Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY); |
| uno::Reference< XShape> xShape(xReportElement,uno::UNO_QUERY); |
| if ( xShape.is() ) |
| continue; |
| OSL_ENSURE( xReportElement.is(),"NULL Element in Section!" ); |
| if ( !xReportElement.is() ) |
| continue; |
| sal_Int32 nX = xReportElement->getPositionX(); |
| aColumnPos.push_back(nX); |
| Reference<XFixedLine> xFixedLine(xReportElement,uno::UNO_QUERY); |
| if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical |
| { |
| sal_Int32 nWidth = static_cast<sal_Int32>(xReportElement->getWidth()*0.5); |
| nX += nWidth; |
| aColumnPos.push_back(nX); |
| nX += xReportElement->getWidth() - nWidth; |
| } |
| else |
| nX += xReportElement->getWidth(); |
| aColumnPos.push_back(nX); // --nX why? |
| |
| sal_Int32 nY = xReportElement->getPositionY(); |
| aRowPos.push_back(nY); |
| nY += xReportElement->getHeight(); |
| aRowPos.push_back(nY); // --nY why? |
| } |
| |
| ::std::sort(aColumnPos.begin(),aColumnPos.end(),::std::less<sal_Int32>()); |
| aColumnPos.erase(::std::unique(aColumnPos.begin(),aColumnPos.end()),aColumnPos.end()); |
| |
| ::std::sort(aRowPos.begin(),aRowPos.end(),::std::less<sal_Int32>()); |
| aRowPos.erase(::std::unique(aRowPos.begin(),aRowPos.end()),aRowPos.end()); |
| |
| TSectionsGrid::iterator aInsert = m_aSectionsGrid.insert( |
| TSectionsGrid::value_type( |
| _xProp.get(), |
| TGrid(aRowPos.size() - 1,TGrid::value_type(sal_False,TRow(aColumnPos.size() - 1))) |
| ) |
| ).first; |
| lcl_calculate(aColumnPos,aRowPos,aInsert->second); |
| |
| TGridStyleMap::iterator aPos = m_aColumnStyleNames.insert(TGridStyleMap::value_type(_xProp.get(),TStringVec())).first; |
| collectStyleNames(XML_STYLE_FAMILY_TABLE_COLUMN,aColumnPos,aPos->second); |
| aPos = m_aRowStyleNames.insert(TGridStyleMap::value_type(_xProp.get(),TStringVec())).first; |
| collectStyleNames(XML_STYLE_FAMILY_TABLE_ROW,aRowPos,aPos->second); |
| |
| sal_Int32 x1 = 0; |
| sal_Int32 y1 = 0; |
| sal_Int32 x2 = 0; |
| sal_Int32 y2 = 0; |
| sal_Int32 xi = 0; |
| sal_Int32 yi = 0; |
| bool isOverlap = false; |
| |
| for (i = 0 ; i< nCount ; ++i) |
| { |
| Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY); |
| uno::Reference< XShape> xShape(xReportElement,uno::UNO_QUERY); |
| if ( xShape.is() ) |
| continue; |
| sal_Int32 nPos = xReportElement->getPositionX(); |
| x1 = (::std::find(aColumnPos.begin(),aColumnPos.end(),nPos) - aColumnPos.begin()); |
| Reference<XFixedLine> xFixedLine(xReportElement,uno::UNO_QUERY); |
| if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical |
| nPos += static_cast<sal_Int32>(xReportElement->getWidth()*0.5); |
| else |
| nPos += xReportElement->getWidth(); // -1 why |
| x2 = (::std::find(aColumnPos.begin(),aColumnPos.end(),nPos) - aColumnPos.begin()); |
| |
| nPos = xReportElement->getPositionY(); |
| y1 = (::std::find(aRowPos.begin(),aRowPos.end(),nPos) - aRowPos.begin()); |
| nPos += xReportElement->getHeight(); // -1 why? |
| y2 = (::std::find(aRowPos.begin(),aRowPos.end(),nPos) - aRowPos.begin()); |
| |
| isOverlap = false; |
| yi = y1; |
| while(yi < y2 && !isOverlap) // find overlapping controls |
| { |
| xi = x1; |
| while(xi < x2 && !isOverlap) |
| { |
| if ( aInsert->second[yi].second[xi].xElement.is() ) |
| { |
| isOverlap = true; |
| } |
| ++xi; |
| } |
| ++yi; |
| } |
| |
| if (!isOverlap) |
| { |
| yi = y1; |
| while(yi < y2) |
| { |
| xi = x1; |
| while(xi < x2) |
| { |
| aInsert->second[yi].second[xi] = TCell(); |
| ++xi; |
| } |
| aInsert->second[yi].first = sal_True; |
| ++yi; |
| } |
| |
| if (x2 - x1 != 0 && y2 - y1 != 0) |
| { |
| awt::Size aElementSize = xReportElement->getSize(); |
| if ( xFixedLine.is() && xFixedLine->getOrientation() == 1 ) // vertical |
| aElementSize.Width = static_cast<sal_Int32>(xFixedLine->getWidth()*0.5); |
| |
| sal_Int32 nColSpan = x2 - x1; |
| sal_Int32 nRowSpan = y2 - y1; |
| aInsert->second[y1].second[x1] = |
| TCell( |
| aElementSize.Width , // -1 why? |
| aElementSize.Height, // -1 why? |
| nColSpan, |
| nRowSpan, |
| xReportElement |
| ); |
| } |
| } |
| } |
| |
| lcl_adjustColumnSpanOverRows(m_aSectionsGrid); |
| exportReportComponentAutoStyles(_xProp); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportReportComponentAutoStyles(const Reference<XSection>& _xProp) |
| { |
| const sal_Int32 nCount = _xProp->getCount(); |
| for (sal_Int32 i = 0 ; i< nCount ; ++i) |
| { |
| const Reference<XReportComponent> xReportElement(_xProp->getByIndex(i),uno::UNO_QUERY); |
| const Reference< report::XShape > xShape(xReportElement,uno::UNO_QUERY); |
| if ( xShape.is() ) |
| { |
| UniReference< XMLShapeExport > xShapeExport = GetShapeExport(); |
| xShapeExport->seekShapes(_xProp.get()); |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| xShapeExport->collectShapeAutoStyles(xShape.get()); |
| } |
| else |
| { |
| exportAutoStyle(xReportElement.get()); |
| |
| Reference<XFormattedField> xFormattedField(xReportElement,uno::UNO_QUERY); |
| if ( xFormattedField.is() ) |
| { |
| try |
| { |
| const sal_Int32 nFormatCount = xFormattedField->getCount(); |
| for (sal_Int32 j = 0; j < nFormatCount ; ++j) |
| { |
| uno::Reference< report::XFormatCondition > xCond(xFormattedField->getByIndex(j),uno::UNO_QUERY); |
| exportAutoStyle(xCond.get(),xFormattedField); |
| } // for (sal_Int32 j = 0; j < nCount ; ++j) |
| } |
| catch(uno::Exception&) |
| { |
| OSL_ENSURE(0,"Can not access format condition!"); |
| } |
| } |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportSection(const Reference<XSection>& _xSection,bool bHeader) |
| { |
| OSL_ENSURE(_xSection.is(),"Section is NULL -> GPF"); |
| ::rtl::OUStringBuffer sValue; |
| AddAttribute(XML_NAMESPACE_TABLE, XML_NAME,_xSection->getName()); |
| |
| if ( !_xSection->getVisible() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_VISIBLE,XML_FALSE); |
| |
| if ( !bHeader ) |
| { |
| sal_uInt16 nRet = _xSection->getForceNewPage(); |
| const SvXMLEnumMapEntry* aXML_EnumMap = OXMLHelper::GetForceNewPageOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_FORCE_NEW_PAGE,sValue.makeStringAndClear()); |
| |
| nRet = _xSection->getNewRowOrCol(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_EnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_FORCE_NEW_COLUMN,sValue.makeStringAndClear()); |
| if ( _xSection->getKeepTogether() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER, XML_TRUE ); |
| } |
| |
| exportStyleName(_xSection.get(),GetAttrList(),m_sTableStyle); |
| |
| /// TODO export as table layout |
| SvXMLElementExport aComponents(*this,XML_NAMESPACE_TABLE, XML_TABLE, sal_True, sal_True); |
| |
| ::rtl::OUString sExpr = _xSection->getConditionalPrintExpression(); |
| if ( sExpr.getLength() ) |
| { |
| exportFormula(XML_FORMULA,sExpr); |
| SvXMLElementExport aPrintExpr(*this,XML_NAMESPACE_REPORT, XML_CONDITIONAL_PRINT_EXPRESSION, sal_True, sal_False); |
| } |
| |
| exportContainer(_xSection); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportTableColumns(const Reference< XSection>& _xSection) |
| { |
| SvXMLElementExport aColumns(*this,XML_NAMESPACE_TABLE, XML_TABLE_COLUMNS, sal_True, sal_True); |
| TGridStyleMap::iterator aColFind = m_aColumnStyleNames.find(_xSection.get()); |
| OSL_ENSURE(aColFind != m_aColumnStyleNames.end(),"ORptExport::exportTableColumns: Section not found in m_aColumnStyleNames!"); |
| if ( aColFind == m_aColumnStyleNames.end() ) |
| return; |
| |
| TStringVec::iterator aColIter = aColFind->second.begin(); |
| TStringVec::iterator aColEnd = aColFind->second.end(); |
| for (; aColIter != aColEnd; ++aColIter) |
| { |
| AddAttribute( m_sTableStyle,*aColIter ); |
| SvXMLElementExport aColumn(*this,XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportContainer(const Reference< XSection>& _xSection) |
| { |
| OSL_ENSURE(_xSection.is(),"Section is NULL -> GPF"); |
| |
| exportTableColumns(_xSection); |
| |
| TSectionsGrid::iterator aFind = m_aSectionsGrid.find(_xSection.get()); |
| OSL_ENSURE(aFind != m_aSectionsGrid.end(),"ORptExport::exportContainer: Section not found in grid!"); |
| if ( aFind == m_aSectionsGrid.end() ) |
| return; |
| TGrid::iterator aRowIter = aFind->second.begin(); |
| TGrid::iterator aRowEnd = aFind->second.end(); |
| |
| sal_Int32 nEmptyCellColSpan = 0; |
| TGridStyleMap::iterator aRowFind = m_aRowStyleNames.find(_xSection.get()); |
| TStringVec::iterator aHeightIter = aRowFind->second.begin(); |
| OSL_ENSURE(aRowFind->second.size() == aFind->second.size(),"Different count for rows"); |
| |
| bool bShapeHandled = false; |
| ::std::map<sal_Int32,sal_Int32> aRowSpan; |
| for (sal_Int32 j = 0; aRowIter != aRowEnd; ++aRowIter,++j,++aHeightIter) |
| { |
| AddAttribute( m_sTableStyle,*aHeightIter ); |
| SvXMLElementExport aRow(*this,XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True); |
| if ( aRowIter->first ) |
| { |
| ::std::vector< TCell >::iterator aColIter = aRowIter->second.begin(); |
| ::std::vector< TCell >::iterator aColEnd = aRowIter->second.end(); |
| nEmptyCellColSpan = 0; |
| for (; aColIter != aColEnd; ++aColIter) |
| { |
| sal_Bool bCoveredCell = sal_False; |
| sal_Int32 nColSpan = 0; |
| sal_Int32 nColIndex = aColIter - aRowIter->second.begin(); |
| ::std::map<sal_Int32,sal_Int32>::iterator aRowSpanFind = aRowSpan.find(nColIndex); |
| if ( aRowSpanFind != aRowSpan.end() ) |
| { |
| #if OSL_DEBUG_LEVEL > 0 |
| sal_Int32 nRowSpan = aRowSpanFind->second; |
| nRowSpan = nRowSpan; |
| sal_Int32 nColSpanTemp = aColIter->nColSpan; |
| (void) nColSpanTemp; |
| #endif |
| nColSpan = 1; |
| if ( !--(aRowSpanFind->second) ) |
| aRowSpan.erase(aRowSpanFind); |
| |
| if ( aColIter->nColSpan > 1 ) |
| nColSpan += aColIter->nColSpan - 1; |
| |
| bCoveredCell = sal_True; |
| aColIter = aColIter + (aColIter->nColSpan - 1); |
| } |
| else if ( aColIter->bSet ) |
| { |
| if ( nEmptyCellColSpan > 0 ) |
| { |
| AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) ); |
| bCoveredCell = sal_True; |
| nColSpan = nEmptyCellColSpan - 1; |
| nEmptyCellColSpan = 0; |
| } |
| sal_Int32 nSpan = aColIter->nColSpan; |
| if ( nSpan > 1 ) |
| { |
| AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nSpan) ); |
| nColSpan = nSpan - 1; |
| bCoveredCell = sal_True; |
| } |
| nSpan = aColIter->nRowSpan; |
| if ( nSpan > 1 ) |
| { |
| AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_ROWS_SPANNED,implConvertNumber(nSpan) ); |
| aRowSpan[nColIndex] = nSpan - 1; |
| } |
| if ( aColIter->xElement.is() ) |
| exportStyleName(aColIter->xElement.get(),GetAttrList(),m_sTableStyle); |
| |
| // start <table:table-cell> |
| Reference<XFormattedField> xFormattedField(aColIter->xElement,uno::UNO_QUERY); |
| if ( xFormattedField.is() ) |
| { |
| sal_Int32 nFormatKey = xFormattedField->getFormatKey(); |
| if ( 0 != nFormatKey ) |
| { |
| XMLNumberFormatAttributesExportHelper aHelper(GetNumberFormatsSupplier(),*this); |
| sal_Bool bIsStandard = sal_False; |
| ::rtl::OUString sEmpty; |
| if ( util::NumberFormat::TEXT == aHelper.GetCellType(nFormatKey,bIsStandard) ) |
| aHelper.SetNumberFormatAttributes(sEmpty, sEmpty); |
| else |
| aHelper.SetNumberFormatAttributes(nFormatKey, 0.0,sal_False); |
| } |
| } |
| SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_False); |
| |
| if ( aColIter->xElement.is() ) |
| { |
| // start <text:p> |
| SvXMLElementExport aParagraphContent(*this,XML_NAMESPACE_TEXT, XML_P, sal_True,sal_False); |
| Reference<XServiceInfo> xElement(aColIter->xElement,uno::UNO_QUERY); |
| Reference<XReportComponent> xReportComponent = aColIter->xElement; |
| |
| if ( !bShapeHandled ) |
| { |
| bShapeHandled = true; |
| exportShapes(_xSection,false); |
| } |
| uno::Reference< XShape > xShape(xElement,uno::UNO_QUERY); |
| uno::Reference< XFixedLine > xFixedLine(xElement,uno::UNO_QUERY); |
| if ( !xShape.is() && !xFixedLine.is() ) |
| { |
| Reference<XReportControlModel> xReportElement(xElement,uno::UNO_QUERY); |
| Reference<XReportDefinition> xReportDefinition(xElement,uno::UNO_QUERY); |
| Reference< XImageControl > xImage(xElement,uno::UNO_QUERY); |
| Reference<XSection> xSection(xElement,uno::UNO_QUERY); |
| |
| XMLTokenEnum eToken = XML_SECTION; |
| sal_Bool bExportData = sal_False; |
| if ( xElement->supportsService(SERVICE_FIXEDTEXT) ) |
| { |
| eToken = XML_FIXED_CONTENT; |
| } |
| else if ( xElement->supportsService(SERVICE_FORMATTEDFIELD) ) |
| { |
| eToken = XML_FORMATTED_TEXT; |
| bExportData = sal_True; |
| } |
| else if ( xElement->supportsService(SERVICE_IMAGECONTROL) ) |
| { |
| eToken = XML_IMAGE; |
| ::rtl::OUString sTargetLocation = xImage->getImageURL(); |
| if ( sTargetLocation.getLength() ) |
| { |
| sTargetLocation = GetRelativeReference(sTargetLocation); |
| AddAttribute(XML_NAMESPACE_FORM, XML_IMAGE_DATA,sTargetLocation); |
| } |
| bExportData = sal_True; |
| ::rtl::OUStringBuffer sValue; |
| const SvXMLEnumMapEntry* aXML_ImageScaleEnumMap = OXMLHelper::GetImageScaleOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, xImage->getScaleMode(),aXML_ImageScaleEnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_SCALE, sValue.makeStringAndClear() ); |
| } |
| else if ( xReportDefinition.is() ) |
| { |
| eToken = XML_SUB_DOCUMENT; |
| } |
| else if ( xSection.is() ) |
| { |
| } |
| |
| bool bPageSet = false; |
| if ( bExportData ) |
| { |
| bPageSet = exportFormula(XML_FORMULA,xReportElement->getDataField()); |
| if ( bPageSet ) |
| eToken = XML_FIXED_CONTENT; |
| else if ( eToken == XML_IMAGE ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_PRESERVE_IRI, xImage->getPreserveIRI() ? XML_TRUE : XML_FALSE ); |
| } |
| |
| //if ( !bPageSet ) |
| { |
| // start <report:eToken> |
| SvXMLElementExport aComponents(*this,XML_NAMESPACE_REPORT, eToken, sal_False, sal_False); |
| if ( eToken == XML_FIXED_CONTENT ) |
| exportParagraph(xReportElement); |
| if ( xReportElement.is() ) |
| exportReportElement(xReportElement); |
| |
| if ( eToken == XML_GROUP && xSection.is() ) |
| exportContainer(xSection); |
| else if ( eToken == XML_SUB_DOCUMENT && xReportDefinition.is() ) |
| { |
| SvXMLElementExport aOfficeElement( *this, XML_NAMESPACE_OFFICE, XML_BODY,sal_True, sal_True ); |
| SvXMLElementExport aElem( *this, sal_True, |
| XML_NAMESPACE_OFFICE, XML_REPORT, |
| sal_True, sal_True ); |
| |
| exportReportAttributes(xReportDefinition); |
| exportReport(xReportDefinition); |
| } |
| else if ( xSection.is() ) |
| exportSection(xSection); |
| } |
| } |
| } // if ( aColIter->xElement.is() ) |
| else if ( !bShapeHandled ) |
| { |
| bShapeHandled = true; |
| exportShapes(_xSection); |
| } |
| aColIter = aColIter + (aColIter->nColSpan - 1); |
| } |
| else |
| ++nEmptyCellColSpan; |
| if ( bCoveredCell ) |
| { |
| for (sal_Int32 k = 0; k < nColSpan; ++k) |
| { |
| SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True); |
| } |
| |
| } |
| } // for (sal_Int32 i = 0 ; i< nCount ; ++i) |
| if ( nEmptyCellColSpan ) |
| { |
| { |
| AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) ); |
| SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); |
| if ( !bShapeHandled ) |
| { |
| bShapeHandled = true; |
| exportShapes(_xSection); |
| } |
| } |
| for (sal_Int32 k = 0; k < nEmptyCellColSpan; ++k) |
| { |
| SvXMLElementExport aCoveredCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True); |
| } |
| nEmptyCellColSpan = 0; |
| } |
| } |
| else |
| { // empty rows |
| nEmptyCellColSpan = aRowIter->second.size(); |
| if ( nEmptyCellColSpan ) |
| { |
| { |
| AddAttribute( XML_NAMESPACE_TABLE,XML_NUMBER_COLUMNS_SPANNED,implConvertNumber(nEmptyCellColSpan) ); |
| SvXMLElementExport aCell(*this,XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); |
| if ( !bShapeHandled ) |
| { |
| bShapeHandled = true; |
| exportShapes(_xSection); |
| } |
| } |
| for (sal_Int32 k = 1; k < nEmptyCellColSpan; ++k) |
| { |
| SvXMLElementExport aCoveredCell(*this,XML_NAMESPACE_TABLE, XML_COVERED_TABLE_CELL, sal_True, sal_True); |
| } |
| nEmptyCellColSpan = 0; |
| } |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ORptExport::convertFormula(const ::rtl::OUString& _sFormula) |
| { |
| ::rtl::OUString sFormula = _sFormula; |
| if ( _sFormula.equalsAsciiL("rpt:",4) ) |
| sFormula = ::rtl::OUString(); |
| //sal_Int32 nLength = _sFormula.getLength(); |
| //if ( nLength ) |
| //{ |
| // sal_Int32 nPos = 0; |
| // if ( _sFormula.matchAsciiL("=",1) != 0 ) |
| // { |
| // nPos = 1; |
| // --nLength; |
| // } |
| // bool bFormula = _sFormula.indexOf('[') != -1 || _sFormula.indexOf('(') != -1; |
| // if ( bFormula ) |
| // sFormula = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:")) + _sFormula.copy(nPos,nLength); |
| // else |
| // sFormula = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("field:[")) + _sFormula.copy(nPos,nLength) + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]"));; |
| //} |
| return sFormula; |
| } |
| // ----------------------------------------------------------------------------- |
| bool ORptExport::exportFormula(enum ::xmloff::token::XMLTokenEnum eName,const ::rtl::OUString& _sFormula) |
| { |
| const ::rtl::OUString sFieldData = convertFormula(_sFormula); |
| static const ::rtl::OUString s_sPageNumber(RTL_CONSTASCII_USTRINGPARAM("PageNumber()")); |
| static const ::rtl::OUString s_sPageCount(RTL_CONSTASCII_USTRINGPARAM("PageCount()")); |
| sal_Int32 nPageNumberIndex = sFieldData.indexOf(s_sPageNumber); |
| sal_Int32 nPageCountIndex = sFieldData.indexOf(s_sPageCount); |
| bool bRet = nPageNumberIndex != -1 || nPageCountIndex != -1; |
| if ( !bRet ) |
| AddAttribute(XML_NAMESPACE_REPORT, eName,sFieldData); |
| |
| return bRet; |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportStyleName(XPropertySet* _xProp,SvXMLAttributeList& _rAtt,const ::rtl::OUString& _sName) |
| { |
| Reference<XPropertySet> xFind(_xProp); |
| TPropertyStyleMap::iterator aFind = m_aAutoStyleNames.find(xFind); |
| if ( aFind != m_aAutoStyleNames.end() ) |
| { |
| _rAtt.AddAttribute( _sName, |
| aFind->second ); |
| m_aAutoStyleNames.erase(aFind); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| sal_Bool ORptExport::exportGroup(const Reference<XReportDefinition>& _xReportDefinition,sal_Int32 _nPos,sal_Bool _bExportAutoStyle) |
| { |
| sal_Bool bGroupExported = sal_False; |
| if ( _xReportDefinition.is() ) |
| { |
| Reference< XGroups > xGroups = _xReportDefinition->getGroups(); |
| if ( xGroups.is() ) |
| { |
| sal_Int32 nCount = xGroups->getCount(); |
| if ( _nPos >= 0 && _nPos < nCount ) |
| { |
| bGroupExported = sal_True; |
| Reference<XGroup> xGroup(xGroups->getByIndex(_nPos),uno::UNO_QUERY); |
| OSL_ENSURE(xGroup.is(),"No Group prepare for GPF"); |
| if ( _bExportAutoStyle ) |
| { |
| if ( xGroup->getHeaderOn() ) |
| exportSectionAutoStyle(xGroup->getHeader()); |
| exportGroup(_xReportDefinition,_nPos+1,_bExportAutoStyle); |
| if ( xGroup->getFooterOn() ) |
| exportSectionAutoStyle(xGroup->getFooter()); |
| } |
| else |
| { |
| if ( xGroup->getSortAscending() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_SORT_ASCENDING, XML_TRUE ); |
| |
| if ( xGroup->getStartNewColumn() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_START_NEW_COLUMN, XML_TRUE); |
| if ( xGroup->getResetPageNumber() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_RESET_PAGE_NUMBER, XML_TRUE ); |
| |
| ::rtl::OUString sExpression = xGroup->getExpression(); |
| if ( sExpression.getLength() ) |
| { |
| static ::rtl::OUString s_sQuote(RTL_CONSTASCII_USTRINGPARAM("\"\"")); |
| sal_Int32 nIndex = sExpression.indexOf('"'); |
| while ( nIndex > -1 ) |
| { |
| sExpression = sExpression.replaceAt(nIndex,1,s_sQuote); |
| nIndex = sExpression.indexOf('"',nIndex+2); |
| } |
| ::rtl::OUString sFormula(RTL_CONSTASCII_USTRINGPARAM("rpt:HASCHANGED(\"")); |
| |
| TGroupFunctionMap::iterator aGroupFind = m_aGroupFunctionMap.find(xGroup); |
| if ( aGroupFind != m_aGroupFunctionMap.end() ) |
| sExpression = aGroupFind->second->getName(); |
| sFormula += sExpression; |
| sFormula += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\")")); |
| sExpression = sFormula; |
| } |
| AddAttribute(XML_NAMESPACE_REPORT, XML_GROUP_EXPRESSION,sExpression); |
| sal_Int16 nRet = xGroup->getKeepTogether(); |
| ::rtl::OUStringBuffer sValue; |
| const SvXMLEnumMapEntry* aXML_KeepTogetherEnumMap = OXMLHelper::GetKeepTogetherOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, nRet,aXML_KeepTogetherEnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_KEEP_TOGETHER,sValue.makeStringAndClear()); |
| |
| SvXMLElementExport aGroup(*this,XML_NAMESPACE_REPORT, XML_GROUP, sal_True, sal_True); |
| exportFunctions(xGroup->getFunctions().get()); |
| if ( xGroup->getHeaderOn() ) |
| { |
| Reference<XSection> xSection = xGroup->getHeader(); |
| if ( xSection->getRepeatSection() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_REPEAT_SECTION,XML_TRUE ); |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_GROUP_HEADER, sal_True, sal_True); |
| exportSection(xSection); |
| } |
| exportGroup(_xReportDefinition,_nPos+1,_bExportAutoStyle); |
| if ( xGroup->getFooterOn() ) |
| { |
| Reference<XSection> xSection = xGroup->getFooter(); |
| if ( xSection->getRepeatSection() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_REPEAT_SECTION,XML_TRUE ); |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_GROUP_FOOTER, sal_True, sal_True); |
| exportSection(xSection); |
| } // if ( xGroup->getFooterOn() ) |
| } |
| } |
| else if ( _bExportAutoStyle ) |
| { |
| exportSectionAutoStyle(_xReportDefinition->getDetail()); |
| } |
| else |
| { |
| SvXMLElementExport aGroupSection(*this,XML_NAMESPACE_REPORT, XML_DETAIL, sal_True, sal_True); |
| exportSection(_xReportDefinition->getDetail()); |
| } |
| } |
| } |
| return bGroupExported; |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportAutoStyle(XPropertySet* _xProp,const Reference<XFormattedField>& _xParentFormattedField) |
| { |
| const uno::Reference<report::XReportControlFormat> xFormat(_xProp,uno::UNO_QUERY); |
| if ( xFormat.is() ) |
| { |
| try |
| { |
| const awt::FontDescriptor aFont = xFormat->getFontDescriptor(); |
| OSL_ENSURE(aFont.Name.getLength(),"No Font Name !"); |
| GetFontAutoStylePool()->Add(aFont.Name,aFont.StyleName,aFont.Family,aFont.Pitch,aFont.CharSet ); |
| } |
| catch(beans::UnknownPropertyException&) |
| { |
| // not interested in |
| } |
| } |
| const uno::Reference< report::XShape> xShape(_xProp,uno::UNO_QUERY); |
| if ( xShape.is() ) |
| { |
| ::std::vector< XMLPropertyState > aPropertyStates( m_xParaPropMapper->Filter(_xProp) ); |
| if ( !aPropertyStates.empty() ) |
| m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( XML_STYLE_FAMILY_TEXT_PARAGRAPH, aPropertyStates ))); |
| } |
| ::std::vector< XMLPropertyState > aPropertyStates( m_xCellStylesExportPropertySetMapper->Filter(_xProp) ); |
| Reference<XFixedLine> xFixedLine(_xProp,uno::UNO_QUERY); |
| if ( xFixedLine.is() ) |
| { |
| uno::Reference<beans::XPropertySet> xBorderProp = OXMLHelper::createBorderPropertySet(); |
| table::BorderLine aValue; |
| aValue.Color = COL_BLACK; |
| aValue.InnerLineWidth = aValue.LineDistance = 0; |
| aValue.OuterLineWidth = 2; |
| |
| awt::Point aPos = xFixedLine->getPosition(); |
| awt::Size aSize = xFixedLine->getSize(); |
| sal_Int32 nSectionHeight = xFixedLine->getSection()->getHeight(); |
| |
| ::rtl::OUString sBorderProp; |
| ::std::vector< ::rtl::OUString> aProps; |
| if ( xFixedLine->getOrientation() == 1 ) // vertical |
| { |
| // check if border should be left |
| if ( !aPos.X ) |
| { |
| sBorderProp = PROPERTY_BORDERLEFT; |
| aProps.push_back(PROPERTY_BORDERRIGHT); |
| } |
| else |
| { |
| sBorderProp = PROPERTY_BORDERRIGHT; |
| aProps.push_back(PROPERTY_BORDERLEFT); |
| } |
| aProps.push_back(PROPERTY_BORDERTOP); |
| aProps.push_back(PROPERTY_BORDERBOTTOM); |
| } |
| else // horizontal |
| { |
| // check if border should be bottom |
| if ( (aPos.Y + aSize.Height) == nSectionHeight ) |
| { |
| sBorderProp = PROPERTY_BORDERBOTTOM; |
| aProps.push_back(PROPERTY_BORDERTOP); |
| } |
| else |
| { |
| sBorderProp = PROPERTY_BORDERTOP; |
| aProps.push_back(PROPERTY_BORDERBOTTOM); |
| } |
| aProps.push_back(PROPERTY_BORDERRIGHT); |
| aProps.push_back(PROPERTY_BORDERLEFT); |
| } |
| |
| xBorderProp->setPropertyValue(sBorderProp,uno::makeAny(aValue)); |
| |
| aValue.Color = aValue.OuterLineWidth = 0; |
| uno::Any aEmpty; |
| aEmpty <<= aValue; |
| ::std::for_each(aProps.begin(),aProps.end(), |
| ::boost::bind(&beans::XPropertySet::setPropertyValue,xBorderProp,_1,aEmpty)); |
| |
| ::std::vector< XMLPropertyState > aBorderStates(m_xCellStylesExportPropertySetMapper->Filter(xBorderProp)); |
| ::std::copy(aBorderStates.begin(),aBorderStates.end(),::std::back_inserter(aPropertyStates)); |
| } |
| else |
| { |
| //sal_Int32 nTextAlignIndex = m_xCellStylesExportPropertySetMapper->getPropertySetMapper()->FindEntryIndex( CTF_SD_SHAPE_PARA_ADJUST ); |
| //if ( nTextAlignIndex != -1 ) |
| //{ |
| // ::std::vector< XMLPropertyState >::iterator aIter = aPropertyStates.begin(); |
| // ::std::vector< XMLPropertyState >::iterator aEnd = aPropertyStates.end(); |
| // for (; aIter != aEnd; ++aIter) |
| // { |
| // if ( aIter->mnIndex == nTextAlignIndex ) |
| // { |
| // sal_Int16 nTextAlign = 0; |
| // aIter->maValue >>= nTextAlign; |
| // switch(nTextAlign) |
| // { |
| // case awt::TextAlign::LEFT: |
| // nTextAlign = style::ParagraphAdjust_LEFT; |
| // break; |
| // case awt::TextAlign::CENTER: |
| // nTextAlign = style::ParagraphAdjust_CENTER; |
| // break; |
| // case awt::TextAlign::RIGHT: |
| // nTextAlign = style::ParagraphAdjust_RIGHT; |
| // break; |
| // default: |
| // OSL_ENSURE(0,"Illegal text alignment value!"); |
| // break; |
| // } |
| // aIter->maValue <<= nTextAlign; |
| // break; |
| // } |
| // } |
| //} |
| const Reference<XFormattedField> xFormattedField(_xProp,uno::UNO_QUERY); |
| if ( (_xParentFormattedField.is() || xFormattedField.is()) && !aPropertyStates.empty() ) |
| { |
| sal_Int32 nNumberFormat = 0; |
| if ( _xParentFormattedField.is() ) |
| nNumberFormat = _xParentFormattedField->getFormatKey(); |
| else |
| nNumberFormat = xFormattedField->getFormatKey(); |
| { |
| sal_Int32 nStyleMapIndex = m_xCellStylesExportPropertySetMapper->getPropertySetMapper()->FindEntryIndex( CTF_RPT_NUMBERFORMAT ); |
| addDataStyle(nNumberFormat); |
| XMLPropertyState aNumberStyleState( nStyleMapIndex, uno::makeAny( getDataStyleName(nNumberFormat) ) ); |
| aPropertyStates.push_back( aNumberStyleState ); |
| } |
| } |
| } |
| |
| |
| if ( !aPropertyStates.empty() ) |
| m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp,GetAutoStylePool()->Add( XML_STYLE_FAMILY_TABLE_CELL, aPropertyStates ))); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportAutoStyle(const Reference<XSection>& _xProp) |
| { |
| ::std::vector< XMLPropertyState > aPropertyStates( m_xTableStylesExportPropertySetMapper->Filter(_xProp.get()) ); |
| if ( !aPropertyStates.empty() ) |
| m_aAutoStyleNames.insert( TPropertyStyleMap::value_type(_xProp.get(),GetAutoStylePool()->Add( XML_STYLE_FAMILY_TABLE_TABLE, aPropertyStates ))); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::SetBodyAttributes() |
| { |
| Reference<XReportDefinition> xProp(getReportDefinition()); |
| exportReportAttributes(xProp); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportReportAttributes(const Reference<XReportDefinition>& _xReport) |
| { |
| if ( _xReport.is() ) |
| { |
| ::rtl::OUStringBuffer sValue; |
| const SvXMLEnumMapEntry* aXML_CommnadTypeEnumMap = OXMLHelper::GetCommandTypeOptions(); |
| if ( SvXMLUnitConverter::convertEnum( sValue, static_cast<sal_uInt16>(_xReport->getCommandType()),aXML_CommnadTypeEnumMap ) ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_COMMAND_TYPE,sValue.makeStringAndClear()); |
| |
| ::rtl::OUString sComamnd = _xReport->getCommand(); |
| if ( sComamnd.getLength() ) |
| AddAttribute(XML_NAMESPACE_REPORT, XML_COMMAND, sComamnd); |
| |
| ::rtl::OUString sFilter( _xReport->getFilter() ); |
| if ( sFilter.getLength() ) |
| AddAttribute( XML_NAMESPACE_REPORT, XML_FILTER, sFilter ); |
| |
| AddAttribute(XML_NAMESPACE_OFFICE, XML_MIMETYPE,_xReport->getMimeType()); |
| |
| sal_Bool bEscapeProcessing( _xReport->getEscapeProcessing() ); |
| if ( !bEscapeProcessing ) |
| AddAttribute( XML_NAMESPACE_REPORT, XML_ESCAPE_PROCESSING, ::xmloff::token::GetXMLToken( XML_FALSE ) ); |
| |
| ::rtl::OUString sName = _xReport->getCaption(); |
| if ( sName.getLength() ) |
| AddAttribute(XML_NAMESPACE_OFFICE, XML_CAPTION,sName); |
| sName = _xReport->getName(); |
| if ( sName.getLength() ) |
| AddAttribute(XML_NAMESPACE_DRAW, XML_NAME,sName); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::_ExportContent() |
| { |
| exportReport(getReportDefinition()); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::_ExportMasterStyles() |
| { |
| GetPageExport()->exportMasterStyles( sal_True ); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::collectComponentStyles() |
| { |
| if ( m_bAllreadyFilled ) |
| return; |
| |
| m_bAllreadyFilled = sal_True; |
| Reference<XReportDefinition> xProp(getReportDefinition()); |
| if ( xProp.is() ) |
| { |
| uno::Reference< report::XSection> xParent(xProp->getParent(),uno::UNO_QUERY); |
| if ( xParent.is() ) |
| exportAutoStyle(xProp.get()); |
| |
| if ( xProp->getReportHeaderOn() ) |
| exportSectionAutoStyle(xProp->getReportHeader()); |
| if ( xProp->getPageHeaderOn() ) |
| exportSectionAutoStyle(xProp->getPageHeader()); |
| |
| exportGroup(xProp,0,sal_True); |
| |
| if ( xProp->getPageFooterOn() ) |
| exportSectionAutoStyle(xProp->getPageFooter()); |
| if ( xProp->getReportFooterOn() ) |
| exportSectionAutoStyle(xProp->getReportFooter()); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::_ExportAutoStyles() |
| { |
| // there are no styles that require their own autostyles |
| if ( getExportFlags() & EXPORT_CONTENT ) |
| { |
| collectComponentStyles(); |
| GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_TABLE |
| ,GetDocHandler() |
| ,GetMM100UnitConverter() |
| ,GetNamespaceMap() |
| ); |
| GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_COLUMN |
| ,GetDocHandler() |
| ,GetMM100UnitConverter() |
| ,GetNamespaceMap() |
| ); |
| GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_ROW |
| ,GetDocHandler() |
| ,GetMM100UnitConverter() |
| ,GetNamespaceMap() |
| ); |
| |
| GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_CELL |
| ,GetDocHandler() |
| ,GetMM100UnitConverter() |
| ,GetNamespaceMap() |
| ); |
| |
| |
| /*GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_REPORT_ID |
| ,GetDocHandler() |
| ,GetMM100UnitConverter() |
| ,GetNamespaceMap() |
| );*/ |
| exportDataStyles(); |
| GetShapeExport()->exportAutoStyles(); |
| } |
| // exported in _ExportMasterStyles |
| if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 ) |
| GetPageExport()->collectAutoStyles( sal_False ); |
| if( (getExportFlags() & EXPORT_MASTERSTYLES) != 0 ) |
| GetPageExport()->exportAutoStyles(); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::_ExportStyles(sal_Bool bUsed) |
| { |
| SvXMLExport::_ExportStyles(bUsed); |
| |
| // write draw:style-name for object graphic-styles |
| GetShapeExport()->ExportGraphicDefaults(); |
| } |
| // ----------------------------------------------------------------------------- |
| sal_uInt32 ORptExport::exportDoc(enum ::xmloff::token::XMLTokenEnum eClass) |
| { |
| return SvXMLExport::exportDoc( eClass ); |
| } |
| // ----------------------------------------------------------------------------- |
| ::rtl::OUString ORptExport::implConvertNumber(sal_Int32 _nValue) |
| { |
| ::rtl::OUStringBuffer aBuffer; |
| GetMM100UnitConverter().convertNumber(aBuffer, _nValue); |
| return aBuffer.makeStringAndClear(); |
| } |
| // ----------------------------------------------------------------------------- |
| UniReference < XMLPropertySetMapper > ORptExport::GetCellStylePropertyMapper() const |
| { |
| return m_xCellStylesPropertySetMapper; |
| } |
| // ----------------------------------------------------------------------------- |
| SvXMLAutoStylePoolP* ORptExport::CreateAutoStylePool() |
| { |
| return new OXMLAutoStylePoolP(*this); |
| } |
| // ----------------------------------------------------------------------------- |
| void SAL_CALL ORptExport::setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException) |
| { |
| m_xReportDefinition.set(xDoc,UNO_QUERY_THROW); |
| OSL_ENSURE(m_xReportDefinition.is(),"DataSource is NULL!"); |
| |
| SvXMLExport::setSourceDocument(xDoc); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::_ExportFontDecls() |
| { |
| GetFontAutoStylePool(); // make sure the pool is created |
| collectComponentStyles(); |
| SvXMLExport::_ExportFontDecls(); |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportParagraph(const Reference< XReportControlModel >& _xReportElement) |
| { |
| OSL_PRECOND(_xReportElement.is(),"Element is null!"); |
| // start <text:p> |
| SvXMLElementExport aParagraphContent(*this,XML_NAMESPACE_TEXT, XML_P, sal_False, sal_False); |
| if ( Reference<XFormattedField>(_xReportElement,uno::UNO_QUERY).is() ) |
| { |
| ::rtl::OUString sFieldData = _xReportElement->getDataField(); |
| static const ::rtl::OUString s_sPageNumber(RTL_CONSTASCII_USTRINGPARAM("PageNumber()")); |
| static const ::rtl::OUString s_sPageCount(RTL_CONSTASCII_USTRINGPARAM("PageCount()")); |
| static const ::rtl::OUString s_sReportPrefix(RTL_CONSTASCII_USTRINGPARAM("rpt:")); |
| static const ::rtl::OUString s_sConcatOperator(RTL_CONSTASCII_USTRINGPARAM("&")); |
| sFieldData = sFieldData.copy(s_sReportPrefix.getLength(),sFieldData.getLength() - s_sReportPrefix.getLength()); |
| sal_Int32 nPageNumberIndex = sFieldData.indexOf(s_sPageNumber); |
| if ( nPageNumberIndex != -1 ) |
| { |
| sal_Int32 nIndex = 0; |
| do |
| { |
| ::rtl::OUString sToken = sFieldData.getToken( 0, '&', nIndex ); |
| sToken = sToken.trim(); |
| if ( sToken.getLength() ) |
| { |
| if ( sToken == s_sPageNumber ) |
| { |
| static const ::rtl::OUString s_sCurrent(RTL_CONSTASCII_USTRINGPARAM("current")); |
| AddAttribute(XML_NAMESPACE_TEXT, XML_SELECT_PAGE, s_sCurrent ); |
| SvXMLElementExport aPageNumber(*this,XML_NAMESPACE_TEXT, XML_PAGE_NUMBER, sal_False, sal_False); |
| Characters(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); |
| } |
| else if ( sToken == s_sPageCount ) |
| { |
| SvXMLElementExport aPageNumber(*this,XML_NAMESPACE_TEXT, XML_PAGE_COUNT, sal_False, sal_False); |
| Characters(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"))); |
| } |
| else |
| { |
| |
| if ( sToken.indexOf('"') == 0 && sToken.lastIndexOf('"') == sToken.getLength()-1 ) |
| sToken = sToken.copy(1,sToken.getLength()-2); |
| |
| sal_Bool bPrevCharIsSpace = sal_False; |
| GetTextParagraphExport()->exportText(sToken,bPrevCharIsSpace); |
| } |
| } |
| } |
| while ( nIndex >= 0 ); |
| } |
| } |
| Reference< XFixedText > xFT(_xReportElement,UNO_QUERY); |
| if ( xFT.is() ) |
| { |
| ::rtl::OUString sExpr = xFT->getLabel(); |
| sal_Bool bPrevCharIsSpace = sal_False; |
| GetTextParagraphExport()->exportText(sExpr,bPrevCharIsSpace); |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| XMLShapeExport* ORptExport::CreateShapeExport() |
| { |
| XMLShapeExport* pShapeExport = new XMLShapeExport( *this, XMLTextParagraphExport::CreateShapeExtPropMapper( *this ) ); |
| return pShapeExport; |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportShapes(const Reference< XSection>& _xSection,bool _bAddParagraph) |
| { |
| UniReference< XMLShapeExport > xShapeExport = GetShapeExport(); |
| xShapeExport->seekShapes(_xSection.get()); |
| const sal_Int32 nCount = _xSection->getCount(); |
| ::std::auto_ptr<SvXMLElementExport> pParagraphContent; |
| if ( _bAddParagraph ) |
| pParagraphContent.reset(new SvXMLElementExport(*this,XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False)); |
| |
| awt::Point aRefPoint; |
| aRefPoint.X = rptui::getStyleProperty<sal_Int32>(_xSection->getReportDefinition(),PROPERTY_LEFTMARGIN); |
| for (sal_Int32 i = 0; i < nCount; ++i) |
| { |
| uno::Reference< XShape > xShape(_xSection->getByIndex(i),uno::UNO_QUERY); |
| if ( xShape.is() ) |
| { |
| ::std::auto_ptr<SvXMLElementExport> pSubDocument; |
| uno::Reference< frame::XModel> xModel(xShape->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Model"))),uno::UNO_QUERY); |
| if ( xModel.is() ) // special handling for chart object |
| { |
| pSubDocument.reset(new SvXMLElementExport(*this,XML_NAMESPACE_REPORT, XML_SUB_DOCUMENT, sal_False, sal_False)); |
| exportMasterDetailFields(xShape.get()); |
| exportReportElement(xShape.get()); |
| } |
| |
| AddAttribute( XML_NAMESPACE_TEXT, XML_ANCHOR_TYPE, XML_PARAGRAPH ); |
| xShapeExport->exportShape(xShape.get(),SEF_DEFAULT|SEF_EXPORT_NO_WS,&aRefPoint); |
| } |
| } |
| } |
| // ----------------------------------------------------------------------------- |
| void ORptExport::exportGroupsExpressionAsFunction(const Reference< XGroups>& _xGroups) |
| { |
| if ( _xGroups.is() ) |
| { |
| uno::Reference< XFunctions> xFunctions = _xGroups->getReportDefinition()->getFunctions(); |
| const sal_Int32 nCount = _xGroups->getCount(); |
| for (sal_Int32 i = 0; i < nCount; ++i) |
| { |
| uno::Reference< XGroup> xGroup(_xGroups->getByIndex(i),uno::UNO_QUERY_THROW); |
| const ::sal_Int16 nGroupOn = xGroup->getGroupOn(); |
| if ( nGroupOn != report::GroupOn::DEFAULT ) |
| { |
| uno::Reference< XFunction> xFunction = xFunctions->createFunction(); |
| ::rtl::OUString sFunction,sPrefix,sPostfix; |
| ::rtl::OUString sExpression = xGroup->getExpression(); |
| ::rtl::OUString sFunctionName; |
| switch(nGroupOn) |
| { |
| case report::GroupOn::PREFIX_CHARACTERS: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LEFT")); |
| sPrefix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";")) + ::rtl::OUString::valueOf(xGroup->getGroupInterval()); |
| break; |
| case report::GroupOn::YEAR: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("YEAR")); |
| break; |
| case report::GroupOn::QUARTAL: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INT((MONTH")); |
| sPostfix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-1)/3)+1")); |
| sFunctionName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("QUARTAL_")) + sExpression; |
| break; |
| case report::GroupOn::MONTH: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MONTH")); |
| break; |
| case report::GroupOn::WEEK: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WEEK")); |
| break; |
| case report::GroupOn::DAY: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DAY")); |
| break; |
| case report::GroupOn::HOUR: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HOUR")); |
| break; |
| case report::GroupOn::MINUTE: |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MINUTE")); |
| break; |
| case report::GroupOn::INTERVAL: |
| { |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INT")); |
| uno::Reference< XFunction> xCountFunction = xFunctions->createFunction(); |
| xCountFunction->setInitialFormula(beans::Optional< ::rtl::OUString>(sal_True,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:1")))); |
| ::rtl::OUString sCountName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_count_")) + sExpression; |
| xCountFunction->setName(sCountName); |
| xCountFunction->setFormula(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:[")) + sCountName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("] + 1"))); |
| exportFunction(xCountFunction); |
| sExpression = sCountName; |
| sPrefix = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" / ")) + ::rtl::OUString::valueOf(xGroup->getGroupInterval()); |
| sFunctionName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_")) + sExpression; |
| } |
| break; |
| default: |
| ; |
| } |
| if ( !sFunctionName.getLength() ) |
| sFunctionName = sFunction + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_")) + sExpression; |
| if ( sFunction.getLength() ) |
| { |
| sal_Unicode pReplaceChars[] = { '(',')',';',',','+','-','[',']','/','*'}; |
| for(sal_uInt32 j= 0; j < sizeof(pReplaceChars)/sizeof(pReplaceChars[0]);++j) |
| sFunctionName = sFunctionName.replace(pReplaceChars[j],'_'); |
| |
| xFunction->setName(sFunctionName); |
| sFunction = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("rpt:")) + sFunction; |
| sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("([")); |
| sFunction += sExpression; |
| sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]")); |
| |
| if ( sPrefix.getLength() ) |
| sFunction += sPrefix; |
| sFunction += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")); |
| if ( sPostfix.getLength() ) |
| sFunction += sPostfix; |
| xFunction->setFormula(sFunction); |
| exportFunction(xFunction); |
| m_aGroupFunctionMap.insert(TGroupFunctionMap::value_type(xGroup,xFunction)); |
| } |
| } |
| } |
| } |
| } |
| |
| // ----------------------------------------------------------------------------- |
| }// rptxml |
| // ----------------------------------------------------------------------------- |
| |