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 27 #include "XFormsModelContext.hxx" 28 #include <vector> 29 #include <utility> 30 #include "xmloff/xformsimport.hxx" 31 #include <com/sun/star/uno/Reference.hxx> 32 #include <com/sun/star/beans/XPropertySet.hpp> 33 #include <com/sun/star/form/binding/XValueBinding.hpp> 34 #include <com/sun/star/form/binding/XBindableValue.hpp> 35 #include <com/sun/star/form/binding/XListEntrySource.hpp> 36 #include <com/sun/star/form/binding/XListEntrySink.hpp> 37 #include <com/sun/star/form/submission/XSubmission.hpp> 38 #include <com/sun/star/form/submission/XSubmissionSupplier.hpp> 39 #include <com/sun/star/container/XNameAccess.hpp> 40 #include <rtl/ustring.hxx> 41 #include <xformsapi.hxx> 42 #include <comphelper/namedvaluecollection.hxx> 43 #include <tools/diagnose_ex.h> 44 45 using std::pair; 46 using com::sun::star::uno::Reference; 47 using com::sun::star::uno::Exception; 48 using com::sun::star::uno::UNO_QUERY; 49 using com::sun::star::uno::UNO_QUERY_THROW; 50 using com::sun::star::uno::UNO_SET_THROW; 51 using com::sun::star::uno::Sequence; 52 using com::sun::star::beans::XPropertySet; 53 using com::sun::star::beans::XPropertySetInfo; 54 using com::sun::star::beans::PropertyValue; 55 using com::sun::star::frame::XModel; 56 using com::sun::star::container::XNameAccess; 57 using com::sun::star::form::binding::XValueBinding; 58 using com::sun::star::form::binding::XBindableValue; 59 using com::sun::star::form::binding::XListEntrySource; 60 using com::sun::star::form::binding::XListEntrySink; 61 using com::sun::star::form::submission::XSubmission; 62 using com::sun::star::form::submission::XSubmissionSupplier; 63 using rtl::OUString; 64 createXFormsModelContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const rtl::OUString & rLocalName)65 SvXMLImportContext* createXFormsModelContext( 66 SvXMLImport& rImport, 67 sal_uInt16 nPrefix, 68 const rtl::OUString& rLocalName ) 69 { 70 return new XFormsModelContext( rImport, nPrefix, rLocalName ); 71 } 72 bindXFormsValueBinding(Reference<XModel> xModel,pair<Reference<XPropertySet>,OUString> aPair)73 void bindXFormsValueBinding( 74 Reference<XModel> xModel, 75 pair<Reference<XPropertySet>,OUString> aPair ) 76 { 77 Reference<XBindableValue> xBindable( 78 aPair.first, 79 UNO_QUERY ); 80 Reference<XValueBinding> xBinding( 81 lcl_findXFormsBinding( xModel, aPair.second ), 82 UNO_QUERY ); 83 84 if( xBindable.is() && xBinding.is() ) 85 { 86 try 87 { 88 xBindable->setValueBinding( xBinding ); 89 } 90 catch( const Exception& ) 91 { 92 // ignore problems during binding 93 // TODO: call XML error handling 94 } 95 } 96 } 97 bindXFormsListBinding(Reference<XModel> xModel,::pair<Reference<XPropertySet>,OUString> aPair)98 void bindXFormsListBinding( 99 Reference<XModel> xModel, 100 ::pair<Reference<XPropertySet>,OUString> aPair ) 101 { 102 Reference<XListEntrySink> xListEntrySink( 103 aPair.first, 104 UNO_QUERY ); 105 Reference<XListEntrySource> xListEntrySource( 106 lcl_findXFormsBinding( xModel, aPair.second ), 107 UNO_QUERY ); 108 109 if( xListEntrySink.is() && xListEntrySource.is() ) 110 { 111 try 112 { 113 xListEntrySink->setListEntrySource( xListEntrySource ); 114 } 115 catch( const Exception& ) 116 { 117 // ignore problems during binding 118 // TODO: call XML error handling 119 } 120 } 121 } 122 bindXFormsSubmission(Reference<XModel> xModel,pair<Reference<XPropertySet>,OUString> aPair)123 void bindXFormsSubmission( 124 Reference<XModel> xModel, 125 pair<Reference<XPropertySet>,OUString> aPair ) 126 { 127 Reference<XSubmissionSupplier> xSubmissionSupp( aPair.first, UNO_QUERY ); 128 Reference<XSubmission> xSubmission( 129 lcl_findXFormsSubmission( xModel, aPair.second ), 130 UNO_QUERY ); 131 132 if( xSubmissionSupp.is() && xSubmission.is() ) 133 { 134 try 135 { 136 xSubmissionSupp->setSubmission( xSubmission ); 137 } 138 catch( const Exception& ) 139 { 140 // ignore problems during binding 141 // TODO: call XML error handling 142 } 143 } 144 } 145 applyXFormsSettings(const Reference<XNameAccess> & _rXForms,const Sequence<PropertyValue> & _rSettings)146 void applyXFormsSettings( const Reference< XNameAccess >& _rXForms, const Sequence< PropertyValue >& _rSettings ) 147 { 148 OSL_PRECOND( _rXForms.is(), "applyXFormsSettings: invalid XForms container!" ); 149 if ( !_rXForms.is() ) 150 return; 151 152 ::comphelper::NamedValueCollection aSettings( _rSettings ); 153 Reference< XNameAccess > xModelSettings( aSettings.get( "XFormModels" ), UNO_QUERY ); 154 if ( !xModelSettings.is() ) 155 { 156 OSL_ENSURE( false, "applyXFormsSettings: wrong type for the XFormModels settings!" ); 157 return; 158 } 159 160 try 161 { 162 Sequence< ::rtl::OUString > aSettingsForModels( xModelSettings->getElementNames() ); 163 for ( const ::rtl::OUString* pModelName = aSettingsForModels.getConstArray(); 164 pModelName != aSettingsForModels.getConstArray() + aSettingsForModels.getLength(); 165 ++pModelName 166 ) 167 { 168 // the settings for this particular model 169 Sequence< PropertyValue > aModelSettings; 170 OSL_VERIFY( xModelSettings->getByName( *pModelName ) >>= aModelSettings ); 171 172 // the model itself 173 if ( !_rXForms->hasByName( *pModelName ) ) 174 { 175 OSL_ENSURE( false, "applyXFormsSettings: have settings for a non-existent XForms model!" ); 176 continue; 177 } 178 179 // propagate the settings, being tolerant by omitting properties which are not supported 180 Reference< XPropertySet > xModelProps( _rXForms->getByName( *pModelName ), UNO_QUERY_THROW ); 181 Reference< XPropertySetInfo > xModelPSI( xModelProps->getPropertySetInfo(), UNO_SET_THROW ); 182 183 for ( const PropertyValue* pSetting = aModelSettings.getConstArray(); 184 pSetting != aModelSettings.getConstArray() + aModelSettings.getLength(); 185 ++pSetting 186 ) 187 { 188 if ( !xModelPSI->hasPropertyByName( pSetting->Name ) ) 189 { 190 OSL_ENSURE( false, "applyXFormsSettings: non-existent model property!" ); 191 continue; 192 } 193 194 xModelProps->setPropertyValue( pSetting->Name, pSetting->Value ); 195 } 196 } 197 } 198 catch( const Exception& ) 199 { 200 DBG_UNHANDLED_EXCEPTION(); 201 } 202 } 203