| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_xmloff.hxx" |
| |
| #include "XFormsModelContext.hxx" |
| #include <vector> |
| #include <utility> |
| #include "xmloff/xformsimport.hxx" |
| #include <com/sun/star/uno/Reference.hxx> |
| #include <com/sun/star/beans/XPropertySet.hpp> |
| #include <com/sun/star/form/binding/XValueBinding.hpp> |
| #include <com/sun/star/form/binding/XBindableValue.hpp> |
| #include <com/sun/star/form/binding/XListEntrySource.hpp> |
| #include <com/sun/star/form/binding/XListEntrySink.hpp> |
| #include <com/sun/star/form/submission/XSubmission.hpp> |
| #include <com/sun/star/form/submission/XSubmissionSupplier.hpp> |
| #include <com/sun/star/container/XNameAccess.hpp> |
| #include <rtl/ustring.hxx> |
| #include <xformsapi.hxx> |
| #include <comphelper/namedvaluecollection.hxx> |
| #include <tools/diagnose_ex.h> |
| |
| using std::pair; |
| using com::sun::star::uno::Reference; |
| using com::sun::star::uno::Exception; |
| using com::sun::star::uno::UNO_QUERY; |
| using com::sun::star::uno::UNO_QUERY_THROW; |
| using com::sun::star::uno::UNO_SET_THROW; |
| using com::sun::star::uno::Sequence; |
| using com::sun::star::beans::XPropertySet; |
| using com::sun::star::beans::XPropertySetInfo; |
| using com::sun::star::beans::PropertyValue; |
| using com::sun::star::frame::XModel; |
| using com::sun::star::container::XNameAccess; |
| using com::sun::star::form::binding::XValueBinding; |
| using com::sun::star::form::binding::XBindableValue; |
| using com::sun::star::form::binding::XListEntrySource; |
| using com::sun::star::form::binding::XListEntrySink; |
| using com::sun::star::form::submission::XSubmission; |
| using com::sun::star::form::submission::XSubmissionSupplier; |
| using rtl::OUString; |
| |
| SvXMLImportContext* createXFormsModelContext( |
| SvXMLImport& rImport, |
| sal_uInt16 nPrefix, |
| const rtl::OUString& rLocalName ) |
| { |
| return new XFormsModelContext( rImport, nPrefix, rLocalName ); |
| } |
| |
| void bindXFormsValueBinding( |
| Reference<XModel> xModel, |
| pair<Reference<XPropertySet>,OUString> aPair ) |
| { |
| Reference<XBindableValue> xBindable( |
| aPair.first, |
| UNO_QUERY ); |
| Reference<XValueBinding> xBinding( |
| lcl_findXFormsBinding( xModel, aPair.second ), |
| UNO_QUERY ); |
| |
| if( xBindable.is() && xBinding.is() ) |
| { |
| try |
| { |
| xBindable->setValueBinding( xBinding ); |
| } |
| catch( const Exception& ) |
| { |
| // ignore problems during binding |
| // TODO: call XML error handling |
| } |
| } |
| } |
| |
| void bindXFormsListBinding( |
| Reference<XModel> xModel, |
| ::pair<Reference<XPropertySet>,OUString> aPair ) |
| { |
| Reference<XListEntrySink> xListEntrySink( |
| aPair.first, |
| UNO_QUERY ); |
| Reference<XListEntrySource> xListEntrySource( |
| lcl_findXFormsBinding( xModel, aPair.second ), |
| UNO_QUERY ); |
| |
| if( xListEntrySink.is() && xListEntrySource.is() ) |
| { |
| try |
| { |
| xListEntrySink->setListEntrySource( xListEntrySource ); |
| } |
| catch( const Exception& ) |
| { |
| // ignore problems during binding |
| // TODO: call XML error handling |
| } |
| } |
| } |
| |
| void bindXFormsSubmission( |
| Reference<XModel> xModel, |
| pair<Reference<XPropertySet>,OUString> aPair ) |
| { |
| Reference<XSubmissionSupplier> xSubmissionSupp( aPair.first, UNO_QUERY ); |
| Reference<XSubmission> xSubmission( |
| lcl_findXFormsSubmission( xModel, aPair.second ), |
| UNO_QUERY ); |
| |
| if( xSubmissionSupp.is() && xSubmission.is() ) |
| { |
| try |
| { |
| xSubmissionSupp->setSubmission( xSubmission ); |
| } |
| catch( const Exception& ) |
| { |
| // ignore problems during binding |
| // TODO: call XML error handling |
| } |
| } |
| } |
| |
| void applyXFormsSettings( const Reference< XNameAccess >& _rXForms, const Sequence< PropertyValue >& _rSettings ) |
| { |
| OSL_PRECOND( _rXForms.is(), "applyXFormsSettings: invalid XForms container!" ); |
| if ( !_rXForms.is() ) |
| return; |
| |
| ::comphelper::NamedValueCollection aSettings( _rSettings ); |
| Reference< XNameAccess > xModelSettings( aSettings.get( "XFormModels" ), UNO_QUERY ); |
| if ( !xModelSettings.is() ) |
| { |
| OSL_ENSURE( false, "applyXFormsSettings: wrong type for the XFormModels settings!" ); |
| return; |
| } |
| |
| try |
| { |
| Sequence< ::rtl::OUString > aSettingsForModels( xModelSettings->getElementNames() ); |
| for ( const ::rtl::OUString* pModelName = aSettingsForModels.getConstArray(); |
| pModelName != aSettingsForModels.getConstArray() + aSettingsForModels.getLength(); |
| ++pModelName |
| ) |
| { |
| // the settings for this particular model |
| Sequence< PropertyValue > aModelSettings; |
| OSL_VERIFY( xModelSettings->getByName( *pModelName ) >>= aModelSettings ); |
| |
| // the model itself |
| if ( !_rXForms->hasByName( *pModelName ) ) |
| { |
| OSL_ENSURE( false, "applyXFormsSettings: have settings for a non-existent XForms model!" ); |
| continue; |
| } |
| |
| // propagate the settings, being tolerant by omitting properties which are not supported |
| Reference< XPropertySet > xModelProps( _rXForms->getByName( *pModelName ), UNO_QUERY_THROW ); |
| Reference< XPropertySetInfo > xModelPSI( xModelProps->getPropertySetInfo(), UNO_SET_THROW ); |
| |
| for ( const PropertyValue* pSetting = aModelSettings.getConstArray(); |
| pSetting != aModelSettings.getConstArray() + aModelSettings.getLength(); |
| ++pSetting |
| ) |
| { |
| if ( !xModelPSI->hasPropertyByName( pSetting->Name ) ) |
| { |
| OSL_ENSURE( false, "applyXFormsSettings: non-existent model property!" ); |
| continue; |
| } |
| |
| xModelProps->setPropertyValue( pSetting->Name, pSetting->Value ); |
| } |
| } |
| } |
| catch( const Exception& ) |
| { |
| DBG_UNHANDLED_EXCEPTION(); |
| } |
| } |