blob: 8392d81d61c9cfef8b869665384efc6f131263aa [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <textapi.hxx>
#include <tools/pstm.hxx>
#include <hintids.hxx>
#include <com/sun/star/text/XText.hpp>
#include <com/sun/star/script/XTypeConverter.hpp>
#include <com/sun/star/text/SetVariableType.hpp>
#include <com/sun/star/text/XTextFieldsSupplier.hpp>
#include <com/sun/star/text/UserDataPart.hpp>
#include <com/sun/star/text/ChapterFormat.hpp>
#include <com/sun/star/text/XTextField.hpp>
#include <com/sun/star/text/PlaceholderType.hpp>
#include <com/sun/star/text/TemplateDisplayFormat.hpp>
#include <com/sun/star/text/UserFieldFormat.hpp>
#include <com/sun/star/text/PageNumberType.hpp>
#include <com/sun/star/text/ReferenceFieldPart.hpp>
#include <com/sun/star/text/FilenameDisplayFormat.hpp>
#include <com/sun/star/text/XDependentTextField.hpp>
#include <com/sun/star/text/DocumentStatistic.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/document/XDocumentProperties.hpp>
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/util/Duration.hpp>
#include <unotools/localedatawrapper.hxx>
#include <editeng/unolingu.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/types.hxx>
#include <comphelper/string.hxx>
#include <tools/urlobj.hxx>
#include <vcl/svapp.hxx>
#include <svl/urihelper.hxx>
#include <unotools/useroptions.hxx>
#include <unotools/syslocale.hxx>
#include <svl/zforlist.hxx>
#include <tools/time.hxx>
#include <tools/datetime.hxx>
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/util/DateTime.hpp>
#include <com/sun/star/util/Time.hpp>
#include <tools/shl.hxx>
#include <swmodule.hxx>
#include <sfx2/app.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/doctempl.hxx>
#include <fmtfld.hxx>
#include <txtfld.hxx>
#include <charfmt.hxx>
#include <docstat.hxx>
#include <pagedesc.hxx>
#include <fmtpdsc.hxx>
#include <doc.hxx>
#include <rootfrm.hxx> // AuthorField
#include <pagefrm.hxx> //
#include <cntfrm.hxx> //
#include <pam.hxx>
#include <viewsh.hxx>
#include <dbmgr.hxx>
#include <shellres.hxx>
#include <docufld.hxx>
#include <flddat.hxx>
#include <docfld.hxx>
#include <ndtxt.hxx>
#include <expfld.hxx>
#include <poolfmt.hxx>
#include <docsh.hxx>
#include <unofldmid.h>
#include <swunohelper.hxx>
#include <comcore.hrc>
#include <editeng/outliner.hxx>
#include <editeng/outlobj.hxx>
#include <switerator.hxx>
#define URL_DECODE INetURLObject::DECODE_UNAMBIGUOUS
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace nsSwDocInfoSubType;
/*--------------------------------------------------------------------
Beschreibung: SwPageNumberFieldType
--------------------------------------------------------------------*/
SwPageNumberFieldType::SwPageNumberFieldType()
: SwFieldType( RES_PAGENUMBERFLD ),
nNumberingType( SVX_NUM_ARABIC ),
nNum( 0 ),
nMax( USHRT_MAX ),
bVirtuell( sal_False )
{
}
String& SwPageNumberFieldType::Expand( sal_uInt32 nFmt, short nOff,
const String& rUserStr, String& rRet ) const
{
sal_uInt32 nTmpFmt = (SVX_NUM_PAGEDESC == nFmt) ? (sal_uInt32)nNumberingType : nFmt;
long nTmp = nNum + nOff;
if( 0 >= nTmp || SVX_NUM_NUMBER_NONE == nTmpFmt || (!bVirtuell && nTmp > nMax) )
rRet = aEmptyStr;
else if( SVX_NUM_CHAR_SPECIAL == nTmpFmt )
rRet = rUserStr;
else
rRet = FormatNumber( (sal_uInt16)nTmp, nTmpFmt );
return rRet;
}
SwFieldType* SwPageNumberFieldType::Copy() const
{
SwPageNumberFieldType *pTmp = new SwPageNumberFieldType();
pTmp->nNum = nNum;
pTmp->nMax = nMax;
pTmp->nNumberingType = nNumberingType;
pTmp->bVirtuell = bVirtuell;
return pTmp;
}
/*--------------------------------------------------------------------
Beschreibung: Verschiedene Expandierung
--------------------------------------------------------------------*/
void SwPageNumberFieldType::ChangeExpansion( SwDoc* pDoc, sal_uInt16 nPage,
sal_uInt16 nNumPages, sal_Bool bVirt,
const sal_Int16* pNumFmt )
{
nNum = nPage;
nMax = nNumPages;
if( pNumFmt )
nNumberingType = *pNumFmt;
bVirtuell = sal_False;
if( bVirt )
{
// dann muss das Flag ueberprueft werden, denn das Layout setzt
// es NIE zurueck
const SfxItemPool &rPool = pDoc->GetAttrPool();
const SwFmtPageDesc *pDesc;
sal_uInt32 nMaxItems = rPool.GetItemCount2( RES_PAGEDESC );
for( sal_uInt32 n = 0; n < nMaxItems; ++n )
if( 0 != (pDesc = (SwFmtPageDesc*)rPool.GetItem2( RES_PAGEDESC, n ) )
&& pDesc->GetNumOffset() && pDesc->GetDefinedIn() )
{
SwCntntNode* pNd = PTR_CAST( SwCntntNode, pDesc->GetDefinedIn() );
if( pNd )
{
if ( SwIterator<SwFrm,SwCntntNode>::FirstElement(*pNd) )
bVirtuell = sal_True;
}
else if( pDesc->GetDefinedIn()->ISA( SwFmt ))
{
SwAutoFmtGetDocNode aGetHt( &pDoc->GetNodes() );
bVirtuell = !pDesc->GetDefinedIn()->GetInfo( aGetHt );
break;
}
}
}
}
/*--------------------------------------------------------------------
Beschreibung: SwPageNumberField
--------------------------------------------------------------------*/
SwPageNumberField::SwPageNumberField(SwPageNumberFieldType* pTyp,
sal_uInt16 nSub, sal_uInt32 nFmt, short nOff)
: SwField(pTyp, nFmt), nSubType(nSub), nOffset(nOff)
{
}
String SwPageNumberField::Expand() const
{
String sRet;
SwPageNumberFieldType* pFldType = (SwPageNumberFieldType*)GetTyp();
if( PG_NEXT == nSubType && 1 != nOffset )
{
if( pFldType->Expand( GetFormat(), 1, sUserStr, sRet ).Len() )
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
}
else if( PG_PREV == nSubType && -1 != nOffset )
{
if( pFldType->Expand( GetFormat(), -1, sUserStr, sRet ).Len() )
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
}
else
pFldType->Expand( GetFormat(), nOffset, sUserStr, sRet );
return sRet;
}
SwField* SwPageNumberField::Copy() const
{
SwPageNumberField *pTmp =
new SwPageNumberField((SwPageNumberFieldType*)GetTyp(), nSubType, GetFormat(), nOffset);
pTmp->SetLanguage( GetLanguage() );
pTmp->SetUserString( sUserStr );
return pTmp;
}
String SwPageNumberField::GetPar2() const
{
return String::CreateFromInt32(nOffset);
}
void SwPageNumberField::SetPar2(const String& rStr)
{
nOffset = (short)rStr.ToInt32();
}
sal_uInt16 SwPageNumberField::GetSubType() const
{
return nSubType;
}
sal_Bool SwPageNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_FORMAT:
rAny <<= (sal_Int16)GetFormat();
break;
case FIELD_PROP_USHORT1:
rAny <<= nOffset;
break;
case FIELD_PROP_SUBTYPE:
{
text::PageNumberType eType;
eType = text::PageNumberType_CURRENT;
if(nSubType == PG_PREV)
eType = text::PageNumberType_PREV;
else if(nSubType == PG_NEXT)
eType = text::PageNumberType_NEXT;
rAny.setValue(&eType, ::getCppuType((const text::PageNumberType*)0));
}
break;
case FIELD_PROP_PAR1:
rAny <<= OUString(sUserStr);
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwPageNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
sal_Bool bRet = sal_True;
sal_Int16 nSet = 0;
switch( nWhichId )
{
case FIELD_PROP_FORMAT:
rAny >>= nSet;
// TODO: woher kommen die defines?
if(nSet <= SVX_NUM_PAGEDESC )
SetFormat(nSet);
else {
//exception(wrong_value)
;
}
break;
case FIELD_PROP_USHORT1:
rAny >>= nSet;
nOffset = nSet;
break;
case FIELD_PROP_SUBTYPE:
switch( SWUnoHelper::GetEnumAsInt32( rAny ) )
{
case text::PageNumberType_CURRENT:
nSubType = PG_RANDOM;
break;
case text::PageNumberType_PREV:
nSubType = PG_PREV;
break;
case text::PageNumberType_NEXT:
nSubType = PG_NEXT;
break;
default:
bRet = sal_False;
}
break;
case FIELD_PROP_PAR1:
::GetString( rAny, sUserStr );
break;
default:
DBG_ERROR("illegal property");
}
return bRet;
}
/*--------------------------------------------------------------------
Beschreibung: SwAuthorFieldType
--------------------------------------------------------------------*/
SwAuthorFieldType::SwAuthorFieldType()
: SwFieldType( RES_AUTHORFLD )
{
}
String SwAuthorFieldType::Expand(sal_uLong nFmt) const
{
String sRet;
SvtUserOptions& rOpt = SW_MOD()->GetUserOptions();
if((nFmt & 0xff) == AF_NAME)
sRet = rOpt.GetFullName();
else
sRet = rOpt.GetID();
return sRet;
}
SwFieldType* SwAuthorFieldType::Copy() const
{
return new SwAuthorFieldType;
}
/*--------------------------------------------------------------------
Beschreibung: SwAuthorField
--------------------------------------------------------------------*/
SwAuthorField::SwAuthorField(SwAuthorFieldType* pTyp, sal_uInt32 nFmt)
: SwField(pTyp, nFmt)
{
aContent = ((SwAuthorFieldType*)GetTyp())->Expand(GetFormat());
}
String SwAuthorField::Expand() const
{
if (!IsFixed())
((SwAuthorField*)this)->aContent =
((SwAuthorFieldType*)GetTyp())->Expand(GetFormat());
return aContent;
}
SwField* SwAuthorField::Copy() const
{
SwAuthorField *pTmp = new SwAuthorField( (SwAuthorFieldType*)GetTyp(),
GetFormat());
pTmp->SetExpansion(aContent);
return pTmp;
}
sal_Bool SwAuthorField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
sal_Bool bVal;
switch( nWhichId )
{
case FIELD_PROP_BOOL1:
bVal = (GetFormat() & 0xff) == AF_NAME;
rAny.setValue(&bVal, ::getBooleanCppuType());
break;
case FIELD_PROP_BOOL2:
bVal = IsFixed();
rAny.setValue(&bVal, ::getBooleanCppuType());
break;
case FIELD_PROP_PAR1:
rAny <<= rtl::OUString(GetContent());
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwAuthorField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_BOOL1:
SetFormat( *(sal_Bool*)rAny.getValue() ? AF_NAME : AF_SHORTCUT );
break;
case FIELD_PROP_BOOL2:
if( *(sal_Bool*)rAny.getValue() )
SetFormat( GetFormat() | AF_FIXED);
else
SetFormat( GetFormat() & ~AF_FIXED);
break;
case FIELD_PROP_PAR1:
::GetString( rAny, aContent );
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: SwFileNameFieldType
--------------------------------------------------------------------*/
SwFileNameFieldType::SwFileNameFieldType(SwDoc *pDocument)
: SwFieldType( RES_FILENAMEFLD )
{
pDoc = pDocument;
}
String SwFileNameFieldType::Expand(sal_uLong nFmt) const
{
String aRet;
const SwDocShell* pDShell = pDoc->GetDocShell();
if( pDShell && pDShell->HasName() )
{
const INetURLObject& rURLObj = pDShell->GetMedium()->GetURLObject();
switch( nFmt & ~FF_FIXED )
{
case FF_PATH:
{
if( INET_PROT_FILE == rURLObj.GetProtocol() )
{
INetURLObject aTemp(rURLObj);
aTemp.removeSegment();
// #101947# last slash should belong to the pathname
aRet = aTemp.PathToFileName();//GetFull();
}
else
{
aRet = URIHelper::removePassword(
rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
INetURLObject::WAS_ENCODED, URL_DECODE );
aRet.Erase( aRet.Search( String(rURLObj.GetLastName(
URL_DECODE )) ) );
}
}
break;
case FF_NAME:
aRet = rURLObj.GetLastName( URL_DECODE );
break;
case FF_NAME_NOEXT:
aRet = rURLObj.GetBase();
break;
default:
if( INET_PROT_FILE == rURLObj.GetProtocol() )
aRet = rURLObj.GetFull();
else
aRet = URIHelper::removePassword(
rURLObj.GetMainURL( INetURLObject::NO_DECODE ),
INetURLObject::WAS_ENCODED, URL_DECODE );
}
}
return aRet;
}
SwFieldType* SwFileNameFieldType::Copy() const
{
SwFieldType *pTmp = new SwFileNameFieldType(pDoc);
return pTmp;
}
/*--------------------------------------------------------------------
Beschreibung: SwFileNameField
--------------------------------------------------------------------*/
SwFileNameField::SwFileNameField(SwFileNameFieldType* pTyp, sal_uInt32 nFmt)
: SwField(pTyp, nFmt)
{
aContent = ((SwFileNameFieldType*)GetTyp())->Expand(GetFormat());
}
String SwFileNameField::Expand() const
{
if (!IsFixed())
((SwFileNameField*)this)->aContent = ((SwFileNameFieldType*)GetTyp())->Expand(GetFormat());
return aContent;
}
SwField* SwFileNameField::Copy() const
{
SwFileNameField *pTmp =
new SwFileNameField((SwFileNameFieldType*)GetTyp(), GetFormat());
pTmp->SetExpansion(aContent);
return pTmp;
}
sal_Bool SwFileNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_FORMAT:
{
sal_Int16 nRet;
switch( GetFormat() &(~FF_FIXED) )
{
case FF_PATH:
nRet = text::FilenameDisplayFormat::PATH;
break;
case FF_NAME_NOEXT:
nRet = text::FilenameDisplayFormat::NAME;
break;
case FF_NAME:
nRet = text::FilenameDisplayFormat::NAME_AND_EXT;
break;
default: nRet = text::FilenameDisplayFormat::FULL;
}
rAny <<= nRet;
}
break;
case FIELD_PROP_BOOL2:
{
sal_Bool bVal = IsFixed();
rAny.setValue(&bVal, ::getBooleanCppuType());
}
break;
case FIELD_PROP_PAR3:
rAny <<= OUString(GetContent());
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwFileNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_FORMAT:
{
//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
// called with a int32 value! But normally we need
// here only a int16
sal_Int32 nType = 0;
rAny >>= nType;
sal_Bool bFixed = IsFixed();
switch( nType )
{
case text::FilenameDisplayFormat::PATH:
nType = FF_PATH;
break;
case text::FilenameDisplayFormat::NAME:
nType = FF_NAME_NOEXT;
break;
case text::FilenameDisplayFormat::NAME_AND_EXT:
nType = FF_NAME;
break;
default: nType = FF_PATHNAME;
}
if(bFixed)
nType |= FF_FIXED;
SetFormat(nType);
}
break;
case FIELD_PROP_BOOL2:
if( *(sal_Bool*)rAny.getValue() )
SetFormat( GetFormat() | FF_FIXED);
else
SetFormat( GetFormat() & ~FF_FIXED);
break;
case FIELD_PROP_PAR3:
::GetString( rAny, aContent );
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: SwTemplNameFieldType
--------------------------------------------------------------------*/
SwTemplNameFieldType::SwTemplNameFieldType(SwDoc *pDocument)
: SwFieldType( RES_TEMPLNAMEFLD )
{
pDoc = pDocument;
}
String SwTemplNameFieldType::Expand(sal_uLong nFmt) const
{
ASSERT( nFmt < FF_END, "Expand: kein guelt. Fmt!" );
String aRet;
SwDocShell *pDocShell(pDoc->GetDocShell());
DBG_ASSERT(pDocShell, "no SwDocShell");
if (pDocShell) {
uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
pDocShell->GetModel(), uno::UNO_QUERY_THROW);
uno::Reference<document::XDocumentProperties> xDocProps(
xDPS->getDocumentProperties());
DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties");
if( FF_UI_NAME == nFmt )
aRet = xDocProps->getTemplateName();
else if( !xDocProps->getTemplateURL().equalsAscii("") )
{
if( FF_UI_RANGE == nFmt )
{
// fuers besorgen vom RegionNamen !!
SfxDocumentTemplates aFac;
aFac.Construct();
String sTmp;
aFac.GetLogicNames( xDocProps->getTemplateURL(), aRet, sTmp );
}
else
{
INetURLObject aPathName( xDocProps->getTemplateURL() );
if( FF_NAME == nFmt )
aRet = aPathName.GetName(URL_DECODE);
else if( FF_NAME_NOEXT == nFmt )
aRet = aPathName.GetBase();
else
{
if( FF_PATH == nFmt )
{
aPathName.removeSegment();
aRet = aPathName.GetFull();
}
else
aRet = aPathName.GetFull();
}
}
}
}
return aRet;
}
SwFieldType* SwTemplNameFieldType::Copy() const
{
SwFieldType *pTmp = new SwTemplNameFieldType(pDoc);
return pTmp;
}
/*--------------------------------------------------------------------
Beschreibung: SwTemplNameField
--------------------------------------------------------------------*/
SwTemplNameField::SwTemplNameField(SwTemplNameFieldType* pTyp, sal_uInt32 nFmt)
: SwField(pTyp, nFmt)
{}
String SwTemplNameField::Expand() const
{
return((SwTemplNameFieldType*)GetTyp())->Expand(GetFormat());
}
SwField* SwTemplNameField::Copy() const
{
SwTemplNameField *pTmp =
new SwTemplNameField((SwTemplNameFieldType*)GetTyp(), GetFormat());
return pTmp;
}
sal_Bool SwTemplNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch ( nWhichId )
{
case FIELD_PROP_FORMAT:
{
sal_Int16 nRet;
switch( GetFormat() )
{
case FF_PATH: nRet = text::FilenameDisplayFormat::PATH; break;
case FF_NAME_NOEXT: nRet = text::FilenameDisplayFormat::NAME; break;
case FF_NAME: nRet = text::FilenameDisplayFormat::NAME_AND_EXT; break;
case FF_UI_RANGE: nRet = text::TemplateDisplayFormat::AREA; break;
case FF_UI_NAME: nRet = text::TemplateDisplayFormat::TITLE; break;
default: nRet = text::FilenameDisplayFormat::FULL;
}
rAny <<= nRet;
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwTemplNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch ( nWhichId )
{
case FIELD_PROP_FORMAT:
{
//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
// called with a int32 value! But normally we need
// here only a int16
sal_Int32 nType = 0;
rAny >>= nType;
switch( nType )
{
case text::FilenameDisplayFormat::PATH:
SetFormat(FF_PATH);
break;
case text::FilenameDisplayFormat::NAME:
SetFormat(FF_NAME_NOEXT);
break;
case text::FilenameDisplayFormat::NAME_AND_EXT:
SetFormat(FF_NAME);
break;
case text::TemplateDisplayFormat::AREA :
SetFormat(FF_UI_RANGE);
break;
case text::TemplateDisplayFormat::TITLE :
SetFormat(FF_UI_NAME);
break;
default: SetFormat(FF_PATHNAME);
}
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: SwDocStatFieldType
--------------------------------------------------------------------*/
SwDocStatFieldType::SwDocStatFieldType(SwDoc* pDocument)
: SwFieldType( RES_DOCSTATFLD ), nNumberingType( SVX_NUM_ARABIC )
{
pDoc = pDocument;
}
String SwDocStatFieldType::Expand(sal_uInt16 nSubType, sal_uInt32 nFmt) const
{
sal_uInt32 nVal = 0;
const SwDocStat& rDStat = pDoc->GetDocStat();
switch( nSubType )
{
case DS_TBL: nVal = rDStat.nTbl; break;
case DS_GRF: nVal = rDStat.nGrf; break;
case DS_OLE: nVal = rDStat.nOLE; break;
case DS_PARA: nVal = rDStat.nPara; break;
case DS_WORD: nVal = rDStat.nWord; break;
case DS_CHAR: nVal = rDStat.nChar; break;
case DS_PAGE:
if( pDoc->GetCurrentLayout() )//swmod 080218
((SwDocStat &)rDStat).nPage = pDoc->GetCurrentLayout()->GetPageNum(); //swmod 080218
nVal = rDStat.nPage;
if( SVX_NUM_PAGEDESC == nFmt )
nFmt = (sal_uInt32)nNumberingType;
break;
default:
ASSERT( sal_False, "SwDocStatFieldType::Expand: unbekannter SubType" );
}
String sRet;
if( nVal <= SHRT_MAX )
sRet = FormatNumber( (sal_uInt16)nVal, nFmt );
else
sRet = String::CreateFromInt32( nVal );
return sRet;
}
SwFieldType* SwDocStatFieldType::Copy() const
{
SwDocStatFieldType *pTmp = new SwDocStatFieldType(pDoc);
return pTmp;
}
/*--------------------------------------------------------------------
Beschreibung: SwDocStatFieldType
Aus historischen Gruenden steht in nFormat der
SubType
--------------------------------------------------------------------*/
SwDocStatField::SwDocStatField(SwDocStatFieldType* pTyp, sal_uInt16 nSub, sal_uInt32 nFmt)
: SwField(pTyp, nFmt),
nSubType(nSub)
{}
String SwDocStatField::Expand() const
{
return((SwDocStatFieldType*)GetTyp())->Expand(nSubType, GetFormat());
}
SwField* SwDocStatField::Copy() const
{
SwDocStatField *pTmp = new SwDocStatField(
(SwDocStatFieldType*)GetTyp(), nSubType, GetFormat() );
return pTmp;
}
sal_uInt16 SwDocStatField::GetSubType() const
{
return nSubType;
}
void SwDocStatField::SetSubType(sal_uInt16 nSub)
{
nSubType = nSub;
}
void SwDocStatField::ChangeExpansion( const SwFrm* pFrm )
{
if( DS_PAGE == nSubType && SVX_NUM_PAGEDESC == GetFormat() )
((SwDocStatFieldType*)GetTyp())->SetNumFormat(
pFrm->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType() );
}
sal_Bool SwDocStatField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch ( nWhichId )
{
case FIELD_PROP_USHORT2:
rAny <<= (sal_Int16)GetFormat();
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwDocStatField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
sal_Bool bRet = sal_False;
switch ( nWhichId )
{
case FIELD_PROP_USHORT2:
{
sal_Int16 nSet = 0;
rAny >>= nSet;
if(nSet <= SVX_NUM_CHARS_LOWER_LETTER_N &&
nSet != SVX_NUM_CHAR_SPECIAL &&
nSet != SVX_NUM_BITMAP)
{
SetFormat(nSet);
bRet = sal_True;
}
}
break;
default:
DBG_ERROR("illegal property");
}
return bRet;
}
/*--------------------------------------------------------------------
Beschreibung: DokumentinfoFields
--------------------------------------------------------------------*/
SwDocInfoFieldType::SwDocInfoFieldType(SwDoc* pDc)
: SwValueFieldType( pDc, RES_DOCINFOFLD )
{
}
// ---------------------------------------------------------------------------
SwFieldType* SwDocInfoFieldType::Copy() const
{
SwDocInfoFieldType* pTyp = new SwDocInfoFieldType(GetDoc());
return pTyp;
}
void lcl_GetLocalDataWrapper( sal_uLong nLang,
const LocaleDataWrapper **ppAppLocalData,
const LocaleDataWrapper **ppLocalData )
{
SvtSysLocale aLocale;
*ppAppLocalData = &aLocale.GetLocaleData();
*ppLocalData = *ppAppLocalData;
if( nLang != SvxLocaleToLanguage( (*ppLocalData)->getLocale() ) )
*ppLocalData = new LocaleDataWrapper(
::comphelper::getProcessServiceFactory(),
SvxCreateLocale( static_cast<LanguageType>(nLang) ) );
}
// ---------------------------------------------------------------------------
String SwDocInfoFieldType::Expand( sal_uInt16 nSub, sal_uInt32 nFormat,
sal_uInt16 nLang, const String& rName ) const
{
String aStr;
const LocaleDataWrapper *pAppLocalData = 0, *pLocalData = 0;
SwDocShell *pDocShell(GetDoc()->GetDocShell());
DBG_ASSERT(pDocShell, "no SwDocShell");
if (!pDocShell) { return aStr; }
uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
pDocShell->GetModel(), uno::UNO_QUERY_THROW);
uno::Reference<document::XDocumentProperties> xDocProps(
xDPS->getDocumentProperties());
DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties");
sal_uInt16 nExtSub = nSub & 0xff00;
nSub &= 0xff; // ExtendedSubTypes nicht beachten
switch(nSub)
{
case DI_TITEL: aStr = xDocProps->getTitle(); break;
case DI_THEMA: aStr = xDocProps->getSubject(); break;
case DI_KEYS: aStr = ::comphelper::string::convertCommaSeparated(
xDocProps->getKeywords());
break;
case DI_COMMENT:aStr = xDocProps->getDescription(); break;
case DI_DOCNO: aStr = String::CreateFromInt32(
xDocProps->getEditingCycles() );
break;
case DI_EDIT:
if ( !nFormat )
{
lcl_GetLocalDataWrapper( nLang, &pAppLocalData, &pLocalData );
sal_Int32 dur = xDocProps->getEditingDuration();
aStr = pLocalData->getTime( Time(dur/3600, (dur%3600)/60, dur%60),
sal_False, sal_False);
}
else
{
sal_Int32 dur = xDocProps->getEditingDuration();
double fVal = Time(dur/3600, (dur%3600)/60, dur%60).GetTimeInDays();
aStr = ExpandValue(fVal, nFormat, nLang);
}
break;
case DI_CUSTOM:
{
::rtl::OUString sVal;
try
{
uno::Any aAny;
uno::Reference < beans::XPropertySet > xSet(
xDocProps->getUserDefinedProperties(),
uno::UNO_QUERY_THROW);
aAny = xSet->getPropertyValue( rName );
uno::Reference < script::XTypeConverter > xConverter( comphelper::getProcessServiceFactory()
->createInstance(::rtl::OUString::createFromAscii("com.sun.star.script.Converter")), uno::UNO_QUERY );
uno::Any aNew;
aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
aNew >>= sVal;
}
catch (uno::Exception&) {}
return sVal;
}
default:
{
String aName( xDocProps->getAuthor() );
util::DateTime uDT( xDocProps->getCreationDate() );
Date aD(uDT.Day, uDT.Month, uDT.Year);
Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
DateTime aDate(aD,aT);
if( nSub == DI_CREATE )
; // das wars schon!!
else if( nSub == DI_CHANGE )
{
aName = xDocProps->getModifiedBy();
uDT = xDocProps->getModificationDate();
Date bD(uDT.Day, uDT.Month, uDT.Year);
Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
DateTime bDate(bD,bT);
aDate = bDate;
}
else if( nSub == DI_PRINT )
{
aName = xDocProps->getPrintedBy();
uDT = xDocProps->getPrintDate();
Date bD(uDT.Day, uDT.Month, uDT.Year);
Time bT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
DateTime bDate(bD,bT);
aDate = bDate;
}
else
break;
if (aDate.IsValid())
{
switch (nExtSub & ~DI_SUB_FIXED)
{
case DI_SUB_AUTHOR:
aStr = aName;
break;
case DI_SUB_TIME:
if (!nFormat)
{
lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
&pLocalData );
aStr = pLocalData->getTime( aDate,
sal_False, sal_False);
}
else
{
// Numberformatter anwerfen!
double fVal = SwDateTimeField::GetDateTime( GetDoc(),
aDate);
aStr = ExpandValue(fVal, nFormat, nLang);
}
break;
case DI_SUB_DATE:
if (!nFormat)
{
lcl_GetLocalDataWrapper( nLang, &pAppLocalData,
&pLocalData );
aStr = pLocalData->getDate( aDate );
}
else
{
// Numberformatter anwerfen!
double fVal = SwDateTimeField::GetDateTime( GetDoc(),
aDate);
aStr = ExpandValue(fVal, nFormat, nLang);
}
break;
}
}
}
break;
}
if( pAppLocalData != pLocalData )
delete pLocalData;
return aStr;
}
// ---------------------------------------------------------------------------
SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const String& rName, sal_uInt32 nFmt) :
SwValueField(pTyp, nFmt), nSubType(nSub)
{
aName = rName;
aContent = ((SwDocInfoFieldType*)GetTyp())->Expand(nSubType, nFmt, GetLanguage(), aName);
}
SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const String& rName, const String& rValue, sal_uInt32 nFmt) :
SwValueField(pTyp, nFmt), nSubType(nSub)
{
aName = rName;
aContent = rValue;
}
// ---------------------------------------------------------------------------
template<class T>
double lcl_TimeToDouble( const T& rTime )
{
const double fMilliSecondsPerDay = 86400000.0;
return ((rTime.Hours*3600000)+(rTime.Minutes*60000)+(rTime.Seconds*1000)+(rTime.HundredthSeconds*10)) / fMilliSecondsPerDay;
}
template<class D>
double lcl_DateToDouble( const D& rDate, const Date& rNullDate )
{
long nDate = Date::DateToDays( rDate.Day, rDate.Month, rDate.Year );
long nNullDate = Date::DateToDays( rNullDate.GetDay(), rNullDate.GetMonth(), rNullDate.GetYear() );
return double( nDate - nNullDate );
}
String SwDocInfoField::Expand() const
{
if ( ( nSubType & 0xFF ) == DI_CUSTOM )
{
// custom properties currently need special treatment
// we don't have a secure way to detect "real" custom properties in Word Import of text fields
// so we treat *every* unknown property as a custom property, even the "built-in" section in Word's document summary information stream
// as these properties have not been inserted when the document summary information was imported, we do it here
// this approach is still a lot better than the old one to import such fields as "user fields" and simple text
SwDocShell* pDocShell = GetDoc()->GetDocShell();
if( !pDocShell )
return aContent;
try
{
uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW);
uno::Reference<document::XDocumentProperties> xDocProps( xDPS->getDocumentProperties());
uno::Reference < beans::XPropertySet > xSet( xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
uno::Reference < beans::XPropertySetInfo > xSetInfo = xSet->getPropertySetInfo();
uno::Any aAny;
if( xSetInfo->hasPropertyByName( aName ) )
aAny = xSet->getPropertyValue( aName );
if ( aAny.getValueType() != ::getVoidCppuType() )
{
// "void" type means that the property has not been inserted until now
if ( !IsFixed() )
{
// if the field is "fixed" we don't update it from the property
::rtl::OUString sVal;
uno::Reference < script::XTypeConverter > xConverter( comphelper::getProcessServiceFactory()
->createInstance(::rtl::OUString::createFromAscii("com.sun.star.script.Converter")), uno::UNO_QUERY );
util::Date aDate;
util::DateTime aDateTime;
util::Duration aDuration;
if( aAny >>= aDate)
{
SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
Date* pNullDate = pFormatter->GetNullDate();
sVal = ExpandValue( lcl_DateToDouble<util::Date>( aDate, *pNullDate ), GetFormat(), GetLanguage());
}
else if( aAny >>= aDateTime )
{
double fDateTime = lcl_TimeToDouble<util::DateTime>( aDateTime );
SvNumberFormatter* pFormatter = pDocShell->GetDoc()->GetNumberFormatter();
Date* pNullDate = pFormatter->GetNullDate();
fDateTime += lcl_DateToDouble<util::DateTime>( aDateTime, *pNullDate );
sVal = ExpandValue( fDateTime, GetFormat(), GetLanguage());
}
else if( aAny >>= aDuration )
{
String sText(aDuration.Negative ? '-' : '+');
sText += ViewShell::GetShellRes()->sDurationFormat;
sText.SearchAndReplace(String::CreateFromAscii( "%1"), String::CreateFromInt32( aDuration.Years ) );
sText.SearchAndReplace(String::CreateFromAscii( "%2"), String::CreateFromInt32( aDuration.Months ) );
sText.SearchAndReplace(String::CreateFromAscii( "%3"), String::CreateFromInt32( aDuration.Days ) );
sText.SearchAndReplace(String::CreateFromAscii( "%4"), String::CreateFromInt32( aDuration.Hours ) );
sText.SearchAndReplace(String::CreateFromAscii( "%5"), String::CreateFromInt32( aDuration.Minutes) );
sText.SearchAndReplace(String::CreateFromAscii( "%6"), String::CreateFromInt32( aDuration.Seconds) );
sVal = sText;
}
else
{
uno::Any aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
aNew >>= sVal;
}
((SwDocInfoField*)this)->aContent = sVal;
}
}
}
catch (uno::Exception&) {}
}
else if ( !IsFixed() )
((SwDocInfoField*)this)->aContent = ((SwDocInfoFieldType*)GetTyp())->Expand(nSubType, GetFormat(), GetLanguage(), aName);
return aContent;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwDocInfoField::GetFieldName() const
{
String aStr(SwFieldType::GetTypeStr(GetTypeId()));
aStr += ':';
sal_uInt16 const nSub = nSubType & 0xff;
switch (nSub)
{
case DI_CUSTOM:
aStr += aName;
break;
default:
aStr += *ViewShell::GetShellRes()
->aDocInfoLst[ nSub - DI_SUBTYPE_BEGIN ];
break;
}
if (IsFixed())
{
aStr += ' ';
aStr += ViewShell::GetShellRes()->aFixedStr;
}
return aStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwDocInfoField::Copy() const
{
SwDocInfoField* pFld = new SwDocInfoField((SwDocInfoFieldType*)GetTyp(), nSubType, aName, GetFormat());
pFld->SetAutomaticLanguage(IsAutomaticLanguage());
pFld->aContent = aContent;
return pFld;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_uInt16 SwDocInfoField::GetSubType() const
{
return nSubType;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwDocInfoField::SetSubType(sal_uInt16 nSub)
{
nSubType = nSub;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwDocInfoField::SetLanguage(sal_uInt16 nLng)
{
if (!GetFormat())
SwField::SetLanguage(nLng);
else
SwValueField::SetLanguage(nLng);
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_Bool SwDocInfoField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
rAny <<= OUString(aContent);
break;
case FIELD_PROP_PAR4:
rAny <<= OUString(aName);
break;
case FIELD_PROP_USHORT1:
rAny <<= (sal_Int16)aContent.ToInt32();
break;
case FIELD_PROP_BOOL1:
{
sal_Bool bVal = 0 != (nSubType & DI_SUB_FIXED);
rAny.setValue(&bVal, ::getBooleanCppuType());
}
break;
case FIELD_PROP_FORMAT:
rAny <<= (sal_Int32)GetFormat();
break;
case FIELD_PROP_DOUBLE:
{
double fVal = GetValue();
rAny.setValue(&fVal, ::getCppuType(&fVal));
}
break;
case FIELD_PROP_PAR3:
rAny <<= rtl::OUString(Expand());
break;
case FIELD_PROP_BOOL2:
{
sal_uInt16 nExtSub = (nSubType & 0xff00) & ~DI_SUB_FIXED;
sal_Bool bVal = (nExtSub == DI_SUB_DATE);
rAny.setValue(&bVal, ::getBooleanCppuType());
}
break;
default:
return SwField::QueryValue(rAny, nWhichId);
}
return sal_True;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_Bool SwDocInfoField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
sal_Int32 nValue = 0;
switch( nWhichId )
{
case FIELD_PROP_PAR1:
if( nSubType & DI_SUB_FIXED )
::GetString( rAny, aContent );
break;
case FIELD_PROP_USHORT1:
if( nSubType & DI_SUB_FIXED )
{
rAny >>= nValue;
aContent = String::CreateFromInt32(nValue);
}
break;
case FIELD_PROP_BOOL1:
if(*(sal_Bool*)rAny.getValue())
nSubType |= DI_SUB_FIXED;
else
nSubType &= ~DI_SUB_FIXED;
break;
case FIELD_PROP_FORMAT:
{
rAny >>= nValue;
if( nValue >= 0)
SetFormat(nValue);
}
break;
case FIELD_PROP_PAR3:
::GetString( rAny, aContent );
break;
case FIELD_PROP_BOOL2:
nSubType &= 0xf0ff;
if(*(sal_Bool*)rAny.getValue())
nSubType |= DI_SUB_DATE;
else
nSubType |= DI_SUB_TIME;
break;
default:
return SwField::PutValue(rAny, nWhichId);
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: SwHiddenTxtFieldType by JP
--------------------------------------------------------------------*/
SwHiddenTxtFieldType::SwHiddenTxtFieldType( sal_Bool bSetHidden )
: SwFieldType( RES_HIDDENTXTFLD ), bHidden( bSetHidden )
{
}
SwFieldType* SwHiddenTxtFieldType::Copy() const
{
return new SwHiddenTxtFieldType( bHidden );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwHiddenTxtFieldType::SetHiddenFlag( sal_Bool bSetHidden )
{
if( bHidden != bSetHidden )
{
bHidden = bSetHidden;
UpdateFlds(); // alle HiddenText benachrichtigen
}
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwHiddenTxtField::SwHiddenTxtField( SwHiddenTxtFieldType* pFldType,
sal_Bool bConditional,
const String& rCond,
const String& rStr,
sal_Bool bHidden,
sal_uInt16 nSub) :
SwField( pFldType ), aCond(rCond), nSubType(nSub),
bCanToggle(bConditional), bIsHidden(bHidden), bValid(sal_False)
{
if(nSubType == TYP_CONDTXTFLD)
{
sal_uInt16 nPos = 0;
aTRUETxt = rStr.GetToken(0, '|', nPos);
if(nPos != STRING_NOTFOUND)
{
aFALSETxt = rStr.GetToken(0, '|', nPos);
if(nPos != STRING_NOTFOUND)
{
aContent = rStr.GetToken(0, '|', nPos);
bValid = sal_True;
}
}
}
else
aTRUETxt = rStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwHiddenTxtField::SwHiddenTxtField( SwHiddenTxtFieldType* pFldType,
const String& rCond,
const String& rTrue,
const String& rFalse,
sal_uInt16 nSub)
: SwField( pFldType ), aTRUETxt(rTrue), aFALSETxt(rFalse), aCond(rCond), nSubType(nSub),
bIsHidden(sal_True), bValid(sal_False)
{
bCanToggle = aCond.Len() > 0;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwHiddenTxtField::Expand() const
{
// Type: !Hidden -> immer anzeigen
// Hide -> Werte die Bedingung aus
if( TYP_CONDTXTFLD == nSubType )
{
if( bValid )
return aContent;
if( bCanToggle && !bIsHidden )
return aTRUETxt;
}
else if( !((SwHiddenTxtFieldType*)GetTyp())->GetHiddenFlag() ||
( bCanToggle && bIsHidden ))
return aTRUETxt;
return aFALSETxt;
}
/*--------------------------------------------------------------------
Beschreibung: Aktuellen Field-Value holen und cachen
--------------------------------------------------------------------*/
void SwHiddenTxtField::Evaluate(SwDoc* pDoc)
{
ASSERT(pDoc, Wo ist das Dokument Seniore);
if( TYP_CONDTXTFLD == nSubType )
{
SwNewDBMgr* pMgr = pDoc->GetNewDBMgr();
bValid = sal_False;
String sTmpName;
if (bCanToggle && !bIsHidden)
sTmpName = aTRUETxt;
else
sTmpName = aFALSETxt;
// OS 21.08.97: #42943# Datenbankausdruecke muessen sich von
// einfachem Text unterscheiden. also wird der einfache Text
// bevorzugt in Anfuehrungszeichen gesetzt.
// Sind diese vorhanden werden umschliessende entfernt.
// Wenn nicht, dann wird auf die Tauglichkeit als Datenbankname
// geprueft. Nur wenn zwei oder mehr Punkte vorhanden sind und kein
// Anfuehrungszeichen enthalten ist, gehen wir von einer DB aus.
if(sTmpName.Len() > 1 && sTmpName.GetChar(0) == '\"' &&
sTmpName.GetChar((sTmpName.Len() - 1))== '\"')
{
aContent = sTmpName.Copy(1, sTmpName.Len() - 2);
bValid = sal_True;
}
else if(sTmpName.Search('\"') == STRING_NOTFOUND &&
sTmpName.GetTokenCount('.') > 2)
{
::ReplacePoint(sTmpName);
if(sTmpName.GetChar(0) == '[' && sTmpName.GetChar(sTmpName.Len()-1) == ']')
{ // Eckige Klammern entfernen
sTmpName.Erase(0, 1);
sTmpName.Erase(sTmpName.Len()-1, 1);
}
if( pMgr)
{
String sDBName( GetDBName( sTmpName, pDoc ));
String sDataSource(sDBName.GetToken(0, DB_DELIM));
String sDataTableOrQuery(sDBName.GetToken(1, DB_DELIM));
if( pMgr->IsInMerge() && sDBName.Len() &&
pMgr->IsDataSourceOpen( sDataSource,
sDataTableOrQuery, sal_False))
{
double fNumber;
sal_uInt32 nTmpFormat;
pMgr->GetMergeColumnCnt(GetColumnName( sTmpName ),
GetLanguage(), aContent, &fNumber, &nTmpFormat );
bValid = sal_True;
}
else if( sDBName.Len() && sDataSource.Len() &&
sDataTableOrQuery.Len() )
bValid = sal_True;
}
}
}
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwHiddenTxtField::GetFieldName() const
{
String aStr(SwFieldType::GetTypeStr(nSubType));
aStr += ' ';
aStr += aCond;
aStr += ' ';
aStr += aTRUETxt;
if (nSubType == TYP_CONDTXTFLD)
{
aStr.AppendAscii(" : ");
aStr += aFALSETxt;
}
return aStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwHiddenTxtField::Copy() const
{
SwHiddenTxtField* pFld =
new SwHiddenTxtField((SwHiddenTxtFieldType*)GetTyp(), aCond,
aTRUETxt, aFALSETxt);
pFld->bIsHidden = bIsHidden;
pFld->bValid = bValid;
pFld->aContent = aContent;
pFld->SetFormat(GetFormat());
pFld->nSubType = nSubType;
return pFld;
}
/*--------------------------------------------------------------------
Beschreibung: Bedingung setzen
--------------------------------------------------------------------*/
void SwHiddenTxtField::SetPar1(const String& rStr)
{
aCond = rStr;
bCanToggle = aCond.Len() > 0;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
const String& SwHiddenTxtField::GetPar1() const
{
return aCond;
}
/*--------------------------------------------------------------------
Beschreibung: True/False Text
--------------------------------------------------------------------*/
void SwHiddenTxtField::SetPar2(const String& rStr)
{
if(nSubType == TYP_CONDTXTFLD)
{
sal_uInt16 nPos = rStr.Search('|');
aTRUETxt = rStr.Copy(0, nPos);
if(nPos != STRING_NOTFOUND)
aFALSETxt = rStr.Copy(nPos + 1);
}
else
aTRUETxt = rStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwHiddenTxtField::GetPar2() const
{
String aRet(aTRUETxt);
if(nSubType == TYP_CONDTXTFLD)
{
aRet += '|';
aRet += aFALSETxt;
}
return aRet;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_uInt16 SwHiddenTxtField::GetSubType() const
{
return nSubType;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_Bool SwHiddenTxtField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
const String* pOut = 0;
switch( nWhichId )
{
case FIELD_PROP_PAR1:
pOut = &aCond;
break;
case FIELD_PROP_PAR2:
pOut = &aTRUETxt;
break;
case FIELD_PROP_PAR3:
pOut = &aFALSETxt;
break;
case FIELD_PROP_PAR4 :
pOut = &aContent;
break;
case FIELD_PROP_BOOL1:
{
sal_Bool bHidden = bIsHidden;
rAny.setValue(&bHidden, ::getBooleanCppuType());
}
break;
default:
DBG_ERROR("illegal property");
}
if( pOut )
rAny <<= OUString( *pOut );
return sal_True;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_Bool SwHiddenTxtField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
{
String sVal;
SetPar1(::GetString( rAny, sVal ));
}
break;
case FIELD_PROP_PAR2:
::GetString( rAny, aTRUETxt );
break;
case FIELD_PROP_PAR3:
::GetString( rAny, aFALSETxt );
break;
case FIELD_PROP_BOOL1:
bIsHidden = *(sal_Bool*)rAny.getValue();
break;
case FIELD_PROP_PAR4:
::GetString( rAny, aContent);
bValid = sal_True;
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
//------------------------------------------------------------------------------
String SwHiddenTxtField::GetColumnName(const String& rName)
{
sal_uInt16 nPos = rName.Search(DB_DELIM);
if( STRING_NOTFOUND != nPos )
{
nPos = rName.Search(DB_DELIM, nPos + 1);
if( STRING_NOTFOUND != nPos )
return rName.Copy(nPos + 1);
}
return rName;
}
//------------------------------------------------------------------------------
String SwHiddenTxtField::GetDBName(const String& rName, SwDoc *pDoc)
{
sal_uInt16 nPos = rName.Search(DB_DELIM);
if( STRING_NOTFOUND != nPos )
{
nPos = rName.Search(DB_DELIM, nPos + 1);
if( STRING_NOTFOUND != nPos )
return rName.Copy( 0, nPos );
}
SwDBData aData = pDoc->GetDBData();
String sRet = aData.sDataSource;
sRet += DB_DELIM;
sRet += String(aData.sCommand);
return sRet;
}
/*--------------------------------------------------------------------
Beschreibung: Der Feldtyp fuer Zeilenhoehe 0
--------------------------------------------------------------------*/
SwHiddenParaFieldType::SwHiddenParaFieldType()
: SwFieldType( RES_HIDDENPARAFLD )
{
}
SwFieldType* SwHiddenParaFieldType::Copy() const
{
SwHiddenParaFieldType* pTyp = new SwHiddenParaFieldType();
return pTyp;
}
/*--------------------------------------------------------------------
Beschreibung: Das Feld Zeilenhoehe 0
--------------------------------------------------------------------*/
SwHiddenParaField::SwHiddenParaField(SwHiddenParaFieldType* pTyp, const String& rStr)
: SwField(pTyp), aCond(rStr)
{
bIsHidden = sal_False;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwHiddenParaField::Expand() const
{
return aEmptyStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwHiddenParaField::Copy() const
{
SwHiddenParaField* pFld = new SwHiddenParaField((SwHiddenParaFieldType*)GetTyp(), aCond);
pFld->bIsHidden = bIsHidden;
return pFld;
}
sal_Bool SwHiddenParaField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch ( nWhichId )
{
case FIELD_PROP_PAR1:
rAny <<= OUString(aCond);
break;
case FIELD_PROP_BOOL1:
{
sal_Bool bHidden = bIsHidden;
rAny.setValue(&bHidden, ::getBooleanCppuType());
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwHiddenParaField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch ( nWhichId )
{
case FIELD_PROP_PAR1:
::GetString( rAny, aCond );
break;
case FIELD_PROP_BOOL1:
bIsHidden = *(sal_Bool*)rAny.getValue();
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: Bedingung setzen
--------------------------------------------------------------------*/
void SwHiddenParaField::SetPar1(const String& rStr)
{
aCond = rStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
const String& SwHiddenParaField::GetPar1() const
{
return aCond;
}
/*--------------------------------------------------------------------
Beschreibung: PostIt
--------------------------------------------------------------------*/
SwPostItFieldType::SwPostItFieldType(SwDoc *pDoc)
: SwFieldType( RES_POSTITFLD )
, mpDoc(pDoc)
{}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwFieldType* SwPostItFieldType::Copy() const
{
return new SwPostItFieldType(mpDoc);
}
SwPostItField::SwPostItField(
SwPostItFieldType* pT,
const String& rCommentContent,
const String& rAuthor,
const String& rAuthorInitials,
const String& rName,
const DateTime& rDateTime )
: SwField( pT )
, msCommentContent( rCommentContent )
, msAuthor( rAuthor )
, msAuthorInitials( rAuthorInitials )
, msName( rName )
, maDateTime( rDateTime )
, mpText( NULL )
, m_pTextObject( NULL )
{
}
SwPostItField::~SwPostItField()
{
if ( m_pTextObject != NULL )
{
m_pTextObject->DisposeEditSource();
m_pTextObject->release();
}
delete mpText;
}
String SwPostItField::Expand() const
{
return aEmptyStr;
}
String SwPostItField::GetDescription() const
{
return SW_RES(STR_NOTE);
}
SwField* SwPostItField::Copy() const
{
SwPostItField* pRet =
new SwPostItField(
(SwPostItFieldType*)GetTyp(),
msCommentContent,
msAuthor,
msAuthorInitials,
msName,
maDateTime);
if ( mpText != NULL )
{
pRet->SetTextObject( new OutlinerParaObject(*mpText) );
}
// Note: member <m_pTextObject> not copied.
return pRet;
}
void SwPostItField::SetPar1(const String& rStr)
{
msAuthor = rStr;
}
const String& SwPostItField::GetPar1() const
{
return msAuthor;
}
void SwPostItField::SetPar2(const String& rStr)
{
msCommentContent = rStr;
}
String SwPostItField::GetPar2() const
{
return msCommentContent;
}
void SwPostItField::SetName(const String& rName)
{
msName = rName;
}
const String& SwPostItField::GetName() const
{
return msName;
}
const OutlinerParaObject* SwPostItField::GetTextObject() const
{
return mpText;
}
void SwPostItField::SetTextObject( OutlinerParaObject* pText )
{
delete mpText;
mpText = pText;
}
sal_uInt32 SwPostItField::GetNumberOfParagraphs() const
{
return (mpText) ? mpText->Count() : 1;
}
sal_Bool SwPostItField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
rAny <<= OUString(msAuthor);
break;
case FIELD_PROP_PAR2:
{
rAny <<= OUString(msCommentContent);
break;
}
case FIELD_PROP_PAR3:
rAny <<= OUString(msAuthorInitials);
break;
case FIELD_PROP_PAR4:
rAny <<= OUString(msName);
break;
case FIELD_PROP_TEXT:
{
if ( !m_pTextObject )
{
SwPostItFieldType* pGetType = (SwPostItFieldType*)GetTyp();
SwDoc* pDoc = pGetType->GetDoc();
SwTextAPIEditSource* pObj = new SwTextAPIEditSource( pDoc );
const_cast <SwPostItField*> (this)->m_pTextObject = new SwTextAPIObject( pObj );
m_pTextObject->acquire();
}
if ( mpText )
m_pTextObject->SetText( *mpText );
else
m_pTextObject->SetString( msCommentContent );
uno::Reference < text::XText > xText( m_pTextObject );
rAny <<= xText;
break;
}
case FIELD_PROP_DATE:
{
util::Date aSetDate;
aSetDate.Day = maDateTime.GetDay();
aSetDate.Month = maDateTime.GetMonth();
aSetDate.Year = maDateTime.GetYear();
rAny.setValue(&aSetDate, ::getCppuType((util::Date*)0));
}
break;
case FIELD_PROP_DATE_TIME:
{
util::DateTime DateTimeValue;
DateTimeValue.HundredthSeconds = maDateTime.Get100Sec();
DateTimeValue.Seconds = maDateTime.GetSec();
DateTimeValue.Minutes = maDateTime.GetMin();
DateTimeValue.Hours = maDateTime.GetHour();
DateTimeValue.Day = maDateTime.GetDay();
DateTimeValue.Month = maDateTime.GetMonth();
DateTimeValue.Year = maDateTime.GetYear();
rAny <<= DateTimeValue;
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwPostItField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
::GetString( rAny, msAuthor );
break;
case FIELD_PROP_PAR2:
::GetString( rAny, msCommentContent );
//#i100374# new string via api, delete complex text object so SwPostItNote picks up the new string
if (mpText)
{
delete mpText;
mpText = 0;
}
break;
case FIELD_PROP_PAR3:
::GetString( rAny, msAuthorInitials );
break;
case FIELD_PROP_PAR4:
::GetString( rAny, msName );
break;
case FIELD_PROP_TEXT:
DBG_ERROR("Not implemented!");
// ::GetString( rAny, msCommentContent );
break;
case FIELD_PROP_DATE:
if( rAny.getValueType() == ::getCppuType((util::Date*)0) )
{
util::Date aSetDate = *(util::Date*)rAny.getValue();
maDateTime = Date(aSetDate.Day, aSetDate.Month, aSetDate.Year);
}
break;
case FIELD_PROP_DATE_TIME:
{
util::DateTime aDateTimeValue;
if(!(rAny >>= aDateTimeValue))
return sal_False;
maDateTime.Set100Sec(aDateTimeValue.HundredthSeconds);
maDateTime.SetSec(aDateTimeValue.Seconds);
maDateTime.SetMin(aDateTimeValue.Minutes);
maDateTime.SetHour(aDateTimeValue.Hours);
maDateTime.SetDay(aDateTimeValue.Day);
maDateTime.SetMonth(aDateTimeValue.Month);
maDateTime.SetYear(aDateTimeValue.Year);
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: DokumentinfoFields
--------------------------------------------------------------------*/
SwExtUserFieldType::SwExtUserFieldType()
: SwFieldType( RES_EXTUSERFLD )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwFieldType* SwExtUserFieldType::Copy() const
{
SwExtUserFieldType* pTyp = new SwExtUserFieldType;
return pTyp;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwExtUserFieldType::Expand(sal_uInt16 nSub, sal_uInt32 ) const
{
String aRet;
sal_uInt16 nRet = USHRT_MAX;
switch(nSub)
{
case EU_FIRSTNAME: nRet = USER_OPT_FIRSTNAME; break;
case EU_NAME: nRet = USER_OPT_LASTNAME; break;
case EU_SHORTCUT: nRet = USER_OPT_ID; break;
case EU_COMPANY: nRet = USER_OPT_COMPANY; break;
case EU_STREET: nRet = USER_OPT_STREET; break;
case EU_TITLE: nRet = USER_OPT_TITLE; break;
case EU_POSITION: nRet = USER_OPT_POSITION; break;
case EU_PHONE_PRIVATE: nRet = USER_OPT_TELEPHONEHOME; break;
case EU_PHONE_COMPANY: nRet = USER_OPT_TELEPHONEWORK; break;
case EU_FAX: nRet = USER_OPT_FAX; break;
case EU_EMAIL: nRet = USER_OPT_EMAIL; break;
case EU_COUNTRY: nRet = USER_OPT_COUNTRY; break;
case EU_ZIP: nRet = USER_OPT_ZIP; break;
case EU_CITY: nRet = USER_OPT_CITY; break;
case EU_STATE: nRet = USER_OPT_STATE; break;
case EU_FATHERSNAME: nRet = USER_OPT_FATHERSNAME; break;
case EU_APARTMENT: nRet = USER_OPT_APARTMENT; break;
default: ASSERT( !this, "Field unknown");
}
if( USHRT_MAX != nRet )
{
SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions();
aRet = rUserOpt.GetToken( nRet );
}
return aRet;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwExtUserField::SwExtUserField(SwExtUserFieldType* pTyp, sal_uInt16 nSubTyp, sal_uInt32 nFmt) :
SwField(pTyp, nFmt), nType(nSubTyp)
{
aContent = ((SwExtUserFieldType*)GetTyp())->Expand(nType, GetFormat());
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwExtUserField::Expand() const
{
if (!IsFixed())
((SwExtUserField*)this)->aContent = ((SwExtUserFieldType*)GetTyp())->Expand(nType, GetFormat());
return aContent;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwExtUserField::Copy() const
{
SwExtUserField* pFld = new SwExtUserField((SwExtUserFieldType*)GetTyp(), nType, GetFormat());
pFld->SetExpansion(aContent);
return pFld;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_uInt16 SwExtUserField::GetSubType() const
{
return nType;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwExtUserField::SetSubType(sal_uInt16 nSub)
{
nType = nSub;
}
sal_Bool SwExtUserField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
rAny <<= OUString(aContent);
break;
case FIELD_PROP_USHORT1:
{
sal_Int16 nTmp = nType;
rAny <<= nTmp;
}
break;
case FIELD_PROP_BOOL1:
{
sal_Bool bTmp = IsFixed();
rAny.setValue(&bTmp, ::getBooleanCppuType());
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwExtUserField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
::GetString( rAny, aContent );
break;
case FIELD_PROP_USHORT1:
{
sal_Int16 nTmp = 0;
rAny >>= nTmp;
nType = nTmp;
}
break;
case FIELD_PROP_BOOL1:
if( *(sal_Bool*)rAny.getValue() )
SetFormat(GetFormat() | AF_FIXED);
else
SetFormat(GetFormat() & ~AF_FIXED);
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
//-------------------------------------------------------------------------
/*--------------------------------------------------------------------
Beschreibung: Relatives Seitennummern - Feld
--------------------------------------------------------------------*/
SwRefPageSetFieldType::SwRefPageSetFieldType()
: SwFieldType( RES_REFPAGESETFLD )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwFieldType* SwRefPageSetFieldType::Copy() const
{
return new SwRefPageSetFieldType;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
// ueberlagert, weil es nichts zum Updaten gibt!
void SwRefPageSetFieldType::Modify( const SfxPoolItem*, const SfxPoolItem * )
{
}
/*--------------------------------------------------------------------
Beschreibung: Relative Seitennummerierung
--------------------------------------------------------------------*/
SwRefPageSetField::SwRefPageSetField( SwRefPageSetFieldType* pTyp,
short nOff, sal_Bool bFlag )
: SwField( pTyp ), nOffset( nOff ), bOn( bFlag )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwRefPageSetField::Expand() const
{
return aEmptyStr;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwRefPageSetField::Copy() const
{
return new SwRefPageSetField( (SwRefPageSetFieldType*)GetTyp(), nOffset, bOn );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwRefPageSetField::GetPar2() const
{
return String::CreateFromInt32( GetOffset() );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwRefPageSetField::SetPar2(const String& rStr)
{
SetOffset( (short) rStr.ToInt32() );
}
sal_Bool SwRefPageSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_BOOL1:
rAny.setValue(&bOn, ::getBooleanCppuType());
break;
case FIELD_PROP_USHORT1:
rAny <<= (sal_Int16)nOffset;
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwRefPageSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_BOOL1:
bOn = *(sal_Bool*)rAny.getValue();
break;
case FIELD_PROP_USHORT1:
rAny >>=nOffset;
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: relatives Seitennummern - Abfrage Feld
--------------------------------------------------------------------*/
SwRefPageGetFieldType::SwRefPageGetFieldType( SwDoc* pDc )
: SwFieldType( RES_REFPAGEGETFLD ), pDoc( pDc ), nNumberingType( SVX_NUM_ARABIC )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwFieldType* SwRefPageGetFieldType::Copy() const
{
SwRefPageGetFieldType* pNew = new SwRefPageGetFieldType( pDoc );
pNew->nNumberingType = nNumberingType;
return pNew;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwRefPageGetFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
{
// Update auf alle GetReferenz-Felder
if( !pNew && !pOld && GetDepends() )
{
// sammel erstmal alle SetPageRefFelder ein.
_SetGetExpFlds aTmpLst( 10, 5 );
if( MakeSetList( aTmpLst ) )
{
SwIterator<SwFmtFld,SwFieldType> aIter( *this );
for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
// nur die GetRef-Felder Updaten
if( pFmtFld->GetTxtFld() )
UpdateField( pFmtFld->GetTxtFld(), aTmpLst );
}
}
// weiter an die Text-Felder, diese "Expandieren" den Text
NotifyClients( pOld, pNew );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
sal_uInt16 SwRefPageGetFieldType::MakeSetList( _SetGetExpFlds& rTmpLst )
{
SwIterator<SwFmtFld,SwFieldType> aIter(*pDoc->GetSysFldType( RES_REFPAGESETFLD));
for ( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
{
// nur die GetRef-Felder Updaten
const SwTxtFld* pTFld = pFmtFld->GetTxtFld();
if( pTFld )
{
const SwTxtNode& rTxtNd = pTFld->GetTxtNode();
// immer den ersten !! (in Tab-Headline, Kopf-/Fuss )
Point aPt;
const SwCntntFrm* pFrm = rTxtNd.getLayoutFrm( rTxtNd.GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
_SetGetExpFld* pNew;
if( !pFrm ||
pFrm->IsInDocBody() ||
// --> FME 2004-07-27 #i31868#
// Check if pFrm is not yet connected to the layout.
!pFrm->FindPageFrm() )
// <--
{
// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
SwNodeIndex aIdx( rTxtNd );
pNew = new _SetGetExpFld( aIdx, pTFld );
}
else
{
// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
SwPosition aPos( pDoc->GetNodes().GetEndOfPostIts() );
#ifdef DBG_UTIL
ASSERT( GetBodyTxtNode( *pDoc, aPos, *pFrm ),
"wo steht das Feld" );
#else
GetBodyTxtNode( *pDoc, aPos, *pFrm );
#endif
pNew = new _SetGetExpFld( aPos.nNode, pTFld,
&aPos.nContent );
}
if( !rTmpLst.Insert( pNew ))
delete pNew;
}
}
return rTmpLst.Count();
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwRefPageGetFieldType::UpdateField( SwTxtFld* pTxtFld,
_SetGetExpFlds& rSetList )
{
SwRefPageGetField* pGetFld = (SwRefPageGetField*)pTxtFld->GetFmtFld().GetField();
pGetFld->SetText( aEmptyStr );
// dann suche mal das richtige RefPageSet-Field
SwTxtNode* pTxtNode = (SwTxtNode*)&pTxtFld->GetTxtNode();
if( pTxtNode->StartOfSectionIndex() >
pDoc->GetNodes().GetEndOfExtras().GetIndex() )
{
SwNodeIndex aIdx( *pTxtNode );
_SetGetExpFld aEndFld( aIdx, pTxtFld );
sal_uInt16 nLast;
rSetList.Seek_Entry( &aEndFld, &nLast );
if( nLast-- )
{
const SwTxtFld* pRefTxtFld = rSetList[ nLast ]->GetTxtFld();
const SwRefPageSetField* pSetFld =
(SwRefPageSetField*)pRefTxtFld->GetFmtFld().GetField();
if( pSetFld->IsOn() )
{
// dann bestimme mal den entsp. Offset
Point aPt;
const SwCntntFrm* pFrm = pTxtNode->getLayoutFrm( pTxtNode->GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
const SwCntntFrm* pRefFrm = pRefTxtFld->GetTxtNode().getLayoutFrm( pRefTxtFld->GetTxtNode().GetDoc()->GetCurrentLayout(), &aPt, 0, sal_False );
const SwPageFrm* pPgFrm = 0;
sal_uInt16 nDiff = ( pFrm && pRefFrm )
? (pPgFrm = pFrm->FindPageFrm())->GetPhyPageNum() -
pRefFrm->FindPageFrm()->GetPhyPageNum() + 1
: 1;
sal_uInt32 nTmpFmt = SVX_NUM_PAGEDESC == pGetFld->GetFormat()
? ( !pPgFrm
? (sal_uInt32)SVX_NUM_ARABIC
: pPgFrm->GetPageDesc()->GetNumType().GetNumberingType() )
: pGetFld->GetFormat();
short nPageNum = static_cast<short>(Max(0, pSetFld->GetOffset() + (short)nDiff));
pGetFld->SetText( FormatNumber( nPageNum, nTmpFmt ) );
}
}
}
// dann die Formatierung anstossen
((SwFmtFld&)pTxtFld->GetFmtFld()).ModifyNotification( 0, 0 );
}
/*--------------------------------------------------------------------
Beschreibung: Relative Seitennummerierung Abfragen
--------------------------------------------------------------------*/
SwRefPageGetField::SwRefPageGetField( SwRefPageGetFieldType* pTyp,
sal_uInt32 nFmt )
: SwField( pTyp, nFmt )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwRefPageGetField::Expand() const
{
return sTxt;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwRefPageGetField::Copy() const
{
SwRefPageGetField* pCpy = new SwRefPageGetField(
(SwRefPageGetFieldType*)GetTyp(), GetFormat() );
pCpy->SetText( sTxt );
return pCpy;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwRefPageGetField::ChangeExpansion( const SwFrm* pFrm,
const SwTxtFld* pFld )
{
// nur Felder in Footer, Header, FootNote, Flys
SwTxtNode* pTxtNode = (SwTxtNode*)&pFld->GetTxtNode();
SwRefPageGetFieldType* pGetType = (SwRefPageGetFieldType*)GetTyp();
SwDoc* pDoc = pGetType->GetDoc();
if( pFld->GetTxtNode().StartOfSectionIndex() >
pDoc->GetNodes().GetEndOfExtras().GetIndex() )
return;
sTxt.Erase();
ASSERT( !pFrm->IsInDocBody(), "Flag ist nicht richtig, Frame steht im DocBody" );
// sammel erstmal alle SetPageRefFelder ein.
_SetGetExpFlds aTmpLst( 10, 5 );
if( !pGetType->MakeSetList( aTmpLst ) )
return ;
// einen sdbcx::Index fuers bestimmen vom TextNode anlegen
SwPosition aPos( SwNodeIndex( pDoc->GetNodes() ) );
pTxtNode = (SwTxtNode*) GetBodyTxtNode( *pDoc, aPos, *pFrm );
// Wenn kein Layout vorhanden, kommt es in Kopf und Fusszeilen dazu
// das ChangeExpansion uebers Layout-Formatieren aufgerufen wird
// aber kein TxtNode vorhanden ist
//
if(!pTxtNode)
return;
_SetGetExpFld aEndFld( aPos.nNode, pFld, &aPos.nContent );
sal_uInt16 nLast;
aTmpLst.Seek_Entry( &aEndFld, &nLast );
if( !nLast-- )
return ; // es gibt kein entsprechendes Set - Feld vor mir
const SwTxtFld* pRefTxtFld = aTmpLst[ nLast ]->GetTxtFld();
const SwRefPageSetField* pSetFld =
(SwRefPageSetField*)pRefTxtFld->GetFmtFld().GetField();
Point aPt;
const SwCntntFrm* pRefFrm = pRefTxtFld ? pRefTxtFld->GetTxtNode().getLayoutFrm( pFrm->getRootFrm(), &aPt, 0, sal_False ) : 0;
if( pSetFld->IsOn() && pRefFrm )
{
// dann bestimme mal den entsp. Offset
const SwPageFrm* pPgFrm = pFrm->FindPageFrm();
sal_uInt16 nDiff = pPgFrm->GetPhyPageNum() -
pRefFrm->FindPageFrm()->GetPhyPageNum() + 1;
SwRefPageGetField* pGetFld = (SwRefPageGetField*)pFld->GetFmtFld().GetField();
sal_uInt32 nTmpFmt = SVX_NUM_PAGEDESC == pGetFld->GetFormat()
? pPgFrm->GetPageDesc()->GetNumType().GetNumberingType()
: pGetFld->GetFormat();
short nPageNum = static_cast<short>(Max(0, pSetFld->GetOffset() + (short)nDiff ));
pGetFld->SetText( FormatNumber( nPageNum, nTmpFmt ) );
}
}
sal_Bool SwRefPageGetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_USHORT1:
rAny <<= (sal_Int16)GetFormat();
break;
case FIELD_PROP_PAR1:
rAny <<= OUString(sTxt);
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwRefPageGetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_USHORT1:
{
sal_Int16 nSet = 0;
rAny >>= nSet;
if(nSet <= SVX_NUM_PAGEDESC )
SetFormat(nSet);
else {
//exception(wrong_value)
;
}
}
break;
case FIELD_PROP_PAR1:
{
OUString sTmp;
rAny >>= sTmp;
sTxt = sTmp;
}
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: Feld zum Anspringen und Editieren
--------------------------------------------------------------------*/
SwJumpEditFieldType::SwJumpEditFieldType( SwDoc* pD )
: SwFieldType( RES_JUMPEDITFLD ), pDoc( pD ), aDep( this, 0 )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwFieldType* SwJumpEditFieldType::Copy() const
{
return new SwJumpEditFieldType( pDoc );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwCharFmt* SwJumpEditFieldType::GetCharFmt()
{
SwCharFmt* pFmt = pDoc->GetCharFmtFromPool( RES_POOLCHR_JUMPEDIT );
// noch nicht registriert ?
if( !aDep.GetRegisteredIn() )
pFmt->Add( &aDep ); // anmelden
return pFmt;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwJumpEditField::SwJumpEditField( SwJumpEditFieldType* pTyp, sal_uInt32 nForm,
const String& rTxt, const String& rHelp )
: SwField( pTyp, nForm ), sTxt( rTxt ), sHelp( rHelp )
{
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwJumpEditField::Expand() const
{
String sTmp( '<' );
sTmp += sTxt;
return sTmp += '>';
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
SwField* SwJumpEditField::Copy() const
{
return new SwJumpEditField( (SwJumpEditFieldType*)GetTyp(), GetFormat(),
sTxt, sHelp );
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
// Platzhalter-Text
const String& SwJumpEditField::GetPar1() const
{
return sTxt;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwJumpEditField::SetPar1(const String& rStr)
{
sTxt = rStr;
}
// HinweisText
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
String SwJumpEditField::GetPar2() const
{
return sHelp;
}
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
void SwJumpEditField::SetPar2(const String& rStr)
{
sHelp = rStr;
}
sal_Bool SwJumpEditField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_USHORT1:
{
sal_Int16 nRet;
switch( GetFormat() )
{
case JE_FMT_TABLE: nRet = text::PlaceholderType::TABLE; break;
case JE_FMT_FRAME: nRet = text::PlaceholderType::TEXTFRAME; break;
case JE_FMT_GRAPHIC:nRet = text::PlaceholderType::GRAPHIC; break;
case JE_FMT_OLE: nRet = text::PlaceholderType::OBJECT; break;
// case JE_FMT_TEXT:
default:
nRet = text::PlaceholderType::TEXT; break;
}
rAny <<= nRet;
}
break;
case FIELD_PROP_PAR1 :
rAny <<= OUString(sHelp);
break;
case FIELD_PROP_PAR2 :
rAny <<= OUString(sTxt);
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwJumpEditField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_USHORT1:
{
//JP 24.10.2001: int32 because in UnoField.cxx a putvalue is
// called with a int32 value! But normally we need
// here only a int16
sal_Int32 nSet = 0;
rAny >>= nSet;
switch( nSet )
{
case text::PlaceholderType::TEXT : SetFormat(JE_FMT_TEXT); break;
case text::PlaceholderType::TABLE : SetFormat(JE_FMT_TABLE); break;
case text::PlaceholderType::TEXTFRAME: SetFormat(JE_FMT_FRAME); break;
case text::PlaceholderType::GRAPHIC : SetFormat(JE_FMT_GRAPHIC); break;
case text::PlaceholderType::OBJECT : SetFormat(JE_FMT_OLE); break;
}
}
break;
case FIELD_PROP_PAR1 :
::GetString( rAny, sHelp );
break;
case FIELD_PROP_PAR2 :
::GetString( rAny, sTxt);
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung: Combined Character Fieldtype / Field
--------------------------------------------------------------------*/
SwCombinedCharFieldType::SwCombinedCharFieldType()
: SwFieldType( RES_COMBINED_CHARS )
{
}
SwFieldType* SwCombinedCharFieldType::Copy() const
{
return new SwCombinedCharFieldType;
}
/* --------------------------------------------------------------------*/
SwCombinedCharField::SwCombinedCharField( SwCombinedCharFieldType* pFTyp,
const String& rChars )
: SwField( pFTyp, 0 ),
sCharacters( rChars.Copy( 0, MAX_COMBINED_CHARACTERS ))
{
}
String SwCombinedCharField::Expand() const
{
return sCharacters;
}
SwField* SwCombinedCharField::Copy() const
{
return new SwCombinedCharField( (SwCombinedCharFieldType*)GetTyp(),
sCharacters );
}
const String& SwCombinedCharField::GetPar1() const
{
return sCharacters;
}
void SwCombinedCharField::SetPar1(const String& rStr)
{
sCharacters = rStr.Copy( 0, MAX_COMBINED_CHARACTERS );
}
sal_Bool SwCombinedCharField::QueryValue( uno::Any& rAny,
sal_uInt16 nWhichId ) const
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
rAny <<= rtl::OUString( sCharacters );
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}
sal_Bool SwCombinedCharField::PutValue( const uno::Any& rAny,
sal_uInt16 nWhichId )
{
switch( nWhichId )
{
case FIELD_PROP_PAR1:
::GetString( rAny, sCharacters ).Erase( MAX_COMBINED_CHARACTERS );
break;
default:
DBG_ERROR("illegal property");
}
return sal_True;
}