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