blob: 20cd65fb09b68bab18b6e2dd9ffb955ce200343f [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"
#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(sal_True);
SFX_ITEMSET_ARG( &rCoreSet, pItem, SfxUnoAnyItem, SID_DOCINFO, sal_False );
if ( pItem )
pItem->GetValue() >>= xCustomPropertySet;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
__EXPORT SwFldDokInfPage::~SwFldDokInfPage()
{
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void __EXPORT SwFldDokInfPage::Reset(const SfxItemSet& )
{
Init(); // Allgemeine initialisierung
// TypeListBox initialisieren
aTypeTLB.SetUpdateMode(sal_False);
aTypeTLB.Clear();
pSelEntry = 0;
// SubTypes in der TypeLB anzeigen
sal_uInt16 nTypeId = TYP_DOCINFOFLD;
SvLBoxEntry* pEntry = 0;
SvLBoxEntry* pInfo = 0;
sal_uInt16 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());
}
}
sal_uInt16 nSelEntryData = USHRT_MAX;
String sUserData = GetUserData();
if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
{
String sVal = sUserData.GetToken(1, ';');
nSelEntryData = static_cast< sal_uInt16 >(sVal.ToInt32());
}
SvStringsDtor aLst;
GetFldMgr().GetSubTypes(nTypeId, aLst);
for (sal_uInt16 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 = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
}
else if ( aTypeTLB.GetEntry(0) )
{
pSelEntry = aTypeTLB.GetEntry(0);
nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
}
FillSelectionLB(nSubType);
if ( pSelEntry )
TypeHdl();
aTypeTLB.SetUpdateMode(sal_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((sal_uInt16)(sal_uLong)pSelEntry->GetUserData());
SubTypeHdl();
return 0;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG )
{
sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
sal_uInt16 nExtSubType;
sal_uInt16 nNewType = 0;
if (nSubType != DI_EDIT)
{
if (nPos == LISTBOX_ENTRY_NOTFOUND)
{
if (!aSelectionLB.GetEntryCount())
{
aFormatLB.Clear();
aFormatLB.Enable(sal_False);
aFormatFT.Enable(sal_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 = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos);
}
else
nExtSubType = DI_SUB_TIME;
sal_uInt16 nOldType = 0;
sal_Bool bEnable = sal_False;
sal_Bool bOneArea = sal_False;
if (aFormatLB.IsEnabled())
nOldType = aFormatLB.GetFormatType();
switch (nExtSubType)
{
case DI_SUB_AUTHOR:
break;
case DI_SUB_DATE:
nNewType = NUMBERFORMAT_DATE;
bOneArea = sal_True;
break;
case DI_SUB_TIME:
nNewType = NUMBERFORMAT_TIME;
bOneArea = sal_True;
break;
}
if (!nNewType)
{
aFormatLB.Clear();
}
else
{
if (nOldType != nNewType)
{
aFormatLB.SetFormatType(nNewType);
aFormatLB.SetOneArea(bOneArea);
}
bEnable = sal_True;
}
sal_uLong nFormat = IsFldEdit() ? ((SwDocInfoField*)GetCurField())->GetFormat() : 0;
sal_uInt16 nOldSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0;
if (IsFldEdit())
{
nPos = aSelectionLB.GetSelectEntryPos();
if (nPos != LISTBOX_ENTRY_NOTFOUND )
{
nSubType = (sal_uInt16)(sal_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:
--------------------------------------------------------------------*/
sal_uInt16 SwFldDokInfPage::FillSelectionLB(sal_uInt16 nSubType)
{
// Format-Listbox fuellen
sal_uInt16 nTypeId = TYP_DOCINFOFLD;
EnableInsert(nSubType != USHRT_MAX);
if (nSubType == USHRT_MAX) // Info-Text
nSubType = DI_SUBTYPE_BEGIN;
aSelectionLB.Clear();
sal_uInt16 nSize = 0;
sal_uInt16 nSelPos = USHRT_MAX;
sal_uInt16 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, sal_False, IsFldDlgHtmlMode());
for (sal_uInt16 i = 0; i < nSize; i++)
{
sal_uInt16 nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId(nTypeId, i)));
if (IsFldEdit() && i == nExtSubType)
nSelPos = nPos;
}
}
sal_Bool bEnable = nSize != 0;
if (nSize)
{
if (!aSelectionLB.GetSelectEntryCount())
aSelectionLB.SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos);
bEnable = sal_True;
}
aSelectionFT.Enable(bEnable);
aSelectionLB.Enable(bEnable);
return nSize;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Bool __EXPORT SwFldDokInfPage::FillItemSet(SfxItemSet& )
{
if (!pSelEntry || (sal_uInt16)(sal_uLong)pSelEntry->GetUserData() == USHRT_MAX)
return sal_False;
sal_uInt16 nTypeId = TYP_DOCINFOFLD;
sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
sal_uLong nFormat = 0;
sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
::rtl::OUString aName;
if (DI_CUSTOM == nSubType)
aName = aTypeTLB.GetEntryText(pSelEntry);
if (nPos != LISTBOX_ENTRY_NOTFOUND)
nSubType |= (sal_uInt16)(sal_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 sal_False;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
SfxTabPage* __EXPORT SwFldDokInfPage::Create( Window* pParent,
const SfxItemSet& rAttrSet )
{
return ( new SwFldDokInfPage( pParent, rAttrSet ) );
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_uInt16 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();
sal_uInt16 nTypeSel = pEntry ? sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(pEntry->GetUserData())) : USHRT_MAX;
sData += String::CreateFromInt32( nTypeSel );
SetUserData(sData);
}