diff options
Diffstat (limited to 'sw/source/ui/fldui/flddinf.cxx')
-rw-r--r-- | sw/source/ui/fldui/flddinf.cxx | 537 |
1 files changed, 537 insertions, 0 deletions
diff --git a/sw/source/ui/fldui/flddinf.cxx b/sw/source/ui/fldui/flddinf.cxx new file mode 100644 index 000000000000..1fd345c832d4 --- /dev/null +++ b/sw/source/ui/fldui/flddinf.cxx @@ -0,0 +1,537 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + +#include <sfx2/request.hxx> +#include <sfx2/frame.hxx> +#include <vcl/svapp.hxx> +#include <svl/zforlist.hxx> +#include <svl/zformat.hxx> + +#include <helpid.h> +#include <swtypes.hxx> +#include <globals.hrc> +#include <fldbas.hxx> +#include <docufld.hxx> +#include <wrtsh.hxx> + +#include <fldui.hrc> + +#ifndef _FLDTDLG_HRC +#include <fldtdlg.hrc> +#endif +#ifndef _FLDDINF_HXX +#include <flddinf.hxx> +#endif +#include <swmodule.hxx> +#ifndef _VIEW_HXX +#include <view.hxx> +#endif +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/util/Time.hpp> +#include <com/sun/star/util/DateTime.hpp> +#include <com/sun/star/util/Date.hpp> + +#define USER_DATA_VERSION_1 "1" +#define USER_DATA_VERSION USER_DATA_VERSION_1 + +using namespace nsSwDocInfoSubType; +using namespace com::sun::star; +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +SwFldDokInfPage::SwFldDokInfPage(Window* pWindow, const SfxItemSet& rCoreSet ) : + SwFldPage( pWindow, SW_RES( TP_FLD_DOKINF ), rCoreSet ), + + aTypeFT (this, SW_RES(FT_DOKINFTYPE)), + aTypeTLB (this, SW_RES(TLB_DOKINFTYPE)), + aSelectionFT(this, SW_RES(FT_DOKINFSELECTION)), + aSelectionLB(this, SW_RES(LB_DOKINFSELECTION)), + aFormatFT (this, SW_RES(FT_DOKINFFORMAT)), + aFormatLB (this, SW_RES(LB_DOKINFFORMAT)), + aFixedCB (this, SW_RES(CB_DOKINFFIXEDCONTENT)), + + pSelEntry (0), + aInfoStr (SW_RES(STR_DOKINF_INFO)) +{ + FreeResource(); + + aTypeTLB.SetHelpId(HID_FIELD_DINF_TYPE); + aTypeTLB.SetSelectionMode(SINGLE_SELECTION); + aTypeTLB.SetStyle(aTypeTLB.GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL); + // Font nicht setzen, damit der Font des Controls uebernommen wird! + // Sonst bei falschem Font Bug an OV. + aTypeTLB.SetSpaceBetweenEntries(0); + + aTypeTLB.SetNodeDefaultImages(); + //enable 'active' language selection + aFormatLB.SetShowLanguageControl(TRUE); + + SFX_ITEMSET_ARG( &rCoreSet, pItem, SfxUnoAnyItem, SID_DOCINFO, FALSE ); + if ( pItem ) + pItem->GetValue() >>= xCustomPropertySet; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +__EXPORT SwFldDokInfPage::~SwFldDokInfPage() +{ +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +void __EXPORT SwFldDokInfPage::Reset(const SfxItemSet& ) +{ + Init(); // Allgemeine initialisierung + + // TypeListBox initialisieren + aTypeTLB.SetUpdateMode(FALSE); + aTypeTLB.Clear(); + pSelEntry = 0; + + // SubTypes in der TypeLB anzeigen + USHORT nTypeId = TYP_DOCINFOFLD; + SvLBoxEntry* pEntry = 0; + + SvLBoxEntry* pInfo = 0; + + USHORT nSubType = USHRT_MAX; + if (IsFldEdit()) + { + const SwField* pCurField = GetCurField(); + nSubType = ((SwDocInfoField*)pCurField)->GetSubType() & 0xff; + if( nSubType == DI_CUSTOM ) + { + m_sOldCustomFieldName = static_cast<const SwDocInfoField*>(pCurField)->GetName(); + } + aFormatLB.SetAutomaticLanguage(pCurField->IsAutomaticLanguage()); + SwWrtShell *pSh = GetWrtShell(); + if(pSh) + { + const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat()); + if(pFormat) + aFormatLB.SetLanguage(pFormat->GetLanguage()); + } + } + + USHORT nSelEntryData = USHRT_MAX; + String sUserData = GetUserData(); + if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1)) + { + String sVal = sUserData.GetToken(1, ';'); + nSelEntryData = static_cast< USHORT >(sVal.ToInt32()); + } + + SvStringsDtor aLst; + GetFldMgr().GetSubTypes(nTypeId, aLst); + for (USHORT i = 0; i < aLst.Count(); ++i) + { + if (!IsFldEdit() || nSubType == i) + { + if (DI_CUSTOM == i) + { + if(xCustomPropertySet.is() ) + { + uno::Reference< beans::XPropertySetInfo > xSetInfo = xCustomPropertySet->getPropertySetInfo(); + const uno::Sequence< beans::Property > rProperties = xSetInfo->getProperties(); +// uno::Sequence< ::rtl::OUString > aPropertyNames(rProperties.getLength()); +// for (sal_Int32 i = 0; i < rProperties.getLength(); ++i) { +// aPropertyNames[i] = rProperties[i].Name; +// } + //if ( !IsFldEdit() ) + if( rProperties.getLength() ) + { + pInfo = aTypeTLB.InsertEntry( String(SW_RES( STR_CUSTOM )) ); + pInfo->SetUserData(reinterpret_cast<void*>(USHRT_MAX)); + + for (sal_Int32 n=0; n < rProperties.getLength(); n++) + { + rtl::OUString sEntry = rProperties[n].Name; + pEntry = aTypeTLB.InsertEntry(sEntry, pInfo); + if(m_sOldCustomFieldName.equals( sEntry )) + { + pSelEntry = pEntry; + aTypeTLB.Expand( pInfo ); + } + pEntry->SetUserData(reinterpret_cast<void*>(i)); + } + } + } + } + else + { + if (!(IsFldDlgHtmlMode() && (i == DI_EDIT || i == DI_THEMA || i == DI_PRINT))) + { + pEntry = aTypeTLB.InsertEntry(*aLst[i]); + pEntry->SetUserData(reinterpret_cast<void*>(i)); + } + } + if(nSelEntryData == i) + pSelEntry = pEntry; + } + } + + // alte Pos selektieren + if (pSelEntry != 0) + { + aTypeTLB.Select(pSelEntry); + nSubType = (USHORT)(ULONG)pSelEntry->GetUserData(); + } + else if ( aTypeTLB.GetEntry(0) ) + { + pSelEntry = aTypeTLB.GetEntry(0); + nSubType = (USHORT)(ULONG)pSelEntry->GetUserData(); + } + + FillSelectionLB(nSubType); + if ( pSelEntry ) + TypeHdl(); + + aTypeTLB.SetUpdateMode(TRUE); + aTypeTLB.SetSelectHdl(LINK(this, SwFldDokInfPage, TypeHdl)); + aTypeTLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); + aSelectionLB.SetSelectHdl(LINK(this, SwFldDokInfPage, SubTypeHdl)); + aSelectionLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); + aFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); + + if (IsFldEdit()) + { + nOldSel = aSelectionLB.GetSelectEntryPos(); + nOldFormat = GetCurField()->GetFormat(); + aFixedCB.SaveValue(); + } +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +IMPL_LINK( SwFldDokInfPage, TypeHdl, ListBox *, EMPTYARG ) +{ + // Alte ListBoxPos sichern + SvLBoxEntry* pOldEntry = pSelEntry; + + // Aktuelle ListBoxPos + pSelEntry = aTypeTLB.FirstSelected(); + + if(!pSelEntry) + { + pSelEntry = aTypeTLB.GetEntry(0); + aTypeTLB.Select(pSelEntry); + } + else + + if (pOldEntry != pSelEntry) + FillSelectionLB((USHORT)(ULONG)pSelEntry->GetUserData()); + + SubTypeHdl(); + + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ +IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG ) +{ + USHORT nSubType = (USHORT)(ULONG)pSelEntry->GetUserData(); + USHORT nPos = aSelectionLB.GetSelectEntryPos(); + USHORT nExtSubType; + USHORT nNewType = 0; + + if (nSubType != DI_EDIT) + { + if (nPos == LISTBOX_ENTRY_NOTFOUND) + { + if (!aSelectionLB.GetEntryCount()) + { + aFormatLB.Clear(); + aFormatLB.Enable(FALSE); + aFormatFT.Enable(FALSE); + if( nSubType == DI_CUSTOM ) + { + //find out which type the custom field has - for a start set to DATE format + ::rtl::OUString sName = aTypeTLB.GetEntryText(pSelEntry); + try + { + uno::Any aVal = xCustomPropertySet->getPropertyValue( sName ); + const uno::Type& rValueType = aVal.getValueType(); + if( rValueType == ::getCppuType( (util::DateTime*)0 )) + { + nNewType = NUMBERFORMAT_DATETIME; + } + else if( rValueType == ::getCppuType( (util::Date*)0 )) + { + nNewType = NUMBERFORMAT_DATE; + } + else if( rValueType == ::getCppuType( (util::Time*)0 )) + { + nNewType = NUMBERFORMAT_TIME; + } + } + catch( const uno::Exception& ) + { + } + } + else + return 0; + } + nPos = 0; + } + + nExtSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos); + } + else + nExtSubType = DI_SUB_TIME; + + USHORT nOldType = 0; + BOOL bEnable = FALSE; + BOOL bOneArea = FALSE; + + if (aFormatLB.IsEnabled()) + nOldType = aFormatLB.GetFormatType(); + + switch (nExtSubType) + { + case DI_SUB_AUTHOR: + break; + + case DI_SUB_DATE: + nNewType = NUMBERFORMAT_DATE; + bOneArea = TRUE; + break; + + case DI_SUB_TIME: + nNewType = NUMBERFORMAT_TIME; + bOneArea = TRUE; + break; + } + if (!nNewType) + { + aFormatLB.Clear(); + } + else + { + if (nOldType != nNewType) + { + aFormatLB.SetFormatType(nNewType); + aFormatLB.SetOneArea(bOneArea); + } + bEnable = TRUE; + } + + ULONG nFormat = IsFldEdit() ? ((SwDocInfoField*)GetCurField())->GetFormat() : 0; + + USHORT nOldSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0; + + if (IsFldEdit()) + { + nPos = aSelectionLB.GetSelectEntryPos(); + if (nPos != LISTBOX_ENTRY_NOTFOUND ) + { + nSubType = (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos); + + nOldSubType &= ~DI_SUB_FIXED; + if (nOldSubType == nSubType) + { + if (!nFormat && (nNewType == NUMBERFORMAT_DATE || nNewType == NUMBERFORMAT_TIME)) + { + SwWrtShell *pSh = GetWrtShell(); + if(pSh) + { + SvNumberFormatter* pFormatter = pSh->GetNumberFormatter(); + LanguageType eLang = aFormatLB.GetCurLanguage(); + if (nNewType == NUMBERFORMAT_DATE) + nFormat = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang); + else if (nNewType == NUMBERFORMAT_TIME) + nFormat = pFormatter->GetFormatIndex( NF_TIME_HHMM, eLang); + } + } + aFormatLB.SetDefFormat(nFormat); + } + } + else if( (nSubType == DI_CUSTOM) && (nNewType != 0) ) + { + aFormatLB.SetDefFormat(nFormat); + } + } + + aFormatLB.Enable(bEnable); + aFormatFT.Enable(bEnable); + + if (bEnable && aFormatLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND) + { + aFormatLB.SelectEntryPos(0); + } + + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +USHORT SwFldDokInfPage::FillSelectionLB(USHORT nSubType) +{ + // Format-Listbox fuellen + USHORT nTypeId = TYP_DOCINFOFLD; + + EnableInsert(nSubType != USHRT_MAX); + + if (nSubType == USHRT_MAX) // Info-Text + nSubType = DI_SUBTYPE_BEGIN; + + aSelectionLB.Clear(); + + USHORT nSize = 0; + USHORT nSelPos = USHRT_MAX; + USHORT nExtSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0; + + if (IsFldEdit()) + { + aFixedCB.Check((nExtSubType & DI_SUB_FIXED) != 0); + nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1; + } + + if (nSubType < DI_CREATE || nSubType == DI_DOCNO || nSubType == DI_EDIT|| nSubType == DI_CUSTOM ) + { + // Format Box ist fuer Title und Time leer + } + else + { + nSize = GetFldMgr().GetFormatCount(nTypeId, FALSE, IsFldDlgHtmlMode()); + for (USHORT i = 0; i < nSize; i++) + { + USHORT nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i)); + aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId(nTypeId, i))); + if (IsFldEdit() && i == nExtSubType) + nSelPos = nPos; + } + } + + BOOL bEnable = nSize != 0; + + if (nSize) + { + if (!aSelectionLB.GetSelectEntryCount()) + aSelectionLB.SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos); + + bEnable = TRUE; + } + + aSelectionFT.Enable(bEnable); + aSelectionLB.Enable(bEnable); + + return nSize; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +BOOL __EXPORT SwFldDokInfPage::FillItemSet(SfxItemSet& ) +{ + if (!pSelEntry || (USHORT)(ULONG)pSelEntry->GetUserData() == USHRT_MAX) + return FALSE; + + USHORT nTypeId = TYP_DOCINFOFLD; + USHORT nSubType = (USHORT)(ULONG)pSelEntry->GetUserData(); + + ULONG nFormat = 0; + + USHORT nPos = aSelectionLB.GetSelectEntryPos(); + + ::rtl::OUString aName; + if (DI_CUSTOM == nSubType) + aName = aTypeTLB.GetEntryText(pSelEntry); + + if (nPos != LISTBOX_ENTRY_NOTFOUND) + nSubType |= (USHORT)(ULONG)aSelectionLB.GetEntryData(nPos); + + if (aFixedCB.IsChecked()) + nSubType |= DI_SUB_FIXED; + + nPos = aFormatLB.GetSelectEntryPos(); + if(nPos != LISTBOX_ENTRY_NOTFOUND) + nFormat = aFormatLB.GetFormat(); + + if (!IsFldEdit() || nOldSel != aSelectionLB.GetSelectEntryPos() || + nOldFormat != nFormat || aFixedCB.GetState() != aFixedCB.GetSavedValue() + || (DI_CUSTOM == nSubType && !aName.equals( m_sOldCustomFieldName ))) + { + InsertFld(nTypeId, nSubType, aName, aEmptyStr, nFormat, + ' ', aFormatLB.IsAutomaticLanguage()); + } + + return FALSE; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +SfxTabPage* __EXPORT SwFldDokInfPage::Create( Window* pParent, + const SfxItemSet& rAttrSet ) +{ + return ( new SwFldDokInfPage( pParent, rAttrSet ) ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +USHORT SwFldDokInfPage::GetGroup() +{ + return GRP_REG; +} +/* -----------------12.01.99 11:21------------------- + * + * --------------------------------------------------*/ +void SwFldDokInfPage::FillUserData() +{ + String sData( String::CreateFromAscii( + RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION ))); + sData += ';'; + SvLBoxEntry* pEntry = aTypeTLB.FirstSelected(); + USHORT nTypeSel = pEntry ? sal::static_int_cast< USHORT >(reinterpret_cast< sal_uIntPtr >(pEntry->GetUserData())) : USHRT_MAX; + sData += String::CreateFromInt32( nTypeSel ); + SetUserData(sData); +} + + + |