xref: /trunk/main/svl/source/items/dateitem.cxx (revision 40df464e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svl.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #define _DATETIMEITEM_CXX
30 #include <svl/dateitem.hxx>
31 #include <svl/svldata.hxx>
32 #include <svl/svl.hrc>
33 
34 #include <unotools/intlwrapper.hxx>
35 #include <comphelper/processfactory.hxx>
36 
37 #include <tools/stream.hxx>
38 #include <tools/debug.hxx>
39 #include <tools/datetime.hxx>
40 #include <com/sun/star/uno/Any.hxx>
41 #include <com/sun/star/util/DateTime.hpp>
42 #include <com/sun/star/lang/Locale.hpp>
43 
44 // STATIC DATA -----------------------------------------------------------
45 
46 DBG_NAME(SfxDateTimeItem)
47 
48 
49 // -----------------------------------------------------------------------
50 
51 TYPEINIT1(SfxDateTimeItem, SfxPoolItem);
52 
53 // -----------------------------------------------------------------------
54 
SfxDateTimeItem(sal_uInt16 which)55 SfxDateTimeItem::SfxDateTimeItem( sal_uInt16 which ) :
56 	SfxPoolItem( which )
57 {
58 	DBG_CTOR(SfxDateTimeItem, 0);
59 }
60 
61 // -----------------------------------------------------------------------
62 
SfxDateTimeItem(sal_uInt16 which,const DateTime & rDT)63 SfxDateTimeItem::SfxDateTimeItem( sal_uInt16 which, const DateTime& rDT ) :
64 	SfxPoolItem( which ),
65 	aDateTime( rDT )
66 
67 {
68 	DBG_CTOR(SfxDateTimeItem, 0);
69 }
70 
71 // -----------------------------------------------------------------------
72 
SfxDateTimeItem(const SfxDateTimeItem & rItem)73 SfxDateTimeItem::SfxDateTimeItem( const SfxDateTimeItem& rItem ) :
74 	SfxPoolItem( rItem ),
75 	aDateTime( rItem.aDateTime )
76 {
77 	DBG_CTOR(SfxDateTimeItem, 0);
78 }
79 
80 // -----------------------------------------------------------------------
81 
operator ==(const SfxPoolItem & rItem) const82 int SfxDateTimeItem::operator==( const SfxPoolItem& rItem ) const
83 {
84 	DBG_CHKTHIS(SfxDateTimeItem, 0);
85 	DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" );
86 	return ( ( (SfxDateTimeItem&)rItem ).aDateTime == aDateTime );
87 }
88 
89 // -----------------------------------------------------------------------
90 
Compare(const SfxPoolItem & rItem) const91 int SfxDateTimeItem::Compare( const SfxPoolItem& rItem ) const
92 {
93 	DBG_CHKTHIS(SfxDateTimeItem, 0);
94 	DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" );
95 
96 	// da X.Compare( Y ) am String einem Compare( Y, X ) entspricht,
97 	// vergleichen wir hier Y mit X
98 	if ( ( (const SfxDateTimeItem&)rItem ).aDateTime < aDateTime )
99 		return -1;
100 	else if ( ( (const SfxDateTimeItem&)rItem ).aDateTime == aDateTime )
101 		return 0;
102 	else
103 		return 1;
104 }
105 
106 // -----------------------------------------------------------------------
107 
Create(SvStream & rStream,sal_uInt16) const108 SfxPoolItem* SfxDateTimeItem::Create( SvStream& rStream, sal_uInt16 ) const
109 {
110 	DBG_CHKTHIS(SfxDateTimeItem, 0);
111 	sal_uInt32 nDate = 0;
112 	sal_Int32 nTime = 0;
113 	rStream >> nDate;
114 	rStream >> nTime;
115 	DateTime aDT(nDate, nTime);
116 	return new SfxDateTimeItem( Which(), aDT );
117 }
118 
119 // -----------------------------------------------------------------------
120 
Store(SvStream & rStream,sal_uInt16) const121 SvStream& SfxDateTimeItem::Store( SvStream& rStream, sal_uInt16 ) const
122 {
123 	DBG_CHKTHIS(SfxDateTimeItem, 0);
124 	rStream << aDateTime.GetDate();
125 	rStream << aDateTime.GetTime();
126 	return rStream;
127 }
128 
129 // -----------------------------------------------------------------------
130 
Clone(SfxItemPool *) const131 SfxPoolItem* SfxDateTimeItem::Clone( SfxItemPool* ) const
132 {
133 	DBG_CHKTHIS(SfxDateTimeItem, 0);
134 	return new SfxDateTimeItem( *this );
135 }
136 
137 // -----------------------------------------------------------------------
138 
GetPresentation(SfxItemPresentation,SfxMapUnit,SfxMapUnit,XubString & rText,const IntlWrapper * pIntlWrapper) const139 SfxItemPresentation SfxDateTimeItem::GetPresentation
140 (
141 	SfxItemPresentation 	/*ePresentation*/,
142 	SfxMapUnit				/*eCoreMetric*/,
143 	SfxMapUnit				/*ePresentationMetric*/,
144 	XubString& 				rText,
145     const IntlWrapper *   pIntlWrapper
146 )	const
147 {
148 	DBG_CHKTHIS(SfxDateTimeItem, 0);
149 	if (aDateTime.IsValid())
150         if (pIntlWrapper)
151 		{
152             rText = pIntlWrapper->getLocaleData()->getDate(aDateTime);
153 			rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
154             rText += pIntlWrapper->getLocaleData()->getTime(aDateTime);
155 		}
156 		else
157 		{
158 			DBG_WARNING("SfxDateTimeItem::GetPresentation():"
159                          " Using default en_US IntlWrapper");
160             const IntlWrapper aIntlWrapper(
161                 ::comphelper::getProcessServiceFactory(), LANGUAGE_ENGLISH_US );
162             rText = aIntlWrapper.getLocaleData()->getDate(aDateTime);
163 			rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
164             rText += aIntlWrapper.getLocaleData()->getTime(aDateTime);
165 		}
166 	else
167 		rText.Erase();
168 	return SFX_ITEM_PRESENTATION_NAMELESS;
169 }
170 
171 //----------------------------------------------------------------------------
172 // virtual
PutValue(const com::sun::star::uno::Any & rVal,sal_uInt8 nMemberId)173 sal_Bool SfxDateTimeItem::PutValue( const com::sun::star::uno::Any& rVal,
174 						   		sal_uInt8 nMemberId )
175 {
176 	nMemberId &= ~CONVERT_TWIPS;
177 	com::sun::star::util::DateTime aValue;
178 	if ( rVal >>= aValue )
179 	{
180 		aDateTime = DateTime( Date( aValue.Day,
181 			  						aValue.Month,
182 			  						aValue.Year ),
183 							  Time( aValue.Hours,
184 			  						aValue.Minutes,
185 			  						aValue.Seconds,
186 			  						aValue.HundredthSeconds ) );
187 		return sal_True;
188 	}
189 
190 	DBG_ERROR( "SfxDateTimeItem::PutValue - Wrong type!" );
191 	return sal_False;
192 }
193 
194 //----------------------------------------------------------------------------
195 // virtual
QueryValue(com::sun::star::uno::Any & rVal,sal_uInt8 nMemberId) const196 sal_Bool SfxDateTimeItem::QueryValue( com::sun::star::uno::Any& rVal,
197 							 	  sal_uInt8 nMemberId ) const
198 {
199 	nMemberId &= ~CONVERT_TWIPS;
200 	com::sun::star::util::DateTime aValue( aDateTime.Get100Sec(),
201     									   aDateTime.GetSec(),
202    										   aDateTime.GetMin(),
203     									   aDateTime.GetHour(),
204     									   aDateTime.GetDay(),
205     									   aDateTime.GetMonth(),
206     									   aDateTime.GetYear() );
207 	rVal <<= aValue;
208 	return sal_True;
209 }
210 
211 // -----------------------------------------------------------------------
212 // -----------------------------------------------------------------------
213 // -----------------------------------------------------------------------
214 
215 TYPEINIT1(SfxColumnDateTimeItem, SfxDateTimeItem);
216 
217 
SfxColumnDateTimeItem(sal_uInt16 which)218 SfxColumnDateTimeItem::SfxColumnDateTimeItem( sal_uInt16 which ) :
219 	SfxDateTimeItem( which )
220 {}
221 
SfxColumnDateTimeItem(sal_uInt16 which,const DateTime & rDT)222 SfxColumnDateTimeItem::SfxColumnDateTimeItem( sal_uInt16 which, const DateTime& rDT ) :
223 	SfxDateTimeItem( which, rDT )
224 {}
225 
SfxColumnDateTimeItem(const SfxDateTimeItem & rCpy)226 SfxColumnDateTimeItem::SfxColumnDateTimeItem( const SfxDateTimeItem& rCpy ) :
227 	SfxDateTimeItem( rCpy )
228 {}
229 
Clone(SfxItemPool *) const230 SfxPoolItem* SfxColumnDateTimeItem::Clone( SfxItemPool* ) const
231 {
232 	return new SfxColumnDateTimeItem( *this );
233 }
234 
GetPresentation(SfxItemPresentation,SfxMapUnit,SfxMapUnit,XubString & rText,const IntlWrapper * pIntlWrapper) const235 SfxItemPresentation SfxColumnDateTimeItem::GetPresentation
236 (
237 	SfxItemPresentation 	/*ePresentation*/,
238 	SfxMapUnit				/*eCoreMetric*/,
239 	SfxMapUnit				/*ePresentationMetric*/,
240 	XubString& 				rText,
241     const IntlWrapper *   pIntlWrapper
242 )	const
243 {
244     DBG_ASSERT(pIntlWrapper,
245 			   "SfxColumnDateTimeItem::GetPresentation():"
246                 " Using default en_US IntlWrapper");
247 
248     ::com::sun::star::lang::Locale aLocale;
249 	if (GetDateTime() == DateTime(Date(1, 2, 3), Time(3, 2, 1)))
250 	{
251 		rText = String(SvtSimpleResId(STR_COLUM_DT_AUTO,
252                                 pIntlWrapper ?
253                                  pIntlWrapper->getLocale() :
254 								 aLocale));
255 	}
256     else if (pIntlWrapper)
257 	{
258         rText = pIntlWrapper->getLocaleData()->getDate(GetDateTime());
259 		rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
260         rText += pIntlWrapper->getLocaleData()->getTime(GetDateTime());
261 	}
262 	else
263 	{
264         const IntlWrapper aIntlWrapper(
265             ::comphelper::getProcessServiceFactory(), LANGUAGE_ENGLISH_US );
266         rText = aIntlWrapper.getLocaleData()->getDate(GetDateTime());
267 		rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", "));
268         rText += aIntlWrapper.getLocaleData()->getTime(GetDateTime());
269 	}
270 	return SFX_ITEM_PRESENTATION_NAMELESS;
271 }
272 
273 
274 
275