summaryrefslogtreecommitdiff
path: root/xmloff/source/text/txtvfldi.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/text/txtvfldi.cxx')
-rw-r--r--xmloff/source/text/txtvfldi.cxx1474
1 files changed, 1474 insertions, 0 deletions
diff --git a/xmloff/source/text/txtvfldi.cxx b/xmloff/source/text/txtvfldi.cxx
new file mode 100644
index 000000000000..fb0a957f6c86
--- /dev/null
+++ b/xmloff/source/text/txtvfldi.cxx
@@ -0,0 +1,1474 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * 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.
+ *
+ * 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).
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_xmloff.hxx"
+
+/** @#file
+ *
+ * export of all variable related text fields (and database display field)
+ */
+#include "txtvfldi.hxx"
+#include <xmloff/xmltoken.hxx>
+#include <xmloff/txtimp.hxx>
+#include <xmloff/xmlnumi.hxx>
+#include "xmlnmspe.hxx"
+#include <xmloff/nmspmap.hxx>
+#include "i18nmap.hxx"
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/xmluconv.hxx>
+#include <xmloff/xmlement.hxx>
+#include <com/sun/star/text/SetVariableType.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XDependentTextField.hpp>
+#include <com/sun/star/text/XTextFieldsSupplier.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/beans/XPropertySetInfo.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/xml/sax/XAttributeList.hpp>
+
+#ifndef _RTL_USTRING
+#include <rtl/ustring.hxx>
+#endif
+#include <tools/debug.hxx>
+
+
+// service names
+static const sal_Char sAPI_textfield_prefix[] = "com.sun.star.text.TextField.";
+static const sal_Char sAPI_fieldmaster_prefix[] = "com.sun.star.text.FieldMaster.";
+static const sal_Char sAPI_input[] = "Input";
+static const sal_Char sAPI_input_user[] = "InputUser";
+static const sal_Char sAPI_get_expression[] = "GetExpression";
+static const sal_Char sAPI_set_expression[] = "SetExpression";
+static const sal_Char sAPI_user[] = "User";
+static const sal_Char sAPI_table_formula[] = "TableFormula";
+static const sal_Char sAPI_database[] = "com.sun.star.text.TextField.Database";
+static const sal_Char sAPI_fieldmaster_database[] = "com.sun.star.text.FieldMaster.Database";
+
+// property names
+static const sal_Char sAPI_hint[] = "Hint";
+static const sal_Char sAPI_help[] = "Help";
+static const sal_Char sAPI_tooltip[] = "Tooltip";
+static const sal_Char sAPI_content[] = "Content";
+static const sal_Char sAPI_sub_type[] = "SubType";
+static const sal_Char sAPI_is_expression[] = "IsExpression";
+static const sal_Char sAPI_is_input[] = "Input";
+static const sal_Char sAPI_is_show_formula[] = "IsShowFormula";
+static const sal_Char sAPI_numbering_type[] = "NumberingType";
+static const sal_Char sAPI_number_format[] = "NumberFormat";
+static const sal_Char sAPI_name[] = "Name";
+static const sal_Char sAPI_numbering_separator[] = "NumberingSeparator";
+static const sal_Char sAPI_chapter_numbering_level[]= "ChapterNumberingLevel";
+static const sal_Char sAPI_value[] = "Value";
+static const sal_Char sAPI_is_visible[] = "IsVisible";
+static const sal_Char sAPI_variable_subtype[] = "VariableSubtype";
+static const sal_Char sAPI_data_column_name[] = "DataColumnName";
+static const sal_Char sAPI_is_data_base_format[] = "DataBaseFormat";
+static const sal_Char sAPI_current_presentation[] = "CurrentPresentation";
+static const sal_Char sAPI_sequence_value[] = "SequenceValue";
+static const sal_Char sAPI_is_fixed_language[] = "IsFixedLanguage";
+
+
+using ::rtl::OUString;
+using ::rtl::OUStringBuffer;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::text;
+using namespace ::com::sun::star::style;
+using namespace ::xmloff::token;
+
+
+
+//
+// XMLVarFieldImportContext: superclass for all variable related fields
+//
+
+TYPEINIT1( XMLVarFieldImportContext, XMLTextFieldImportContext );
+
+XMLVarFieldImportContext::XMLVarFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ const sal_Char* pServiceName, sal_uInt16 nPrfx,
+ const OUString& rLocalName,
+ sal_Bool bName, sal_Bool bFormula, sal_Bool bFormulaDefault,
+ sal_Bool bDescription, sal_Bool bHelp, sal_Bool bHint, sal_Bool bVisible,
+ sal_Bool bIsDisplayFormula,
+ sal_Bool bType, sal_Bool bStyle, sal_Bool bValue,
+ sal_Bool bPresentation) :
+ XMLTextFieldImportContext(rImport, rHlp, pServiceName, nPrfx, rLocalName),
+ sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)),
+ sPropertyHint(RTL_CONSTASCII_USTRINGPARAM(sAPI_hint)),
+ sPropertyHelp(RTL_CONSTASCII_USTRINGPARAM(sAPI_help)),
+ sPropertyTooltip(RTL_CONSTASCII_USTRINGPARAM(sAPI_tooltip)),
+ sPropertyIsVisible(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_visible)),
+ sPropertyIsDisplayFormula(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_show_formula)),
+ sPropertyCurrentPresentation(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)),
+ aValueHelper(rImport, rHlp, bType, bStyle, bValue, sal_False),
+ bDisplayFormula(sal_False),
+ bDisplayNone(sal_False),
+ bNameOK(sal_False),
+ bFormulaOK(sal_False),
+ bDescriptionOK(sal_False),
+ bHelpOK(sal_False),
+ bHintOK(sal_False),
+ bDisplayOK(sal_False),
+ bSetName(bName),
+ bSetFormula(bFormula),
+ bSetFormulaDefault(bFormulaDefault),
+ bSetDescription(bDescription),
+ bSetHelp(bHelp),
+ bSetHint(bHint),
+ bSetVisible(bVisible),
+ bSetDisplayFormula(bIsDisplayFormula),
+ bSetPresentation(bPresentation)
+{
+}
+
+void XMLVarFieldImportContext::ProcessAttribute(
+ sal_uInt16 nAttrToken,
+ const OUString& sAttrValue )
+{
+ switch (nAttrToken)
+ {
+ case XML_TOK_TEXTFIELD_NAME:
+ sName = sAttrValue;
+ bNameOK = sal_True;
+ bValid = sal_True; // we assume: field with name is valid!
+ break;
+ case XML_TOK_TEXTFIELD_DESCRIPTION:
+ sDescription = sAttrValue;
+ bDescriptionOK = sal_True;
+ break;
+ case XML_TOK_TEXTFIELD_HELP:
+ sHelp = sAttrValue;
+ bHelpOK = true;
+ break;
+ case XML_TOK_TEXTFIELD_HINT:
+ sHint = sAttrValue;
+ bHintOK = true;
+ break;
+ case XML_TOK_TEXTFIELD_FORMULA:
+ {
+ OUString sTmp;
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
+ _GetKeyByAttrName( sAttrValue, &sTmp, sal_False );
+ if( XML_NAMESPACE_OOOW == nPrefix )
+ {
+ sFormula = sTmp;
+ bFormulaOK = sal_True;
+ }
+ else
+ sFormula = sAttrValue;
+ }
+ break;
+ case XML_TOK_TEXTFIELD_DISPLAY:
+ if (IsXMLToken(sAttrValue, XML_FORMULA))
+ {
+ bDisplayFormula = sal_True;
+ bDisplayNone = sal_False;
+ bDisplayOK = sal_True;
+ }
+ else if (IsXMLToken(sAttrValue, XML_VALUE))
+ {
+ bDisplayFormula = sal_False;
+ bDisplayNone = sal_False;
+ bDisplayOK = sal_True;
+ }
+ else if (IsXMLToken(sAttrValue, XML_NONE))
+ {
+ bDisplayFormula = sal_False;
+ bDisplayNone = sal_True;
+ bDisplayOK = sal_True;
+ } // else: no change
+ DBG_ASSERT(!(bDisplayFormula && bDisplayNone),
+ "illegal display values");
+ break;
+ default:
+ // delegate all others to value helper
+ aValueHelper.ProcessAttribute(nAttrToken, sAttrValue);
+ break;
+ }
+}
+
+void XMLVarFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // bSetName: not implemented
+
+ if (bSetFormula)
+ {
+ if (!bFormulaOK && bSetFormulaDefault)
+ {
+ sFormula = GetContent();
+ bFormulaOK = sal_True;
+ }
+
+ if (bFormulaOK)
+ {
+ Any aAny;
+ aAny <<= sFormula;
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+ }
+ }
+
+ if (bSetDescription && bDescriptionOK)
+ {
+ Any aAny;
+ aAny <<= sDescription;
+ xPropertySet->setPropertyValue(sPropertyHint, aAny);
+ }
+
+ if (bSetHelp && bHelpOK)
+ {
+ Any aAny;
+ aAny <<= sHelp;
+ xPropertySet->setPropertyValue(sPropertyHelp, aAny);
+ }
+
+ if (bSetHint && bHintOK)
+ {
+ Any aAny;
+ aAny <<= sHint;
+ xPropertySet->setPropertyValue(sPropertyTooltip, aAny);
+ }
+
+ if (bSetVisible && bDisplayOK)
+ {
+ Any aAny;
+ sal_Bool bTmp = ! (bDisplayNone && bDisplayOK);
+ aAny.setValue( &bTmp, ::getBooleanCppuType());
+ xPropertySet->setPropertyValue(sPropertyIsVisible, aAny);
+ }
+
+ // workaround for #no-bug#: display formula by default
+ if (xPropertySet->getPropertySetInfo()->
+ hasPropertyByName(sPropertyIsDisplayFormula) &&
+ !bSetDisplayFormula)
+ {
+ bDisplayFormula = sal_False;
+ bSetDisplayFormula = sal_True;
+ }
+
+
+ if (bSetDisplayFormula)
+ {
+ Any aAny;
+ sal_Bool bTmp = bDisplayFormula && bDisplayOK;
+ aAny.setValue( &bTmp, ::getBooleanCppuType());
+ xPropertySet->setPropertyValue(sPropertyIsDisplayFormula, aAny);
+ }
+
+ // delegate to value helper
+ aValueHelper.SetDefault(GetContent());
+ aValueHelper.PrepareField(xPropertySet);
+
+ // finally, set the curren presentation
+ if (bSetPresentation)
+ {
+ Any aAny;
+ aAny <<= GetContent();
+ xPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny);
+ }
+}
+
+
+
+
+
+//
+// variable set fields
+//
+
+TYPEINIT1( XMLSetVarFieldImportContext, XMLVarFieldImportContext );
+
+XMLSetVarFieldImportContext::XMLSetVarFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ const sal_Char* pServiceName, sal_uInt16 nPrfx,
+ const OUString& rLocalName, VarType eVarType,
+ sal_Bool bName, sal_Bool bFormula, sal_Bool bFormulaDefault,
+ sal_Bool bDescription, sal_Bool bHelp, sal_Bool bHint, sal_Bool bVisible, sal_Bool bIsDisplayFormula,
+ sal_Bool bType, sal_Bool bStyle, sal_Bool bValue, sal_Bool bPresentation) :
+ XMLVarFieldImportContext(rImport, rHlp, pServiceName,
+ nPrfx, rLocalName,
+ bName, bFormula, bFormulaDefault,
+ bDescription, bHelp, bHint, bVisible, bIsDisplayFormula,
+ bType, bStyle, bValue, bPresentation),
+ eFieldType(eVarType)
+{
+}
+
+void XMLSetVarFieldImportContext::EndElement()
+{
+ // should we call PrepareField on the field, or rather on it's master?
+ // currently: call on field (just like superclass)
+ // possible alternatives: call on master
+ // call field or master depending on variable
+ // PrepareMaster() in addition to PrepareField()
+
+ DBG_ASSERT(GetServiceName().getLength()>0, "no service name for element!");
+
+ if (bValid)
+ {
+ DBG_ASSERT(GetName().getLength()>0, "variable name needed!");
+
+ // find field master
+ Reference<XPropertySet> xMaster;
+ if (FindFieldMaster(xMaster))
+ {
+ // create field/Service
+ Reference<XPropertySet> xPropSet;
+ if (CreateField(xPropSet, OUString::createFromAscii(sAPI_textfield_prefix) + GetServiceName()))
+ {
+ Reference<XDependentTextField> xDepTextField(xPropSet, UNO_QUERY);
+ if (xDepTextField.is())
+ {
+ // attach field to field master
+ xDepTextField->attachTextFieldMaster(xMaster);
+
+ // attach field to document
+ Reference<XTextContent> xTextContent(xPropSet, UNO_QUERY);
+ if (xTextContent.is())
+ {
+ try {
+ // insert, set field properties and exit!
+ GetImportHelper().InsertTextContent(xTextContent);
+ PrepareField(xPropSet);
+ } catch (lang::IllegalArgumentException & /*e*/)
+ {
+ // ignore e: #i54023#
+ };
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ // above: exit on success; so for all error cases we end up here!
+ // write element content
+ GetImportHelper().InsertString(GetContent());
+}
+
+sal_Bool XMLSetVarFieldImportContext::FindFieldMaster(
+ Reference<XPropertySet> & xMaster)
+{
+ // currently: delegate to XMLVariableDeclImportContext;
+ // shoud eventually go here
+ return XMLVariableDeclImportContext::FindFieldMaster(xMaster,
+ GetImport(),
+ GetImportHelper(),
+ GetName(),
+ eFieldType);
+}
+
+
+
+//
+// sequence field
+//
+
+TYPEINIT1( XMLSequenceFieldImportContext, XMLSetVarFieldImportContext );
+
+XMLSequenceFieldImportContext::XMLSequenceFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName) :
+ XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
+ nPrfx, rLocalName, VarTypeSequence,
+ // name, formula
+ sal_True, sal_True, sal_True,
+ sal_False, sal_False, sal_False, sal_False,
+ sal_False,
+ sal_False, sal_False, sal_False, sal_True),
+
+ sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_number_format)),
+ sPropertySequenceValue(RTL_CONSTASCII_USTRINGPARAM(sAPI_sequence_value)),
+ sNumFormat(OUString::valueOf(sal_Unicode('1'))),
+ sNumFormatSync(GetXMLToken(XML_FALSE)),
+ bRefNameOK(sal_False)
+{
+}
+
+void XMLSequenceFieldImportContext::ProcessAttribute(
+ sal_uInt16 nAttrToken, const OUString& sAttrValue )
+{
+ switch (nAttrToken)
+ {
+ case XML_TOK_TEXTFIELD_NUM_FORMAT:
+ sNumFormat = sAttrValue;
+ break;
+ case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC:
+ sNumFormatSync = sAttrValue;
+ break;
+ case XML_TOK_TEXTFIELD_REF_NAME:
+ sRefName = sAttrValue;
+ bRefNameOK = sal_True;
+ break;
+ default:
+ // delegate to super class (name, formula)
+ XMLSetVarFieldImportContext::ProcessAttribute(nAttrToken,
+ sAttrValue);
+ break;
+ } // switch
+}
+
+void XMLSequenceFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // delegate to super class (formula)
+ XMLSetVarFieldImportContext::PrepareField(xPropertySet);
+
+ // set format
+ sal_Int16 nNumType = NumberingType::ARABIC;
+ GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, sNumFormat, sNumFormatSync );
+ Any aAny;
+ aAny <<= nNumType;
+ xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny);
+
+ // handle reference name
+ if (bRefNameOK)
+ {
+ aAny = xPropertySet->getPropertyValue(sPropertySequenceValue);
+ sal_Int16 nValue = 0;
+ aAny >>= nValue;
+ GetImportHelper().InsertSequenceID(sRefName, GetName(), nValue);
+ }
+}
+
+
+
+//
+// variable set field
+//
+
+TYPEINIT1( XMLVariableSetFieldImportContext, XMLSetVarFieldImportContext );
+
+XMLVariableSetFieldImportContext::XMLVariableSetFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName) :
+ XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
+ nPrfx, rLocalName, VarTypeSimple,
+ // name, formula, value&type, style,
+ // display none
+ sal_True, sal_True, sal_True,
+ sal_False, sal_False, sal_False,
+ sal_True, sal_False,
+ sal_True, sal_True, sal_True,
+ sal_True),
+ sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type))
+{
+}
+
+void XMLVariableSetFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // set type
+ Any aAny;
+ aAny <<= (IsStringValue()? SetVariableType::STRING : SetVariableType::VAR);
+ xPropertySet->setPropertyValue(sPropertySubType, aAny);
+
+ // the remainder is handled by super class
+ XMLSetVarFieldImportContext::PrepareField(xPropertySet);
+}
+
+
+
+//
+// variable input field
+//
+
+TYPEINIT1( XMLVariableInputFieldImportContext, XMLSetVarFieldImportContext );
+
+XMLVariableInputFieldImportContext::XMLVariableInputFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
+ const OUString& rLocalName) :
+ XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
+ nPrfx, rLocalName, VarTypeSimple,
+ // name, description, display none/formula,
+ // value&type, style, formula
+ sal_True, sal_True, sal_True,
+ sal_True, sal_True, sal_True,
+ sal_True, sal_False,
+ sal_True, sal_True, sal_True,
+ sal_True),
+ sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type)),
+ sPropertyIsInput(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_input))
+{
+}
+
+void XMLVariableInputFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // set type (input field)
+ Any aAny;
+ sal_Bool bTrue = sal_True;
+ aAny.setValue( &bTrue, ::getBooleanCppuType() );
+ xPropertySet->setPropertyValue(sPropertyIsInput, aAny);
+
+ // set type
+ aAny <<= (IsStringValue()? SetVariableType::STRING : SetVariableType::VAR);
+ xPropertySet->setPropertyValue(sPropertySubType, aAny);
+
+ // the remainder is handled by super class
+ XMLSetVarFieldImportContext::PrepareField(xPropertySet);
+}
+
+
+
+//
+// user field
+//
+
+TYPEINIT1( XMLUserFieldImportContext, XMLSetVarFieldImportContext );
+
+XMLUserFieldImportContext::XMLUserFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName) :
+ XMLSetVarFieldImportContext(rImport, rHlp, sAPI_user, nPrfx,
+ rLocalName, VarTypeUserField,
+ // name, display none/formula, style
+ sal_True, sal_False, sal_False,
+ sal_False, sal_False, sal_False, sal_True,
+ sal_True,
+ sal_False, sal_True, sal_False,
+ sal_False)
+{
+}
+
+
+
+//
+// user input field
+//
+
+TYPEINIT1( XMLUserFieldInputImportContext, XMLVarFieldImportContext );
+
+// bug: doesn't work (SO API lacking)
+XMLUserFieldInputImportContext::XMLUserFieldInputImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
+ const OUString& rLocalName) :
+ XMLVarFieldImportContext(rImport, rHlp, sAPI_input_user,
+ nPrfx, rLocalName,
+ // name, description, style
+ sal_True, sal_False, sal_False,
+ sal_True, sal_False, sal_False,
+ sal_False, sal_False,
+ sal_False /*???*/, sal_True, sal_False,
+ sal_False)
+{
+}
+
+void XMLUserFieldInputImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ Any aAny;
+ aAny <<= GetName();
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+
+ // delegate to super class
+ XMLVarFieldImportContext::PrepareField(xPropertySet);
+}
+
+
+//
+// variable get field
+//
+
+TYPEINIT1( XMLVariableGetFieldImportContext, XMLVarFieldImportContext );
+
+XMLVariableGetFieldImportContext::XMLVariableGetFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName) :
+ XMLVarFieldImportContext(rImport, rHlp, sAPI_get_expression,
+ nPrfx, rLocalName,
+ // name, style, display formula
+ sal_True, sal_False, sal_False,
+ sal_False, sal_False, sal_False,
+ sal_False, sal_True,
+ sal_True, sal_True, sal_False,
+ sal_True),
+ sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type))
+{
+}
+
+void XMLVariableGetFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // set name
+ Any aAny;
+ aAny <<= GetName();
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+
+ // the remainder is handled by super class
+ XMLVarFieldImportContext::PrepareField(xPropertySet);
+}
+
+
+
+//
+// expression field
+//
+
+TYPEINIT1( XMLExpressionFieldImportContext, XMLVarFieldImportContext );
+
+XMLExpressionFieldImportContext::XMLExpressionFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName) :
+ XMLVarFieldImportContext(rImport, rHlp, sAPI_get_expression,
+ nPrfx, rLocalName,
+ // formula, type, style, display formula
+ sal_False, sal_True, sal_True,
+ sal_False, sal_False, sal_False,
+ sal_False, sal_True,
+ sal_True, sal_True, sal_False,
+ sal_True),
+ sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type))
+{
+ bValid = sal_True; // always valid
+}
+
+
+void XMLExpressionFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ sal_Int16 nSubType = SetVariableType::FORMULA;
+ Any aAny;
+ aAny <<= nSubType;
+ xPropertySet->setPropertyValue(sPropertySubType, aAny);
+
+ // delegate to super class
+ XMLVarFieldImportContext::PrepareField(xPropertySet);
+}
+
+
+
+//
+// text input field
+//
+
+TYPEINIT1( XMLTextInputFieldImportContext, XMLVarFieldImportContext );
+
+XMLTextInputFieldImportContext::XMLTextInputFieldImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& sLocalName) :
+ XMLVarFieldImportContext(rImport, rHlp, sAPI_input,
+ nPrfx, sLocalName,
+ // description
+ sal_False, sal_False, sal_False,
+ sal_True, sal_True, sal_True,
+ sal_False, sal_False,
+ sal_False, sal_False, sal_False,
+ sal_False),
+ sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content))
+{
+ bValid = sal_True; // always valid
+}
+
+void XMLTextInputFieldImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ XMLVarFieldImportContext::PrepareField(xPropertySet);
+
+ Any aAny;
+ aAny <<= GetContent();
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+}
+
+
+//
+// table formula field
+//
+
+TYPEINIT1( XMLTableFormulaImportContext, XMLTextFieldImportContext );
+
+XMLTableFormulaImportContext::XMLTableFormulaImportContext(
+ SvXMLImport& rImport,
+ XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx,
+ const OUString& rLocalName) :
+ XMLTextFieldImportContext(rImport, rHlp, sAPI_table_formula,
+ nPrfx, rLocalName),
+ sPropertyIsShowFormula(RTL_CONSTASCII_USTRINGPARAM("IsShowFormula")),
+ sPropertyCurrentPresentation(
+ RTL_CONSTASCII_USTRINGPARAM("CurrentPresentation")),
+ aValueHelper(rImport, rHlp, sal_False, sal_True, sal_False, sal_True),
+ sFormula(),
+ bIsShowFormula(sal_False)
+{
+}
+
+XMLTableFormulaImportContext::~XMLTableFormulaImportContext()
+{
+}
+
+void XMLTableFormulaImportContext::ProcessAttribute(
+ sal_uInt16 nAttrToken,
+ const OUString& sAttrValue )
+{
+ switch (nAttrToken)
+ {
+ case XML_TOK_TEXTFIELD_FORMULA:
+ aValueHelper.ProcessAttribute( nAttrToken, sAttrValue );
+ bValid = sal_True; // we need a formula!
+ break;
+
+ case XML_TOK_TEXTFIELD_DATA_STYLE_NAME:
+ aValueHelper.ProcessAttribute( nAttrToken, sAttrValue );
+ break;
+ case XML_TOK_TEXTFIELD_DISPLAY:
+ if ( sAttrValue.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("formula")) )
+ bIsShowFormula = sal_True;
+ break;
+ default:
+ // unknown attribute -> ignore
+ break;
+ }
+}
+
+void XMLTableFormulaImportContext::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ // set format and formula
+ aValueHelper.PrepareField( xPropertySet );
+
+ Any aAny;
+
+ // set 'show formula' and presentation
+ aAny.setValue( &bIsShowFormula, ::getBooleanCppuType() );
+ xPropertySet->setPropertyValue( sPropertyIsShowFormula, aAny );
+
+ aAny <<= GetContent();
+ xPropertySet->setPropertyValue( sPropertyCurrentPresentation, aAny );
+}
+
+
+
+//
+// variable declarations
+//
+// Should be adapted to XMLVarField-/XMLSetVarFieldImportContext scheme!
+//
+
+
+
+//
+// declaration containter import (<variable/user-field/sequence-decls>)
+//
+
+TYPEINIT1( XMLVariableDeclsImportContext, SvXMLImportContext );
+
+XMLVariableDeclsImportContext::XMLVariableDeclsImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
+ const OUString& rLocalName, enum VarType eVarType) :
+ SvXMLImportContext(rImport, nPrfx, rLocalName),
+ eVarDeclsContextType(eVarType),
+ rImportHelper(rHlp)
+{
+}
+
+SvXMLImportContext* XMLVariableDeclsImportContext::CreateChildContext(
+ sal_uInt16 nPrefix, const OUString& rLocalName,
+ const Reference<xml::sax::XAttributeList> & xAttrList )
+{
+ enum XMLTokenEnum eElementName;
+ SvXMLImportContext* pImportContext = NULL;
+
+ if( XML_NAMESPACE_TEXT == nPrefix )
+ {
+ switch (eVarDeclsContextType)
+ {
+ case VarTypeSequence:
+ eElementName = XML_SEQUENCE_DECL;
+ break;
+ case VarTypeSimple:
+ eElementName = XML_VARIABLE_DECL;
+ break;
+ case VarTypeUserField:
+ eElementName = XML_USER_FIELD_DECL;
+ break;
+ default:
+ DBG_ERROR("unknown field type!");
+ eElementName = XML_SEQUENCE_DECL;
+ break;
+ }
+
+ if( IsXMLToken( rLocalName, eElementName ) )
+ {
+ pImportContext = new XMLVariableDeclImportContext(
+ GetImport(), rImportHelper, nPrefix, rLocalName, xAttrList,
+ eVarDeclsContextType);
+ }
+ }
+
+ // if no context was created, use default context
+ if (NULL == pImportContext) {
+ pImportContext = SvXMLImportContext::CreateChildContext(nPrefix,
+ rLocalName,
+ xAttrList);
+ }
+
+ return pImportContext;
+}
+
+
+
+//
+// declaration import (<variable/user-field/sequence-decl> elements)
+//
+
+TYPEINIT1( XMLVariableDeclImportContext, SvXMLImportContext );
+
+XMLVariableDeclImportContext::XMLVariableDeclImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp,
+ sal_uInt16 nPrfx, const OUString& rLocalName,
+ const Reference<xml::sax::XAttributeList> & xAttrList,
+ enum VarType eVarType) :
+ SvXMLImportContext(rImport, nPrfx, rLocalName),
+ // bug?? which properties for userfield/userfieldmaster
+ sPropertyName(RTL_CONSTASCII_USTRINGPARAM(sAPI_name)),
+ sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type)),
+ sPropertyNumberingLevel(RTL_CONSTASCII_USTRINGPARAM(sAPI_chapter_numbering_level)),
+ sPropertyNumberingSeparator(RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_separator)),
+ sPropertyIsExpression(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_expression)),
+ aValueHelper(rImport, rHlp, sal_True, sal_False, sal_True, sal_False),
+ nNumLevel(-1), cSeparationChar('.')
+{
+ if ( (XML_NAMESPACE_TEXT == nPrfx) &&
+ ( ( IsXMLToken( rLocalName, XML_SEQUENCE_DECL )) ||
+ ( IsXMLToken( rLocalName, XML_VARIABLE_DECL)) ||
+ ( IsXMLToken( rLocalName, XML_USER_FIELD_DECL)) )) {
+
+ // TODO: check validity (need name!)
+
+ // parse attributes
+ sal_Int16 nLength = xAttrList->getLength();
+ for(sal_Int16 i=0; i<nLength; i++) {
+
+ OUString sLocalName;
+ sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
+ GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
+
+ sal_uInt16 nToken = rHlp.
+ GetTextFieldAttrTokenMap().Get(nPrefix, sLocalName);
+
+ switch (nToken)
+ {
+ case XML_TOK_TEXTFIELD_NAME:
+ sName = xAttrList->getValueByIndex(i);
+ break;
+ case XML_TOK_TEXTFIELD_NUMBERING_LEVEL:
+ {
+ sal_Int32 nLevel;
+ sal_Bool bRet = SvXMLUnitConverter::convertNumber(
+ nLevel, xAttrList->getValueByIndex(i), 0,
+ GetImport().GetTextImport()->GetChapterNumbering()->
+ getCount());
+ if (bRet)
+ {
+ nNumLevel = static_cast< sal_Int8 >( nLevel-1 ); // API numbers -1..9
+ }
+ break;
+ }
+ case XML_TOK_TEXTFIELD_NUMBERING_SEPARATOR:
+ cSeparationChar =
+ (sal_Char)xAttrList->getValueByIndex(i).toChar();
+ break;
+
+ default:
+ // delegate to value helper
+ aValueHelper.ProcessAttribute(nToken,
+ xAttrList->getValueByIndex(i));
+ break;
+ }
+ }
+
+ Reference<XPropertySet> xFieldMaster;
+ if (FindFieldMaster(xFieldMaster, GetImport(), rHlp,
+ sName, eVarType))
+ {
+ // now we have a field master: process attributes!
+ Any aAny;
+
+ switch (eVarType)
+ {
+ case VarTypeSequence:
+ aAny <<= nNumLevel;
+ xFieldMaster->setPropertyValue(sPropertyNumberingLevel, aAny);
+
+ if (nNumLevel >= 0)
+ {
+ OUString sStr(&cSeparationChar, 1);
+ aAny <<= sStr;
+ xFieldMaster->setPropertyValue(
+ sPropertyNumberingSeparator, aAny);
+ }
+ break;
+ case VarTypeSimple:
+ {
+ // set string or non-string SubType (#93192#)
+ // The SubType was already set in the FindFieldMaster
+ // method, but it needs to be adjusted if it's a string.
+ aAny <<= aValueHelper.IsStringValue()
+ ? SetVariableType::STRING : SetVariableType::VAR;
+ xFieldMaster->setPropertyValue(sPropertySubType, aAny);
+ }
+ break;
+ case VarTypeUserField:
+ {
+ sal_Bool bTmp = !aValueHelper.IsStringValue();
+ aAny.setValue(&bTmp, ::getBooleanCppuType());
+ xFieldMaster->setPropertyValue(sPropertyIsExpression, aAny);
+ aValueHelper.PrepareField(xFieldMaster);
+ break;
+ }
+ default:
+ DBG_ERROR("unkown varfield type");
+ } // switch
+ } // else: no field master found/constructed
+ } // else: no sequence-decl
+}
+
+
+
+sal_Bool XMLVariableDeclImportContext::FindFieldMaster(
+ Reference<XPropertySet> & xMaster, SvXMLImport& rImport,
+ XMLTextImportHelper& rImportHelper,
+ const OUString& sVarName, enum VarType eVarType)
+{
+ static sal_Int32 nCollisionCount = 0;
+
+ // rename field
+ // currently: no family in use! Use 0.
+ OUString sName = rImportHelper.GetRenameMap().Get(
+ sal::static_int_cast< USHORT >(eVarType), sVarName);
+
+ // get text fields supplier and field masters
+ Reference<XTextFieldsSupplier> xTextFieldsSupp(rImport.GetModel(),
+ UNO_QUERY);
+ Reference<container::XNameAccess> xFieldMasterNameAccess(
+ xTextFieldsSupp->getTextFieldMasters(), UNO_QUERY);
+
+ OUStringBuffer sBuffer;
+ sBuffer.appendAscii(sAPI_fieldmaster_prefix);
+ sBuffer.appendAscii(sAPI_set_expression);
+ sBuffer.appendAscii(".");
+ sBuffer.append(sName);
+ OUString sVarServiceName = sBuffer.makeStringAndClear();
+
+ sBuffer.appendAscii(sAPI_fieldmaster_prefix);
+ sBuffer.appendAscii(sAPI_user);
+ sBuffer.appendAscii(".");
+ sBuffer.append(sName);
+ OUString sUserServiceName = sBuffer.makeStringAndClear();
+
+ if (xFieldMasterNameAccess->hasByName(sVarServiceName)) {
+ // variable field master already in document
+
+ Any aAny = xFieldMasterNameAccess->getByName(sVarServiceName);
+ aAny >>= xMaster;
+
+ aAny = xMaster->getPropertyValue(
+ // sPropertySubType
+ OUString::createFromAscii(sAPI_sub_type)
+ );
+ sal_Int16 nType = 0;
+ aAny >>= nType;
+
+ enum VarType eFMVarType =
+ (SetVariableType::SEQUENCE == nType) ?
+ VarTypeSequence : VarTypeSimple;
+
+ if (eFMVarType != eVarType)
+ {
+ OUString sNew;
+
+ // FIXME! cant find if name is taken already!!!!
+
+ nCollisionCount++;
+ OUStringBuffer aBuf;
+ aBuf.append(sName);
+ aBuf.appendAscii("_renamed_");
+ aBuf.append(nCollisionCount);
+ sNew = aBuf.makeStringAndClear();
+
+ rImportHelper.GetRenameMap().Add(
+ sal::static_int_cast< USHORT >(eVarType), sName, sNew);
+
+ // call FindFieldMaster recursively to create new master
+ return FindFieldMaster(xMaster, rImport, rImportHelper,
+ sNew, eVarType);
+ }
+ } else if (xFieldMasterNameAccess->hasByName(sUserServiceName)) {
+ // user field: get field master
+ Any aAny = xFieldMasterNameAccess->getByName(sUserServiceName);
+ aAny >>= xMaster;
+
+ if (VarTypeUserField != eVarType) {
+ // find new name that is not taken
+ OUString sNew;
+
+ // FIXME! cant find if name is taken already!!!!
+
+ nCollisionCount++;
+ OUStringBuffer aBuf;
+ aBuf.append(sName);
+ aBuf.appendAscii("_renamed_");
+ aBuf.append(nCollisionCount);
+ sNew = aBuf.makeStringAndClear();
+
+ rImportHelper.GetRenameMap().Add(
+ sal::static_int_cast< USHORT >(eVarType), sName, sNew);
+
+ // call FindFieldMaster recursively to create new master
+ return FindFieldMaster(xMaster, rImport, rImportHelper,
+ sNew, eVarType);
+ }
+ } else {
+ // field name not used: create field master
+
+ // import -> model is MultiServiceFactory -> createInstance
+ Reference<lang::XMultiServiceFactory>
+ xFactory(rImport.GetModel(),UNO_QUERY);
+ if( xFactory.is() ) {
+
+ OUStringBuffer sService;
+ sService.appendAscii(sAPI_fieldmaster_prefix);
+ sService.appendAscii((eVarType==VarTypeUserField) ?
+ sAPI_user : sAPI_set_expression);
+ Reference<XInterface> xIfc =
+ xFactory->createInstance( sService.makeStringAndClear() );
+ if (xIfc.is()) {
+ Reference<XPropertySet> xTmp( xIfc, UNO_QUERY );
+ xMaster = xTmp;
+
+ // set name
+ Any aAny;
+ aAny <<= sName;
+ xMaster->setPropertyValue(
+ // sPropertyName
+ OUString::createFromAscii(sAPI_name)
+ , aAny);
+
+ if (eVarType != VarTypeUserField) {
+ // set subtype for setexp field
+
+ aAny <<= ((eVarType == VarTypeSimple) ?
+ SetVariableType::VAR :
+ SetVariableType::SEQUENCE);
+ xMaster->setPropertyValue(
+ // sPropertySubType
+ OUString::createFromAscii(sAPI_sub_type)
+ , aAny);
+ } // else : user field: no subtype
+
+ } else {
+ return sal_False;
+ }
+ } else {
+ return sal_False;
+ }
+ }
+
+ DBG_ASSERT(xMaster.is(), "no field master found!?!");
+ return sal_True;
+}
+
+
+//
+// Database Display field import
+//
+
+
+TYPEINIT1( XMLDatabaseDisplayImportContext, XMLDatabaseFieldImportContext );
+
+XMLDatabaseDisplayImportContext::XMLDatabaseDisplayImportContext(
+ SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
+ const OUString& rLocalName) :
+ XMLDatabaseFieldImportContext(rImport, rHlp, sAPI_database,
+ nPrfx, rLocalName, false),
+ sPropertyColumnName(RTL_CONSTASCII_USTRINGPARAM(sAPI_data_column_name)),
+ sPropertyDatabaseFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_data_base_format)),
+ sPropertyCurrentPresentation(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)),
+ sPropertyIsVisible(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_visible)),
+ aValueHelper(rImport, rHlp, sal_False, sal_True, sal_False, sal_False),
+ bColumnOK(sal_False),
+ bDisplay( sal_True ),
+ bDisplayOK( sal_False )
+{
+}
+
+void XMLDatabaseDisplayImportContext::ProcessAttribute(
+ sal_uInt16 nAttrToken, const OUString& sAttrValue )
+{
+ switch (nAttrToken)
+ {
+ case XML_TOK_TEXTFIELD_COLUMN_NAME:
+ sColumnName = sAttrValue;
+ bColumnOK = sal_True;
+ break;
+ case XML_TOK_TEXTFIELD_DISPLAY:
+ {
+ sal_Bool bNone = IsXMLToken( sAttrValue, XML_NONE );
+ sal_Bool bValue = IsXMLToken( sAttrValue, XML_VALUE );
+ bDisplay = bValue;
+ bDisplayOK = bNone || bValue;
+ }
+ break;
+ case XML_TOK_TEXTFIELD_DATABASE_NAME:
+ case XML_TOK_TEXTFIELD_TABLE_NAME:
+ case XML_TOK_TEXTFIELD_TABLE_TYPE:
+ // handled by super class
+ XMLDatabaseFieldImportContext::ProcessAttribute(nAttrToken,
+ sAttrValue);
+ break;
+ default:
+ // remainder handled by value helper
+ aValueHelper.ProcessAttribute(nAttrToken, sAttrValue);
+ break;
+ }
+
+ bValid = bTableOK && bDatabaseOK && bColumnOK;
+}
+
+void XMLDatabaseDisplayImportContext::EndElement()
+{
+ // we have an EndElement of our own, because database fields need
+ // to be attached to a field master before they can be inserted into
+ // the document. Database stuff (database, table, column) all goes
+ // to the field master, value & style go to the field.
+
+ if (bValid)
+ {
+
+ // so here goes: we start with the master
+ Reference<XPropertySet> xMaster;
+
+ // create and prepare field master first
+ if (CreateField(xMaster,
+ OUString(RTL_CONSTASCII_USTRINGPARAM(
+ sAPI_fieldmaster_database))))
+ {
+ Any aAny;
+ aAny <<= sColumnName;
+ xMaster->setPropertyValue(sPropertyColumnName, aAny);
+
+ // fieldmaster takes database, table and column name
+ XMLDatabaseFieldImportContext::PrepareField(xMaster);
+
+ // create field
+ Reference<XPropertySet> xField;
+ if (CreateField(xField,
+ OUString(RTL_CONSTASCII_USTRINGPARAM(
+ sAPI_database))))
+ {
+ // attach field master
+ Reference<XDependentTextField> xDepField(xField, UNO_QUERY);
+ if (xDepField.is())
+ {
+ // attach field to field master
+ xDepField->attachTextFieldMaster(xMaster);
+
+ // attach field to document
+ Reference<XTextContent> xTextContent(xField, UNO_QUERY);
+ if (xTextContent.is())
+ {
+ // insert, set field properties and exit!
+ GetImportHelper().InsertTextContent(xTextContent);
+
+ // prepare field: format from database?
+ sal_Bool bTmp = !aValueHelper.IsFormatOK();
+ aAny.setValue( &bTmp, ::getBooleanCppuType() );
+ xField->setPropertyValue(sPropertyDatabaseFormat,aAny);
+
+ // value, value-type and format done by value helper
+ aValueHelper.PrepareField(xField);
+
+ // visibility
+ if( bDisplayOK )
+ {
+ aAny.setValue( &bDisplay, ::getBooleanCppuType() );
+ xField->setPropertyValue(sPropertyIsVisible, aAny);
+ }
+
+ // set presentation
+ aAny <<= GetContent();
+ xField->setPropertyValue(sPropertyCurrentPresentation,
+ aAny);
+
+ // success!
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ // above: exit on success; so for all error cases we end up here!
+ // write element content
+ GetImportHelper().InsertString(GetContent());
+}
+
+
+//
+// value import helper
+//
+
+enum ValueType
+{
+ XML_VALUE_TYPE_STRING,
+ XML_VALUE_TYPE_FLOAT,
+ XML_VALUE_TYPE_CURRENCY,
+ XML_VALUE_TYPE_PERCENTAGE,
+ XML_VALUE_TYPE_DATE,
+ XML_VALUE_TYPE_TIME,
+ XML_VALUE_TYPE_BOOLEAN
+};
+
+static SvXMLEnumMapEntry __READONLY_DATA aValueTypeMap[] =
+{
+ { XML_FLOAT, XML_VALUE_TYPE_FLOAT },
+ { XML_CURRENCY, XML_VALUE_TYPE_CURRENCY },
+ { XML_PERCENTAGE, XML_VALUE_TYPE_PERCENTAGE },
+ { XML_DATE, XML_VALUE_TYPE_DATE },
+ { XML_TIME, XML_VALUE_TYPE_TIME },
+ { XML_BOOLEAN, XML_VALUE_TYPE_BOOLEAN },
+ { XML_STRING, XML_VALUE_TYPE_STRING },
+ { XML_TOKEN_INVALID, 0 }
+};
+
+XMLValueImportHelper::XMLValueImportHelper(
+ SvXMLImport& rImprt,
+ XMLTextImportHelper& rHlp,
+ sal_Bool bType, sal_Bool bStyle, sal_Bool bValue, sal_Bool bFormula) :
+ sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)),
+ sPropertyValue(RTL_CONSTASCII_USTRINGPARAM(sAPI_value)),
+ sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_number_format)),
+ sPropertyIsFixedLanguage(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed_language)),
+
+ rImport(rImprt),
+ rHelper(rHlp),
+
+ fValue(0.0),
+ nFormatKey(0),
+ bIsDefaultLanguage(sal_True),
+
+ bStringType(sal_False),
+ bFormatOK(sal_False),
+ bTypeOK(sal_False),
+ bStringValueOK(sal_False),
+ bFloatValueOK(sal_False),
+ bFormulaOK(sal_False),
+
+ bSetType(bType),
+ bSetValue(bValue),
+ bSetStyle(bStyle),
+ bSetFormula(bFormula),
+
+ bStringDefault(sal_True),
+ bFormulaDefault(sal_True)
+{
+}
+
+XMLValueImportHelper::~XMLValueImportHelper()
+{
+}
+
+void XMLValueImportHelper::ProcessAttribute(
+ sal_uInt16 nAttrToken, const OUString& sAttrValue )
+{
+ switch (nAttrToken)
+ {
+ case XML_TOK_TEXTFIELD_VALUE_TYPE:
+ {
+ // convert enum
+ sal_uInt16 nTmp = 0;
+ sal_Bool bRet = SvXMLUnitConverter::convertEnum(
+ nTmp, sAttrValue, aValueTypeMap);
+
+ if (bRet) {
+ ValueType eValueType = (ValueType)nTmp;
+
+ bTypeOK = sal_True;
+
+ switch (eValueType)
+ {
+ case XML_VALUE_TYPE_STRING:
+ bStringType = sal_True;
+ break;
+ case XML_VALUE_TYPE_FLOAT:
+ case XML_VALUE_TYPE_CURRENCY:
+ case XML_VALUE_TYPE_PERCENTAGE:
+ case XML_VALUE_TYPE_DATE:
+ case XML_VALUE_TYPE_TIME:
+ case XML_VALUE_TYPE_BOOLEAN:
+ bStringType = sal_False;
+ break;
+
+ default:
+ DBG_ERROR("unknown value type");
+ bTypeOK = sal_False;
+ }
+ }
+ break;
+ }
+
+ case XML_TOK_TEXTFIELD_VALUE:
+ {
+ double fTmp;
+ sal_Bool bRet = SvXMLUnitConverter::convertDouble(fTmp,sAttrValue);
+ if (bRet) {
+ bFloatValueOK = sal_True;
+ fValue = fTmp;
+ }
+ break;
+ }
+
+ case XML_TOK_TEXTFIELD_TIME_VALUE:
+ {
+ double fTmp;
+ sal_Bool bRet = SvXMLUnitConverter::convertTime(fTmp,sAttrValue);
+ if (bRet) {
+ bFloatValueOK = sal_True;
+ fValue = fTmp;
+ }
+ break;
+ }
+
+ case XML_TOK_TEXTFIELD_DATE_VALUE:
+ {
+ double fTmp;
+ sal_Bool bRet = rImport.GetMM100UnitConverter().
+ convertDateTime(fTmp,sAttrValue);
+ if (bRet) {
+ bFloatValueOK = sal_True;
+ fValue = fTmp;
+ }
+ break;
+ }
+
+ case XML_TOK_TEXTFIELD_BOOL_VALUE:
+ {
+ sal_Bool bTmp;
+ sal_Bool bRet = SvXMLUnitConverter::convertBool(bTmp,sAttrValue);
+ if (bRet) {
+ bFloatValueOK = sal_True;
+ fValue = (bTmp ? 1.0 : 0.0);
+ }
+ else
+ {
+ double fTmp;
+ bRet = SvXMLUnitConverter::convertDouble(fTmp,sAttrValue);
+ if (bRet) {
+ bFloatValueOK = sal_True;
+ fValue = fTmp;
+ }
+ }
+ break;
+ }
+
+ case XML_TOK_TEXTFIELD_STRING_VALUE:
+ sValue = sAttrValue;
+ bStringValueOK = sal_True;
+ break;
+
+ case XML_TOK_TEXTFIELD_FORMULA:
+ {
+ OUString sTmp;
+ sal_uInt16 nPrefix = rImport.GetNamespaceMap().
+ _GetKeyByAttrName( sAttrValue, &sTmp, sal_False );
+ if( XML_NAMESPACE_OOOW == nPrefix )
+ {
+ sFormula = sTmp;
+ bFormulaOK = sal_True;
+ }
+ else
+ sFormula = sAttrValue;
+ }
+ break;
+
+ case XML_TOK_TEXTFIELD_DATA_STYLE_NAME:
+ {
+ sal_Int32 nKey = rHelper.GetDataStyleKey(
+ sAttrValue, &bIsDefaultLanguage);
+ if (-1 != nKey)
+ {
+ nFormatKey = nKey;
+ bFormatOK = sal_True;
+ }
+ break;
+ }
+ } // switch
+}
+
+void XMLValueImportHelper::PrepareField(
+ const Reference<XPropertySet> & xPropertySet)
+{
+ Any aAny;
+
+ if (bSetType)
+ {
+ // ??? how to set type?
+ }
+
+ if (bSetFormula)
+ {
+ aAny <<= (!bFormulaOK && bFormulaDefault) ? sDefault : sFormula;
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+ }
+
+ // format/style
+ if (bSetStyle && bFormatOK)
+ {
+ aAny <<= nFormatKey;
+ xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny);
+
+ if( xPropertySet->getPropertySetInfo()->
+ hasPropertyByName( sPropertyIsFixedLanguage ) )
+ {
+ sal_Bool bIsFixedLanguage = ! bIsDefaultLanguage;
+ aAny.setValue( &bIsFixedLanguage, ::getBooleanCppuType() );
+ xPropertySet->setPropertyValue( sPropertyIsFixedLanguage, aAny );
+ }
+ }
+
+ // value: string or float
+ if (bSetValue)
+ {
+ if (bStringType)
+ {
+ aAny <<= (!bStringValueOK && bStringDefault) ? sDefault : sValue;
+ xPropertySet->setPropertyValue(sPropertyContent, aAny);
+ }
+ else
+ {
+ aAny <<= fValue;
+ xPropertySet->setPropertyValue(sPropertyValue, aAny);
+ }
+ }
+}
+