/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; SvxFieldData* SvxFieldData::Create(const uno::Reference& xTextContent) { uno::Reference xPropSet(xTextContent, uno::UNO_QUERY); if (!xPropSet.is()) return nullptr; // we do not support these fields from Writer, so make sure we do not throw // here - see fdo#63436 how to possibly extend Writer to make use of this uno::Any aAny; try { aAny = xPropSet->getPropertyValue(UNO_TC_PROP_TEXTFIELD_TYPE); if ( !aAny.has() ) return nullptr; sal_Int32 nFieldType = aAny.get(); switch (nFieldType) { case text::textfield::Type::TIME: case text::textfield::Type::EXTENDED_TIME: case text::textfield::Type::DATE: { bool bIsDate = false; xPropSet->getPropertyValue(UNO_TC_PROP_IS_DATE) >>= bIsDate; if (bIsDate) { util::DateTime aDateTime = xPropSet->getPropertyValue(UNO_TC_PROP_DATE_TIME).get(); Date aDate(aDateTime.Day, aDateTime.Month, aDateTime.Year); bool bIsFixed = false; xPropSet->getPropertyValue(UNO_TC_PROP_IS_FIXED) >>= bIsFixed; SvxDateField* pData = new SvxDateField(aDate, bIsFixed ? SvxDateType::Fix : SvxDateType::Var); sal_Int32 nNumFmt = -1; xPropSet->getPropertyValue(UNO_TC_PROP_NUMFORMAT) >>= nNumFmt; if (static_cast(nNumFmt) >= SvxDateFormat::AppDefault && static_cast(nNumFmt) <= SvxDateFormat::F) pData->SetFormat(static_cast(nNumFmt)); return pData; } if (nFieldType != text::textfield::Type::TIME) { util::DateTime aDateTime = xPropSet->getPropertyValue(UNO_TC_PROP_DATE_TIME).get(); tools::Time aTime(aDateTime); bool bIsFixed = false; xPropSet->getPropertyValue(UNO_TC_PROP_IS_FIXED) >>= bIsFixed; SvxExtTimeField* pData = new SvxExtTimeField(aTime, bIsFixed ? SvxTimeType::Fix : SvxTimeType::Var); sal_Int32 nNumFmt = -1; xPropSet->getPropertyValue(UNO_TC_PROP_NUMFORMAT) >>= nNumFmt; if (static_cast(nNumFmt) >= SvxTimeFormat::AppDefault && static_cast(nNumFmt) <= SvxTimeFormat::HH12_MM_SS_00_AMPM) pData->SetFormat(static_cast(nNumFmt)); return pData; } return new SvxTimeField(); } case text::textfield::Type::URL: { OUString aRep, aTarget, aURL; sal_Int16 nFmt = -1; xPropSet->getPropertyValue(UNO_TC_PROP_URL_REPRESENTATION) >>= aRep; xPropSet->getPropertyValue(UNO_TC_PROP_URL_TARGET) >>= aTarget; xPropSet->getPropertyValue(UNO_TC_PROP_URL) >>= aURL; xPropSet->getPropertyValue(UNO_TC_PROP_URL_FORMAT) >>= nFmt; SvxURLField* pData = new SvxURLField(aURL, aRep, aRep.isEmpty() ? SvxURLFormat::Url : SvxURLFormat::Repr); pData->SetTargetFrame(aTarget); if (static_cast(nFmt) >= SvxURLFormat::AppDefault && static_cast(nFmt) <= SvxURLFormat::Repr) pData->SetFormat(static_cast(nFmt)); return pData; } case text::textfield::Type::PAGE: return new SvxPageField(); case text::textfield::Type::PAGES: return new SvxPagesField(); case text::textfield::Type::PAGE_NAME: return new SvxPageTitleField(); case text::textfield::Type::DOCINFO_TITLE: return new SvxFileField(); case text::textfield::Type::TABLE: { sal_Int32 nTab = 0; xPropSet->getPropertyValue(UNO_TC_PROP_TABLE_POSITION) >>= nTab; return new SvxTableField(nTab); } case text::textfield::Type::EXTENDED_FILE: { OUString aPresentation; bool bIsFixed = false; sal_Int16 nFmt = text::FilenameDisplayFormat::FULL; xPropSet->getPropertyValue(UNO_TC_PROP_IS_FIXED) >>= bIsFixed; xPropSet->getPropertyValue(UNO_TC_PROP_CURRENT_PRESENTATION) >>= aPresentation; xPropSet->getPropertyValue(UNO_TC_PROP_FILE_FORMAT) >>= nFmt; SvxFileFormat eFmt = SvxFileFormat::NameAndExt; switch (nFmt) { case text::FilenameDisplayFormat::FULL: eFmt = SvxFileFormat::PathFull; break; case text::FilenameDisplayFormat::PATH: eFmt = SvxFileFormat::PathOnly; break; case text::FilenameDisplayFormat::NAME: eFmt = SvxFileFormat::NameOnly; break; default:; } // pass fixed attribute to constructor return new SvxExtFileField( aPresentation, bIsFixed ? SvxFileType::Fix : SvxFileType::Var, eFmt); } case text::textfield::Type::AUTHOR: { bool bIsFixed = false; bool bFullName = false; sal_Int16 nFmt = -1; OUString aPresentation, aContent, aFirstName, aLastName; xPropSet->getPropertyValue(UNO_TC_PROP_IS_FIXED) >>= bIsFixed; xPropSet->getPropertyValue(UNO_TC_PROP_AUTHOR_FULLNAME) >>= bFullName; xPropSet->getPropertyValue(UNO_TC_PROP_CURRENT_PRESENTATION) >>= aPresentation; xPropSet->getPropertyValue(UNO_TC_PROP_AUTHOR_CONTENT) >>= aContent; xPropSet->getPropertyValue(UNO_TC_PROP_AUTHOR_FORMAT) >>= nFmt; // do we have CurrentPresentation given? Mimic behaviour of // writer, which means: prefer CurrentPresentation over Content // if both are given. if (!aPresentation.isEmpty()) aContent = aPresentation; sal_Int32 nPos = aContent.lastIndexOf(' ', 0); if (nPos > 0) { aFirstName = aContent.copy(0, nPos); aLastName = aContent.copy(nPos + 1); } else { aLastName = aContent; } // #92009# pass fixed attribute to constructor SvxAuthorField* pData = new SvxAuthorField( aFirstName, aLastName, OUString(), bIsFixed ? SvxAuthorType::Fix : SvxAuthorType::Var); if (!bIsFixed) { if (!bFullName) { pData->SetFormat(SvxAuthorFormat::ShortName); } else if (static_cast(nFmt) >= SvxAuthorFormat::FullName && static_cast(nFmt) <= SvxAuthorFormat::ShortName) { pData->SetFormat(static_cast(nFmt)); } } return pData; } case text::textfield::Type::MEASURE: { SdrMeasureFieldKind eKind = SdrMeasureFieldKind::Value; sal_Int16 nTmp = -1; xPropSet->getPropertyValue(UNO_TC_PROP_MEASURE_KIND) >>= nTmp; if (nTmp == static_cast(SdrMeasureFieldKind::Unit) || nTmp == static_cast(SdrMeasureFieldKind::Rotate90Blanks)) eKind = static_cast(nTmp); return new SdrMeasureField(eKind); } case text::textfield::Type::PRESENTATION_HEADER: return new SvxHeaderField(); case text::textfield::Type::PRESENTATION_FOOTER: return new SvxFooterField(); case text::textfield::Type::PRESENTATION_DATE_TIME: return new SvxDateTimeField(); case text::textfield::Type::DOCINFO_CUSTOM: { OUString sName; xPropSet->getPropertyValue(UNO_TC_PROP_NAME) >>= sName; OUString sCurrentPresentation; xPropSet->getPropertyValue(UNO_TC_PROP_CURRENT_PRESENTATION) >>= sCurrentPresentation; return new editeng::CustomPropertyField(sName, sCurrentPresentation); } default: ; }; } catch ( const beans::UnknownPropertyException& ) { return nullptr; } return nullptr; } SvxFieldData::SvxFieldData() { } SvxFieldData::~SvxFieldData() { } std::unique_ptr SvxFieldData::Clone() const { return std::make_unique(); } bool SvxFieldData::operator==( const SvxFieldData& rFld ) const { DBG_ASSERT( typeid(*this) == typeid(rFld), "==: Different Types" ); (void)rFld; return true; // Basic class is always the same. } MetaAction* SvxFieldData::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN" ); } MetaAction* SvxFieldData::createEndComment() { return new MetaCommentAction( "FIELD_SEQ_END" ); } SvxFieldItem::SvxFieldItem( std::unique_ptr pField, const sal_uInt16 nId ) : SfxPoolItem( nId ) , mpField( std::move(pField) ) { } SvxFieldItem::SvxFieldItem( const SvxFieldData& rField, const sal_uInt16 nId ) : SfxPoolItem( nId ) , mpField( rField.Clone() ) { } SvxFieldItem::SvxFieldItem( const SvxFieldItem& rItem ) : SfxPoolItem ( rItem ) , mpField( rItem.mpField ? rItem.mpField->Clone() : nullptr ) { } SvxFieldItem::~SvxFieldItem() { } SvxFieldItem* SvxFieldItem::Clone( SfxItemPool* ) const { return new SvxFieldItem(*this); } bool SvxFieldItem::operator==( const SfxPoolItem& rItem ) const { assert(SfxPoolItem::operator==(rItem)); const SvxFieldData* pOtherFld = static_cast(rItem).GetField(); if( mpField.get() == pOtherFld ) return true; if( mpField == nullptr || pOtherFld == nullptr ) return false; return ( typeid(*mpField) == typeid(*pOtherFld) ) && ( *mpField == *pOtherFld ); } // The following are the derivatives of SvxFieldData ... SvxDateField::SvxDateField() { nFixDate = Date( Date::SYSTEM ).GetDate(); eType = SvxDateType::Var; eFormat = SvxDateFormat::StdSmall; } SvxDateField::SvxDateField( const Date& rDate, SvxDateType eT, SvxDateFormat eF ) { nFixDate = rDate.GetDate(); eType = eT; eFormat = eF; } std::unique_ptr SvxDateField::Clone() const { return std::make_unique( *this ); } bool SvxDateField::operator==( const SvxFieldData& rOther ) const { if ( typeid(rOther) != typeid(*this) ) return false; const SvxDateField& rOtherFld = static_cast(rOther); return ( ( nFixDate == rOtherFld.nFixDate ) && ( eType == rOtherFld.eType ) && ( eFormat == rOtherFld.eFormat ) ); } OUString SvxDateField::GetFormatted( SvNumberFormatter& rFormatter, LanguageType eLang ) const { Date aDate( Date::EMPTY ); if ( eType == SvxDateType::Fix ) aDate.SetDate( nFixDate ); else aDate = Date( Date::SYSTEM ); // current date return GetFormatted( aDate, eFormat, rFormatter, eLang ); } OUString SvxDateField::GetFormatted( Date const & aDate, SvxDateFormat eFormat, SvNumberFormatter& rFormatter, LanguageType eLang ) { if ( eFormat == SvxDateFormat::System ) { OSL_FAIL( "SvxDateFormat::System not implemented!" ); eFormat = SvxDateFormat::StdSmall; } else if ( eFormat == SvxDateFormat::AppDefault ) { OSL_FAIL( "SvxDateFormat::AppDefault: take them from where? "); eFormat = SvxDateFormat::StdSmall; } sal_uInt32 nFormatKey; switch( eFormat ) { case SvxDateFormat::StdSmall: // short nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang ); break; case SvxDateFormat::StdBig: // long nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYSTEM_LONG, eLang ); break; case SvxDateFormat::A: // 13.02.96 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_DDMMYY, eLang ); break; case SvxDateFormat::B: // 13.02.1996 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_DDMMYYYY, eLang ); break; case SvxDateFormat::C: // 13. Feb 1996 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_DMMMYYYY, eLang ); break; case SvxDateFormat::D: // 13. February 1996 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_DMMMMYYYY, eLang ); break; case SvxDateFormat::E: // The, 13. February 1996 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_NNDMMMMYYYY, eLang ); break; case SvxDateFormat::F: // Tuesday, 13. February 1996 nFormatKey = rFormatter.GetFormatIndex( NF_DATE_SYS_NNNNDMMMMYYYY, eLang ); break; default: nFormatKey = rFormatter.GetStandardFormat( SvNumFormatType::DATE, eLang ); } double fDiffDate = aDate - rFormatter.GetNullDate(); OUString aStr; Color* pColor = nullptr; rFormatter.GetOutputString( fDiffDate, nFormatKey, aStr, &pColor ); return aStr; } MetaAction* SvxDateField::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN" ); } SvxURLField::SvxURLField() { eFormat = SvxURLFormat::Url; } SvxURLField::SvxURLField( const OUString& rURL, const OUString& rRepres, SvxURLFormat eFmt ) : aURL( rURL ), aRepresentation( rRepres ) { eFormat = eFmt; } std::unique_ptr SvxURLField::Clone() const { return std::make_unique( *this ); } bool SvxURLField::operator==( const SvxFieldData& rOther ) const { if ( typeid(rOther) != typeid(*this) ) return false; const SvxURLField& rOtherFld = static_cast(rOther); return ( ( eFormat == rOtherFld.eFormat ) && ( aURL == rOtherFld.aURL ) && ( aRepresentation == rOtherFld.aRepresentation ) && ( aTargetFrame == rOtherFld.aTargetFrame ) ); } MetaAction* SvxURLField::createBeginComment() const { // #i46618# Adding target URL to metafile comment return new MetaCommentAction( "FIELD_SEQ_BEGIN", 0, reinterpret_cast(aURL.getStr()), 2*aURL.getLength() ); } // // SvxPageTitleField methods // SvxPageTitleField::SvxPageTitleField() {} std::unique_ptr SvxPageTitleField::Clone() const { return std::make_unique(); } bool SvxPageTitleField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxPageTitleField *>(&rCmp) != nullptr ); } MetaAction* SvxPageTitleField::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN;PageTitleField" ); } // // SvxPagesField // // The fields that were removed from Calc: SvxPageField::SvxPageField() {} std::unique_ptr SvxPageField::Clone() const { return std::make_unique(); // empty } bool SvxPageField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxPageField *>(&rCmp) != nullptr ); } MetaAction* SvxPageField::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN;PageField" ); } SvxPagesField::SvxPagesField() {} std::unique_ptr SvxPagesField::Clone() const { return std::make_unique(); // empty } bool SvxPagesField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxPagesField *>(&rCmp) != nullptr); } SvxTimeField::SvxTimeField() {} std::unique_ptr SvxTimeField::Clone() const { return std::make_unique(); // empty } bool SvxTimeField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxTimeField *>(&rCmp) != nullptr); } MetaAction* SvxTimeField::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN" ); } SvxFileField::SvxFileField() {} std::unique_ptr SvxFileField::Clone() const { return std::make_unique(); // empty } bool SvxFileField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxFileField *>(&rCmp) != nullptr ); } SvxTableField::SvxTableField() : mnTab(0) {} SvxTableField::SvxTableField(int nTab) : mnTab(nTab) {} void SvxTableField::SetTab(int nTab) { mnTab = nTab; } std::unique_ptr SvxTableField::Clone() const { return std::make_unique(mnTab); } bool SvxTableField::operator==( const SvxFieldData& rCmp ) const { if (dynamic_cast(&rCmp) == nullptr) return false; return mnTab == static_cast(rCmp).mnTab; } // SvxExtTimeField SvxExtTimeField::SvxExtTimeField() : m_nFixTime( tools::Time(tools::Time::SYSTEM).GetTime() ) { eType = SvxTimeType::Var; eFormat = SvxTimeFormat::Standard; } SvxExtTimeField::SvxExtTimeField( const tools::Time& rTime, SvxTimeType eT, SvxTimeFormat eF ) : m_nFixTime( rTime.GetTime() ) { eType = eT; eFormat = eF; } std::unique_ptr SvxExtTimeField::Clone() const { return std::make_unique( *this ); } bool SvxExtTimeField::operator==( const SvxFieldData& rOther ) const { if ( typeid(rOther) != typeid(*this) ) return false; const SvxExtTimeField& rOtherFld = static_cast(rOther); return ((m_nFixTime == rOtherFld.m_nFixTime) && ( eType == rOtherFld.eType ) && ( eFormat == rOtherFld.eFormat ) ); } OUString SvxExtTimeField::GetFormatted( SvNumberFormatter& rFormatter, LanguageType eLang ) const { tools::Time aTime( tools::Time::EMPTY ); if ( eType == SvxTimeType::Fix ) aTime.SetTime(m_nFixTime); else aTime = tools::Time( tools::Time::SYSTEM ); // current time return GetFormatted( aTime, eFormat, rFormatter, eLang ); } OUString SvxExtTimeField::GetFormatted( tools::Time const & aTime, SvxTimeFormat eFormat, SvNumberFormatter& rFormatter, LanguageType eLang ) { switch( eFormat ) { case SvxTimeFormat::System : OSL_FAIL( "SvxTimeFormat::System: not implemented" ); eFormat = SvxTimeFormat::Standard; break; case SvxTimeFormat::AppDefault : OSL_FAIL( "SvxTimeFormat::AppDefault: not implemented" ); eFormat = SvxTimeFormat::Standard; break; default: ;//prevent warning } sal_uInt32 nFormatKey; switch( eFormat ) { case SvxTimeFormat::HH12_MM: nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HHMMAMPM, eLang ); break; case SvxTimeFormat::HH12_MM_SS_00: { // no builtin format available, try to insert or reuse OUString aFormatCode( "HH:MM:SS.00 AM/PM" ); sal_Int32 nCheckPos; SvNumFormatType nType; rFormatter.PutandConvertEntry( aFormatCode, nCheckPos, nType, nFormatKey, LANGUAGE_ENGLISH_US, eLang, true); DBG_ASSERT( nCheckPos == 0, "SvxTimeFormat::HH12_MM_SS_00: could not insert format code" ); if ( nCheckPos ) { nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HH_MMSS00, eLang ); } break; } case SvxTimeFormat::HH24_MM: nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HHMM, eLang ); break; case SvxTimeFormat::HH24_MM_SS_00: nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HH_MMSS00, eLang ); break; case SvxTimeFormat::HH12_MM_SS: nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HHMMSSAMPM, eLang ); break; case SvxTimeFormat::HH24_MM_SS: nFormatKey = rFormatter.GetFormatIndex( NF_TIME_HHMMSS, eLang ); break; case SvxTimeFormat::Standard: default: nFormatKey = rFormatter.GetStandardFormat( SvNumFormatType::TIME, eLang ); } double fFracTime = aTime.GetTimeInDays(); OUString aStr; Color* pColor = nullptr; rFormatter.GetOutputString( fFracTime, nFormatKey, aStr, &pColor ); return aStr; } MetaAction* SvxExtTimeField::createBeginComment() const { return new MetaCommentAction( "FIELD_SEQ_BEGIN" ); } // SvxExtFileField SvxExtFileField::SvxExtFileField() { eType = SvxFileType::Var; eFormat = SvxFileFormat::PathFull; } SvxExtFileField::SvxExtFileField( const OUString& rStr, SvxFileType eT, SvxFileFormat eF ) { aFile = rStr; eType = eT; eFormat = eF; } std::unique_ptr SvxExtFileField::Clone() const { return std::make_unique( *this ); } bool SvxExtFileField::operator==( const SvxFieldData& rOther ) const { if ( typeid(rOther) != typeid(*this) ) return false; const SvxExtFileField& rOtherFld = static_cast(rOther); return ( ( aFile == rOtherFld.aFile ) && ( eType == rOtherFld.eType ) && ( eFormat == rOtherFld.eFormat ) ); } OUString SvxExtFileField::GetFormatted() const { OUString aString; INetURLObject aURLObj( aFile ); if( INetProtocol::NotValid == aURLObj.GetProtocol() ) { // invalid? try to interpret string as system file name OUString aURLStr; osl::FileBase::getFileURLFromSystemPath( aFile, aURLStr ); aURLObj.SetURL( aURLStr ); } // #92009# Be somewhat liberate when trying to // get formatted content out of the FileField if( INetProtocol::NotValid == aURLObj.GetProtocol() ) { // still not valid? Then output as is aString = aFile; } else if( INetProtocol::File == aURLObj.GetProtocol() ) { switch( eFormat ) { case SvxFileFormat::PathFull: aString = aURLObj.getFSysPath(FSysStyle::Detect); break; case SvxFileFormat::PathOnly: aURLObj.removeSegment(INetURLObject::LAST_SEGMENT, false); // #101742# Leave trailing slash at the pathname aURLObj.setFinalSlash(); aString = aURLObj.getFSysPath(FSysStyle::Detect); break; case SvxFileFormat::NameOnly: aString = aURLObj.getBase(INetURLObject::LAST_SEGMENT,true,INetURLObject::DecodeMechanism::Unambiguous); break; case SvxFileFormat::NameAndExt: aString = aURLObj.getName(INetURLObject::LAST_SEGMENT,true,INetURLObject::DecodeMechanism::Unambiguous); break; } } else { switch( eFormat ) { case SvxFileFormat::PathFull: aString = aURLObj.GetMainURL( INetURLObject::DecodeMechanism::ToIUri ); break; case SvxFileFormat::PathOnly: aURLObj.removeSegment(INetURLObject::LAST_SEGMENT, false); // #101742# Leave trailing slash at the pathname aURLObj.setFinalSlash(); aString = aURLObj.GetMainURL( INetURLObject::DecodeMechanism::ToIUri ); break; case SvxFileFormat::NameOnly: aString = aURLObj.getBase(); break; case SvxFileFormat::NameAndExt: aString = aURLObj.getName(); break; } } return aString; } // SvxAuthorField SvxAuthorField::SvxAuthorField( const OUString& rFirstName, const OUString& rLastName, const OUString& rShortName, SvxAuthorType eT, SvxAuthorFormat eF ) { aName = rLastName; aFirstName = rFirstName; aShortName = rShortName; eType = eT; eFormat = eF; } std::unique_ptr SvxAuthorField::Clone() const { return std::make_unique( *this ); } bool SvxAuthorField::operator==( const SvxFieldData& rOther ) const { if ( typeid(rOther) != typeid(*this) ) return false; const SvxAuthorField& rOtherFld = static_cast(rOther); return ( ( aName == rOtherFld.aName ) && ( aFirstName == rOtherFld.aFirstName ) && ( aShortName == rOtherFld.aShortName ) && ( eType == rOtherFld.eType ) && ( eFormat == rOtherFld.eFormat ) ); } OUString SvxAuthorField::GetFormatted() const { OUString aString; switch( eFormat ) { case SvxAuthorFormat::FullName: aString = aFirstName + " " + aName; break; case SvxAuthorFormat::LastName: aString = aName; break; case SvxAuthorFormat::FirstName: aString = aFirstName; break; case SvxAuthorFormat::ShortName: aString = aShortName; break; } return aString; } SvxHeaderField::SvxHeaderField() {} std::unique_ptr SvxHeaderField::Clone() const { return std::make_unique(); // empty } bool SvxHeaderField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxHeaderField *>(&rCmp) != nullptr ); } SvxFooterField::SvxFooterField() {} std::unique_ptr SvxFooterField::Clone() const { return std::make_unique(); // empty } bool SvxFooterField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxFooterField *>(&rCmp) != nullptr ); } std::unique_ptr SvxDateTimeField::Clone() const { return std::make_unique(); // empty } bool SvxDateTimeField::operator==( const SvxFieldData& rCmp ) const { return ( dynamic_cast< const SvxDateTimeField *>(&rCmp) != nullptr ); } SvxDateTimeField::SvxDateTimeField() {} OUString SvxDateTimeField::GetFormatted( Date const & rDate, tools::Time const & rTime, SvxDateFormat eDateFormat, SvxTimeFormat eTimeFormat, SvNumberFormatter& rFormatter, LanguageType eLanguage ) { OUString aRet; if(eDateFormat != SvxDateFormat::AppDefault) { aRet = SvxDateField::GetFormatted( rDate, eDateFormat, rFormatter, eLanguage ); } if(eTimeFormat != SvxTimeFormat::AppDefault) { OUStringBuffer aBuf(aRet); if (!aRet.isEmpty()) aBuf.append(' '); aBuf.append( SvxExtTimeField::GetFormatted(rTime, eTimeFormat, rFormatter, eLanguage)); aRet = aBuf.makeStringAndClear(); } return aRet; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */