summaryrefslogtreecommitdiff
path: root/xmloff/source/forms/elementimport.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/forms/elementimport.cxx')
-rwxr-xr-x[-rw-r--r--]xmloff/source/forms/elementimport.cxx509
1 files changed, 351 insertions, 158 deletions
diff --git a/xmloff/source/forms/elementimport.cxx b/xmloff/source/forms/elementimport.cxx
index 571884d83d..710abf6e1d 100644..100755
--- a/xmloff/source/forms/elementimport.cxx
+++ b/xmloff/source/forms/elementimport.cxx
@@ -29,22 +29,21 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_xmloff.hxx"
-#include <algorithm>
#include "elementimport.hxx"
-#include <xmloff/xmlimp.hxx>
-#include <xmloff/nmspmap.hxx>
-#include <xmloff/xmluconv.hxx>
+#include "xmloff/xmlimp.hxx"
+#include "xmloff/nmspmap.hxx"
+#include "xmloff/xmluconv.hxx"
#include "strings.hxx"
#include "callbacks.hxx"
#include "attriblistmerge.hxx"
-#include "xmlnmspe.hxx"
+#include "xmloff/xmlnmspe.hxx"
#include "eventimport.hxx"
-#include <xmloff/txtstyli.hxx>
+#include "xmloff/txtstyli.hxx"
#include "formenums.hxx"
-#include <xmloff/xmltoken.hxx>
+#include "xmloff/xmltoken.hxx"
#include "gridcolumnproptranslator.hxx"
-#include <comphelper/extract.hxx>
-#include <comphelper/types.hxx>
+#include "property_description.hxx"
+#include "property_meta_data.hxx"
/** === begin UNO includes === **/
#include <com/sun/star/text/XText.hpp>
@@ -55,9 +54,13 @@
#include <com/sun/star/beans/XPropertyContainer.hpp>
#include <com/sun/star/beans/PropertyAttribute.hpp>
/** === end UNO includes === **/
+
#include <tools/urlobj.hxx>
+#include <tools/diagnose_ex.h>
#include <tools/time.hxx>
#include <rtl/logfile.hxx>
+#include <comphelper/extract.hxx>
+#include <comphelper/types.hxx>
#include <algorithm>
#include <functional>
@@ -158,6 +161,7 @@ namespace xmloff
,m_rEventManager(_rEventManager)
,m_pStyleElement( NULL )
,m_xParentContainer(_rxParentContainer)
+ ,m_bImplicitGenericAttributeHandling( true )
{
OSL_ENSURE(m_xParentContainer.is(), "OElementImport::OElementImport: invalid parent container!");
}
@@ -168,17 +172,41 @@ namespace xmloff
}
//---------------------------------------------------------------------
+ ::rtl::OUString OElementImport::determineDefaultServiceName() const
+ {
+ return ::rtl::OUString();
+ }
+
+ //---------------------------------------------------------------------
void OElementImport::StartElement(const Reference< sax::XAttributeList >& _rxAttrList)
{
ENTER_LOG_CONTEXT( "xmloff::OElementImport - importing one element" );
- // call the base class. This should give us enough information (especially the service name)
- // to create our UNO element
- OPropertyImport::StartElement(_rxAttrList);
- // create the element
+ const SvXMLNamespaceMap& rMap = m_rContext.getGlobalContext().GetNamespaceMap();
+ const ::rtl::OUString sImplNameAttribute = rMap.GetQNameByKey( XML_NAMESPACE_FORM, GetXMLToken( XML_CONTROL_IMPLEMENTATION ) );
+ const ::rtl::OUString sControlImplementation = _rxAttrList->getValueByName( sImplNameAttribute );
+
+ // retrieve the service name
+ if ( sControlImplementation.getLength() > 0 )
+ {
+ ::rtl::OUString sOOoImplementationName;
+ const sal_uInt16 nImplPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sControlImplementation, &sOOoImplementationName );
+ m_sServiceName = ( nImplPrefix == XML_NAMESPACE_OOO ) ? sOOoImplementationName : sControlImplementation;
+ }
+
+ if ( !m_sServiceName.getLength() )
+ determineDefaultServiceName();
+
+ // create the object *now*. This allows setting properties in the various handleAttribute methods.
+ // (Though currently not all code is migrated to this pattern, most attributes are still handled
+ // by remembering the value (via implPushBackPropertyValue), and setting the correct property value
+ // later (in OControlImport::StartElement).)
m_xElement = createElement();
- if ( !m_xInfo.is() && m_xElement.is() )
+ if ( m_xElement.is() )
m_xInfo = m_xElement->getPropertySetInfo();
+
+ // call the base class
+ OPropertyImport::StartElement( _rxAttrList );
}
//---------------------------------------------------------------------
@@ -198,26 +226,61 @@ namespace xmloff
if (!m_xElement.is())
return;
+ // apply the non-generic properties
+ implApplySpecificProperties();
+
+ // set the generic properties
+ implApplyGenericProperties();
+
+ // set the style properties
+ if ( m_pStyleElement && m_xElement.is() )
+ {
+ Reference< XPropertySet > xPropTranslation =
+ new OGridColumnPropertyTranslator( Reference< XMultiPropertySet >( m_xElement, UNO_QUERY ) );
+ const_cast< XMLTextStyleContext* >( m_pStyleElement )->FillPropertySet( xPropTranslation );
+
+ const ::rtl::OUString sNumberStyleName = const_cast< XMLTextStyleContext* >( m_pStyleElement )->GetDataStyleName( );
+ if ( sNumberStyleName.getLength() )
+ // the style also has a number (sub) style
+ m_rContext.applyControlNumberStyle( m_xElement, sNumberStyleName );
+ }
+
+ // insert the element into the parent container
+ if (!m_sName.getLength())
+ {
+ OSL_ENSURE(sal_False, "OElementImport::EndElement: did not find a name attribute!");
+ m_sName = implGetDefaultName();
+ }
+
+ m_xParentContainer->insertByName(m_sName, makeAny(m_xElement));
+ LEAVE_LOG_CONTEXT( );
+ }
+
+ //---------------------------------------------------------------------
+ void OElementImport::implApplySpecificProperties()
+ {
+ if ( m_aValues.empty() )
+ return;
+
// set all the properties we collected
#if OSL_DEBUG_LEVEL > 0
// check if the object has all the properties
// (We do this in the non-pro version only. Doing it all the time would be much to expensive)
if ( m_xInfo.is() )
{
- PropertyValueArray::iterator aEnd = m_aValues.end();
+ PropertyValueArray::const_iterator aEnd = m_aValues.end();
for ( PropertyValueArray::iterator aCheck = m_aValues.begin();
aCheck != aEnd;
++aCheck
)
{
OSL_ENSURE(m_xInfo->hasPropertyByName(aCheck->Name),
- ::rtl::OString("OElementImport::EndElement: read a property (")
+ ::rtl::OString("OElementImport::implApplySpecificProperties: read a property (")
+= ::rtl::OString(aCheck->Name.getStr(), aCheck->Name.getLength(), RTL_TEXTENCODING_ASCII_US)
+= ::rtl::OString(") which does not exist on the element!"));
}
}
#endif
- OSL_ENSURE(!m_aValues.empty(), "OElementImport::EndElement: no properties read!");
// set the properties
const Reference< XMultiPropertySet > xMultiProps(m_xElement, UNO_QUERY);
@@ -254,7 +317,7 @@ namespace xmloff
}
catch(Exception&)
{
- OSL_ENSURE(sal_False, "OElementImport::EndElement: could not set the properties (using the XMultiPropertySet)!");
+ OSL_ENSURE(sal_False, "OElementImport::implApplySpecificProperties: could not set the properties (using the XMultiPropertySet)!");
}
}
@@ -275,42 +338,16 @@ namespace xmloff
catch(Exception&)
{
OSL_ENSURE(sal_False,
- ::rtl::OString("OElementImport::EndElement: could not set the property \"")
+ ::rtl::OString("OElementImport::implApplySpecificProperties: could not set the property \"")
+= ::rtl::OString(aPropValues->Name.getStr(), aPropValues->Name.getLength(), RTL_TEXTENCODING_ASCII_US)
+= ::rtl::OString("\"!"));
}
}
}
-
- // set the generic properties
- implImportGenericProperties();
-
- // set the style properties
- if ( m_pStyleElement && m_xElement.is() )
- {
- Reference< XPropertySet > xPropTranslation =
- new OGridColumnPropertyTranslator( Reference< XMultiPropertySet >( m_xElement, UNO_QUERY ) );
- const_cast< XMLTextStyleContext* >( m_pStyleElement )->FillPropertySet( xPropTranslation );
-
- const ::rtl::OUString sNumberStyleName = const_cast< XMLTextStyleContext* >( m_pStyleElement )->GetDataStyleName( );
- if ( sNumberStyleName.getLength() )
- // the style also has a number (sub) style
- m_rContext.applyControlNumberStyle( m_xElement, sNumberStyleName );
- }
-
- // insert the element into the parent container
- if (!m_sName.getLength())
- {
- OSL_ENSURE(sal_False, "OElementImport::EndElement: did not find a name attribute!");
- m_sName = implGetDefaultName();
- }
-
- m_xParentContainer->insertByName(m_sName, makeAny(m_xElement));
- LEAVE_LOG_CONTEXT( );
}
//---------------------------------------------------------------------
- void OElementImport::implImportGenericProperties()
+ void OElementImport::implApplyGenericProperties()
{
if ( m_aGenericValues.empty() )
return;
@@ -335,7 +372,7 @@ namespace xmloff
if ( !xDynamicProperties.is() )
{
#if OSL_DEBUG_LEVEL > 0
- ::rtl::OString aMessage( "OElementImport::implImportGenericProperties: encountered an unknown property (" );
+ ::rtl::OString aMessage( "OElementImport::implApplyGenericProperties: encountered an unknown property (" );
aMessage += ::rtl::OUStringToOString( aPropValues->Name, RTL_TEXTENCODING_ASCII_US );
aMessage += "), but component is no PropertyBag!";
OSL_FAIL( aMessage.getStr() );
@@ -353,7 +390,7 @@ namespace xmloff
m_xInfo = m_xElement->getPropertySetInfo();
}
- // determine the type of the value (source forthe following conversion)
+ // determine the type of the value (source for the following conversion)
TypeClass eValueTypeClass = aPropValues->Value.getValueTypeClass();
const sal_Bool bValueIsSequence = TypeClass_SEQUENCE == eValueTypeClass;
if ( bValueIsSequence )
@@ -362,7 +399,7 @@ namespace xmloff
eValueTypeClass = aSimpleType.getTypeClass();
}
- // determine the type of the property (target forthe following conversion)
+ // determine the type of the property (target for the following conversion)
const Property aProperty( m_xInfo->getPropertyByName( aPropValues->Name ) );
TypeClass ePropTypeClass = aProperty.Type.getTypeClass();
const sal_Bool bPropIsSequence = TypeClass_SEQUENCE == ePropTypeClass;
@@ -381,11 +418,11 @@ namespace xmloff
if ( bValueIsSequence )
{
OSL_ENSURE( eValueTypeClass == TypeClass_ANY,
- "OElementImport::implImportGenericProperties: only ANYs should have been imported as generic list property!" );
+ "OElementImport::implApplyGenericProperties: only ANYs should have been imported as generic list property!" );
// (OPropertyImport should produce only Sequencer< Any >, since it cannot know the real type
OSL_ENSURE( ePropTypeClass == TypeClass_SHORT,
- "OElementImport::implImportGenericProperties: conversion to sequences other than 'sequence< short >' not implemented, yet!" );
+ "OElementImport::implApplyGenericProperties: conversion to sequences other than 'sequence< short >' not implemented, yet!" );
Sequence< Any > aXMLValueList;
aPropValues->Value >>= aXMLValueList;
@@ -485,38 +522,117 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OElementImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ PropertyGroups::const_iterator OElementImport::impl_matchPropertyGroup( const PropertyGroups& i_propertyGroups ) const
{
- if (!m_sServiceName.getLength() &&
- token::IsXMLToken( _rLocalName, token::XML_CONTROL_IMPLEMENTATION))
- { // it's the service name
+ ENSURE_OR_RETURN( m_xInfo.is(), "OElementImport::impl_matchPropertyGroup: no property set info!", i_propertyGroups.end() );
- ::rtl::OUString sImplName;
- const sal_uInt16 nImplPrefix =
- GetImport().GetNamespaceMap().GetKeyByAttrName( _rValue,
- &sImplName );
- m_sServiceName = XML_NAMESPACE_OOO==nImplPrefix ? sImplName
- :_rValue;
+ for ( PropertyGroups::const_iterator group = i_propertyGroups.begin();
+ group != i_propertyGroups.end();
+ ++group
+ )
+ {
+ bool missingProp = false;
+ for ( PropertyDescriptionList::const_iterator prop = group->begin();
+ prop != group->end();
+ ++prop
+ )
+ {
+ if ( !m_xInfo->hasPropertyByName( (*prop)->propertyName ) )
+ {
+ missingProp = true;
+ break;
+ }
+ }
+
+ if ( missingProp )
+ // try next group
+ continue;
+
+ return group;
}
- else
+
+ return i_propertyGroups.end();
+ }
+
+ //---------------------------------------------------------------------
+ bool OElementImport::tryGenericAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue )
+ {
+ // the generic approach (which I hope all props will be migrated to, on the medium term): property handlers
+ const AttributeDescription attribute( metadata::getAttributeDescription( _nNamespaceKey, _rLocalName ) );
+ if ( attribute.attributeToken != XML_TOKEN_INVALID )
{
- if (!m_sName.getLength() &&
- token::IsXMLToken( _rLocalName, token::XML_NAME))
- // remember the name for later use in EndElement
- m_sName = _rValue;
+ PropertyGroups propertyGroups;
+ metadata::getPropertyGroupList( attribute, propertyGroups );
+ const PropertyGroups::const_iterator pos = impl_matchPropertyGroup( propertyGroups );
+ if ( pos == propertyGroups.end() )
+ return false;
- // maybe it's the style attribute?
- if ( token::IsXMLToken( _rLocalName, token::XML_TEXT_STYLE_NAME ) )
+ do
{
- const SvXMLStyleContext* pStyleContext = m_rContext.getStyleElement( _rValue );
- OSL_ENSURE( pStyleContext, "OPropertyImport::handleAttribute: do not know the style!" );
- // remember the element for later usage.
- m_pStyleElement = PTR_CAST( XMLTextStyleContext, pStyleContext );
+ const PropertyDescriptionList& rProperties( *pos );
+ const PropertyDescription* first = *rProperties.begin();
+ ENSURE_OR_BREAK( first != NULL, "OElementImport::handleAttribute: invalid property description!" );
+ const PPropertyHandler handler = (*first->factory)( first->propertyId );
+ ENSURE_OR_BREAK( handler.get() != NULL, "OElementImport::handleAttribute: invalid property handler!" );
+
+ PropertyValues aValues;
+ for ( PropertyDescriptionList::const_iterator propDesc = rProperties.begin();
+ propDesc != rProperties.end();
+ ++propDesc
+ )
+ {
+ aValues[ (*propDesc)->propertyId ] = Any();
+ }
+ if ( handler->getPropertyValues( _rValue, aValues ) )
+ {
+ for ( PropertyDescriptionList::const_iterator propDesc = rProperties.begin();
+ propDesc != rProperties.end();
+ ++propDesc
+ )
+ {
+ implPushBackPropertyValue( (*propDesc)->propertyName, aValues[ (*propDesc)->propertyId ] );
+ }
+ }
}
- else
- // let the base class handle it
- OPropertyImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ while ( false );
+
+ // handled
+ return true;
}
+ return false;
+ }
+
+ //---------------------------------------------------------------------
+ bool OElementImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ {
+ if ( token::IsXMLToken( _rLocalName, token::XML_CONTROL_IMPLEMENTATION ) )
+ // ignore this, it has already been handled in OElementImport::StartElement
+ return true;
+
+ if ( token::IsXMLToken( _rLocalName, token::XML_NAME ) )
+ {
+ if ( !m_sName.getLength() )
+ // remember the name for later use in EndElement
+ m_sName = _rValue;
+ return true;
+ }
+
+ // maybe it's the style attribute?
+ if ( token::IsXMLToken( _rLocalName, token::XML_TEXT_STYLE_NAME ) )
+ {
+ const SvXMLStyleContext* pStyleContext = m_rContext.getStyleElement( _rValue );
+ OSL_ENSURE( pStyleContext, "OElementImport::handleAttribute: do not know the style!" );
+ // remember the element for later usage.
+ m_pStyleElement = PTR_CAST( XMLTextStyleContext, pStyleContext );
+ return true;
+ }
+
+ if ( m_bImplicitGenericAttributeHandling )
+ if ( tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) )
+ return true;
+
+ // let the base class handle it
+ return OPropertyImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
//---------------------------------------------------------------------
@@ -554,7 +670,7 @@ namespace xmloff
{
::rtl::OUString sLocalAttrName = ::rtl::OUString::createFromAscii(_pAttributeName);
if ( !encounteredAttribute( sLocalAttrName ) )
- handleAttribute( XML_NAMESPACE_FORM, sLocalAttrName, ::rtl::OUString::createFromAscii( _pAttributeDefault ) );
+ OSL_VERIFY( handleAttribute( XML_NAMESPACE_FORM, sLocalAttrName, ::rtl::OUString::createFromAscii( _pAttributeDefault ) ) );
}
}
@@ -567,6 +683,7 @@ namespace xmloff
:OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
,m_eElementType(OControlElement::UNKNOWN)
{
+ disableImplicitGenericAttributeHandling();
}
//---------------------------------------------------------------------
@@ -575,6 +692,38 @@ namespace xmloff
:OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
,m_eElementType(_eType)
{
+ disableImplicitGenericAttributeHandling();
+ }
+
+ //---------------------------------------------------------------------
+ ::rtl::OUString OControlImport::determineDefaultServiceName() const
+ {
+ const sal_Char* pServiceName = NULL;
+ switch ( m_eElementType )
+ {
+ case OControlElement::TEXT:
+ case OControlElement::TEXT_AREA:
+ case OControlElement::PASSWORD: pServiceName = "com.sun.star.form.component.TextField"; break;
+ case OControlElement::FILE: pServiceName = "com.sun.star.form.component.FileControl"; break;
+ case OControlElement::FORMATTED_TEXT: pServiceName = "com.sun.star.form.component.FormattedField"; break;
+ case OControlElement::FIXED_TEXT: pServiceName = "com.sun.star.form.component.FixedText"; break;
+ case OControlElement::COMBOBOX: pServiceName = "com.sun.star.form.component.ComboBox"; break;
+ case OControlElement::LISTBOX: pServiceName = "com.sun.star.form.component.ListBox"; break;
+ case OControlElement::BUTTON: pServiceName = "com.sun.star.form.component.CommandButton"; break;
+ case OControlElement::IMAGE: pServiceName = "com.sun.star.form.component.ImageButton"; break;
+ case OControlElement::CHECKBOX: pServiceName = "com.sun.star.form.component.CheckBox"; break;
+ case OControlElement::RADIO: pServiceName = "com.sun.star.form.component.RadioButton"; break;
+ case OControlElement::FRAME: pServiceName = "com.sun.star.form.component.GroupBox"; break;
+ case OControlElement::IMAGE_FRAME: pServiceName = "com.sun.star.form.component.DatabaseImageControl"; break;
+ case OControlElement::HIDDEN: pServiceName = "com.sun.star.form.component.HiddenControl"; break;
+ case OControlElement::GRID: pServiceName = "com.sun.star.form.component.GridControl"; break;
+ case OControlElement::TIME: pServiceName = "com.sun.star.form.component.DateField"; break;
+ case OControlElement::DATE: pServiceName = "com.sun.star.form.component.TimeField"; break;
+ default: break;
+ }
+ if ( pServiceName != NULL )
+ return ::rtl::OUString::createFromAscii( pServiceName );
+ return ::rtl::OUString();
}
//---------------------------------------------------------------------
@@ -585,7 +734,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool OControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
static const sal_Char* pLinkedCellAttributeName = OAttributeMetaData::getBindingAttributeName(BA_LINKED_CELL);
@@ -602,66 +751,84 @@ namespace xmloff
m_sControlId = _rValue;
}
}
+ return true;
}
- else if ( _rLocalName.equalsAscii( pLinkedCellAttributeName ) )
+
+ if ( _rLocalName.equalsAscii( pLinkedCellAttributeName ) )
{ // it's the address of a spreadsheet cell
m_sBoundCellAddress = _rValue;
+ return true;
}
- else if ( _nNamespaceKey == XML_NAMESPACE_XFORMS && IsXMLToken( _rLocalName, XML_BIND ) )
+
+ if ( _nNamespaceKey == XML_NAMESPACE_XFORMS && IsXMLToken( _rLocalName, XML_BIND ) )
{
m_sBindingID = _rValue;
+ return true;
}
- else if ( _nNamespaceKey == XML_NAMESPACE_FORM && IsXMLToken( _rLocalName, XML_XFORMS_LIST_SOURCE ) )
+
+ if ( _nNamespaceKey == XML_NAMESPACE_FORM && IsXMLToken( _rLocalName, XML_XFORMS_LIST_SOURCE ) )
{
m_sListBindingID = _rValue;
+ return true;
}
- else if ( (_nNamespaceKey == XML_NAMESPACE_FORM && IsXMLToken( _rLocalName, XML_XFORMS_SUBMISSION ) ) ||
- ( _nNamespaceKey == XML_NAMESPACE_XFORMS && IsXMLToken( _rLocalName, XML_SUBMISSION ) ) )
+
+ if ( ( ( _nNamespaceKey == XML_NAMESPACE_FORM )
+ && IsXMLToken( _rLocalName, XML_XFORMS_SUBMISSION )
+ )
+ || ( ( _nNamespaceKey == XML_NAMESPACE_XFORMS )
+ && IsXMLToken( _rLocalName, XML_SUBMISSION )
+ )
+ )
{
m_sSubmissionID = _rValue;
+ return true;
}
- else
+
+ if ( OElementImport::tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) )
+ return true;
+
+ static const sal_Char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE);
+ static const sal_Char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_VALUE);
+ static const sal_Char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MIN_VALUE);
+ static const sal_Char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MAX_VALUE);
+ static const sal_Char* pRepeatDelayAttributeName = OAttributeMetaData::getSpecialAttributeName( SCA_REPEAT_DELAY );
+
+ sal_Int32 nHandle = -1;
+ if ( _rLocalName.equalsAscii( pValueAttributeName ) )
+ nHandle = PROPID_VALUE;
+ else if ( _rLocalName.equalsAscii( pCurrentValueAttributeName ) )
+ nHandle = PROPID_CURRENT_VALUE;
+ else if ( _rLocalName.equalsAscii( pMinValueAttributeName ) )
+ nHandle = PROPID_MIN_VALUE;
+ else if ( _rLocalName.equalsAscii( pMaxValueAttributeName ) )
+ nHandle = PROPID_MAX_VALUE;
+ if ( nHandle != -1 )
{
- static const sal_Char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_VALUE);
- static const sal_Char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCA_CURRENT_VALUE);
- static const sal_Char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MIN_VALUE);
- static const sal_Char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCA_MAX_VALUE);
- static const sal_Char* pRepeatDelayAttributeName = OAttributeMetaData::getSpecialAttributeName( SCA_REPEAT_DELAY );
-
- sal_Int32 nHandle = -1;
- if ( _rLocalName.equalsAscii( pValueAttributeName ) )
- nHandle = PROPID_VALUE;
- else if ( _rLocalName.equalsAscii( pCurrentValueAttributeName ) )
- nHandle = PROPID_CURRENT_VALUE;
- else if ( _rLocalName.equalsAscii( pMinValueAttributeName ) )
- nHandle = PROPID_MIN_VALUE;
- else if ( _rLocalName.equalsAscii( pMaxValueAttributeName ) )
- nHandle = PROPID_MAX_VALUE;
- if ( nHandle != -1 )
+ // for the moment, simply remember the name and the value
+ PropertyValue aProp;
+ aProp.Name = _rLocalName;
+ aProp.Handle = nHandle;
+ aProp.Value <<= _rValue;
+ m_aValueProperties.push_back(aProp);
+ return true;
+ }
+
+ if ( _rLocalName.equalsAscii( pRepeatDelayAttributeName ) )
+ {
+ ::Time aTime;
+ sal_Int32 nFractions = 0;
+ if ( SvXMLUnitConverter::convertTimeDuration( _rValue, aTime, &nFractions ) )
{
- // for the moment, simply remember the name and the value
PropertyValue aProp;
- aProp.Name = _rLocalName;
- aProp.Handle = nHandle;
- aProp.Value <<= _rValue;
- m_aValueProperties.push_back(aProp);
- }
- else if ( _rLocalName.equalsAscii( pRepeatDelayAttributeName ) )
- {
- ::Time aTime;
- sal_Int32 nFractions = 0;
- if ( SvXMLUnitConverter::convertTimeDuration( _rValue, aTime, &nFractions ) )
- {
- PropertyValue aProp;
- aProp.Name = PROPERTY_REPEAT_DELAY;
- aProp.Value <<= (sal_Int32)( ( ( aTime.GetMSFromTime() / 1000 ) * 1000 ) + nFractions );
+ aProp.Name = PROPERTY_REPEAT_DELAY;
+ aProp.Value <<= (sal_Int32)( ( ( aTime.GetMSFromTime() / 1000 ) * 1000 ) + nFractions );
- implPushBackPropertyValue(aProp);
- }
+ implPushBackPropertyValue(aProp);
}
- else
- OElementImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ return true;
}
+
+ return OElementImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
}
//---------------------------------------------------------------------
@@ -714,6 +881,7 @@ namespace xmloff
++aValueProps
)
{
+ bool bSuccess = false;
switch (aValueProps->Handle)
{
case PROPID_VALUE:
@@ -723,6 +891,7 @@ namespace xmloff
if (!bRetrievedValues)
{
getValuePropertyNames(m_eElementType, nClassId, pCurrentValueProperty, pValueProperty);
+ ENSURE_OR_BREAK( pCurrentValueProperty && pValueProperty, "OControlImport::StartElement: illegal value property names!" );
bRetrievedValues = sal_True;
}
OSL_ENSURE((PROPID_VALUE != aValueProps->Handle) || pValueProperty,
@@ -735,6 +904,7 @@ namespace xmloff
aValueProps->Name = ::rtl::OUString::createFromAscii(pValueProperty);
else
aValueProps->Name = ::rtl::OUString::createFromAscii(pCurrentValueProperty);
+ bSuccess = true;
}
break;
case PROPID_MIN_VALUE:
@@ -744,6 +914,7 @@ namespace xmloff
if (!bRetrievedValueLimits)
{
getValueLimitPropertyNames(nClassId, pMinValueProperty, pMaxValueProperty);
+ ENSURE_OR_BREAK( pMinValueProperty && pMaxValueProperty, "OControlImport::StartElement: illegal value limit property names!" );
bRetrievedValueLimits = sal_True;
}
OSL_ENSURE((PROPID_MIN_VALUE != aValueProps->Handle) || pMinValueProperty,
@@ -756,10 +927,14 @@ namespace xmloff
aValueProps->Name = ::rtl::OUString::createFromAscii(pMinValueProperty);
else
aValueProps->Name = ::rtl::OUString::createFromAscii(pMaxValueProperty);
+ bSuccess = true;
}
break;
}
+ if ( !bSuccess )
+ continue;
+
// translate the value
implTranslateValueProperty(m_xInfo, *aValueProps);
// add the property to the base class' array
@@ -980,7 +1155,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OImagePositionImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName,
+ bool OImagePositionImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName,
const ::rtl::OUString& _rValue )
{
if ( _rLocalName == GetXMLToken( XML_IMAGE_POSITION ) )
@@ -990,16 +1165,19 @@ namespace xmloff
_rValue, OEnumMapper::getEnumMap( OEnumMapper::epImagePosition )
) >>= m_nImagePosition );
m_bHaveImagePosition = sal_True;
+ return true;
}
- else if ( _rLocalName == GetXMLToken( XML_IMAGE_ALIGN ) )
+
+ if ( _rLocalName == GetXMLToken( XML_IMAGE_ALIGN ) )
{
OSL_VERIFY( PropertyConversion::convertString(
m_rContext.getGlobalContext(), ::getCppuType( &m_nImageAlign ),
_rValue, OEnumMapper::getEnumMap( OEnumMapper::epImageAlign )
) >>= m_nImageAlign );
+ return true;
}
- else
- OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+
+ return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
}
//---------------------------------------------------------------------
@@ -1047,14 +1225,16 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OReferredControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName,
+ bool OReferredControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName,
const ::rtl::OUString& _rValue)
{
static const ::rtl::OUString s_sReferenceAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCA_FOR));
if (_rLocalName == s_sReferenceAttributeName)
+ {
m_sReferringControls = _rValue;
- else
- OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ return true;
+ }
+ return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
//=====================================================================
@@ -1068,7 +1248,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OPasswordImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool OPasswordImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
static const ::rtl::OUString s_sEchoCharAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getSpecialAttributeName(SCA_ECHO_CHAR));
if (_rLocalName == s_sEchoCharAttributeName)
@@ -1083,9 +1263,9 @@ namespace xmloff
else
aEchoChar.Value <<= (sal_Int16)0;
implPushBackPropertyValue(aEchoChar);
+ return true;
}
- else
- OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
//=====================================================================
@@ -1099,7 +1279,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void ORadioImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool ORadioImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
// need special handling for the State & CurrentState properties:
// they're stored as booleans, but expected to be int16 properties
@@ -1122,9 +1302,9 @@ namespace xmloff
implPushBackPropertyValue(aNewValue);
}
+ return true;
}
- else
- OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+ return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
}
//=====================================================================
@@ -1138,7 +1318,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OURLReferenceImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool OURLReferenceImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
static const sal_Char* s_pTargetLocationAttributeName = OAttributeMetaData::getCommonControlAttributeName( CCA_TARGET_LOCATION );
static const sal_Char* s_pImageDataAttributeName = OAttributeMetaData::getCommonControlAttributeName( CCA_IMAGE_DATA );
@@ -1157,18 +1337,18 @@ namespace xmloff
if ( bMakeAbsolute && ( _rValue.getLength() > 0 ) )
{
// make a global URL out of the local one
- ::rtl::OUString sAdjustedValue;
- // only resolve image related url
- // we don't want say form url targets to be resolved
- // using ResolveGraphicObjectURL
- if ( 0 == _rLocalName.compareToAscii( s_pImageDataAttributeName ) )
- sAdjustedValue = m_rContext.getGlobalContext().ResolveGraphicObjectURL( _rValue, FALSE );
- else
- sAdjustedValue = m_rContext.getGlobalContext().GetAbsoluteReference( _rValue );
- OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, sAdjustedValue );
+ ::rtl::OUString sAdjustedValue;
+ // only resolve image related url
+ // we don't want say form url targets to be resolved
+ // using ResolveGraphicObjectURL
+ if ( 0 == _rLocalName.compareToAscii( s_pImageDataAttributeName ) )
+ sAdjustedValue = m_rContext.getGlobalContext().ResolveGraphicObjectURL( _rValue, sal_False );
+ else
+ sAdjustedValue = m_rContext.getGlobalContext().GetAbsoluteReference( _rValue );
+ return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, sAdjustedValue );
}
- else
- OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+
+ return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
}
//=====================================================================
@@ -1205,14 +1385,14 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OValueRangeImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue )
+ bool OValueRangeImport::handleAttribute( sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue )
{
if ( _rLocalName.equalsAscii( OAttributeMetaData::getSpecialAttributeName( SCA_STEP_SIZE ) ) )
{
GetImport().GetMM100UnitConverter().convertNumber( m_nStepSizeValue, _rValue );
+ return true;
}
- else
- OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+ return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
}
//---------------------------------------------------------------------
@@ -1338,7 +1518,7 @@ namespace xmloff
}
}
- // additionally, we need to set the "RichText" property of our element to TRUE
+ // additionally, we need to set the "RichText" property of our element to sal_True
// (the presence of the text:p is used as indicator for the value of the RichText property)
sal_Bool bHasRichTextProperty = sal_False;
if ( m_xInfo.is() )
@@ -1535,7 +1715,7 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OListAndComboImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool OListAndComboImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
static const sal_Char* pListSourceAttributeName = OAttributeMetaData::getDatabaseAttributeName(DA_LIST_SOURCE);
if ( _rLocalName.equalsAscii(pListSourceAttributeName) )
@@ -1560,12 +1740,16 @@ namespace xmloff
}
implPushBackPropertyValue( aListSource );
+ return true;
}
- else if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_CELL_RANGE ) ) )
+
+ if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_CELL_RANGE ) ) )
{
m_sCellListSource = _rValue;
+ return true;
}
- else if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_LINKING_TYPE ) ) )
+
+ if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BA_LIST_LINKING_TYPE ) ) )
{
sal_Int16 nLinkageType = 0;
PropertyConversion::convertString(
@@ -1576,9 +1760,10 @@ namespace xmloff
) >>= nLinkageType;
m_bLinkWithIndexes = ( nLinkageType != 0 );
+ return true;
}
- else
- OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+
+ return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
//---------------------------------------------------------------------
@@ -1776,7 +1961,9 @@ namespace xmloff
|| (OControlElement::FORMATTED_TEXT == _eType)
|| (OControlElement::CHECKBOX == _eType)
|| (OControlElement::LISTBOX == _eType)
- || (OControlElement::COMBOBOX == _eType),
+ || (OControlElement::COMBOBOX == _eType)
+ || (OControlElement::TIME == _eType)
+ || (OControlElement::DATE == _eType),
"OColumnWrapperImport::implCreateChildContext: invalid or unrecognized sub element!");
switch (_eType)
@@ -1871,19 +2058,25 @@ namespace xmloff
}
//---------------------------------------------------------------------
- void OFormImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
+ bool OFormImport::handleAttribute(sal_uInt16 _nNamespaceKey, const ::rtl::OUString& _rLocalName, const ::rtl::OUString& _rValue)
{
// handle the master/details field attributes (they're way too special to let the OPropertyImport handle them)
static const ::rtl::OUString s_sMasterFieldsAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getFormAttributeName(faMasterFields));
static const ::rtl::OUString s_sDetailFieldsAttributeName = ::rtl::OUString::createFromAscii(OAttributeMetaData::getFormAttributeName(faDetailFiels));
- if (s_sMasterFieldsAttributeName == _rLocalName)
+ if ( s_sMasterFieldsAttributeName == _rLocalName )
+ {
implTranslateStringListProperty(PROPERTY_MASTERFIELDS, _rValue);
- else if (s_sDetailFieldsAttributeName == _rLocalName)
+ return true;
+ }
+
+ if ( s_sDetailFieldsAttributeName == _rLocalName )
+ {
implTranslateStringListProperty(PROPERTY_DETAILFIELDS, _rValue);
+ return true;
+ }
- else
- OFormImport_Base::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+ return OFormImport_Base::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
}
//---------------------------------------------------------------------