LCOV - code coverage report
Current view: top level - xmloff/source/text - txtvfldi.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 322 530 60.8 %
Date: 2014-11-03 Functions: 26 109 23.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : /** @#file
      22             :  *
      23             :  *  export of all variable related text fields (and database display field)
      24             :  */
      25             : #include "txtvfldi.hxx"
      26             : #include <xmloff/xmltoken.hxx>
      27             : #include <xmloff/txtimp.hxx>
      28             : #include <xmloff/xmlnumi.hxx>
      29             : #include <xmloff/xmlnmspe.hxx>
      30             : #include <xmloff/nmspmap.hxx>
      31             : #include <xmloff/i18nmap.hxx>
      32             : #include <xmloff/xmlimp.hxx>
      33             : #include <xmloff/xmluconv.hxx>
      34             : #include <xmloff/xmlement.hxx>
      35             : #include <com/sun/star/text/SetVariableType.hpp>
      36             : #include <com/sun/star/text/XTextField.hpp>
      37             : #include <com/sun/star/text/XDependentTextField.hpp>
      38             : #include <com/sun/star/text/XTextFieldsSupplier.hpp>
      39             : #include <com/sun/star/beans/XPropertySet.hpp>
      40             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      41             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      42             : #include <com/sun/star/xml/sax/XAttributeList.hpp>
      43             : 
      44             : #include <sax/tools/converter.hxx>
      45             : 
      46             : #include <rtl/ustring.hxx>
      47             : 
      48             : #include <tools/debug.hxx>
      49             : 
      50             : 
      51             : // service names
      52             : static const sal_Char sAPI_textfield_prefix[]   = "com.sun.star.text.TextField.";
      53             : static const sal_Char sAPI_fieldmaster_prefix[] = "com.sun.star.text.FieldMaster.";
      54             : static const sal_Char sAPI_input[]              = "Input";
      55             : static const sal_Char sAPI_input_user[]         = "InputUser";
      56             : static const sal_Char sAPI_get_expression[]     = "GetExpression";
      57             : static const sal_Char sAPI_set_expression[]     = "SetExpression";
      58             : static const sal_Char sAPI_user[]               = "User";
      59             : static const sal_Char sAPI_table_formula[]      = "TableFormula";
      60             : static const sal_Char sAPI_database[]           = "com.sun.star.text.TextField.Database";
      61             : static const sal_Char sAPI_fieldmaster_database[] = "com.sun.star.text.FieldMaster.Database";
      62             : 
      63             : // property names
      64             : static const sal_Char sAPI_hint[]               = "Hint";
      65             : static const sal_Char sAPI_help[]               = "Help";
      66             : static const sal_Char sAPI_tooltip[]            = "Tooltip";
      67             : static const sal_Char sAPI_content[]            = "Content";
      68             : static const sal_Char sAPI_sub_type[]           = "SubType";
      69             : static const sal_Char sAPI_is_expression[]      = "IsExpression";
      70             : static const sal_Char sAPI_is_input[]           = "Input";
      71             : static const sal_Char sAPI_is_show_formula[]    = "IsShowFormula";
      72             : static const sal_Char sAPI_number_format[]      = "NumberFormat";
      73             : static const sal_Char sAPI_name[]               = "Name";
      74             : static const sal_Char sAPI_numbering_separator[]    = "NumberingSeparator";
      75             : static const sal_Char sAPI_chapter_numbering_level[]= "ChapterNumberingLevel";
      76             : static const sal_Char sAPI_value[]              = "Value";
      77             : static const sal_Char sAPI_is_visible[]         = "IsVisible";
      78             : static const sal_Char sAPI_data_column_name[]   = "DataColumnName";
      79             : static const sal_Char sAPI_is_data_base_format[]    = "DataBaseFormat";
      80             : static const sal_Char sAPI_current_presentation[]   = "CurrentPresentation";
      81             : static const sal_Char sAPI_sequence_value[]     = "SequenceValue";
      82             : static const sal_Char sAPI_is_fixed_language[] = "IsFixedLanguage";
      83             : 
      84             : 
      85             : 
      86             : using namespace ::com::sun::star;
      87             : using namespace ::com::sun::star::uno;
      88             : using namespace ::com::sun::star::beans;
      89             : using namespace ::com::sun::star::text;
      90             : using namespace ::com::sun::star::style;
      91             : using namespace ::xmloff::token;
      92             : 
      93             : 
      94             : 
      95             : 
      96             : // XMLVarFieldImportContext: superclass for all variable related fields
      97             : 
      98             : 
      99           0 : TYPEINIT1( XMLVarFieldImportContext, XMLTextFieldImportContext );
     100             : 
     101          22 : XMLVarFieldImportContext::XMLVarFieldImportContext(
     102             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     103             :     const sal_Char* pServiceName, sal_uInt16 nPrfx,
     104             :     const OUString& rLocalName,
     105             :     bool bFormula, bool bFormulaDefault,
     106             :     bool bDescription, bool bHelp, bool bHint, bool bVisible,
     107             :     bool bIsDisplayFormula,
     108             :     bool bType, bool bStyle, bool bValue,
     109             :     bool bPresentation) :
     110             :         XMLTextFieldImportContext(rImport, rHlp, pServiceName, nPrfx, rLocalName),
     111             :         sPropertyContent(sAPI_content),
     112             :         sPropertyHint(sAPI_hint),
     113             :         sPropertyHelp(sAPI_help),
     114             :         sPropertyTooltip(sAPI_tooltip),
     115             :         sPropertyIsVisible(sAPI_is_visible),
     116             :         sPropertyIsDisplayFormula(sAPI_is_show_formula),
     117             :         sPropertyCurrentPresentation(sAPI_current_presentation),
     118             :         aValueHelper(rImport, rHlp, bType, bStyle, bValue, false),
     119             :         bDisplayFormula(false),
     120             :         bDisplayNone(false),
     121             :         bNameOK(false),
     122             :         bFormulaOK(false),
     123             :         bDescriptionOK(false),
     124             :         bHelpOK(false),
     125             :         bHintOK(false),
     126             :         bDisplayOK(false),
     127             :         bSetFormula(bFormula),
     128             :         bSetFormulaDefault(bFormulaDefault),
     129             :         bSetDescription(bDescription),
     130             :         bSetHelp(bHelp),
     131             :         bSetHint(bHint),
     132             :         bSetVisible(bVisible),
     133             :         bSetDisplayFormula(bIsDisplayFormula),
     134          22 :         bSetPresentation(bPresentation)
     135             : {
     136          22 : }
     137             : 
     138          32 : void XMLVarFieldImportContext::ProcessAttribute(
     139             :     sal_uInt16 nAttrToken,
     140             :     const OUString& sAttrValue )
     141             : {
     142          32 :     switch (nAttrToken)
     143             :         {
     144             :         case XML_TOK_TEXTFIELD_NAME:
     145          10 :             sName = sAttrValue;
     146          10 :             bNameOK = true;
     147          10 :             bValid = true;      // we assume: field with name is valid!
     148          10 :             break;
     149             :         case XML_TOK_TEXTFIELD_DESCRIPTION:
     150          16 :             sDescription = sAttrValue;
     151          16 :             bDescriptionOK = true;
     152          16 :             break;
     153             :         case XML_TOK_TEXTFIELD_HELP:
     154           0 :             sHelp = sAttrValue;
     155           0 :             bHelpOK = true;
     156           0 :             break;
     157             :         case XML_TOK_TEXTFIELD_HINT:
     158           0 :             sHint = sAttrValue;
     159           0 :             bHintOK = true;
     160           0 :             break;
     161             :         case XML_TOK_TEXTFIELD_FORMULA:
     162             :             {
     163           4 :                 OUString sTmp;
     164           4 :                 sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
     165           4 :                         _GetKeyByAttrName( sAttrValue, &sTmp, false );
     166           4 :                 if( XML_NAMESPACE_OOOW == nPrefix )
     167             :                 {
     168           4 :                     sFormula = sTmp;
     169           4 :                     bFormulaOK = true;
     170             :                 }
     171             :                 else
     172           0 :                     sFormula = sAttrValue;
     173             :             }
     174           4 :             break;
     175             :         case XML_TOK_TEXTFIELD_DISPLAY:
     176           0 :             if (IsXMLToken(sAttrValue, XML_FORMULA))
     177             :             {
     178           0 :                 bDisplayFormula = true;
     179           0 :                 bDisplayNone = false;
     180           0 :                 bDisplayOK = true;
     181             :             }
     182           0 :             else if (IsXMLToken(sAttrValue, XML_VALUE))
     183             :             {
     184           0 :                 bDisplayFormula = false;
     185           0 :                 bDisplayNone = false;
     186           0 :                 bDisplayOK = true;
     187             :             }
     188           0 :             else if (IsXMLToken(sAttrValue, XML_NONE))
     189             :             {
     190           0 :                 bDisplayFormula = false;
     191           0 :                 bDisplayNone = true;
     192           0 :                 bDisplayOK = true;
     193             :             } // else: no change
     194             :             DBG_ASSERT(!(bDisplayFormula && bDisplayNone),
     195             :                        "illegal display values");
     196           0 :             break;
     197             :         default:
     198             :             // delegate all others to value helper
     199           2 :             aValueHelper.ProcessAttribute(nAttrToken, sAttrValue);
     200           2 :             break;
     201             :         }
     202          32 : }
     203             : 
     204          22 : void XMLVarFieldImportContext::PrepareField(
     205             :     const Reference<XPropertySet> & xPropertySet)
     206             : {
     207             :     // bSetName: not implemented
     208             : 
     209          22 :     if (bSetFormula)
     210             :     {
     211           6 :         if (!bFormulaOK && bSetFormulaDefault)
     212             :         {
     213           2 :             sFormula = GetContent();
     214           2 :             bFormulaOK = true;
     215             :         }
     216             : 
     217           6 :         if (bFormulaOK)
     218             :         {
     219           6 :             Any aAny;
     220           6 :             aAny <<= sFormula;
     221           6 :             xPropertySet->setPropertyValue(sPropertyContent, aAny);
     222             :         }
     223             :     }
     224             : 
     225          22 :     if (bSetDescription && bDescriptionOK)
     226             :     {
     227          16 :         Any aAny;
     228          16 :         aAny <<= sDescription;
     229          16 :         xPropertySet->setPropertyValue(sPropertyHint, aAny);
     230             :     }
     231             : 
     232          22 :     if (bSetHelp && bHelpOK)
     233             :     {
     234           0 :         Any aAny;
     235           0 :         aAny <<= sHelp;
     236           0 :         xPropertySet->setPropertyValue(sPropertyHelp, aAny);
     237             :     }
     238             : 
     239          22 :     if (bSetHint && bHintOK)
     240             :     {
     241           0 :         Any aAny;
     242           0 :         aAny <<= sHint;
     243           0 :         xPropertySet->setPropertyValue(sPropertyTooltip, aAny);
     244             :     }
     245             : 
     246          22 :     if (bSetVisible && bDisplayOK)
     247             :     {
     248           0 :         Any aAny;
     249           0 :         sal_Bool bTmp = ! (bDisplayNone && bDisplayOK);
     250           0 :         aAny.setValue( &bTmp, ::getBooleanCppuType());
     251           0 :         xPropertySet->setPropertyValue(sPropertyIsVisible, aAny);
     252             :     }
     253             : 
     254             :     // workaround for #no-bug#: display formula by default
     255          66 :     if (xPropertySet->getPropertySetInfo()->
     256          72 :                 hasPropertyByName(sPropertyIsDisplayFormula) &&
     257           6 :         !bSetDisplayFormula)
     258             :     {
     259           6 :         bDisplayFormula = false;
     260           6 :         bSetDisplayFormula = true;
     261             :     }
     262             : 
     263             : 
     264          22 :     if (bSetDisplayFormula)
     265             :     {
     266           6 :         Any aAny;
     267           6 :         sal_Bool bTmp = bDisplayFormula && bDisplayOK;
     268           6 :         aAny.setValue( &bTmp, ::getBooleanCppuType());
     269           6 :         xPropertySet->setPropertyValue(sPropertyIsDisplayFormula, aAny);
     270             :     }
     271             : 
     272             :     // delegate to value helper
     273          22 :     aValueHelper.SetDefault(GetContent());
     274          22 :     aValueHelper.PrepareField(xPropertySet);
     275             : 
     276             :     // finally, set the curren presentation
     277          22 :     if (bSetPresentation)
     278             :     {
     279           6 :         Any aAny;
     280           6 :         aAny <<= GetContent();
     281           6 :         xPropertySet->setPropertyValue(sPropertyCurrentPresentation, aAny);
     282             :     }
     283          22 : }
     284             : 
     285             : 
     286             : 
     287             : 
     288             : 
     289             : 
     290             : // variable set fields
     291             : 
     292             : 
     293           0 : TYPEINIT1( XMLSetVarFieldImportContext, XMLVarFieldImportContext );
     294             : 
     295           6 : XMLSetVarFieldImportContext::XMLSetVarFieldImportContext(
     296             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     297             :     const sal_Char* pServiceName, sal_uInt16 nPrfx,
     298             :     const OUString& rLocalName, VarType eVarType,
     299             :     bool bFormula, bool bFormulaDefault,
     300             :     bool bDescription, bool bHelp, bool bHint, bool bVisible, bool bIsDisplayFormula,
     301             :     bool bType, bool bStyle, bool bValue, bool bPresentation) :
     302             :         XMLVarFieldImportContext(rImport, rHlp, pServiceName,
     303             :                                  nPrfx, rLocalName,
     304             :                                  bFormula, bFormulaDefault,
     305             :                                  bDescription, bHelp, bHint, bVisible, bIsDisplayFormula,
     306             :                                  bType, bStyle, bValue, bPresentation),
     307           6 :         eFieldType(eVarType)
     308             : {
     309           6 : }
     310             : 
     311           6 : void XMLSetVarFieldImportContext::EndElement()
     312             : {
     313             :     // should we call PrepareField on the field, or rather on it's master?
     314             :     // currently: call on field (just like superclass)
     315             :     // possible alternatives: call on master
     316             :     //                        call field or master depending on variable
     317             :     //                        PrepareMaster() in addition to PrepareField()
     318             : 
     319             :     DBG_ASSERT(!GetServiceName().isEmpty(), "no service name for element!");
     320             : 
     321           6 :     if (bValid)
     322             :     {
     323             :         DBG_ASSERT(!GetName().isEmpty(), "variable name needed!");
     324             : 
     325             :         // find field master
     326           6 :         Reference<XPropertySet> xMaster;
     327           6 :         if (FindFieldMaster(xMaster))
     328             :         {
     329             :             // create field/Service
     330           6 :             Reference<XPropertySet> xPropSet;
     331           6 :             if (CreateField(xPropSet, OUString(sAPI_textfield_prefix) + GetServiceName()))
     332             :             {
     333           6 :                 Reference<XDependentTextField> xDepTextField(xPropSet, UNO_QUERY);
     334           6 :                 if (xDepTextField.is())
     335             :                 {
     336             :                     // attach field to field master
     337           6 :                     xDepTextField->attachTextFieldMaster(xMaster);
     338             : 
     339             :                     // attach field to document
     340           6 :                     Reference<XTextContent> xTextContent(xPropSet, UNO_QUERY);
     341           6 :                     if (xTextContent.is())
     342             :                     {
     343             :                         try {
     344             :                         // insert, set field properties and exit!
     345           6 :                         GetImportHelper().InsertTextContent(xTextContent);
     346           6 :                         PrepareField(xPropSet);
     347           0 :                         } catch (lang::IllegalArgumentException & /*e*/)
     348             :                         {
     349             :                             // ignore e: #i54023#
     350             :                         };
     351          12 :                         return;
     352           0 :                     }
     353           0 :                 }
     354           0 :             }
     355           0 :         }
     356             :     }
     357             : 
     358             :     // above: exit on success; so for all error cases we end up here!
     359             :     // write element content
     360           0 :     GetImportHelper().InsertString(GetContent());
     361             : }
     362             : 
     363           6 : bool XMLSetVarFieldImportContext::FindFieldMaster(
     364             :     Reference<XPropertySet> & xMaster)
     365             : {
     366             :     // currently: delegate to XMLVariableDeclImportContext;
     367             :     // should eventually go here
     368             :     return XMLVariableDeclImportContext::FindFieldMaster(xMaster,
     369           6 :                                                          GetImport(),
     370           6 :                                                          GetImportHelper(),
     371             :                                                          GetName(),
     372          12 :                                                          eFieldType);
     373             : }
     374             : 
     375             : 
     376             : 
     377             : 
     378             : // sequence field
     379             : 
     380             : 
     381           0 : TYPEINIT1( XMLSequenceFieldImportContext, XMLSetVarFieldImportContext );
     382             : 
     383           4 : XMLSequenceFieldImportContext::XMLSequenceFieldImportContext(
     384             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     385             :     sal_uInt16 nPrfx, const OUString& rLocalName) :
     386             :         XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
     387             :                                     nPrfx, rLocalName, VarTypeSequence,
     388             :                                     // formula
     389             :                                     true, true,
     390             :                                     false, false, false, false,
     391             :                                     false,
     392             :                                     false, false, false, true),
     393             : 
     394             :         sPropertyNumberFormat(sAPI_number_format),
     395             :         sPropertySequenceValue(sAPI_sequence_value),
     396             :         sNumFormat(OUString('1')),
     397           4 :         sNumFormatSync(GetXMLToken(XML_FALSE)),
     398           8 :         bRefNameOK(false)
     399             : {
     400           4 : }
     401             : 
     402          16 : void XMLSequenceFieldImportContext::ProcessAttribute(
     403             :     sal_uInt16 nAttrToken, const OUString& sAttrValue )
     404             : {
     405          16 :     switch (nAttrToken)
     406             :     {
     407             :         case XML_TOK_TEXTFIELD_NUM_FORMAT:
     408           4 :             sNumFormat = sAttrValue;
     409           4 :             break;
     410             :         case XML_TOK_TEXTFIELD_NUM_LETTER_SYNC:
     411           0 :             sNumFormatSync = sAttrValue;
     412           0 :             break;
     413             :         case XML_TOK_TEXTFIELD_REF_NAME:
     414           4 :             sRefName = sAttrValue;
     415           4 :             bRefNameOK = true;
     416           4 :             break;
     417             :         default:
     418             :             // delegate to super class (name, formula)
     419             :             XMLSetVarFieldImportContext::ProcessAttribute(nAttrToken,
     420           8 :                                                           sAttrValue);
     421           8 :             break;
     422             :     } // switch
     423          16 : }
     424             : 
     425           4 : void XMLSequenceFieldImportContext::PrepareField(
     426             :     const Reference<XPropertySet> & xPropertySet)
     427             : {
     428             :     // delegate to super class (formula)
     429           4 :     XMLSetVarFieldImportContext::PrepareField(xPropertySet);
     430             : 
     431             :     // set format
     432           4 :     sal_Int16 nNumType = NumberingType::ARABIC;
     433           4 :     GetImport().GetMM100UnitConverter().convertNumFormat( nNumType, sNumFormat, sNumFormatSync );
     434           4 :     Any aAny;
     435           4 :     aAny <<= nNumType;
     436           4 :     xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny);
     437             : 
     438             :     // handle reference name
     439           4 :     if (bRefNameOK)
     440             :     {
     441           4 :         aAny = xPropertySet->getPropertyValue(sPropertySequenceValue);
     442           4 :         sal_Int16 nValue = 0;
     443           4 :         aAny >>= nValue;
     444           4 :         GetImportHelper().InsertSequenceID(sRefName, GetName(), nValue);
     445           4 :     }
     446           4 : }
     447             : 
     448             : 
     449             : 
     450             : 
     451             : // variable set field
     452             : 
     453             : 
     454           0 : TYPEINIT1( XMLVariableSetFieldImportContext, XMLSetVarFieldImportContext );
     455             : 
     456           2 : XMLVariableSetFieldImportContext::XMLVariableSetFieldImportContext(
     457             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     458             :     sal_uInt16 nPrfx, const OUString& rLocalName) :
     459             :         XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
     460             :                                     nPrfx, rLocalName, VarTypeSimple,
     461             :                                     // formula, value&type, style,
     462             :                                     // display none
     463             :                                     true, true,
     464             :                                     false, false, false,
     465             :                                     true, false,
     466             :                                     true, true, true,
     467             :                                     true),
     468           2 :         sPropertySubType(sAPI_sub_type)
     469             : {
     470           2 : }
     471             : 
     472           2 : void XMLVariableSetFieldImportContext::PrepareField(
     473             :         const Reference<XPropertySet> & xPropertySet)
     474             : {
     475             :     // set type
     476           2 :     Any aAny;
     477           2 :     aAny <<= (IsStringValue()? SetVariableType::STRING : SetVariableType::VAR);
     478           2 :     xPropertySet->setPropertyValue(sPropertySubType, aAny);
     479             : 
     480             :     // the remainder is handled by super class
     481           2 :     XMLSetVarFieldImportContext::PrepareField(xPropertySet);
     482           2 : }
     483             : 
     484             : 
     485             : 
     486             : 
     487             : // variable input field
     488             : 
     489             : 
     490           0 : TYPEINIT1( XMLVariableInputFieldImportContext, XMLSetVarFieldImportContext );
     491             : 
     492           0 : XMLVariableInputFieldImportContext::XMLVariableInputFieldImportContext(
     493             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
     494             :     const OUString& rLocalName) :
     495             :         XMLSetVarFieldImportContext(rImport, rHlp, sAPI_set_expression,
     496             :                                     nPrfx, rLocalName, VarTypeSimple,
     497             :                                     // description, display none/formula,
     498             :                                     // value&type, style, formula
     499             :                                     true, true,
     500             :                                     true, true, true,
     501             :                                     true, false,
     502             :                                     true, true, true,
     503             :                                     true),
     504             :         sPropertySubType(sAPI_sub_type),
     505           0 :         sPropertyIsInput(sAPI_is_input)
     506             : {
     507           0 : }
     508             : 
     509           0 : void XMLVariableInputFieldImportContext::PrepareField(
     510             :         const Reference<XPropertySet> & xPropertySet)
     511             : {
     512             :     // set type (input field)
     513           0 :     Any aAny;
     514           0 :     sal_Bool bTrue = sal_True;
     515           0 :     aAny.setValue( &bTrue, ::getBooleanCppuType() );
     516           0 :     xPropertySet->setPropertyValue(sPropertyIsInput, aAny);
     517             : 
     518             :     // set type
     519           0 :     aAny <<= (IsStringValue()? SetVariableType::STRING : SetVariableType::VAR);
     520           0 :     xPropertySet->setPropertyValue(sPropertySubType, aAny);
     521             : 
     522             :     // the remainder is handled by super class
     523           0 :     XMLSetVarFieldImportContext::PrepareField(xPropertySet);
     524           0 : }
     525             : 
     526             : 
     527             : 
     528             : 
     529             : // user field
     530             : 
     531             : 
     532           0 : TYPEINIT1( XMLUserFieldImportContext, XMLSetVarFieldImportContext );
     533             : 
     534           0 : XMLUserFieldImportContext::XMLUserFieldImportContext(
     535             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     536             :     sal_uInt16 nPrfx, const OUString& rLocalName) :
     537             :         XMLSetVarFieldImportContext(rImport, rHlp, sAPI_user, nPrfx,
     538             :                                     rLocalName, VarTypeUserField,
     539             :                                     // display none/formula, style
     540             :                                     false, false,
     541             :                                     false, false, false, true,
     542             :                                     true,
     543             :                                     false, true, false,
     544           0 :                                     false)
     545             : {
     546           0 : }
     547             : 
     548             : 
     549             : 
     550             : 
     551             : // user input field
     552             : 
     553             : 
     554           0 : TYPEINIT1( XMLUserFieldInputImportContext, XMLVarFieldImportContext );
     555             : 
     556             : // bug: doesn't work (SO API lacking)
     557           4 : XMLUserFieldInputImportContext::XMLUserFieldInputImportContext(
     558             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
     559             :     const OUString& rLocalName) :
     560             :         XMLVarFieldImportContext(rImport, rHlp, sAPI_input_user,
     561             :                                  nPrfx, rLocalName,
     562             :                                  // description, style
     563             :                                  false, false,
     564             :                                  true, false, false,
     565             :                                  false, false,
     566             :                                  false /*???*/, true, false,
     567           4 :                                  false)
     568             : {
     569           4 : }
     570             : 
     571           4 : void XMLUserFieldInputImportContext::PrepareField(
     572             :     const Reference<XPropertySet> & xPropertySet)
     573             : {
     574           4 :     Any aAny;
     575           4 :     aAny <<= GetName();
     576           4 :     xPropertySet->setPropertyValue(sPropertyContent, aAny);
     577             : 
     578             :     // delegate to super class
     579           4 :     XMLVarFieldImportContext::PrepareField(xPropertySet);
     580           4 : }
     581             : 
     582             : 
     583             : 
     584             : // variable get field
     585             : 
     586             : 
     587           0 : TYPEINIT1( XMLVariableGetFieldImportContext, XMLVarFieldImportContext );
     588             : 
     589           0 : XMLVariableGetFieldImportContext::XMLVariableGetFieldImportContext(
     590             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     591             :     sal_uInt16 nPrfx, const OUString& rLocalName) :
     592             :         XMLVarFieldImportContext(rImport, rHlp, sAPI_get_expression,
     593             :                                  nPrfx, rLocalName,
     594             :                                  // style, display formula
     595             :                                  false, false,
     596             :                                  false, false, false,
     597             :                                  false, true,
     598             :                                  true, true, false,
     599           0 :                                  true)
     600             : {
     601           0 : }
     602             : 
     603           0 : void XMLVariableGetFieldImportContext::PrepareField(
     604             :         const Reference<XPropertySet> & xPropertySet)
     605             : {
     606             :     // set name
     607           0 :       Any aAny;
     608           0 :     aAny <<= GetName();
     609           0 :     xPropertySet->setPropertyValue(sPropertyContent, aAny);
     610             : 
     611             :     // the remainder is handled by super class
     612           0 :     XMLVarFieldImportContext::PrepareField(xPropertySet);
     613           0 : }
     614             : 
     615             : 
     616             : 
     617             : 
     618             : // expression field
     619             : 
     620             : 
     621           0 : TYPEINIT1( XMLExpressionFieldImportContext, XMLVarFieldImportContext );
     622             : 
     623           0 : XMLExpressionFieldImportContext::XMLExpressionFieldImportContext(
     624             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     625             :     sal_uInt16 nPrfx, const OUString& rLocalName) :
     626             :         XMLVarFieldImportContext(rImport, rHlp, sAPI_get_expression,
     627             :                                  nPrfx, rLocalName,
     628             :                                  // formula, type, style, display formula
     629             :                                  true, true,
     630             :                                  false, false, false,
     631             :                                  false, true,
     632             :                                  true, true, false,
     633             :                                  true),
     634           0 :         sPropertySubType(sAPI_sub_type)
     635             : {
     636           0 :     bValid = true;  // always valid
     637           0 : }
     638             : 
     639             : 
     640           0 : void XMLExpressionFieldImportContext::PrepareField(
     641             :     const Reference<XPropertySet> & xPropertySet)
     642             : {
     643           0 :     sal_Int16 nSubType = SetVariableType::FORMULA;
     644           0 :     Any aAny;
     645           0 :     aAny <<= nSubType;
     646           0 :     xPropertySet->setPropertyValue(sPropertySubType, aAny);
     647             : 
     648             :     // delegate to super class
     649           0 :     XMLVarFieldImportContext::PrepareField(xPropertySet);
     650           0 : }
     651             : 
     652             : 
     653             : 
     654             : 
     655             : // text input field
     656             : 
     657             : 
     658           0 : TYPEINIT1( XMLTextInputFieldImportContext, XMLVarFieldImportContext );
     659             : 
     660          12 : XMLTextInputFieldImportContext::XMLTextInputFieldImportContext(
     661             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     662             :     sal_uInt16 nPrfx, const OUString& sLocalName) :
     663             :         XMLVarFieldImportContext(rImport, rHlp, sAPI_input,
     664             :                                  nPrfx, sLocalName,
     665             :                                  // description
     666             :                                  false, false,
     667             :                                  true, true, true,
     668             :                                  false, false,
     669             :                                  false, false, false,
     670             :                                  false),
     671          12 :         sPropertyContent(sAPI_content)
     672             : {
     673          12 :     bValid = true;  // always valid
     674          12 : }
     675             : 
     676          12 : void XMLTextInputFieldImportContext::PrepareField(
     677             :     const Reference<XPropertySet> & xPropertySet)
     678             : {
     679          12 :     XMLVarFieldImportContext::PrepareField(xPropertySet);
     680             : 
     681          12 :     Any aAny;
     682          12 :     aAny <<= GetContent();
     683          12 :     xPropertySet->setPropertyValue(sPropertyContent, aAny);
     684          12 : }
     685             : 
     686             : 
     687             : 
     688             : // table formula field
     689             : 
     690             : 
     691           0 : TYPEINIT1( XMLTableFormulaImportContext, XMLTextFieldImportContext );
     692             : 
     693           0 : XMLTableFormulaImportContext::XMLTableFormulaImportContext(
     694             :     SvXMLImport& rImport,
     695             :     XMLTextImportHelper& rHlp,
     696             :     sal_uInt16 nPrfx,
     697             :     const OUString& rLocalName) :
     698             :         XMLTextFieldImportContext(rImport, rHlp, sAPI_table_formula,
     699             :                                   nPrfx, rLocalName),
     700             :         sPropertyIsShowFormula("IsShowFormula"),
     701             :         sPropertyCurrentPresentation(
     702             :             "CurrentPresentation"),
     703             :         aValueHelper(rImport, rHlp, false, true, false, true),
     704           0 :         bIsShowFormula(false)
     705             : {
     706           0 : }
     707             : 
     708           0 : XMLTableFormulaImportContext::~XMLTableFormulaImportContext()
     709             : {
     710           0 : }
     711             : 
     712           0 : void XMLTableFormulaImportContext::ProcessAttribute(
     713             :     sal_uInt16 nAttrToken,
     714             :     const OUString& sAttrValue )
     715             : {
     716           0 :     switch (nAttrToken)
     717             :     {
     718             :         case XML_TOK_TEXTFIELD_FORMULA:
     719           0 :             aValueHelper.ProcessAttribute( nAttrToken, sAttrValue );
     720           0 :             bValid = true;  // we need a formula!
     721           0 :             break;
     722             : 
     723             :         case XML_TOK_TEXTFIELD_DATA_STYLE_NAME:
     724           0 :             aValueHelper.ProcessAttribute( nAttrToken, sAttrValue );
     725           0 :             break;
     726             :         case XML_TOK_TEXTFIELD_DISPLAY:
     727           0 :             if ( sAttrValue == "formula" )
     728           0 :                  bIsShowFormula = true;
     729           0 :             break;
     730             :         default:
     731             :             // unknown attribute -> ignore
     732           0 :             break;
     733             :     }
     734           0 : }
     735             : 
     736           0 : void XMLTableFormulaImportContext::PrepareField(
     737             :     const Reference<XPropertySet> & xPropertySet)
     738             : {
     739             :     // set format and formula
     740           0 :     aValueHelper.PrepareField( xPropertySet );
     741             : 
     742           0 :     Any aAny;
     743             : 
     744             :     // set 'show formula' and presentation
     745           0 :     aAny.setValue( &bIsShowFormula, ::getBooleanCppuType() );
     746           0 :     xPropertySet->setPropertyValue( sPropertyIsShowFormula, aAny );
     747             : 
     748           0 :     aAny <<= GetContent();
     749           0 :     xPropertySet->setPropertyValue( sPropertyCurrentPresentation, aAny );
     750           0 : }
     751             : 
     752             : 
     753             : 
     754             : 
     755             : // variable declarations
     756             : 
     757             : // Should be adapted to XMLVarField-/XMLSetVarFieldImportContext scheme!
     758             : 
     759             : 
     760             : 
     761             : 
     762             : 
     763             : // declaration containter import (<variable/user-field/sequence-decls>)
     764             : 
     765             : 
     766           0 : TYPEINIT1( XMLVariableDeclsImportContext, SvXMLImportContext );
     767             : 
     768         320 : XMLVariableDeclsImportContext::XMLVariableDeclsImportContext(
     769             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
     770             :     const OUString& rLocalName, enum VarType eVarType) :
     771             :         SvXMLImportContext(rImport, nPrfx, rLocalName),
     772             :         eVarDeclsContextType(eVarType),
     773         320 :         rImportHelper(rHlp)
     774             : {
     775         320 : }
     776             : 
     777        1276 : SvXMLImportContext* XMLVariableDeclsImportContext::CreateChildContext(
     778             :     sal_uInt16 nPrefix, const OUString& rLocalName,
     779             :     const Reference<xml::sax::XAttributeList> & xAttrList )
     780             : {
     781             :     enum XMLTokenEnum eElementName;
     782        1276 :     SvXMLImportContext* pImportContext = NULL;
     783             : 
     784        1276 :     if( XML_NAMESPACE_TEXT == nPrefix )
     785             :     {
     786        1276 :         switch (eVarDeclsContextType)
     787             :         {
     788             :             case VarTypeSequence:
     789        1228 :                 eElementName = XML_SEQUENCE_DECL;
     790        1228 :                 break;
     791             :             case VarTypeSimple:
     792           2 :                 eElementName = XML_VARIABLE_DECL;
     793           2 :                 break;
     794             :             case VarTypeUserField:
     795          46 :                 eElementName = XML_USER_FIELD_DECL;
     796          46 :                 break;
     797             :             default:
     798             :                 OSL_FAIL("unknown field type!");
     799           0 :                 eElementName = XML_SEQUENCE_DECL;
     800           0 :                 break;
     801             :         }
     802             : 
     803        1276 :         if( IsXMLToken( rLocalName, eElementName ) )
     804             :         {
     805             :             pImportContext = new XMLVariableDeclImportContext(
     806        1276 :                 GetImport(), rImportHelper, nPrefix, rLocalName, xAttrList,
     807        1276 :                 eVarDeclsContextType);
     808             :         }
     809             :     }
     810             : 
     811             :     // if no context was created, use default context
     812        1276 :     if (NULL == pImportContext) {
     813             :         pImportContext = SvXMLImportContext::CreateChildContext(nPrefix,
     814             :                                                                 rLocalName,
     815           0 :                                                                 xAttrList);
     816             :     }
     817             : 
     818        1276 :     return pImportContext;
     819             : }
     820             : 
     821             : 
     822             : 
     823             : 
     824             : // declaration import (<variable/user-field/sequence-decl> elements)
     825             : 
     826             : 
     827           0 : TYPEINIT1( XMLVariableDeclImportContext, SvXMLImportContext );
     828             : 
     829        1276 : XMLVariableDeclImportContext::XMLVariableDeclImportContext(
     830             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp,
     831             :     sal_uInt16 nPrfx, const OUString& rLocalName,
     832             :     const Reference<xml::sax::XAttributeList> & xAttrList,
     833             :     enum VarType eVarType) :
     834             :         SvXMLImportContext(rImport, nPrfx, rLocalName),
     835             :         // bug?? which properties for userfield/userfieldmaster
     836             :         sPropertySubType(sAPI_sub_type),
     837             :         sPropertyNumberingLevel(sAPI_chapter_numbering_level),
     838             :         sPropertyNumberingSeparator(sAPI_numbering_separator),
     839             :         sPropertyIsExpression(sAPI_is_expression),
     840             :         aValueHelper(rImport, rHlp, true, false, true, false),
     841        1276 :         nNumLevel(-1), cSeparationChar('.')
     842             : {
     843        3828 :     if ( (XML_NAMESPACE_TEXT == nPrfx) &&
     844        1324 :          ( ( IsXMLToken( rLocalName, XML_SEQUENCE_DECL )) ||
     845          94 :            ( IsXMLToken( rLocalName, XML_VARIABLE_DECL)) ||
     846          46 :            ( IsXMLToken( rLocalName, XML_USER_FIELD_DECL))    )) {
     847             : 
     848             :         // TODO: check validity (need name!)
     849             : 
     850             :         // parse attributes
     851        1276 :         sal_Int16 nLength = xAttrList->getLength();
     852        3880 :         for(sal_Int16 i=0; i<nLength; i++) {
     853             : 
     854        2604 :             OUString sLocalName;
     855        2604 :             sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
     856        5208 :                 GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
     857             : 
     858             :             sal_uInt16 nToken = rHlp.
     859        2604 :                 GetTextFieldAttrTokenMap().Get(nPrefix, sLocalName);
     860             : 
     861        2604 :             switch (nToken)
     862             :             {
     863             :                 case XML_TOK_TEXTFIELD_NAME:
     864        1276 :                     sName = xAttrList->getValueByIndex(i);
     865        1276 :                     break;
     866             :                 case XML_TOK_TEXTFIELD_NUMBERING_LEVEL:
     867             :                 {
     868             :                     sal_Int32 nLevel;
     869             :                     bool const bRet = ::sax::Converter::convertNumber(
     870        1228 :                         nLevel, xAttrList->getValueByIndex(i), 0,
     871        2456 :                         GetImport().GetTextImport()->GetChapterNumbering()->
     872        2456 :                                                                    getCount());
     873        1228 :                     if (bRet)
     874             :                     {
     875        1228 :                         nNumLevel = static_cast< sal_Int8 >( nLevel-1 ); // API numbers -1..9
     876             :                     }
     877        1228 :                     break;
     878             :                 }
     879             :                 case XML_TOK_TEXTFIELD_NUMBERING_SEPARATOR:
     880             :                     cSeparationChar =
     881           6 :                         (sal_Char)xAttrList->getValueByIndex(i).toChar();
     882           6 :                     break;
     883             : 
     884             :                 default:
     885             :                     // delegate to value helper
     886             :                     aValueHelper.ProcessAttribute(nToken,
     887          94 :                                                   xAttrList->getValueByIndex(i));
     888          94 :                     break;
     889             :             }
     890        2604 :         }
     891             : 
     892        1276 :         Reference<XPropertySet> xFieldMaster;
     893        1276 :         if (FindFieldMaster(xFieldMaster, GetImport(), rHlp,
     894        1276 :                             sName, eVarType))
     895             :         {
     896             :             // now we have a field master: process attributes!
     897        1276 :             Any aAny;
     898             : 
     899        1276 :             switch (eVarType)
     900             :             {
     901             :             case VarTypeSequence:
     902        1228 :                 aAny <<= nNumLevel;
     903        1228 :                 xFieldMaster->setPropertyValue(sPropertyNumberingLevel, aAny);
     904             : 
     905        1228 :                 if (nNumLevel >= 0)
     906             :                 {
     907           6 :                     OUString sStr(&cSeparationChar, 1);
     908           6 :                     aAny <<= sStr;
     909           6 :                     xFieldMaster->setPropertyValue(
     910           6 :                         sPropertyNumberingSeparator, aAny);
     911             :                 }
     912        1228 :                 break;
     913             :             case VarTypeSimple:
     914             :                 {
     915             :                     // set string or non-string SubType (#93192#)
     916             :                     // The SubType was already set in the FindFieldMaster
     917             :                     // method, but it needs to be adjusted if it's a string.
     918           2 :                     aAny <<= aValueHelper.IsStringValue()
     919           2 :                         ? SetVariableType::STRING : SetVariableType::VAR;
     920           2 :                     xFieldMaster->setPropertyValue(sPropertySubType, aAny);
     921             :                 }
     922           2 :                 break;
     923             :             case VarTypeUserField:
     924             :             {
     925          46 :                 sal_Bool bTmp = !aValueHelper.IsStringValue();
     926          46 :                 aAny.setValue(&bTmp, ::getBooleanCppuType());
     927          46 :                 xFieldMaster->setPropertyValue(sPropertyIsExpression, aAny);
     928          46 :                 aValueHelper.PrepareField(xFieldMaster);
     929          46 :                 break;
     930             :             }
     931             :             default:
     932             :                 OSL_FAIL("unknown varfield type");
     933        1276 :             } // switch
     934        1276 :         } // else: no field master found/constructed
     935             :     } // else: no sequence-decl
     936        1276 : }
     937             : 
     938             : 
     939             : 
     940        1282 : bool XMLVariableDeclImportContext::FindFieldMaster(
     941             :     Reference<XPropertySet> & xMaster, SvXMLImport& rImport,
     942             :     XMLTextImportHelper& rImportHelper,
     943             :     const OUString& sVarName, enum VarType eVarType)
     944             : {
     945             :     static sal_Int32 nCollisionCount = 0;
     946             : 
     947             :     // rename field
     948             :     // currently: no family in use! Use 0.
     949        1282 :     OUString sName = rImportHelper.GetRenameMap().Get(
     950        2564 :         sal::static_int_cast< sal_uInt16 >(eVarType), sVarName);
     951             : 
     952             :     // get text fields supplier and field masters
     953        1282 :     Reference<XTextFieldsSupplier> xTextFieldsSupp(rImport.GetModel(),
     954        2564 :                                                    UNO_QUERY);
     955             :     Reference<container::XNameAccess> xFieldMasterNameAccess(
     956        2564 :         xTextFieldsSupp->getTextFieldMasters(), UNO_QUERY);
     957             : 
     958        2564 :     OUStringBuffer sBuffer;
     959        1282 :     sBuffer.appendAscii(sAPI_fieldmaster_prefix);
     960        1282 :     sBuffer.appendAscii(sAPI_set_expression);
     961        1282 :     sBuffer.appendAscii(".");
     962        1282 :     sBuffer.append(sName);
     963        2564 :     OUString sVarServiceName = sBuffer.makeStringAndClear();
     964             : 
     965        1282 :     sBuffer.appendAscii(sAPI_fieldmaster_prefix);
     966        1282 :     sBuffer.appendAscii(sAPI_user);
     967        1282 :     sBuffer.appendAscii(".");
     968        1282 :     sBuffer.append(sName);
     969        2564 :     OUString sUserServiceName = sBuffer.makeStringAndClear();
     970             : 
     971        1282 :     if (xFieldMasterNameAccess->hasByName(sVarServiceName)) {
     972             :         // variable field master already in document
     973             : 
     974        1230 :         Any aAny = xFieldMasterNameAccess->getByName(sVarServiceName);
     975        1230 :         aAny >>= xMaster;
     976             : 
     977        3690 :         aAny = xMaster->getPropertyValue(
     978             :             // sPropertySubType
     979             :             OUString(sAPI_sub_type)
     980        2460 :             );
     981        1230 :         sal_Int16 nType = 0;
     982        1230 :         aAny >>= nType;
     983             : 
     984             :         enum VarType eFMVarType =
     985        1230 :             (SetVariableType::SEQUENCE == nType) ?
     986        1230 :                 VarTypeSequence : VarTypeSimple;
     987             : 
     988        1230 :         if (eFMVarType != eVarType)
     989             :         {
     990           0 :             OUString sNew;
     991             : 
     992             :             // FIXME! can't find if name is taken already!!!!
     993             : 
     994           0 :             nCollisionCount++;
     995           0 :             OUStringBuffer aBuf;
     996           0 :             aBuf.append(sName);
     997           0 :             aBuf.appendAscii("_renamed_");
     998           0 :             aBuf.append(nCollisionCount);
     999           0 :             sNew = aBuf.makeStringAndClear();
    1000             : 
    1001           0 :             rImportHelper.GetRenameMap().Add(
    1002           0 :                 sal::static_int_cast< sal_uInt16 >(eVarType), sName, sNew);
    1003             : 
    1004             :             // call FindFieldMaster recursively to create new master
    1005             :             return FindFieldMaster(xMaster, rImport, rImportHelper,
    1006           0 :                                    sNew, eVarType);
    1007        1230 :         }
    1008          52 :     } else if (xFieldMasterNameAccess->hasByName(sUserServiceName)) {
    1009             :         // user field: get field master
    1010           0 :         Any aAny = xFieldMasterNameAccess->getByName(sUserServiceName);
    1011           0 :         aAny >>= xMaster;
    1012             : 
    1013           0 :         if (VarTypeUserField != eVarType) {
    1014             :             // find new name that is not taken
    1015           0 :             OUString sNew;
    1016             : 
    1017             :             // FIXME! can't find if name is taken already!!!!
    1018             : 
    1019           0 :             nCollisionCount++;
    1020           0 :             OUStringBuffer aBuf;
    1021           0 :             aBuf.append(sName);
    1022           0 :             aBuf.appendAscii("_renamed_");
    1023           0 :             aBuf.append(nCollisionCount);
    1024           0 :             sNew = aBuf.makeStringAndClear();
    1025             : 
    1026           0 :             rImportHelper.GetRenameMap().Add(
    1027           0 :                 sal::static_int_cast< sal_uInt16 >(eVarType), sName, sNew);
    1028             : 
    1029             :             // call FindFieldMaster recursively to create new master
    1030             :             return FindFieldMaster(xMaster, rImport, rImportHelper,
    1031           0 :                                    sNew, eVarType);
    1032           0 :         }
    1033             :     } else {
    1034             :         // field name not used: create field master
    1035             : 
    1036             :         // import -> model is MultiServiceFactory -> createInstance
    1037             :         Reference<lang::XMultiServiceFactory>
    1038          52 :             xFactory(rImport.GetModel(),UNO_QUERY);
    1039          52 :         if( xFactory.is() ) {
    1040             : 
    1041          52 :             OUStringBuffer sService;
    1042          52 :             sService.appendAscii(sAPI_fieldmaster_prefix);
    1043             :             sService.appendAscii((eVarType==VarTypeUserField) ?
    1044          52 :                                  sAPI_user : sAPI_set_expression);
    1045             :             Reference<XInterface> xIfc =
    1046         104 :                 xFactory->createInstance( sService.makeStringAndClear() );
    1047          52 :             if (xIfc.is()) {
    1048          52 :                 Reference<XPropertySet> xTmp( xIfc, UNO_QUERY );
    1049          52 :                 xMaster = xTmp;
    1050             : 
    1051             :                 // set name
    1052         104 :                 Any aAny;
    1053          52 :                 aAny <<= sName;
    1054          52 :                 xMaster->setPropertyValue(
    1055             :                     // sPropertyName
    1056             :                     OUString(sAPI_name)
    1057          52 :                     , aAny);
    1058             : 
    1059          52 :                 if (eVarType != VarTypeUserField) {
    1060             :                     // set subtype for setexp field
    1061             : 
    1062           6 :                     aAny <<= ((eVarType == VarTypeSimple) ?
    1063             :                               SetVariableType::VAR :
    1064           6 :                               SetVariableType::SEQUENCE);
    1065           6 :                     xMaster->setPropertyValue(
    1066             :                         // sPropertySubType
    1067             :                         OUString(sAPI_sub_type)
    1068           6 :                         , aAny);
    1069          52 :                 } // else : user field: no subtype
    1070             : 
    1071             :             } else {
    1072           0 :                 return false;
    1073          52 :             }
    1074             :         } else {
    1075           0 :             return false;
    1076          52 :         }
    1077             :     }
    1078             : 
    1079             :     DBG_ASSERT(xMaster.is(), "no field master found!?!");
    1080        2564 :     return true;
    1081             : }
    1082             : 
    1083             : 
    1084             : 
    1085             : // Database Display field import
    1086             : 
    1087             : 
    1088             : 
    1089           0 : TYPEINIT1( XMLDatabaseDisplayImportContext, XMLDatabaseFieldImportContext );
    1090             : 
    1091          32 : XMLDatabaseDisplayImportContext::XMLDatabaseDisplayImportContext(
    1092             :     SvXMLImport& rImport, XMLTextImportHelper& rHlp, sal_uInt16 nPrfx,
    1093             :     const OUString& rLocalName) :
    1094             :         XMLDatabaseFieldImportContext(rImport, rHlp, sAPI_database,
    1095             :                                       nPrfx, rLocalName, false),
    1096             :         sPropertyColumnName(sAPI_data_column_name),
    1097             :         sPropertyDatabaseFormat(sAPI_is_data_base_format),
    1098             :         sPropertyCurrentPresentation(sAPI_current_presentation),
    1099             :         sPropertyIsVisible(sAPI_is_visible),
    1100             :         aValueHelper(rImport, rHlp, false, true, false, false),
    1101             :         bColumnOK(false),
    1102             :         bDisplay( true ),
    1103          32 :         bDisplayOK( false )
    1104             : {
    1105          32 : }
    1106             : 
    1107         128 : void XMLDatabaseDisplayImportContext::ProcessAttribute(
    1108             :     sal_uInt16 nAttrToken, const OUString& sAttrValue )
    1109             : {
    1110         128 :     switch (nAttrToken)
    1111             :     {
    1112             :         case XML_TOK_TEXTFIELD_COLUMN_NAME:
    1113          32 :             sColumnName = sAttrValue;
    1114          32 :             bColumnOK = true;
    1115          32 :             break;
    1116             :         case XML_TOK_TEXTFIELD_DISPLAY:
    1117             :             {
    1118           0 :                 bool bNone = IsXMLToken( sAttrValue, XML_NONE );
    1119           0 :                 bool bValue = IsXMLToken( sAttrValue, XML_VALUE );
    1120           0 :                 bDisplay = bValue;
    1121           0 :                 bDisplayOK = bNone || bValue;
    1122             :             }
    1123           0 :             break;
    1124             :         case XML_TOK_TEXTFIELD_DATABASE_NAME:
    1125             :         case XML_TOK_TEXTFIELD_TABLE_NAME:
    1126             :         case XML_TOK_TEXTFIELD_TABLE_TYPE:
    1127             :             // handled by super class
    1128             :             XMLDatabaseFieldImportContext::ProcessAttribute(nAttrToken,
    1129          96 :                                                             sAttrValue);
    1130          96 :             break;
    1131             :         default:
    1132             :             // remainder handled by value helper
    1133           0 :             aValueHelper.ProcessAttribute(nAttrToken, sAttrValue);
    1134           0 :             break;
    1135             :     }
    1136             : 
    1137         128 :     bValid = bTableOK && bDatabaseOK && bColumnOK;
    1138         128 : }
    1139             : 
    1140          32 : void XMLDatabaseDisplayImportContext::EndElement()
    1141             : {
    1142             :     // we have an EndElement of our own, because database fields need
    1143             :     // to be attached to a field master before they can be inserted into
    1144             :     // the document. Database stuff (database, table, column) all goes
    1145             :     // to the field master, value & style go to the field.
    1146             : 
    1147          32 :     if (bValid)
    1148             :     {
    1149             : 
    1150             :         // so here goes: we start with the master
    1151          32 :         Reference<XPropertySet> xMaster;
    1152             : 
    1153             :         // create and prepare field master first
    1154          64 :         if (CreateField(xMaster,
    1155             :                         OUString(
    1156          64 :                             sAPI_fieldmaster_database)))
    1157             :         {
    1158          32 :             Any aAny;
    1159          32 :             aAny <<= sColumnName;
    1160          32 :             xMaster->setPropertyValue(sPropertyColumnName, aAny);
    1161             : 
    1162             :             // fieldmaster takes database, table and column name
    1163          32 :             XMLDatabaseFieldImportContext::PrepareField(xMaster);
    1164             : 
    1165             :             // create field
    1166          32 :             Reference<XPropertySet> xField;
    1167          64 :             if (CreateField(xField,
    1168             :                             OUString(
    1169          64 :                                 sAPI_database)))
    1170             :             {
    1171             :                 // attach field master
    1172          32 :                 Reference<XDependentTextField> xDepField(xField, UNO_QUERY);
    1173          32 :                 if (xDepField.is())
    1174             :                 {
    1175             :                     // attach field to field master
    1176          32 :                     xDepField->attachTextFieldMaster(xMaster);
    1177             : 
    1178             :                     // attach field to document
    1179          32 :                     Reference<XTextContent> xTextContent(xField, UNO_QUERY);
    1180          32 :                     if (xTextContent.is())
    1181             :                     {
    1182             :                         // insert, set field properties and exit!
    1183          32 :                         GetImportHelper().InsertTextContent(xTextContent);
    1184             : 
    1185             :                         // prepare field: format from database?
    1186          32 :                         sal_Bool bTmp = !aValueHelper.IsFormatOK();
    1187          32 :                         aAny.setValue( &bTmp, ::getBooleanCppuType() );
    1188          32 :                         xField->setPropertyValue(sPropertyDatabaseFormat,aAny);
    1189             : 
    1190             :                         // value, value-type and format done by value helper
    1191          32 :                         aValueHelper.PrepareField(xField);
    1192             : 
    1193             :                         // visibility
    1194          32 :                         if( bDisplayOK )
    1195             :                         {
    1196           0 :                             aAny.setValue( &bDisplay, ::getBooleanCppuType() );
    1197           0 :                             xField->setPropertyValue(sPropertyIsVisible, aAny);
    1198             :                         }
    1199             : 
    1200             :                         // set presentation
    1201          32 :                         aAny <<= GetContent();
    1202          32 :                         xField->setPropertyValue(sPropertyCurrentPresentation,
    1203          32 :                                                     aAny);
    1204             : 
    1205             :                         // success!
    1206          64 :                         return;
    1207           0 :                     }
    1208           0 :                 }
    1209           0 :             }
    1210           0 :         }
    1211             :     }
    1212             : 
    1213             :     // above: exit on success; so for all error cases we end up here!
    1214             :     // write element content
    1215           0 :     GetImportHelper().InsertString(GetContent());
    1216             : }
    1217             : 
    1218             : 
    1219             : 
    1220             : // value import helper
    1221             : 
    1222             : 
    1223             : enum ValueType
    1224             : {
    1225             :     XML_VALUE_TYPE_STRING,
    1226             :     XML_VALUE_TYPE_FLOAT,
    1227             :     XML_VALUE_TYPE_CURRENCY,
    1228             :     XML_VALUE_TYPE_PERCENTAGE,
    1229             :     XML_VALUE_TYPE_DATE,
    1230             :     XML_VALUE_TYPE_TIME,
    1231             :     XML_VALUE_TYPE_BOOLEAN
    1232             : };
    1233             : 
    1234             : static SvXMLEnumMapEntry const aValueTypeMap[] =
    1235             : {
    1236             :     { XML_FLOAT,        XML_VALUE_TYPE_FLOAT },
    1237             :     { XML_CURRENCY,     XML_VALUE_TYPE_CURRENCY },
    1238             :     { XML_PERCENTAGE,   XML_VALUE_TYPE_PERCENTAGE },
    1239             :     { XML_DATE,         XML_VALUE_TYPE_DATE },
    1240             :     { XML_TIME,         XML_VALUE_TYPE_TIME },
    1241             :     { XML_BOOLEAN,      XML_VALUE_TYPE_BOOLEAN },
    1242             :     { XML_STRING,       XML_VALUE_TYPE_STRING },
    1243             :     { XML_TOKEN_INVALID, 0 }
    1244             : };
    1245             : 
    1246        1330 : XMLValueImportHelper::XMLValueImportHelper(
    1247             :     SvXMLImport& rImprt,
    1248             :     XMLTextImportHelper& rHlp,
    1249             :     bool bType, bool bStyle, bool bValue, bool bFormula) :
    1250             :         sPropertyContent(sAPI_content),
    1251             :         sPropertyValue(sAPI_value),
    1252             :         sPropertyNumberFormat(sAPI_number_format),
    1253             :         sPropertyIsFixedLanguage(sAPI_is_fixed_language),
    1254             : 
    1255             :         rImport(rImprt),
    1256             :         rHelper(rHlp),
    1257             : 
    1258             :         fValue(0.0),
    1259             :         nFormatKey(0),
    1260             :         bIsDefaultLanguage(true),
    1261             : 
    1262             :         bStringType(false),
    1263             :         bFormatOK(false),
    1264             :         bTypeOK(false),
    1265             :         bStringValueOK(false),
    1266             :         bFloatValueOK(false),
    1267             :         bFormulaOK(false),
    1268             : 
    1269             :         bSetType(bType),
    1270             :         bSetValue(bValue),
    1271             :         bSetStyle(bStyle),
    1272             :         bSetFormula(bFormula),
    1273             : 
    1274             :         bStringDefault(true),
    1275        1330 :         bFormulaDefault(true)
    1276             : {
    1277        1330 : }
    1278             : 
    1279        1330 : XMLValueImportHelper::~XMLValueImportHelper()
    1280             : {
    1281        1330 : }
    1282             : 
    1283          96 : void XMLValueImportHelper::ProcessAttribute(
    1284             :     sal_uInt16 nAttrToken, const OUString& sAttrValue )
    1285             : {
    1286          96 :     switch (nAttrToken)
    1287             :     {
    1288             :         case XML_TOK_TEXTFIELD_VALUE_TYPE:
    1289             :         {
    1290             :             // convert enum
    1291          50 :             sal_uInt16 nTmp = 0;
    1292             :             bool bRet = SvXMLUnitConverter::convertEnum(
    1293          50 :                 nTmp, sAttrValue, aValueTypeMap);
    1294             : 
    1295          50 :             if (bRet) {
    1296          50 :                 ValueType eValueType = (ValueType)nTmp;
    1297             : 
    1298          50 :                 bTypeOK = true;
    1299             : 
    1300          50 :                 switch (eValueType)
    1301             :                 {
    1302             :                     case XML_VALUE_TYPE_STRING:
    1303          50 :                         bStringType = true;
    1304          50 :                         break;
    1305             :                     case XML_VALUE_TYPE_FLOAT:
    1306             :                     case XML_VALUE_TYPE_CURRENCY:
    1307             :                     case XML_VALUE_TYPE_PERCENTAGE:
    1308             :                     case XML_VALUE_TYPE_DATE:
    1309             :                     case XML_VALUE_TYPE_TIME:
    1310             :                     case XML_VALUE_TYPE_BOOLEAN:
    1311           0 :                         bStringType = false;
    1312           0 :                         break;
    1313             : 
    1314             :                     default:
    1315             :                         OSL_FAIL("unknown value type");
    1316           0 :                         bTypeOK = false;
    1317             :                 }
    1318             :             }
    1319          50 :             break;
    1320             :         }
    1321             : 
    1322             :         case XML_TOK_TEXTFIELD_VALUE:
    1323             :         {
    1324             :             double fTmp;
    1325           0 :             bool const bRet = ::sax::Converter::convertDouble(fTmp,sAttrValue);
    1326           0 :             if (bRet) {
    1327           0 :                 bFloatValueOK = true;
    1328           0 :                 fValue = fTmp;
    1329             :             }
    1330           0 :             break;
    1331             :         }
    1332             : 
    1333             :         case XML_TOK_TEXTFIELD_TIME_VALUE:
    1334             :         {
    1335             :             double fTmp;
    1336             :             bool const bRet =
    1337           0 :                 ::sax::Converter::convertDuration(fTmp, sAttrValue);
    1338           0 :             if (bRet) {
    1339           0 :                 bFloatValueOK = true;
    1340           0 :                 fValue = fTmp;
    1341             :             }
    1342           0 :             break;
    1343             :         }
    1344             : 
    1345             :         case XML_TOK_TEXTFIELD_DATE_VALUE:
    1346             :         {
    1347             :             double fTmp;
    1348           0 :             bool bRet = rImport.GetMM100UnitConverter().
    1349           0 :                 convertDateTime(fTmp,sAttrValue);
    1350           0 :             if (bRet) {
    1351           0 :                 bFloatValueOK = true;
    1352           0 :                 fValue = fTmp;
    1353             :             }
    1354           0 :             break;
    1355             :         }
    1356             : 
    1357             :         case XML_TOK_TEXTFIELD_BOOL_VALUE:
    1358             :         {
    1359           0 :             bool bTmp(false);
    1360           0 :             bool bRet = ::sax::Converter::convertBool(bTmp, sAttrValue);
    1361           0 :             if (bRet) {
    1362           0 :                 bFloatValueOK = true;
    1363           0 :                 fValue = (bTmp ? 1.0 : 0.0);
    1364             :             }
    1365             :             else
    1366             :             {
    1367             :                 double fTmp;
    1368           0 :                 bRet = ::sax::Converter::convertDouble(fTmp, sAttrValue);
    1369           0 :                 if (bRet) {
    1370           0 :                     bFloatValueOK = true;
    1371           0 :                     fValue = fTmp;
    1372             :                 }
    1373             :             }
    1374           0 :             break;
    1375             :         }
    1376             : 
    1377             :         case XML_TOK_TEXTFIELD_STRING_VALUE:
    1378          46 :             sValue = sAttrValue;
    1379          46 :             bStringValueOK = true;
    1380          46 :             break;
    1381             : 
    1382             :         case XML_TOK_TEXTFIELD_FORMULA:
    1383             :             {
    1384           0 :                 OUString sTmp;
    1385           0 :                 sal_uInt16 nPrefix = rImport.GetNamespaceMap().
    1386           0 :                         _GetKeyByAttrName( sAttrValue, &sTmp, false );
    1387           0 :                 if( XML_NAMESPACE_OOOW == nPrefix )
    1388             :                 {
    1389           0 :                     sFormula = sTmp;
    1390           0 :                     bFormulaOK = true;
    1391             :                 }
    1392             :                 else
    1393           0 :                     sFormula = sAttrValue;
    1394             :             }
    1395           0 :             break;
    1396             : 
    1397             :         case XML_TOK_TEXTFIELD_DATA_STYLE_NAME:
    1398             :         {
    1399             :             sal_Int32 nKey = rHelper.GetDataStyleKey(
    1400           0 :                                           sAttrValue, &bIsDefaultLanguage);
    1401           0 :             if (-1 != nKey)
    1402             :             {
    1403           0 :                 nFormatKey = nKey;
    1404           0 :                 bFormatOK = true;
    1405             :             }
    1406           0 :             break;
    1407             :         }
    1408             :     } // switch
    1409          96 : }
    1410             : 
    1411         100 : void XMLValueImportHelper::PrepareField(
    1412             :     const Reference<XPropertySet> & xPropertySet)
    1413             : {
    1414         100 :     Any aAny;
    1415             : 
    1416         100 :     if (bSetType)
    1417             :     {
    1418             :         // ??? how to set type?
    1419             :     }
    1420             : 
    1421         100 :     if (bSetFormula)
    1422             :     {
    1423           0 :         aAny <<= (!bFormulaOK && bFormulaDefault) ? sDefault : sFormula;
    1424           0 :         xPropertySet->setPropertyValue(sPropertyContent, aAny);
    1425             :     }
    1426             : 
    1427             :     // format/style
    1428         100 :     if (bSetStyle && bFormatOK)
    1429             :     {
    1430           0 :         aAny <<= nFormatKey;
    1431           0 :         xPropertySet->setPropertyValue(sPropertyNumberFormat, aAny);
    1432             : 
    1433           0 :         if( xPropertySet->getPropertySetInfo()->
    1434           0 :                 hasPropertyByName( sPropertyIsFixedLanguage ) )
    1435             :         {
    1436           0 :             sal_Bool bIsFixedLanguage = ! bIsDefaultLanguage;
    1437           0 :             aAny.setValue( &bIsFixedLanguage, ::getBooleanCppuType() );
    1438           0 :             xPropertySet->setPropertyValue( sPropertyIsFixedLanguage, aAny );
    1439             :         }
    1440             :     }
    1441             : 
    1442             :     // value: string or float
    1443         100 :     if (bSetValue)
    1444             :     {
    1445          48 :         if (bStringType)
    1446             :         {
    1447          48 :             aAny <<= (!bStringValueOK && bStringDefault) ? sDefault : sValue;
    1448          48 :             xPropertySet->setPropertyValue(sPropertyContent, aAny);
    1449             :         }
    1450             :         else
    1451             :         {
    1452           0 :             aAny <<= fValue;
    1453           0 :             xPropertySet->setPropertyValue(sPropertyValue, aAny);
    1454             :         }
    1455         100 :     }
    1456         100 : }
    1457             : 
    1458             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10