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 41 SwDateTimeFieldType::SwDateTimeFieldType(SwDoc* pInitDoc) 42 : SwValueFieldType( pInitDoc, RES_DATETIMEFLD ) 43 {} 44 45 /*-------------------------------------------------------------------- 46 Beschreibung: 47 --------------------------------------------------------------------*/ 48 49 SwFieldType* SwDateTimeFieldType::Copy() const 50 { 51 SwDateTimeFieldType *pTmp = new SwDateTimeFieldType(GetDoc()); 52 return pTmp; 53 } 54 55 /*-------------------------------------------------------------------- 56 Beschreibung: Datum/Zeit-Feld 57 --------------------------------------------------------------------*/ 58 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 83 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 105 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 122 sal_uInt16 SwDateTimeField::GetSubType() const 123 { 124 return nSubType; 125 } 126 127 /*-------------------------------------------------------------------- 128 Beschreibung: 129 --------------------------------------------------------------------*/ 130 131 void SwDateTimeField::SetSubType(sal_uInt16 nType) 132 { 133 nSubType = nType; 134 } 135 /*-------------------------------------------------------------------- 136 Beschreibung: 137 --------------------------------------------------------------------*/ 138 139 void SwDateTimeField::SetPar2(const String& rStr) 140 { 141 nOffset = rStr.ToInt32(); 142 } 143 144 /*-------------------------------------------------------------------- 145 Beschreibung: 146 --------------------------------------------------------------------*/ 147 148 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 160 void SwDateTimeField::SetDateTime(const DateTime& rDT) 161 { 162 SetValue(GetDateTime(GetDoc(), rDT)); 163 } 164 165 /*-------------------------------------------------------------------- 166 Beschreibung: 167 --------------------------------------------------------------------*/ 168 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 183 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 195 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 214 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 --------------------------------------------------*/ 228 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 --------------------------------------------------*/ 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