summaryrefslogtreecommitdiff
path: root/sw/source/core/fields/dbfld.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/fields/dbfld.cxx')
-rw-r--r--sw/source/core/fields/dbfld.cxx995
1 files changed, 995 insertions, 0 deletions
diff --git a/sw/source/core/fields/dbfld.cxx b/sw/source/core/fields/dbfld.cxx
new file mode 100644
index 000000000000..3eb1f758f3ee
--- /dev/null
+++ b/sw/source/core/fields/dbfld.cxx
@@ -0,0 +1,995 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include <float.h>
+#include <sfx2/app.hxx>
+#include <svl/zforlist.hxx>
+#include <svx/pageitem.hxx>
+#include <svx/dataaccessdescriptor.hxx>
+#include <com/sun/star/sdbc/DataType.hpp>
+#include <fmtfld.hxx>
+#include <txtfld.hxx>
+#include <doc.hxx>
+#include <docary.hxx>
+#include <frame.hxx>
+#include <fldbas.hxx>
+#include <pam.hxx>
+#include <ndtxt.hxx>
+#include <dbfld.hxx>
+#include <dbmgr.hxx>
+#include <docfld.hxx>
+#include <expfld.hxx>
+#include <txtatr.hxx>
+#include <unofldmid.h>
+#include <switerator.hxx>
+
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star;
+using ::rtl::OUString;
+
+/*--------------------------------------------------------------------
+ Beschreibung: Datenbanktrenner durch Punkte fuer Anzeige ersetzen
+ --------------------------------------------------------------------*/
+
+String lcl_DBTrennConv(const String& aContent)
+{
+ String sTmp(aContent);
+ sal_Unicode* pStr = sTmp.GetBufferAccess();
+ for( sal_uInt16 i = sTmp.Len(); i; --i, ++pStr )
+ if( DB_DELIM == *pStr )
+ *pStr = '.';
+ return sTmp;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: DatenbankFeldTyp
+ --------------------------------------------------------------------*/
+
+SwDBFieldType::SwDBFieldType(SwDoc* pDocPtr, const String& rNam, const SwDBData& rDBData ) :
+ SwValueFieldType( pDocPtr, RES_DBFLD ),
+ aDBData(rDBData),
+ sColumn(rNam),
+ nRefCnt(0)
+{
+ if(aDBData.sDataSource.getLength() || aDBData.sCommand.getLength())
+ {
+ sName = aDBData.sDataSource;
+ sName += DB_DELIM;
+ sName += (String)aDBData.sCommand;
+ sName += DB_DELIM;
+ }
+ sName += GetColumnName();
+}
+//------------------------------------------------------------------------------
+SwDBFieldType::~SwDBFieldType()
+{
+}
+//------------------------------------------------------------------------------
+
+SwFieldType* SwDBFieldType::Copy() const
+{
+ SwDBFieldType* pTmp = new SwDBFieldType(GetDoc(), sColumn, aDBData);
+ return pTmp;
+}
+
+//------------------------------------------------------------------------------
+const String& SwDBFieldType::GetName() const
+{
+ return sName;
+}
+
+//------------------------------------------------------------------------------
+
+void SwDBFieldType::ReleaseRef()
+{
+ OSL_ENSURE(nRefCnt > 0, "RefCount kleiner 0!");
+
+ if (--nRefCnt <= 0)
+ {
+ sal_uInt16 nPos = GetDoc()->GetFldTypes()->GetPos(this);
+
+ if (nPos != USHRT_MAX)
+ {
+ GetDoc()->RemoveFldType(nPos);
+ delete this;
+ }
+ }
+}
+
+bool SwDBFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR1:
+ rAny <<= aDBData.sDataSource;
+ break;
+ case FIELD_PROP_PAR2:
+ rAny <<= aDBData.sCommand;
+ break;
+ case FIELD_PROP_PAR3:
+ rAny <<= OUString(sColumn);
+ break;
+ case FIELD_PROP_SHORT1:
+ rAny <<= aDBData.nCommandType;
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+}
+
+bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR1:
+ rAny >>= aDBData.sDataSource;
+ break;
+ case FIELD_PROP_PAR2:
+ rAny >>= aDBData.sCommand;
+ break;
+ case FIELD_PROP_PAR3:
+ {
+ String sTmp;
+ ::GetString( rAny, sTmp );
+ if( sTmp != sColumn )
+ {
+ sColumn = sTmp;
+ SwIterator<SwFmtFld,SwFieldType> aIter( *this );
+ SwFmtFld* pFld = aIter.First();
+ while(pFld)
+ {
+ // Feld im Undo?
+ SwTxtFld *pTxtFld = pFld->GetTxtFld();
+ if(pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
+ {
+ SwDBField* pDBField = (SwDBField*)pFld->GetFld();
+ pDBField->ClearInitialized();
+ pDBField->InitContent();
+ }
+ pFld = aIter.Next();
+ }
+ }
+ }
+ break;
+ case FIELD_PROP_SHORT1:
+ rAny >>= aDBData.nCommandType;
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+}
+/*--------------------------------------------------------------------
+ Beschreibung: SwDBField
+ --------------------------------------------------------------------*/
+
+SwDBField::SwDBField(SwDBFieldType* pTyp, sal_uLong nFmt)
+ : SwValueField(pTyp, nFmt),
+ nSubType(0),
+ bIsInBodyTxt(sal_True),
+ bValidValue(sal_False),
+ bInitialized(sal_False)
+{
+ if (GetTyp())
+ ((SwDBFieldType*)GetTyp())->AddRef();
+ InitContent();
+}
+
+//------------------------------------------------------------------------------
+
+SwDBField::~SwDBField()
+{
+ if (GetTyp())
+ ((SwDBFieldType*)GetTyp())->ReleaseRef();
+}
+
+//------------------------------------------------------------------------------
+
+void SwDBField::InitContent()
+{
+ if (!IsInitialized())
+ {
+ aContent = '<';
+ aContent += ((SwDBFieldType*)GetTyp())->GetColumnName();
+ aContent += '>';
+ }
+}
+
+//------------------------------------------------------------------------------
+
+void SwDBField::InitContent(const String& rExpansion)
+{
+ if (rExpansion.Len() > 2)
+ {
+ if (rExpansion.GetChar(0) == '<' &&
+ rExpansion.GetChar(rExpansion.Len() - 1) == '>')
+ {
+ String sColumn( rExpansion.Copy( 1, rExpansion.Len() - 2 ) );
+ if( ::GetAppCmpStrIgnore().isEqual( sColumn,
+ ((SwDBFieldType *)GetTyp())->GetColumnName() ))
+ {
+ InitContent();
+ return;
+ }
+ }
+ }
+ SetExpansion( rExpansion );
+}
+
+//------------------------------------------------------------------------------
+
+String SwDBField::Expand() const
+{
+ String sRet;
+
+ if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
+ sRet = lcl_DBTrennConv(aContent);
+ return sRet;
+}
+
+//------------------------------------------------------------------------------
+
+SwField* SwDBField::Copy() const
+{
+ SwDBField *pTmp = new SwDBField((SwDBFieldType*)GetTyp(), GetFormat());
+ pTmp->aContent = aContent;
+ pTmp->bIsInBodyTxt = bIsInBodyTxt;
+ pTmp->bValidValue = bValidValue;
+ pTmp->bInitialized = bInitialized;
+ pTmp->nSubType = nSubType;
+ pTmp->SetValue(GetValue());
+ pTmp->sFieldCode = sFieldCode;
+
+ return pTmp;
+}
+
+String SwDBField::GetFieldName() const
+{
+ const String& rDBName = static_cast<SwDBFieldType*>(GetTyp())->GetName();
+
+ String sContent( rDBName.GetToken(0, DB_DELIM) );
+
+ if (sContent.Len() > 1)
+ {
+ sContent += DB_DELIM;
+ sContent += rDBName.GetToken(1, DB_DELIM);
+ sContent += DB_DELIM;
+ sContent += rDBName.GetToken(2, DB_DELIM);
+ }
+ return lcl_DBTrennConv(sContent);
+}
+
+//------------------------------------------------------------------------------
+
+void SwDBField::ChgValue( double d, sal_Bool bVal )
+{
+ bValidValue = bVal;
+ SetValue(d);
+
+ if( bValidValue )
+ aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(d, GetFormat(), GetLanguage());
+}
+
+SwFieldType* SwDBField::ChgTyp( SwFieldType* pNewType )
+{
+ SwFieldType* pOld = SwValueField::ChgTyp( pNewType );
+
+ ((SwDBFieldType*)pNewType)->AddRef();
+ ((SwDBFieldType*)pOld)->ReleaseRef();
+
+ return pOld;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Aktuellen Field-Value holen und chachen
+ --------------------------------------------------------------------*/
+
+void SwDBField::Evaluate()
+{
+ SwNewDBMgr* pMgr = GetDoc()->GetNewDBMgr();
+
+ // erstmal loeschen
+ bValidValue = sal_False;
+ double nValue = DBL_MAX;
+ const SwDBData& aTmpData = GetDBData();
+
+ if(!pMgr || !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_True))
+ return ;
+
+ sal_uInt32 nFmt;
+
+ // Passenden Spaltennamen suchen
+ String aColNm( ((SwDBFieldType*)GetTyp())->GetColumnName() );
+
+ SvNumberFormatter* pDocFormatter = GetDoc()->GetNumberFormatter();
+ pMgr->GetMergeColumnCnt(aColNm, GetLanguage(), aContent, &nValue, &nFmt);
+ if( !( nSubType & nsSwExtendedSubType::SUB_OWN_FMT ) )
+ SetFormat( nFmt = pMgr->GetColumnFmt( aTmpData.sDataSource, aTmpData.sCommand,
+ aColNm, pDocFormatter, GetLanguage() ));
+
+ if( DBL_MAX != nValue )
+ {
+ sal_Int32 nColumnType = pMgr->GetColumnType(aTmpData.sDataSource, aTmpData.sCommand, aColNm);
+ if( DataType::DATE == nColumnType || DataType::TIME == nColumnType ||
+ DataType::TIMESTAMP == nColumnType)
+
+ {
+ Date aStandard(1,1,1900);
+ if (*pDocFormatter->GetNullDate() != aStandard)
+ nValue += (aStandard - *pDocFormatter->GetNullDate());
+ }
+ bValidValue = sal_True;
+ SetValue(nValue);
+ aContent = ((SwValueFieldType*)GetTyp())->ExpandValue(nValue, GetFormat(), GetLanguage());
+ }
+ else
+ {
+ SwSbxValue aVal;
+ aVal.PutString( aContent );
+
+ if (aVal.IsNumeric())
+ {
+ SetValue(aVal.GetDouble());
+
+ SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
+ if (nFmt && nFmt != SAL_MAX_UINT32 && !pFormatter->IsTextFormat(nFmt))
+ bValidValue = sal_True; // Wegen Bug #60339 nicht mehr bei allen Strings
+ }
+ else
+ {
+ // Bei Strings sal_True wenn Laenge > 0 sonst sal_False
+ SetValue(aContent.Len() ? 1 : 0);
+ }
+ }
+ bInitialized = sal_True;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Namen erfragen
+ --------------------------------------------------------------------*/
+
+const String& SwDBField::GetPar1() const
+{
+ return ((SwDBFieldType*)GetTyp())->GetName();
+}
+
+sal_uInt16 SwDBField::GetSubType() const
+{
+ return nSubType;
+}
+
+void SwDBField::SetSubType(sal_uInt16 nType)
+{
+ nSubType = nType;
+}
+
+bool SwDBField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_BOOL1:
+ {
+ sal_Bool bTemp = 0 == (GetSubType()&nsSwExtendedSubType::SUB_OWN_FMT);
+ rAny.setValue(&bTemp, ::getBooleanCppuType());
+ }
+ break;
+ case FIELD_PROP_BOOL2:
+ {
+ sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
+ rAny.setValue(&bVal, ::getBooleanCppuType());
+ }
+ break;
+ case FIELD_PROP_FORMAT:
+ rAny <<= (sal_Int32)GetFormat();
+ break;
+ case FIELD_PROP_PAR1:
+ rAny <<= OUString(aContent);
+ break;
+ case FIELD_PROP_PAR2:
+ rAny <<= OUString(sFieldCode);
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+
+}
+
+bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_BOOL1:
+ if( *(sal_Bool*)rAny.getValue() )
+ SetSubType(GetSubType()&~nsSwExtendedSubType::SUB_OWN_FMT);
+ else
+ SetSubType(GetSubType()|nsSwExtendedSubType::SUB_OWN_FMT);
+ break;
+ case FIELD_PROP_BOOL2:
+ {
+ sal_uInt16 nSubTyp = GetSubType();
+ sal_Bool bVisible = sal_False;
+ if(!(rAny >>= bVisible))
+ return sal_False;
+ if(bVisible)
+ nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
+ SetSubType(nSubTyp);
+ //invalidate text node
+ if(GetTyp())
+ {
+ SwIterator<SwFmtFld,SwFieldType> aIter( *GetTyp() );
+ SwFmtFld* pFld = aIter.First();
+ while(pFld)
+ {
+ SwTxtFld *pTxtFld = pFld->GetTxtFld();
+ if(pTxtFld && (SwDBField*)pFld->GetFld() == this )
+ {
+ //notify the change
+ pTxtFld->NotifyContentChange(*pFld);
+ break;
+ }
+ pFld = aIter.Next();
+ }
+ }
+ }
+ break;
+ case FIELD_PROP_FORMAT:
+ {
+ sal_Int32 nTemp = 0;
+ rAny >>= nTemp;
+ SetFormat(nTemp);
+ }
+ break;
+ case FIELD_PROP_PAR1:
+ ::GetString( rAny, aContent );
+ break;
+ case FIELD_PROP_PAR2:
+ ::GetString( rAny, sFieldCode );
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Basisklasse fuer alle weiteren Datenbankfelder
+ --------------------------------------------------------------------*/
+
+SwDBNameInfField::SwDBNameInfField(SwFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt) :
+ SwField(pTyp, nFmt),
+ aDBData(rDBData),
+ nSubType(0)
+{
+}
+
+//------------------------------------------------------------------------------
+
+SwDBData SwDBNameInfField::GetDBData(SwDoc* pDoc)
+{
+ SwDBData aRet;
+ if(aDBData.sDataSource.getLength())
+ aRet = aDBData;
+ else
+ aRet = pDoc->GetDBData();
+ return aRet;
+}
+
+void SwDBNameInfField::SetDBData(const SwDBData & rDBData)
+{
+ aDBData = rDBData;
+}
+
+//------------------------------------------------------------------------------
+
+String SwDBNameInfField::GetFieldName() const
+{
+ String sStr( SwField::GetFieldName() );
+ if (aDBData.sDataSource.getLength())
+ {
+ sStr += ':';
+ sStr += String(aDBData.sDataSource);
+ sStr += DB_DELIM;
+ sStr += String(aDBData.sCommand);
+ }
+ return lcl_DBTrennConv(sStr);
+}
+
+bool SwDBNameInfField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR1:
+ rAny <<= aDBData.sDataSource;
+ break;
+ case FIELD_PROP_PAR2:
+ rAny <<= aDBData.sCommand;
+ break;
+ case FIELD_PROP_SHORT1:
+ rAny <<= aDBData.nCommandType;
+ break;
+ case FIELD_PROP_BOOL2:
+ {
+ sal_Bool bVal = 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
+ rAny.setValue(&bVal, ::getBooleanCppuType());
+ }
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+}
+
+bool SwDBNameInfField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR1:
+ rAny >>= aDBData.sDataSource;
+ break;
+ case FIELD_PROP_PAR2:
+ rAny >>= aDBData.sCommand;
+ break;
+ case FIELD_PROP_SHORT1:
+ rAny >>= aDBData.nCommandType;
+ break;
+ case FIELD_PROP_BOOL2:
+ {
+ sal_uInt16 nSubTyp = GetSubType();
+ sal_Bool bVisible = sal_False;
+ if(!(rAny >>= bVisible))
+ return false;
+ if(bVisible)
+ nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
+ else
+ nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
+ SetSubType(nSubTyp);
+ }
+ break;
+ default:
+ OSL_FAIL("illegal property");
+ }
+ return true;
+}
+
+sal_uInt16 SwDBNameInfField::GetSubType() const
+{
+ return nSubType;
+}
+
+void SwDBNameInfField::SetSubType(sal_uInt16 nType)
+{
+ nSubType = nType;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: NaechsterDatensatz
+ --------------------------------------------------------------------*/
+
+SwDBNextSetFieldType::SwDBNextSetFieldType()
+ : SwFieldType( RES_DBNEXTSETFLD )
+{
+}
+
+//------------------------------------------------------------------------------
+
+SwFieldType* SwDBNextSetFieldType::Copy() const
+{
+ SwDBNextSetFieldType* pTmp = new SwDBNextSetFieldType();
+ return pTmp;
+}
+/*--------------------------------------------------------------------
+ Beschreibung: SwDBSetField
+ --------------------------------------------------------------------*/
+
+SwDBNextSetField::SwDBNextSetField(SwDBNextSetFieldType* pTyp,
+ const String& rCond,
+ const String& ,
+ const SwDBData& rDBData) :
+ SwDBNameInfField(pTyp, rDBData), aCond(rCond), bCondValid(sal_True)
+{}
+
+//------------------------------------------------------------------------------
+
+String SwDBNextSetField::Expand() const
+{
+ return aEmptyStr;
+}
+
+//------------------------------------------------------------------------------
+
+SwField* SwDBNextSetField::Copy() const
+{
+ SwDBNextSetField *pTmp = new SwDBNextSetField((SwDBNextSetFieldType*)GetTyp(),
+ aCond, aEmptyStr, GetDBData());
+ pTmp->SetSubType(GetSubType());
+ pTmp->bCondValid = bCondValid;
+ return pTmp;
+}
+//------------------------------------------------------------------------------
+
+void SwDBNextSetField::Evaluate(SwDoc* pDoc)
+{
+ SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
+ const SwDBData& rData = GetDBData();
+ if( !bCondValid ||
+ !pMgr || !pMgr->IsDataSourceOpen(rData.sDataSource, rData.sCommand, sal_False))
+ return ;
+ pMgr->ToNextRecord(rData.sDataSource, rData.sCommand);
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Bedingung
+ --------------------------------------------------------------------*/
+
+const String& SwDBNextSetField::GetPar1() const
+{
+ return aCond;
+}
+
+void SwDBNextSetField::SetPar1(const String& rStr)
+{
+ aCond = rStr;
+}
+
+bool SwDBNextSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR3:
+ rAny <<= OUString(aCond);
+ break;
+ default:
+ bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
+ }
+ return bRet;
+}
+
+bool SwDBNextSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR3:
+ ::GetString( rAny, aCond );
+ break;
+ default:
+ bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
+ }
+ return bRet;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Datensatz mit bestimmter ID
+ --------------------------------------------------------------------*/
+
+SwDBNumSetFieldType::SwDBNumSetFieldType() :
+ SwFieldType( RES_DBNUMSETFLD )
+{
+}
+
+//------------------------------------------------------------------------------
+
+SwFieldType* SwDBNumSetFieldType::Copy() const
+{
+ SwDBNumSetFieldType* pTmp = new SwDBNumSetFieldType();
+ return pTmp;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: SwDBSetField
+ --------------------------------------------------------------------*/
+
+SwDBNumSetField::SwDBNumSetField(SwDBNumSetFieldType* pTyp,
+ const String& rCond,
+ const String& rDBNum,
+ const SwDBData& rDBData) :
+ SwDBNameInfField(pTyp, rDBData),
+ aCond(rCond),
+ aPar2(rDBNum),
+ bCondValid(sal_True)
+{}
+
+//------------------------------------------------------------------------------
+
+String SwDBNumSetField::Expand() const
+{
+ return aEmptyStr;
+}
+
+//------------------------------------------------------------------------------
+
+SwField* SwDBNumSetField::Copy() const
+{
+ SwDBNumSetField *pTmp = new SwDBNumSetField((SwDBNumSetFieldType*)GetTyp(),
+ aCond, aPar2, GetDBData());
+ pTmp->bCondValid = bCondValid;
+ pTmp->SetSubType(GetSubType());
+ return pTmp;
+}
+
+void SwDBNumSetField::Evaluate(SwDoc* pDoc)
+{
+ SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
+ const SwDBData& aTmpData = GetDBData();
+
+ if( bCondValid && pMgr && pMgr->IsInMerge() &&
+ pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_True))
+ { // Bedingug OK -> aktuellen Set einstellen
+ pMgr->ToRecordId(Max((sal_uInt16)aPar2.ToInt32(), sal_uInt16(1))-1);
+ }
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: LogDBName
+ --------------------------------------------------------------------*/
+
+const String& SwDBNumSetField::GetPar1() const
+{
+ return aCond;
+}
+
+void SwDBNumSetField::SetPar1(const String& rStr)
+{
+ aCond = rStr;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Bedingung
+ --------------------------------------------------------------------*/
+
+String SwDBNumSetField::GetPar2() const
+{
+ return aPar2;
+}
+
+void SwDBNumSetField::SetPar2(const String& rStr)
+{
+ aPar2 = rStr;
+}
+
+bool SwDBNumSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR3:
+ rAny <<= OUString(aCond);
+ break;
+ case FIELD_PROP_FORMAT:
+ rAny <<= (sal_Int32)aPar2.ToInt32();
+ break;
+ default:
+ bRet = SwDBNameInfField::QueryValue(rAny, nWhichId );
+ }
+ return bRet;
+}
+
+bool SwDBNumSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_PAR3:
+ ::GetString( rAny, aCond );
+ break;
+ case FIELD_PROP_FORMAT:
+ {
+ sal_Int32 nVal = 0;
+ rAny >>= nVal;
+ aPar2 = String::CreateFromInt32(nVal);
+ }
+ break;
+ default:
+ bRet = SwDBNameInfField::PutValue(rAny, nWhichId );
+ }
+ return bRet;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: SwDBNameFieldType
+ --------------------------------------------------------------------*/
+
+SwDBNameFieldType::SwDBNameFieldType(SwDoc* pDocument)
+ : SwFieldType( RES_DBNAMEFLD )
+{
+ pDoc = pDocument;
+}
+//------------------------------------------------------------------------------
+
+String SwDBNameFieldType::Expand(sal_uLong ) const
+{
+ const SwDBData aData = pDoc->GetDBData();
+ String sRet(aData.sDataSource);
+ sRet += '.';
+ sRet += (String)aData.sCommand;
+ return sRet;
+}
+//------------------------------------------------------------------------------
+
+SwFieldType* SwDBNameFieldType::Copy() const
+{
+ SwDBNameFieldType *pTmp = new SwDBNameFieldType(pDoc);
+ return pTmp;
+}
+
+//------------------------------------------------------------------------------
+
+/*--------------------------------------------------------------------
+ Beschreibung: Name der angedockten DB
+ --------------------------------------------------------------------*/
+
+SwDBNameField::SwDBNameField(SwDBNameFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFmt)
+ : SwDBNameInfField(pTyp, rDBData, nFmt)
+{}
+
+//------------------------------------------------------------------------------
+
+String SwDBNameField::Expand() const
+{
+ String sRet;
+ if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
+ sRet = ((SwDBNameFieldType*)GetTyp())->Expand(GetFormat());
+ return sRet;
+}
+
+//------------------------------------------------------------------------------
+
+SwField* SwDBNameField::Copy() const
+{
+ SwDBNameField *pTmp = new SwDBNameField((SwDBNameFieldType*)GetTyp(), GetDBData());
+ pTmp->ChangeFormat(GetFormat());
+ pTmp->SetLanguage(GetLanguage());
+ pTmp->SetSubType(GetSubType());
+ return pTmp;
+}
+
+bool SwDBNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ return SwDBNameInfField::QueryValue(rAny, nWhichId );
+}
+
+bool SwDBNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ return SwDBNameInfField::PutValue(rAny, nWhichId );
+}
+/*--------------------------------------------------------------------
+ Beschreibung: SwDBNameFieldType
+ --------------------------------------------------------------------*/
+
+SwDBSetNumberFieldType::SwDBSetNumberFieldType()
+ : SwFieldType( RES_DBSETNUMBERFLD )
+{
+}
+
+//------------------------------------------------------------------------------
+
+SwFieldType* SwDBSetNumberFieldType::Copy() const
+{
+ SwDBSetNumberFieldType *pTmp = new SwDBSetNumberFieldType;
+ return pTmp;
+}
+
+//------------------------------------------------------------------------------
+
+/*--------------------------------------------------------------------
+ Beschreibung: SetNumber der angedockten DB
+ --------------------------------------------------------------------*/
+
+SwDBSetNumberField::SwDBSetNumberField(SwDBSetNumberFieldType* pTyp,
+ const SwDBData& rDBData,
+ sal_uLong nFmt)
+ : SwDBNameInfField(pTyp, rDBData, nFmt), nNumber(0)
+{}
+
+//------------------------------------------------------------------------------
+
+String SwDBSetNumberField::Expand() const
+{
+ if(0 !=(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE) || nNumber == 0)
+ return aEmptyStr;
+ else
+ return FormatNumber((sal_uInt16)nNumber, GetFormat());
+}
+
+//------------------------------------------------------------------------------
+
+void SwDBSetNumberField::Evaluate(SwDoc* pDoc)
+{
+ SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
+
+ const SwDBData& aTmpData = GetDBData();
+ if (!pMgr || !pMgr->IsInMerge() ||
+ !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, sal_False))
+ return;
+ nNumber = pMgr->GetSelectedRecordId();
+}
+
+
+//------------------------------------------------------------------------------
+
+SwField* SwDBSetNumberField::Copy() const
+{
+ SwDBSetNumberField *pTmp =
+ new SwDBSetNumberField((SwDBSetNumberFieldType*)GetTyp(), GetDBData(), GetFormat());
+ pTmp->SetLanguage(GetLanguage());
+ pTmp->SetSetNumber(nNumber);
+ pTmp->SetSubType(GetSubType());
+ return pTmp;
+}
+
+bool SwDBSetNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_USHORT1:
+ rAny <<= (sal_Int16)GetFormat();
+ break;
+ case FIELD_PROP_FORMAT:
+ rAny <<= nNumber;
+ break;
+ default:
+ bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
+ }
+ return bRet;
+}
+
+bool SwDBSetNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
+{
+ bool bRet = true;
+ switch( nWhichId )
+ {
+ case FIELD_PROP_USHORT1:
+ {
+ sal_Int16 nSet = 0;
+ rAny >>= nSet;
+ if(nSet < (sal_Int16) SVX_NUMBER_NONE )
+ SetFormat(nSet);
+ else {
+ }
+ }
+ break;
+ case FIELD_PROP_FORMAT:
+ rAny >>= nNumber;
+ break;
+ default:
+ bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
+ }
+ return bRet;
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */