diff options
author | Philipp Lohmann [pl] <Philipp.Lohmann@Oracle.COM> | 2010-11-24 18:50:17 +0100 |
---|---|---|
committer | Philipp Lohmann [pl] <Philipp.Lohmann@Oracle.COM> | 2010-11-24 18:50:17 +0100 |
commit | b5d2cb0a2c20db106facf299c0271bce5223810a (patch) | |
tree | 394f532aadd23d4b9935435c4e62dbf8ab71ef5f /xmloff/source/forms/elementexport.cxx | |
parent | 2b1b6ec0a537571bd7367446e5592d8954c10bbe (diff) | |
parent | 94753953df87e4d761ff9fa30333dc02994f6d3f (diff) |
merge with DEV300_m94
Diffstat (limited to 'xmloff/source/forms/elementexport.cxx')
-rw-r--r-- | xmloff/source/forms/elementexport.cxx | 125 |
1 files changed, 116 insertions, 9 deletions
diff --git a/xmloff/source/forms/elementexport.cxx b/xmloff/source/forms/elementexport.cxx index 115b06c4c2ad..149965631b27 100644 --- a/xmloff/source/forms/elementexport.cxx +++ b/xmloff/source/forms/elementexport.cxx @@ -36,6 +36,7 @@ #include "formcellbinding.hxx" #include "formcellbinding.hxx" #include "xformsexport.hxx" +#include "property_meta_data.hxx" /** === begin UNO includes === **/ #include <com/sun/star/text/XText.hpp> @@ -321,6 +322,9 @@ namespace xmloff #endif } + // "new-style" properties ... + exportGenericHandlerAttributes(); + // common control attributes exportCommonControlAttributes(); @@ -474,6 +478,84 @@ namespace xmloff } //--------------------------------------------------------------------- + void OControlExport::exportGenericHandlerAttributes() + { + const Sequence< Property > aProperties = m_xPropertyInfo->getProperties(); + for ( const Property* prop = aProperties.getConstArray(); + prop != aProperties.getConstArray() + aProperties.getLength(); + ++prop + ) + { + try + { + // see if this property can already be handled with an IPropertyHandler (which, on the long + // term, should be the case for most, if not all, properties) + const PropertyDescription* propDescription = metadata::getPropertyDescription( prop->Name ); + if ( propDescription == NULL ) + continue; + + // let the factory provide the concrete handler. Note that caching, if desired, is the task + // of the factory + PPropertyHandler handler = (*propDescription->factory)( propDescription->propertyId ); + ENSURE_OR_CONTINUE( handler.get() != NULL, + "OControlExport::exportGenericHandlerAttributes: invalid property handler provided by the factory!" ); + + ::rtl::OUString attributeValue; + if ( propDescription->propertyGroup == NO_GROUP ) + { + // that's a property which has a direct mapping to an attribute + if ( !shouldExportProperty( prop->Name ) ) + // TODO: in the future, we surely need a more sophisticated approach to this, involving the property + // handler, or the property description + { + exportedProperty( prop->Name ); + continue; + } + + const Any propValue = m_xProps->getPropertyValue( prop->Name ); + attributeValue = handler->getAttributeValue( propValue ); + } + else + { + // that's a property which is part of a group of properties, whose values, in their entity, comprise + // a single attribute value + + // retrieve the descriptions of all other properties which add to the attribute value + PropertyDescriptionList descriptions; + metadata::getPropertyGroup( propDescription->propertyGroup, descriptions ); + + // retrieve the values for all those properties + PropertyValues aValues; + for ( PropertyDescriptionList::iterator desc = descriptions.begin(); + desc != descriptions.end(); + ++desc + ) + { + // TODO: XMultiPropertySet? + const Any propValue = m_xProps->getPropertyValue( (*desc)->propertyName ); + aValues[ (*desc)->propertyId ] = propValue; + } + + // let the handler translate into an XML attribute value + attributeValue = handler->getAttributeValue( aValues ); + } + + AddAttribute( + propDescription->attribute.namespacePrefix, + token::GetXMLToken( propDescription->attribute.attributeToken ), + attributeValue + ); + + exportedProperty( prop->Name ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + } + } + + //--------------------------------------------------------------------- void OControlExport::exportCommonControlAttributes() { size_t i=0; @@ -1380,21 +1462,35 @@ namespace xmloff m_nClassId = FormComponentType::CONTROL; DBG_CHECK_PROPERTY( PROPERTY_CLASSID, sal_Int16 ); m_xProps->getPropertyValue(PROPERTY_CLASSID) >>= m_nClassId; + bool knownType = false; switch (m_nClassId) { case FormComponentType::DATEFIELD: + m_eType = DATE; + knownType = true; + // NO BREAK case FormComponentType::TIMEFIELD: + if ( !knownType ) + { + m_eType = TIME; + knownType = true; + } + m_nIncludeSpecial |= SCA_VALIDATION; + // NO BREAK case FormComponentType::NUMERICFIELD: case FormComponentType::CURRENCYFIELD: case FormComponentType::PATTERNFIELD: - m_eType = FORMATTED_TEXT; + if ( !knownType ) + { + m_eType = FORMATTED_TEXT; + knownType = true; + } // NO BREAK case FormComponentType::TEXTFIELD: { // it's some kind of edit. To know which type we need further investigation - if (FORMATTED_TEXT != m_eType) - { // not coming from the previous cases which had a class id .ne. TEXTFIELD - + if ( !knownType ) + { // check if it's a formatted field if (m_xPropertyInfo->hasPropertyByName(PROPERTY_FORMATKEY)) { @@ -1430,14 +1526,21 @@ namespace xmloff m_eType = TEXT; } } + knownType = true; } - // attributes which are common to all the four types: + // attributes which are common to all the types: // common attributes m_nIncludeCommon = - CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_VALUE | + CCA_NAME | CCA_SERVICE_NAME | CCA_DISABLED | CCA_PRINTABLE | CCA_TAB_INDEX | CCA_TAB_STOP | CCA_TITLE; + if ( ( m_nClassId != FormComponentType::DATEFIELD ) + && ( m_nClassId != FormComponentType::TIMEFIELD ) + ) + // date and time field values are handled differently nowadays + m_nIncludeCommon |= CCA_VALUE; + // database attributes m_nIncludeDatabase = DA_DATA_FIELD | DA_INPUT_REQUIRED; @@ -1461,8 +1564,7 @@ namespace xmloff // max and min values and validation: if (FORMATTED_TEXT == m_eType) { // in general all controls represented as formatted-text have these props - if (FormComponentType::PATTERNFIELD != m_nClassId) - // but the PatternField does not have value limits + if ( FormComponentType::PATTERNFIELD != m_nClassId ) // except the PatternField m_nIncludeSpecial |= SCA_MAX_VALUE | SCA_MIN_VALUE; if (FormComponentType::TEXTFIELD != m_nClassId) @@ -1471,8 +1573,13 @@ namespace xmloff } // if it's not a password field or rich text control, the CurrentValue needs to be stored, too - if ( PASSWORD != m_eType ) + if ( ( PASSWORD != m_eType ) + && ( DATE != m_eType ) + && ( TIME != m_eType ) + ) + { m_nIncludeCommon |= CCA_CURRENT_VALUE; + } } break; |