xref: /trunk/main/forms/source/component/Date.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_forms.hxx"
30 #include "Date.hxx"
31 #include <tools/debug.hxx>
32 #include <tools/date.hxx>
33 #include <connectivity/dbconversion.hxx>
34 #include <com/sun/star/sdbc/DataType.hpp>
35 
36 using namespace dbtools;
37 
38 //.........................................................................
39 namespace frm
40 {
41 //.........................................................................
42 
43 using namespace ::com::sun::star;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::sdb;
46 using namespace ::com::sun::star::sdbc;
47 using namespace ::com::sun::star::sdbcx;
48 using namespace ::com::sun::star::beans;
49 using namespace ::com::sun::star::util;
50 using namespace ::com::sun::star::container;
51 using namespace ::com::sun::star::form;
52 using namespace ::com::sun::star::awt;
53 using namespace ::com::sun::star::io;
54 using namespace ::com::sun::star::lang;
55 
56 //------------------------------------------------------------------
57 ODateControl::ODateControl(const Reference<XMultiServiceFactory>& _rxFactory)
58                :OBoundControl(_rxFactory, VCL_CONTROL_DATEFIELD)
59 {
60 }
61 
62 //------------------------------------------------------------------
63 InterfaceRef SAL_CALL ODateControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
64 {
65     return *(new ODateControl(_rxFactory));
66 }
67 
68 //------------------------------------------------------------------------------
69 Sequence<Type> ODateControl::_getTypes()
70 {
71     return OBoundControl::_getTypes();
72 }
73 
74 //------------------------------------------------------------------------------
75 StringSequence SAL_CALL ODateControl::getSupportedServiceNames() throw()
76 {
77     StringSequence aSupported = OBoundControl::getSupportedServiceNames();
78     aSupported.realloc(aSupported.getLength() + 1);
79 
80     ::rtl::OUString*pArray = aSupported.getArray();
81     pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_DATEFIELD;
82     return aSupported;
83 }
84 
85 /*************************************************************************/
86 //------------------------------------------------------------------
87 InterfaceRef SAL_CALL ODateModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
88 {
89     return *(new ODateModel(_rxFactory));
90 }
91 
92 //------------------------------------------------------------------------------
93 Sequence<Type> ODateModel::_getTypes()
94 {
95     return OEditBaseModel::_getTypes();
96 }
97 
98 //------------------------------------------------------------------
99 DBG_NAME( ODateModel )
100 //------------------------------------------------------------------
101 ODateModel::ODateModel(const Reference<XMultiServiceFactory>& _rxFactory)
102             :OEditBaseModel( _rxFactory, VCL_CONTROLMODEL_DATEFIELD, FRM_SUN_CONTROL_DATEFIELD, sal_True, sal_True )
103                         // use the old control name for compytibility reasons
104             ,OLimitedFormats( _rxFactory, FormComponentType::DATEFIELD )
105 {
106     DBG_CTOR( ODateModel, NULL );
107 
108     m_nClassId = FormComponentType::DATEFIELD;
109     initValueProperty( PROPERTY_DATE, PROPERTY_ID_DATE );
110 
111     setAggregateSet(m_xAggregateFastSet, getOriginalHandle(PROPERTY_ID_DATEFORMAT));
112 
113     osl_incrementInterlockedCount( &m_refCount );
114     try
115     {
116         if ( m_xAggregateSet.is() )
117             m_xAggregateSet->setPropertyValue( PROPERTY_DATEMIN, makeAny( (sal_Int32)( ::Date( 1, 1, 1800 ).GetDate() ) ) );
118     }
119     catch( const Exception& )
120     {
121         OSL_ENSURE( sal_False, "ODateModel::ODateModel: caught an exception!" );
122     }
123     osl_decrementInterlockedCount( &m_refCount );
124 }
125 
126 //------------------------------------------------------------------------------
127 ODateModel::ODateModel( const ODateModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory )
128     :OEditBaseModel( _pOriginal, _rxFactory )
129     ,OLimitedFormats( _rxFactory, FormComponentType::DATEFIELD )
130 {
131     DBG_CTOR( ODateModel, NULL );
132 
133     setAggregateSet( m_xAggregateFastSet, getOriginalHandle( PROPERTY_ID_DATEFORMAT ) );
134 }
135 
136 //------------------------------------------------------------------------------
137 ODateModel::~ODateModel( )
138 {
139     setAggregateSet(Reference< XFastPropertySet >(), -1);
140     DBG_DTOR( ODateModel, NULL );
141 }
142 
143 // XCloneable
144 //------------------------------------------------------------------------------
145 IMPLEMENT_DEFAULT_CLONING( ODateModel )
146 
147 // XServiceInfo
148 //------------------------------------------------------------------------------
149 StringSequence SAL_CALL ODateModel::getSupportedServiceNames() throw()
150 {
151     StringSequence aSupported = OBoundControlModel::getSupportedServiceNames();
152 
153     sal_Int32 nOldLen = aSupported.getLength();
154     aSupported.realloc( nOldLen + 8 );
155     ::rtl::OUString* pStoreTo = aSupported.getArray() + nOldLen;
156 
157     *pStoreTo++ = BINDABLE_CONTROL_MODEL;
158     *pStoreTo++ = DATA_AWARE_CONTROL_MODEL;
159     *pStoreTo++ = VALIDATABLE_CONTROL_MODEL;
160 
161     *pStoreTo++ = BINDABLE_DATA_AWARE_CONTROL_MODEL;
162     *pStoreTo++ = VALIDATABLE_BINDABLE_CONTROL_MODEL;
163 
164     *pStoreTo++ = FRM_SUN_COMPONENT_DATEFIELD;
165     *pStoreTo++ = FRM_SUN_COMPONENT_DATABASE_DATEFIELD;
166     *pStoreTo++ = BINDABLE_DATABASE_DATE_FIELD;
167 
168     return aSupported;
169 }
170 
171 //------------------------------------------------------------------------------
172 ::rtl::OUString SAL_CALL ODateModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
173 {
174     return FRM_COMPONENT_DATEFIELD; // old (non-sun) name for compatibility !
175 }
176 
177 // XPropertySet
178 //------------------------------------------------------------------------------
179 void ODateModel::describeFixedProperties( Sequence< Property >& _rProps ) const
180 {
181     BEGIN_DESCRIBE_PROPERTIES( 4, OEditBaseModel )
182         DECL_PROP3(DEFAULT_DATE,            sal_Int32,              BOUND, MAYBEDEFAULT, MAYBEVOID);
183         DECL_PROP1(TABINDEX,                sal_Int16,              BOUND);
184         DECL_PROP1(FORMATKEY,               sal_Int32,              TRANSIENT);
185         DECL_IFACE_PROP2(FORMATSSUPPLIER,   XNumberFormatsSupplier, READONLY, TRANSIENT);
186     END_DESCRIBE_PROPERTIES();
187 }
188 
189 //------------------------------------------------------------------------------
190 void SAL_CALL ODateModel::getFastPropertyValue(Any& _rValue, sal_Int32 _nHandle ) const
191 {
192     switch (_nHandle)
193     {
194         case PROPERTY_ID_FORMATKEY:
195             getFormatKeyPropertyValue(_rValue);
196             break;
197         case PROPERTY_ID_FORMATSSUPPLIER:
198             _rValue <<= getFormatsSupplier();
199             break;
200         default:
201             OEditBaseModel::getFastPropertyValue(_rValue, _nHandle);
202             break;
203     }
204 }
205 
206 //------------------------------------------------------------------------------
207 sal_Bool SAL_CALL ODateModel::convertFastPropertyValue(Any& _rConvertedValue, Any& _rOldValue,
208         sal_Int32 _nHandle, const Any& _rValue ) throw(IllegalArgumentException)
209 {
210     if (PROPERTY_ID_FORMATKEY == _nHandle)
211         return convertFormatKeyPropertyValue(_rConvertedValue, _rOldValue, _rValue);
212     else
213         return OEditBaseModel::convertFastPropertyValue(_rConvertedValue, _rOldValue, _nHandle, _rValue );
214 }
215 
216 //------------------------------------------------------------------------------
217 void SAL_CALL ODateModel::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const Any& _rValue) throw ( ::com::sun::star::uno::Exception)
218 {
219     if (PROPERTY_ID_FORMATKEY == _nHandle)
220         setFormatKeyPropertyValue(_rValue);
221     else
222         OEditBaseModel::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
223 }
224 
225 // XLoadListener
226 //------------------------------------------------------------------------------
227 void ODateModel::onConnectedDbColumn( const Reference< XInterface >& _rxForm )
228 {
229     OBoundControlModel::onConnectedDbColumn( _rxForm );
230     Reference<XPropertySet> xField = getField();
231     if (xField.is())
232     {
233         m_bDateTimeField = sal_False;
234         try
235         {
236             sal_Int32 nFieldType = 0;
237             xField->getPropertyValue(PROPERTY_FIELDTYPE) >>= nFieldType;
238             m_bDateTimeField = (nFieldType == DataType::TIMESTAMP);
239         }
240         catch(Exception&)
241         {
242         }
243     }
244 }
245 
246 //------------------------------------------------------------------------------
247 sal_Bool ODateModel::commitControlValueToDbColumn( bool /*_bPostReset*/ )
248 {
249     Any aControlValue( m_xAggregateFastSet->getFastPropertyValue( getValuePropertyAggHandle() ) );
250     if ( !compare( aControlValue, m_aSaveValue ) )
251     {
252         if ( !aControlValue.hasValue() )
253             m_xColumnUpdate->updateNull();
254         else
255         {
256             try
257             {
258                 util::Date aDate;
259                 if ( !( aControlValue >>= aDate ) )
260                 {
261                     sal_Int32 nAsInt(0);
262                     aControlValue >>= nAsInt;
263                     aDate = DBTypeConversion::toDate(nAsInt);
264                 }
265 
266                 if ( !m_bDateTimeField )
267                     m_xColumnUpdate->updateDate( aDate );
268                 else
269                 {
270                     util::DateTime aDateTime = m_xColumn->getTimestamp();
271                     aDateTime.Day = aDate.Day;
272                     aDateTime.Month = aDate.Month;
273                     aDateTime.Year = aDate.Year;
274                     m_xColumnUpdate->updateTimestamp( aDateTime );
275                 }
276             }
277             catch(Exception&)
278             {
279                 return sal_False;
280             }
281         }
282         m_aSaveValue = aControlValue;
283     }
284     return sal_True;
285 }
286 
287 //------------------------------------------------------------------------------
288 void ODateModel::impl_translateControlValueToUNODate( Any& _rUNOValue ) const
289 {
290     _rUNOValue = getControlValue();
291     if ( _rUNOValue.hasValue() )
292     {
293         sal_Int32 nDate = 0;
294         OSL_VERIFY( _rUNOValue >>= nDate );
295         _rUNOValue <<= DBTypeConversion::toDate( nDate );
296     }
297 }
298 
299 //------------------------------------------------------------------------------
300 Any ODateModel::translateControlValueToExternalValue( ) const
301 {
302     Any aExternalValue;
303     impl_translateControlValueToUNODate( aExternalValue );
304     return aExternalValue;
305 }
306 
307 //------------------------------------------------------------------------------
308 Any ODateModel::translateExternalValueToControlValue( const Any& _rExternalValue ) const
309 {
310     Any aControlValue;
311     if ( _rExternalValue.hasValue() )
312     {
313         util::Date aDate;
314         OSL_VERIFY( _rExternalValue >>= aDate );
315         aControlValue <<= DBTypeConversion::toINT32( aDate );
316     }
317     return aControlValue;
318 }
319 
320 //------------------------------------------------------------------------------
321 Any ODateModel::translateControlValueToValidatableValue( ) const
322 {
323     Any aValidatableValue;
324     impl_translateControlValueToUNODate( aValidatableValue );
325     return aValidatableValue;
326 }
327 
328 //------------------------------------------------------------------------------
329 Any ODateModel::translateDbColumnToControlValue()
330 {
331     util::Date aDate = m_xColumn->getDate();
332     if (m_xColumn->wasNull())
333         m_aSaveValue.clear();
334     else
335         // the aggregated set expects an Int32 as value ...
336         m_aSaveValue <<= DBTypeConversion::toINT32(aDate);
337 
338     return m_aSaveValue;
339 }
340 
341 //------------------------------------------------------------------------------
342 Any ODateModel::getDefaultForReset() const
343 {
344     return m_aDefault;
345 }
346 
347 //------------------------------------------------------------------------------
348 void ODateModel::resetNoBroadcast()
349 {
350     OEditBaseModel::resetNoBroadcast();
351     m_aSaveValue.clear();
352 }
353 
354 //------------------------------------------------------------------------------
355 Sequence< Type > ODateModel::getSupportedBindingTypes()
356 {
357     return Sequence< Type >( &::getCppuType( static_cast< util::Date* >( NULL ) ), 1 );
358 }
359 
360 //.........................................................................
361 }   // namespace frm
362 //.........................................................................
363 
364