/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" // #include #include #include #include #include #include #include #include using namespace ::com::sun::star; /*-------------------------------------------------- Beschreibung: Datum/Zeit-Typ ---------------------------------------------------*/ SwDateTimeFieldType::SwDateTimeFieldType(SwDoc* pInitDoc) : SwValueFieldType( pInitDoc, RES_DATETIMEFLD ) {} /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ SwFieldType* SwDateTimeFieldType::Copy() const { SwDateTimeFieldType *pTmp = new SwDateTimeFieldType(GetDoc()); return pTmp; } /*-------------------------------------------------------------------- Beschreibung: Datum/Zeit-Feld --------------------------------------------------------------------*/ SwDateTimeField::SwDateTimeField(SwDateTimeFieldType* pInitType, sal_uInt16 nSub, sal_uLong nFmt, sal_uInt16 nLng) : SwValueField(pInitType, nFmt, nLng, 0.0), nSubType(nSub), nOffset(0) { if (!nFmt) { SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); if (nSubType & DATEFLD) ChangeFormat(pFormatter->GetFormatIndex(NF_DATE_SYSTEM_SHORT, GetLanguage())); else ChangeFormat(pFormatter->GetFormatIndex(NF_TIME_HHMMSS, GetLanguage())); } if (IsFixed()) { DateTime aDateTime; SetDateTime(aDateTime); } } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ String SwDateTimeField::Expand() const { double fVal; if (!(IsFixed())) { DateTime aDateTime; fVal = GetDateTime(GetDoc(), aDateTime); } else fVal = GetValue(); if (nOffset) fVal += (double)(nOffset * 60L) / 86400.0; return ExpandValue(fVal, GetFormat(), GetLanguage()); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ SwField* SwDateTimeField::Copy() const { SwDateTimeField *pTmp = new SwDateTimeField((SwDateTimeFieldType*)GetTyp(), nSubType, GetFormat(), GetLanguage()); pTmp->SetValue(GetValue()); pTmp->SetOffset(nOffset); pTmp->SetAutomaticLanguage(IsAutomaticLanguage()); return pTmp; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ sal_uInt16 SwDateTimeField::GetSubType() const { return nSubType; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDateTimeField::SetSubType(sal_uInt16 nType) { nSubType = nType; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDateTimeField::SetPar2(const String& rStr) { nOffset = rStr.ToInt32(); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ String SwDateTimeField::GetPar2() const { if (nOffset) return String::CreateFromInt32(nOffset); else return aEmptyStr; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ void SwDateTimeField::SetDateTime(const DateTime& rDT) { SetValue(GetDateTime(GetDoc(), rDT)); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ double SwDateTimeField::GetDateTime(SwDoc* pDoc, const DateTime& rDT) { SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter(); Date* pNullDate = pFormatter->GetNullDate(); double fResult = rDT - DateTime(*pNullDate); return fResult; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ double SwDateTimeField::GetValue() const { if (IsFixed()) return SwValueField::GetValue(); else return GetDateTime(GetDoc(), DateTime()); } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ Date SwDateTimeField::GetDate(sal_Bool bUseOffset) const { SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter(); Date* pNullDate = pFormatter->GetNullDate(); long nVal = static_cast( GetValue() ); if (bUseOffset && nOffset) nVal += nOffset / 60 / 24; Date aDate = *pNullDate + nVal; return aDate; } /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ Time SwDateTimeField::GetTime(sal_Bool bUseOffset) const { double fDummy; double fFract = modf(GetValue(), &fDummy); DateTime aDT((long)fDummy, 0); aDT += fFract; if (bUseOffset) aDT += Time(0, nOffset); return (Time)aDT; } /*-----------------04.03.98 11:05------------------- --------------------------------------------------*/ sal_Bool SwDateTimeField::QueryValue( uno::Any& rVal, sal_uInt16 nWhichId ) const { switch( nWhichId ) { case FIELD_PROP_BOOL1: { sal_Bool bTmp = IsFixed(); rVal.setValue(&bTmp, ::getCppuBooleanType()); } break; case FIELD_PROP_BOOL2: { sal_Bool bTmp = IsDate(); rVal.setValue(&bTmp, ::getCppuBooleanType()); } break; case FIELD_PROP_FORMAT: rVal <<= (sal_Int32)GetFormat(); break; case FIELD_PROP_SUBTYPE: rVal <<= (sal_Int32)nOffset; break; case FIELD_PROP_DATE_TIME: { DateTime aDateTime(GetDate(), GetTime()); util::DateTime DateTimeValue; DateTimeValue.HundredthSeconds = aDateTime.Get100Sec(); DateTimeValue.Seconds = aDateTime.GetSec(); DateTimeValue.Minutes = aDateTime.GetMin(); DateTimeValue.Hours = aDateTime.GetHour(); DateTimeValue.Day = aDateTime.GetDay(); DateTimeValue.Month = aDateTime.GetMonth(); DateTimeValue.Year = aDateTime.GetYear(); rVal <<= DateTimeValue; } break; default: return SwField::QueryValue(rVal, nWhichId); } return sal_True; } /*-----------------04.03.98 11:05------------------- --------------------------------------------------*/ sal_Bool SwDateTimeField::PutValue( const uno::Any& rVal, sal_uInt16 nWhichId ) { sal_Int32 nTmp = 0; switch( nWhichId ) { case FIELD_PROP_BOOL1: if(*(sal_Bool*)rVal.getValue()) nSubType |= FIXEDFLD; else nSubType &= ~FIXEDFLD; break; case FIELD_PROP_BOOL2: nSubType &= ~(DATEFLD|TIMEFLD); nSubType |= *(sal_Bool*)rVal.getValue() ? DATEFLD : TIMEFLD; break; case FIELD_PROP_FORMAT: rVal >>= nTmp; ChangeFormat(nTmp); break; case FIELD_PROP_SUBTYPE: rVal >>= nTmp; nOffset = nTmp; break; case FIELD_PROP_DATE_TIME: { util::DateTime aDateTimeValue; if(!(rVal >>= aDateTimeValue)) return sal_False; DateTime aDateTime; aDateTime.Set100Sec(aDateTimeValue.HundredthSeconds); aDateTime.SetSec(aDateTimeValue.Seconds); aDateTime.SetMin(aDateTimeValue.Minutes); aDateTime.SetHour(aDateTimeValue.Hours); aDateTime.SetDay(aDateTimeValue.Day); aDateTime.SetMonth(aDateTimeValue.Month); aDateTime.SetYear(aDateTimeValue.Year); SetDateTime(aDateTime); } break; default: return SwField::PutValue(rVal, nWhichId); } return sal_True; }