1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "layerimport.hxx" 27 #include "formenums.hxx" 28 #include "elementimport.hxx" 29 #include "officeforms.hxx" 30 #include "strings.hxx" 31 #include "formstyles.hxx" 32 #include <xmloff/xmlictxt.hxx> 33 #include <xmloff/xmlstyle.hxx> 34 #include <xmloff/families.hxx> 35 #include <xmloff/xmlprmap.hxx> 36 #include <xmloff/prstylei.hxx> 37 #include <xmloff/xmlimp.hxx> 38 #include "XMLEventImportHelper.hxx" 39 #include <xmloff/xmlimppr.hxx> 40 #include <xmloff/xmlnumfi.hxx> 41 #include <com/sun/star/util/XNumberFormatsSupplier.hpp> 42 #include <com/sun/star/form/FormSubmitEncoding.hpp> 43 #include <com/sun/star/form/FormSubmitMethod.hpp> 44 #include <com/sun/star/sdb/CommandType.hpp> 45 #include <com/sun/star/form/NavigationBarMode.hpp> 46 #include <com/sun/star/form/TabulatorCycle.hpp> 47 #include <com/sun/star/form/FormButtonType.hpp> 48 #include <com/sun/star/awt/ScrollBarOrientation.hpp> 49 #include <com/sun/star/awt/VisualEffect.hpp> 50 #include <com/sun/star/form/ListSourceType.hpp> 51 #include <tools/wintypes.hxx> // for check states 52 #include <com/sun/star/lang/Locale.hpp> 53 #include <xmloff/controlpropertyhdl.hxx> 54 #include "controlpropertymap.hxx" 55 #include "formevents.hxx" 56 #include "formcellbinding.hxx" 57 #include "xmloff/xformsimport.hxx" 58 #include <xmloff/xmltoken.hxx> 59 #include "xmloff/xmlnmspe.hxx" 60 #include <rtl/logfile.hxx> 61 #include <algorithm> 62 63 SV_IMPL_REF( SvXMLStylesContext ); 64 65 //......................................................................... 66 namespace xmloff 67 { 68 //......................................................................... 69 70 using namespace ::com::sun::star::uno; 71 using namespace ::com::sun::star::awt; 72 using namespace ::com::sun::star::lang; 73 using namespace ::com::sun::star::beans; 74 using namespace ::com::sun::star::container; 75 using namespace ::com::sun::star::drawing; 76 using namespace ::com::sun::star::xml; 77 using namespace ::com::sun::star::util; 78 using namespace ::com::sun::star::form; 79 using namespace ::com::sun::star::sdb; 80 81 //===================================================================== 82 //= OFormLayerXMLImport_Impl 83 //===================================================================== 84 //--------------------------------------------------------------------- 85 OFormLayerXMLImport_Impl::OFormLayerXMLImport_Impl(SvXMLImport& _rImporter) 86 :m_rImporter(_rImporter) 87 ,m_pAutoStyles(NULL) 88 { 89 // build the attribute2property map 90 // string properties which are exported as attributes 91 m_aAttributeMetaData.addStringProperty( 92 OAttributeMetaData::getCommonControlAttributeName(CCA_NAME), PROPERTY_NAME); 93 m_aAttributeMetaData.addStringProperty( 94 OAttributeMetaData::getCommonControlAttributeName(CCA_IMAGE_DATA), PROPERTY_IMAGEURL); 95 m_aAttributeMetaData.addStringProperty( 96 OAttributeMetaData::getCommonControlAttributeName(CCA_LABEL), PROPERTY_LABEL); 97 m_aAttributeMetaData.addStringProperty( 98 OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_LOCATION), PROPERTY_TARGETURL); 99 m_aAttributeMetaData.addStringProperty( 100 OAttributeMetaData::getCommonControlAttributeName(CCA_TITLE), PROPERTY_TITLE); 101 m_aAttributeMetaData.addStringProperty( 102 OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_FRAME), PROPERTY_TARGETFRAME, "_blank"); 103 m_aAttributeMetaData.addStringProperty( 104 OAttributeMetaData::getDatabaseAttributeName(DA_DATA_FIELD), PROPERTY_DATAFIELD); 105 m_aAttributeMetaData.addStringProperty( 106 OAttributeMetaData::getFormAttributeName(faCommand), PROPERTY_COMMAND); 107 m_aAttributeMetaData.addStringProperty( 108 OAttributeMetaData::getFormAttributeName(faDatasource), PROPERTY_DATASOURCENAME); 109 m_aAttributeMetaData.addStringProperty( 110 OAttributeMetaData::getFormAttributeName(faFilter), PROPERTY_FILTER); 111 m_aAttributeMetaData.addStringProperty( 112 OAttributeMetaData::getFormAttributeName(faOrder), PROPERTY_ORDER); 113 114 // properties not added because they're already present in another form 115 OSL_ENSURE( 116 0 == ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_TARGET_LOCATION)).compareToAscii( 117 OAttributeMetaData::getFormAttributeName(faAction)), 118 "OFormLayerXMLImport_Impl::OFormLayerXMLImport_Impl: invalid attribute names (1)!"); 119 // if this fails, we would have to add a translation from faAction->PROPERTY_TARGETURL 120 // We did not because we already have one CCA_TARGET_LOCATION->PROPERTY_TARGETURL, 121 // and CCA_TARGET_LOCATION and faAction should be represented by the same attribute 122 123 OSL_ENSURE( 124 0 == ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_NAME)).compareToAscii( 125 OAttributeMetaData::getFormAttributeName(faName)), 126 "OFormLayerXMLImport_Impl::OFormLayerXMLImport_Impl: invalid attribute names (2)!"); 127 // the same for faName, CCA_NAME and PROPERTY_NAME 128 129 // boolean properties which are exported as attributes 130 m_aAttributeMetaData.addBooleanProperty( 131 OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_SELECTED), PROPERTY_STATE, sal_False); 132 m_aAttributeMetaData.addBooleanProperty( 133 OAttributeMetaData::getCommonControlAttributeName(CCA_DISABLED), PROPERTY_ENABLED, sal_False, sal_True); 134 m_aAttributeMetaData.addBooleanProperty( 135 OAttributeMetaData::getCommonControlAttributeName(CCA_DROPDOWN), PROPERTY_DROPDOWN, sal_False); 136 m_aAttributeMetaData.addBooleanProperty( 137 OAttributeMetaData::getCommonControlAttributeName(CCA_PRINTABLE), PROPERTY_PRINTABLE, sal_True); 138 m_aAttributeMetaData.addBooleanProperty( 139 OAttributeMetaData::getCommonControlAttributeName(CCA_READONLY), PROPERTY_READONLY, sal_False); 140 m_aAttributeMetaData.addBooleanProperty( 141 OAttributeMetaData::getCommonControlAttributeName(CCA_SELECTED), PROPERTY_DEFAULT_STATE, sal_False); 142 m_aAttributeMetaData.addBooleanProperty( 143 OAttributeMetaData::getCommonControlAttributeName(CCA_TAB_STOP), PROPERTY_TABSTOP, sal_True); 144 m_aAttributeMetaData.addBooleanProperty( 145 OAttributeMetaData::getDatabaseAttributeName(DA_CONVERT_EMPTY), PROPERTY_EMPTY_IS_NULL, sal_False); 146 m_aAttributeMetaData.addBooleanProperty( 147 OAttributeMetaData::getSpecialAttributeName(SCA_VALIDATION), PROPERTY_STRICTFORMAT, sal_False); 148 m_aAttributeMetaData.addBooleanProperty( 149 OAttributeMetaData::getSpecialAttributeName(SCA_MULTI_LINE), PROPERTY_MULTILINE, sal_False); 150 m_aAttributeMetaData.addBooleanProperty( 151 OAttributeMetaData::getSpecialAttributeName(SCA_AUTOMATIC_COMPLETION), PROPERTY_AUTOCOMPLETE, sal_False); 152 m_aAttributeMetaData.addBooleanProperty( 153 OAttributeMetaData::getSpecialAttributeName(SCA_MULTIPLE), PROPERTY_MULTISELECTION, sal_False); 154 m_aAttributeMetaData.addBooleanProperty( 155 OAttributeMetaData::getSpecialAttributeName(SCA_DEFAULT_BUTTON), PROPERTY_DEFAULTBUTTON, sal_False); 156 m_aAttributeMetaData.addBooleanProperty( 157 OAttributeMetaData::getSpecialAttributeName(SCA_IS_TRISTATE), PROPERTY_TRISTATE, sal_False); 158 m_aAttributeMetaData.addBooleanProperty( 159 OAttributeMetaData::getFormAttributeName(faAllowDeletes), PROPERTY_ALLOWDELETES, sal_True); 160 m_aAttributeMetaData.addBooleanProperty( 161 OAttributeMetaData::getFormAttributeName(faAllowInserts), PROPERTY_ALLOWINSERTS, sal_True); 162 m_aAttributeMetaData.addBooleanProperty( 163 OAttributeMetaData::getFormAttributeName(faAllowUpdates), PROPERTY_ALLOWUPDATES, sal_True); 164 m_aAttributeMetaData.addBooleanProperty( 165 OAttributeMetaData::getFormAttributeName(faApplyFilter), PROPERTY_APPLYFILTER, sal_False); 166 m_aAttributeMetaData.addBooleanProperty( 167 OAttributeMetaData::getFormAttributeName(faEscapeProcessing), PROPERTY_ESCAPEPROCESSING, sal_True); 168 m_aAttributeMetaData.addBooleanProperty( 169 OAttributeMetaData::getFormAttributeName(faIgnoreResult), PROPERTY_IGNORERESULT, sal_False); 170 m_aAttributeMetaData.addBooleanProperty( 171 OAttributeMetaData::getSpecialAttributeName( SCA_TOGGLE ), PROPERTY_TOGGLE, sal_False ); 172 m_aAttributeMetaData.addBooleanProperty( 173 OAttributeMetaData::getSpecialAttributeName( SCA_FOCUS_ON_CLICK ), PROPERTY_FOCUS_ON_CLICK, sal_True ); 174 m_aAttributeMetaData.addBooleanProperty( 175 OAttributeMetaData::getDatabaseAttributeName( DA_INPUT_REQUIRED ), PROPERTY_INPUT_REQUIRED, sal_False ); 176 177 // the int16 attributes 178 m_aAttributeMetaData.addInt16Property( 179 OAttributeMetaData::getCommonControlAttributeName(CCA_MAX_LENGTH), PROPERTY_MAXTEXTLENGTH, 0); 180 m_aAttributeMetaData.addInt16Property( 181 OAttributeMetaData::getCommonControlAttributeName(CCA_SIZE), PROPERTY_LINECOUNT, 5); 182 m_aAttributeMetaData.addInt16Property( 183 OAttributeMetaData::getCommonControlAttributeName(CCA_TAB_INDEX), PROPERTY_TABINDEX, 0); 184 m_aAttributeMetaData.addInt16Property( 185 OAttributeMetaData::getDatabaseAttributeName(DA_BOUND_COLUMN), PROPERTY_BOUNDCOLUMN, 0); 186 187 // the int32 attributes 188 m_aAttributeMetaData.addInt32Property( 189 OAttributeMetaData::getSpecialAttributeName( SCA_PAGE_STEP_SIZE ), PROPERTY_BLOCK_INCREMENT, 10 ); 190 191 // the enum attributes 192 m_aAttributeMetaData.addEnumProperty( 193 OAttributeMetaData::getCommonControlAttributeName( CCA_VISUAL_EFFECT ), PROPERTY_VISUAL_EFFECT, 194 VisualEffect::LOOK3D, OEnumMapper::getEnumMap( OEnumMapper::epVisualEffect ), 195 &::getCppuType( static_cast< sal_Int16* >( NULL ) ) ); 196 m_aAttributeMetaData.addEnumProperty( 197 OAttributeMetaData::getCommonControlAttributeName( CCA_ORIENTATION ), PROPERTY_ORIENTATION, 198 ScrollBarOrientation::HORIZONTAL, OEnumMapper::getEnumMap( OEnumMapper::epOrientation ), 199 &::getCppuType( static_cast< sal_Int32* >( NULL ) ) ); 200 m_aAttributeMetaData.addEnumProperty( 201 OAttributeMetaData::getCommonControlAttributeName(CCA_BUTTON_TYPE), PROPERTY_BUTTONTYPE, 202 FormButtonType_PUSH, OEnumMapper::getEnumMap(OEnumMapper::epButtonType), 203 &::getCppuType( static_cast<FormButtonType*>(NULL) )); 204 m_aAttributeMetaData.addEnumProperty( 205 OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE_TYPE), PROPERTY_LISTSOURCETYPE, 206 ListSourceType_VALUELIST, OEnumMapper::getEnumMap(OEnumMapper::epListSourceType), 207 &::getCppuType( static_cast<ListSourceType*>(NULL) )); 208 m_aAttributeMetaData.addEnumProperty( 209 OAttributeMetaData::getSpecialAttributeName(SCA_STATE), PROPERTY_DEFAULT_STATE, STATE_NOCHECK, 210 OEnumMapper::getEnumMap(OEnumMapper::epCheckState), 211 &::getCppuType( static_cast< sal_Int16* >(NULL))); 212 m_aAttributeMetaData.addEnumProperty( 213 OAttributeMetaData::getSpecialAttributeName(SCA_CURRENT_STATE), PROPERTY_STATE, STATE_NOCHECK, 214 OEnumMapper::getEnumMap(OEnumMapper::epCheckState), 215 &::getCppuType( static_cast< sal_Int16* >(NULL))); 216 m_aAttributeMetaData.addEnumProperty( 217 OAttributeMetaData::getFormAttributeName(faEnctype), PROPERTY_SUBMIT_ENCODING, 218 FormSubmitEncoding_URL, OEnumMapper::getEnumMap(OEnumMapper::epSubmitEncoding), 219 &::getCppuType( static_cast<FormSubmitEncoding*>(NULL) )); 220 m_aAttributeMetaData.addEnumProperty( 221 OAttributeMetaData::getFormAttributeName(faMethod), PROPERTY_SUBMIT_METHOD, 222 FormSubmitMethod_GET, OEnumMapper::getEnumMap(OEnumMapper::epSubmitMethod), 223 &::getCppuType( static_cast<FormSubmitMethod*>(NULL) )); 224 m_aAttributeMetaData.addEnumProperty( 225 OAttributeMetaData::getFormAttributeName(faCommandType), PROPERTY_COMMAND_TYPE, 226 CommandType::COMMAND, OEnumMapper::getEnumMap(OEnumMapper::epCommandType)); 227 m_aAttributeMetaData.addEnumProperty( 228 OAttributeMetaData::getFormAttributeName(faNavigationMode), PROPERTY_NAVIGATION, 229 NavigationBarMode_NONE, OEnumMapper::getEnumMap(OEnumMapper::epNavigationType), 230 &::getCppuType( static_cast<NavigationBarMode*>(NULL) )); 231 m_aAttributeMetaData.addEnumProperty( 232 OAttributeMetaData::getFormAttributeName(faTabbingCycle), PROPERTY_CYCLE, 233 TabulatorCycle_RECORDS, OEnumMapper::getEnumMap(OEnumMapper::epTabCyle), 234 &::getCppuType( static_cast<TabulatorCycle*>(NULL) )); 235 236 // 'initialize' 237 m_aCurrentPageIds = m_aControlIds.end(); 238 } 239 240 //--------------------------------------------------------------------- 241 OFormLayerXMLImport_Impl::~OFormLayerXMLImport_Impl() 242 { 243 // outlined to allow forward declaration of OAttribute2Property in the header 244 245 if (m_pAutoStyles) 246 m_pAutoStyles->ReleaseRef(); 247 } 248 249 //--------------------------------------------------------------------- 250 void OFormLayerXMLImport_Impl::setAutoStyleContext(SvXMLStylesContext* _pNewContext) 251 { 252 OSL_ENSURE(!m_pAutoStyles, "OFormLayerXMLImport_Impl::setAutoStyleContext: not to be called twice!"); 253 m_pAutoStyles = _pNewContext; 254 if (m_pAutoStyles) 255 m_pAutoStyles->AddRef(); 256 } 257 258 //--------------------------------------------------------------------- 259 void OFormLayerXMLImport_Impl::applyControlNumberStyle(const Reference< XPropertySet >& _rxControlModel, const ::rtl::OUString& _rControlNumerStyleName) 260 { 261 OSL_ENSURE(_rxControlModel.is() && (0 != _rControlNumerStyleName.getLength()), 262 "OFormLayerXMLImport_Impl::applyControlNumberStyle: invalid arguments (this will crash)!"); 263 264 OSL_ENSURE(m_pAutoStyles, "OFormLayerXMLImport_Impl::applyControlNumberStyle: have no auto style context!"); 265 if (!m_pAutoStyles) 266 { 267 m_pAutoStyles = m_rImporter.GetShapeImport()->GetAutoStylesContext(); 268 if (m_pAutoStyles) 269 m_pAutoStyles->AddRef(); 270 } 271 272 if (m_pAutoStyles) 273 { 274 const SvXMLStyleContext* pStyle = m_pAutoStyles->FindStyleChildContext(XML_STYLE_FAMILY_DATA_STYLE, _rControlNumerStyleName); 275 if (pStyle) 276 { 277 const SvXMLNumFormatContext* pDataStyle = static_cast<const SvXMLNumFormatContext*>(pStyle); 278 279 // set this format at the control model 280 try 281 { 282 // the models number format supplier and formats 283 Reference< XNumberFormatsSupplier > xFormatsSupplier; 284 _rxControlModel->getPropertyValue(PROPERTY_FORMATSSUPPLIER) >>= xFormatsSupplier; 285 Reference< XNumberFormats > xFormats; 286 if (xFormatsSupplier.is()) 287 xFormats = xFormatsSupplier->getNumberFormats(); 288 OSL_ENSURE(xFormats.is(), "OFormLayerXMLImport_Impl::applyControlNumberStyle: could not obtain the controls number formats!"); 289 290 // obtain a key 291 if (xFormats.is()) 292 { 293 sal_Int32 nFormatKey = const_cast<SvXMLNumFormatContext*>(pDataStyle)->CreateAndInsert( xFormatsSupplier ); 294 OSL_ENSURE(-1 != nFormatKey, "OFormLayerXMLImport_Impl::applyControlNumberStyle: could not obtain a format key!"); 295 296 // set the format on the control model 297 _rxControlModel->setPropertyValue(PROPERTY_FORMATKEY, makeAny(nFormatKey)); 298 } 299 } 300 catch(const Exception&) 301 { 302 OSL_ENSURE(sal_False, "OFormLayerXMLImport_Impl::applyControlNumberStyle: couldn't set the format!"); 303 } 304 } 305 else 306 OSL_ENSURE(sal_False, "OFormLayerXMLImport_Impl::applyControlNumberStyle: did not find the style with the given name!"); 307 } 308 } 309 310 //--------------------------------------------------------------------- 311 void OFormLayerXMLImport_Impl::registerCellValueBinding( const Reference< XPropertySet >& _rxControlModel, const ::rtl::OUString& _rCellAddress ) 312 { 313 OSL_ENSURE( _rxControlModel.is() && _rCellAddress.getLength(), 314 "OFormLayerXMLImport_Impl::registerCellValueBinding: invalid arguments!" ); 315 m_aCellValueBindings.push_back( ModelStringPair( _rxControlModel, _rCellAddress ) ); 316 } 317 318 //--------------------------------------------------------------------- 319 void OFormLayerXMLImport_Impl::registerXFormsValueBinding( 320 const Reference< XPropertySet >& _rxControlModel, 321 const ::rtl::OUString& _rBindingID ) 322 { 323 // TODO: is an empty binding name allowed? 324 OSL_ENSURE( _rxControlModel.is(), "need model" ); 325 326 m_aXFormsValueBindings.push_back( 327 ModelStringPair( _rxControlModel, _rBindingID ) ); 328 } 329 330 //--------------------------------------------------------------------- 331 void OFormLayerXMLImport_Impl::registerXFormsListBinding( 332 const Reference< XPropertySet >& _rxControlModel, 333 const ::rtl::OUString& _rBindingID ) 334 { 335 // TODO: is an empty binding name allowed? 336 OSL_ENSURE( _rxControlModel.is(), "need model" ); 337 338 m_aXFormsListBindings.push_back( 339 ModelStringPair( _rxControlModel, _rBindingID ) ); 340 } 341 342 //--------------------------------------------------------------------- 343 void OFormLayerXMLImport_Impl::registerXFormsSubmission( 344 const Reference< XPropertySet >& _rxControlModel, 345 const ::rtl::OUString& _rSubmissionID ) 346 { 347 // TODO: is an empty binding name allowed? 348 OSL_ENSURE( _rxControlModel.is(), "need model" ); 349 350 m_aXFormsSubmissions.push_back( 351 ModelStringPair( _rxControlModel, _rSubmissionID ) ); 352 } 353 354 //--------------------------------------------------------------------- 355 void OFormLayerXMLImport_Impl::registerCellRangeListSource( const Reference< XPropertySet >& _rxControlModel, const ::rtl::OUString& _rCellRangeAddress ) 356 { 357 OSL_ENSURE( _rxControlModel.is() && _rCellRangeAddress.getLength(), 358 "OFormLayerXMLImport_Impl::registerCellRangeListSource: invalid arguments!" ); 359 m_aCellRangeListSources.push_back( ModelStringPair( _rxControlModel, _rCellRangeAddress ) ); 360 } 361 //--------------------------------------------------------------------- 362 const SvXMLStyleContext* OFormLayerXMLImport_Impl::getStyleElement(const ::rtl::OUString& _rStyleName) const 363 { 364 OSL_ENSURE( m_pAutoStyles, "OFormLayerXMLImport_Impl::getStyleElement: have no auto style context!" ); 365 // did you use setAutoStyleContext? 366 367 const SvXMLStyleContext* pControlStyle = 368 m_pAutoStyles ? m_pAutoStyles->FindStyleChildContext( XML_STYLE_FAMILY_TEXT_PARAGRAPH, _rStyleName ) : NULL; 369 OSL_ENSURE( pControlStyle || !m_pAutoStyles, 370 ::rtl::OString( "OFormLayerXMLImport_Impl::getStyleElement: did not find the style named \"" ) 371 += ::rtl::OString( _rStyleName.getStr(), _rStyleName.getLength(), RTL_TEXTENCODING_ASCII_US ) 372 += ::rtl::OString( "\"!" ) ); 373 return pControlStyle; 374 } 375 376 //--------------------------------------------------------------------- 377 void OFormLayerXMLImport_Impl::enterEventContext() 378 { 379 // install our own translation table. We need to disable the other tables because of name conflicts. 380 m_rImporter.GetEventImport().PushTranslationTable(); 381 m_rImporter.GetEventImport().AddTranslationTable(g_pFormsEventTranslation); 382 } 383 384 //--------------------------------------------------------------------- 385 void OFormLayerXMLImport_Impl::leaveEventContext() 386 { 387 // install the original event tables. 388 m_rImporter.GetEventImport().PopTranslationTable(); 389 } 390 391 //--------------------------------------------------------------------- 392 void OFormLayerXMLImport_Impl::registerControlId(const Reference< XPropertySet >& _rxControl, const ::rtl::OUString& _rId) 393 { 394 OSL_ENSURE(m_aCurrentPageIds != m_aControlIds.end(), "OFormLayerXMLImport_Impl::registerControlId: no current page!"); 395 OSL_ENSURE(_rId.getLength(), "OFormLayerXMLImport_Impl::registerControlId: invalid (empty) control id!"); 396 397 OSL_ENSURE(m_aCurrentPageIds->second.end() == m_aCurrentPageIds->second.find(_rId), "OFormLayerXMLImport_Impl::registerControlId: control id already used!"); 398 m_aCurrentPageIds->second[_rId] = _rxControl; 399 } 400 401 //--------------------------------------------------------------------- 402 void OFormLayerXMLImport_Impl::registerControlReferences(const Reference< XPropertySet >& _rxControl, const ::rtl::OUString& _rReferringControls) 403 { 404 OSL_ENSURE(_rReferringControls.getLength(), "OFormLayerXMLImport_Impl::registerControlReferences: invalid (empty) control id list!"); 405 OSL_ENSURE(_rxControl.is(), "OFormLayerXMLImport_Impl::registerControlReferences: invalid (NULL) control!"); 406 m_aControlReferences.push_back( ModelStringPair( _rxControl, _rReferringControls ) ); 407 } 408 409 //--------------------------------------------------------------------- 410 void OFormLayerXMLImport_Impl::startPage(const Reference< XDrawPage >& _rxDrawPage) 411 { 412 m_xCurrentPageFormsSupp.clear(); 413 414 OSL_ENSURE(_rxDrawPage.is(), "OFormLayerXMLImport_Impl::startPage: NULL page!"); 415 m_xCurrentPageFormsSupp = m_xCurrentPageFormsSupp.query( _rxDrawPage ); 416 OSL_ENSURE( m_xCurrentPageFormsSupp.is(), "OFormLayerXMLImport_Impl::startPage: invalid draw page (no XFormsSupplier)!" ); 417 if ( !m_xCurrentPageFormsSupp.is() ) 418 return; 419 420 // add a new entry to our page map 421 ::std::pair< MapDrawPage2MapIterator, bool > aPagePosition; 422 aPagePosition = 423 m_aControlIds.insert(MapDrawPage2Map::value_type(_rxDrawPage, MapString2PropertySet())); 424 OSL_ENSURE(aPagePosition.second, "OFormLayerXMLImport_Impl::startPage: already imported this page!"); 425 m_aCurrentPageIds = aPagePosition.first; 426 } 427 428 //--------------------------------------------------------------------- 429 void OFormLayerXMLImport_Impl::endPage() 430 { 431 OSL_ENSURE( m_xCurrentPageFormsSupp.is(), "OFormLayerXMLImport_Impl::endPage: sure you called startPage before?" ); 432 433 // do some knittings for the controls which are referring to each other 434 try 435 { 436 static const sal_Unicode s_nSeparator = ','; 437 ::rtl::OUString sReferring; 438 ::rtl::OUString sCurrentReferring; 439 ::rtl::OUString sSeparator(&s_nSeparator, 1); 440 Reference< XPropertySet > xCurrentReferring; 441 sal_Int32 nSeparator, nPrevSep; 442 ::std::vector< ModelStringPair >::const_iterator aEnd = m_aControlReferences.end(); 443 for ( ::std::vector< ModelStringPair >::const_iterator aReferences = m_aControlReferences.begin(); 444 aReferences != aEnd; 445 ++aReferences 446 ) 447 { 448 // the list of control ids is comma separated 449 450 // in a list of n ids there are only n-1 separators ... have to catch this last id 451 // -> normalize the list 452 sReferring = aReferences->second; 453 sReferring += sSeparator; 454 455 nPrevSep = -1; 456 while (-1 != (nSeparator = sReferring.indexOf(s_nSeparator, nPrevSep + 1))) 457 { 458 sCurrentReferring = sReferring.copy(nPrevSep + 1, nSeparator - nPrevSep - 1); 459 xCurrentReferring = lookupControlId(sCurrentReferring); 460 if (xCurrentReferring.is()) 461 // if this condition fails, this is an error, but lookupControlId should have asserted this ... 462 xCurrentReferring->setPropertyValue( PROPERTY_CONTROLLABEL, makeAny( aReferences->first ) ); 463 464 nPrevSep = nSeparator; 465 } 466 } 467 } 468 catch(Exception&) 469 { 470 OSL_ENSURE(sal_False, "OFormLayerXMLImport_Impl::endPage: unable to knit the control references (caught an exception)!"); 471 } 472 473 // now that we have all children of the forms collection, attach the events 474 Reference< XIndexAccess > xIndexContainer; 475 if ( m_xCurrentPageFormsSupp.is() && m_xCurrentPageFormsSupp->hasForms() ) 476 xIndexContainer = xIndexContainer.query( m_xCurrentPageFormsSupp->getForms() ); 477 if ( xIndexContainer.is() ) 478 ODefaultEventAttacherManager::setEvents( xIndexContainer ); 479 480 // clear the structures for the control references. 481 m_aControlReferences.clear(); 482 483 // and no we have no current page anymore 484 m_aCurrentPageIds = m_aControlIds.end(); 485 } 486 487 //--------------------------------------------------------------------- 488 Reference< XPropertySet > OFormLayerXMLImport_Impl::lookupControlId(const ::rtl::OUString& _rControlId) 489 { 490 OSL_ENSURE(m_aCurrentPageIds != m_aControlIds.end(), "OFormLayerXMLImport_Impl::lookupControlId: no current page!"); 491 Reference< XPropertySet > xReturn; 492 if (m_aCurrentPageIds != m_aControlIds.end()) 493 { 494 ConstMapString2PropertySetIterator aPos = m_aCurrentPageIds->second.find(_rControlId); 495 if (m_aCurrentPageIds->second.end() != aPos) 496 xReturn = aPos->second; 497 else 498 OSL_ENSURE(sal_False, "OFormLayerXMLImport_Impl::lookupControlId: invalid control id (did not find it)!"); 499 } 500 return xReturn; 501 } 502 503 //--------------------------------------------------------------------- 504 SvXMLImportContext* OFormLayerXMLImport_Impl::createOfficeFormsContext( 505 SvXMLImport& _rImport, 506 sal_uInt16 _nPrefix, 507 const rtl::OUString& _rLocalName) 508 { 509 return new OFormsRootImport( _rImport, _nPrefix, _rLocalName ); 510 } 511 512 //--------------------------------------------------------------------- 513 SvXMLImportContext* OFormLayerXMLImport_Impl::createContext(const sal_uInt16 _nPrefix, const rtl::OUString& _rLocalName, 514 const Reference< sax::XAttributeList >&) 515 { 516 SvXMLImportContext* pContext = NULL; 517 if ( 0 == _rLocalName.compareToAscii( "form" ) ) 518 { 519 if ( m_xCurrentPageFormsSupp.is() ) 520 pContext = new OFormImport(*this, *this, _nPrefix, _rLocalName, m_xCurrentPageFormsSupp->getForms() ); 521 } 522 else if ( ( _nPrefix == XML_NAMESPACE_XFORMS 523 && ( xmloff::token::IsXMLToken( _rLocalName, xmloff::token::XML_MODEL ) ) ) 524 ) 525 { 526 pContext = createXFormsModelContext( m_rImporter, _nPrefix, _rLocalName ); 527 } 528 529 if ( !pContext ) 530 { 531 OSL_ENSURE( false, "unknown element" ); 532 pContext = 533 new SvXMLImportContext(m_rImporter, _nPrefix, _rLocalName); 534 } 535 536 return pContext; 537 } 538 539 //--------------------------------------------------------------------- 540 void OFormLayerXMLImport_Impl::seekPage(const Reference< XDrawPage >& _rxDrawPage) 541 { 542 OSL_ENSURE(m_aCurrentPageIds == m_aControlIds.end(), "OFormLayerXMLImport_Impl::seekPage: importing another page currently! This will smash your import!"); 543 m_aCurrentPageIds = m_aControlIds.find(_rxDrawPage); 544 OSL_ENSURE(m_aCurrentPageIds != m_aControlIds.end(), "OFormLayerXMLImport_Impl::seekPage: did not find the given page (perhaps it has not been imported, yet?)!"); 545 } 546 547 //--------------------------------------------------------------------- 548 void OFormLayerXMLImport_Impl::documentDone( ) 549 { 550 SvXMLImport& rImport = getGlobalContext(); 551 if ( ( rImport.getImportFlags() & IMPORT_CONTENT ) == 0 ) 552 return; 553 554 // create (and bind) the spreadsheet cell bindings 555 if ( !m_aCellValueBindings.empty() 556 && FormCellBindingHelper::isCellBindingAllowed( rImport.GetModel() ) 557 ) 558 { 559 static ::rtl::OUString s_sIndex( RTL_CONSTASCII_USTRINGPARAM( ":index" ) ); 560 ::std::vector< ModelStringPair >::const_iterator aEnd = m_aCellValueBindings.end(); 561 for ( ::std::vector< ModelStringPair >::const_iterator aCellBindings = m_aCellValueBindings.begin(); 562 aCellBindings != aEnd; 563 ++aCellBindings 564 ) 565 { 566 try 567 { 568 FormCellBindingHelper aHelper( aCellBindings->first, rImport.GetModel() ); 569 OSL_ENSURE( aHelper.isCellBindingAllowed(), "OFormLayerXMLImport_Impl::documentDone: can't bind this control model!" ); 570 if ( aHelper.isCellBindingAllowed() ) 571 { 572 // There are special bindings for listboxes. See 573 // OListAndComboImport::doRegisterCellValueBinding for a comment on this HACK. 574 ::rtl::OUString sBoundCellAddress( aCellBindings->second ); 575 sal_Int32 nIndicator = sBoundCellAddress.lastIndexOf( s_sIndex ); 576 577 bool bUseIndexBinding = false; 578 if ( nIndicator != -1 ) 579 { 580 sBoundCellAddress = sBoundCellAddress.copy( 0, nIndicator ); 581 bUseIndexBinding = true; 582 } 583 584 aHelper.setBinding( aHelper.createCellBindingFromStringAddress( sBoundCellAddress, bUseIndexBinding ) ); 585 } 586 } 587 catch( const Exception& ) 588 { 589 OSL_ENSURE( sal_False, "OFormLayerXMLImport_Impl::documentDone: caught an exception while binding to a cell!" ); 590 } 591 } 592 m_aCellValueBindings.clear(); 593 } 594 595 // the same for the spreadsheet cell range list sources 596 if ( !m_aCellRangeListSources.empty() 597 && FormCellBindingHelper::isListCellRangeAllowed( rImport.GetModel() ) 598 ) 599 { 600 for ( ::std::vector< ModelStringPair >::const_iterator aRangeBindings = m_aCellRangeListSources.begin(); 601 aRangeBindings != m_aCellRangeListSources.end(); 602 ++aRangeBindings 603 ) 604 { 605 try 606 { 607 FormCellBindingHelper aHelper( aRangeBindings->first, rImport.GetModel() ); 608 OSL_ENSURE( aHelper.isListCellRangeAllowed(), "OFormLayerXMLImport_Impl::documentDone: can't bind this control model!" ); 609 if ( aHelper.isListCellRangeAllowed() ) 610 { 611 aHelper.setListSource( aHelper.createCellListSourceFromStringAddress( aRangeBindings->second ) ); 612 } 613 } 614 catch( const Exception& ) 615 { 616 OSL_ENSURE( sal_False, "OFormLayerXMLImport_Impl::documentDone: caught an exception while binding to a cell range!" ); 617 } 618 } 619 m_aCellRangeListSources.clear(); 620 } 621 622 // process XForms-bindings; call registerXFormsValueBinding for each 623 std::for_each( m_aXFormsValueBindings.begin(), 624 m_aXFormsValueBindings.end(), 625 bind1st( ptr_fun( bindXFormsValueBinding ), 626 rImport.GetModel() ) ); 627 // same for list bindings 628 std::for_each( m_aXFormsListBindings.begin(), 629 m_aXFormsListBindings.end(), 630 bind1st( ptr_fun( bindXFormsListBinding ), 631 rImport.GetModel() ) ); 632 // same for submissions 633 std::for_each( m_aXFormsSubmissions.begin(), 634 m_aXFormsSubmissions.end(), 635 bind1st( ptr_fun( bindXFormsSubmission ), 636 rImport.GetModel() ) ); 637 } 638 639 //......................................................................... 640 } // namespace xmloff 641 //......................................................................... 642 643