diff options
Diffstat (limited to 'xmloff/source/text/txtfldi.cxx')
-rw-r--r-- | xmloff/source/text/txtfldi.cxx | 4129 |
1 files changed, 4129 insertions, 0 deletions
diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx new file mode 100644 index 000000000000..579ad91ddfe9 --- /dev/null +++ b/xmloff/source/text/txtfldi.cxx @@ -0,0 +1,4129 @@ +/************************************************************************* + * + * 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 + * + * Import of all text fields except those from txtvfldi.cxx + * (variable related text fields and database display fields) + */ +#include "txtfldi.hxx" +#include "txtvfldi.hxx" +#include <xmloff/xmlimp.hxx> +#include <xmloff/xmlnumi.hxx> +#include <xmloff/txtimp.hxx> +#include "xmlnmspe.hxx" +#include <xmloff/nmspmap.hxx> +#include <xmloff/xmltoken.hxx> +#include <xmloff/xmluconv.hxx> +#include <xmloff/xmlement.hxx> +#include "XMLStringBufferImportContext.hxx" +#include <xmloff/XMLEventsImportContext.hxx> +#include <com/sun/star/xml/sax/XAttributeList.hpp> +#include <com/sun/star/text/UserDataPart.hpp> +#include <com/sun/star/style/NumberingType.hpp> +#include <com/sun/star/text/PlaceholderType.hpp> +#include <com/sun/star/text/ReferenceFieldPart.hpp> +#include <com/sun/star/text/ReferenceFieldSource.hpp> +#include <com/sun/star/text/XTextField.hpp> +#include <com/sun/star/text/XTextContent.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/text/XTextFieldsSupplier.hpp> +#include <com/sun/star/text/XDependentTextField.hpp> +#include <com/sun/star/text/SetVariableType.hpp> +#include <com/sun/star/text/FilenameDisplayFormat.hpp> +#include <com/sun/star/text/ChapterFormat.hpp> +#include <com/sun/star/text/TemplateDisplayFormat.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/text/BibliographyDataType.hpp> +#include <com/sun/star/text/BibliographyDataField.hpp> +#include <com/sun/star/util/XUpdatable.hpp> +#include <com/sun/star/sdb/CommandType.hpp> + +#include <rtl/ustring.hxx> +#include <rtl/ustrbuf.hxx> +#include <rtl/math.hxx> +#include <tools/debug.hxx> + + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::util; +using namespace ::com::sun::star::xml::sax; +using namespace ::xmloff::token; + + +// +// SO API string constants +// + +// service prefix and service anems +const sal_Char sAPI_textfield_prefix[] = "com.sun.star.text.TextField."; +const sal_Char sAPI_fieldmaster_prefix[] = "com.sun.star.text.FieldMaster."; +const sal_Char sAPI_presentation_prefix[] = "com.sun.star.presentation.TextField."; + +const sal_Char sAPI_extended_user[] = "ExtendedUser"; +const sal_Char sAPI_user_data_type[] = "UserDataType"; +const sal_Char sAPI_jump_edit[] = "JumpEdit"; +const sal_Char sAPI_get_expression[] = "GetExpression"; +const sal_Char sAPI_set_expression[] = "SetExpression"; +const sal_Char sAPI_user[] = "User"; +const sal_Char sAPI_date_time[] = "DateTime"; +const sal_Char sAPI_page_number[] = "PageNumber"; +const sal_Char sAPI_database_next[] = "DatabaseNextSet"; +const sal_Char sAPI_database_select[] = "DatabaseNumberOfSet"; +const sal_Char sAPI_database_number[] = "DatabaseSetNumber"; +const sal_Char sAPI_database[] = "Database"; +const sal_Char sAPI_database_name[] = "DatabaseName"; +const sal_Char sAPI_docinfo_change_author[] = "DocInfo.ChangeAuthor"; +const sal_Char sAPI_docinfo_change_date_time[] = "DocInfo.ChangeDateTime"; +const sal_Char sAPI_docinfo_edit_time[] = "DocInfo.EditTime"; +const sal_Char sAPI_docinfo_description[] = "DocInfo.Description"; +const sal_Char sAPI_docinfo_create_author[] = "DocInfo.CreateAuthor"; +const sal_Char sAPI_docinfo_create_date_time[] = "DocInfo.CreateDateTime"; +const sal_Char sAPI_docinfo_custom[] = "DocInfo.Custom"; +const sal_Char sAPI_docinfo_print_author[] = "DocInfo.PrintAuthor"; +const sal_Char sAPI_docinfo_print_date_time[] = "DocInfo.PrintDateTime"; +const sal_Char sAPI_docinfo_keywords[] = "DocInfo.KeyWords"; +const sal_Char sAPI_docinfo_subject[] = "DocInfo.Subject"; +const sal_Char sAPI_docinfo_title[] = "DocInfo.Title"; +const sal_Char sAPI_docinfo_revision[] = "DocInfo.Revision"; +const sal_Char sAPI_hidden_paragraph[] = "HiddenParagraph"; +const sal_Char sAPI_hidden_text[] = "HiddenText"; +const sal_Char sAPI_conditional_text[] = "ConditionalText"; +const sal_Char sAPI_file_name[] = "FileName"; +const sal_Char sAPI_chapter[] = "Chapter"; +const sal_Char sAPI_template_name[] = "TemplateName"; +const sal_Char sAPI_page_count[] = "PageCount"; +const sal_Char sAPI_paragraph_count[] = "ParagraphCount"; +const sal_Char sAPI_word_count[] = "WordCount"; +const sal_Char sAPI_character_count[] = "CharacterCount"; +const sal_Char sAPI_table_count[] = "TableCount"; +const sal_Char sAPI_graphic_object_count[] = "GraphicObjectCount"; +const sal_Char sAPI_embedded_object_count[] = "EmbeddedObjectCount"; +const sal_Char sAPI_reference_page_set[] = "ReferencePageSet"; +const sal_Char sAPI_reference_page_get[] = "ReferencePageGet"; +const sal_Char sAPI_macro[] = "Macro"; +const sal_Char sAPI_dde[] = "DDE"; +const sal_Char sAPI_get_reference[] = "GetReference"; +const sal_Char sAPI_sheet_name[] = "SheetName"; +const sal_Char sAPI_url[] = "URL"; +const sal_Char sAPI_bibliography[] = "Bibliography"; +const sal_Char sAPI_annotation[] = "Annotation"; +const sal_Char sAPI_script[] = "Script"; +const sal_Char sAPI_measure[] = "Measure"; +const sal_Char sAPI_drop_down[] = "DropDown"; +const sal_Char sAPI_header[] = "Header"; +const sal_Char sAPI_footer[] = "Footer"; +const sal_Char sAPI_datetime[] = "DateTime"; + +// property names +const sal_Char sAPI_is_fixed[] = "IsFixed"; +const sal_Char sAPI_content[] = "Content"; +const sal_Char sAPI_value[] = "Value"; +const sal_Char sAPI_author[] = "Author"; +const sal_Char sAPI_full_name[] = "FullName"; +const sal_Char sAPI_place_holder_type[] = "PlaceHolderType"; +const sal_Char sAPI_place_holder[] = "PlaceHolder"; +const sal_Char sAPI_hint[] = "Hint"; +const sal_Char sAPI_variable_name[] = "VariableName"; +const sal_Char sAPI_name[] = "Name"; +const sal_Char sAPI_sub_type[] = "SubType"; +const sal_Char sAPI_numbering_separator[] = "NumberingSeparator"; +const sal_Char sAPI_chapter_numbering_level[] = "ChapterNumberingLevel"; +const sal_Char sAPI_variable_subtype[] = "VariableSubtype"; +const sal_Char sAPI_formula[] = "Formula"; +const sal_Char sAPI_date_time_value[] = "DateTimeValue"; +const sal_Char sAPI_number_format[] = "NumberFormat"; +const sal_Char sAPI_user_text[] = "UserText"; +const sal_Char sAPI_numbering_type[] = "NumberingType"; +const sal_Char sAPI_offset[] = "Offset"; +const sal_Char sAPI_data_base_name[] = "DataBaseName"; +const sal_Char sAPI_data_base_u_r_l[] = "DataBaseURL"; +const sal_Char sAPI_data_table_name[] = "DataTableName"; +const sal_Char sAPI_condition[] = "Condition"; +const sal_Char sAPI_set_number[] = "SetNumber"; +const sal_Char sAPI_is_data_base_format[] = "DataBaseFormat"; +const sal_Char sAPI_true_content[] = "TrueContent"; +const sal_Char sAPI_false_content[] = "FalseContent"; +const sal_Char sAPI_revision[] = "Revision"; +const sal_Char sAPI_file_format[] = "FileFormat"; +const sal_Char sAPI_chapter_format[] = "ChapterFormat"; +const sal_Char sAPI_level[] = "Level"; +const sal_Char sAPI_is_date[] = "IsDate"; +const sal_Char sAPI_adjust[] = "Adjust"; +const sal_Char sAPI_on[] = "On"; +const sal_Char sAPI_is_automatic_update[] = "IsAutomaticUpdate"; +const sal_Char sAPI_source_name[] = "SourceName"; +const sal_Char sAPI_current_presentation[] = "CurrentPresentation"; +const sal_Char sAPI_reference_field_part[] = "ReferenceFieldPart"; +const sal_Char sAPI_reference_field_source[] = "ReferenceFieldSource"; +const sal_Char sAPI_dde_command_type[] = "DDECommandType"; +const sal_Char sAPI_dde_command_file[] = "DDECommandFile"; +const sal_Char sAPI_dde_command_element[] = "DDECommandElement"; +// sAPI_url: also used as service name +const sal_Char sAPI_target_frame[] = "TargetFrame"; +const sal_Char sAPI_representation[] = "Representation"; +const sal_Char sAPI_date[] = "Date"; +const sal_Char sAPI_url_content[] = "URLContent"; +const sal_Char sAPI_script_type[] = "ScriptType"; +const sal_Char sAPI_is_hidden[] = "IsHidden"; +const sal_Char sAPI_is_condition_true[] = "IsConditionTrue"; +const sal_Char sAPI_data_command_type[] = "DataCommandType"; +const sal_Char sAPI_is_fixed_language[] = "IsFixedLanguage"; +const sal_Char sAPI_is_visible[] = "IsVisible"; +const sal_Char sAPI_TextRange[] = "TextRange"; + +const sal_Char sAPI_true[] = "TRUE"; + + +TYPEINIT1( XMLTextFieldImportContext, SvXMLImportContext); + +XMLTextFieldImportContext::XMLTextFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + const sal_Char* pService, + sal_uInt16 nPrefix, const OUString& rElementName) +: SvXMLImportContext( rImport, nPrefix, rElementName ) +, sIsFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)) +, rTextImportHelper(rHlp) +, sServicePrefix(RTL_CONSTASCII_USTRINGPARAM(sAPI_textfield_prefix)) +, bValid(sal_False) +{ + DBG_ASSERT(NULL != pService, "Need service name!"); + sServiceName = OUString::createFromAscii(pService); +} + +void XMLTextFieldImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) +{ + // process 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 ); + + ProcessAttribute(rTextImportHelper.GetTextFieldAttrTokenMap(). + Get(nPrefix, sLocalName), + xAttrList->getValueByIndex(i) ); + } +} + +XMLTextFieldImportContext::~XMLTextFieldImportContext() { +} + +OUString XMLTextFieldImportContext::GetContent() +{ + if (sContent.getLength()==0) + { + sContent = sContentBuffer.makeStringAndClear(); + } + + return sContent; +} + +void XMLTextFieldImportContext::EndElement() +{ + DBG_ASSERT(GetServiceName().getLength()>0, "no service name for element!"); + if (bValid) + { + + // create field/Service + Reference<XPropertySet> xPropSet; + if (CreateField(xPropSet, sServicePrefix + GetServiceName())) + { + // set field properties + PrepareField(xPropSet); + + // attach field to document + Reference<XTextContent> xTextContent(xPropSet, UNO_QUERY); + + // workaround for #80606# + try + { + rTextImportHelper.InsertTextContent(xTextContent); + } + catch (lang::IllegalArgumentException e) + { + // ignore + } + return; + } + } + + // in case of error: write element content + rTextImportHelper.InsertString(GetContent()); +} + +void XMLTextFieldImportContext::Characters(const OUString& rContent) +{ + sContentBuffer.append(rContent); +} + +sal_Bool XMLTextFieldImportContext::CreateField( + Reference<XPropertySet> & xField, + const OUString& rServiceName) +{ + // instantiate new XTextField: + // ask import for model, model is factory, ask factory to create service + + Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY); + if( xFactory.is() ) + { + Reference<XInterface> xIfc = xFactory->createInstance(rServiceName); + if( xIfc.is() ) + { + Reference<XPropertySet> xTmp( xIfc, UNO_QUERY ); + + xField = xTmp; + } else { + return sal_False; // can't create instance + } + } else { + return sal_False; // can't get MultiServiceFactory + } + + return sal_True; +} + +/// create the appropriate field context from +XMLTextFieldImportContext* +XMLTextFieldImportContext::CreateTextFieldImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrefix, + const OUString& rName, + sal_uInt16 nToken) +{ + XMLTextFieldImportContext* pContext = NULL; + + switch (nToken) + { + case XML_TOK_TEXT_SENDER_FIRSTNAME: + case XML_TOK_TEXT_SENDER_LASTNAME: + case XML_TOK_TEXT_SENDER_INITIALS: + case XML_TOK_TEXT_SENDER_TITLE: + case XML_TOK_TEXT_SENDER_POSITION: + case XML_TOK_TEXT_SENDER_EMAIL: + case XML_TOK_TEXT_SENDER_PHONE_PRIVATE: + case XML_TOK_TEXT_SENDER_FAX: + case XML_TOK_TEXT_SENDER_COMPANY: + case XML_TOK_TEXT_SENDER_PHONE_WORK: + case XML_TOK_TEXT_SENDER_STREET: + case XML_TOK_TEXT_SENDER_CITY: + case XML_TOK_TEXT_SENDER_POSTAL_CODE: + case XML_TOK_TEXT_SENDER_COUNTRY: + case XML_TOK_TEXT_SENDER_STATE_OR_PROVINCE: + pContext = + new XMLSenderFieldImportContext( rImport, rHlp, + nPrefix, rName, nToken ); + break; + + case XML_TOK_TEXT_AUTHOR_NAME: + case XML_TOK_TEXT_AUTHOR_INITIALS: + pContext = + new XMLAuthorFieldImportContext( rImport, rHlp, + nPrefix, rName, nToken ); + break; + + case XML_TOK_TEXT_PLACEHOLDER: + pContext = + new XMLPlaceholderFieldImportContext( rImport, rHlp, + nPrefix, rName); + break; + case XML_TOK_TEXT_SEQUENCE: + pContext = + new XMLSequenceFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_TEXT_INPUT: + pContext = + new XMLTextInputFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_EXPRESSION: + pContext = + new XMLExpressionFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_VARIABLE_SET: + pContext = + new XMLVariableSetFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_VARIABLE_INPUT: + pContext = + new XMLVariableInputFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_VARIABLE_GET: + pContext = + new XMLVariableGetFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_USER_FIELD_GET: + pContext = new XMLUserFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_USER_FIELD_INPUT: + pContext = new XMLUserFieldInputImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_TIME: + pContext = new XMLTimeFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_PAGE_CONTINUATION_STRING: + case XML_TOK_TEXT_PAGE_CONTINUATION: + pContext = new XMLPageContinuationImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_PAGE_NUMBER: + pContext = new XMLPageNumberImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_DATE: + pContext = new XMLDateFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_DATABASE_NAME: + pContext = new XMLDatabaseNameImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DATABASE_NEXT: + pContext = new XMLDatabaseNextImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DATABASE_SELECT: + pContext = new XMLDatabaseSelectImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DATABASE_ROW_NUMBER: + pContext = new XMLDatabaseNumberImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DATABASE_DISPLAY: + pContext = new XMLDatabaseDisplayImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_CONDITIONAL_TEXT: + pContext = new XMLConditionalTextImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_HIDDEN_TEXT: + pContext = new XMLHiddenTextImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_HIDDEN_PARAGRAPH: + pContext = new XMLHiddenParagraphImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DOCUMENT_DESCRIPTION: + case XML_TOK_TEXT_DOCUMENT_TITLE: + case XML_TOK_TEXT_DOCUMENT_SUBJECT: + case XML_TOK_TEXT_DOCUMENT_KEYWORDS: + pContext = new XMLSimpleDocInfoImportContext( rImport, rHlp, + nPrefix, rName, + nToken, sal_True, + sal_False ); + break; + case XML_TOK_TEXT_DOCUMENT_CREATION_AUTHOR: + case XML_TOK_TEXT_DOCUMENT_PRINT_AUTHOR: + case XML_TOK_TEXT_DOCUMENT_SAVE_AUTHOR: + pContext = new XMLSimpleDocInfoImportContext( rImport, rHlp, + nPrefix, rName, + nToken, sal_False, + sal_True ); + break; + + case XML_TOK_TEXT_DOCUMENT_CREATION_DATE: + case XML_TOK_TEXT_DOCUMENT_CREATION_TIME: + case XML_TOK_TEXT_DOCUMENT_PRINT_DATE: + case XML_TOK_TEXT_DOCUMENT_PRINT_TIME: + case XML_TOK_TEXT_DOCUMENT_SAVE_DATE: + case XML_TOK_TEXT_DOCUMENT_SAVE_TIME: + case XML_TOK_TEXT_DOCUMENT_EDIT_DURATION: + pContext = new XMLDateTimeDocInfoImportContext( rImport, rHlp, + nPrefix, rName, + nToken ); + break; + + case XML_TOK_TEXT_DOCUMENT_REVISION: + pContext = new XMLRevisionDocInfoImportContext( rImport, rHlp, + nPrefix, rName, + nToken ); + break; + + case XML_TOK_TEXT_DOCUMENT_USER_DEFINED: + pContext = new XMLUserDocInfoImportContext( rImport, rHlp, + nPrefix, rName, + nToken ); + break; + + case XML_TOK_TEXT_FILENAME: + pContext = new XMLFileNameImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_CHAPTER: + pContext = new XMLChapterImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_TEMPLATENAME: + pContext = new XMLTemplateNameImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_WORD_COUNT: + case XML_TOK_TEXT_PARAGRAPH_COUNT: + case XML_TOK_TEXT_TABLE_COUNT: + case XML_TOK_TEXT_CHARACTER_COUNT: + case XML_TOK_TEXT_IMAGE_COUNT: + case XML_TOK_TEXT_OBJECT_COUNT: + case XML_TOK_TEXT_PAGE_COUNT: + pContext = new XMLCountFieldImportContext( rImport, rHlp, + nPrefix, rName, nToken); + break; + + case XML_TOK_TEXT_GET_PAGE_VAR: + pContext = new XMLPageVarGetFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_SET_PAGE_VAR: + pContext = new XMLPageVarSetFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_MACRO: + pContext = new XMLMacroFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_DDE: + pContext = new XMLDdeFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_REFERENCE_REF: + case XML_TOK_TEXT_BOOKMARK_REF: + case XML_TOK_TEXT_NOTE_REF: + case XML_TOK_TEXT_SEQUENCE_REF: + pContext = new XMLReferenceFieldImportContext( rImport, rHlp, + nToken, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_SHEET_NAME: + pContext = new XMLSheetNameImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_BIBLIOGRAPHY_MARK: + pContext = new XMLBibliographyFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_ANNOTATION: + pContext = new XMLAnnotationImportContext( rImport, rHlp, + nPrefix, rName); + break; + + case XML_TOK_TEXT_SCRIPT: + pContext = new XMLScriptImportContext( rImport, rHlp, + nPrefix, rName); + break; + + case XML_TOK_TEXT_MEASURE: + pContext = new XMLMeasureFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + case XML_TOK_TEXT_TABLE_FORMULA: + pContext = new XMLTableFormulaImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_TEXT_DROPDOWN: + pContext = new XMLDropDownFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_DRAW_HEADER: + pContext = new XMLHeaderFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_DRAW_FOOTER: + pContext = new XMLFooterFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + case XML_TOK_DRAW_DATE_TIME: + pContext = new XMLDateTimeFieldImportContext( rImport, rHlp, + nPrefix, rName ); + break; + + default: + // ignore! May not even be a textfield. + // (Reminder: This method is called inside default:-branch) + pContext = NULL; + break; + } + + return pContext; +} + + +void XMLTextFieldImportContext::ForceUpdate( + const Reference<XPropertySet> & rPropertySet) +{ + // force update + Reference<XUpdatable> xUpdate(rPropertySet, UNO_QUERY); + if (xUpdate.is()) + { + xUpdate->update(); + } + else + { + DBG_ERROR("Expected XUpdatable support!"); + } +} + + + +// +// XMLSenderFieldImportContext +// + +TYPEINIT1( XMLSenderFieldImportContext, XMLTextFieldImportContext); + +XMLSenderFieldImportContext::XMLSenderFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName, + sal_uInt16 nToken) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_extended_user,nPrfx, sLocalName) +, sPropertyFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)) +, sPropertyFieldSubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_user_data_type)) +, sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)) +, bFixed(sal_True) +, nElementToken(nToken) +{ +} + +void XMLSenderFieldImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) +{ + bValid = sal_True; + switch (nElementToken) { + case XML_TOK_TEXT_SENDER_FIRSTNAME: + nSubType = UserDataPart::FIRSTNAME; + break; + case XML_TOK_TEXT_SENDER_LASTNAME: + nSubType = UserDataPart::NAME; + break; + case XML_TOK_TEXT_SENDER_INITIALS: + nSubType = UserDataPart::SHORTCUT; + break; + case XML_TOK_TEXT_SENDER_TITLE: + nSubType = UserDataPart::TITLE; + break; + case XML_TOK_TEXT_SENDER_POSITION: + nSubType = UserDataPart::POSITION; + break; + case XML_TOK_TEXT_SENDER_EMAIL: + nSubType = UserDataPart::EMAIL; + break; + case XML_TOK_TEXT_SENDER_PHONE_PRIVATE: + nSubType = UserDataPart::PHONE_PRIVATE; + break; + case XML_TOK_TEXT_SENDER_FAX: + nSubType = UserDataPart::FAX; + break; + case XML_TOK_TEXT_SENDER_COMPANY: + nSubType = UserDataPart::COMPANY; + break; + case XML_TOK_TEXT_SENDER_PHONE_WORK: + nSubType = UserDataPart::PHONE_COMPANY; + break; + case XML_TOK_TEXT_SENDER_STREET: + nSubType = UserDataPart::STREET; + break; + case XML_TOK_TEXT_SENDER_CITY: + nSubType = UserDataPart::CITY; + break; + case XML_TOK_TEXT_SENDER_POSTAL_CODE: + nSubType = UserDataPart::ZIP; + break; + case XML_TOK_TEXT_SENDER_COUNTRY: + nSubType = UserDataPart::COUNTRY; + break; + case XML_TOK_TEXT_SENDER_STATE_OR_PROVINCE: + nSubType = UserDataPart::STATE; + break; + default: + bValid = sal_False; + break; + } + + // process Attributes + XMLTextFieldImportContext::StartElement(xAttrList); +} + +void XMLSenderFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue) +{ + if (XML_TOK_TEXTFIELD_FIXED == nAttrToken) { + + // set bVal + sal_Bool bVal; + sal_Bool bRet = GetImport().GetMM100UnitConverter(). + convertBool(bVal, sAttrValue); + + // set bFixed if successfull + if (bRet) { + bFixed = bVal; + } + } +} + +void XMLSenderFieldImportContext::PrepareField( + const Reference<XPropertySet> & rPropSet) +{ + // set members + Any aAny; + aAny <<= nSubType; + rPropSet->setPropertyValue(sPropertyFieldSubType, aAny); + + // set fixed + aAny.setValue( &bFixed, ::getBooleanCppuType() ); + rPropSet->setPropertyValue(sPropertyFixed, aAny); + + // set content if fixed + if (bFixed) + { + // in organizer or styles-only mode: force update + if (GetImport().GetTextImport()->IsOrganizerMode() || + GetImport().GetTextImport()->IsStylesOnlyMode() ) + { + ForceUpdate(rPropSet); + } + else + { + aAny <<= GetContent(); + rPropSet->setPropertyValue(sPropertyContent, aAny); + } + } +} + + + +// +// XMLAuthorFieldImportContext +// + +TYPEINIT1( XMLAuthorFieldImportContext, XMLSenderFieldImportContext); + +XMLAuthorFieldImportContext::XMLAuthorFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName, + sal_uInt16 nToken) +: XMLSenderFieldImportContext(rImport, rHlp, nPrfx, sLocalName, nToken) +, bAuthorFullName(sal_True) +, sServiceAuthor(RTL_CONSTASCII_USTRINGPARAM(sAPI_author)) +, sPropertyAuthorFullName(RTL_CONSTASCII_USTRINGPARAM(sAPI_full_name)) +, sPropertyFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)) +, sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)) +{ + // overwrite service name from XMLSenderFieldImportContext + SetServiceName(sServiceAuthor); +} + +void XMLAuthorFieldImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) { + + bAuthorFullName = (XML_TOK_TEXT_AUTHOR_INITIALS != nElementToken); + bValid = sal_True; + + // process Attributes + XMLTextFieldImportContext::StartElement(xAttrList); +} + +void XMLAuthorFieldImportContext::PrepareField( + const Reference<XPropertySet> & rPropSet) +{ + // set members + Any aAny; + aAny.setValue( &bAuthorFullName, ::getBooleanCppuType() ); + rPropSet->setPropertyValue(sPropertyAuthorFullName, aAny); + + aAny.setValue( &bFixed, ::getBooleanCppuType() ); + rPropSet->setPropertyValue(sPropertyFixed, aAny); + + // set content if fixed + if (bFixed) + { + // organizer or styles-only mode: force update + if (GetImport().GetTextImport()->IsOrganizerMode() || + GetImport().GetTextImport()->IsStylesOnlyMode() ) + { + ForceUpdate(rPropSet); + } + else + { + aAny <<= GetContent(); + rPropSet->setPropertyValue(sPropertyContent, aAny); + } + } +} + + +// +// page continuation string +// + +TYPEINIT1( XMLPageContinuationImportContext, XMLTextFieldImportContext ); + +static SvXMLEnumMapEntry __READONLY_DATA lcl_aSelectPageAttrMap[] = +{ + { XML_PREVIOUS, PageNumberType_PREV }, + { XML_CURRENT, PageNumberType_CURRENT }, + { XML_NEXT, PageNumberType_NEXT }, + { XML_TOKEN_INVALID, 0 }, +}; + +XMLPageContinuationImportContext::XMLPageContinuationImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_page_number, nPrfx, sLocalName) +, sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type)) +, sPropertyUserText(RTL_CONSTASCII_USTRINGPARAM(sAPI_user_text)) +, sPropertyNumberingType(RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_type)) +, eSelectPage(PageNumberType_CURRENT) +, sStringOK(sal_False) +{ + bValid = sal_True; +} + +void XMLPageContinuationImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + switch(nAttrToken) + { + case XML_TOK_TEXTFIELD_SELECT_PAGE: + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum(nTmp, sAttrValue, + lcl_aSelectPageAttrMap) + && (PageNumberType_CURRENT != nTmp) ) + { + eSelectPage = (PageNumberType)nTmp; + } + break; + } + case XML_TOK_TEXTFIELD_STRING_VALUE: + sString = sAttrValue; + sStringOK = sal_True; + break; + } +} + +void XMLPageContinuationImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= eSelectPage; + xPropertySet->setPropertyValue(sPropertySubType, aAny); + + aAny <<= (sStringOK ? sString : GetContent()); + xPropertySet->setPropertyValue(sPropertyUserText, aAny); + + aAny <<= style::NumberingType::CHAR_SPECIAL; + xPropertySet->setPropertyValue(sPropertyNumberingType, aAny); +} + + + +// +// page number field +// + +TYPEINIT1( XMLPageNumberImportContext, XMLTextFieldImportContext ); + +XMLPageNumberImportContext::XMLPageNumberImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_page_number, nPrfx, sLocalName) +, sPropertySubType(RTL_CONSTASCII_USTRINGPARAM(sAPI_sub_type)) +, sPropertyNumberingType(RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_type)) +, sPropertyOffset(RTL_CONSTASCII_USTRINGPARAM(sAPI_offset)) +, sNumberSync(GetXMLToken(XML_FALSE)) +, nPageAdjust(0) +, eSelectPage(PageNumberType_CURRENT) +, sNumberFormatOK(sal_False) +{ + bValid = sal_True; +} + +void XMLPageNumberImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_NUM_FORMAT: + sNumberFormat = sAttrValue; + sNumberFormatOK = sal_True; + break; + case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC: + sNumberSync = sAttrValue; + break; + case XML_TOK_TEXTFIELD_SELECT_PAGE: + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum(nTmp, sAttrValue, + lcl_aSelectPageAttrMap)) + { + eSelectPage = (PageNumberType)nTmp; + } + break; + } + case XML_TOK_TEXTFIELD_PAGE_ADJUST: + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber(nTmp, sAttrValue)) + { + nPageAdjust = (sal_Int16)nTmp; + } + break; + } + } +} + +void XMLPageNumberImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + // all properties are optional + Reference<XPropertySetInfo> xPropertySetInfo( + xPropertySet->getPropertySetInfo()); + + if (xPropertySetInfo->hasPropertyByName(sPropertyNumberingType)) + { + sal_Int16 nNumType; + if( sNumberFormatOK ) + { + nNumType= style::NumberingType::ARABIC; + GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, + sNumberFormat, + sNumberSync ); + } + else + nNumType = style::NumberingType::PAGE_DESCRIPTOR; + + aAny <<= nNumType; + xPropertySet->setPropertyValue(sPropertyNumberingType, aAny); + } + + if (xPropertySetInfo->hasPropertyByName(sPropertyOffset)) + { + // adjust offset + switch (eSelectPage) + { + case PageNumberType_PREV: + nPageAdjust--; + break; + case PageNumberType_CURRENT: + break; + case PageNumberType_NEXT: + nPageAdjust++; + break; + default: + DBG_WARNING("unknown page number type"); + } + aAny <<= nPageAdjust; + xPropertySet->setPropertyValue(sPropertyOffset, aAny); + } + + if (xPropertySetInfo->hasPropertyByName(sPropertySubType)) + { + aAny <<= eSelectPage; + xPropertySet->setPropertyValue(sPropertySubType, aAny); + } +} + + + +// +// Placeholder +// + +TYPEINIT1( XMLPlaceholderFieldImportContext, XMLTextFieldImportContext); + +XMLPlaceholderFieldImportContext::XMLPlaceholderFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_jump_edit,nPrfx, sLocalName) +, sPropertyPlaceholderType(RTL_CONSTASCII_USTRINGPARAM(sAPI_place_holder_type)) +, sPropertyPlaceholder(RTL_CONSTASCII_USTRINGPARAM(sAPI_place_holder)) +, sPropertyHint(RTL_CONSTASCII_USTRINGPARAM(sAPI_hint)) +{ +} + +/// process attribute values +void XMLPlaceholderFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + switch (nAttrToken) { + case XML_TOK_TEXTFIELD_DESCRIPTION: + sDescription = sAttrValue; + break; + + case XML_TOK_TEXTFIELD_PLACEHOLDER_TYPE: + bValid = sal_True; + if (IsXMLToken(sAttrValue, XML_TABLE)) + { + nPlaceholderType = PlaceholderType::TABLE; + } + else if (IsXMLToken(sAttrValue, XML_TEXT)) + { + nPlaceholderType = PlaceholderType::TEXT; + } + else if (IsXMLToken(sAttrValue, XML_TEXT_BOX)) + { + nPlaceholderType = PlaceholderType::TEXTFRAME; + } + else if (IsXMLToken(sAttrValue, XML_IMAGE)) + { + nPlaceholderType = PlaceholderType::GRAPHIC; + } + else if (IsXMLToken(sAttrValue, XML_OBJECT)) + { + nPlaceholderType = PlaceholderType::OBJECT; + } + else + { + bValid = sal_False; + } + break; + + default: + ; // ignore + } +} + +void XMLPlaceholderFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) { + + Any aAny; + aAny <<= sDescription; + xPropertySet->setPropertyValue(sPropertyHint, aAny); + + // remove <...> around content (if present) + OUString aContent = GetContent(); + sal_Int32 nStart = 0; + sal_Int32 nLength = aContent.getLength(); + if ((nLength > 0) && (aContent.getStr()[0] == '<')) + { + --nLength; + ++nStart; + } + if ((nLength > 0) && (aContent.getStr()[aContent.getLength()-1] == '>')) + { + --nLength; + } + aAny <<= aContent.copy(nStart, nLength); + xPropertySet->setPropertyValue(sPropertyPlaceholder, aAny); + + aAny <<= nPlaceholderType; + xPropertySet->setPropertyValue(sPropertyPlaceholderType, aAny); +} + + +// +// time field +// + +TYPEINIT1( XMLTimeFieldImportContext, XMLTextFieldImportContext); + +XMLTimeFieldImportContext::XMLTimeFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_date_time, nPrfx, sLocalName) +, sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_number_format)) +, sPropertyFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)) +, sPropertyDateTimeValue(RTL_CONSTASCII_USTRINGPARAM(sAPI_date_time_value)) +, sPropertyDateTime(RTL_CONSTASCII_USTRINGPARAM(sAPI_date_time)) +, sPropertyAdjust(RTL_CONSTASCII_USTRINGPARAM(sAPI_adjust)) +, sPropertyIsDate(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_date)) +, sPropertyIsFixedLanguage(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed_language)) +, fTimeValue(0.0) +, nAdjust(0) +, nFormatKey(0) +, bTimeOK(sal_False) +, bFormatOK(sal_False) +, bFixed(sal_False) +, bIsDate(sal_False) +, bIsDefaultLanguage( sal_True ) +{ + bValid = sal_True; // always valid! +} + +void XMLTimeFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_TIME_VALUE: + { + double fTmp; + if (GetImport().GetMM100UnitConverter(). + convertDateTime(fTmp, sAttrValue)) + { + fTimeValue = fTmp; + bTimeOK = sal_True; + } + + if (GetImport().GetMM100UnitConverter(). + convertDateTime(aDateTimeValue, sAttrValue )) + { + bTimeOK = sal_True; + } + break; + } + case XML_TOK_TEXTFIELD_FIXED: + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bFixed = bTmp; + } + break; + } + case XML_TOK_TEXTFIELD_DATA_STYLE_NAME: + { + sal_Int32 nKey = GetImportHelper().GetDataStyleKey( + sAttrValue, &bIsDefaultLanguage); + if (-1 != nKey) + { + nFormatKey = nKey; + bFormatOK = sal_True; + } + break; + } + case XML_TOK_TEXTFIELD_TIME_ADJUST: + { + double fTmp; + + if (SvXMLUnitConverter::convertTime(fTmp, sAttrValue)) + { + // convert to minutes + nAdjust = (sal_Int32)::rtl::math::approxFloor(fTmp * 60 * 24); + } + break; + } + } +} + +void XMLTimeFieldImportContext::PrepareField( + const Reference<XPropertySet> & rPropertySet) +{ + Any aAny; + + // all properties are optional (except IsDate) + Reference<XPropertySetInfo> xPropertySetInfo( + rPropertySet->getPropertySetInfo()); + + if (xPropertySetInfo->hasPropertyByName(sPropertyFixed)) + { + aAny.setValue( &bFixed, ::getBooleanCppuType() ); + rPropertySet->setPropertyValue(sPropertyFixed, aAny); + } + + aAny.setValue( &bIsDate, ::getBooleanCppuType() ); + rPropertySet->setPropertyValue(sPropertyIsDate, aAny); + + if (xPropertySetInfo->hasPropertyByName(sPropertyAdjust)) + { + aAny <<= nAdjust; + rPropertySet->setPropertyValue(sPropertyAdjust, aAny); + } + + // set value + if (bFixed) + { + // organizer or styles-only mode: force update + if (GetImport().GetTextImport()->IsOrganizerMode() || + GetImport().GetTextImport()->IsStylesOnlyMode() ) + { + ForceUpdate(rPropertySet); + } + else + { + // normal mode: set value (if present) + if (bTimeOK) + { + if (xPropertySetInfo->hasPropertyByName(sPropertyDateTimeValue)) + { + aAny <<= aDateTimeValue; + rPropertySet->setPropertyValue(sPropertyDateTimeValue,aAny); + } + else if (xPropertySetInfo->hasPropertyByName(sPropertyDateTime)) + { + aAny <<= aDateTimeValue; + rPropertySet->setPropertyValue(sPropertyDateTime, aAny); + } + } + } + } + + if (bFormatOK && + xPropertySetInfo->hasPropertyByName(sPropertyNumberFormat)) + { + aAny <<= nFormatKey; + rPropertySet->setPropertyValue(sPropertyNumberFormat, aAny); + + if( xPropertySetInfo->hasPropertyByName( sPropertyIsFixedLanguage ) ) + { + sal_Bool bIsFixedLanguage = ! bIsDefaultLanguage; + aAny.setValue( &bIsFixedLanguage, ::getBooleanCppuType() ); + rPropertySet->setPropertyValue( sPropertyIsFixedLanguage, aAny ); + } + } +} + + + +// +// date field +// + +TYPEINIT1( XMLDateFieldImportContext, XMLTimeFieldImportContext ); + +XMLDateFieldImportContext::XMLDateFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTimeFieldImportContext(rImport, rHlp, nPrfx, sLocalName) +{ + bIsDate = sal_True; // always a date! +} + +void XMLDateFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DATE_VALUE: + { + double fTmp; + + if (GetImport().GetMM100UnitConverter(). + convertDateTime(fTmp, sAttrValue)) + { + // #96457#: don't truncate in order to read date+time + fTimeValue = fTmp; + bTimeOK = sal_True; + } + + if (GetImport().GetMM100UnitConverter(). + convertDateTime(aDateTimeValue, sAttrValue )) + { + bTimeOK = sal_True; + } + break; + } + case XML_TOK_TEXTFIELD_DATE_ADJUST: + // delegate to superclass, pretending it was a time-adjust attr. + XMLTimeFieldImportContext::ProcessAttribute( + XML_TOK_TEXTFIELD_TIME_ADJUST, + sAttrValue); + break; + case XML_TOK_TEXTFIELD_TIME_VALUE: + case XML_TOK_TEXTFIELD_TIME_ADJUST: + ; // ignore time-adjust and time-value attributes + break; + default: + // all others: delegate to super-class + XMLTimeFieldImportContext::ProcessAttribute(nAttrToken, + sAttrValue); + break; + } +} + + + + +// +// database field superclass +// + +TYPEINIT1( XMLDatabaseFieldImportContext, XMLTextFieldImportContext ); + +XMLDatabaseFieldImportContext::XMLDatabaseFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + const sal_Char* pServiceName, sal_uInt16 nPrfx, + const OUString& sLocalName, bool bUseDisply) +: XMLTextFieldImportContext(rImport, rHlp, pServiceName, nPrfx, sLocalName) +, sPropertyDataBaseName(RTL_CONSTASCII_USTRINGPARAM(sAPI_data_base_name)) +, sPropertyDataBaseURL(RTL_CONSTASCII_USTRINGPARAM(sAPI_data_base_u_r_l)) +, sPropertyTableName(RTL_CONSTASCII_USTRINGPARAM(sAPI_data_table_name)) +, sPropertyDataCommandType(RTL_CONSTASCII_USTRINGPARAM(sAPI_data_command_type)) +, sPropertyIsVisible(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_visible)) +, nCommandType( sdb::CommandType::TABLE ) +, bCommandTypeOK(sal_False) +, bDisplay( sal_True ) +, bDisplayOK( false ) +, bUseDisplay( bUseDisply ) +, bDatabaseOK(sal_False) +, bDatabaseNameOK(sal_False) +, bDatabaseURLOK(sal_False) +, bTableOK(sal_False) +{ +} + +void XMLDatabaseFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DATABASE_NAME: + sDatabaseName = sAttrValue; + bDatabaseOK = sal_True; + bDatabaseNameOK = sal_True; + break; + case XML_TOK_TEXTFIELD_TABLE_NAME: + sTableName = sAttrValue; + bTableOK = sal_True; + break; + case XML_TOK_TEXTFIELD_TABLE_TYPE: + if( IsXMLToken( sAttrValue, XML_TABLE ) ) + { + nCommandType = sdb::CommandType::TABLE; + bCommandTypeOK = sal_True; + } + else if( IsXMLToken( sAttrValue, XML_QUERY ) ) + { + nCommandType = sdb::CommandType::QUERY; + bCommandTypeOK = sal_True; + } + else if( IsXMLToken( sAttrValue, XML_COMMAND ) ) + { + nCommandType = sdb::CommandType::COMMAND; + bCommandTypeOK = sal_True; + } + break; + case XML_TOK_TEXTFIELD_DISPLAY: + if( IsXMLToken( sAttrValue, XML_NONE ) ) + { + bDisplay = sal_False; + bDisplayOK = true; + } + else if( IsXMLToken( sAttrValue, XML_VALUE ) ) + { + bDisplay = sal_True; + bDisplayOK = true; + } + break; + } +} + +SvXMLImportContext* XMLDatabaseFieldImportContext::CreateChildContext( + sal_uInt16 p_nPrefix, + const OUString& rLocalName, + const Reference<XAttributeList>& xAttrList ) +{ + if( ( p_nPrefix == XML_NAMESPACE_FORM ) && + IsXMLToken( rLocalName, XML_CONNECTION_RESOURCE ) ) + { + // process attribute list directly + sal_Int16 nLength = xAttrList->getLength(); + for( sal_Int16 n = 0; n < nLength; n++ ) + { + OUString sLocalName; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). + GetKeyByAttrName( xAttrList->getNameByIndex(n), &sLocalName ); + + if( ( nPrefix == XML_NAMESPACE_XLINK ) && + IsXMLToken( sLocalName, XML_HREF ) ) + { + sDatabaseURL = xAttrList->getValueByIndex(n); + bDatabaseOK = sal_True; + bDatabaseURLOK = sal_True; + } + } + + // we call ProcessAttribute in order to set bValid appropriatly + ProcessAttribute( XML_TOKEN_INVALID, OUString() ); + } + + return SvXMLImportContext::CreateChildContext(p_nPrefix, rLocalName, + xAttrList); +} + + +void XMLDatabaseFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= sTableName; + xPropertySet->setPropertyValue(sPropertyTableName, aAny); + + if( bDatabaseNameOK ) + { + aAny <<= sDatabaseName; + xPropertySet->setPropertyValue(sPropertyDataBaseName, aAny); + } + else if( bDatabaseURLOK ) + { + aAny <<= sDatabaseURL; + xPropertySet->setPropertyValue(sPropertyDataBaseURL, aAny); + } + + // #99980# load/save command type for all fields; also load + // old documents without command type + if( bCommandTypeOK ) + { + aAny <<= nCommandType; + xPropertySet->setPropertyValue( sPropertyDataCommandType, aAny ); + } + + if( bUseDisplay && bDisplayOK ) + { + aAny.setValue( &bDisplay, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue( sPropertyIsVisible, aAny ); + } +} + + + +// +// database name field +// + +TYPEINIT1( XMLDatabaseNameImportContext, XMLDatabaseFieldImportContext ); + +XMLDatabaseNameImportContext::XMLDatabaseNameImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLDatabaseFieldImportContext(rImport, rHlp, sAPI_database_name, + nPrfx, sLocalName, true) +{ +} + +void XMLDatabaseNameImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + // delegate to superclass and check for success + XMLDatabaseFieldImportContext::ProcessAttribute(nAttrToken, sAttrValue); + bValid = bDatabaseOK && bTableOK; +} + + + +// +// database next field +// + +TYPEINIT1( XMLDatabaseNextImportContext, XMLDatabaseFieldImportContext ); + +XMLDatabaseNextImportContext::XMLDatabaseNextImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + const sal_Char* pServiceName, sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLDatabaseFieldImportContext(rImport, rHlp, pServiceName, + nPrfx, sLocalName, false), + sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_condition)), + sTrue(RTL_CONSTASCII_USTRINGPARAM(sAPI_true)), + sCondition(), + bConditionOK(sal_False) +{ +} + +XMLDatabaseNextImportContext::XMLDatabaseNextImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) +: XMLDatabaseFieldImportContext(rImport, rHlp, sAPI_database_next, nPrfx, sLocalName, false) +, sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_condition)) +, sTrue(RTL_CONSTASCII_USTRINGPARAM(sAPI_true)) +, bConditionOK(sal_False) +{ +} + +void XMLDatabaseNextImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, const OUString& sAttrValue ) +{ + if (XML_TOK_TEXTFIELD_CONDITION == nAttrToken) + { + OUString sTmp; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap()._GetKeyByAttrName( + sAttrValue, &sTmp, sal_False ); + if( XML_NAMESPACE_OOOW == nPrefix ) + { + sCondition = sTmp; + bConditionOK = sal_True; + } + else + sCondition = sAttrValue; + } + else + { + XMLDatabaseFieldImportContext::ProcessAttribute(nAttrToken, + sAttrValue); + } + + bValid = bDatabaseOK && bTableOK; +} + +void XMLDatabaseNextImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= bConditionOK ? sCondition : sTrue; + xPropertySet->setPropertyValue(sPropertyCondition, aAny); + + XMLDatabaseFieldImportContext::PrepareField(xPropertySet); +} + + + +// +// database select field +// + +TYPEINIT1( XMLDatabaseSelectImportContext, XMLDatabaseNextImportContext ); + +XMLDatabaseSelectImportContext::XMLDatabaseSelectImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const ::rtl::OUString& sLocalName) : + XMLDatabaseNextImportContext(rImport, rHlp, sAPI_database_select, + nPrfx, sLocalName), + sPropertySetNumber(RTL_CONSTASCII_USTRINGPARAM(sAPI_set_number)), + nNumber(0), + bNumberOK(sal_False) +{ +} + +void XMLDatabaseSelectImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + if (XML_TOK_TEXTFIELD_ROW_NUMBER == nAttrToken) + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber( nTmp, sAttrValue + /* , nMin, nMax ??? */ )) + { + nNumber = nTmp; + bNumberOK = sal_True; + } + } + else + { + XMLDatabaseNextImportContext::ProcessAttribute(nAttrToken, sAttrValue); + } + + bValid = bTableOK && bDatabaseOK && bNumberOK; +} + +void XMLDatabaseSelectImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= nNumber; + xPropertySet->setPropertyValue(sPropertySetNumber, aAny); + + XMLDatabaseNextImportContext::PrepareField(xPropertySet); +} + + + +// +// database display row number field +// + +TYPEINIT1( XMLDatabaseNumberImportContext, XMLDatabaseFieldImportContext ); + +XMLDatabaseNumberImportContext::XMLDatabaseNumberImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLDatabaseFieldImportContext(rImport, rHlp, sAPI_database_number, + nPrfx, sLocalName, true), + sPropertyNumberingType( + RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_type)), + sPropertySetNumber(RTL_CONSTASCII_USTRINGPARAM(sAPI_set_number)), + sNumberFormat(RTL_CONSTASCII_USTRINGPARAM("1")), + sNumberSync(GetXMLToken(XML_FALSE)), + nValue(0), + bValueOK(sal_False) +{ +} + +void XMLDatabaseNumberImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_NUM_FORMAT: + sNumberFormat = sAttrValue; + break; + case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC: + sNumberSync = sAttrValue; + break; + case XML_TOK_TEXTFIELD_VALUE: + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber( nTmp, sAttrValue )) + { + nValue = nTmp; + bValueOK = sal_True; + } + break; + } + default: + XMLDatabaseFieldImportContext::ProcessAttribute(nAttrToken, + sAttrValue); + break; + } + + bValid = bTableOK && bDatabaseOK; +} + +void XMLDatabaseNumberImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + sal_Int16 nNumType = style::NumberingType::ARABIC; + GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, + sNumberFormat, + sNumberSync ); + aAny <<= nNumType; + xPropertySet->setPropertyValue(sPropertyNumberingType, aAny); + + if (bValueOK) + { + aAny <<= nValue; + xPropertySet->setPropertyValue(sPropertySetNumber, aAny); + } + + XMLDatabaseFieldImportContext::PrepareField(xPropertySet); +} + + + +// +// Simple doc info fields +// + +TYPEINIT1( XMLSimpleDocInfoImportContext, XMLTextFieldImportContext ); + +XMLSimpleDocInfoImportContext::XMLSimpleDocInfoImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName, sal_uInt16 nToken, + sal_Bool bContent, sal_Bool bAuthor) +: XMLTextFieldImportContext(rImport, rHlp, MapTokenToServiceName(nToken),nPrfx, sLocalName) +, sPropertyFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)) +, sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)) +, sPropertyAuthor(RTL_CONSTASCII_USTRINGPARAM(sAPI_author)) +, sPropertyCurrentPresentation(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)) +, bFixed(sal_False) +, bHasAuthor(bAuthor) +, bHasContent(bContent) +{ + bValid = sal_True; +} + +void XMLSimpleDocInfoImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + if (XML_TOK_TEXTFIELD_FIXED == nAttrToken) + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bFixed = bTmp; + } + } +} + +void XMLSimpleDocInfoImportContext::PrepareField( + const Reference<XPropertySet> & rPropertySet) +{ + // title field in Calc has no Fixed property + Reference<XPropertySetInfo> xPropertySetInfo(rPropertySet->getPropertySetInfo()); + if (xPropertySetInfo->hasPropertyByName(sPropertyFixed)) + { + Any aAny; + aAny.setValue(&bFixed, ::getBooleanCppuType() ); + rPropertySet->setPropertyValue(sPropertyFixed, aAny); + + // set Content and CurrentPresentation (if fixed) + if (bFixed) + { + // in organizer-mode or styles-only-mode, only force update + if (GetImport().GetTextImport()->IsOrganizerMode() || + GetImport().GetTextImport()->IsStylesOnlyMode() ) + { + ForceUpdate(rPropertySet); + } + else + { + // set content (author, if that's the name) and current + // presentation + aAny <<= GetContent(); + + if (bFixed && bHasAuthor) + { + rPropertySet->setPropertyValue(sPropertyAuthor, aAny); + } + + if (bFixed && bHasContent) + { + rPropertySet->setPropertyValue(sPropertyContent, aAny); + } + + rPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny); + } + } + } +} + +const sal_Char* XMLSimpleDocInfoImportContext::MapTokenToServiceName( + sal_uInt16 nToken) +{ + const sal_Char* pServiceName = NULL; + + switch(nToken) + { + case XML_TOK_TEXT_DOCUMENT_CREATION_AUTHOR: + pServiceName = sAPI_docinfo_create_author; + break; + case XML_TOK_TEXT_DOCUMENT_CREATION_DATE: + pServiceName = sAPI_docinfo_create_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_CREATION_TIME: + pServiceName = sAPI_docinfo_create_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_DESCRIPTION: + pServiceName = sAPI_docinfo_description; + break; + case XML_TOK_TEXT_DOCUMENT_EDIT_DURATION: + pServiceName = sAPI_docinfo_edit_time; + break; + case XML_TOK_TEXT_DOCUMENT_USER_DEFINED: + pServiceName = sAPI_docinfo_custom; + break; + case XML_TOK_TEXT_DOCUMENT_PRINT_AUTHOR: + pServiceName = sAPI_docinfo_print_author; + break; + case XML_TOK_TEXT_DOCUMENT_PRINT_DATE: + pServiceName = sAPI_docinfo_print_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_PRINT_TIME: + pServiceName = sAPI_docinfo_print_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_KEYWORDS: + pServiceName = sAPI_docinfo_keywords; + break; + case XML_TOK_TEXT_DOCUMENT_SUBJECT: + pServiceName = sAPI_docinfo_subject; + break; + case XML_TOK_TEXT_DOCUMENT_REVISION: + pServiceName = sAPI_docinfo_revision; + break; + case XML_TOK_TEXT_DOCUMENT_SAVE_AUTHOR: + pServiceName = sAPI_docinfo_change_author; + break; + case XML_TOK_TEXT_DOCUMENT_SAVE_DATE: + pServiceName = sAPI_docinfo_change_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_SAVE_TIME: + pServiceName = sAPI_docinfo_change_date_time; + break; + case XML_TOK_TEXT_DOCUMENT_TITLE: + pServiceName = sAPI_docinfo_title; + break; + + default: + DBG_ERROR("no docinfo field token"); + pServiceName = NULL; + break; + } + + return pServiceName; +} + + +// +// revision field +// + +TYPEINIT1( XMLRevisionDocInfoImportContext, XMLSimpleDocInfoImportContext ); + +XMLRevisionDocInfoImportContext::XMLRevisionDocInfoImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName, sal_uInt16 nToken) : + XMLSimpleDocInfoImportContext(rImport, rHlp, nPrfx, sLocalName, + nToken, sal_False, sal_False), + sPropertyRevision(RTL_CONSTASCII_USTRINGPARAM(sAPI_revision)) +{ + bValid = sal_True; +} + +void XMLRevisionDocInfoImportContext::PrepareField( + const Reference<XPropertySet> & rPropertySet) +{ + XMLSimpleDocInfoImportContext::PrepareField(rPropertySet); + + // set revision number + // if fixed, if not in organizer-mode, if not in styles-only-mode + if (bFixed) + { + if ( GetImport().GetTextImport()->IsOrganizerMode() || + GetImport().GetTextImport()->IsStylesOnlyMode() ) + { + ForceUpdate(rPropertySet); + } + else + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber(nTmp, GetContent())) + { + Any aAny; + aAny <<= nTmp; + rPropertySet->setPropertyValue(sPropertyRevision, aAny); + } + } + } +} + + + +// +// DocInfo fields with date/time attributes +// + +TYPEINIT1( XMLDateTimeDocInfoImportContext, XMLSimpleDocInfoImportContext ); + +XMLDateTimeDocInfoImportContext::XMLDateTimeDocInfoImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName, sal_uInt16 nToken) +: XMLSimpleDocInfoImportContext(rImport, rHlp, nPrfx, sLocalName,nToken, sal_False, sal_False) +, sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_number_format)) +, sPropertyIsDate(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_date)) +, sPropertyIsFixedLanguage(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed_language)) +, nFormat(0) +, bFormatOK(sal_False) +, bIsDefaultLanguage(sal_True) +{ + // we allow processing of EDIT_DURATION here, because import of actual + // is not supported anyway. If it was, we'd need an extra import class + // because times and time durations are presented differently! + + bValid = sal_True; + switch (nToken) + { + case XML_TOK_TEXT_DOCUMENT_CREATION_DATE: + case XML_TOK_TEXT_DOCUMENT_PRINT_DATE: + case XML_TOK_TEXT_DOCUMENT_SAVE_DATE: + bIsDate = sal_True; + bHasDateTime = sal_True; + break; + case XML_TOK_TEXT_DOCUMENT_CREATION_TIME: + case XML_TOK_TEXT_DOCUMENT_PRINT_TIME: + case XML_TOK_TEXT_DOCUMENT_SAVE_TIME: + bIsDate = sal_False; + bHasDateTime = sal_True; + break; + case XML_TOK_TEXT_DOCUMENT_EDIT_DURATION: + bIsDate = sal_False; + bHasDateTime = sal_False; + break; + default: + DBG_ERROR( + "XMLDateTimeDocInfoImportContext needs date/time doc. fields"); + bValid = sal_False; + break; + } +} + +void XMLDateTimeDocInfoImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DATA_STYLE_NAME: + { + sal_Int32 nKey = GetImportHelper().GetDataStyleKey( + sAttrValue, &bIsDefaultLanguage); + if (-1 != nKey) + { + nFormat = nKey; + bFormatOK = sal_True; + } + break; + } + case XML_TOK_TEXTFIELD_FIXED: + XMLSimpleDocInfoImportContext::ProcessAttribute(nAttrToken, + sAttrValue); + break; + default: + // ignore -> we can't set date/time value anyway! + break; + } +} + +void XMLDateTimeDocInfoImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + // process fixed and presentation + XMLSimpleDocInfoImportContext::PrepareField(xPropertySet); + + Any aAny; + + if (bHasDateTime) + { + aAny.setValue( &bIsDate, ::getBooleanCppuType()); + xPropertySet->setPropertyValue(sPropertyIsDate, aAny); + } + + if (bFormatOK) + { + aAny <<= nFormat; + xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny); + + if( xPropertySet->getPropertySetInfo()-> + hasPropertyByName( sPropertyIsFixedLanguage ) ) + { + sal_Bool bIsFixedLanguage = ! bIsDefaultLanguage; + aAny.setValue( &bIsFixedLanguage, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue( sPropertyIsFixedLanguage, aAny ); + } + } + + // can't set date/time/duration value! Sorry. +} + + +// +// user defined docinfo fields +// + +TYPEINIT1( XMLUserDocInfoImportContext, XMLSimpleDocInfoImportContext ); + +XMLUserDocInfoImportContext::XMLUserDocInfoImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName, sal_uInt16 nToken) : + XMLSimpleDocInfoImportContext(rImport, rHlp, nPrfx, + sLocalName, nToken, + sal_False, sal_False) + , sPropertyName(RTL_CONSTASCII_USTRINGPARAM(sAPI_name)) + , sPropertyNumberFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_number_format)) + , sPropertyIsFixedLanguage(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed_language)) + , nFormat(0) + , bFormatOK(sal_False) + , bIsDefaultLanguage( sal_True ) +{ + bValid = sal_False; +} + +void XMLUserDocInfoImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DATA_STYLE_NAME: + { + sal_Int32 nKey = GetImportHelper().GetDataStyleKey( + sAttrValue, &bIsDefaultLanguage); + if (-1 != nKey) + { + nFormat = nKey; + bFormatOK = sal_True; + } + break; + } + case XML_TOK_TEXTFIELD_NAME: + { + if (!bValid) + { + SetServiceName(OUString::createFromAscii( sAPI_docinfo_custom ) ); + aName = sAttrValue; + bValid = sal_True; + } + break; + } + + default: + XMLSimpleDocInfoImportContext::ProcessAttribute(nAttrToken, + sAttrValue); + break; + } +} + +void XMLUserDocInfoImportContext::PrepareField( + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet> & xPropertySet) +{ + uno::Any aAny; + if ( aName.getLength() ) + { + aAny <<= aName; + xPropertySet->setPropertyValue(sPropertyName, aAny); + } + Reference<XPropertySetInfo> xPropertySetInfo( + xPropertySet->getPropertySetInfo()); + if (bFormatOK && + xPropertySetInfo->hasPropertyByName(sPropertyNumberFormat)) + { + aAny <<= nFormat; + xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny); + + if( xPropertySetInfo->hasPropertyByName( sPropertyIsFixedLanguage ) ) + { + sal_Bool bIsFixedLanguage = ! bIsDefaultLanguage; + aAny.setValue( &bIsFixedLanguage, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue( sPropertyIsFixedLanguage, aAny ); + } + } + + // call superclass to handle "fixed" + XMLSimpleDocInfoImportContext::PrepareField(xPropertySet); +} + + +// +// import hidden paragraph fields +// + +TYPEINIT1( XMLHiddenParagraphImportContext, XMLTextFieldImportContext ); + +XMLHiddenParagraphImportContext::XMLHiddenParagraphImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_hidden_paragraph, + nPrfx, sLocalName), + sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_condition)), + sPropertyIsHidden(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_hidden)), + sCondition(), + bIsHidden(sal_False) +{ +} + +void XMLHiddenParagraphImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + if (XML_TOK_TEXTFIELD_CONDITION == nAttrToken) + { + OUString sTmp; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap()._GetKeyByAttrName( + sAttrValue, &sTmp, sal_False ); + if( XML_NAMESPACE_OOOW == nPrefix ) + { + sCondition = sTmp; + bValid = sal_True; + } + else + sCondition = sAttrValue; + } + else if (XML_TOK_TEXTFIELD_IS_HIDDEN == nAttrToken) + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bIsHidden = bTmp; + } + } +} + +void XMLHiddenParagraphImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + aAny <<= sCondition; + xPropertySet->setPropertyValue(sPropertyCondition, aAny); + + aAny.setValue( &bIsHidden, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue(sPropertyIsHidden, aAny); +} + + + +// +// import conditional text (<text:conditional-text>) +// + +TYPEINIT1( XMLConditionalTextImportContext, XMLTextFieldImportContext ); + +XMLConditionalTextImportContext::XMLConditionalTextImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_conditional_text, + nPrfx, sLocalName), + sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_condition)), + sPropertyTrueContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_true_content)), + sPropertyFalseContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_false_content)), + sPropertyIsConditionTrue(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_condition_true)), + sPropertyCurrentPresentation(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)), + bConditionOK(sal_False), + bTrueOK(sal_False), + bFalseOK(sal_False), + bCurrentValue(sal_False) +{ +} + +void XMLConditionalTextImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_CONDITION: + { + OUString sTmp; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). + _GetKeyByAttrName( sAttrValue, &sTmp, sal_False ); + if( XML_NAMESPACE_OOOW == nPrefix ) + { + sCondition = sTmp; + bConditionOK = sal_True; + } + else + sCondition = sAttrValue; + } + break; + case XML_TOK_TEXTFIELD_STRING_VALUE_IF_FALSE: + sFalseContent = sAttrValue; + bFalseOK = sal_True; + break; + case XML_TOK_TEXTFIELD_STRING_VALUE_IF_TRUE: + sTrueContent = sAttrValue; + bTrueOK = sal_True; + break; + case XML_TOK_TEXTFIELD_CURRENT_VALUE: + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bCurrentValue = bTmp; + } + break; + } + } + + bValid = bConditionOK && bFalseOK && bTrueOK; +} + +void XMLConditionalTextImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= sCondition; + xPropertySet->setPropertyValue(sPropertyCondition, aAny); + + aAny <<= sFalseContent; + xPropertySet->setPropertyValue(sPropertyFalseContent, aAny); + + aAny <<= sTrueContent; + xPropertySet->setPropertyValue(sPropertyTrueContent, aAny); + + aAny.setValue( &bCurrentValue, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue(sPropertyIsConditionTrue, aAny); + + aAny <<= GetContent(); + xPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny); +} + + + +// +// hidden text +// + +TYPEINIT1( XMLHiddenTextImportContext, XMLTextFieldImportContext); + +XMLHiddenTextImportContext::XMLHiddenTextImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_hidden_text, + nPrfx, sLocalName), + sPropertyCondition(RTL_CONSTASCII_USTRINGPARAM(sAPI_condition)), + sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)), + sPropertyIsHidden(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_hidden)), + bConditionOK(sal_False), + bStringOK(sal_False), + bIsHidden(sal_False) +{ +} + +void XMLHiddenTextImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_CONDITION: + { + OUString sTmp; + sal_uInt16 nPrefix = GetImport().GetNamespaceMap(). + _GetKeyByAttrName( sAttrValue, &sTmp, sal_False ); + if( XML_NAMESPACE_OOOW == nPrefix ) + { + sCondition = sTmp; + bConditionOK = sal_True; + } + else + sCondition = sAttrValue; + } + break; + case XML_TOK_TEXTFIELD_STRING_VALUE: + sString = sAttrValue; + bStringOK = sal_True; + break; + case XML_TOK_TEXTFIELD_IS_HIDDEN: + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bIsHidden = bTmp; + } + break; + } + } + + bValid = bConditionOK && bStringOK; +} + +void XMLHiddenTextImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= sCondition; + xPropertySet->setPropertyValue(sPropertyCondition, aAny); + + aAny <<= sString; + xPropertySet->setPropertyValue(sPropertyContent, aAny); + + aAny.setValue( &bIsHidden, ::getBooleanCppuType() ); + xPropertySet->setPropertyValue(sPropertyIsHidden, aAny); +} + + + +// +// file name fields +// + +TYPEINIT1( XMLFileNameImportContext, XMLTextFieldImportContext ); + +static const SvXMLEnumMapEntry aFilenameDisplayMap[] = +{ + { XML_PATH, FilenameDisplayFormat::PATH }, + { XML_NAME, FilenameDisplayFormat::NAME }, + { XML_NAME_AND_EXTENSION, FilenameDisplayFormat::NAME_AND_EXT }, + { XML_FULL, FilenameDisplayFormat::FULL }, + { XML_TOKEN_INVALID, 0 } +}; + +XMLFileNameImportContext::XMLFileNameImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_file_name, + nPrfx, sLocalName), + sPropertyFixed(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_fixed)), + sPropertyFileFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_file_format)), + sPropertyCurrentPresentation( + RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)), + nFormat(FilenameDisplayFormat::FULL), + bFixed(sal_False) +{ + bValid = sal_True; +} + +void XMLFileNameImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_FIXED: + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bFixed = bTmp; + } + break; + } + case XML_TOK_TEXTFIELD_DISPLAY: + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum(nTmp, sAttrValue, + aFilenameDisplayMap)) + { + nFormat = (sal_uInt16)nTmp; + } + break; + } + default: + ; // unkown attribute: ignore + break; + } +} + +void XMLFileNameImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + // properties are optional + Reference<XPropertySetInfo> xPropertySetInfo( + xPropertySet->getPropertySetInfo()); + + if (xPropertySetInfo->hasPropertyByName(sPropertyFixed)) + { + aAny <<= bFixed; + xPropertySet->setPropertyValue(sPropertyFixed, aAny); + } + + if (xPropertySetInfo->hasPropertyByName(sPropertyFileFormat)) + { + aAny <<= nFormat; + xPropertySet->setPropertyValue(sPropertyFileFormat, aAny); + } + + if (xPropertySetInfo->hasPropertyByName(sPropertyCurrentPresentation)) + { + aAny <<= GetContent(); + xPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny); + } +} + + +// +// template name field +// + +static const SvXMLEnumMapEntry aTemplateDisplayMap[] = +{ + { XML_FULL, TemplateDisplayFormat::FULL }, + { XML_PATH, TemplateDisplayFormat::PATH }, + { XML_NAME, TemplateDisplayFormat::NAME }, + { XML_NAME_AND_EXTENSION, TemplateDisplayFormat::NAME_AND_EXT }, + { XML_AREA, TemplateDisplayFormat::AREA }, + { XML_TITLE, TemplateDisplayFormat::TITLE }, + { XML_TOKEN_INVALID, 0 } +}; + +TYPEINIT1( XMLTemplateNameImportContext, XMLTextFieldImportContext ); + +XMLTemplateNameImportContext::XMLTemplateNameImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_template_name, + nPrfx, sLocalName), + sPropertyFileFormat(RTL_CONSTASCII_USTRINGPARAM(sAPI_file_format)), + nFormat(TemplateDisplayFormat::FULL) +{ + bValid = sal_True; +} + +void XMLTemplateNameImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DISPLAY: + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum(nTmp, sAttrValue, + aTemplateDisplayMap)) + { + nFormat = (sal_uInt16)nTmp; + } + break; + } + default: + ; // unknown attribute: ignore + break; + } +} + +void XMLTemplateNameImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= nFormat; + xPropertySet->setPropertyValue(sPropertyFileFormat, aAny); +} + + +// +// import chapter fields +// + +TYPEINIT1( XMLChapterImportContext, XMLTextFieldImportContext ); + +static const SvXMLEnumMapEntry aChapterDisplayMap[] = +{ + { XML_NAME, ChapterFormat::NAME }, + { XML_NUMBER, ChapterFormat::NUMBER }, + { XML_NUMBER_AND_NAME, ChapterFormat::NAME_NUMBER }, + { XML_PLAIN_NUMBER_AND_NAME, ChapterFormat::NO_PREFIX_SUFFIX }, + { XML_PLAIN_NUMBER, ChapterFormat::DIGIT }, + { XML_TOKEN_INVALID, 0 } +}; + +XMLChapterImportContext::XMLChapterImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_chapter, + nPrfx, sLocalName), + sPropertyChapterFormat( + RTL_CONSTASCII_USTRINGPARAM(sAPI_chapter_format)), + sPropertyLevel(RTL_CONSTASCII_USTRINGPARAM(sAPI_level)), + nFormat(ChapterFormat::NAME_NUMBER), + nLevel(0) +{ + bValid = sal_True; +} + +void XMLChapterImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DISPLAY: + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum(nTmp, sAttrValue, + aChapterDisplayMap)) + { + nFormat = (sal_Int16)nTmp; + } + break; + } + case XML_TOK_TEXTFIELD_OUTLINE_LEVEL: + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber( + nTmp, sAttrValue, 1, + GetImport().GetTextImport()->GetChapterNumbering()->getCount() + )) + { + // API numbers 0..9, we number 1..10 + nLevel = (sal_Int8)nTmp; + nLevel--; + } + break; + } + default: + ; // unknown attribute: ignore + break; + } +} + +void XMLChapterImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= nFormat; + xPropertySet->setPropertyValue(sPropertyChapterFormat, aAny); + + aAny <<= nLevel; + xPropertySet->setPropertyValue(sPropertyLevel, aAny); +} + + +// +// counting fields +// + +TYPEINIT1( XMLCountFieldImportContext, XMLTextFieldImportContext ); + +XMLCountFieldImportContext::XMLCountFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName, sal_uInt16 nToken) : + XMLTextFieldImportContext(rImport, rHlp, MapTokenToServiceName(nToken), + nPrfx, sLocalName), + sPropertyNumberingType( + RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_type)), + sNumberFormat(), + sLetterSync(), + bNumberFormatOK(sal_False) +{ + bValid = sal_True; +} + +void XMLCountFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_NUM_FORMAT: + sNumberFormat = sAttrValue; + bNumberFormatOK = sal_True; + break; + case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC: + sLetterSync = sAttrValue; + break; + } +} + +void XMLCountFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + // properties optional + // (only page count, but do for all to save common implementation) + + if (xPropertySet->getPropertySetInfo()-> + hasPropertyByName(sPropertyNumberingType)) + { + sal_Int16 nNumType; + if( bNumberFormatOK ) + { + nNumType= style::NumberingType::ARABIC; + GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, + sNumberFormat, + sLetterSync ); + } + else + nNumType = style::NumberingType::PAGE_DESCRIPTOR; + aAny <<= nNumType; + xPropertySet->setPropertyValue(sPropertyNumberingType, aAny); + } +} + +const sal_Char* XMLCountFieldImportContext::MapTokenToServiceName( + sal_uInt16 nToken) +{ + const sal_Char* pServiceName = NULL; + + switch (nToken) + { + case XML_TOK_TEXT_WORD_COUNT: + pServiceName = sAPI_word_count; + break; + case XML_TOK_TEXT_PARAGRAPH_COUNT: + pServiceName = sAPI_paragraph_count; + break; + case XML_TOK_TEXT_TABLE_COUNT: + pServiceName = sAPI_table_count; + break; + case XML_TOK_TEXT_CHARACTER_COUNT: + pServiceName = sAPI_character_count; + break; + case XML_TOK_TEXT_IMAGE_COUNT: + pServiceName = sAPI_graphic_object_count; + break; + case XML_TOK_TEXT_OBJECT_COUNT: + pServiceName = sAPI_embedded_object_count; + break; + case XML_TOK_TEXT_PAGE_COUNT: + pServiceName = sAPI_page_count; + break; + default: + pServiceName = NULL; + DBG_ERROR("unknown count field!"); + break; + } + + return pServiceName; +} + + + +// +// page variable import +// + +TYPEINIT1( XMLPageVarGetFieldImportContext, XMLTextFieldImportContext ); + +XMLPageVarGetFieldImportContext::XMLPageVarGetFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_reference_page_get, + nPrfx, sLocalName), + sPropertyNumberingType( + RTL_CONSTASCII_USTRINGPARAM(sAPI_numbering_type)), + sNumberFormat(), + sLetterSync(), + bNumberFormatOK(sal_False) +{ + bValid = sal_True; +} + +void XMLPageVarGetFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_NUM_FORMAT: + sNumberFormat = sAttrValue; + bNumberFormatOK = sal_True; + break; + case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC: + sLetterSync = sAttrValue; + break; + } +} + +void XMLPageVarGetFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + sal_Int16 nNumType; + if( bNumberFormatOK ) + { + nNumType= style::NumberingType::ARABIC; + GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, + sNumberFormat, + sLetterSync ); + } + else + nNumType = style::NumberingType::PAGE_DESCRIPTOR; + aAny <<= nNumType; + xPropertySet->setPropertyValue(sPropertyNumberingType, aAny); + + // display old content (#96657#) + aAny <<= GetContent(); + xPropertySet->setPropertyValue( + OUString(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)), + aAny ); +} + + + +// +// page variable set fields +// + +TYPEINIT1(XMLPageVarSetFieldImportContext, XMLTextFieldImportContext); + +XMLPageVarSetFieldImportContext::XMLPageVarSetFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_reference_page_set, + nPrfx, sLocalName), + sPropertyOn(RTL_CONSTASCII_USTRINGPARAM(sAPI_on)), + sPropertyOffset(RTL_CONSTASCII_USTRINGPARAM(sAPI_offset)), + nAdjust(0), + bActive(sal_True) +{ + bValid = sal_True; +} + +void XMLPageVarSetFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_ACTIVE: + { + sal_Bool bTmp; + if (SvXMLUnitConverter::convertBool(bTmp, sAttrValue)) + { + bActive = bTmp; + } + } + case XML_TOK_TEXTFIELD_PAGE_ADJUST: + { + sal_Int32 nTmp; + if (SvXMLUnitConverter::convertNumber(nTmp, sAttrValue)) + { + nAdjust = (sal_Int16)nTmp; + } + } + } +} + +void XMLPageVarSetFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny.setValue(&bActive, ::getBooleanCppuType()); + xPropertySet->setPropertyValue(sPropertyOn, aAny); + + aAny <<= nAdjust; + xPropertySet->setPropertyValue(sPropertyOffset, aAny); +} + + + +// +// macro fields +// + +TYPEINIT1( XMLMacroFieldImportContext, XMLTextFieldImportContext ); + +XMLMacroFieldImportContext::XMLMacroFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_macro, + nPrfx, sLocalName), + sPropertyHint(RTL_CONSTASCII_USTRINGPARAM(sAPI_hint)), + sPropertyMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName")), + sPropertyScriptURL(RTL_CONSTASCII_USTRINGPARAM("ScriptURL")), + bDescriptionOK(sal_False) +{ +} + +SvXMLImportContext* XMLMacroFieldImportContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const Reference<XAttributeList> & xAttrList ) +{ + SvXMLImportContext* pContext = NULL; + + if ( (nPrefix == XML_NAMESPACE_OFFICE) && + IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) ) + { + // create events context and remember it! + pContext = new XMLEventsImportContext( + GetImport(), nPrefix, rLocalName ); + xEventContext = pContext; + bValid = sal_True; + } + else + pContext = SvXMLImportContext::CreateChildContext( + nPrefix, rLocalName, xAttrList); + + return pContext; +} + + +void XMLMacroFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_DESCRIPTION: + sDescription = sAttrValue; + bDescriptionOK = sal_True; + break; + case XML_TOK_TEXTFIELD_NAME: + sMacro = sAttrValue; + bValid = sal_True; + break; + } +} + +void XMLMacroFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + OUString sOnClick(RTL_CONSTASCII_USTRINGPARAM("OnClick")); + OUString sPropertyMacroLibrary(RTL_CONSTASCII_USTRINGPARAM("MacroLibrary")); + + aAny <<= (bDescriptionOK ? sDescription : GetContent()); + xPropertySet->setPropertyValue(sPropertyHint, aAny); + + // if we have an events child element, we'll look for the OnClick + // event if not, it may be an old (pre-638i) document. Then, we'll + // have to look at the name attribute. + OUString sMacroName; + OUString sLibraryName; + OUString sScriptURL; + + if ( xEventContext.Is() ) + { + // get event sequence + XMLEventsImportContext* pEvents = + (XMLEventsImportContext*)&xEventContext; + Sequence<PropertyValue> aValues; + pEvents->GetEventSequence( sOnClick, aValues ); + + sal_Int32 nLength = aValues.getLength(); + for( sal_Int32 i = 0; i < nLength; i++ ) + { + if ( aValues[i].Name.equalsAsciiL( "ScriptType", + sizeof("ScriptType")-1 ) ) + { + // ignore ScriptType + } + else if ( aValues[i].Name.equalsAsciiL( "Library", + sizeof("Library")-1 ) ) + { + aValues[i].Value >>= sLibraryName; + } + else if ( aValues[i].Name.equalsAsciiL( "MacroName", + sizeof("MacroName")-1 ) ) + { + aValues[i].Value >>= sMacroName; + } + if ( aValues[i].Name.equalsAsciiL( "Script", + sizeof("Script")-1 ) ) + { + aValues[i].Value >>= sScriptURL; + } + } + } + else + { + // disassemble old-style macro-name: Everything before the + // third-last dot is the library + sal_Int32 nPos = sMacro.getLength() + 1; // the loop starts with nPos-- + const sal_Unicode* pBuf = sMacro.getStr(); + for( sal_Int32 i = 0; (i < 3) && (nPos > 0); i++ ) + { + nPos--; + while ( (pBuf[nPos] != '.') && (nPos > 0) ) + nPos--; + } + + if (nPos > 0) + { + sLibraryName = sMacro.copy(0, nPos); + sMacroName = sMacro.copy(nPos+1); + } + else + sMacroName = sMacro; + } + + aAny <<= sScriptURL; + xPropertySet->setPropertyValue(sPropertyScriptURL, aAny); + + aAny <<= sMacroName; + xPropertySet->setPropertyValue(sPropertyMacroName, aAny); + + aAny <<= sLibraryName; + xPropertySet->setPropertyValue(sPropertyMacroLibrary, aAny); +} + + + +// +// reference field import +// + +TYPEINIT1( XMLReferenceFieldImportContext, XMLTextFieldImportContext ); + +XMLReferenceFieldImportContext::XMLReferenceFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nToken, sal_uInt16 nPrfx, const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_get_reference, nPrfx, sLocalName) +, sPropertyReferenceFieldPart(RTL_CONSTASCII_USTRINGPARAM(sAPI_reference_field_part)) +, sPropertyReferenceFieldSource(RTL_CONSTASCII_USTRINGPARAM(sAPI_reference_field_source)) +, sPropertySourceName(RTL_CONSTASCII_USTRINGPARAM(sAPI_source_name)) +, sPropertyCurrentPresentation(RTL_CONSTASCII_USTRINGPARAM(sAPI_current_presentation)) +, nElementToken(nToken) +, nType(ReferenceFieldPart::PAGE_DESC) +, bNameOK(sal_False) +, bTypeOK(sal_False) +, bSeqNumberOK(sal_False) +{ +} + +static SvXMLEnumMapEntry __READONLY_DATA lcl_aReferenceTypeTokenMap[] = +{ + { XML_PAGE, ReferenceFieldPart::PAGE}, + { XML_CHAPTER, ReferenceFieldPart::CHAPTER }, + { XML_TEXT, ReferenceFieldPart::TEXT }, + { XML_DIRECTION, ReferenceFieldPart::UP_DOWN }, + { XML_CATEGORY_AND_VALUE, ReferenceFieldPart::CATEGORY_AND_NUMBER }, + { XML_CAPTION, ReferenceFieldPart::ONLY_CAPTION }, + { XML_VALUE, ReferenceFieldPart::ONLY_SEQUENCE_NUMBER }, + // --> OD 2007-09-14 #i81002# + { XML_NUMBER, ReferenceFieldPart::NUMBER }, + { XML_NUMBER_NO_SUPERIOR, ReferenceFieldPart::NUMBER_NO_CONTEXT }, + { XML_NUMBER_ALL_SUPERIOR, ReferenceFieldPart::NUMBER_FULL_CONTEXT }, + // <-- + { XML_TOKEN_INVALID, 0 } +}; + +void XMLReferenceFieldImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) +{ + bTypeOK = sal_True; + switch (nElementToken) + { + case XML_TOK_TEXT_REFERENCE_REF: + nSource = ReferenceFieldSource::REFERENCE_MARK; + break; + case XML_TOK_TEXT_BOOKMARK_REF: + nSource = ReferenceFieldSource::BOOKMARK; + break; + case XML_TOK_TEXT_NOTE_REF: + nSource = ReferenceFieldSource::FOOTNOTE; + break; + case XML_TOK_TEXT_SEQUENCE_REF: + nSource = ReferenceFieldSource::SEQUENCE_FIELD; + break; + default: + bTypeOK = sal_False; + DBG_ERROR("unknown reference field"); + break; + } + + XMLTextFieldImportContext::StartElement(xAttrList); +} + + +void XMLReferenceFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_NOTE_CLASS: + if( IsXMLToken( sAttrValue, XML_ENDNOTE ) ) + nSource = ReferenceFieldSource::ENDNOTE; + break; + case XML_TOK_TEXTFIELD_REF_NAME: + sName = sAttrValue; + bNameOK = sal_True; + break; + case XML_TOK_TEXTFIELD_REFERENCE_FORMAT: + { + sal_uInt16 nToken; + if (SvXMLUnitConverter::convertEnum(nToken, sAttrValue, + lcl_aReferenceTypeTokenMap)) + { + nType = nToken; + } + + // check for sequence-only-attributes + if ( (XML_TOK_TEXT_SEQUENCE_REF != nElementToken) && + ( (nType == ReferenceFieldPart::CATEGORY_AND_NUMBER) || + (nType == ReferenceFieldPart::ONLY_CAPTION) || + (nType == ReferenceFieldPart::ONLY_SEQUENCE_NUMBER) ) ) + { + nType = ReferenceFieldPart::PAGE_DESC; + } + + break; + } + } + + // bValid: we need proper element type and name + bValid = bTypeOK && bNameOK; +} + +void XMLReferenceFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= nType; + xPropertySet->setPropertyValue(sPropertyReferenceFieldPart, aAny); + + aAny <<= nSource; + xPropertySet->setPropertyValue(sPropertyReferenceFieldSource, aAny); + + switch (nElementToken) + { + case XML_TOK_TEXT_REFERENCE_REF: + case XML_TOK_TEXT_BOOKMARK_REF: + aAny <<= sName; + xPropertySet->setPropertyValue(sPropertySourceName, aAny); + break; + + case XML_TOK_TEXT_NOTE_REF: + GetImportHelper().ProcessFootnoteReference(sName, xPropertySet); + break; + + case XML_TOK_TEXT_SEQUENCE_REF: + GetImportHelper().ProcessSequenceReference(sName, xPropertySet); + break; + } + + aAny <<= GetContent(); + xPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny); +} + + + +// +// field declarations container +// + +enum DdeFieldDeclAttrs +{ + XML_TOK_DDEFIELD_NAME, + XML_TOK_DDEFIELD_APPLICATION, + XML_TOK_DDEFIELD_TOPIC, + XML_TOK_DDEFIELD_ITEM, + XML_TOK_DDEFIELD_UPDATE +}; + +static __FAR_DATA SvXMLTokenMapEntry aDdeDeclAttrTokenMap[] = +{ + { XML_NAMESPACE_OFFICE, XML_NAME, XML_TOK_DDEFIELD_NAME }, + { XML_NAMESPACE_OFFICE, XML_DDE_APPLICATION, XML_TOK_DDEFIELD_APPLICATION }, + { XML_NAMESPACE_OFFICE, XML_DDE_TOPIC, XML_TOK_DDEFIELD_TOPIC }, + { XML_NAMESPACE_OFFICE, XML_DDE_ITEM, XML_TOK_DDEFIELD_ITEM }, + { XML_NAMESPACE_OFFICE, XML_AUTOMATIC_UPDATE, XML_TOK_DDEFIELD_UPDATE }, + XML_TOKEN_MAP_END +}; + +TYPEINIT1( XMLDdeFieldDeclsImportContext, SvXMLImportContext ); + +XMLDdeFieldDeclsImportContext::XMLDdeFieldDeclsImportContext( + SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& sLocalName) : + SvXMLImportContext(rImport, nPrfx, sLocalName), + aTokenMap(aDdeDeclAttrTokenMap) +{ +} + +SvXMLImportContext * XMLDdeFieldDeclsImportContext::CreateChildContext( + sal_uInt16 nPrefix, + const OUString& rLocalName, + const Reference<XAttributeList> & xAttrList ) +{ + if ( (XML_NAMESPACE_TEXT == nPrefix) && + (IsXMLToken(rLocalName, XML_DDE_CONNECTION_DECL)) ) + { + return new XMLDdeFieldDeclImportContext(GetImport(), nPrefix, + rLocalName, aTokenMap); + } + else + { + return SvXMLImportContext::CreateChildContext(nPrefix, + rLocalName, + xAttrList); + } +} + + + +// +// import dde field declaration +// + +TYPEINIT1( XMLDdeFieldDeclImportContext, SvXMLImportContext ); + +XMLDdeFieldDeclImportContext::XMLDdeFieldDeclImportContext( + SvXMLImport& rImport, sal_uInt16 nPrfx, + const OUString& sLocalName, const SvXMLTokenMap& rMap) +: SvXMLImportContext(rImport, nPrfx, sLocalName) +, sPropertyIsAutomaticUpdate(RTL_CONSTASCII_USTRINGPARAM(sAPI_is_automatic_update)) +, sPropertyName(RTL_CONSTASCII_USTRINGPARAM(sAPI_name)) +, sPropertyDDECommandType(RTL_CONSTASCII_USTRINGPARAM(sAPI_dde_command_type)) +, sPropertyDDECommandFile(RTL_CONSTASCII_USTRINGPARAM(sAPI_dde_command_file)) +, sPropertyDDECommandElement(RTL_CONSTASCII_USTRINGPARAM(sAPI_dde_command_element)) +, rTokenMap(rMap) +{ + DBG_ASSERT(XML_NAMESPACE_TEXT == nPrfx, "wrong prefix"); + DBG_ASSERT(IsXMLToken(sLocalName, XML_DDE_CONNECTION_DECL), "wrong name"); +} + +void XMLDdeFieldDeclImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) +{ + OUString sName; + OUString sCommandApplication; + OUString sCommandTopic; + OUString sCommandItem; + + sal_Bool bUpdate = sal_False; + sal_Bool bNameOK = sal_False; + sal_Bool bCommandApplicationOK = sal_False; + sal_Bool bCommandTopicOK = sal_False; + sal_Bool bCommandItemOK = sal_False; + + // process 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 ); + + switch (rTokenMap.Get(nPrefix, sLocalName)) + { + case XML_TOK_DDEFIELD_NAME: + sName = xAttrList->getValueByIndex(i); + bNameOK = sal_True; + break; + case XML_TOK_DDEFIELD_APPLICATION: + sCommandApplication = xAttrList->getValueByIndex(i); + bCommandApplicationOK = sal_True; + break; + case XML_TOK_DDEFIELD_TOPIC: + sCommandTopic = xAttrList->getValueByIndex(i); + bCommandTopicOK = sal_True; + break; + case XML_TOK_DDEFIELD_ITEM: + sCommandItem = xAttrList->getValueByIndex(i); + bCommandItemOK = sal_True; + break; + case XML_TOK_DDEFIELD_UPDATE: + { + sal_Bool bTmp; + if ( SvXMLUnitConverter::convertBool( + bTmp, xAttrList->getValueByIndex(i)) ) + { + bUpdate = bTmp; + } + break; + } + } + } + + // valid data? + if (bNameOK && bCommandApplicationOK && bCommandTopicOK && bCommandItemOK) + { + // make service name + OUStringBuffer sBuf; + sBuf.appendAscii(sAPI_fieldmaster_prefix); + sBuf.appendAscii(sAPI_dde); + + // create DDE TextFieldMaster + Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(), + UNO_QUERY); + if( xFactory.is() ) + { + /* #i6432# There might be multiple occurances of one DDE + declaration if it is used in more than one of + header/footer/body. createInstance will throw an exception if we + try to create the second, third, etc. instance of such a + declaration. Thus we ignore the exception. Otherwise this will + lead to an unloadable document. */ + try + { + Reference<XInterface> xIfc = + xFactory->createInstance(sBuf.makeStringAndClear()); + if( xIfc.is() ) + { + Reference<XPropertySet> xPropSet( xIfc, UNO_QUERY ); + if (xPropSet.is() && + xPropSet->getPropertySetInfo()->hasPropertyByName( + sPropertyDDECommandType)) + { + Any aAny; + + aAny <<= sName; + xPropSet->setPropertyValue(sPropertyName, aAny); + + aAny <<= sCommandApplication; + xPropSet->setPropertyValue(sPropertyDDECommandType, aAny); + + aAny <<= sCommandTopic; + xPropSet->setPropertyValue(sPropertyDDECommandFile, aAny); + + aAny <<= sCommandItem; + xPropSet->setPropertyValue(sPropertyDDECommandElement, + aAny); + + aAny.setValue(&bUpdate, ::getBooleanCppuType()); + xPropSet->setPropertyValue(sPropertyIsAutomaticUpdate, + aAny); + } + // else: ignore (can't get XPropertySet, or DDE + // properties are not supported) + } + // else: ignore + } + catch ( const Exception& ) + { + //ignore + } + } + // else: ignore + } + // else: ignore +} + + + +// +// DDE field import +// + +TYPEINIT1( XMLDdeFieldImportContext, XMLTextFieldImportContext ); + +XMLDdeFieldImportContext::XMLDdeFieldImportContext( + SvXMLImport& rImport, XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_dde, + nPrfx, sLocalName), + sName() + ,sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)) +{ +} + +void XMLDdeFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + if (XML_TOK_TEXTFIELD_CONNECTION_NAME == nAttrToken) + { + sName = sAttrValue; + bValid = sal_True; + } +} + +void XMLDdeFieldImportContext::EndElement() +{ + if (bValid) + { + // find master + OUStringBuffer sBuf; + sBuf.appendAscii(sAPI_fieldmaster_prefix); + sBuf.appendAscii(sAPI_dde); + sBuf.append(sal_Unicode('.')); + sBuf.append(sName); + OUString sMasterName = sBuf.makeStringAndClear(); + + Reference<XTextFieldsSupplier> xTextFieldsSupp(GetImport().GetModel(), + UNO_QUERY); + Reference<container::XNameAccess> xFieldMasterNameAccess( + xTextFieldsSupp->getTextFieldMasters(), UNO_QUERY); + + if (xFieldMasterNameAccess->hasByName(sMasterName)) + { + Reference<XPropertySet> xMaster; + Any aAny = xFieldMasterNameAccess->getByName(sMasterName); + aAny >>= xMaster; + //apply the content to the master + xMaster->setPropertyValue( sPropertyContent, uno::makeAny( GetContent())); + // master exists: create text field and attach + Reference<XPropertySet> xField; + sBuf.appendAscii(sAPI_textfield_prefix); + sBuf.appendAscii(sAPI_dde); + if (CreateField(xField, sBuf.makeStringAndClear())) + { + Reference<XDependentTextField> xDepTextField(xField,UNO_QUERY); + xDepTextField->attachTextFieldMaster(xMaster); + + // attach field to document + Reference<XTextContent> xTextContent(xField, UNO_QUERY); + if (xTextContent.is()) + { + GetImportHelper().InsertTextContent(xTextContent); + + // we're lucky. nothing else to prepare. + } + // else: fail, because text content could not be created + } + // else: fail, because field could not be created + } + // else: fail, because no master was found (faulty document?!) + } + // not valid: ignore +} + +void XMLDdeFieldImportContext::PrepareField( + const Reference<XPropertySet> &) +{ + // empty, since not needed. +} + + +// +// sheet name fields +// + +TYPEINIT1(XMLSheetNameImportContext, XMLTextFieldImportContext); + +XMLSheetNameImportContext::XMLSheetNameImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_sheet_name, + nPrfx, sLocalName) +{ + bValid = sal_True; // always valid! +} + +void XMLSheetNameImportContext::ProcessAttribute( + sal_uInt16, + const ::rtl::OUString& ) +{ + // no attributes -> nothing to be done +} + +void XMLSheetNameImportContext::PrepareField( + const Reference<XPropertySet> &) +{ + // no attributes -> nothing to be done +} + + +// +// URL fields (Calc, Impress, Draw) +// + +TYPEINIT1(XMLUrlFieldImportContext, XMLTextFieldImportContext); + +XMLUrlFieldImportContext::XMLUrlFieldImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_url, + nPrfx, sLocalName), + sPropertyURL(RTL_CONSTASCII_USTRINGPARAM(sAPI_url)), + sPropertyTargetFrame(RTL_CONSTASCII_USTRINGPARAM(sAPI_target_frame)), + sPropertyRepresentation(RTL_CONSTASCII_USTRINGPARAM( + sAPI_representation)), + bFrameOK(sal_False) +{ +} + +void XMLUrlFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_HREF: + sURL = GetImport().GetAbsoluteReference( sAttrValue ); + bValid = sal_True; + break; + case XML_TOK_TEXTFIELD_TARGET_FRAME: + sFrame = sAttrValue; + bFrameOK = sal_True; + break; + default: + // ignore + break; + } +} + +void XMLUrlFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + aAny <<= sURL; + xPropertySet->setPropertyValue(sPropertyURL, aAny); + + if (bFrameOK) + { + aAny <<= sFrame; + xPropertySet->setPropertyValue(sPropertyTargetFrame, aAny); + } + + aAny <<= GetContent(); + xPropertySet->setPropertyValue(sPropertyRepresentation, aAny); +} + + +TYPEINIT1(XMLBibliographyFieldImportContext, XMLTextFieldImportContext); + + +XMLBibliographyFieldImportContext::XMLBibliographyFieldImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_bibliography, + nPrfx, sLocalName), + sPropertyFields(RTL_CONSTASCII_USTRINGPARAM("Fields")), + aValues() +{ + bValid = sal_True; +} + +// TODO: this is the same map as is used in the text field export +SvXMLEnumMapEntry __READONLY_DATA aBibliographyDataTypeMap[] = +{ + { XML_ARTICLE, BibliographyDataType::ARTICLE }, + { XML_BOOK, BibliographyDataType::BOOK }, + { XML_BOOKLET, BibliographyDataType::BOOKLET }, + { XML_CONFERENCE, BibliographyDataType::CONFERENCE }, + { XML_CUSTOM1, BibliographyDataType::CUSTOM1 }, + { XML_CUSTOM2, BibliographyDataType::CUSTOM2 }, + { XML_CUSTOM3, BibliographyDataType::CUSTOM3 }, + { XML_CUSTOM4, BibliographyDataType::CUSTOM4 }, + { XML_CUSTOM5, BibliographyDataType::CUSTOM5 }, + { XML_EMAIL, BibliographyDataType::EMAIL }, + { XML_INBOOK, BibliographyDataType::INBOOK }, + { XML_INCOLLECTION, BibliographyDataType::INCOLLECTION }, + { XML_INPROCEEDINGS, BibliographyDataType::INPROCEEDINGS }, + { XML_JOURNAL, BibliographyDataType::JOURNAL }, + { XML_MANUAL, BibliographyDataType::MANUAL }, + { XML_MASTERSTHESIS, BibliographyDataType::MASTERSTHESIS }, + { XML_MISC, BibliographyDataType::MISC }, + { XML_PHDTHESIS, BibliographyDataType::PHDTHESIS }, + { XML_PROCEEDINGS, BibliographyDataType::PROCEEDINGS }, + { XML_TECHREPORT, BibliographyDataType::TECHREPORT }, + { XML_UNPUBLISHED, BibliographyDataType::UNPUBLISHED }, + { XML_WWW, BibliographyDataType::WWW }, + { XML_TOKEN_INVALID, 0 } +}; + + +// we'll process attributes on our own and forfit the standard +// tecfield mechanism, because our attributes have zero overlp with +// all the oher textfields. +void XMLBibliographyFieldImportContext::StartElement( + const Reference<XAttributeList> & xAttrList) +{ + // iterate over 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 ); + + if (nPrefix == XML_NAMESPACE_TEXT) + { + PropertyValue aValue; + aValue.Name = OUString::createFromAscii( + MapBibliographyFieldName(sLocalName)); + Any aAny; + + // special treatment for bibliography type + // biblio vs bibilio: #96658#; also read old documents + if (IsXMLToken(sLocalName, XML_BIBILIOGRAPHIC_TYPE) || + IsXMLToken(sLocalName, XML_BIBLIOGRAPHY_TYPE) ) + { + sal_uInt16 nTmp; + if (SvXMLUnitConverter::convertEnum( + nTmp, xAttrList->getValueByIndex(i), + aBibliographyDataTypeMap)) + { + aAny <<= (sal_Int16)nTmp; + aValue.Value = aAny; + + aValues.push_back(aValue); + } + } + else + { + aAny <<= xAttrList->getValueByIndex(i); + aValue.Value = aAny; + + aValues.push_back(aValue); + } + } + // else: unknown namespace -> ignore + } +} + +void XMLBibliographyFieldImportContext::ProcessAttribute( + sal_uInt16, + const OUString& ) +{ + // attributes are handled in StartElement + DBG_ERROR("This should not have happened."); +} + + +void XMLBibliographyFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + // convert vector into sequence + sal_Int32 nCount = aValues.size(); + Sequence<PropertyValue> aValueSequence(nCount); + for(sal_Int32 i = 0; i < nCount; i++) + { + aValueSequence[i] = aValues[i]; + } + + // set sequence + Any aAny; + aAny <<= aValueSequence; + xPropertySet->setPropertyValue(sPropertyFields, aAny); +} + +const sal_Char* XMLBibliographyFieldImportContext::MapBibliographyFieldName( + OUString sName) +{ + const sal_Char* pName = NULL; + + if (IsXMLToken(sName, XML_IDENTIFIER)) + { + pName = "Identifier"; + } + else if (IsXMLToken(sName, XML_BIBILIOGRAPHIC_TYPE) || + IsXMLToken(sName, XML_BIBLIOGRAPHY_TYPE) ) + { + // biblio... vs bibilio...: #96658#: also read old documents + pName = "BibiliographicType"; + } + else if (IsXMLToken(sName, XML_ADDRESS)) + { + pName = "Address"; + } + else if (IsXMLToken(sName, XML_ANNOTE)) + { + pName = "Annote"; + } + else if (IsXMLToken(sName, XML_AUTHOR)) + { + pName = "Author"; + } + else if (IsXMLToken(sName, XML_BOOKTITLE)) + { + pName = "Booktitle"; + } + else if (IsXMLToken(sName, XML_CHAPTER)) + { + pName = "Chapter"; + } + else if (IsXMLToken(sName, XML_EDITION)) + { + pName = "Edition"; + } + else if (IsXMLToken(sName, XML_EDITOR)) + { + pName = "Editor"; + } + else if (IsXMLToken(sName, XML_HOWPUBLISHED)) + { + pName = "Howpublished"; + } + else if (IsXMLToken(sName, XML_INSTITUTION)) + { + pName = "Institution"; + } + else if (IsXMLToken(sName, XML_JOURNAL)) + { + pName = "Journal"; + } + else if (IsXMLToken(sName, XML_MONTH)) + { + pName = "Month"; + } + else if (IsXMLToken(sName, XML_NOTE)) + { + pName = "Note"; + } + else if (IsXMLToken(sName, XML_NUMBER)) + { + pName = "Number"; + } + else if (IsXMLToken(sName, XML_ORGANIZATIONS)) + { + pName = "Organizations"; + } + else if (IsXMLToken(sName, XML_PAGES)) + { + pName = "Pages"; + } + else if (IsXMLToken(sName, XML_PUBLISHER)) + { + pName = "Publisher"; + } + else if (IsXMLToken(sName, XML_SCHOOL)) + { + pName = "School"; + } + else if (IsXMLToken(sName, XML_SERIES)) + { + pName = "Series"; + } + else if (IsXMLToken(sName, XML_TITLE)) + { + pName = "Title"; + } + else if (IsXMLToken(sName, XML_REPORT_TYPE)) + { + pName = "Report_Type"; + } + else if (IsXMLToken(sName, XML_VOLUME)) + { + pName = "Volume"; + } + else if (IsXMLToken(sName, XML_YEAR)) + { + pName = "Year"; + } + else if (IsXMLToken(sName, XML_URL)) + { + pName = "URL"; + } + else if (IsXMLToken(sName, XML_CUSTOM1)) + { + pName = "Custom1"; + } + else if (IsXMLToken(sName, XML_CUSTOM2)) + { + pName = "Custom2"; + } + else if (IsXMLToken(sName, XML_CUSTOM3)) + { + pName = "Custom3"; + } + else if (IsXMLToken(sName, XML_CUSTOM4)) + { + pName = "Custom4"; + } + else if (IsXMLToken(sName, XML_CUSTOM5)) + { + pName = "Custom5"; + } + else if (IsXMLToken(sName, XML_ISBN)) + { + pName = "ISBN"; + } + else + { + DBG_ERROR("Unknown bibliography info data"); + pName = NULL; + } + + return pName; +} + + +// +// Annotation Field +// + +TYPEINIT1(XMLAnnotationImportContext, XMLTextFieldImportContext); + +XMLAnnotationImportContext::XMLAnnotationImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_annotation, + nPrfx, sLocalName), + sPropertyAuthor(RTL_CONSTASCII_USTRINGPARAM(sAPI_author)), + sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)), + // why is there no UNO_NAME_DATE_TIME, but only UNO_NAME_DATE_TIME_VALUE? + sPropertyDate(RTL_CONSTASCII_USTRINGPARAM(sAPI_date_time_value)), + sPropertyTextRange(RTL_CONSTASCII_USTRINGPARAM(sAPI_TextRange)) +{ + bValid = sal_True; + + // remember old list item and block (#91964#) and reset them + // for the text frame + // do this in the constructor, not in CreateChildContext (#i93392#) + GetImport().GetTextImport()->PushListContext(); +} + +void XMLAnnotationImportContext::ProcessAttribute( + sal_uInt16, + const OUString& ) +{ + // ignore +} + +SvXMLImportContext* XMLAnnotationImportContext::CreateChildContext( + USHORT nPrefix, + const OUString& rLocalName, + const Reference<XAttributeList >& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + if( XML_NAMESPACE_DC == nPrefix ) + { + if( IsXMLToken( rLocalName, XML_CREATOR ) ) + pContext = new XMLStringBufferImportContext(GetImport(), nPrefix, + rLocalName, aAuthorBuffer); + else if( IsXMLToken( rLocalName, XML_DATE ) ) + pContext = new XMLStringBufferImportContext(GetImport(), nPrefix, + rLocalName, aDateBuffer); + } + + if( !pContext ) + { + try + { + if ( !mxField.is() ) + CreateField( mxField, sServicePrefix + GetServiceName() ); + Any aAny = mxField->getPropertyValue( sPropertyTextRange ); + Reference< XText > xText; + aAny >>= xText; + if( xText.is() ) + { + UniReference < XMLTextImportHelper > xTxtImport = GetImport().GetTextImport(); + if( !mxCursor.is() ) + { + mxOldCursor = xTxtImport->GetCursor(); + mxCursor = xText->createTextCursor(); + } + + if( mxCursor.is() ) + { + xTxtImport->SetCursor( mxCursor ); + pContext = xTxtImport->CreateTextChildContext( GetImport(), nPrefix, rLocalName, xAttrList ); + } + } + } + catch ( Exception& ) + {} + + if( !pContext ) + pContext = new XMLStringBufferImportContext(GetImport(), nPrefix, rLocalName, aTextBuffer); + } + + return pContext; +} + +void XMLAnnotationImportContext::EndElement() +{ + DBG_ASSERT(GetServiceName().getLength()>0, "no service name for element!"); + if( mxCursor.is() ) + { + // delete addition newline + const OUString aEmpty; + mxCursor->gotoEnd( sal_False ); + mxCursor->goLeft( 1, sal_True ); + mxCursor->setString( aEmpty ); + + // reset cursor + GetImport().GetTextImport()->ResetCursor(); + } + + if( mxOldCursor.is() ) + GetImport().GetTextImport()->SetCursor( mxOldCursor ); + + // reinstall old list item #91964# + GetImport().GetTextImport()->PopListContext(); + + if ( bValid ) + { + if ( mxField.is() || CreateField( mxField, sServicePrefix + GetServiceName() ) ) + { + // set field properties + PrepareField( mxField ); + + // attach field to document + Reference < XTextContent > xTextContent( mxField, UNO_QUERY ); + + // workaround for #80606# + try + { + GetImportHelper().InsertTextContent( xTextContent ); + } + catch (lang::IllegalArgumentException) + { + // ignore + } + } + } + else + GetImportHelper().InsertString(GetContent()); +} + +void XMLAnnotationImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + // import (possibly empty) author + OUString sAuthor( aAuthorBuffer.makeStringAndClear() ); + xPropertySet->setPropertyValue(sPropertyAuthor, makeAny(sAuthor)); + + DateTime aDateTime; + if (SvXMLUnitConverter::convertDateTime(aDateTime, + aDateBuffer.makeStringAndClear())) + { + /* + Date aDate; + aDate.Year = aDateTime.Year; + aDate.Month = aDateTime.Month; + aDate.Day = aDateTime.Day; + xPropertySet->setPropertyValue(sPropertyDate, makeAny(aDate)); + */ + xPropertySet->setPropertyValue(sPropertyDate, makeAny(aDateTime)); + } + + OUString sBuffer = aTextBuffer.makeStringAndClear(); + if ( sBuffer.getLength() ) + { + // delete last paragraph mark (if necessary) + if (sal_Char(0x0a) == sBuffer.getStr()[sBuffer.getLength()-1]) + sBuffer = sBuffer.copy(0, sBuffer.getLength()-1); + xPropertySet->setPropertyValue(sPropertyContent, makeAny(sBuffer)); + } +} + + + +// +// script field +// + +TYPEINIT1(XMLScriptImportContext, XMLTextFieldImportContext); + +XMLScriptImportContext::XMLScriptImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) +: XMLTextFieldImportContext(rImport, rHlp, sAPI_script, nPrfx, sLocalName) +, sPropertyScriptType(RTL_CONSTASCII_USTRINGPARAM(sAPI_script_type)) +, sPropertyURLContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_url_content)) +, sPropertyContent(RTL_CONSTASCII_USTRINGPARAM(sAPI_content)) +, bContentOK(sal_False) +, bScriptTypeOK(sal_False) +, bUrlContent(sal_False) +{ +} + +void XMLScriptImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_HREF: + sContent = GetImport().GetAbsoluteReference( sAttrValue ); + bContentOK = sal_True; + break; + + case XML_TOK_TEXTFIELD_LANGUAGE: + sScriptType = sAttrValue; + bScriptTypeOK = sal_True; + break; + + default: + // ignore + break; + } + + // always valid (even without ScriptType; cf- #96531#) + bValid = sal_True; +} + +void XMLScriptImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + + // if href attribute was present, we use it. Else we use element content + if (! bContentOK) + { + sContent = GetContent(); + } + aAny <<= sContent; + xPropertySet->setPropertyValue(sPropertyContent, aAny); + + // URL or script text? We use URL if we have an href-attribute + aAny.setValue(&bContentOK, ::getBooleanCppuType()); + xPropertySet->setPropertyValue(sPropertyURLContent, aAny); + + aAny <<= sScriptType; + xPropertySet->setPropertyValue(sPropertyScriptType, aAny); +} + +// +// measure field +// + +TYPEINIT1(XMLMeasureFieldImportContext, XMLTextFieldImportContext); + +XMLMeasureFieldImportContext::XMLMeasureFieldImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const OUString& sLocalName) : + XMLTextFieldImportContext(rImport, rHlp, sAPI_measure, + nPrfx, sLocalName), + mnKind( 0 ) +{ +} + +void XMLMeasureFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const OUString& sAttrValue ) +{ + switch (nAttrToken) + { + case XML_TOK_TEXTFIELD_MEASURE_KIND: + if( IsXMLToken( sAttrValue, XML_VALUE ) ) + { + mnKind = 0; bValid = sal_True; + } + else if( IsXMLToken( sAttrValue, XML_UNIT ) ) + { + mnKind = 1; bValid = sal_True; + } + else if( IsXMLToken( sAttrValue, XML_GAP ) ) + { + mnKind = 2; bValid = sal_True; + } + break; + } +} + +void XMLMeasureFieldImportContext::PrepareField( + const Reference<XPropertySet> & xPropertySet) +{ + Any aAny; + aAny <<= mnKind; + xPropertySet->setPropertyValue(OUString::createFromAscii("Kind"), aAny); +} + + + +// +// dropdown field +// + + +TYPEINIT1( XMLDropDownFieldImportContext, XMLTextFieldImportContext ); + +XMLDropDownFieldImportContext::XMLDropDownFieldImportContext( + SvXMLImport& rImport, + XMLTextImportHelper& rHlp, + sal_uInt16 nPrfx, + const ::rtl::OUString& sLocalName) : + XMLTextFieldImportContext( rImport, rHlp, sAPI_drop_down, + nPrfx, sLocalName ), + aLabels(), + sName(), + nSelected( -1 ), + bNameOK( false ), + bHelpOK(false), + bHintOK(false), + sPropertyItems( RTL_CONSTASCII_USTRINGPARAM( "Items" ) ), + sPropertySelectedItem( RTL_CONSTASCII_USTRINGPARAM( "SelectedItem" ) ), + sPropertyName( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), + sPropertyHelp( RTL_CONSTASCII_USTRINGPARAM( "Help" ) ), + sPropertyToolTip( RTL_CONSTASCII_USTRINGPARAM( "Tooltip" ) ) +{ + bValid = sal_True; +} + +bool lcl_ProcessLabel( const SvXMLImport& rImport, + const Reference<XAttributeList>& xAttrList, + OUString& rLabel, + bool& rIsSelected ) +{ + bool bValid = false; + sal_Int16 nLength = xAttrList->getLength(); + for( sal_Int16 n = 0; n < nLength; n++ ) + { + OUString sLocalName; + sal_uInt16 nPrefix = rImport.GetNamespaceMap(). + GetKeyByAttrName( xAttrList->getNameByIndex(n), &sLocalName ); + OUString sValue = xAttrList->getValueByIndex(n); + + if( nPrefix == XML_NAMESPACE_TEXT ) + { + if( IsXMLToken( sLocalName, XML_VALUE ) ) + { + rLabel = sValue; + bValid = true; + } + else if( IsXMLToken( sLocalName, XML_CURRENT_SELECTED ) ) + { + sal_Bool bTmp; + if( SvXMLUnitConverter::convertBool( bTmp, sValue ) ) + rIsSelected = bTmp; + } + } + } + return bValid; +} + +SvXMLImportContext* XMLDropDownFieldImportContext::CreateChildContext( + USHORT nPrefix, + const OUString& rLocalName, + const Reference<XAttributeList>& xAttrList ) +{ + if( nPrefix == XML_NAMESPACE_TEXT && + IsXMLToken( rLocalName, XML_LABEL ) ) + { + OUString sLabel; + bool bIsSelected = sal_False; + if( lcl_ProcessLabel( GetImport(), xAttrList, sLabel, bIsSelected ) ) + { + if( bIsSelected ) + nSelected = static_cast<sal_Int32>( aLabels.size() ); + aLabels.push_back( sLabel ); + } + } + return new SvXMLImportContext( GetImport(), nPrefix, rLocalName ); +} + +void XMLDropDownFieldImportContext::ProcessAttribute( + sal_uInt16 nAttrToken, + const ::rtl::OUString& sAttrValue ) +{ + if( nAttrToken == XML_TOK_TEXTFIELD_NAME ) + { + sName = sAttrValue; + bNameOK = true; + } + else if (nAttrToken == XML_TOK_TEXTFIELD_HELP) + { + sHelp = sAttrValue; + bHelpOK = true; + } + else if (nAttrToken == XML_TOK_TEXTFIELD_HINT) + { + sHint = sAttrValue; + bHintOK = true; + } +} + +void XMLDropDownFieldImportContext::PrepareField( + const Reference<XPropertySet>& xPropertySet) +{ + // create sequence + sal_Int32 nLength = static_cast<sal_Int32>( aLabels.size() ); + Sequence<OUString> aSequence( nLength ); + OUString* pSequence = aSequence.getArray(); + for( sal_Int32 n = 0; n < nLength; n++ ) + pSequence[n] = aLabels[n]; + + // now set values: + Any aAny; + + aAny <<= aSequence; + xPropertySet->setPropertyValue( sPropertyItems, aAny ); + + if( nSelected >= 0 && nSelected < nLength ) + { + aAny <<= pSequence[nSelected]; + xPropertySet->setPropertyValue( sPropertySelectedItem, aAny ); + } + + // set name + if( bNameOK ) + { + aAny <<= sName; + xPropertySet->setPropertyValue( sPropertyName, aAny ); + } + // set help + if( bHelpOK ) + { + aAny <<= sHelp; + xPropertySet->setPropertyValue( sPropertyHelp, aAny ); + } + // set hint + if( bHintOK ) + { + aAny <<= sHint; + xPropertySet->setPropertyValue( sPropertyToolTip, aAny ); + } + +} + +/** import header fields (<draw:header>) */ +TYPEINIT1( XMLHeaderFieldImportContext, XMLTextFieldImportContext ); + +XMLHeaderFieldImportContext::XMLHeaderFieldImportContext( + SvXMLImport& rImport, /// XML Import + XMLTextImportHelper& rHlp, /// Text import helper + sal_uInt16 nPrfx, /// namespace prefix + const ::rtl::OUString& sLocalName) /// element name w/o prefix +: XMLTextFieldImportContext(rImport, rHlp, sAPI_header, nPrfx, sLocalName ) +{ + sServicePrefix = OUString::createFromAscii( sAPI_presentation_prefix ); + bValid = sal_True; +} + +/// process attribute values +void XMLHeaderFieldImportContext::ProcessAttribute( sal_uInt16, const ::rtl::OUString& ) +{ +} + +/// prepare XTextField for insertion into document +void XMLHeaderFieldImportContext::PrepareField(const Reference<XPropertySet> &) +{ +} + +/** import footer fields (<draw:footer>) */ +TYPEINIT1( XMLFooterFieldImportContext, XMLTextFieldImportContext ); + +XMLFooterFieldImportContext::XMLFooterFieldImportContext( + SvXMLImport& rImport, /// XML Import + XMLTextImportHelper& rHlp, /// Text import helper + sal_uInt16 nPrfx, /// namespace prefix + const ::rtl::OUString& sLocalName) /// element name w/o prefix +: XMLTextFieldImportContext(rImport, rHlp, sAPI_footer, nPrfx, sLocalName ) +{ + sServicePrefix = OUString::createFromAscii( sAPI_presentation_prefix ); + bValid = sal_True; +} + +/// process attribute values +void XMLFooterFieldImportContext::ProcessAttribute( sal_uInt16, const ::rtl::OUString& ) +{ +} + +/// prepare XTextField for insertion into document +void XMLFooterFieldImportContext::PrepareField(const Reference<XPropertySet> &) +{ +} + + +/** import footer fields (<draw:date-and-time>) */ +TYPEINIT1( XMLDateTimeFieldImportContext, XMLTextFieldImportContext ); + +XMLDateTimeFieldImportContext::XMLDateTimeFieldImportContext( + SvXMLImport& rImport, /// XML Import + XMLTextImportHelper& rHlp, /// Text import helper + sal_uInt16 nPrfx, /// namespace prefix + const ::rtl::OUString& sLocalName) /// element name w/o prefix +: XMLTextFieldImportContext(rImport, rHlp, sAPI_datetime, nPrfx, sLocalName ) +{ + sServicePrefix = OUString::createFromAscii( sAPI_presentation_prefix ); + bValid = sal_True; +} + +/// process attribute values +void XMLDateTimeFieldImportContext::ProcessAttribute( sal_uInt16, + const ::rtl::OUString& ) +{ +} + +/// prepare XTextField for insertion into document +void XMLDateTimeFieldImportContext::PrepareField( + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySet> &) +{ +} |