LCOV - code coverage report
Current view: top level - sw/source/core/fields - dbfld.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 173 440 39.3 %
Date: 2014-11-03 Functions: 29 74 39.2 %
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             : #include <float.h>
      21             : #include <sfx2/app.hxx>
      22             : #include <svl/zforlist.hxx>
      23             : #include <svx/pageitem.hxx>
      24             : #include <svx/dataaccessdescriptor.hxx>
      25             : #include <com/sun/star/sdbc/DataType.hpp>
      26             : #include <fmtfld.hxx>
      27             : #include <txtfld.hxx>
      28             : #include <doc.hxx>
      29             : #include <IDocumentFieldsAccess.hxx>
      30             : #include <docary.hxx>
      31             : #include <frame.hxx>
      32             : #include <fldbas.hxx>
      33             : #include <pam.hxx>
      34             : #include <ndtxt.hxx>
      35             : #include <dbfld.hxx>
      36             : #include <dbmgr.hxx>
      37             : #include <docfld.hxx>
      38             : #include <expfld.hxx>
      39             : #include <txtatr.hxx>
      40             : #include <unofldmid.h>
      41             : #include <switerator.hxx>
      42             : 
      43             : using namespace ::com::sun::star::sdbc;
      44             : using namespace ::com::sun::star;
      45             : 
      46             : /// replace database separator by dots for display
      47         314 : static OUString lcl_DBTrennConv(const OUString& aContent)
      48             : {
      49         314 :     return aContent.replaceAll(OUString(DB_DELIM), OUString('.'));
      50             : }
      51             : 
      52             : // database field type
      53             : 
      54         120 : SwDBFieldType::SwDBFieldType(SwDoc* pDocPtr, const OUString& rNam, const SwDBData& rDBData ) :
      55             :     SwValueFieldType( pDocPtr, RES_DBFLD ),
      56             :     aDBData(rDBData),
      57             :     sName(rNam),
      58             :     sColumn(rNam),
      59         120 :     nRefCnt(0)
      60             : {
      61         120 :     if(!aDBData.sDataSource.isEmpty() || !aDBData.sCommand.isEmpty())
      62             :     {
      63         232 :         sName = aDBData.sDataSource
      64         232 :             + OUString(DB_DELIM)
      65         348 :             + aDBData.sCommand
      66         464 :             + OUString(DB_DELIM)
      67         464 :             + sName;
      68             :     }
      69         120 : }
      70             : 
      71         198 : SwDBFieldType::~SwDBFieldType()
      72             : {
      73         198 : }
      74             : 
      75          78 : SwFieldType* SwDBFieldType::Copy() const
      76             : {
      77          78 :     SwDBFieldType* pTmp = new SwDBFieldType(GetDoc(), sColumn, aDBData);
      78          78 :     return pTmp;
      79             : }
      80             : 
      81         550 : OUString SwDBFieldType::GetName() const
      82             : {
      83         550 :     return sName;
      84             : }
      85             : 
      86         324 : void SwDBFieldType::ReleaseRef()
      87             : {
      88             :     OSL_ENSURE(nRefCnt > 0, "RefCount < 0!");
      89             : 
      90         324 :     if (--nRefCnt <= 0)
      91             :     {
      92          76 :         sal_uInt16 nPos = GetDoc()->getIDocumentFieldsAccess().GetFldTypes()->GetPos(this);
      93             : 
      94          76 :         if (nPos != USHRT_MAX)
      95             :         {
      96          50 :             GetDoc()->getIDocumentFieldsAccess().RemoveFldType(nPos);
      97          50 :             delete this;
      98             :         }
      99             :     }
     100         324 : }
     101             : 
     102          94 : bool SwDBFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     103             : {
     104          94 :     switch( nWhichId )
     105             :     {
     106             :     case FIELD_PROP_PAR1:
     107          24 :         rAny <<= aDBData.sDataSource;
     108          24 :         break;
     109             :     case FIELD_PROP_PAR2:
     110          22 :         rAny <<= aDBData.sCommand;
     111          22 :         break;
     112             :     case FIELD_PROP_PAR3:
     113          22 :         rAny <<= sColumn;
     114          22 :         break;
     115             :     case FIELD_PROP_SHORT1:
     116          26 :         rAny <<= aDBData.nCommandType;
     117          26 :         break;
     118             :     default:
     119             :         OSL_FAIL("illegal property");
     120             :     }
     121          94 :     return true;
     122             : }
     123             : 
     124          42 : bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     125             : {
     126          42 :     switch( nWhichId )
     127             :     {
     128             :     case FIELD_PROP_PAR1:
     129           2 :         rAny >>= aDBData.sDataSource;
     130           2 :         break;
     131             :     case FIELD_PROP_PAR2:
     132           2 :         rAny >>= aDBData.sCommand;
     133           2 :         break;
     134             :     case FIELD_PROP_PAR3:
     135             :         {
     136           2 :             OUString sTmp;
     137           2 :             rAny >>= sTmp;
     138           2 :             if( sTmp != sColumn )
     139             :             {
     140           2 :                 sColumn = sTmp;
     141           2 :                 SwIterator<SwFmtFld,SwFieldType> aIter( *this );
     142           2 :                 SwFmtFld* pFmtFld = aIter.First();
     143           4 :                 while(pFmtFld)
     144             :                 {
     145             :                     // field in Undo?
     146           0 :                     SwTxtFld *pTxtFld = pFmtFld->GetTxtFld();
     147           0 :                     if(pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
     148             :                     {
     149           0 :                         SwDBField* pDBField = (SwDBField*)pFmtFld->GetField();
     150           0 :                         pDBField->ClearInitialized();
     151           0 :                         pDBField->InitContent();
     152             :                     }
     153           0 :                     pFmtFld = aIter.Next();
     154           2 :                 }
     155           2 :             }
     156             :         }
     157           2 :         break;
     158             :     case FIELD_PROP_SHORT1:
     159          36 :         rAny >>= aDBData.nCommandType;
     160          36 :         break;
     161             :     default:
     162             :         OSL_FAIL("illegal property");
     163             :     }
     164          42 :     return true;
     165             : }
     166             : 
     167             : // database field
     168             : 
     169         282 : SwDBField::SwDBField(SwDBFieldType* pTyp, sal_uLong nFmt)
     170             :     :   SwValueField(pTyp, nFmt),
     171             :         nSubType(0),
     172             :         bIsInBodyTxt(true),
     173             :         bValidValue(false),
     174         282 :         bInitialized(false)
     175             : {
     176         282 :     if (GetTyp())
     177         282 :         ((SwDBFieldType*)GetTyp())->AddRef();
     178         282 :     InitContent();
     179         282 : }
     180             : 
     181         846 : SwDBField::~SwDBField()
     182             : {
     183         282 :     if (GetTyp())
     184         282 :         ((SwDBFieldType*)GetTyp())->ReleaseRef();
     185         564 : }
     186             : 
     187         282 : void SwDBField::InitContent()
     188             : {
     189         282 :     if (!IsInitialized())
     190             :     {
     191         282 :         aContent = "<" + ((const SwDBFieldType*)GetTyp())->GetColumnName() + ">";
     192             :     }
     193         282 : }
     194             : 
     195          42 : void SwDBField::InitContent(const OUString& rExpansion)
     196             : {
     197          42 :     if (rExpansion.startsWith("<") && rExpansion.endsWith(">"))
     198             :     {
     199           0 :         const OUString sColumn( rExpansion.copy( 1, rExpansion.getLength() - 2 ) );
     200           0 :         if( ::GetAppCmpStrIgnore().isEqual( sColumn,
     201           0 :                         ((SwDBFieldType *)GetTyp())->GetColumnName() ))
     202             :         {
     203           0 :             InitContent();
     204          42 :             return;
     205           0 :         }
     206             :     }
     207          42 :     SetExpansion( rExpansion );
     208             : }
     209             : 
     210         324 : OUString SwDBField::Expand() const
     211             : {
     212         324 :     if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
     213         312 :         return lcl_DBTrennConv(aContent);
     214          12 :     return OUString();
     215             : }
     216             : 
     217         240 : SwField* SwDBField::Copy() const
     218             : {
     219         240 :     SwDBField *pTmp = new SwDBField((SwDBFieldType*)GetTyp(), GetFormat());
     220         240 :     pTmp->aContent      = aContent;
     221         240 :     pTmp->bIsInBodyTxt  = bIsInBodyTxt;
     222         240 :     pTmp->bValidValue   = bValidValue;
     223         240 :     pTmp->bInitialized  = bInitialized;
     224         240 :     pTmp->nSubType      = nSubType;
     225         240 :     pTmp->SetValue(GetValue());
     226         240 :     pTmp->sFieldCode = sFieldCode;
     227             : 
     228         240 :     return pTmp;
     229             : }
     230             : 
     231           2 : OUString SwDBField::GetFieldName() const
     232             : {
     233           2 :     const OUString rDBName = static_cast<SwDBFieldType*>(GetTyp())->GetName();
     234             : 
     235           4 :     OUString sContent( rDBName.getToken(0, DB_DELIM) );
     236             : 
     237           2 :     if (sContent.getLength() > 1)
     238             :     {
     239             :         sContent += OUString(DB_DELIM)
     240           4 :             + rDBName.getToken(1, DB_DELIM)
     241           8 :             + OUString(DB_DELIM)
     242           6 :             + rDBName.getToken(2, DB_DELIM);
     243             :     }
     244           4 :     return lcl_DBTrennConv(sContent);
     245             : }
     246             : 
     247           0 : void SwDBField::ChgValue( double d, bool bVal )
     248             : {
     249           0 :     bValidValue = bVal;
     250           0 :     SetValue(d);
     251             : 
     252           0 :     if( bValidValue )
     253           0 :         aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(d, GetFormat(), GetLanguage());
     254           0 : }
     255             : 
     256          42 : SwFieldType* SwDBField::ChgTyp( SwFieldType* pNewType )
     257             : {
     258          42 :     SwFieldType* pOld = SwValueField::ChgTyp( pNewType );
     259             : 
     260          42 :     ((SwDBFieldType*)pNewType)->AddRef();
     261          42 :     ((SwDBFieldType*)pOld)->ReleaseRef();
     262             : 
     263          42 :     return pOld;
     264             : }
     265             : 
     266           0 : bool SwDBField::FormatValue( SvNumberFormatter* pDocFormatter, OUString &aString, sal_uInt32 nFmt,
     267             :                              double &aNumber, sal_Int32 nColumnType, SwDBField *pField )
     268             : {
     269           0 :     bool bValidValue = false;
     270             : 
     271           0 :     if( DBL_MAX != aNumber )
     272             :     {
     273           0 :         if( DataType::DATE == nColumnType || DataType::TIME == nColumnType ||
     274             :             DataType::TIMESTAMP  == nColumnType )
     275             :         {
     276           0 :             Date aStandard( 1, 1, 1900 );
     277           0 :             if( *pDocFormatter->GetNullDate() != aStandard )
     278           0 :                 aNumber += (aStandard - *pDocFormatter->GetNullDate());
     279             :         }
     280           0 :         bValidValue = true;
     281           0 :         if( pField )
     282           0 :             pField->SetValue( aNumber );
     283             :     }
     284             :     else
     285             :     {
     286           0 :         SwSbxValue aVal;
     287           0 :         aVal.PutString( aString );
     288             : 
     289           0 :         if (aVal.IsNumeric())
     290             :         {
     291           0 :             if( pField )
     292           0 :                 pField->SetValue(aVal.GetDouble());
     293             :             else
     294           0 :                 aNumber = aVal.GetDouble();
     295             : 
     296           0 :             if (nFmt && nFmt != SAL_MAX_UINT32 && !pDocFormatter->IsTextFormat(nFmt))
     297           0 :                 bValidValue = true; // because of bug #60339 not for all strings
     298             :         }
     299             :         else
     300             :         {
     301             :             // if string length > 0 then true, else false
     302           0 :             if( pField )
     303           0 :                 pField->SetValue(aString.isEmpty() ? 0 : 1);
     304             :             else
     305           0 :                 aNumber = aString.isEmpty() ? 0 : 1;
     306           0 :         }
     307             :     }
     308             : 
     309           0 :     return bValidValue;
     310             : }
     311             : 
     312             : /// get current field value and cache it
     313          50 : void SwDBField::Evaluate()
     314             : {
     315          50 :     SwDBManager* pMgr = GetDoc()->GetDBManager();
     316             : 
     317             :     // first delete
     318          50 :     bValidValue = false;
     319          50 :     double nValue = DBL_MAX;
     320          50 :     const SwDBData& aTmpData = GetDBData();
     321             : 
     322          50 :     if(!pMgr || !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, true))
     323         100 :         return ;
     324             : 
     325             :     sal_uInt32 nFmt;
     326             : 
     327             :     // search corresponding column name
     328           0 :     OUString aColNm( ((SwDBFieldType*)GetTyp())->GetColumnName() );
     329             : 
     330           0 :     SvNumberFormatter* pDocFormatter = GetDoc()->GetNumberFormatter();
     331           0 :     pMgr->GetMergeColumnCnt(aColNm, GetLanguage(), aContent, &nValue, &nFmt);
     332           0 :     if( !( nSubType & nsSwExtendedSubType::SUB_OWN_FMT ) )
     333             :         SetFormat( nFmt = pMgr->GetColumnFmt( aTmpData.sDataSource, aTmpData.sCommand,
     334           0 :                                         aColNm, pDocFormatter, GetLanguage() ));
     335             : 
     336           0 :     sal_Int32 nColumnType = nValue == DBL_MAX
     337             :         ? 0
     338           0 :         : pMgr->GetColumnType(aTmpData.sDataSource, aTmpData.sCommand, aColNm);
     339             : 
     340           0 :     bValidValue = FormatValue( pDocFormatter, aContent, nFmt, nValue, nColumnType, this );
     341             : 
     342           0 :     if( DBL_MAX != nValue )
     343           0 :         aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(nValue, GetFormat(), GetLanguage());
     344             : 
     345           0 :     bInitialized = true;
     346             : }
     347             : 
     348             : /// get name
     349           0 : OUString SwDBField::GetPar1() const
     350             : {
     351           0 :     return ((const SwDBFieldType*)GetTyp())->GetName();
     352             : }
     353             : 
     354         482 : sal_uInt16 SwDBField::GetSubType() const
     355             : {
     356         482 :     return nSubType;
     357             : }
     358             : 
     359          82 : void SwDBField::SetSubType(sal_uInt16 nType)
     360             : {
     361          82 :     nSubType = nType;
     362          82 : }
     363             : 
     364         148 : bool SwDBField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     365             : {
     366         148 :     switch( nWhichId )
     367             :     {
     368             :     case FIELD_PROP_BOOL1:
     369             :         {
     370          46 :             sal_Bool bTemp = 0 == (GetSubType()&nsSwExtendedSubType::SUB_OWN_FMT);
     371          46 :             rAny.setValue(&bTemp, ::getBooleanCppuType());
     372             :         }
     373          46 :         break;
     374             :     case FIELD_PROP_BOOL2:
     375             :     {
     376          30 :         sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
     377          30 :         rAny.setValue(&bVal, ::getBooleanCppuType());
     378             :     }
     379          30 :     break;
     380             :     case FIELD_PROP_FORMAT:
     381          30 :         rAny <<= (sal_Int32)GetFormat();
     382          30 :         break;
     383             :     case FIELD_PROP_PAR1:
     384          28 :         rAny <<= aContent;
     385          28 :         break;
     386             :     case FIELD_PROP_PAR2:
     387          14 :         rAny <<= sFieldCode;
     388          14 :         break;
     389             :     default:
     390             :         OSL_FAIL("illegal property");
     391             :     }
     392         148 :     return true;
     393             : }
     394             : 
     395          88 : bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     396             : {
     397          88 :     switch( nWhichId )
     398             :     {
     399             :     case FIELD_PROP_BOOL1:
     400          36 :         if( *(sal_Bool*)rAny.getValue() )
     401          34 :             SetSubType(GetSubType()&~nsSwExtendedSubType::SUB_OWN_FMT);
     402             :         else
     403           2 :             SetSubType(GetSubType()|nsSwExtendedSubType::SUB_OWN_FMT);
     404          36 :         break;
     405             :     case FIELD_PROP_BOOL2:
     406             :     {
     407           4 :         sal_uInt16 nSubTyp = GetSubType();
     408           4 :         bool bVisible = false;
     409           4 :         if(!(rAny >>= bVisible))
     410           0 :             return false;
     411           4 :         if(bVisible)
     412           2 :             nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
     413             :         else
     414           2 :             nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
     415           4 :         SetSubType(nSubTyp);
     416             :         //invalidate text node
     417           4 :         if(GetTyp())
     418             :         {
     419           4 :             SwIterator<SwFmtFld,SwFieldType> aIter( *GetTyp() );
     420           4 :             SwFmtFld* pFmtFld = aIter.First();
     421           8 :             while(pFmtFld)
     422             :             {
     423           4 :                 SwTxtFld *pTxtFld = pFmtFld->GetTxtFld();
     424           4 :                 if(pTxtFld && (SwDBField*)pFmtFld->GetField() == this )
     425             :                 {
     426             :                     //notify the change
     427           4 :                     pTxtFld->NotifyContentChange(*pFmtFld);
     428           4 :                     break;
     429             :                 }
     430           0 :                 pFmtFld = aIter.Next();
     431           4 :             }
     432             :         }
     433             :     }
     434           4 :     break;
     435             :     case FIELD_PROP_FORMAT:
     436             :         {
     437           4 :             sal_Int32 nTemp = 0;
     438           4 :             rAny >>= nTemp;
     439           4 :             SetFormat(nTemp);
     440             :         }
     441           4 :         break;
     442             :     case FIELD_PROP_PAR1:
     443          40 :         rAny >>= aContent;
     444          40 :         break;
     445             :     case FIELD_PROP_PAR2:
     446           4 :         rAny >>= sFieldCode;
     447           4 :     break;
     448             :     default:
     449             :         OSL_FAIL("illegal property");
     450             :     }
     451          88 :     return true;
     452             : }
     453             : 
     454             : // base class for all further database fields
     455             : 
     456           0 : SwDBNameInfField::SwDBNameInfField(SwFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt) :
     457             :     SwField(pTyp, nFmt),
     458             :     aDBData(rDBData),
     459           0 :     nSubType(0)
     460             : {
     461           0 : }
     462             : 
     463           0 : SwDBData SwDBNameInfField::GetDBData(SwDoc* pDoc)
     464             : {
     465           0 :     SwDBData aRet;
     466           0 :     if(!aDBData.sDataSource.isEmpty())
     467           0 :         aRet = aDBData;
     468             :     else
     469           0 :         aRet = pDoc->GetDBData();
     470           0 :     return aRet;
     471             : }
     472             : 
     473           0 : void SwDBNameInfField::SetDBData(const SwDBData & rDBData)
     474             : {
     475           0 :     aDBData = rDBData;
     476           0 : }
     477             : 
     478           0 : OUString SwDBNameInfField::GetFieldName() const
     479             : {
     480           0 :     OUString sStr( SwField::GetFieldName() );
     481           0 :     if (!aDBData.sDataSource.isEmpty())
     482             :     {
     483             :         sStr += OUString(':')
     484           0 :             + aDBData.sDataSource
     485           0 :             + OUString(DB_DELIM)
     486           0 :             + aDBData.sCommand;
     487             :     }
     488           0 :     return lcl_DBTrennConv(sStr);
     489             : }
     490             : 
     491           0 : bool SwDBNameInfField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     492             : {
     493           0 :     switch( nWhichId )
     494             :     {
     495             :     case FIELD_PROP_PAR1:
     496           0 :         rAny <<= aDBData.sDataSource;
     497           0 :         break;
     498             :     case FIELD_PROP_PAR2:
     499           0 :         rAny <<= aDBData.sCommand;
     500           0 :         break;
     501             :     case FIELD_PROP_SHORT1:
     502           0 :         rAny <<= aDBData.nCommandType;
     503           0 :         break;
     504             :     case FIELD_PROP_BOOL2:
     505             :     {
     506           0 :         sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
     507           0 :         rAny.setValue(&bVal, ::getBooleanCppuType());
     508             :     }
     509           0 :     break;
     510             :     default:
     511             :         OSL_FAIL("illegal property");
     512             :     }
     513           0 :     return true;
     514             : }
     515             : 
     516           0 : bool SwDBNameInfField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     517             : {
     518           0 :     switch( nWhichId )
     519             :     {
     520             :     case FIELD_PROP_PAR1:
     521           0 :         rAny >>= aDBData.sDataSource;
     522           0 :         break;
     523             :     case FIELD_PROP_PAR2:
     524           0 :         rAny >>= aDBData.sCommand;
     525           0 :         break;
     526             :     case FIELD_PROP_SHORT1:
     527           0 :         rAny >>= aDBData.nCommandType;
     528           0 :         break;
     529             :     case FIELD_PROP_BOOL2:
     530             :     {
     531           0 :         sal_uInt16 nSubTyp = GetSubType();
     532           0 :         bool bVisible = false;
     533           0 :         if(!(rAny >>= bVisible))
     534           0 :             return false;
     535           0 :         if(bVisible)
     536           0 :             nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
     537             :         else
     538           0 :             nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
     539           0 :         SetSubType(nSubTyp);
     540             :     }
     541           0 :     break;
     542             :     default:
     543             :         OSL_FAIL("illegal property");
     544             :     }
     545           0 :     return true;
     546             : }
     547             : 
     548           0 : sal_uInt16 SwDBNameInfField::GetSubType() const
     549             : {
     550           0 :     return nSubType;
     551             : }
     552             : 
     553           0 : void SwDBNameInfField::SetSubType(sal_uInt16 nType)
     554             : {
     555           0 :     nSubType = nType;
     556           0 : }
     557             : 
     558             : // next dataset
     559             : 
     560        5052 : SwDBNextSetFieldType::SwDBNextSetFieldType()
     561        5052 :     : SwFieldType( RES_DBNEXTSETFLD )
     562             : {
     563        5052 : }
     564             : 
     565           0 : SwFieldType* SwDBNextSetFieldType::Copy() const
     566             : {
     567           0 :     SwDBNextSetFieldType* pTmp = new SwDBNextSetFieldType();
     568           0 :     return pTmp;
     569             : }
     570             : 
     571             : // SwDBSetField
     572             : 
     573           0 : SwDBNextSetField::SwDBNextSetField(SwDBNextSetFieldType* pTyp,
     574             :                                    const OUString& rCond,
     575             :                                    const OUString& ,
     576             :                                    const SwDBData& rDBData) :
     577           0 :     SwDBNameInfField(pTyp, rDBData), aCond(rCond), bCondValid(true)
     578           0 : {}
     579             : 
     580           0 : OUString SwDBNextSetField::Expand() const
     581             : {
     582           0 :     return OUString();
     583             : }
     584             : 
     585           0 : SwField* SwDBNextSetField::Copy() const
     586             : {
     587           0 :     SwDBNextSetField *pTmp = new SwDBNextSetField((SwDBNextSetFieldType*)GetTyp(),
     588           0 :                                          aCond, OUString(), GetDBData());
     589           0 :     pTmp->SetSubType(GetSubType());
     590           0 :     pTmp->bCondValid = bCondValid;
     591           0 :     return pTmp;
     592             : }
     593             : 
     594           0 : void SwDBNextSetField::Evaluate(SwDoc* pDoc)
     595             : {
     596           0 :     SwDBManager* pMgr = pDoc->GetDBManager();
     597           0 :     const SwDBData& rData = GetDBData();
     598           0 :     if( !bCondValid ||
     599           0 :             !pMgr || !pMgr->IsDataSourceOpen(rData.sDataSource, rData.sCommand, false))
     600           0 :         return ;
     601           0 :     pMgr->ToNextRecord(rData.sDataSource, rData.sCommand);
     602             : }
     603             : 
     604             : /// get condition
     605           0 : OUString SwDBNextSetField::GetPar1() const
     606             : {
     607           0 :     return aCond;
     608             : }
     609             : 
     610             : /// set condition
     611           0 : void SwDBNextSetField::SetPar1(const OUString& rStr)
     612             : {
     613           0 :     aCond = rStr;
     614           0 : }
     615             : 
     616           0 : bool SwDBNextSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     617             : {
     618           0 :     bool bRet = true;
     619           0 :     switch( nWhichId )
     620             :     {
     621             :     case FIELD_PROP_PAR3:
     622           0 :         rAny <<= aCond;
     623           0 :         break;
     624             :     default:
     625           0 :         bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
     626             :     }
     627           0 :     return bRet;
     628             : }
     629             : 
     630           0 : bool SwDBNextSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     631             : {
     632           0 :     bool bRet = true;
     633           0 :     switch( nWhichId )
     634             :     {
     635             :     case FIELD_PROP_PAR3:
     636           0 :         rAny >>= aCond;
     637           0 :         break;
     638             :     default:
     639           0 :         bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
     640             :     }
     641           0 :     return bRet;
     642             : }
     643             : 
     644             : // dataset with certain ID
     645             : 
     646        5052 : SwDBNumSetFieldType::SwDBNumSetFieldType() :
     647        5052 :     SwFieldType( RES_DBNUMSETFLD )
     648             : {
     649        5052 : }
     650             : 
     651           0 : SwFieldType* SwDBNumSetFieldType::Copy() const
     652             : {
     653           0 :     SwDBNumSetFieldType* pTmp = new SwDBNumSetFieldType();
     654           0 :     return pTmp;
     655             : }
     656             : 
     657           0 : SwDBNumSetField::SwDBNumSetField(SwDBNumSetFieldType* pTyp,
     658             :                                  const OUString& rCond,
     659             :                                  const OUString& rDBNum,
     660             :                                  const SwDBData& rDBData) :
     661             :     SwDBNameInfField(pTyp, rDBData),
     662             :     aCond(rCond),
     663             :     aPar2(rDBNum),
     664           0 :     bCondValid(true)
     665           0 : {}
     666             : 
     667           0 : OUString SwDBNumSetField::Expand() const
     668             : {
     669           0 :     return OUString();
     670             : }
     671             : 
     672           0 : SwField* SwDBNumSetField::Copy() const
     673             : {
     674           0 :     SwDBNumSetField *pTmp = new SwDBNumSetField((SwDBNumSetFieldType*)GetTyp(),
     675           0 :                                          aCond, aPar2, GetDBData());
     676           0 :     pTmp->bCondValid = bCondValid;
     677           0 :     pTmp->SetSubType(GetSubType());
     678           0 :     return pTmp;
     679             : }
     680             : 
     681           0 : void SwDBNumSetField::Evaluate(SwDoc* pDoc)
     682             : {
     683           0 :     SwDBManager* pMgr = pDoc->GetDBManager();
     684           0 :     const SwDBData& aTmpData = GetDBData();
     685             : 
     686           0 :     if( bCondValid && pMgr && pMgr->IsInMerge() &&
     687           0 :                         pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, true))
     688             :     {   // condition OK -> adjust current Set
     689           0 :         pMgr->ToRecordId(std::max((sal_uInt16)aPar2.toInt32(), sal_uInt16(1))-1);
     690             :     }
     691           0 : }
     692             : 
     693             : /// get LogDBName
     694           0 : OUString SwDBNumSetField::GetPar1() const
     695             : {
     696           0 :     return aCond;
     697             : }
     698             : 
     699             : /// set LogDBName
     700           0 : void SwDBNumSetField::SetPar1(const OUString& rStr)
     701             : {
     702           0 :     aCond = rStr;
     703           0 : }
     704             : 
     705             : /// get condition
     706           0 : OUString SwDBNumSetField::GetPar2() const
     707             : {
     708           0 :     return aPar2;
     709             : }
     710             : 
     711             : /// set condition
     712           0 : void SwDBNumSetField::SetPar2(const OUString& rStr)
     713             : {
     714           0 :     aPar2 = rStr;
     715           0 : }
     716             : 
     717           0 : bool SwDBNumSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     718             : {
     719           0 :     bool bRet = true;
     720           0 :     switch( nWhichId )
     721             :     {
     722             :     case FIELD_PROP_PAR3:
     723           0 :         rAny <<= aCond;
     724           0 :         break;
     725             :     case FIELD_PROP_FORMAT:
     726           0 :         rAny <<= aPar2.toInt32();
     727           0 :         break;
     728             :     default:
     729           0 :         bRet = SwDBNameInfField::QueryValue(rAny, nWhichId );
     730             :     }
     731           0 :     return bRet;
     732             : }
     733             : 
     734           0 : bool    SwDBNumSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     735             : {
     736           0 :     bool bRet = true;
     737           0 :     switch( nWhichId )
     738             :     {
     739             :     case FIELD_PROP_PAR3:
     740           0 :         rAny >>= aCond;
     741           0 :         break;
     742             :     case FIELD_PROP_FORMAT:
     743             :         {
     744           0 :             sal_Int32 nVal = 0;
     745           0 :             rAny >>= nVal;
     746           0 :             aPar2 = OUString::number(nVal);
     747             :         }
     748           0 :         break;
     749             :     default:
     750           0 :         bRet = SwDBNameInfField::PutValue(rAny, nWhichId );
     751             :     }
     752           0 :     return bRet;
     753             : }
     754             : 
     755        5052 : SwDBNameFieldType::SwDBNameFieldType(SwDoc* pDocument)
     756        5052 :     : SwFieldType( RES_DBNAMEFLD )
     757             : {
     758        5052 :     pDoc = pDocument;
     759        5052 : }
     760             : 
     761           0 : OUString SwDBNameFieldType::Expand(sal_uLong ) const
     762             : {
     763           0 :     const SwDBData aData = pDoc->GetDBData();
     764           0 :     return aData.sDataSource + "." + aData.sCommand;
     765             : }
     766             : 
     767           0 : SwFieldType* SwDBNameFieldType::Copy() const
     768             : {
     769           0 :     SwDBNameFieldType *pTmp = new SwDBNameFieldType(pDoc);
     770           0 :     return pTmp;
     771             : }
     772             : 
     773             : // name of the connected database
     774             : 
     775           0 : SwDBNameField::SwDBNameField(SwDBNameFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt)
     776           0 :     : SwDBNameInfField(pTyp, rDBData, nFmt)
     777           0 : {}
     778             : 
     779           0 : OUString SwDBNameField::Expand() const
     780             : {
     781           0 :     if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
     782           0 :         return ((SwDBNameFieldType*)GetTyp())->Expand(GetFormat());
     783           0 :     return OUString();
     784             : }
     785             : 
     786           0 : SwField* SwDBNameField::Copy() const
     787             : {
     788           0 :     SwDBNameField *pTmp = new SwDBNameField((SwDBNameFieldType*)GetTyp(), GetDBData());
     789           0 :     pTmp->ChangeFormat(GetFormat());
     790           0 :     pTmp->SetLanguage(GetLanguage());
     791           0 :     pTmp->SetSubType(GetSubType());
     792           0 :     return pTmp;
     793             : }
     794             : 
     795           0 : bool SwDBNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     796             : {
     797           0 :     return SwDBNameInfField::QueryValue(rAny, nWhichId );
     798             : }
     799             : 
     800           0 : bool SwDBNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     801             : {
     802           0 :     return SwDBNameInfField::PutValue(rAny, nWhichId );
     803             : }
     804             : 
     805        5052 : SwDBSetNumberFieldType::SwDBSetNumberFieldType()
     806        5052 :     : SwFieldType( RES_DBSETNUMBERFLD )
     807             : {
     808        5052 : }
     809             : 
     810           0 : SwFieldType* SwDBSetNumberFieldType::Copy() const
     811             : {
     812           0 :     SwDBSetNumberFieldType *pTmp = new SwDBSetNumberFieldType;
     813           0 :     return pTmp;
     814             : }
     815             : 
     816             : // set-number of the connected database
     817             : 
     818           0 : SwDBSetNumberField::SwDBSetNumberField(SwDBSetNumberFieldType* pTyp,
     819             :                                        const SwDBData& rDBData,
     820             :                                        sal_uLong nFmt)
     821           0 :     : SwDBNameInfField(pTyp, rDBData, nFmt), nNumber(0)
     822           0 : {}
     823             : 
     824           0 : OUString SwDBSetNumberField::Expand() const
     825             : {
     826           0 :     if(0 !=(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE) || nNumber == 0)
     827           0 :         return OUString();
     828           0 :     return FormatNumber((sal_uInt16)nNumber, GetFormat());
     829             : }
     830             : 
     831           0 : void SwDBSetNumberField::Evaluate(SwDoc* pDoc)
     832             : {
     833           0 :     SwDBManager* pMgr = pDoc->GetDBManager();
     834             : 
     835           0 :     const SwDBData& aTmpData = GetDBData();
     836           0 :     if (!pMgr || !pMgr->IsInMerge() ||
     837           0 :         !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, false))
     838           0 :         return;
     839           0 :     nNumber = pMgr->GetSelectedRecordId();
     840             : }
     841             : 
     842           0 : SwField* SwDBSetNumberField::Copy() const
     843             : {
     844             :     SwDBSetNumberField *pTmp =
     845           0 :         new SwDBSetNumberField((SwDBSetNumberFieldType*)GetTyp(), GetDBData(), GetFormat());
     846           0 :     pTmp->SetLanguage(GetLanguage());
     847           0 :     pTmp->SetSetNumber(nNumber);
     848           0 :     pTmp->SetSubType(GetSubType());
     849           0 :     return pTmp;
     850             : }
     851             : 
     852           0 : bool SwDBSetNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     853             : {
     854           0 :     bool bRet = true;
     855           0 :     switch( nWhichId )
     856             :     {
     857             :     case FIELD_PROP_USHORT1:
     858           0 :         rAny <<= (sal_Int16)GetFormat();
     859           0 :         break;
     860             :     case FIELD_PROP_FORMAT:
     861           0 :         rAny <<= nNumber;
     862           0 :         break;
     863             :     default:
     864           0 :         bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
     865             :     }
     866           0 :     return bRet;
     867             : }
     868             : 
     869           0 : bool SwDBSetNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     870             : {
     871           0 :     bool bRet = true;
     872           0 :     switch( nWhichId )
     873             :     {
     874             :     case FIELD_PROP_USHORT1:
     875             :         {
     876           0 :             sal_Int16 nSet = 0;
     877           0 :             rAny >>= nSet;
     878           0 :             if(nSet < (sal_Int16) SVX_NUMBER_NONE )
     879           0 :                 SetFormat(nSet);
     880             :             else {
     881             :             }
     882             :         }
     883           0 :         break;
     884             :     case FIELD_PROP_FORMAT:
     885           0 :         rAny >>= nNumber;
     886           0 :         break;
     887             :     default:
     888           0 :         bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
     889             :     }
     890           0 :     return bRet;
     891         270 : }
     892             : 
     893             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10