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

Generated by: LCOV version 1.11