2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2000-12-06 16:32:01 +00:00
/*************************************************************************
*
2008-04-10 21:08:42 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-12-06 16:32:01 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2000-12-06 16:32:01 +00:00
*
2008-04-10 21:08:42 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-12-06 16:32:01 +00:00
*
2008-04-10 21:08:42 +00:00
* This file is part of OpenOffice . org .
2000-12-06 16:32:01 +00:00
*
2008-04-10 21:08:42 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2000-12-06 16:32:01 +00:00
*
2008-04-10 21:08:42 +00:00
* OpenOffice . org is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2000-12-06 16:32:01 +00:00
*
2008-04-10 21:08:42 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2000-12-06 16:32:01 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 09:37:11 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_xmloff.hxx"
2000-12-06 16:32:01 +00:00
# include "layerimport.hxx"
# include "formenums.hxx"
# include "elementimport.hxx"
2001-03-20 12:39:58 +00:00
# include "officeforms.hxx"
2000-12-06 16:32:01 +00:00
# include "strings.hxx"
2007-06-27 14:17:04 +00:00
# include <xmloff/xmlictxt.hxx>
# include <xmloff/xmlstyle.hxx>
# include <xmloff/families.hxx>
# include <xmloff/xmlprmap.hxx>
# include <xmloff/prstylei.hxx>
# include <xmloff/xmlimp.hxx>
2001-01-02 14:58:22 +00:00
# include "XMLEventImportHelper.hxx"
2007-06-27 14:17:04 +00:00
# include <xmloff/xmlimppr.hxx>
# include <xmloff/xmlnumfi.hxx>
2001-05-28 13:59:18 +00:00
# include <com/sun/star/util/XNumberFormatsSupplier.hpp>
2000-12-06 16:32:01 +00:00
# include <com/sun/star/form/FormSubmitEncoding.hpp>
# include <com/sun/star/form/FormSubmitMethod.hpp>
# include <com/sun/star/sdb/CommandType.hpp>
# include <com/sun/star/form/NavigationBarMode.hpp>
# include <com/sun/star/form/TabulatorCycle.hpp>
# include <com/sun/star/form/FormButtonType.hpp>
2003-12-11 11:09:57 +00:00
# include <com/sun/star/awt/ScrollBarOrientation.hpp>
2004-07-05 15:09:35 +00:00
# include <com/sun/star/awt/VisualEffect.hpp>
2000-12-06 16:32:01 +00:00
# include <com/sun/star/form/ListSourceType.hpp>
2009-10-18 15:05:21 +02:00
# include <tools/wintypes.hxx> // for check states
2001-05-28 13:59:18 +00:00
# include <com/sun/star/lang/Locale.hpp>
2007-06-27 14:17:04 +00:00
# include <xmloff/controlpropertyhdl.hxx>
2000-12-18 14:14:35 +00:00
# include "controlpropertymap.hxx"
2001-01-02 14:58:22 +00:00
# include "formevents.hxx"
2003-10-21 07:40:08 +00:00
# include "formcellbinding.hxx"
2010-04-16 23:04:00 +02:00
# include "xmloff/xformsimport.hxx"
2007-06-27 14:17:04 +00:00
# include <xmloff/xmltoken.hxx>
2010-04-16 23:04:00 +02:00
# include "xmloff/xmlnmspe.hxx"
2009-04-23 10:42:05 +00:00
# include <rtl/logfile.hxx>
2004-11-16 09:10:27 +00:00
# include <algorithm>
2000-12-18 14:14:35 +00:00
SV_IMPL_REF ( SvXMLStylesContext ) ;
2000-12-06 16:32:01 +00:00
//.........................................................................
namespace xmloff
{
//.........................................................................
2009-04-23 10:42:05 +00:00
using namespace : : com : : sun : : star : : uno ;
using namespace : : com : : sun : : star : : awt ;
using namespace : : com : : sun : : star : : lang ;
using namespace : : com : : sun : : star : : beans ;
using namespace : : com : : sun : : star : : container ;
using namespace : : com : : sun : : star : : drawing ;
using namespace : : com : : sun : : star : : xml ;
using namespace : : com : : sun : : star : : util ;
using namespace : : com : : sun : : star : : form ;
using namespace : : com : : sun : : star : : sdb ;
//=====================================================================
//= OFormLayerXMLImport_Impl
//=====================================================================
//---------------------------------------------------------------------
OFormLayerXMLImport_Impl : : OFormLayerXMLImport_Impl ( SvXMLImport & _rImporter )
: m_rImporter ( _rImporter )
, m_pAutoStyles ( NULL )
{
// build the attribute2property map
// string properties which are exported as attributes
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_NAME ) , PROPERTY_NAME ) ;
m_aAttributeMetaData . addStringProperty (
2010-10-06 10:16:27 +01:00
OAttributeMetaData : : getSpecialAttributeName ( SCA_GROUP_NAME ) , PROPERTY_GROUP_NAME ) ;
m_aAttributeMetaData . addStringProperty (
2009-04-23 10:42:05 +00:00
OAttributeMetaData : : getCommonControlAttributeName ( CCA_IMAGE_DATA ) , PROPERTY_IMAGEURL ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_LABEL ) , PROPERTY_LABEL ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_TARGET_LOCATION ) , PROPERTY_TARGETURL ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_TITLE ) , PROPERTY_TITLE ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_TARGET_FRAME ) , PROPERTY_TARGETFRAME , " _blank " ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getDatabaseAttributeName ( DA_DATA_FIELD ) , PROPERTY_DATAFIELD ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getFormAttributeName ( faCommand ) , PROPERTY_COMMAND ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getFormAttributeName ( faDatasource ) , PROPERTY_DATASOURCENAME ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getFormAttributeName ( faFilter ) , PROPERTY_FILTER ) ;
m_aAttributeMetaData . addStringProperty (
OAttributeMetaData : : getFormAttributeName ( faOrder ) , PROPERTY_ORDER ) ;
// properties not added because they're already present in another form
OSL_ENSURE (
0 = = : : rtl : : OUString : : createFromAscii ( OAttributeMetaData : : getCommonControlAttributeName ( CCA_TARGET_LOCATION ) ) . compareToAscii (
OAttributeMetaData : : getFormAttributeName ( faAction ) ) ,
" OFormLayerXMLImport_Impl::OFormLayerXMLImport_Impl: invalid attribute names (1)! " ) ;
// if this fails, we would have to add a translation from faAction->PROPERTY_TARGETURL
// We did not because we already have one CCA_TARGET_LOCATION->PROPERTY_TARGETURL,
// and CCA_TARGET_LOCATION and faAction should be represented by the same attribute
OSL_ENSURE (
0 = = : : rtl : : OUString : : createFromAscii ( OAttributeMetaData : : getCommonControlAttributeName ( CCA_NAME ) ) . compareToAscii (
OAttributeMetaData : : getFormAttributeName ( faName ) ) ,
" OFormLayerXMLImport_Impl::OFormLayerXMLImport_Impl: invalid attribute names (2)! " ) ;
// the same for faName, CCA_NAME and PROPERTY_NAME
// boolean properties which are exported as attributes
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_CURRENT_SELECTED ) , PROPERTY_STATE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_DISABLED ) , PROPERTY_ENABLED , sal_False , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_DROPDOWN ) , PROPERTY_DROPDOWN , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_PRINTABLE ) , PROPERTY_PRINTABLE , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_READONLY ) , PROPERTY_READONLY , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_SELECTED ) , PROPERTY_DEFAULT_STATE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_TAB_STOP ) , PROPERTY_TABSTOP , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getDatabaseAttributeName ( DA_CONVERT_EMPTY ) , PROPERTY_EMPTY_IS_NULL , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_VALIDATION ) , PROPERTY_STRICTFORMAT , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_MULTI_LINE ) , PROPERTY_MULTILINE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_AUTOMATIC_COMPLETION ) , PROPERTY_AUTOCOMPLETE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_MULTIPLE ) , PROPERTY_MULTISELECTION , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_DEFAULT_BUTTON ) , PROPERTY_DEFAULTBUTTON , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_IS_TRISTATE ) , PROPERTY_TRISTATE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faAllowDeletes ) , PROPERTY_ALLOWDELETES , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faAllowInserts ) , PROPERTY_ALLOWINSERTS , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faAllowUpdates ) , PROPERTY_ALLOWUPDATES , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faApplyFilter ) , PROPERTY_APPLYFILTER , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faEscapeProcessing ) , PROPERTY_ESCAPEPROCESSING , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getFormAttributeName ( faIgnoreResult ) , PROPERTY_IGNORERESULT , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_TOGGLE ) , PROPERTY_TOGGLE , sal_False ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_FOCUS_ON_CLICK ) , PROPERTY_FOCUS_ON_CLICK , sal_True ) ;
m_aAttributeMetaData . addBooleanProperty (
OAttributeMetaData : : getDatabaseAttributeName ( DA_INPUT_REQUIRED ) , PROPERTY_INPUT_REQUIRED , sal_False ) ;
// the int16 attributes
m_aAttributeMetaData . addInt16Property (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_MAX_LENGTH ) , PROPERTY_MAXTEXTLENGTH , 0 ) ;
m_aAttributeMetaData . addInt16Property (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_SIZE ) , PROPERTY_LINECOUNT , 5 ) ;
m_aAttributeMetaData . addInt16Property (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_TAB_INDEX ) , PROPERTY_TABINDEX , 0 ) ;
m_aAttributeMetaData . addInt16Property (
OAttributeMetaData : : getDatabaseAttributeName ( DA_BOUND_COLUMN ) , PROPERTY_BOUNDCOLUMN , 0 ) ;
// the int32 attributes
m_aAttributeMetaData . addInt32Property (
OAttributeMetaData : : getSpecialAttributeName ( SCA_PAGE_STEP_SIZE ) , PROPERTY_BLOCK_INCREMENT , 10 ) ;
// the enum attributes
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_VISUAL_EFFECT ) , PROPERTY_VISUAL_EFFECT ,
VisualEffect : : LOOK3D , OEnumMapper : : getEnumMap ( OEnumMapper : : epVisualEffect ) ,
& : : getCppuType ( static_cast < sal_Int16 * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_ORIENTATION ) , PROPERTY_ORIENTATION ,
ScrollBarOrientation : : HORIZONTAL , OEnumMapper : : getEnumMap ( OEnumMapper : : epOrientation ) ,
& : : getCppuType ( static_cast < sal_Int32 * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getCommonControlAttributeName ( CCA_BUTTON_TYPE ) , PROPERTY_BUTTONTYPE ,
FormButtonType_PUSH , OEnumMapper : : getEnumMap ( OEnumMapper : : epButtonType ) ,
& : : getCppuType ( static_cast < FormButtonType * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getDatabaseAttributeName ( DA_LIST_SOURCE_TYPE ) , PROPERTY_LISTSOURCETYPE ,
ListSourceType_VALUELIST , OEnumMapper : : getEnumMap ( OEnumMapper : : epListSourceType ) ,
& : : getCppuType ( static_cast < ListSourceType * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_STATE ) , PROPERTY_DEFAULT_STATE , STATE_NOCHECK ,
OEnumMapper : : getEnumMap ( OEnumMapper : : epCheckState ) ,
& : : getCppuType ( static_cast < sal_Int16 * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getSpecialAttributeName ( SCA_CURRENT_STATE ) , PROPERTY_STATE , STATE_NOCHECK ,
OEnumMapper : : getEnumMap ( OEnumMapper : : epCheckState ) ,
& : : getCppuType ( static_cast < sal_Int16 * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getFormAttributeName ( faEnctype ) , PROPERTY_SUBMIT_ENCODING ,
FormSubmitEncoding_URL , OEnumMapper : : getEnumMap ( OEnumMapper : : epSubmitEncoding ) ,
& : : getCppuType ( static_cast < FormSubmitEncoding * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getFormAttributeName ( faMethod ) , PROPERTY_SUBMIT_METHOD ,
FormSubmitMethod_GET , OEnumMapper : : getEnumMap ( OEnumMapper : : epSubmitMethod ) ,
& : : getCppuType ( static_cast < FormSubmitMethod * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getFormAttributeName ( faCommandType ) , PROPERTY_COMMAND_TYPE ,
CommandType : : COMMAND , OEnumMapper : : getEnumMap ( OEnumMapper : : epCommandType ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getFormAttributeName ( faNavigationMode ) , PROPERTY_NAVIGATION ,
NavigationBarMode_NONE , OEnumMapper : : getEnumMap ( OEnumMapper : : epNavigationType ) ,
& : : getCppuType ( static_cast < NavigationBarMode * > ( NULL ) ) ) ;
m_aAttributeMetaData . addEnumProperty (
OAttributeMetaData : : getFormAttributeName ( faTabbingCycle ) , PROPERTY_CYCLE ,
TabulatorCycle_RECORDS , OEnumMapper : : getEnumMap ( OEnumMapper : : epTabCyle ) ,
& : : getCppuType ( static_cast < TabulatorCycle * > ( NULL ) ) ) ;
// 'initialize'
m_aCurrentPageIds = m_aControlIds . end ( ) ;
}
//---------------------------------------------------------------------
OFormLayerXMLImport_Impl : : ~ OFormLayerXMLImport_Impl ( )
{
// outlined to allow forward declaration of OAttribute2Property in the header
2000-12-06 16:32:01 +00:00
2009-04-23 10:42:05 +00:00
if ( m_pAutoStyles )
m_pAutoStyles - > ReleaseRef ( ) ;
}
2001-05-28 13:59:18 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : setAutoStyleContext ( SvXMLStylesContext * _pNewContext )
{
OSL_ENSURE ( ! m_pAutoStyles , " OFormLayerXMLImport_Impl::setAutoStyleContext: not to be called twice! " ) ;
m_pAutoStyles = _pNewContext ;
if ( m_pAutoStyles )
m_pAutoStyles - > AddRef ( ) ;
}
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : applyControlNumberStyle ( const Reference < XPropertySet > & _rxControlModel , const : : rtl : : OUString & _rControlNumerStyleName )
{
OSL_ENSURE ( _rxControlModel . is ( ) & & ( 0 ! = _rControlNumerStyleName . getLength ( ) ) ,
" OFormLayerXMLImport_Impl::applyControlNumberStyle: invalid arguments (this will crash)! " ) ;
2001-05-28 13:59:18 +00:00
2009-04-23 10:42:05 +00:00
OSL_ENSURE ( m_pAutoStyles , " OFormLayerXMLImport_Impl::applyControlNumberStyle: have no auto style context! " ) ;
if ( ! m_pAutoStyles )
2001-05-28 13:59:18 +00:00
{
2009-04-23 10:42:05 +00:00
m_pAutoStyles = m_rImporter . GetShapeImport ( ) - > GetAutoStylesContext ( ) ;
2001-05-28 13:59:18 +00:00
if ( m_pAutoStyles )
m_pAutoStyles - > AddRef ( ) ;
}
2009-04-23 10:42:05 +00:00
if ( m_pAutoStyles )
2001-05-28 13:59:18 +00:00
{
2009-04-23 10:42:05 +00:00
const SvXMLStyleContext * pStyle = m_pAutoStyles - > FindStyleChildContext ( XML_STYLE_FAMILY_DATA_STYLE , _rControlNumerStyleName ) ;
if ( pStyle )
2001-05-28 13:59:18 +00:00
{
2009-04-23 10:42:05 +00:00
const SvXMLNumFormatContext * pDataStyle = static_cast < const SvXMLNumFormatContext * > ( pStyle ) ;
2001-05-28 13:59:18 +00:00
2009-04-23 10:42:05 +00:00
// set this format at the control model
try
2001-05-28 13:59:18 +00:00
{
2009-04-23 10:42:05 +00:00
// the models number format supplier and formats
Reference < XNumberFormatsSupplier > xFormatsSupplier ;
_rxControlModel - > getPropertyValue ( PROPERTY_FORMATSSUPPLIER ) > > = xFormatsSupplier ;
Reference < XNumberFormats > xFormats ;
if ( xFormatsSupplier . is ( ) )
xFormats = xFormatsSupplier - > getNumberFormats ( ) ;
OSL_ENSURE ( xFormats . is ( ) , " OFormLayerXMLImport_Impl::applyControlNumberStyle: could not obtain the controls number formats! " ) ;
// obtain a key
if ( xFormats . is ( ) )
2001-05-28 13:59:18 +00:00
{
2009-04-23 10:42:05 +00:00
sal_Int32 nFormatKey = const_cast < SvXMLNumFormatContext * > ( pDataStyle ) - > CreateAndInsert ( xFormatsSupplier ) ;
OSL_ENSURE ( - 1 ! = nFormatKey , " OFormLayerXMLImport_Impl::applyControlNumberStyle: could not obtain a format key! " ) ;
2005-03-08 14:37:10 +00:00
2009-04-23 10:42:05 +00:00
// set the format on the control model
_rxControlModel - > setPropertyValue ( PROPERTY_FORMATKEY , makeAny ( nFormatKey ) ) ;
2001-05-28 13:59:18 +00:00
}
}
2009-04-23 10:42:05 +00:00
catch ( const Exception & )
{
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::applyControlNumberStyle: couldn't set the format! " ) ;
2009-04-23 10:42:05 +00:00
}
2001-05-28 13:59:18 +00:00
}
2009-04-23 10:42:05 +00:00
else
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::applyControlNumberStyle: did not find the style with the given name! " ) ;
2000-12-06 16:32:01 +00:00
}
2009-04-23 10:42:05 +00:00
}
2000-12-06 16:32:01 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerCellValueBinding ( const Reference < XPropertySet > & _rxControlModel , const : : rtl : : OUString & _rCellAddress )
{
OSL_ENSURE ( _rxControlModel . is ( ) & & _rCellAddress . getLength ( ) ,
" OFormLayerXMLImport_Impl::registerCellValueBinding: invalid arguments! " ) ;
m_aCellValueBindings . push_back ( ModelStringPair ( _rxControlModel , _rCellAddress ) ) ;
}
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerXFormsValueBinding (
const Reference < XPropertySet > & _rxControlModel ,
const : : rtl : : OUString & _rBindingID )
{
// TODO: is an empty binding name allowed?
OSL_ENSURE ( _rxControlModel . is ( ) , " need model " ) ;
2003-10-21 07:40:08 +00:00
2009-04-23 10:42:05 +00:00
m_aXFormsValueBindings . push_back (
ModelStringPair ( _rxControlModel , _rBindingID ) ) ;
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerXFormsListBinding (
const Reference < XPropertySet > & _rxControlModel ,
const : : rtl : : OUString & _rBindingID )
{
// TODO: is an empty binding name allowed?
OSL_ENSURE ( _rxControlModel . is ( ) , " need model " ) ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
m_aXFormsListBindings . push_back (
ModelStringPair ( _rxControlModel , _rBindingID ) ) ;
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerXFormsSubmission (
const Reference < XPropertySet > & _rxControlModel ,
const : : rtl : : OUString & _rSubmissionID )
{
// TODO: is an empty binding name allowed?
OSL_ENSURE ( _rxControlModel . is ( ) , " need model " ) ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
m_aXFormsSubmissions . push_back (
ModelStringPair ( _rxControlModel , _rSubmissionID ) ) ;
}
2002-10-25 12:19:34 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerCellRangeListSource ( const Reference < XPropertySet > & _rxControlModel , const : : rtl : : OUString & _rCellRangeAddress )
{
OSL_ENSURE ( _rxControlModel . is ( ) & & _rCellRangeAddress . getLength ( ) ,
" OFormLayerXMLImport_Impl::registerCellRangeListSource: invalid arguments! " ) ;
m_aCellRangeListSources . push_back ( ModelStringPair ( _rxControlModel , _rCellRangeAddress ) ) ;
}
//---------------------------------------------------------------------
const SvXMLStyleContext * OFormLayerXMLImport_Impl : : getStyleElement ( const : : rtl : : OUString & _rStyleName ) const
{
OSL_ENSURE ( m_pAutoStyles , " OFormLayerXMLImport_Impl::getStyleElement: have no auto style context! " ) ;
// did you use setAutoStyleContext?
const SvXMLStyleContext * pControlStyle =
m_pAutoStyles ? m_pAutoStyles - > FindStyleChildContext ( XML_STYLE_FAMILY_TEXT_PARAGRAPH , _rStyleName ) : NULL ;
OSL_ENSURE ( pControlStyle | | ! m_pAutoStyles ,
: : rtl : : OString ( " OFormLayerXMLImport_Impl::getStyleElement: did not find the style named \" " )
+ = : : rtl : : OString ( _rStyleName . getStr ( ) , _rStyleName . getLength ( ) , RTL_TEXTENCODING_ASCII_US )
+ = : : rtl : : OString ( " \" ! " ) ) ;
return pControlStyle ;
}
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : enterEventContext ( )
{
// install our own translation table. We need to disable the other tables because of name conflicts.
m_rImporter . GetEventImport ( ) . PushTranslationTable ( ) ;
m_rImporter . GetEventImport ( ) . AddTranslationTable ( g_pFormsEventTranslation ) ;
}
2001-01-24 08:34:40 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : leaveEventContext ( )
{
// install the original event tables.
m_rImporter . GetEventImport ( ) . PopTranslationTable ( ) ;
}
2001-01-24 08:34:40 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerControlId ( const Reference < XPropertySet > & _rxControl , const : : rtl : : OUString & _rId )
{
OSL_ENSURE ( m_aCurrentPageIds ! = m_aControlIds . end ( ) , " OFormLayerXMLImport_Impl::registerControlId: no current page! " ) ;
OSL_ENSURE ( _rId . getLength ( ) , " OFormLayerXMLImport_Impl::registerControlId: invalid (empty) control id! " ) ;
2000-12-13 09:40:15 +00:00
2009-04-23 10:42:05 +00:00
OSL_ENSURE ( m_aCurrentPageIds - > second . end ( ) = = m_aCurrentPageIds - > second . find ( _rId ) , " OFormLayerXMLImport_Impl::registerControlId: control id already used! " ) ;
m_aCurrentPageIds - > second [ _rId ] = _rxControl ;
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : registerControlReferences ( const Reference < XPropertySet > & _rxControl , const : : rtl : : OUString & _rReferringControls )
{
OSL_ENSURE ( _rReferringControls . getLength ( ) , " OFormLayerXMLImport_Impl::registerControlReferences: invalid (empty) control id list! " ) ;
OSL_ENSURE ( _rxControl . is ( ) , " OFormLayerXMLImport_Impl::registerControlReferences: invalid (NULL) control! " ) ;
m_aControlReferences . push_back ( ModelStringPair ( _rxControl , _rReferringControls ) ) ;
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : startPage ( const Reference < XDrawPage > & _rxDrawPage )
{
m_xCurrentPageFormsSupp . clear ( ) ;
OSL_ENSURE ( _rxDrawPage . is ( ) , " OFormLayerXMLImport_Impl::startPage: NULL page! " ) ;
m_xCurrentPageFormsSupp = m_xCurrentPageFormsSupp . query ( _rxDrawPage ) ;
OSL_ENSURE ( m_xCurrentPageFormsSupp . is ( ) , " OFormLayerXMLImport_Impl::startPage: invalid draw page (no XFormsSupplier)! " ) ;
if ( ! m_xCurrentPageFormsSupp . is ( ) )
return ;
// add a new entry to our page map
: : std : : pair < MapDrawPage2MapIterator , bool > aPagePosition ;
aPagePosition =
m_aControlIds . insert ( MapDrawPage2Map : : value_type ( _rxDrawPage , MapString2PropertySet ( ) ) ) ;
OSL_ENSURE ( aPagePosition . second , " OFormLayerXMLImport_Impl::startPage: already imported this page! " ) ;
m_aCurrentPageIds = aPagePosition . first ;
}
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : endPage ( )
{
OSL_ENSURE ( m_xCurrentPageFormsSupp . is ( ) , " OFormLayerXMLImport_Impl::endPage: sure you called startPage before? " ) ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
// do some knittings for the controls which are referring to each other
try
2000-12-12 11:01:05 +00:00
{
2009-04-23 10:42:05 +00:00
static const sal_Unicode s_nSeparator = ' , ' ;
: : rtl : : OUString sReferring ;
: : rtl : : OUString sCurrentReferring ;
: : rtl : : OUString sSeparator ( & s_nSeparator , 1 ) ;
Reference < XPropertySet > xCurrentReferring ;
sal_Int32 nSeparator , nPrevSep ;
: : std : : vector < ModelStringPair > : : const_iterator aEnd = m_aControlReferences . end ( ) ;
for ( : : std : : vector < ModelStringPair > : : const_iterator aReferences = m_aControlReferences . begin ( ) ;
aReferences ! = aEnd ;
+ + aReferences
)
2000-12-12 11:01:05 +00:00
{
2009-04-23 10:42:05 +00:00
// the list of control ids is comma separated
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
// in a list of n ids there are only n-1 separators ... have to catch this last id
// -> normalize the list
sReferring = aReferences - > second ;
sReferring + = sSeparator ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
nPrevSep = - 1 ;
while ( - 1 ! = ( nSeparator = sReferring . indexOf ( s_nSeparator , nPrevSep + 1 ) ) )
{
sCurrentReferring = sReferring . copy ( nPrevSep + 1 , nSeparator - nPrevSep - 1 ) ;
xCurrentReferring = lookupControlId ( sCurrentReferring ) ;
if ( xCurrentReferring . is ( ) )
// if this condition fails, this is an error, but lookupControlId should have asserted this ...
xCurrentReferring - > setPropertyValue ( PROPERTY_CONTROLLABEL , makeAny ( aReferences - > first ) ) ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
nPrevSep = nSeparator ;
2000-12-12 11:01:05 +00:00
}
}
2009-04-23 10:42:05 +00:00
}
catch ( Exception & )
{
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::endPage: unable to knit the control references (caught an exception)! " ) ;
2009-04-23 10:42:05 +00:00
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
// now that we have all children of the forms collection, attach the events
Reference < XIndexAccess > xIndexContainer ;
if ( m_xCurrentPageFormsSupp . is ( ) & & m_xCurrentPageFormsSupp - > hasForms ( ) )
xIndexContainer = xIndexContainer . query ( m_xCurrentPageFormsSupp - > getForms ( ) ) ;
if ( xIndexContainer . is ( ) )
ODefaultEventAttacherManager : : setEvents ( xIndexContainer ) ;
2001-01-02 14:58:22 +00:00
2009-04-23 10:42:05 +00:00
// clear the structures for the control references.
m_aControlReferences . clear ( ) ;
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
// and no we have no current page anymore
m_aCurrentPageIds = m_aControlIds . end ( ) ;
}
2000-12-12 11:01:05 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
Reference < XPropertySet > OFormLayerXMLImport_Impl : : lookupControlId ( const : : rtl : : OUString & _rControlId )
{
OSL_ENSURE ( m_aCurrentPageIds ! = m_aControlIds . end ( ) , " OFormLayerXMLImport_Impl::lookupControlId: no current page! " ) ;
Reference < XPropertySet > xReturn ;
if ( m_aCurrentPageIds ! = m_aControlIds . end ( ) )
2000-12-12 11:01:05 +00:00
{
2009-04-23 10:42:05 +00:00
ConstMapString2PropertySetIterator aPos = m_aCurrentPageIds - > second . find ( _rControlId ) ;
if ( m_aCurrentPageIds - > second . end ( ) ! = aPos )
xReturn = aPos - > second ;
else
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::lookupControlId: invalid control id (did not find it)! " ) ;
2000-12-06 16:32:01 +00:00
}
2009-04-23 10:42:05 +00:00
return xReturn ;
}
//---------------------------------------------------------------------
SvXMLImportContext * OFormLayerXMLImport_Impl : : createOfficeFormsContext (
SvXMLImport & _rImport ,
sal_uInt16 _nPrefix ,
const rtl : : OUString & _rLocalName )
{
return new OFormsRootImport ( _rImport , _nPrefix , _rLocalName ) ;
}
2000-12-06 16:32:01 +00:00
2009-04-23 10:42:05 +00:00
//---------------------------------------------------------------------
SvXMLImportContext * OFormLayerXMLImport_Impl : : createContext ( const sal_uInt16 _nPrefix , const rtl : : OUString & _rLocalName ,
const Reference < sax : : XAttributeList > & )
{
SvXMLImportContext * pContext = NULL ;
if ( 0 = = _rLocalName . compareToAscii ( " form " ) )
2001-03-20 12:39:58 +00:00
{
2009-04-23 10:42:05 +00:00
if ( m_xCurrentPageFormsSupp . is ( ) )
pContext = new OFormImport ( * this , * this , _nPrefix , _rLocalName , m_xCurrentPageFormsSupp - > getForms ( ) ) ;
2001-03-20 12:39:58 +00:00
}
2009-04-23 10:42:05 +00:00
else if ( ( _nPrefix = = XML_NAMESPACE_XFORMS
& & ( xmloff : : token : : IsXMLToken ( _rLocalName , xmloff : : token : : XML_MODEL ) ) )
)
2000-12-06 16:32:01 +00:00
{
2009-04-23 10:42:05 +00:00
pContext = createXFormsModelContext ( m_rImporter , _nPrefix , _rLocalName ) ;
2000-12-06 16:32:01 +00:00
}
2009-04-23 10:42:05 +00:00
if ( ! pContext )
2000-12-13 09:40:15 +00:00
{
2011-03-12 14:27:45 +01:00
OSL_FAIL ( " unknown element " ) ;
2009-04-23 10:42:05 +00:00
pContext =
new SvXMLImportContext ( m_rImporter , _nPrefix , _rLocalName ) ;
2000-12-13 09:40:15 +00:00
}
2009-04-23 10:42:05 +00:00
return pContext ;
}
//---------------------------------------------------------------------
void OFormLayerXMLImport_Impl : : documentDone ( )
{
SvXMLImport & rImport = getGlobalContext ( ) ;
if ( ( rImport . getImportFlags ( ) & IMPORT_CONTENT ) = = 0 )
return ;
// create (and bind) the spreadsheet cell bindings
if ( ! m_aCellValueBindings . empty ( )
& & FormCellBindingHelper : : isCellBindingAllowed ( rImport . GetModel ( ) )
)
{
static : : rtl : : OUString s_sIndex ( RTL_CONSTASCII_USTRINGPARAM ( " :index " ) ) ;
: : std : : vector < ModelStringPair > : : const_iterator aEnd = m_aCellValueBindings . end ( ) ;
for ( : : std : : vector < ModelStringPair > : : const_iterator aCellBindings = m_aCellValueBindings . begin ( ) ;
aCellBindings ! = aEnd ;
+ + aCellBindings
2003-10-21 07:40:08 +00:00
)
{
2009-04-23 10:42:05 +00:00
try
2003-10-21 07:40:08 +00:00
{
2009-04-23 10:42:05 +00:00
FormCellBindingHelper aHelper ( aCellBindings - > first , rImport . GetModel ( ) ) ;
OSL_ENSURE ( aHelper . isCellBindingAllowed ( ) , " OFormLayerXMLImport_Impl::documentDone: can't bind this control model! " ) ;
if ( aHelper . isCellBindingAllowed ( ) )
2003-10-21 07:40:08 +00:00
{
2009-04-23 10:42:05 +00:00
// There are special bindings for listboxes. See
// OListAndComboImport::doRegisterCellValueBinding for a comment on this HACK.
: : rtl : : OUString sBoundCellAddress ( aCellBindings - > second ) ;
sal_Int32 nIndicator = sBoundCellAddress . lastIndexOf ( s_sIndex ) ;
bool bUseIndexBinding = false ;
if ( nIndicator ! = - 1 )
2003-10-21 07:40:08 +00:00
{
2009-04-23 10:42:05 +00:00
sBoundCellAddress = sBoundCellAddress . copy ( 0 , nIndicator ) ;
bUseIndexBinding = true ;
2003-10-21 07:40:08 +00:00
}
2009-04-23 10:42:05 +00:00
aHelper . setBinding ( aHelper . createCellBindingFromStringAddress ( sBoundCellAddress , bUseIndexBinding ) ) ;
2003-10-21 07:40:08 +00:00
}
}
2009-04-23 10:42:05 +00:00
catch ( const Exception & )
{
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::documentDone: caught an exception while binding to a cell! " ) ;
2009-04-23 10:42:05 +00:00
}
2003-10-21 07:40:08 +00:00
}
2009-04-23 10:42:05 +00:00
m_aCellValueBindings . clear ( ) ;
}
2003-10-21 07:40:08 +00:00
2009-04-23 10:42:05 +00:00
// the same for the spreadsheet cell range list sources
if ( ! m_aCellRangeListSources . empty ( )
& & FormCellBindingHelper : : isListCellRangeAllowed ( rImport . GetModel ( ) )
)
{
for ( : : std : : vector < ModelStringPair > : : const_iterator aRangeBindings = m_aCellRangeListSources . begin ( ) ;
aRangeBindings ! = m_aCellRangeListSources . end ( ) ;
+ + aRangeBindings
2003-10-21 07:40:08 +00:00
)
{
2009-04-23 10:42:05 +00:00
try
2003-10-21 07:40:08 +00:00
{
2009-04-23 10:42:05 +00:00
FormCellBindingHelper aHelper ( aRangeBindings - > first , rImport . GetModel ( ) ) ;
OSL_ENSURE ( aHelper . isListCellRangeAllowed ( ) , " OFormLayerXMLImport_Impl::documentDone: can't bind this control model! " ) ;
if ( aHelper . isListCellRangeAllowed ( ) )
2003-10-21 07:40:08 +00:00
{
2009-04-23 10:42:05 +00:00
aHelper . setListSource ( aHelper . createCellListSourceFromStringAddress ( aRangeBindings - > second ) ) ;
2003-10-21 07:40:08 +00:00
}
}
2009-04-23 10:42:05 +00:00
catch ( const Exception & )
{
2011-03-19 14:09:49 +01:00
OSL_FAIL ( " OFormLayerXMLImport_Impl::documentDone: caught an exception while binding to a cell range! " ) ;
2009-04-23 10:42:05 +00:00
}
2003-10-21 07:40:08 +00:00
}
2009-04-23 10:42:05 +00:00
m_aCellRangeListSources . clear ( ) ;
2003-10-21 07:40:08 +00:00
}
2009-04-23 10:42:05 +00:00
// process XForms-bindings; call registerXFormsValueBinding for each
std : : for_each ( m_aXFormsValueBindings . begin ( ) ,
m_aXFormsValueBindings . end ( ) ,
bind1st ( ptr_fun ( bindXFormsValueBinding ) ,
rImport . GetModel ( ) ) ) ;
// same for list bindings
std : : for_each ( m_aXFormsListBindings . begin ( ) ,
m_aXFormsListBindings . end ( ) ,
bind1st ( ptr_fun ( bindXFormsListBinding ) ,
rImport . GetModel ( ) ) ) ;
// same for submissions
std : : for_each ( m_aXFormsSubmissions . begin ( ) ,
m_aXFormsSubmissions . end ( ) ,
bind1st ( ptr_fun ( bindXFormsSubmission ) ,
rImport . GetModel ( ) ) ) ;
}
2000-12-06 16:32:01 +00:00
//.........................................................................
} // namespace xmloff
//.........................................................................
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */