1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <stdio.h> 28*b1cdbd2cSJim Jagielski #include "layerexport.hxx" 29*b1cdbd2cSJim Jagielski #include "strings.hxx" 30*b1cdbd2cSJim Jagielski #include <xmloff/xmlexp.hxx> 31*b1cdbd2cSJim Jagielski #include <xmloff/nmspmap.hxx> 32*b1cdbd2cSJim Jagielski #include "xmloff/xmlnmspe.hxx" 33*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx> 34*b1cdbd2cSJim Jagielski #include <xmloff/xmlprmap.hxx> 35*b1cdbd2cSJim Jagielski #include <xmloff/prhdlfac.hxx> 36*b1cdbd2cSJim Jagielski #include "elementexport.hxx" 37*b1cdbd2cSJim Jagielski #include <xmloff/families.hxx> 38*b1cdbd2cSJim Jagielski #include <xmloff/contextid.hxx> 39*b1cdbd2cSJim Jagielski #include <xmloff/controlpropertyhdl.hxx> 40*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 41*b1cdbd2cSJim Jagielski #include "controlpropertymap.hxx" 42*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp> 43*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XFormsSupplier2.hpp> 44*b1cdbd2cSJim Jagielski #include <com/sun/star/xforms/XFormsSupplier.hpp> 45*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp> 46*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp> 47*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp> 48*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XEventAttacherManager.hpp> 49*b1cdbd2cSJim Jagielski #include "eventexport.hxx" 50*b1cdbd2cSJim Jagielski #include <xmloff/XMLEventExport.hxx> 51*b1cdbd2cSJim Jagielski #include "formevents.hxx" 52*b1cdbd2cSJim Jagielski #include <xmloff/xmlnumfe.hxx> 53*b1cdbd2cSJim Jagielski #include "xmloff/xformsexport.hxx" 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 56*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp> 57*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 58*b1cdbd2cSJim Jagielski 59*b1cdbd2cSJim Jagielski #include <numeric> 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski //......................................................................... 62*b1cdbd2cSJim Jagielski namespace xmloff 63*b1cdbd2cSJim Jagielski { 64*b1cdbd2cSJim Jagielski //......................................................................... 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 67*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt; 68*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang; 69*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans; 70*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container; 71*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::drawing; 72*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form; 73*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::script; 74*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util; 75*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text; 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski typedef ::com::sun::star::xforms::XFormsSupplier XXFormsSupplier; 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski //===================================================================== 80*b1cdbd2cSJim Jagielski //= OFormLayerXMLExport_Impl 81*b1cdbd2cSJim Jagielski //===================================================================== 82*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getControlNumberStyleNamePrefix()83*b1cdbd2cSJim Jagielski const ::rtl::OUString& OFormLayerXMLExport_Impl::getControlNumberStyleNamePrefix() 84*b1cdbd2cSJim Jagielski { 85*b1cdbd2cSJim Jagielski static const ::rtl::OUString s_sControlNumberStyleNamePrefix = ::rtl::OUString::createFromAscii("C"); 86*b1cdbd2cSJim Jagielski return s_sControlNumberStyleNamePrefix; 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- OFormLayerXMLExport_Impl(SvXMLExport & _rContext)90*b1cdbd2cSJim Jagielski OFormLayerXMLExport_Impl::OFormLayerXMLExport_Impl(SvXMLExport& _rContext) 91*b1cdbd2cSJim Jagielski :m_rContext(_rContext) 92*b1cdbd2cSJim Jagielski ,m_pControlNumberStyles(NULL) 93*b1cdbd2cSJim Jagielski { 94*b1cdbd2cSJim Jagielski initializePropertyMaps(); 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski // add our style family to the export context's style pool 97*b1cdbd2cSJim Jagielski m_xPropertyHandlerFactory = new OControlPropertyHandlerFactory(); 98*b1cdbd2cSJim Jagielski ::vos::ORef< XMLPropertySetMapper > xStylePropertiesMapper = new XMLPropertySetMapper( getControlStylePropertyMap(), m_xPropertyHandlerFactory.getBodyPtr() ); 99*b1cdbd2cSJim Jagielski m_xStyleExportMapper = new OFormComponentStyleExportMapper( xStylePropertiesMapper.getBodyPtr() ); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski // our style family 102*b1cdbd2cSJim Jagielski m_rContext.GetAutoStylePool()->AddFamily( 103*b1cdbd2cSJim Jagielski XML_STYLE_FAMILY_CONTROL_ID, token::GetXMLToken(token::XML_PARAGRAPH), 104*b1cdbd2cSJim Jagielski m_xStyleExportMapper.getBodyPtr(), 105*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XML_STYLE_FAMILY_CONTROL_PREFIX) ) 106*b1cdbd2cSJim Jagielski ); 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski // add our event translation table 109*b1cdbd2cSJim Jagielski m_rContext.GetEventExport().AddTranslationTable(g_pFormsEventTranslation); 110*b1cdbd2cSJim Jagielski 111*b1cdbd2cSJim Jagielski clear(); 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski ~OFormLayerXMLExport_Impl()114*b1cdbd2cSJim Jagielski OFormLayerXMLExport_Impl::~OFormLayerXMLExport_Impl() 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- impl_isFormPageContainingForms(const Reference<XDrawPage> & _rxDrawPage,Reference<XIndexAccess> & _rxForms)119*b1cdbd2cSJim Jagielski sal_Bool OFormLayerXMLExport_Impl::impl_isFormPageContainingForms(const Reference< XDrawPage >& _rxDrawPage, Reference< XIndexAccess >& _rxForms) 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski Reference< XFormsSupplier2 > xFormsSupp(_rxDrawPage, UNO_QUERY); 122*b1cdbd2cSJim Jagielski OSL_ENSURE(xFormsSupp.is(), "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid draw page (no XFormsSupplier)! Doin' nothing!"); 123*b1cdbd2cSJim Jagielski if (!xFormsSupp.is()) 124*b1cdbd2cSJim Jagielski return sal_False; 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski if ( !xFormsSupp->hasForms() ) 127*b1cdbd2cSJim Jagielski // nothing to do at all 128*b1cdbd2cSJim Jagielski return sal_False; 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski _rxForms = Reference< XIndexAccess >(xFormsSupp->getForms(), UNO_QUERY); 131*b1cdbd2cSJim Jagielski Reference< XServiceInfo > xSI(_rxForms, UNO_QUERY); // order is important! 132*b1cdbd2cSJim Jagielski OSL_ENSURE(xSI.is(), "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid collection (must not be NULL and must have a ServiceInfo)!"); 133*b1cdbd2cSJim Jagielski if (!xSI.is()) 134*b1cdbd2cSJim Jagielski return sal_False; 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski if (!xSI->supportsService(SERVICE_FORMSCOLLECTION)) 137*b1cdbd2cSJim Jagielski { 138*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "OFormLayerXMLExport_Impl::impl_isFormPageContainingForms: invalid collection (is no com.sun.star.form.Forms)!"); 139*b1cdbd2cSJim Jagielski // nothing to do 140*b1cdbd2cSJim Jagielski return sal_False; 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski return sal_True; 143*b1cdbd2cSJim Jagielski } 144*b1cdbd2cSJim Jagielski 145*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportGridColumn(const Reference<XPropertySet> & _rxColumn,const Sequence<ScriptEventDescriptor> & _rEvents)146*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportGridColumn(const Reference< XPropertySet >& _rxColumn, 147*b1cdbd2cSJim Jagielski const Sequence< ScriptEventDescriptor >& _rEvents) 148*b1cdbd2cSJim Jagielski { 149*b1cdbd2cSJim Jagielski // do the exporting 150*b1cdbd2cSJim Jagielski OColumnExport aExportImpl(*this, _rxColumn, getControlId( _rxColumn ), _rEvents); 151*b1cdbd2cSJim Jagielski aExportImpl.doExport(); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportControl(const Reference<XPropertySet> & _rxControl,const Sequence<ScriptEventDescriptor> & _rEvents)155*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportControl(const Reference< XPropertySet >& _rxControl, 156*b1cdbd2cSJim Jagielski const Sequence< ScriptEventDescriptor >& _rEvents) 157*b1cdbd2cSJim Jagielski { 158*b1cdbd2cSJim Jagielski // the list of the referring controls 159*b1cdbd2cSJim Jagielski ::rtl::OUString sReferringControls; 160*b1cdbd2cSJim Jagielski MapPropertySet2String::const_iterator aReferring = m_aCurrentPageReferring->second.find(_rxControl); 161*b1cdbd2cSJim Jagielski if (aReferring != m_aCurrentPageReferring->second.end()) 162*b1cdbd2cSJim Jagielski sReferringControls = aReferring->second; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski // the control id (should already have been created in examineForms) 165*b1cdbd2cSJim Jagielski ::rtl::OUString sControlId( getControlId( _rxControl ) ); 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski // do the exporting 168*b1cdbd2cSJim Jagielski OControlExport aExportImpl(*this, _rxControl, sControlId, sReferringControls, _rEvents); 169*b1cdbd2cSJim Jagielski aExportImpl.doExport(); 170*b1cdbd2cSJim Jagielski } 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportForm(const Reference<XPropertySet> & _rxProps,const Sequence<ScriptEventDescriptor> & _rEvents)173*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportForm(const Reference< XPropertySet >& _rxProps, 174*b1cdbd2cSJim Jagielski const Sequence< ScriptEventDescriptor >& _rEvents) 175*b1cdbd2cSJim Jagielski { 176*b1cdbd2cSJim Jagielski OSL_ENSURE(_rxProps.is(), "OFormLayerXMLExport_Impl::exportForm: invalid property set!"); 177*b1cdbd2cSJim Jagielski OFormExport aAttributeHandler(*this, _rxProps, _rEvents); 178*b1cdbd2cSJim Jagielski aAttributeHandler.doExport(); 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getStylePropertyMapper()182*b1cdbd2cSJim Jagielski ::vos::ORef< SvXMLExportPropertyMapper > OFormLayerXMLExport_Impl::getStylePropertyMapper() 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski return m_xStyleExportMapper; 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getGlobalContext()188*b1cdbd2cSJim Jagielski SvXMLExport& OFormLayerXMLExport_Impl::getGlobalContext() 189*b1cdbd2cSJim Jagielski { 190*b1cdbd2cSJim Jagielski return m_rContext; 191*b1cdbd2cSJim Jagielski } 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportCollectionElements(const Reference<XIndexAccess> & _rxCollection)194*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportCollectionElements(const Reference< XIndexAccess >& _rxCollection) 195*b1cdbd2cSJim Jagielski { 196*b1cdbd2cSJim Jagielski // step through all the elements of the collection 197*b1cdbd2cSJim Jagielski sal_Int32 nElements = _rxCollection->getCount(); 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski Reference< XEventAttacherManager > xElementEventManager(_rxCollection, UNO_QUERY); 200*b1cdbd2cSJim Jagielski Sequence< ScriptEventDescriptor > aElementEvents; 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > xPropsInfo; 203*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xCurrentContainer; 204*b1cdbd2cSJim Jagielski for (sal_Int32 i=0; i<nElements; ++i) 205*b1cdbd2cSJim Jagielski { 206*b1cdbd2cSJim Jagielski try 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski // extract the current element 209*b1cdbd2cSJim Jagielski Reference< XPropertySet > xCurrentProps( _rxCollection->getByIndex(i), UNO_QUERY ); 210*b1cdbd2cSJim Jagielski OSL_ENSURE(xCurrentProps.is(), "OFormLayerXMLExport_Impl::exportCollectionElements: invalid child element, skipping!"); 211*b1cdbd2cSJim Jagielski if (!xCurrentProps.is()) 212*b1cdbd2cSJim Jagielski continue; 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski // check if there is a ClassId property on the current element. If so, we assume it to be a control 215*b1cdbd2cSJim Jagielski xPropsInfo = xCurrentProps->getPropertySetInfo(); 216*b1cdbd2cSJim Jagielski OSL_ENSURE(xPropsInfo.is(), "OFormLayerXMLExport_Impl::exportCollectionElements: no property set info!"); 217*b1cdbd2cSJim Jagielski if (!xPropsInfo.is()) 218*b1cdbd2cSJim Jagielski // without this, a lot of stuff in the export routines may fail 219*b1cdbd2cSJim Jagielski continue; 220*b1cdbd2cSJim Jagielski 221*b1cdbd2cSJim Jagielski // if the element is part of a ignore list, we are not allowed to export it 222*b1cdbd2cSJim Jagielski if ( m_aIgnoreList.end() != m_aIgnoreList.find( xCurrentProps ) ) 223*b1cdbd2cSJim Jagielski continue; 224*b1cdbd2cSJim Jagielski 225*b1cdbd2cSJim Jagielski if (xElementEventManager.is()) 226*b1cdbd2cSJim Jagielski aElementEvents = xElementEventManager->getScriptEvents(i); 227*b1cdbd2cSJim Jagielski 228*b1cdbd2cSJim Jagielski if (xPropsInfo->hasPropertyByName(PROPERTY_COLUMNSERVICENAME)) 229*b1cdbd2cSJim Jagielski { 230*b1cdbd2cSJim Jagielski exportGridColumn(xCurrentProps, aElementEvents); 231*b1cdbd2cSJim Jagielski } 232*b1cdbd2cSJim Jagielski else if (xPropsInfo->hasPropertyByName(PROPERTY_CLASSID)) 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski exportControl(xCurrentProps, aElementEvents); 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski else 237*b1cdbd2cSJim Jagielski { 238*b1cdbd2cSJim Jagielski exportForm(xCurrentProps, aElementEvents); 239*b1cdbd2cSJim Jagielski } 240*b1cdbd2cSJim Jagielski } 241*b1cdbd2cSJim Jagielski catch(Exception&) 242*b1cdbd2cSJim Jagielski { 243*b1cdbd2cSJim Jagielski OSL_ENSURE(sal_False, "OFormLayerXMLExport_Impl::exportCollectionElements: caught an exception ... skipping the current element!"); 244*b1cdbd2cSJim Jagielski continue; 245*b1cdbd2cSJim Jagielski } 246*b1cdbd2cSJim Jagielski } 247*b1cdbd2cSJim Jagielski } 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getObjectStyleName(const Reference<XPropertySet> & _rxObject)250*b1cdbd2cSJim Jagielski ::rtl::OUString OFormLayerXMLExport_Impl::getObjectStyleName( const Reference< XPropertySet >& _rxObject ) 251*b1cdbd2cSJim Jagielski { 252*b1cdbd2cSJim Jagielski ::rtl::OUString aObjectStyle; 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski MapPropertySet2String::const_iterator aObjectStylePos = m_aGridColumnStyles.find( _rxObject ); 255*b1cdbd2cSJim Jagielski if ( m_aGridColumnStyles.end() != aObjectStylePos ) 256*b1cdbd2cSJim Jagielski aObjectStyle = aObjectStylePos->second; 257*b1cdbd2cSJim Jagielski return aObjectStyle; 258*b1cdbd2cSJim Jagielski } 259*b1cdbd2cSJim Jagielski 260*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- clear()261*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::clear() 262*b1cdbd2cSJim Jagielski { 263*b1cdbd2cSJim Jagielski m_aControlIds.clear(); 264*b1cdbd2cSJim Jagielski m_aReferringControls.clear(); 265*b1cdbd2cSJim Jagielski m_aCurrentPageIds = m_aControlIds.end(); 266*b1cdbd2cSJim Jagielski m_aCurrentPageReferring = m_aReferringControls.end(); 267*b1cdbd2cSJim Jagielski 268*b1cdbd2cSJim Jagielski m_aControlNumberFormats.clear(); 269*b1cdbd2cSJim Jagielski m_aGridColumnStyles.clear(); 270*b1cdbd2cSJim Jagielski 271*b1cdbd2cSJim Jagielski m_aIgnoreList.clear(); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportControlNumberStyles()275*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportControlNumberStyles() 276*b1cdbd2cSJim Jagielski { 277*b1cdbd2cSJim Jagielski if (m_pControlNumberStyles) 278*b1cdbd2cSJim Jagielski m_pControlNumberStyles->Export(sal_False); 279*b1cdbd2cSJim Jagielski } 280*b1cdbd2cSJim Jagielski 281*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportAutoControlNumberStyles()282*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportAutoControlNumberStyles() 283*b1cdbd2cSJim Jagielski { 284*b1cdbd2cSJim Jagielski if ( m_pControlNumberStyles ) 285*b1cdbd2cSJim Jagielski m_pControlNumberStyles->Export( sal_True ); 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski 288*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportAutoStyles()289*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportAutoStyles() 290*b1cdbd2cSJim Jagielski { 291*b1cdbd2cSJim Jagielski m_rContext.GetAutoStylePool()->exportXML( 292*b1cdbd2cSJim Jagielski XML_STYLE_FAMILY_CONTROL_ID, 293*b1cdbd2cSJim Jagielski m_rContext.GetDocHandler(), 294*b1cdbd2cSJim Jagielski m_rContext.GetMM100UnitConverter(), 295*b1cdbd2cSJim Jagielski m_rContext.GetNamespaceMap() 296*b1cdbd2cSJim Jagielski ); 297*b1cdbd2cSJim Jagielski } 298*b1cdbd2cSJim Jagielski 299*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportForms(const Reference<XDrawPage> & _rxDrawPage)300*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportForms(const Reference< XDrawPage >& _rxDrawPage) 301*b1cdbd2cSJim Jagielski { 302*b1cdbd2cSJim Jagielski // get the forms collection of the page 303*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xCollectionIndex; 304*b1cdbd2cSJim Jagielski if (!impl_isFormPageContainingForms(_rxDrawPage, xCollectionIndex)) 305*b1cdbd2cSJim Jagielski return; 306*b1cdbd2cSJim Jagielski 307*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 308*b1cdbd2cSJim Jagielski sal_Bool bPageIsKnown = 309*b1cdbd2cSJim Jagielski #endif 310*b1cdbd2cSJim Jagielski implMoveIterators(_rxDrawPage, sal_False); 311*b1cdbd2cSJim Jagielski OSL_ENSURE(bPageIsKnown, "OFormLayerXMLExport_Impl::exportForms: exporting a page which has not been examined!"); 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski // export forms collection 314*b1cdbd2cSJim Jagielski exportCollectionElements(xCollectionIndex); 315*b1cdbd2cSJim Jagielski } 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- exportXForms() const318*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::exportXForms() const 319*b1cdbd2cSJim Jagielski { 320*b1cdbd2cSJim Jagielski // export XForms models 321*b1cdbd2cSJim Jagielski ::exportXForms( m_rContext ); 322*b1cdbd2cSJim Jagielski } 323*b1cdbd2cSJim Jagielski 324*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- pageContainsForms(const Reference<XDrawPage> & _rxDrawPage) const325*b1cdbd2cSJim Jagielski bool OFormLayerXMLExport_Impl::pageContainsForms( const Reference< XDrawPage >& _rxDrawPage ) const 326*b1cdbd2cSJim Jagielski { 327*b1cdbd2cSJim Jagielski Reference< XFormsSupplier2 > xFormsSupp( _rxDrawPage, UNO_QUERY ); 328*b1cdbd2cSJim Jagielski DBG_ASSERT( xFormsSupp.is(), "OFormLayerXMLExport_Impl::pageContainsForms: no XFormsSupplier2!" ); 329*b1cdbd2cSJim Jagielski return xFormsSupp.is() && xFormsSupp->hasForms(); 330*b1cdbd2cSJim Jagielski } 331*b1cdbd2cSJim Jagielski 332*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- documentContainsXForms() const333*b1cdbd2cSJim Jagielski bool OFormLayerXMLExport_Impl::documentContainsXForms() const 334*b1cdbd2cSJim Jagielski { 335*b1cdbd2cSJim Jagielski Reference< XXFormsSupplier > xXFormSupp( m_rContext.GetModel(), UNO_QUERY ); 336*b1cdbd2cSJim Jagielski Reference< XNameContainer > xForms; 337*b1cdbd2cSJim Jagielski if ( xXFormSupp.is() ) 338*b1cdbd2cSJim Jagielski xForms = xXFormSupp->getXForms(); 339*b1cdbd2cSJim Jagielski return xForms.is() && xForms->hasElements(); 340*b1cdbd2cSJim Jagielski } 341*b1cdbd2cSJim Jagielski 342*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- implMoveIterators(const Reference<XDrawPage> & _rxDrawPage,sal_Bool _bClear)343*b1cdbd2cSJim Jagielski sal_Bool OFormLayerXMLExport_Impl::implMoveIterators(const Reference< XDrawPage >& _rxDrawPage, sal_Bool _bClear) 344*b1cdbd2cSJim Jagielski { 345*b1cdbd2cSJim Jagielski sal_Bool bKnownPage = sal_False; 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski // the one for the ids 348*b1cdbd2cSJim Jagielski m_aCurrentPageIds = m_aControlIds.find(_rxDrawPage); 349*b1cdbd2cSJim Jagielski if (m_aControlIds.end() == m_aCurrentPageIds) 350*b1cdbd2cSJim Jagielski { 351*b1cdbd2cSJim Jagielski m_aControlIds[_rxDrawPage] = MapPropertySet2String(); 352*b1cdbd2cSJim Jagielski m_aCurrentPageIds = m_aControlIds.find(_rxDrawPage); 353*b1cdbd2cSJim Jagielski } 354*b1cdbd2cSJim Jagielski else 355*b1cdbd2cSJim Jagielski { 356*b1cdbd2cSJim Jagielski bKnownPage = sal_True; 357*b1cdbd2cSJim Jagielski if (_bClear && !m_aCurrentPageIds->second.empty() ) 358*b1cdbd2cSJim Jagielski m_aCurrentPageIds->second.clear(); 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski 361*b1cdbd2cSJim Jagielski // the one for the ids of the referring controls 362*b1cdbd2cSJim Jagielski m_aCurrentPageReferring = m_aReferringControls.find(_rxDrawPage); 363*b1cdbd2cSJim Jagielski if (m_aReferringControls.end() == m_aCurrentPageReferring) 364*b1cdbd2cSJim Jagielski { 365*b1cdbd2cSJim Jagielski m_aReferringControls[_rxDrawPage] = MapPropertySet2String(); 366*b1cdbd2cSJim Jagielski m_aCurrentPageReferring = m_aReferringControls.find(_rxDrawPage); 367*b1cdbd2cSJim Jagielski } 368*b1cdbd2cSJim Jagielski else 369*b1cdbd2cSJim Jagielski { 370*b1cdbd2cSJim Jagielski bKnownPage = sal_True; 371*b1cdbd2cSJim Jagielski if (_bClear && !m_aCurrentPageReferring->second.empty() ) 372*b1cdbd2cSJim Jagielski m_aCurrentPageReferring->second.clear(); 373*b1cdbd2cSJim Jagielski } 374*b1cdbd2cSJim Jagielski return bKnownPage; 375*b1cdbd2cSJim Jagielski } 376*b1cdbd2cSJim Jagielski 377*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- seekPage(const Reference<XDrawPage> & _rxDrawPage)378*b1cdbd2cSJim Jagielski sal_Bool OFormLayerXMLExport_Impl::seekPage(const Reference< XDrawPage >& _rxDrawPage) 379*b1cdbd2cSJim Jagielski { 380*b1cdbd2cSJim Jagielski sal_Bool bKnownPage = implMoveIterators( _rxDrawPage, sal_False ); 381*b1cdbd2cSJim Jagielski if ( bKnownPage ) 382*b1cdbd2cSJim Jagielski return sal_True; 383*b1cdbd2cSJim Jagielski 384*b1cdbd2cSJim Jagielski // if the page is not yet known, this does not automatically mean that it has 385*b1cdbd2cSJim Jagielski // not been examined. Instead, examineForms returns silently and successfully 386*b1cdbd2cSJim Jagielski // if a page is a XFormsPageSupplier2, but does not have a forms collection 387*b1cdbd2cSJim Jagielski // (This behaviour of examineForms is a performance optimization, to not force 388*b1cdbd2cSJim Jagielski // the page to create a forms container just to see that it's empty.) 389*b1cdbd2cSJim Jagielski 390*b1cdbd2cSJim Jagielski // So, in such a case, seekPage is considered to be successfull, too, though the 391*b1cdbd2cSJim Jagielski // page was not yet known 392*b1cdbd2cSJim Jagielski Reference< XFormsSupplier2 > xFormsSupp( _rxDrawPage, UNO_QUERY ); 393*b1cdbd2cSJim Jagielski if ( xFormsSupp.is() && !xFormsSupp->hasForms() ) 394*b1cdbd2cSJim Jagielski return sal_True; 395*b1cdbd2cSJim Jagielski 396*b1cdbd2cSJim Jagielski // anything else means that the page has not been examined before, or it's no 397*b1cdbd2cSJim Jagielski // valid form page. Both cases are Bad (TM). 398*b1cdbd2cSJim Jagielski return sal_False; 399*b1cdbd2cSJim Jagielski } 400*b1cdbd2cSJim Jagielski 401*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getControlId(const Reference<XPropertySet> & _rxControl)402*b1cdbd2cSJim Jagielski ::rtl::OUString OFormLayerXMLExport_Impl::getControlId(const Reference< XPropertySet >& _rxControl) 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski OSL_ENSURE(m_aCurrentPageIds != m_aControlIds.end(), "OFormLayerXMLExport_Impl::getControlId: invalid current page!"); 405*b1cdbd2cSJim Jagielski OSL_ENSURE(m_aCurrentPageIds->second.end() != m_aCurrentPageIds->second.find(_rxControl), 406*b1cdbd2cSJim Jagielski "OFormLayerXMLExport_Impl::getControlId: can not find the control!"); 407*b1cdbd2cSJim Jagielski return m_aCurrentPageIds->second[_rxControl]; 408*b1cdbd2cSJim Jagielski } 409*b1cdbd2cSJim Jagielski 410*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getImmediateNumberStyle(const Reference<XPropertySet> & _rxObject)411*b1cdbd2cSJim Jagielski ::rtl::OUString OFormLayerXMLExport_Impl::getImmediateNumberStyle( const Reference< XPropertySet >& _rxObject ) 412*b1cdbd2cSJim Jagielski { 413*b1cdbd2cSJim Jagielski ::rtl::OUString sNumberStyle; 414*b1cdbd2cSJim Jagielski 415*b1cdbd2cSJim Jagielski sal_Int32 nOwnFormatKey = implExamineControlNumberFormat( _rxObject ); 416*b1cdbd2cSJim Jagielski if ( -1 != nOwnFormatKey ) 417*b1cdbd2cSJim Jagielski sNumberStyle = getControlNumberStyleExport()->GetStyleName( nOwnFormatKey ); 418*b1cdbd2cSJim Jagielski 419*b1cdbd2cSJim Jagielski return sNumberStyle; 420*b1cdbd2cSJim Jagielski } 421*b1cdbd2cSJim Jagielski 422*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getControlNumberStyle(const Reference<XPropertySet> & _rxControl)423*b1cdbd2cSJim Jagielski ::rtl::OUString OFormLayerXMLExport_Impl::getControlNumberStyle( const Reference< XPropertySet >& _rxControl ) 424*b1cdbd2cSJim Jagielski { 425*b1cdbd2cSJim Jagielski ::rtl::OUString sNumberStyle; 426*b1cdbd2cSJim Jagielski 427*b1cdbd2cSJim Jagielski ConstMapPropertySet2IntIterator aControlFormatPos = m_aControlNumberFormats.find(_rxControl); 428*b1cdbd2cSJim Jagielski if (m_aControlNumberFormats.end() != aControlFormatPos) 429*b1cdbd2cSJim Jagielski { 430*b1cdbd2cSJim Jagielski OSL_ENSURE(m_pControlNumberStyles, "OFormLayerXMLExport_Impl::getControlNumberStyle: have a control which has a format style, but no style exporter!"); 431*b1cdbd2cSJim Jagielski sNumberStyle = getControlNumberStyleExport()->GetStyleName(aControlFormatPos->second); 432*b1cdbd2cSJim Jagielski } 433*b1cdbd2cSJim Jagielski // it's allowed to ask for a control which does not have format information. 434*b1cdbd2cSJim Jagielski // (This is for performance reasons) 435*b1cdbd2cSJim Jagielski 436*b1cdbd2cSJim Jagielski return sNumberStyle; 437*b1cdbd2cSJim Jagielski } 438*b1cdbd2cSJim Jagielski 439*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- examineForms(const Reference<XDrawPage> & _rxDrawPage)440*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::examineForms(const Reference< XDrawPage >& _rxDrawPage) 441*b1cdbd2cSJim Jagielski { 442*b1cdbd2cSJim Jagielski // get the forms collection of the page 443*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xCollectionIndex; 444*b1cdbd2cSJim Jagielski if (!impl_isFormPageContainingForms(_rxDrawPage, xCollectionIndex)) 445*b1cdbd2cSJim Jagielski return; 446*b1cdbd2cSJim Jagielski 447*b1cdbd2cSJim Jagielski // move the iterator which specify the currently handled page 448*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 449*b1cdbd2cSJim Jagielski sal_Bool bPageIsKnown = 450*b1cdbd2cSJim Jagielski #endif 451*b1cdbd2cSJim Jagielski implMoveIterators(_rxDrawPage, sal_True); 452*b1cdbd2cSJim Jagielski OSL_ENSURE(!bPageIsKnown, "OFormLayerXMLExport_Impl::examineForms: examining a page twice!"); 453*b1cdbd2cSJim Jagielski 454*b1cdbd2cSJim Jagielski ::std::stack< Reference< XIndexAccess > > aContainerHistory; 455*b1cdbd2cSJim Jagielski ::std::stack< sal_Int32 > aIndexHistory; 456*b1cdbd2cSJim Jagielski 457*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xLoop = xCollectionIndex; 458*b1cdbd2cSJim Jagielski sal_Int32 nChildPos = 0; 459*b1cdbd2cSJim Jagielski do 460*b1cdbd2cSJim Jagielski { 461*b1cdbd2cSJim Jagielski if (nChildPos < xLoop->getCount()) 462*b1cdbd2cSJim Jagielski { 463*b1cdbd2cSJim Jagielski Reference< XPropertySet > xCurrent( xLoop->getByIndex( nChildPos ), UNO_QUERY ); 464*b1cdbd2cSJim Jagielski OSL_ENSURE(xCurrent.is(), "OFormLayerXMLExport_Impl::examineForms: invalid child object"); 465*b1cdbd2cSJim Jagielski if (!xCurrent.is()) 466*b1cdbd2cSJim Jagielski continue; 467*b1cdbd2cSJim Jagielski 468*b1cdbd2cSJim Jagielski if (!checkExamineControl(xCurrent)) 469*b1cdbd2cSJim Jagielski { 470*b1cdbd2cSJim Jagielski // step down 471*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xNextContainer(xCurrent, UNO_QUERY); 472*b1cdbd2cSJim Jagielski OSL_ENSURE(xNextContainer.is(), "OFormLayerXMLExport_Impl::examineForms: what the heck is this ... no control, no container?"); 473*b1cdbd2cSJim Jagielski aContainerHistory.push(xLoop); 474*b1cdbd2cSJim Jagielski aIndexHistory.push(nChildPos); 475*b1cdbd2cSJim Jagielski 476*b1cdbd2cSJim Jagielski xLoop = xNextContainer; 477*b1cdbd2cSJim Jagielski nChildPos = -1; // will be incremented below 478*b1cdbd2cSJim Jagielski } 479*b1cdbd2cSJim Jagielski ++nChildPos; 480*b1cdbd2cSJim Jagielski } 481*b1cdbd2cSJim Jagielski else 482*b1cdbd2cSJim Jagielski { 483*b1cdbd2cSJim Jagielski // step up 484*b1cdbd2cSJim Jagielski while ((nChildPos >= xLoop->getCount()) && !aContainerHistory.empty() ) 485*b1cdbd2cSJim Jagielski { 486*b1cdbd2cSJim Jagielski xLoop = aContainerHistory.top(); 487*b1cdbd2cSJim Jagielski aContainerHistory.pop(); 488*b1cdbd2cSJim Jagielski nChildPos = aIndexHistory.top(); 489*b1cdbd2cSJim Jagielski aIndexHistory.pop(); 490*b1cdbd2cSJim Jagielski 491*b1cdbd2cSJim Jagielski ++nChildPos; 492*b1cdbd2cSJim Jagielski } 493*b1cdbd2cSJim Jagielski if (nChildPos >= xLoop->getCount()) 494*b1cdbd2cSJim Jagielski // exited the loop above because we have no history anymore (0 == aContainerHistory.size()), 495*b1cdbd2cSJim Jagielski // and on the current level there are no more children 496*b1cdbd2cSJim Jagielski // -> leave 497*b1cdbd2cSJim Jagielski break; 498*b1cdbd2cSJim Jagielski } 499*b1cdbd2cSJim Jagielski } 500*b1cdbd2cSJim Jagielski while (xLoop.is()); 501*b1cdbd2cSJim Jagielski } 502*b1cdbd2cSJim Jagielski 503*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 504*b1cdbd2cSJim Jagielski namespace 505*b1cdbd2cSJim Jagielski { 506*b1cdbd2cSJim Jagielski struct AccumulateSize : public ::std::binary_function< size_t, MapPropertySet2Map::value_type, size_t > 507*b1cdbd2cSJim Jagielski { operator ()xmloff::__anon2accfe500111::AccumulateSize508*b1cdbd2cSJim Jagielski size_t operator()( size_t _size, const MapPropertySet2Map::value_type& _map ) const 509*b1cdbd2cSJim Jagielski { 510*b1cdbd2cSJim Jagielski return _size + _map.second.size(); 511*b1cdbd2cSJim Jagielski } 512*b1cdbd2cSJim Jagielski }; 513*b1cdbd2cSJim Jagielski lcl_findFreeControlId(const MapPropertySet2Map & _rAllPagesControlIds)514*b1cdbd2cSJim Jagielski ::rtl::OUString lcl_findFreeControlId( const MapPropertySet2Map& _rAllPagesControlIds ) 515*b1cdbd2cSJim Jagielski { 516*b1cdbd2cSJim Jagielski static const ::rtl::OUString sControlIdBase( RTL_CONSTASCII_USTRINGPARAM( "control" ) ); 517*b1cdbd2cSJim Jagielski ::rtl::OUString sControlId = sControlIdBase; 518*b1cdbd2cSJim Jagielski 519*b1cdbd2cSJim Jagielski size_t nKnownControlCount = ::std::accumulate( _rAllPagesControlIds.begin(), _rAllPagesControlIds.end(), (size_t)0, AccumulateSize() ); 520*b1cdbd2cSJim Jagielski sControlId += ::rtl::OUString::valueOf( (sal_Int32)nKnownControlCount + 1 ); 521*b1cdbd2cSJim Jagielski 522*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL 523*b1cdbd2cSJim Jagielski // Check if the id is already used. It shouldn't, as we currently have no mechanism for removing entries 524*b1cdbd2cSJim Jagielski // from the map, so the approach used above (take the accumulated map size) should be sufficient. But if 525*b1cdbd2cSJim Jagielski // somebody changes this (e.g. allows removing entries from the map), the assertion below probably will fail. 526*b1cdbd2cSJim Jagielski for ( MapPropertySet2Map::const_iterator outer = _rAllPagesControlIds.begin(); 527*b1cdbd2cSJim Jagielski outer != _rAllPagesControlIds.end(); 528*b1cdbd2cSJim Jagielski ++outer 529*b1cdbd2cSJim Jagielski ) 530*b1cdbd2cSJim Jagielski for ( MapPropertySet2String::const_iterator inner = outer->second.begin(); 531*b1cdbd2cSJim Jagielski inner != outer->second.end(); 532*b1cdbd2cSJim Jagielski ++inner 533*b1cdbd2cSJim Jagielski ) 534*b1cdbd2cSJim Jagielski { 535*b1cdbd2cSJim Jagielski OSL_ENSURE( inner->second != sControlId, 536*b1cdbd2cSJim Jagielski "lcl_findFreeControlId: auto-generated control ID is already used!" ); 537*b1cdbd2cSJim Jagielski } 538*b1cdbd2cSJim Jagielski #endif 539*b1cdbd2cSJim Jagielski return sControlId; 540*b1cdbd2cSJim Jagielski } 541*b1cdbd2cSJim Jagielski } 542*b1cdbd2cSJim Jagielski 543*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- checkExamineControl(const Reference<XPropertySet> & _rxObject)544*b1cdbd2cSJim Jagielski sal_Bool OFormLayerXMLExport_Impl::checkExamineControl(const Reference< XPropertySet >& _rxObject) 545*b1cdbd2cSJim Jagielski { 546*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > xCurrentInfo = _rxObject->getPropertySetInfo(); 547*b1cdbd2cSJim Jagielski OSL_ENSURE(xCurrentInfo.is(), "OFormLayerXMLExport_Impl::checkExamineControl: no property set info"); 548*b1cdbd2cSJim Jagielski 549*b1cdbd2cSJim Jagielski sal_Bool bIsControl = xCurrentInfo->hasPropertyByName( PROPERTY_CLASSID ); 550*b1cdbd2cSJim Jagielski if (bIsControl) 551*b1cdbd2cSJim Jagielski { 552*b1cdbd2cSJim Jagielski // ---------------------------------- 553*b1cdbd2cSJim Jagielski // generate a new control id 554*b1cdbd2cSJim Jagielski 555*b1cdbd2cSJim Jagielski // find a free id 556*b1cdbd2cSJim Jagielski ::rtl::OUString sCurrentId = lcl_findFreeControlId( m_aControlIds ); 557*b1cdbd2cSJim Jagielski // add it to the map 558*b1cdbd2cSJim Jagielski m_aCurrentPageIds->second[_rxObject] = sCurrentId; 559*b1cdbd2cSJim Jagielski 560*b1cdbd2cSJim Jagielski // ---------------------------------- 561*b1cdbd2cSJim Jagielski // check if this control has a "LabelControl" property referring another control 562*b1cdbd2cSJim Jagielski if ( xCurrentInfo->hasPropertyByName( PROPERTY_CONTROLLABEL ) ) 563*b1cdbd2cSJim Jagielski { 564*b1cdbd2cSJim Jagielski Reference< XPropertySet > xCurrentReference( _rxObject->getPropertyValue( PROPERTY_CONTROLLABEL ), UNO_QUERY ); 565*b1cdbd2cSJim Jagielski if (xCurrentReference.is()) 566*b1cdbd2cSJim Jagielski { 567*b1cdbd2cSJim Jagielski ::rtl::OUString& sReferencedBy = m_aCurrentPageReferring->second[xCurrentReference]; 568*b1cdbd2cSJim Jagielski if (sReferencedBy.getLength()) 569*b1cdbd2cSJim Jagielski // it's not the first _rxObject referring to the xCurrentReference 570*b1cdbd2cSJim Jagielski // -> separate the id 571*b1cdbd2cSJim Jagielski sReferencedBy += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(",")); 572*b1cdbd2cSJim Jagielski sReferencedBy += sCurrentId; 573*b1cdbd2cSJim Jagielski } 574*b1cdbd2cSJim Jagielski } 575*b1cdbd2cSJim Jagielski 576*b1cdbd2cSJim Jagielski // ---------------------------------- 577*b1cdbd2cSJim Jagielski // check if the control needs a number format style 578*b1cdbd2cSJim Jagielski if ( xCurrentInfo->hasPropertyByName( PROPERTY_FORMATKEY ) ) 579*b1cdbd2cSJim Jagielski { 580*b1cdbd2cSJim Jagielski examineControlNumberFormat(_rxObject); 581*b1cdbd2cSJim Jagielski } 582*b1cdbd2cSJim Jagielski 583*b1cdbd2cSJim Jagielski // ---------------------------------- 584*b1cdbd2cSJim Jagielski // check if it's a control providing text 585*b1cdbd2cSJim Jagielski Reference< XText > xControlText( _rxObject, UNO_QUERY ); 586*b1cdbd2cSJim Jagielski if ( xControlText.is() ) 587*b1cdbd2cSJim Jagielski { 588*b1cdbd2cSJim Jagielski m_rContext.GetTextParagraphExport()->collectTextAutoStyles( xControlText ); 589*b1cdbd2cSJim Jagielski } 590*b1cdbd2cSJim Jagielski 591*b1cdbd2cSJim Jagielski // ---------------------------------- 592*b1cdbd2cSJim Jagielski // check if it is a grid control - in this case, we need special handling for the columns 593*b1cdbd2cSJim Jagielski sal_Int16 nControlType = FormComponentType::CONTROL; 594*b1cdbd2cSJim Jagielski _rxObject->getPropertyValue( PROPERTY_CLASSID ) >>= nControlType; 595*b1cdbd2cSJim Jagielski if ( FormComponentType::GRIDCONTROL == nControlType ) 596*b1cdbd2cSJim Jagielski { 597*b1cdbd2cSJim Jagielski collectGridColumnStylesAndIds( _rxObject ); 598*b1cdbd2cSJim Jagielski } 599*b1cdbd2cSJim Jagielski } 600*b1cdbd2cSJim Jagielski 601*b1cdbd2cSJim Jagielski return bIsControl; 602*b1cdbd2cSJim Jagielski } 603*b1cdbd2cSJim Jagielski 604*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- collectGridColumnStylesAndIds(const Reference<XPropertySet> & _rxControl)605*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds( const Reference< XPropertySet >& _rxControl ) 606*b1cdbd2cSJim Jagielski { 607*b1cdbd2cSJim Jagielski // loop through all columns of the grid 608*b1cdbd2cSJim Jagielski try 609*b1cdbd2cSJim Jagielski { 610*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xContainer( _rxControl, UNO_QUERY ); 611*b1cdbd2cSJim Jagielski OSL_ENSURE( xContainer.is(), "OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: grid control not being a container?!" ); 612*b1cdbd2cSJim Jagielski if ( !xContainer.is() ) 613*b1cdbd2cSJim Jagielski return; 614*b1cdbd2cSJim Jagielski 615*b1cdbd2cSJim Jagielski Reference< XPropertySetInfo > xColumnPropertiesMeta; 616*b1cdbd2cSJim Jagielski 617*b1cdbd2cSJim Jagielski sal_Int32 nCount = xContainer->getCount(); 618*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; i<nCount; ++i ) 619*b1cdbd2cSJim Jagielski { 620*b1cdbd2cSJim Jagielski Reference< XPropertySet > xColumnProperties( xContainer->getByIndex( i ), UNO_QUERY ); 621*b1cdbd2cSJim Jagielski OSL_ENSURE( xColumnProperties.is(), "OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: invalid grid column encountered!" ); 622*b1cdbd2cSJim Jagielski if ( !xColumnProperties.is() ) 623*b1cdbd2cSJim Jagielski continue; 624*b1cdbd2cSJim Jagielski 625*b1cdbd2cSJim Jagielski // ---------------------------------- 626*b1cdbd2cSJim Jagielski // generate a new control id 627*b1cdbd2cSJim Jagielski 628*b1cdbd2cSJim Jagielski // find a free id 629*b1cdbd2cSJim Jagielski ::rtl::OUString sCurrentId = lcl_findFreeControlId( m_aControlIds ); 630*b1cdbd2cSJim Jagielski // add it to the map 631*b1cdbd2cSJim Jagielski m_aCurrentPageIds->second[ xColumnProperties ] = sCurrentId; 632*b1cdbd2cSJim Jagielski 633*b1cdbd2cSJim Jagielski // ---------------------------------- 634*b1cdbd2cSJim Jagielski // determine a number style, if needed 635*b1cdbd2cSJim Jagielski xColumnPropertiesMeta = xColumnProperties->getPropertySetInfo(); 636*b1cdbd2cSJim Jagielski // get the styles of the column 637*b1cdbd2cSJim Jagielski ::std::vector< XMLPropertyState > aPropertyStates = m_xStyleExportMapper->Filter( xColumnProperties ); 638*b1cdbd2cSJim Jagielski 639*b1cdbd2cSJim Jagielski // care for the number format, additionally 640*b1cdbd2cSJim Jagielski ::rtl::OUString sColumnNumberStyle; 641*b1cdbd2cSJim Jagielski if ( xColumnPropertiesMeta.is() && xColumnPropertiesMeta->hasPropertyByName( PROPERTY_FORMATKEY ) ) 642*b1cdbd2cSJim Jagielski sColumnNumberStyle = getImmediateNumberStyle( xColumnProperties ); 643*b1cdbd2cSJim Jagielski 644*b1cdbd2cSJim Jagielski if ( sColumnNumberStyle.getLength() ) 645*b1cdbd2cSJim Jagielski { // the column indeed has a formatting 646*b1cdbd2cSJim Jagielski sal_Int32 nStyleMapIndex = m_xStyleExportMapper->getPropertySetMapper()->FindEntryIndex( CTF_FORMS_DATA_STYLE ); 647*b1cdbd2cSJim Jagielski // TODO: move this to the ctor 648*b1cdbd2cSJim Jagielski OSL_ENSURE ( -1 != nStyleMapIndex, "XMLShapeExport::collectShapeAutoStyles: could not obtain the index for our context id!"); 649*b1cdbd2cSJim Jagielski 650*b1cdbd2cSJim Jagielski XMLPropertyState aNumberStyleState( nStyleMapIndex, makeAny( sColumnNumberStyle ) ); 651*b1cdbd2cSJim Jagielski aPropertyStates.push_back( aNumberStyleState ); 652*b1cdbd2cSJim Jagielski } 653*b1cdbd2cSJim Jagielski 654*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 655*b1cdbd2cSJim Jagielski ::std::vector< XMLPropertyState >::const_iterator aHaveALook = aPropertyStates.begin(); 656*b1cdbd2cSJim Jagielski for ( ; aHaveALook != aPropertyStates.end(); ++aHaveALook ) 657*b1cdbd2cSJim Jagielski { 658*b1cdbd2cSJim Jagielski (void)aHaveALook; 659*b1cdbd2cSJim Jagielski } 660*b1cdbd2cSJim Jagielski #endif 661*b1cdbd2cSJim Jagielski 662*b1cdbd2cSJim Jagielski // ---------------------------------- 663*b1cdbd2cSJim Jagielski // determine the column style 664*b1cdbd2cSJim Jagielski 665*b1cdbd2cSJim Jagielski if ( !aPropertyStates.empty() ) 666*b1cdbd2cSJim Jagielski { // add to the style pool 667*b1cdbd2cSJim Jagielski ::rtl::OUString sColumnStyleName = m_rContext.GetAutoStylePool()->Add( XML_STYLE_FAMILY_CONTROL_ID, aPropertyStates ); 668*b1cdbd2cSJim Jagielski 669*b1cdbd2cSJim Jagielski OSL_ENSURE( m_aGridColumnStyles.end() == m_aGridColumnStyles.find( xColumnProperties ), 670*b1cdbd2cSJim Jagielski "OFormLayerXMLExport_Impl::collectGridColumnStylesAndIds: already have a style for this column!" ); 671*b1cdbd2cSJim Jagielski 672*b1cdbd2cSJim Jagielski m_aGridColumnStyles.insert( MapPropertySet2String::value_type( xColumnProperties, sColumnStyleName ) ); 673*b1cdbd2cSJim Jagielski } 674*b1cdbd2cSJim Jagielski } 675*b1cdbd2cSJim Jagielski } 676*b1cdbd2cSJim Jagielski catch( const Exception& ) 677*b1cdbd2cSJim Jagielski { 678*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 679*b1cdbd2cSJim Jagielski } 680*b1cdbd2cSJim Jagielski } 681*b1cdbd2cSJim Jagielski 682*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- implExamineControlNumberFormat(const Reference<XPropertySet> & _rxObject)683*b1cdbd2cSJim Jagielski sal_Int32 OFormLayerXMLExport_Impl::implExamineControlNumberFormat( const Reference< XPropertySet >& _rxObject ) 684*b1cdbd2cSJim Jagielski { 685*b1cdbd2cSJim Jagielski // get the format key relative to our own formats supplier 686*b1cdbd2cSJim Jagielski sal_Int32 nOwnFormatKey = ensureTranslateFormat( _rxObject ); 687*b1cdbd2cSJim Jagielski 688*b1cdbd2cSJim Jagielski if ( -1 != nOwnFormatKey ) 689*b1cdbd2cSJim Jagielski // tell the exporter that we used this format 690*b1cdbd2cSJim Jagielski getControlNumberStyleExport()->SetUsed( nOwnFormatKey ); 691*b1cdbd2cSJim Jagielski 692*b1cdbd2cSJim Jagielski return nOwnFormatKey; 693*b1cdbd2cSJim Jagielski } 694*b1cdbd2cSJim Jagielski 695*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- examineControlNumberFormat(const Reference<XPropertySet> & _rxControl)696*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::examineControlNumberFormat( const Reference< XPropertySet >& _rxControl ) 697*b1cdbd2cSJim Jagielski { 698*b1cdbd2cSJim Jagielski sal_Int32 nOwnFormatKey = implExamineControlNumberFormat( _rxControl ); 699*b1cdbd2cSJim Jagielski 700*b1cdbd2cSJim Jagielski if ( -1 == nOwnFormatKey ) 701*b1cdbd2cSJim Jagielski // nothing to do, the number format of this control is void 702*b1cdbd2cSJim Jagielski return; 703*b1cdbd2cSJim Jagielski 704*b1cdbd2cSJim Jagielski // remember the format key for this control (we'll be asked in getControlNumberStyle for this) 705*b1cdbd2cSJim Jagielski OSL_ENSURE(m_aControlNumberFormats.end() == m_aControlNumberFormats.find(_rxControl), 706*b1cdbd2cSJim Jagielski "OFormLayerXMLExport_Impl::examineControlNumberFormat: already handled this control!"); 707*b1cdbd2cSJim Jagielski m_aControlNumberFormats[_rxControl] = nOwnFormatKey; 708*b1cdbd2cSJim Jagielski } 709*b1cdbd2cSJim Jagielski 710*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- ensureTranslateFormat(const Reference<XPropertySet> & _rxFormattedControl)711*b1cdbd2cSJim Jagielski sal_Int32 OFormLayerXMLExport_Impl::ensureTranslateFormat(const Reference< XPropertySet >& _rxFormattedControl) 712*b1cdbd2cSJim Jagielski { 713*b1cdbd2cSJim Jagielski ensureControlNumberStyleExport(); 714*b1cdbd2cSJim Jagielski OSL_ENSURE(m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: no own formats supplier!"); 715*b1cdbd2cSJim Jagielski // (should have been created in ensureControlNumberStyleExport) 716*b1cdbd2cSJim Jagielski 717*b1cdbd2cSJim Jagielski sal_Int32 nOwnFormatKey = -1; 718*b1cdbd2cSJim Jagielski 719*b1cdbd2cSJim Jagielski // the format key (relative to the control's supplier) 720*b1cdbd2cSJim Jagielski sal_Int32 nControlFormatKey = -1; 721*b1cdbd2cSJim Jagielski Any aControlFormatKey = _rxFormattedControl->getPropertyValue(PROPERTY_FORMATKEY); 722*b1cdbd2cSJim Jagielski if (aControlFormatKey >>= nControlFormatKey) 723*b1cdbd2cSJim Jagielski { 724*b1cdbd2cSJim Jagielski // the control's number format 725*b1cdbd2cSJim Jagielski Reference< XNumberFormatsSupplier > xControlFormatsSupplier; 726*b1cdbd2cSJim Jagielski _rxFormattedControl->getPropertyValue(PROPERTY_FORMATSSUPPLIER) >>= xControlFormatsSupplier; 727*b1cdbd2cSJim Jagielski Reference< XNumberFormats > xControlFormats; 728*b1cdbd2cSJim Jagielski if (xControlFormatsSupplier.is()) 729*b1cdbd2cSJim Jagielski xControlFormats = xControlFormatsSupplier->getNumberFormats(); 730*b1cdbd2cSJim Jagielski OSL_ENSURE(xControlFormats.is(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: formatted control without supplier!"); 731*b1cdbd2cSJim Jagielski 732*b1cdbd2cSJim Jagielski // obtain the persistent (does not depend on the formats supplier) representation of the control's format 733*b1cdbd2cSJim Jagielski Locale aFormatLocale; 734*b1cdbd2cSJim Jagielski ::rtl::OUString sFormatDescription; 735*b1cdbd2cSJim Jagielski if (xControlFormats.is()) 736*b1cdbd2cSJim Jagielski { 737*b1cdbd2cSJim Jagielski Reference< XPropertySet > xControlFormat = xControlFormats->getByKey(nControlFormatKey); 738*b1cdbd2cSJim Jagielski 739*b1cdbd2cSJim Jagielski xControlFormat->getPropertyValue(PROPERTY_LOCALE) >>= aFormatLocale; 740*b1cdbd2cSJim Jagielski xControlFormat->getPropertyValue(PROPERTY_FORMATSTRING) >>= sFormatDescription; 741*b1cdbd2cSJim Jagielski } 742*b1cdbd2cSJim Jagielski 743*b1cdbd2cSJim Jagielski // check if our own formats collection already knows the format 744*b1cdbd2cSJim Jagielski nOwnFormatKey = m_xControlNumberFormats->queryKey(sFormatDescription, aFormatLocale, sal_False); 745*b1cdbd2cSJim Jagielski if (-1 == nOwnFormatKey) 746*b1cdbd2cSJim Jagielski { // no, we don't 747*b1cdbd2cSJim Jagielski // -> create a new format 748*b1cdbd2cSJim Jagielski nOwnFormatKey = m_xControlNumberFormats->addNew(sFormatDescription, aFormatLocale); 749*b1cdbd2cSJim Jagielski } 750*b1cdbd2cSJim Jagielski OSL_ENSURE(-1 != nOwnFormatKey, "OFormLayerXMLExport_Impl::ensureTranslateFormat: could not translate the controls format key!"); 751*b1cdbd2cSJim Jagielski } 752*b1cdbd2cSJim Jagielski else 753*b1cdbd2cSJim Jagielski OSL_ENSURE(!aControlFormatKey.hasValue(), "OFormLayerXMLExport_Impl::ensureTranslateFormat: invalid number format property value!"); 754*b1cdbd2cSJim Jagielski 755*b1cdbd2cSJim Jagielski return nOwnFormatKey; 756*b1cdbd2cSJim Jagielski } 757*b1cdbd2cSJim Jagielski 758*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- ensureControlNumberStyleExport()759*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::ensureControlNumberStyleExport() 760*b1cdbd2cSJim Jagielski { 761*b1cdbd2cSJim Jagielski if (!m_pControlNumberStyles) 762*b1cdbd2cSJim Jagielski { 763*b1cdbd2cSJim Jagielski // create our number formats supplier (if necessary) 764*b1cdbd2cSJim Jagielski Reference< XNumberFormatsSupplier > xFormatsSupplier; 765*b1cdbd2cSJim Jagielski 766*b1cdbd2cSJim Jagielski OSL_ENSURE(!m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: inconsistence!"); 767*b1cdbd2cSJim Jagielski // the m_xControlNumberFormats and m_pControlNumberStyles should be maintained together 768*b1cdbd2cSJim Jagielski 769*b1cdbd2cSJim Jagielski try 770*b1cdbd2cSJim Jagielski { 771*b1cdbd2cSJim Jagielski // create it for en-US (does not really matter, as we will specify a locale for every 772*b1cdbd2cSJim Jagielski // concrete language to use) 773*b1cdbd2cSJim Jagielski Sequence< Any > aSupplierArgs(1); 774*b1cdbd2cSJim Jagielski aSupplierArgs[0] <<= Locale ( ::rtl::OUString::createFromAscii("en"), 775*b1cdbd2cSJim Jagielski ::rtl::OUString::createFromAscii("US"), 776*b1cdbd2cSJim Jagielski ::rtl::OUString() 777*b1cdbd2cSJim Jagielski ); 778*b1cdbd2cSJim Jagielski // #110680# 779*b1cdbd2cSJim Jagielski //Reference< XInterface > xFormatsSupplierUntyped = 780*b1cdbd2cSJim Jagielski // ::comphelper::getProcessServiceFactory()->createInstanceWithArguments( 781*b1cdbd2cSJim Jagielski // SERVICE_NUMBERFORMATSSUPPLIER, 782*b1cdbd2cSJim Jagielski // aSupplierArgs 783*b1cdbd2cSJim Jagielski // ); 784*b1cdbd2cSJim Jagielski Reference< XInterface > xFormatsSupplierUntyped = 785*b1cdbd2cSJim Jagielski m_rContext.getServiceFactory()->createInstanceWithArguments( 786*b1cdbd2cSJim Jagielski SERVICE_NUMBERFORMATSSUPPLIER, 787*b1cdbd2cSJim Jagielski aSupplierArgs 788*b1cdbd2cSJim Jagielski ); 789*b1cdbd2cSJim Jagielski OSL_ENSURE(xFormatsSupplierUntyped.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: could not instantiate a number formats supplier!"); 790*b1cdbd2cSJim Jagielski 791*b1cdbd2cSJim Jagielski xFormatsSupplier = Reference< XNumberFormatsSupplier >(xFormatsSupplierUntyped, UNO_QUERY); 792*b1cdbd2cSJim Jagielski if (xFormatsSupplier.is()) 793*b1cdbd2cSJim Jagielski m_xControlNumberFormats = xFormatsSupplier->getNumberFormats(); 794*b1cdbd2cSJim Jagielski } 795*b1cdbd2cSJim Jagielski catch(const Exception&) 796*b1cdbd2cSJim Jagielski { 797*b1cdbd2cSJim Jagielski } 798*b1cdbd2cSJim Jagielski 799*b1cdbd2cSJim Jagielski OSL_ENSURE(m_xControlNumberFormats.is(), "OFormLayerXMLExport_Impl::getControlNumberStyleExport: could not obtain my default number formats!"); 800*b1cdbd2cSJim Jagielski 801*b1cdbd2cSJim Jagielski // create the exporter 802*b1cdbd2cSJim Jagielski m_pControlNumberStyles = new SvXMLNumFmtExport(m_rContext, xFormatsSupplier, getControlNumberStyleNamePrefix()); 803*b1cdbd2cSJim Jagielski } 804*b1cdbd2cSJim Jagielski } 805*b1cdbd2cSJim Jagielski 806*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- getControlNumberStyleExport()807*b1cdbd2cSJim Jagielski SvXMLNumFmtExport* OFormLayerXMLExport_Impl::getControlNumberStyleExport() 808*b1cdbd2cSJim Jagielski { 809*b1cdbd2cSJim Jagielski ensureControlNumberStyleExport(); 810*b1cdbd2cSJim Jagielski return m_pControlNumberStyles; 811*b1cdbd2cSJim Jagielski } 812*b1cdbd2cSJim Jagielski 813*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- excludeFromExport(const Reference<XControlModel> _rxControl)814*b1cdbd2cSJim Jagielski void OFormLayerXMLExport_Impl::excludeFromExport( const Reference< XControlModel > _rxControl ) 815*b1cdbd2cSJim Jagielski { 816*b1cdbd2cSJim Jagielski Reference< XPropertySet > xProps( _rxControl, UNO_QUERY ); 817*b1cdbd2cSJim Jagielski OSL_ENSURE( xProps.is(), "OFormLayerXMLExport_Impl::excludeFromExport: invalid control model!" ); 818*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 819*b1cdbd2cSJim Jagielski ::std::pair< PropertySetBag::iterator, bool > aPos = 820*b1cdbd2cSJim Jagielski #endif 821*b1cdbd2cSJim Jagielski m_aIgnoreList.insert( xProps ); 822*b1cdbd2cSJim Jagielski OSL_ENSURE( aPos.second, "OFormLayerXMLExport_Impl::excludeFromExport: element already exists in the ignore list!" ); 823*b1cdbd2cSJim Jagielski } 824*b1cdbd2cSJim Jagielski 825*b1cdbd2cSJim Jagielski //......................................................................... 826*b1cdbd2cSJim Jagielski } // namespace xmloff 827*b1cdbd2cSJim Jagielski //......................................................................... 828*b1cdbd2cSJim Jagielski 829*b1cdbd2cSJim Jagielski 830