summaryrefslogtreecommitdiff
path: root/sw/source/core/fields/usrfld.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/fields/usrfld.cxx')
-rw-r--r--sw/source/core/fields/usrfld.cxx368
1 files changed, 368 insertions, 0 deletions
diff --git a/sw/source/core/fields/usrfld.cxx b/sw/source/core/fields/usrfld.cxx
new file mode 100644
index 000000000000..7f6d93688665
--- /dev/null
+++ b/sw/source/core/fields/usrfld.cxx
@@ -0,0 +1,368 @@
+/* -*- 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 <svl/zforlist.hxx>
+#include <svl/zformat.hxx>
+#include <svx/svdmodel.hxx>
+
+
+#include <calbck.hxx>
+#include <calc.hxx>
+#include <usrfld.hxx>
+#include <doc.hxx>
+#include <editsh.hxx>
+#include <dpage.hxx>
+#include <unofldmid.h>
+
+using namespace ::com::sun::star;
+using ::rtl::OUString;
+/*--------------------------------------------------------------------
+ Beschreibung: Benutzerfelder
+ --------------------------------------------------------------------*/
+
+SwUserField::SwUserField(SwUserFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFmt)
+ : SwValueField(pTyp, nFmt),
+ nSubType(nSub)
+{
+}
+
+String SwUserField::Expand() const
+{
+ String sStr;
+ if(!(nSubType & nsSwExtendedSubType::SUB_INVISIBLE))
+ sStr = ((SwUserFieldType*)GetTyp())->Expand(GetFormat(), nSubType, GetLanguage());
+
+ return sStr;
+}
+
+SwField* SwUserField::Copy() const
+{
+ SwField* pTmp = new SwUserField((SwUserFieldType*)GetTyp(), nSubType, GetFormat());
+ pTmp->SetAutomaticLanguage(IsAutomaticLanguage());
+ return pTmp;
+}
+
+String SwUserField::GetCntnt(sal_Bool bName) const
+{
+ if ( bName )
+ { String aStr(SwFieldType::GetTypeStr(TYP_USERFLD));
+ aStr += ' ';
+ aStr += GetTyp()->GetName();
+ aStr.AppendAscii(" = ");
+ aStr += ((SwUserFieldType*)GetTyp())->GetContent();
+ return aStr;
+ }
+ return Expand();
+}
+
+double SwUserField::GetValue() const
+{
+ return ((SwUserFieldType*)GetTyp())->GetValue();
+}
+
+void SwUserField::SetValue( const double& rVal )
+{
+ ((SwUserFieldType*)GetTyp())->SetValue(rVal);
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Name
+ --------------------------------------------------------------------*/
+
+const String& SwUserField::GetPar1() const
+{
+ return ((SwUserFieldType*)GetTyp())->GetName();
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Content
+ --------------------------------------------------------------------*/
+
+String SwUserField::GetPar2() const
+{
+ return ((SwUserFieldType*)GetTyp())->GetContent(GetFormat());
+}
+
+void SwUserField::SetPar2(const String& rStr)
+{
+ ((SwUserFieldType*)GetTyp())->SetContent(rStr, GetFormat());
+}
+
+sal_uInt16 SwUserField::GetSubType() const
+{
+ return ((SwUserFieldType*)GetTyp())->GetType() | nSubType;
+}
+
+void SwUserField::SetSubType(sal_uInt16 nSub)
+{
+ ((SwUserFieldType*)GetTyp())->SetType(nSub & 0x00ff);
+ nSubType = nSub & 0xff00;
+}
+
+bool SwUserField::QueryValue( uno::Any& rAny, USHORT nWhichId ) const
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_BOOL2:
+ {
+ BOOL bTmp = 0 != (nSubType & nsSwExtendedSubType::SUB_CMD);
+ rAny.setValue(&bTmp, ::getBooleanCppuType());
+ }
+ break;
+ case FIELD_PROP_BOOL1:
+ {
+ BOOL bTmp = 0 == (nSubType & nsSwExtendedSubType::SUB_INVISIBLE);
+ rAny.setValue(&bTmp, ::getBooleanCppuType());
+ }
+ break;
+ case FIELD_PROP_FORMAT:
+ rAny <<= (sal_Int32)GetFormat();
+ break;
+ default:
+ return SwField::QueryValue(rAny, nWhichId);
+ }
+ return true;
+}
+
+bool SwUserField::PutValue( const uno::Any& rAny, USHORT nWhichId )
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_BOOL1:
+ if(*(sal_Bool*) rAny.getValue())
+ nSubType &= (~nsSwExtendedSubType::SUB_INVISIBLE);
+ else
+ nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
+ break;
+ case FIELD_PROP_BOOL2:
+ if(*(sal_Bool*) rAny.getValue())
+ nSubType |= nsSwExtendedSubType::SUB_CMD;
+ else
+ nSubType &= (~nsSwExtendedSubType::SUB_CMD);
+ break;
+ case FIELD_PROP_FORMAT:
+ {
+ sal_Int32 nTmp = 0;
+ rAny >>= nTmp;
+ SetFormat(nTmp);
+ }
+ break;
+ default:
+ return SwField::PutValue(rAny, nWhichId);
+ }
+ return true;
+}
+
+/*--------------------------------------------------------------------
+ Beschreibung: Benutzerfeldtypen
+ --------------------------------------------------------------------*/
+
+SwUserFieldType::SwUserFieldType( SwDoc* pDocPtr, const String& aNam )
+ : SwValueFieldType( pDocPtr, RES_USERFLD ),
+ nValue( 0 ),
+ nType(nsSwGetSetExpType::GSE_STRING)
+{
+ bValidValue = bDeleted = sal_False;
+ aName = aNam;
+
+ if (nType & nsSwGetSetExpType::GSE_STRING)
+ EnableFormat(sal_False); // Numberformatter nicht einsetzen
+}
+
+String SwUserFieldType::Expand(sal_uInt32 nFmt, sal_uInt16 nSubType, sal_uInt16 nLng)
+{
+ String aStr(aContent);
+ if((nType & nsSwGetSetExpType::GSE_EXPR) && !(nSubType & nsSwExtendedSubType::SUB_CMD))
+ {
+ EnableFormat(sal_True);
+ aStr = ExpandValue(nValue, nFmt, nLng);
+ }
+ else
+ EnableFormat(sal_False); // Numberformatter nicht einsetzen
+
+ return aStr;
+}
+
+SwFieldType* SwUserFieldType::Copy() const
+{
+ SwUserFieldType *pTmp = new SwUserFieldType( GetDoc(), aName );
+ pTmp->aContent = aContent;
+ pTmp->nType = nType;
+ pTmp->bValidValue = bValidValue;
+ pTmp->nValue = nValue;
+ pTmp->bDeleted = bDeleted;
+
+ return pTmp;
+}
+
+const String& SwUserFieldType::GetName() const
+{
+ return aName;
+}
+
+void SwUserFieldType::Modify( SfxPoolItem* pOld, SfxPoolItem* pNew )
+{
+ if( !pOld && !pNew )
+ ChgValid( sal_False );
+
+ SwModify::Modify( pOld, pNew );
+ // und ggfs. am UserFeld haengende InputFelder updaten!
+ GetDoc()->GetSysFldType( RES_INPUTFLD )->UpdateFlds();
+}
+
+double SwUserFieldType::GetValue( SwCalc& rCalc )
+{
+ if(bValidValue)
+ return nValue;
+
+ if(!rCalc.Push( this ))
+ {
+ rCalc.SetCalcError( CALC_SYNTAX );
+ return 0;
+ }
+ nValue = rCalc.Calculate( aContent ).GetDouble();
+ rCalc.Pop( this );
+
+ if( !rCalc.IsCalcError() )
+ bValidValue = sal_True;
+ else
+ nValue = 0;
+
+ return nValue;
+}
+
+String SwUserFieldType::GetContent( sal_uInt32 nFmt )
+{
+ if (nFmt && nFmt != SAL_MAX_UINT32)
+ {
+ String sFormattedValue;
+ Color* pCol = 0;
+
+ SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
+
+ pFormatter->GetOutputString(GetValue(), nFmt, sFormattedValue, &pCol);
+ return sFormattedValue;
+ }
+ else
+ return aContent;
+}
+
+void SwUserFieldType::SetContent( const String& rStr, sal_uInt32 nFmt )
+{
+ if( aContent != rStr )
+ {
+ aContent = rStr;
+
+ if (nFmt && nFmt != SAL_MAX_UINT32)
+ {
+ double fValue;
+
+ SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
+
+ if (pFormatter->IsNumberFormat(rStr, nFmt, fValue))
+ {
+ SetValue(fValue);
+ aContent.Erase();
+ DoubleToString(aContent, fValue, nFmt);
+ }
+ }
+
+ sal_Bool bModified = GetDoc()->IsModified();
+ GetDoc()->SetModified();
+ if( !bModified ) // Bug 57028
+ GetDoc()->SetUndoNoResetModified();
+ }
+}
+
+bool SwUserFieldType::QueryValue( uno::Any& rAny, USHORT nWhichId ) const
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_DOUBLE:
+ rAny <<= (double) nValue;
+ break;
+ case FIELD_PROP_PAR2:
+ rAny <<= rtl::OUString(aContent);
+ break;
+ case FIELD_PROP_BOOL1:
+ {
+ BOOL bExpression = 0 != (nsSwGetSetExpType::GSE_EXPR&nType);
+ rAny.setValue(&bExpression, ::getBooleanCppuType());
+ }
+ break;
+ default:
+ DBG_ERROR("illegal property");
+ }
+ return true;
+}
+
+bool SwUserFieldType::PutValue( const uno::Any& rAny, USHORT nWhichId )
+{
+ switch( nWhichId )
+ {
+ case FIELD_PROP_DOUBLE:
+ {
+ double fVal = 0;
+ rAny >>= fVal;
+ nValue = fVal;
+
+ // Folgende Zeile ist eigentlich falsch, da die Sprache unbekannt ist
+ // (haengt am Feld) und aContent daher auch eigentlich ans Feld gehoeren
+ // muesste. Jedes Feld kann eine andere Sprache, aber den gleichen Inhalt
+ // haben, nur die Formatierung ist unterschiedlich.
+ DoubleToString(aContent, nValue, (sal_uInt16)LANGUAGE_SYSTEM);
+ }
+ break;
+ case FIELD_PROP_PAR2:
+ ::GetString( rAny, aContent );
+ break;
+ case FIELD_PROP_BOOL1:
+ if(*(sal_Bool*)rAny.getValue())
+ {
+ nType |= nsSwGetSetExpType::GSE_EXPR;
+ nType &= ~nsSwGetSetExpType::GSE_STRING;
+ }
+ else
+ {
+ nType &= ~nsSwGetSetExpType::GSE_EXPR;
+ nType |= nsSwGetSetExpType::GSE_STRING;
+ }
+ break;
+ default:
+ DBG_ERROR("illegal property");
+ }
+ return true;
+}
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */