xref: /AOO41X/main/sw/source/core/fields/flddat.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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_sw.hxx"
26 
27 // #include <math.h>
28 #include <tools/datetime.hxx>
29 #include <svl/zforlist.hxx>
30 #include <com/sun/star/util/DateTime.hpp>
31 #include <doc.hxx>
32 #include <fldbas.hxx>
33 #include <flddat.hxx>
34 #include <unofldmid.h>
35 
36 using namespace ::com::sun::star;
37 /*--------------------------------------------------
38     Beschreibung: Datum/Zeit-Typ
39  ---------------------------------------------------*/
40 
SwDateTimeFieldType(SwDoc * pInitDoc)41 SwDateTimeFieldType::SwDateTimeFieldType(SwDoc* pInitDoc)
42     : SwValueFieldType( pInitDoc, RES_DATETIMEFLD )
43 {}
44 
45 /*--------------------------------------------------------------------
46     Beschreibung:
47  --------------------------------------------------------------------*/
48 
Copy() const49 SwFieldType* SwDateTimeFieldType::Copy() const
50 {
51     SwDateTimeFieldType *pTmp = new SwDateTimeFieldType(GetDoc());
52     return pTmp;
53 }
54 
55 /*--------------------------------------------------------------------
56     Beschreibung: Datum/Zeit-Feld
57  --------------------------------------------------------------------*/
58 
SwDateTimeField(SwDateTimeFieldType * pInitType,sal_uInt16 nSub,sal_uLong nFmt,sal_uInt16 nLng)59 SwDateTimeField::SwDateTimeField(SwDateTimeFieldType* pInitType, sal_uInt16 nSub, sal_uLong nFmt, sal_uInt16 nLng)
60     : SwValueField(pInitType, nFmt, nLng, 0.0),
61     nSubType(nSub),
62     nOffset(0)
63 {
64     if (!nFmt)
65     {
66         SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
67         if (nSubType & DATEFLD)
68             ChangeFormat(pFormatter->GetFormatIndex(NF_DATE_SYSTEM_SHORT, GetLanguage()));
69         else
70             ChangeFormat(pFormatter->GetFormatIndex(NF_TIME_HHMMSS, GetLanguage()));
71     }
72     if (IsFixed())
73     {
74         DateTime aDateTime;
75         SetDateTime(aDateTime);
76     }
77 }
78 
79 /*--------------------------------------------------------------------
80     Beschreibung:
81  --------------------------------------------------------------------*/
82 
Expand() const83 String SwDateTimeField::Expand() const
84 {
85     double fVal;
86 
87     if (!(IsFixed()))
88     {
89         DateTime aDateTime;
90         fVal = GetDateTime(GetDoc(), aDateTime);
91     }
92     else
93         fVal = GetValue();
94 
95     if (nOffset)
96         fVal += (double)(nOffset * 60L) / 86400.0;
97 
98     return ExpandValue(fVal, GetFormat(), GetLanguage());
99 }
100 
101 /*--------------------------------------------------------------------
102     Beschreibung:
103  --------------------------------------------------------------------*/
104 
Copy() const105 SwField* SwDateTimeField::Copy() const
106 {
107     SwDateTimeField *pTmp =
108         new SwDateTimeField((SwDateTimeFieldType*)GetTyp(), nSubType,
109                                             GetFormat(), GetLanguage());
110 
111     pTmp->SetValue(GetValue());
112     pTmp->SetOffset(nOffset);
113     pTmp->SetAutomaticLanguage(IsAutomaticLanguage());
114 
115     return pTmp;
116 }
117 
118 /*--------------------------------------------------------------------
119     Beschreibung:
120  --------------------------------------------------------------------*/
121 
GetSubType() const122 sal_uInt16 SwDateTimeField::GetSubType() const
123 {
124     return nSubType;
125 }
126 
127 /*--------------------------------------------------------------------
128     Beschreibung:
129  --------------------------------------------------------------------*/
130 
SetSubType(sal_uInt16 nType)131 void SwDateTimeField::SetSubType(sal_uInt16 nType)
132 {
133     nSubType = nType;
134 }
135 /*--------------------------------------------------------------------
136     Beschreibung:
137  --------------------------------------------------------------------*/
138 
SetPar2(const String & rStr)139 void SwDateTimeField::SetPar2(const String& rStr)
140 {
141     nOffset = rStr.ToInt32();
142 }
143 
144 /*--------------------------------------------------------------------
145     Beschreibung:
146  --------------------------------------------------------------------*/
147 
GetPar2() const148 String SwDateTimeField::GetPar2() const
149 {
150     if (nOffset)
151         return String::CreateFromInt32(nOffset);
152     else
153         return aEmptyStr;
154 }
155 
156 /*--------------------------------------------------------------------
157     Beschreibung:
158  --------------------------------------------------------------------*/
159 
SetDateTime(const DateTime & rDT)160 void SwDateTimeField::SetDateTime(const DateTime& rDT)
161 {
162     SetValue(GetDateTime(GetDoc(), rDT));
163 }
164 
165 /*--------------------------------------------------------------------
166     Beschreibung:
167  --------------------------------------------------------------------*/
168 
GetDateTime(SwDoc * pDoc,const DateTime & rDT)169 double SwDateTimeField::GetDateTime(SwDoc* pDoc, const DateTime& rDT)
170 {
171     SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter();
172     Date* pNullDate = pFormatter->GetNullDate();
173 
174     double fResult = rDT - DateTime(*pNullDate);
175 
176     return fResult;
177 }
178 
179 /*--------------------------------------------------------------------
180     Beschreibung:
181  --------------------------------------------------------------------*/
182 
GetValue() const183 double SwDateTimeField::GetValue() const
184 {
185     if (IsFixed())
186         return SwValueField::GetValue();
187     else
188         return GetDateTime(GetDoc(), DateTime());
189 }
190 
191 /*--------------------------------------------------------------------
192     Beschreibung:
193  --------------------------------------------------------------------*/
194 
GetDate(sal_Bool bUseOffset) const195 Date SwDateTimeField::GetDate(sal_Bool bUseOffset) const
196 {
197     SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
198     Date* pNullDate = pFormatter->GetNullDate();
199 
200     long nVal = static_cast<long>( GetValue() );
201 
202     if (bUseOffset && nOffset)
203         nVal += nOffset / 60 / 24;
204 
205     Date aDate = *pNullDate + nVal;
206 
207     return aDate;
208 }
209 
210 /*--------------------------------------------------------------------
211     Beschreibung:
212  --------------------------------------------------------------------*/
213 
GetTime(sal_Bool bUseOffset) const214 Time SwDateTimeField::GetTime(sal_Bool bUseOffset) const
215 {
216     double fDummy;
217     double fFract = modf(GetValue(), &fDummy);
218     DateTime aDT((long)fDummy, 0);
219     aDT += fFract;
220     if (bUseOffset)
221          aDT += Time(0, nOffset);
222     return (Time)aDT;
223 }
224 
225 /*-----------------04.03.98 11:05-------------------
226 
227 --------------------------------------------------*/
QueryValue(uno::Any & rVal,sal_uInt16 nWhichId) const228 sal_Bool SwDateTimeField::QueryValue( uno::Any& rVal, sal_uInt16 nWhichId ) const
229 {
230     switch( nWhichId )
231     {
232     case FIELD_PROP_BOOL1:
233         {
234             sal_Bool bTmp = IsFixed();
235             rVal.setValue(&bTmp, ::getCppuBooleanType());
236         }
237         break;
238     case FIELD_PROP_BOOL2:
239         {
240             sal_Bool bTmp = IsDate();
241             rVal.setValue(&bTmp, ::getCppuBooleanType());
242         }
243         break;
244     case FIELD_PROP_FORMAT:
245         rVal <<= (sal_Int32)GetFormat();
246         break;
247     case FIELD_PROP_SUBTYPE:
248         rVal <<= (sal_Int32)nOffset;
249         break;
250     case FIELD_PROP_DATE_TIME:
251         {
252             DateTime aDateTime(GetDate(), GetTime());
253 
254             util::DateTime DateTimeValue;
255             DateTimeValue.HundredthSeconds = aDateTime.Get100Sec();
256             DateTimeValue.Seconds = aDateTime.GetSec();
257             DateTimeValue.Minutes = aDateTime.GetMin();
258             DateTimeValue.Hours = aDateTime.GetHour();
259             DateTimeValue.Day = aDateTime.GetDay();
260             DateTimeValue.Month = aDateTime.GetMonth();
261             DateTimeValue.Year = aDateTime.GetYear();
262             rVal <<= DateTimeValue;
263         }
264         break;
265     default:
266         return SwField::QueryValue(rVal, nWhichId);
267     }
268     return sal_True;
269 }
270 /*-----------------04.03.98 11:05-------------------
271 
272 --------------------------------------------------*/
PutValue(const uno::Any & rVal,sal_uInt16 nWhichId)273 sal_Bool SwDateTimeField::PutValue( const uno::Any& rVal, sal_uInt16 nWhichId )
274 {
275     sal_Int32 nTmp = 0;
276     switch( nWhichId )
277     {
278     case FIELD_PROP_BOOL1:
279         if(*(sal_Bool*)rVal.getValue())
280             nSubType |= FIXEDFLD;
281         else
282             nSubType &= ~FIXEDFLD;
283         break;
284     case FIELD_PROP_BOOL2:
285         nSubType &=  ~(DATEFLD|TIMEFLD);
286         nSubType |= *(sal_Bool*)rVal.getValue() ? DATEFLD : TIMEFLD;
287         break;
288     case FIELD_PROP_FORMAT:
289         rVal >>= nTmp;
290         ChangeFormat(nTmp);
291         break;
292     case FIELD_PROP_SUBTYPE:
293         rVal >>= nTmp;
294         nOffset = nTmp;
295         break;
296     case FIELD_PROP_DATE_TIME:
297         {
298             util::DateTime aDateTimeValue;
299             if(!(rVal >>= aDateTimeValue))
300                 return sal_False;
301             DateTime aDateTime;
302             aDateTime.Set100Sec(aDateTimeValue.HundredthSeconds);
303             aDateTime.SetSec(aDateTimeValue.Seconds);
304             aDateTime.SetMin(aDateTimeValue.Minutes);
305             aDateTime.SetHour(aDateTimeValue.Hours);
306             aDateTime.SetDay(aDateTimeValue.Day);
307             aDateTime.SetMonth(aDateTimeValue.Month);
308             aDateTime.SetYear(aDateTimeValue.Year);
309             SetDateTime(aDateTime);
310         }
311         break;
312         default:
313             return SwField::PutValue(rVal, nWhichId);
314     }
315     return sal_True;
316 }
317 
318