summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authoros <os@openoffice.org>2009-10-08 16:15:40 +0200
committeros <os@openoffice.org>2009-10-08 16:15:40 +0200
commit69470f3410fe804616084c8087e571e20a3671f5 (patch)
tree1923da91139f2c3620c3d568a3a65e67e3251d7e /sw
parentd1a69615e6f186332387fcdb1b4aaae702f04dc6 (diff)
#i105687# enable number format for custom date/datetime/time data
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/fields/docufld.cxx66
-rw-r--r--sw/source/ui/fldui/flddinf.cxx78
-rw-r--r--sw/source/ui/fldui/flddinf.hxx7
-rw-r--r--sw/source/ui/fldui/fldedt.cxx18
-rw-r--r--sw/source/ui/fldui/fldtdlg.cxx34
-rw-r--r--sw/source/ui/fldui/makefile.mk1
6 files changed, 112 insertions, 92 deletions
diff --git a/sw/source/core/fields/docufld.cxx b/sw/source/core/fields/docufld.cxx
index 6bb8ff4902ea..eeec35cc3080 100644
--- a/sw/source/core/fields/docufld.cxx
+++ b/sw/source/core/fields/docufld.cxx
@@ -47,9 +47,7 @@
#include <com/sun/star/text/UserFieldFormat.hpp>
#include <com/sun/star/text/PageNumberType.hpp>
#include <com/sun/star/text/ReferenceFieldPart.hpp>
-#ifndef _COM_SUN_STAR_TEXT_FilenameDisplayFormat_HPP_
#include <com/sun/star/text/FilenameDisplayFormat.hpp>
-#endif
#include <com/sun/star/text/XDependentTextField.hpp>
#include <com/sun/star/text/DocumentStatistic.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
@@ -61,17 +59,19 @@
#include <comphelper/types.hxx>
#include <comphelper/string.hxx>
#include <tools/urlobj.hxx>
-#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
-#endif
#include <svtools/urihelper.hxx>
#include <svtools/useroptions.hxx>
#include <svtools/syslocale.hxx>
+#include <svtools/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>
@@ -90,9 +90,7 @@
#include <cntfrm.hxx> //
#include <pam.hxx>
#include <viewsh.hxx>
-#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
-#endif
#include <shellres.hxx>
#include <docufld.hxx>
#include <flddat.hxx>
@@ -100,16 +98,10 @@
#include <ndtxt.hxx>
#include <expfld.hxx>
#include <poolfmt.hxx>
-#ifndef _DOCSH_HXX
#include <docsh.hxx>
-#endif
-#ifndef _UNOFLDMID_H
#include <unofldmid.h>
-#endif
#include <swunohelper.hxx>
-#ifndef _COMCORE_HRC
#include <comcore.hrc>
-#endif
#include <svx/outliner.hxx>
#include <svx/outlobj.hxx>
@@ -1114,6 +1106,21 @@ SwDocInfoField::SwDocInfoField(SwDocInfoFieldType* pTyp, sal_uInt16 nSub, const
/* ---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
+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 )
@@ -1145,18 +1152,35 @@ String SwDocInfoField::Expand() const
::rtl::OUString sVal;
uno::Reference < script::XTypeConverter > xConverter( comphelper::getProcessServiceFactory()
->createInstance(::rtl::OUString::createFromAscii("com.sun.star.script.Converter")), uno::UNO_QUERY );
- uno::Any aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
- aNew >>= sVal;
+ util::Date aDate;
+ util::DateTime aDateTime;
+ util::Time aTime;
+ 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 >>= aTime )
+ {
+ sVal = ExpandValue( lcl_TimeToDouble<util::Time>( aTime ), GetFormat(), GetLanguage());
+ }
+ else
+ {
+ uno::Any aNew = xConverter->convertToSimpleType( aAny, uno::TypeClass_STRING );
+ aNew >>= sVal;
+ }
((SwDocInfoField*)this)->aContent = sVal;
}
}
- else
- {
- // property is "void" - means it has not been added until now - do it!
- aAny <<= ::rtl::OUString(aContent);
- uno::Reference < beans::XPropertyContainer > xCont( xSet, uno::UNO_QUERY );
- xCont->addProperty( aName, ::com::sun::star::beans::PropertyAttribute::REMOVEABLE, aAny );
- }
}
catch (uno::Exception&) {}
}
diff --git a/sw/source/ui/fldui/flddinf.cxx b/sw/source/ui/fldui/flddinf.cxx
index e368340314fc..5fce68753d29 100644
--- a/sw/source/ui/fldui/flddinf.cxx
+++ b/sw/source/ui/fldui/flddinf.cxx
@@ -40,36 +40,30 @@
#include <vcl/svapp.hxx>
#include <svtools/zforlist.hxx>
-#ifndef _HELPID_H
#include <helpid.h>
-#endif
#include <swtypes.hxx>
-#ifndef _GLOBALS_HRC
#include <globals.hrc>
-#endif
#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 <svtools/zformat.hxx>
+#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:
--------------------------------------------------------------------*/
@@ -103,7 +97,7 @@ SwFldDokInfPage::SwFldDokInfPage(Window* pWindow, const SfxItemSet& rCoreSet ) :
SFX_ITEMSET_ARG( &rCoreSet, pItem, SfxUnoAnyItem, SID_DOCINFO, FALSE );
if ( pItem )
- pItem->GetValue() >>= aPropertyNames;
+ pItem->GetValue() >>= xCustomPropertySet;
}
/*--------------------------------------------------------------------
@@ -168,24 +162,31 @@ void __EXPORT SwFldDokInfPage::Reset(const SfxItemSet& )
{
if (DI_CUSTOM == i)
{
- if (aPropertyNames.getLength() )
+ 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<aPropertyNames.getLength(); n++)
- {
- rtl::OUString sEntry = aPropertyNames[n];
- pEntry = aTypeTLB.InsertEntry(sEntry, pInfo);
- if(m_sOldCustomFieldName.equals( sEntry ))
+ for (sal_Int32 n=0; n < rProperties.getLength(); n++)
{
- pSelEntry = pEntry;
- aTypeTLB.Expand( pInfo );
+ 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));
}
- pEntry->SetUserData(reinterpret_cast<void*>(i));
}
}
}
@@ -269,6 +270,7 @@ 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)
{
@@ -279,7 +281,33 @@ IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG )
aFormatLB.Clear();
aFormatLB.Enable(FALSE);
aFormatFT.Enable(FALSE);
- return 0;
+ 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;
}
@@ -290,7 +318,6 @@ IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG )
nExtSubType = DI_SUB_TIME;
USHORT nOldType = 0;
- USHORT nNewType = 0;
BOOL bEnable = FALSE;
BOOL bOneArea = FALSE;
@@ -312,7 +339,6 @@ IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG )
bOneArea = TRUE;
break;
}
-
if (!nNewType)
{
aFormatLB.Clear();
diff --git a/sw/source/ui/fldui/flddinf.hxx b/sw/source/ui/fldui/flddinf.hxx
index 2b72b1aec33a..0d46c873f342 100644
--- a/sw/source/ui/fldui/flddinf.hxx
+++ b/sw/source/ui/fldui/flddinf.hxx
@@ -33,15 +33,16 @@
#include <sfx2/tabdlg.hxx>
#include <vcl/fixed.hxx>
#include <vcl/lstbox.hxx>
-#ifndef _SV_BUTTON_HXX //autogen
#include <vcl/button.hxx>
-#endif
#include <vcl/group.hxx>
#include <svtools/svtreebx.hxx>
#include "numfmtlb.hxx"
#include "fldpage.hxx"
+namespace com{namespace sun{ namespace star{ namespace beans{
+ class XPropertySet;
+}}}}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
@@ -57,7 +58,7 @@ class SwFldDokInfPage : public SwFldPage
CheckBox aFixedCB;
SvLBoxEntry* pSelEntry;
- com::sun::star::uno::Sequence < ::rtl::OUString > aPropertyNames;
+ com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet > xCustomPropertySet;
String aInfoStr;
diff --git a/sw/source/ui/fldui/fldedt.cxx b/sw/source/ui/fldui/fldedt.cxx
index c0ee8f2e0a98..318ca160c670 100644
--- a/sw/source/ui/fldui/fldedt.cxx
+++ b/sw/source/ui/fldui/fldedt.cxx
@@ -226,15 +226,15 @@ SfxTabPage* SwFldEditDlg::CreatePage(USHORT nGroup)
uno::Reference< beans::XPropertySet > xUDProps(
xDocProps->getUserDefinedProperties(),
uno::UNO_QUERY_THROW);
- uno::Reference< beans::XPropertySetInfo > xSetInfo
- = xUDProps->getPropertySetInfo();
- const uno::Sequence< beans::Property > props
- = xSetInfo->getProperties();
- uno::Sequence< ::rtl::OUString > names(props.getLength());
- for (sal_Int32 i = 0; i < props.getLength(); ++i) {
- names[i] = props[i].Name;
- }
- pSet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(names) ) );
+// uno::Reference< beans::XPropertySetInfo > xSetInfo
+// = xUDProps->getPropertySetInfo();
+// const uno::Sequence< beans::Property > props
+// = xSetInfo->getProperties();
+// uno::Sequence< ::rtl::OUString > names(props.getLength());
+// for (sal_Int32 i = 0; i < props.getLength(); ++i) {
+// names[i] = props[i].Name;
+// }
+ pSet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
pTabPage = SwFldDokInfPage::Create(this, *pSet);
nHelpId = HID_EDIT_FLD_DOKINF;
break;
diff --git a/sw/source/ui/fldui/fldtdlg.cxx b/sw/source/ui/fldui/fldtdlg.cxx
index 23b85f9e8339..67af6efb654e 100644
--- a/sw/source/ui/fldui/fldtdlg.cxx
+++ b/sw/source/ui/fldui/fldtdlg.cxx
@@ -48,47 +48,23 @@
#include <vcl/msgbox.hxx>
#include <svx/htmlmode.hxx>
#include <viewopt.hxx>
-#ifndef _DOCSH_HXX
#include <docsh.hxx>
-#endif
#include <fldwrap.hxx>
-#ifndef _FLDDB_HXX
#include <flddb.hxx>
-#endif
-#ifndef _FLDDINF_HXX
#include <flddinf.hxx>
-#endif
-#ifndef _FLDVAR_HXX
#include <fldvar.hxx>
-#endif
-#ifndef _FLDDOK_HXX
#include <flddok.hxx>
-#endif
-#ifndef _FLDFUNC_HXX
#include <fldfunc.hxx>
-#endif
-#ifndef _FLDREF_HXX
#include <fldref.hxx>
-#endif
#include <wrtsh.hxx>
#include <view.hxx>
-#ifndef _FLDTDLG_HXX
#include <fldtdlg.hxx>
-#endif
#include <swmodule.hxx>
-#ifndef _HELPID_H
#include <helpid.h>
-#endif
-#ifndef _FLDUI_HRC
#include <fldui.hrc>
-#endif
-#ifndef _GLOBALS_HRC
#include <globals.hrc>
-#endif
-#ifndef _FLDTDLG_HRC
#include <fldtdlg.hrc>
-#endif
#include <com/sun/star/document/XDocumentProperties.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
@@ -245,15 +221,7 @@ SfxItemSet* SwFldDlg::CreateInputItemSet( USHORT nID )
uno::Reference< beans::XPropertySet > xUDProps(
xDocProps->getUserDefinedProperties(),
uno::UNO_QUERY_THROW);
- uno::Reference< beans::XPropertySetInfo > xSetInfo
- = xUDProps->getPropertySetInfo();
- const uno::Sequence< beans::Property > props
- = xSetInfo->getProperties();
- uno::Sequence< ::rtl::OUString > names(props.getLength());
- for (sal_Int32 i = 0; i < props.getLength(); ++i) {
- names[i] = props[i].Name;
- }
- pISet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(names) ) );
+ pISet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
return pISet;
}
else
diff --git a/sw/source/ui/fldui/makefile.mk b/sw/source/ui/fldui/makefile.mk
index a94fdaef17e7..23160cf80fb8 100644
--- a/sw/source/ui/fldui/makefile.mk
+++ b/sw/source/ui/fldui/makefile.mk
@@ -80,6 +80,7 @@ SLOFILES = \
EXCEPTIONSFILES = \
$(SLO)$/fldtdlg.obj \
$(SLO)$/fldedt.obj \
+ $(SLO)$/flddinf.obj \
$(SLO)$/xfldui.obj
LIB1TARGET = $(SLB)$/$(TARGET).lib