1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_forms.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "FormattedField.hxx"
28*b1cdbd2cSJim Jagielski #include "services.hxx"
29*b1cdbd2cSJim Jagielski #include "property.hrc"
30*b1cdbd2cSJim Jagielski #include "property.hxx"
31*b1cdbd2cSJim Jagielski #include "frm_resource.hxx"
32*b1cdbd2cSJim Jagielski #include "frm_resource.hrc"
33*b1cdbd2cSJim Jagielski #include "propertybaghelper.hxx"
34*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
35*b1cdbd2cSJim Jagielski #include <comphelper/numbers.hxx>
36*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
37*b1cdbd2cSJim Jagielski #include <connectivity/dbconversion.hxx>
38*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
39*b1cdbd2cSJim Jagielski #include <svl/numuno.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
41*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
42*b1cdbd2cSJim Jagielski #include <tools/wintypes.hxx>
43*b1cdbd2cSJim Jagielski #include <i18npool/mslangid.hxx>
44*b1cdbd2cSJim Jagielski #include <rtl/textenc.h>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/DataType.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/util/NumberFormat.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/util/Date.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/util/Time.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/MouseEvent.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XSubmit.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XKeyListener.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/form/FormComponentType.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormatTypes.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/form/XForm.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
58*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
59*b1cdbd2cSJim Jagielski 	// needed as long as we use the SolarMutex
60*b1cdbd2cSJim Jagielski #include <comphelper/streamsection.hxx>
61*b1cdbd2cSJim Jagielski #include <cppuhelper/weakref.hxx>
62*b1cdbd2cSJim Jagielski #include <unotools/desktopterminationobserver.hxx>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #include <list>
65*b1cdbd2cSJim Jagielski #include <algorithm>
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski using namespace dbtools;
68*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
69*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb;
70*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
71*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx;
72*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
73*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
74*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form;
75*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt;
76*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
77*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
78*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
79*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::form::binding;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski namespace
82*b1cdbd2cSJim Jagielski {
83*b1cdbd2cSJim Jagielski     typedef com::sun::star::util::Date UNODate;
84*b1cdbd2cSJim Jagielski     typedef com::sun::star::util::Time UNOTime;
85*b1cdbd2cSJim Jagielski     typedef com::sun::star::util::DateTime UNODateTime;
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski //.........................................................................
89*b1cdbd2cSJim Jagielski namespace frm
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski /*************************************************************************/
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski class StandardFormatsSupplier : protected SvNumberFormatsSupplierObj, public ::utl::ITerminationListener
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski protected:
97*b1cdbd2cSJim Jagielski             SvNumberFormatter*                       m_pMyPrivateFormatter;
98*b1cdbd2cSJim Jagielski     static  WeakReference< XNumberFormatsSupplier >  s_xDefaultFormatsSupplier;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski public:
101*b1cdbd2cSJim Jagielski     static Reference< XNumberFormatsSupplier > get( const Reference< XMultiServiceFactory >& _rxORB );
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	using SvNumberFormatsSupplierObj::operator new;
104*b1cdbd2cSJim Jagielski 	using SvNumberFormatsSupplierObj::operator delete;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski protected:
107*b1cdbd2cSJim Jagielski 	StandardFormatsSupplier(const Reference<XMultiServiceFactory>& _rxFactory,LanguageType _eSysLanguage);
108*b1cdbd2cSJim Jagielski 	~StandardFormatsSupplier();
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski protected:
111*b1cdbd2cSJim Jagielski     virtual bool    queryTermination() const;
112*b1cdbd2cSJim Jagielski     virtual void    notifyTermination();
113*b1cdbd2cSJim Jagielski };
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
116*b1cdbd2cSJim Jagielski WeakReference< XNumberFormatsSupplier > StandardFormatsSupplier::s_xDefaultFormatsSupplier;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
StandardFormatsSupplier(const Reference<XMultiServiceFactory> & _rxFactory,LanguageType _eSysLanguage)119*b1cdbd2cSJim Jagielski StandardFormatsSupplier::StandardFormatsSupplier(const Reference< XMultiServiceFactory > & _rxFactory,LanguageType _eSysLanguage)
120*b1cdbd2cSJim Jagielski 	:SvNumberFormatsSupplierObj()
121*b1cdbd2cSJim Jagielski 	,m_pMyPrivateFormatter(new SvNumberFormatter(_rxFactory, _eSysLanguage))
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski 	SetNumberFormatter(m_pMyPrivateFormatter);
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski     // #i29147# - 2004-06-18 - fs@openoffice.org
126*b1cdbd2cSJim Jagielski     ::utl::DesktopTerminationObserver::registerTerminationListener( this );
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
~StandardFormatsSupplier()130*b1cdbd2cSJim Jagielski StandardFormatsSupplier::~StandardFormatsSupplier()
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski     ::utl::DesktopTerminationObserver::revokeTerminationListener( this );
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski     DELETEZ( m_pMyPrivateFormatter );
135*b1cdbd2cSJim Jagielski }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
get(const Reference<XMultiServiceFactory> & _rxORB)138*b1cdbd2cSJim Jagielski Reference< XNumberFormatsSupplier > StandardFormatsSupplier::get( const Reference< XMultiServiceFactory >& _rxORB )
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski     LanguageType eSysLanguage = LANGUAGE_SYSTEM;
141*b1cdbd2cSJim Jagielski     {
142*b1cdbd2cSJim Jagielski         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
143*b1cdbd2cSJim Jagielski         Reference< XNumberFormatsSupplier > xSupplier = s_xDefaultFormatsSupplier;
144*b1cdbd2cSJim Jagielski         if ( xSupplier.is() )
145*b1cdbd2cSJim Jagielski             return xSupplier;
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 	    // get the Office's locale
148*b1cdbd2cSJim Jagielski 	    const Locale& rSysLocale = SvtSysLocale().GetLocaleData().getLocale();
149*b1cdbd2cSJim Jagielski 	    // translate
150*b1cdbd2cSJim Jagielski 	    eSysLanguage = MsLangId::convertLocaleToLanguage( rSysLocale );
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski     StandardFormatsSupplier* pSupplier = new StandardFormatsSupplier( _rxORB, eSysLanguage );
154*b1cdbd2cSJim Jagielski     Reference< XNumberFormatsSupplier > xNewlyCreatedSupplier( pSupplier );
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski     {
157*b1cdbd2cSJim Jagielski         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
158*b1cdbd2cSJim Jagielski         Reference< XNumberFormatsSupplier > xSupplier = s_xDefaultFormatsSupplier;
159*b1cdbd2cSJim Jagielski         if ( xSupplier.is() )
160*b1cdbd2cSJim Jagielski             // somebody used the small time frame where the mutex was not locked to create and set
161*b1cdbd2cSJim Jagielski             // the supplier
162*b1cdbd2cSJim Jagielski             return xSupplier;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski         s_xDefaultFormatsSupplier = xNewlyCreatedSupplier;
165*b1cdbd2cSJim Jagielski     }
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     return xNewlyCreatedSupplier;
168*b1cdbd2cSJim Jagielski }
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
queryTermination() const171*b1cdbd2cSJim Jagielski bool StandardFormatsSupplier::queryTermination() const
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski     return true;
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
notifyTermination()177*b1cdbd2cSJim Jagielski void StandardFormatsSupplier::notifyTermination()
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski     Reference< XNumberFormatsSupplier > xKeepAlive = this;
180*b1cdbd2cSJim Jagielski     // when the application is terminating, release our static reference so that we are cleared/destructed
181*b1cdbd2cSJim Jagielski     // earlier than upon unloading the library
182*b1cdbd2cSJim Jagielski     // #i29147# - 2004-06-18 - fs@openoffice.org
183*b1cdbd2cSJim Jagielski     s_xDefaultFormatsSupplier = WeakReference< XNumberFormatsSupplier >( );
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     SetNumberFormatter( NULL );
186*b1cdbd2cSJim Jagielski     DELETEZ( m_pMyPrivateFormatter );
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski /*************************************************************************/
190*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
OFormattedControl_CreateInstance(const Reference<XMultiServiceFactory> & _rxFactory)191*b1cdbd2cSJim Jagielski InterfaceRef SAL_CALL OFormattedControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski 	return *(new OFormattedControl(_rxFactory));
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
_getTypes()197*b1cdbd2cSJim Jagielski Sequence<Type> OFormattedControl::_getTypes()
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski 	return ::comphelper::concatSequences(
200*b1cdbd2cSJim Jagielski 		OFormattedControl_BASE::getTypes(),
201*b1cdbd2cSJim Jagielski 		OBoundControl::_getTypes()
202*b1cdbd2cSJim Jagielski 	);
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
queryAggregation(const Type & _rType)206*b1cdbd2cSJim Jagielski Any SAL_CALL OFormattedControl::queryAggregation(const Type& _rType) throw (RuntimeException)
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	Any aReturn = OBoundControl::queryAggregation(_rType);
209*b1cdbd2cSJim Jagielski 	if (!aReturn.hasValue())
210*b1cdbd2cSJim Jagielski 		aReturn = OFormattedControl_BASE::queryInterface(_rType);
211*b1cdbd2cSJim Jagielski 	return aReturn;
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski DBG_NAME(OFormattedControl);
216*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
OFormattedControl(const Reference<XMultiServiceFactory> & _rxFactory)217*b1cdbd2cSJim Jagielski OFormattedControl::OFormattedControl(const Reference<XMultiServiceFactory>& _rxFactory)
218*b1cdbd2cSJim Jagielski 			   :OBoundControl(_rxFactory, VCL_CONTROL_FORMATTEDFIELD)
219*b1cdbd2cSJim Jagielski 			   ,m_nKeyEvent(0)
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski 	DBG_CTOR(OFormattedControl,NULL);
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 	increment(m_refCount);
224*b1cdbd2cSJim Jagielski 	{
225*b1cdbd2cSJim Jagielski 		Reference<XWindow>	xComp;
226*b1cdbd2cSJim Jagielski 		if (query_aggregation(m_xAggregate, xComp))
227*b1cdbd2cSJim Jagielski 		{
228*b1cdbd2cSJim Jagielski 			xComp->addKeyListener(this);
229*b1cdbd2cSJim Jagielski 		}
230*b1cdbd2cSJim Jagielski 	}
231*b1cdbd2cSJim Jagielski 	decrement(m_refCount);
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OFormattedControl()235*b1cdbd2cSJim Jagielski OFormattedControl::~OFormattedControl()
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski 	if( m_nKeyEvent )
238*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( m_nKeyEvent );
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 	if (!OComponentHelper::rBHelper.bDisposed)
241*b1cdbd2cSJim Jagielski 	{
242*b1cdbd2cSJim Jagielski 		acquire();
243*b1cdbd2cSJim Jagielski 		dispose();
244*b1cdbd2cSJim Jagielski 	}
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 	DBG_DTOR(OFormattedControl,NULL);
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski // XKeyListener
250*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
disposing(const EventObject & _rSource)251*b1cdbd2cSJim Jagielski void OFormattedControl::disposing(const EventObject& _rSource) throw(RuntimeException)
252*b1cdbd2cSJim Jagielski {
253*b1cdbd2cSJim Jagielski 	OBoundControl::disposing(_rSource);
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
keyPressed(const::com::sun::star::awt::KeyEvent & e)257*b1cdbd2cSJim Jagielski void OFormattedControl::keyPressed(const ::com::sun::star::awt::KeyEvent& e) throw ( ::com::sun::star::uno::RuntimeException)
258*b1cdbd2cSJim Jagielski {
259*b1cdbd2cSJim Jagielski 	if( e.KeyCode != KEY_RETURN || e.Modifiers != 0 )
260*b1cdbd2cSJim Jagielski 		return;
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	// Steht das Control in einem Formular mit einer Submit-URL?
263*b1cdbd2cSJim Jagielski 	Reference<com::sun::star::beans::XPropertySet>	xSet(getModel(), UNO_QUERY);
264*b1cdbd2cSJim Jagielski 	if( !xSet.is() )
265*b1cdbd2cSJim Jagielski 		return;
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 	Reference<XFormComponent>  xFComp(xSet, UNO_QUERY);
268*b1cdbd2cSJim Jagielski 	InterfaceRef  xParent = xFComp->getParent();
269*b1cdbd2cSJim Jagielski 	if( !xParent.is() )
270*b1cdbd2cSJim Jagielski 		return;
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	Reference<com::sun::star::beans::XPropertySet>	xFormSet(xParent, UNO_QUERY);
273*b1cdbd2cSJim Jagielski 	if( !xFormSet.is() )
274*b1cdbd2cSJim Jagielski 		return;
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 	Any aTmp(xFormSet->getPropertyValue( PROPERTY_TARGET_URL ));
277*b1cdbd2cSJim Jagielski 	if (!isA(aTmp, static_cast< ::rtl::OUString* >(NULL)) ||
278*b1cdbd2cSJim Jagielski 		!getString(aTmp).getLength() )
279*b1cdbd2cSJim Jagielski 		return;
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	Reference<XIndexAccess>  xElements(xParent, UNO_QUERY);
282*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = xElements->getCount();
283*b1cdbd2cSJim Jagielski 	if( nCount > 1 )
284*b1cdbd2cSJim Jagielski 	{
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 		Reference<com::sun::star::beans::XPropertySet>	xFCSet;
287*b1cdbd2cSJim Jagielski 		for( sal_Int32 nIndex=0; nIndex < nCount; nIndex++ )
288*b1cdbd2cSJim Jagielski 		{
289*b1cdbd2cSJim Jagielski 			//	Any aElement(xElements->getByIndex(nIndex));
290*b1cdbd2cSJim Jagielski 			xElements->getByIndex(nIndex) >>= xFCSet;
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 			if (hasProperty(PROPERTY_CLASSID, xFCSet) &&
293*b1cdbd2cSJim Jagielski 				getINT16(xFCSet->getPropertyValue(PROPERTY_CLASSID)) == FormComponentType::TEXTFIELD)
294*b1cdbd2cSJim Jagielski 			{
295*b1cdbd2cSJim Jagielski 				// Noch ein weiteres Edit gefunden ==> dann nicht submitten
296*b1cdbd2cSJim Jagielski 				if (xFCSet != xSet)
297*b1cdbd2cSJim Jagielski 					return;
298*b1cdbd2cSJim Jagielski 			}
299*b1cdbd2cSJim Jagielski 		}
300*b1cdbd2cSJim Jagielski 	}
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	// Da wir noch im Haender stehen, submit asynchron ausloesen
303*b1cdbd2cSJim Jagielski 	if( m_nKeyEvent )
304*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( m_nKeyEvent );
305*b1cdbd2cSJim Jagielski 	m_nKeyEvent = Application::PostUserEvent( LINK(this, OFormattedControl,
306*b1cdbd2cSJim Jagielski 											OnKeyPressed) );
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
keyReleased(const::com::sun::star::awt::KeyEvent &)310*b1cdbd2cSJim Jagielski void OFormattedControl::keyReleased(const ::com::sun::star::awt::KeyEvent& /*e*/) throw ( ::com::sun::star::uno::RuntimeException)
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
315*b1cdbd2cSJim Jagielski IMPL_LINK(OFormattedControl, OnKeyPressed, void*, /*EMPTYARG*/)
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski 	m_nKeyEvent = 0;
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	Reference<XFormComponent>  xFComp(getModel(), UNO_QUERY);
320*b1cdbd2cSJim Jagielski 	InterfaceRef  xParent = xFComp->getParent();
321*b1cdbd2cSJim Jagielski 	Reference<XSubmit>	xSubmit(xParent, UNO_QUERY);
322*b1cdbd2cSJim Jagielski 	if (xSubmit.is())
323*b1cdbd2cSJim Jagielski 		xSubmit->submit( Reference<XControl> (), ::com::sun::star::awt::MouseEvent() );
324*b1cdbd2cSJim Jagielski 	return 0L;
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getSupportedServiceNames()328*b1cdbd2cSJim Jagielski StringSequence	OFormattedControl::getSupportedServiceNames() throw()
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski 	StringSequence aSupported = OBoundControl::getSupportedServiceNames();
331*b1cdbd2cSJim Jagielski 	aSupported.realloc(aSupported.getLength() + 1);
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	::rtl::OUString*pArray = aSupported.getArray();
334*b1cdbd2cSJim Jagielski 	pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_FORMATTEDFIELD;
335*b1cdbd2cSJim Jagielski 	return aSupported;
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
setDesignMode(sal_Bool bOn)339*b1cdbd2cSJim Jagielski void OFormattedControl::setDesignMode(sal_Bool bOn) throw ( ::com::sun::star::uno::RuntimeException)
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	OBoundControl::setDesignMode(bOn);
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski /*************************************************************************/
DBG_NAME(OFormattedModel)345*b1cdbd2cSJim Jagielski DBG_NAME(OFormattedModel)
346*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
347*b1cdbd2cSJim Jagielski void OFormattedModel::implConstruct()
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	// members
350*b1cdbd2cSJim Jagielski 	m_bOriginalNumeric = sal_False;
351*b1cdbd2cSJim Jagielski 	m_bNumeric = sal_False;
352*b1cdbd2cSJim Jagielski 	m_xOriginalFormatter = NULL;
353*b1cdbd2cSJim Jagielski 	m_nKeyType = NumberFormat::UNDEFINED;
354*b1cdbd2cSJim Jagielski 	m_aNullDate = DBTypeConversion::getStandardDate();
355*b1cdbd2cSJim Jagielski 	m_nFieldType =  DataType::OTHER;
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	// default our formats supplier
358*b1cdbd2cSJim Jagielski 	increment(m_refCount);
359*b1cdbd2cSJim Jagielski 	setPropertyToDefaultByHandle(PROPERTY_ID_FORMATSSUPPLIER);
360*b1cdbd2cSJim Jagielski 	decrement(m_refCount);
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski     startAggregatePropertyListening( PROPERTY_FORMATKEY );
363*b1cdbd2cSJim Jagielski     startAggregatePropertyListening( PROPERTY_FORMATSSUPPLIER );
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
OFormattedModel(const Reference<XMultiServiceFactory> & _rxFactory)367*b1cdbd2cSJim Jagielski OFormattedModel::OFormattedModel(const Reference<XMultiServiceFactory>& _rxFactory)
368*b1cdbd2cSJim Jagielski 	:OEditBaseModel(_rxFactory, VCL_CONTROLMODEL_FORMATTEDFIELD, FRM_SUN_CONTROL_FORMATTEDFIELD, sal_True, sal_True )
369*b1cdbd2cSJim Jagielski 							// use the old control name for compytibility reasons
370*b1cdbd2cSJim Jagielski 	,OErrorBroadcaster( OComponentHelper::rBHelper )
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski 	DBG_CTOR(OFormattedModel, NULL);
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	implConstruct();
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 	m_nClassId = FormComponentType::TEXTFIELD;
377*b1cdbd2cSJim Jagielski     initValueProperty( PROPERTY_EFFECTIVE_VALUE, PROPERTY_ID_EFFECTIVE_VALUE );
378*b1cdbd2cSJim Jagielski }
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
OFormattedModel(const OFormattedModel * _pOriginal,const Reference<XMultiServiceFactory> & _rxFactory)381*b1cdbd2cSJim Jagielski OFormattedModel::OFormattedModel( const OFormattedModel* _pOriginal, const Reference< XMultiServiceFactory >& _rxFactory )
382*b1cdbd2cSJim Jagielski 	:OEditBaseModel( _pOriginal, _rxFactory )
383*b1cdbd2cSJim Jagielski 	,OErrorBroadcaster( OComponentHelper::rBHelper )
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski 	DBG_CTOR(OFormattedModel, NULL);
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	implConstruct();
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OFormattedModel()391*b1cdbd2cSJim Jagielski OFormattedModel::~OFormattedModel()
392*b1cdbd2cSJim Jagielski {
393*b1cdbd2cSJim Jagielski 	DBG_DTOR(OFormattedModel, NULL);
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski // XCloneable
397*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IMPLEMENT_DEFAULT_CLONING(OFormattedModel)398*b1cdbd2cSJim Jagielski IMPLEMENT_DEFAULT_CLONING( OFormattedModel )
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
401*b1cdbd2cSJim Jagielski void SAL_CALL OFormattedModel::disposing()
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski 	OErrorBroadcaster::disposing();
404*b1cdbd2cSJim Jagielski 	OEditBaseModel::disposing();
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski // XServiceInfo
408*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getSupportedServiceNames()409*b1cdbd2cSJim Jagielski StringSequence OFormattedModel::getSupportedServiceNames() throw()
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski 	StringSequence aSupported = OEditBaseModel::getSupportedServiceNames();
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski     sal_Int32 nOldLen = aSupported.getLength();
414*b1cdbd2cSJim Jagielski 	aSupported.realloc( nOldLen + 8 );
415*b1cdbd2cSJim Jagielski 	::rtl::OUString* pStoreTo = aSupported.getArray() + nOldLen;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski     *pStoreTo++ = BINDABLE_CONTROL_MODEL;
418*b1cdbd2cSJim Jagielski     *pStoreTo++ = DATA_AWARE_CONTROL_MODEL;
419*b1cdbd2cSJim Jagielski     *pStoreTo++ = VALIDATABLE_CONTROL_MODEL;
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski     *pStoreTo++ = BINDABLE_DATA_AWARE_CONTROL_MODEL;
422*b1cdbd2cSJim Jagielski     *pStoreTo++ = VALIDATABLE_BINDABLE_CONTROL_MODEL;
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski     *pStoreTo++ = FRM_SUN_COMPONENT_FORMATTEDFIELD;
425*b1cdbd2cSJim Jagielski     *pStoreTo++ = FRM_SUN_COMPONENT_DATABASE_FORMATTEDFIELD;
426*b1cdbd2cSJim Jagielski     *pStoreTo++ = BINDABLE_DATABASE_FORMATTED_FIELD;
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski     return aSupported;
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski // XAggregation
432*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
queryAggregation(const Type & _rType)433*b1cdbd2cSJim Jagielski Any SAL_CALL OFormattedModel::queryAggregation(const Type& _rType) throw(RuntimeException)
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski 	Any aReturn = OEditBaseModel::queryAggregation( _rType );
436*b1cdbd2cSJim Jagielski 	return aReturn.hasValue() ? aReturn : OErrorBroadcaster::queryInterface( _rType );
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski // XTypeProvider
440*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
_getTypes()441*b1cdbd2cSJim Jagielski Sequence< Type > OFormattedModel::_getTypes()
442*b1cdbd2cSJim Jagielski {
443*b1cdbd2cSJim Jagielski 	return ::comphelper::concatSequences(
444*b1cdbd2cSJim Jagielski 		OEditBaseModel::_getTypes(),
445*b1cdbd2cSJim Jagielski 		OErrorBroadcaster::getTypes()
446*b1cdbd2cSJim Jagielski 	);
447*b1cdbd2cSJim Jagielski }
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski // XPersistObject
450*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getServiceName()451*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL OFormattedModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski 	return ::rtl::OUString(FRM_COMPONENT_EDIT);
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski // XPropertySet
457*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
describeFixedProperties(Sequence<Property> & _rProps) const458*b1cdbd2cSJim Jagielski void OFormattedModel::describeFixedProperties( Sequence< Property >& _rProps ) const
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski 	BEGIN_DESCRIBE_PROPERTIES( 3, OEditBaseModel )
461*b1cdbd2cSJim Jagielski 		DECL_BOOL_PROP1(EMPTY_IS_NULL,							BOUND);
462*b1cdbd2cSJim Jagielski 		DECL_PROP1(TABINDEX,			sal_Int16,				BOUND);
463*b1cdbd2cSJim Jagielski 		DECL_BOOL_PROP2(FILTERPROPOSAL, 						BOUND, MAYBEDEFAULT);
464*b1cdbd2cSJim Jagielski 	END_DESCRIBE_PROPERTIES();
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
describeAggregateProperties(Sequence<Property> & _rAggregateProps) const468*b1cdbd2cSJim Jagielski void OFormattedModel::describeAggregateProperties( Sequence< Property >& _rAggregateProps ) const
469*b1cdbd2cSJim Jagielski {
470*b1cdbd2cSJim Jagielski     OEditBaseModel::describeAggregateProperties( _rAggregateProps );
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	// TreatAsNumeric nicht transient : wir wollen es an der UI anbinden (ist noetig, um dem EffectiveDefault
473*b1cdbd2cSJim Jagielski 	// - der kann Text oder Zahl sein - einen Sinn zu geben)
474*b1cdbd2cSJim Jagielski 	ModifyPropertyAttributes(_rAggregateProps, PROPERTY_TREATASNUMERIC, 0, PropertyAttribute::TRANSIENT);
475*b1cdbd2cSJim Jagielski 	// same for FormatKey
476*b1cdbd2cSJim Jagielski 	// (though the paragraph above for the TreatAsNumeric does not hold anymore - we do not have an UI for this.
477*b1cdbd2cSJim Jagielski 	// But we have for the format key ...)
478*b1cdbd2cSJim Jagielski 	// 25.06.2001 - 87862 - frank.schoenheit@sun.com
479*b1cdbd2cSJim Jagielski 	ModifyPropertyAttributes(_rAggregateProps, PROPERTY_FORMATKEY, 0, PropertyAttribute::TRANSIENT);
480*b1cdbd2cSJim Jagielski 
481*b1cdbd2cSJim Jagielski 	RemoveProperty(_rAggregateProps, PROPERTY_STRICTFORMAT);
482*b1cdbd2cSJim Jagielski 		// no strict format property for formatted fields: it does not make sense, 'cause
483*b1cdbd2cSJim Jagielski 		// there is no general way to decide which characters/sub strings are allowed during the input of an
484*b1cdbd2cSJim Jagielski 		// arbitraryly formatted control
485*b1cdbd2cSJim Jagielski 		// 81441 - 12/07/00 - FS
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getFastPropertyValue(Any & rValue,sal_Int32 nHandle) const489*b1cdbd2cSJim Jagielski void OFormattedModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski 	OEditBaseModel::getFastPropertyValue(rValue, nHandle);
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)495*b1cdbd2cSJim Jagielski void OFormattedModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue) throw ( ::com::sun::star::uno::Exception)
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski 	OEditBaseModel::setFastPropertyValue_NoBroadcast(nHandle, rValue);
498*b1cdbd2cSJim Jagielski }
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)501*b1cdbd2cSJim Jagielski sal_Bool OFormattedModel::convertFastPropertyValue(Any& rConvertedValue, Any& rOldValue, sal_Int32 nHandle, const Any& rValue)
502*b1cdbd2cSJim Jagielski 														throw( IllegalArgumentException )
503*b1cdbd2cSJim Jagielski {
504*b1cdbd2cSJim Jagielski 	return OEditBaseModel::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue);
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
setPropertyToDefaultByHandle(sal_Int32 nHandle)508*b1cdbd2cSJim Jagielski void OFormattedModel::setPropertyToDefaultByHandle(sal_Int32 nHandle)
509*b1cdbd2cSJim Jagielski {
510*b1cdbd2cSJim Jagielski 	if (nHandle == PROPERTY_ID_FORMATSSUPPLIER)
511*b1cdbd2cSJim Jagielski 	{
512*b1cdbd2cSJim Jagielski 		Reference<XNumberFormatsSupplier>  xSupplier = calcDefaultFormatsSupplier();
513*b1cdbd2cSJim Jagielski 		DBG_ASSERT(m_xAggregateSet.is(), "OFormattedModel::setPropertyToDefaultByHandle(FORMATSSUPPLIER) : have no aggregate !");
514*b1cdbd2cSJim Jagielski 		if (m_xAggregateSet.is())
515*b1cdbd2cSJim Jagielski 			m_xAggregateSet->setPropertyValue(PROPERTY_FORMATSSUPPLIER, makeAny(xSupplier));
516*b1cdbd2cSJim Jagielski 	}
517*b1cdbd2cSJim Jagielski 	else
518*b1cdbd2cSJim Jagielski 		OEditBaseModel::setPropertyToDefaultByHandle(nHandle);
519*b1cdbd2cSJim Jagielski }
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
setPropertyToDefault(const::rtl::OUString & aPropertyName)522*b1cdbd2cSJim Jagielski void OFormattedModel::setPropertyToDefault(const ::rtl::OUString& aPropertyName) throw( com::sun::star::beans::UnknownPropertyException, RuntimeException )
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski 	OPropertyArrayAggregationHelper& rPH = m_aPropertyBagHelper.getInfoHelper();
525*b1cdbd2cSJim Jagielski 	sal_Int32 nHandle = rPH.getHandleByName( aPropertyName );
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 	if (nHandle == PROPERTY_ID_FORMATSSUPPLIER)
528*b1cdbd2cSJim Jagielski 		setPropertyToDefaultByHandle(PROPERTY_ID_FORMATSSUPPLIER);
529*b1cdbd2cSJim Jagielski 	else
530*b1cdbd2cSJim Jagielski 		OEditBaseModel::setPropertyToDefault(aPropertyName);
531*b1cdbd2cSJim Jagielski }
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getPropertyDefaultByHandle(sal_Int32 nHandle) const534*b1cdbd2cSJim Jagielski Any OFormattedModel::getPropertyDefaultByHandle( sal_Int32 nHandle ) const
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski 	if (nHandle == PROPERTY_ID_FORMATSSUPPLIER)
537*b1cdbd2cSJim Jagielski 	{
538*b1cdbd2cSJim Jagielski 		Reference<XNumberFormatsSupplier>  xSupplier = calcDefaultFormatsSupplier();
539*b1cdbd2cSJim Jagielski 		return makeAny(xSupplier);
540*b1cdbd2cSJim Jagielski 	}
541*b1cdbd2cSJim Jagielski 	else
542*b1cdbd2cSJim Jagielski 		return OEditBaseModel::getPropertyDefaultByHandle(nHandle);
543*b1cdbd2cSJim Jagielski }
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getPropertyDefault(const::rtl::OUString & aPropertyName)546*b1cdbd2cSJim Jagielski Any SAL_CALL OFormattedModel::getPropertyDefault( const ::rtl::OUString& aPropertyName ) throw( com::sun::star::beans::UnknownPropertyException, RuntimeException )
547*b1cdbd2cSJim Jagielski {
548*b1cdbd2cSJim Jagielski 	OPropertyArrayAggregationHelper& rPH = m_aPropertyBagHelper.getInfoHelper();
549*b1cdbd2cSJim Jagielski 	sal_Int32 nHandle = rPH.getHandleByName( aPropertyName );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski 	if (nHandle == PROPERTY_ID_FORMATSSUPPLIER)
552*b1cdbd2cSJim Jagielski 		return getPropertyDefaultByHandle(PROPERTY_ID_FORMATSSUPPLIER);
553*b1cdbd2cSJim Jagielski 	else
554*b1cdbd2cSJim Jagielski 		return OEditBaseModel::getPropertyDefault(aPropertyName);
555*b1cdbd2cSJim Jagielski }
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
_propertyChanged(const com::sun::star::beans::PropertyChangeEvent & evt)558*b1cdbd2cSJim Jagielski void OFormattedModel::_propertyChanged( const com::sun::star::beans::PropertyChangeEvent& evt ) throw(RuntimeException)
559*b1cdbd2cSJim Jagielski {
560*b1cdbd2cSJim Jagielski     // TODO: check how this works with external bindings
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski     OSL_ENSURE( evt.Source == m_xAggregateSet, "OFormattedModel::_propertyChanged: where did this come from?" );
563*b1cdbd2cSJim Jagielski 	if ( evt.Source == m_xAggregateSet )
564*b1cdbd2cSJim Jagielski 	{
565*b1cdbd2cSJim Jagielski         Reference< XPropertySet > xSourceSet( evt.Source, UNO_QUERY );
566*b1cdbd2cSJim Jagielski 		if ( evt.PropertyName.equals( PROPERTY_FORMATKEY ) )
567*b1cdbd2cSJim Jagielski 		{
568*b1cdbd2cSJim Jagielski 			if ( evt.NewValue.getValueType().getTypeClass() == TypeClass_LONG )
569*b1cdbd2cSJim Jagielski 			{
570*b1cdbd2cSJim Jagielski 				try
571*b1cdbd2cSJim Jagielski 				{
572*b1cdbd2cSJim Jagielski                     ::osl::MutexGuard aGuard( m_aMutex );
573*b1cdbd2cSJim Jagielski 
574*b1cdbd2cSJim Jagielski 					Reference<XNumberFormatsSupplier> xSupplier( calcFormatsSupplier() );
575*b1cdbd2cSJim Jagielski 					m_nKeyType	= getNumberFormatType(xSupplier->getNumberFormats(), getINT32( evt.NewValue ) );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski                     // as m_aSaveValue (which is used by commitControlValueToDbColumn) is format dependent we have
578*b1cdbd2cSJim Jagielski 					// to recalc it, which is done by translateDbColumnToControlValue
579*b1cdbd2cSJim Jagielski 					if ( m_xColumn.is() && m_xAggregateFastSet.is()  && !m_xCursor->isBeforeFirst() && !m_xCursor->isAfterLast())
580*b1cdbd2cSJim Jagielski 					{
581*b1cdbd2cSJim Jagielski 						setControlValue( translateDbColumnToControlValue(), eOther );
582*b1cdbd2cSJim Jagielski 					}
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski                     // if we're connected to an external value binding, then re-calculate the type
585*b1cdbd2cSJim Jagielski                     // used to exchange the value - it depends on the format, too
586*b1cdbd2cSJim Jagielski                     if ( hasExternalValueBinding() )
587*b1cdbd2cSJim Jagielski                     {
588*b1cdbd2cSJim Jagielski                         calculateExternalValueType();
589*b1cdbd2cSJim Jagielski                     }
590*b1cdbd2cSJim Jagielski 				}
591*b1cdbd2cSJim Jagielski 				catch(Exception&)
592*b1cdbd2cSJim Jagielski 				{
593*b1cdbd2cSJim Jagielski 				}
594*b1cdbd2cSJim Jagielski 			}
595*b1cdbd2cSJim Jagielski             return;
596*b1cdbd2cSJim Jagielski 		}
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski         if ( evt.PropertyName.equals( PROPERTY_FORMATSSUPPLIER ) )
599*b1cdbd2cSJim Jagielski 		{
600*b1cdbd2cSJim Jagielski             updateFormatterNullDate();
601*b1cdbd2cSJim Jagielski             return;
602*b1cdbd2cSJim Jagielski         }
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski         OBoundControlModel::_propertyChanged( evt );
605*b1cdbd2cSJim Jagielski 	}
606*b1cdbd2cSJim Jagielski }
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
updateFormatterNullDate()609*b1cdbd2cSJim Jagielski void OFormattedModel::updateFormatterNullDate()
610*b1cdbd2cSJim Jagielski {
611*b1cdbd2cSJim Jagielski     // calc the current NULL date
612*b1cdbd2cSJim Jagielski     Reference< XNumberFormatsSupplier > xSupplier( calcFormatsSupplier() );
613*b1cdbd2cSJim Jagielski     if ( xSupplier.is() )
614*b1cdbd2cSJim Jagielski         xSupplier->getNumberFormatSettings()->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NullDate" ) ) ) >>= m_aNullDate;
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
calcFormatsSupplier() const618*b1cdbd2cSJim Jagielski Reference< XNumberFormatsSupplier > OFormattedModel::calcFormatsSupplier() const
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski 	Reference<XNumberFormatsSupplier>  xSupplier;
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_xAggregateSet.is(), "OFormattedModel::calcFormatsSupplier : have no aggregate !");
623*b1cdbd2cSJim Jagielski 	// hat mein aggregiertes Model einen FormatSupplier ?
624*b1cdbd2cSJim Jagielski 	if( m_xAggregateSet.is() )
625*b1cdbd2cSJim Jagielski 		m_xAggregateSet->getPropertyValue(PROPERTY_FORMATSSUPPLIER) >>= xSupplier;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski     if (!xSupplier.is())
628*b1cdbd2cSJim Jagielski 		// check if my parent form has a supplier
629*b1cdbd2cSJim Jagielski 		xSupplier = calcFormFormatsSupplier();
630*b1cdbd2cSJim Jagielski 
631*b1cdbd2cSJim Jagielski 	if (!xSupplier.is())
632*b1cdbd2cSJim Jagielski 		xSupplier = calcDefaultFormatsSupplier();
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 	DBG_ASSERT(xSupplier.is(), "OFormattedModel::calcFormatsSupplier : no supplier !");
635*b1cdbd2cSJim Jagielski 		// jetzt sollte aber einer da sein
636*b1cdbd2cSJim Jagielski 	return xSupplier;
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
calcFormFormatsSupplier() const640*b1cdbd2cSJim Jagielski Reference<XNumberFormatsSupplier>  OFormattedModel::calcFormFormatsSupplier() const
641*b1cdbd2cSJim Jagielski {
642*b1cdbd2cSJim Jagielski 	Reference<XChild>  xMe;
643*b1cdbd2cSJim Jagielski 	query_interface(static_cast<XWeak*>(const_cast<OFormattedModel*>(this)), xMe);
644*b1cdbd2cSJim Jagielski 	// damit stellen wir sicher, dass wir auch fuer den Fall der Aggregation das richtige
645*b1cdbd2cSJim Jagielski 	// Objekt bekommen
646*b1cdbd2cSJim Jagielski 	DBG_ASSERT(xMe.is(), "OFormattedModel::calcFormFormatsSupplier : I should have a content interface !");
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski 	// jetzt durchhangeln nach oben, bis wir auf eine starform treffen (angefangen mit meinem eigenen Parent)
649*b1cdbd2cSJim Jagielski 	Reference<XChild>  xParent(xMe->getParent(), UNO_QUERY);
650*b1cdbd2cSJim Jagielski 	Reference<XForm>  xNextParentForm(xParent, UNO_QUERY);
651*b1cdbd2cSJim Jagielski 	while (!xNextParentForm.is() && xParent.is())
652*b1cdbd2cSJim Jagielski 	{
653*b1cdbd2cSJim Jagielski 		xParent 		= xParent.query( xParent->getParent() );
654*b1cdbd2cSJim Jagielski 		xNextParentForm = xNextParentForm.query( xParent );
655*b1cdbd2cSJim Jagielski 	}
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 	if (!xNextParentForm.is())
658*b1cdbd2cSJim Jagielski 	{
659*b1cdbd2cSJim Jagielski 		DBG_ERROR("OFormattedModel::calcFormFormatsSupplier : have no ancestor which is a form !");
660*b1cdbd2cSJim Jagielski 		return NULL;
661*b1cdbd2cSJim Jagielski 	}
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	// den FormatSupplier von meinem Vorfahren (falls der einen hat)
664*b1cdbd2cSJim Jagielski 	Reference< XRowSet > xRowSet( xNextParentForm, UNO_QUERY );
665*b1cdbd2cSJim Jagielski 	Reference< XNumberFormatsSupplier > xSupplier;
666*b1cdbd2cSJim Jagielski 	if (xRowSet.is())
667*b1cdbd2cSJim Jagielski 		xSupplier = getNumberFormats( getConnection(xRowSet), sal_True, getContext().getLegacyServiceFactory() );
668*b1cdbd2cSJim Jagielski 	return xSupplier;
669*b1cdbd2cSJim Jagielski }
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
calcDefaultFormatsSupplier() const672*b1cdbd2cSJim Jagielski Reference< XNumberFormatsSupplier > OFormattedModel::calcDefaultFormatsSupplier() const
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski     return StandardFormatsSupplier::get( getContext().getLegacyServiceFactory() );
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski // XBoundComponent
678*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
loaded(const EventObject & rEvent)679*b1cdbd2cSJim Jagielski void OFormattedModel::loaded(const EventObject& rEvent) throw ( ::com::sun::star::uno::RuntimeException)
680*b1cdbd2cSJim Jagielski {
681*b1cdbd2cSJim Jagielski 	// HACK : our onConnectedDbColumn accesses our NumberFormatter which locks the solar mutex (as it doesn't have
682*b1cdbd2cSJim Jagielski 	// an own one). To prevent deadlocks with other threads which may request a property from us in an
683*b1cdbd2cSJim Jagielski 	// UI-triggered action (e.g. an tooltip) we lock the solar mutex _here_ before our base class locks
684*b1cdbd2cSJim Jagielski 	// it's own muext (which is used for property requests)
685*b1cdbd2cSJim Jagielski 	// alternative a): we use two mutexes, one which is passed to the OPropertysetHelper and used for
686*b1cdbd2cSJim Jagielski 	// property requests and one for our own code. This would need a lot of code rewriting
687*b1cdbd2cSJim Jagielski 	// alternative b): The NumberFormatter has to be really threadsafe (with an own mutex), which is
688*b1cdbd2cSJim Jagielski 	// the only "clean" solution for me.
689*b1cdbd2cSJim Jagielski 	// FS - 69603 - 02.11.99
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski 	::vos::OGuard aGuard(Application::GetSolarMutex());
692*b1cdbd2cSJim Jagielski 	OEditBaseModel::loaded(rEvent);
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
onConnectedDbColumn(const Reference<XInterface> & _rxForm)696*b1cdbd2cSJim Jagielski void OFormattedModel::onConnectedDbColumn( const Reference< XInterface >& _rxForm )
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski 	m_xOriginalFormatter = NULL;
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 	// get some properties of the field
701*b1cdbd2cSJim Jagielski 	m_nFieldType = DataType::OTHER;
702*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xField = getField();
703*b1cdbd2cSJim Jagielski 	if ( xField.is() )
704*b1cdbd2cSJim Jagielski 		xField->getPropertyValue( PROPERTY_FIELDTYPE ) >>= m_nFieldType;
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski     sal_Int32 nFormatKey = 0;
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_xAggregateSet.is(), "OFormattedModel::onConnectedDbColumn : have no aggregate !");
709*b1cdbd2cSJim Jagielski 	if (m_xAggregateSet.is())
710*b1cdbd2cSJim Jagielski 	{	// all the following doesn't make any sense if we have no aggregate ...
711*b1cdbd2cSJim Jagielski 		Any aSupplier = m_xAggregateSet->getPropertyValue(PROPERTY_FORMATSSUPPLIER);
712*b1cdbd2cSJim Jagielski 		DBG_ASSERT( aSupplier.hasValue(), "OFormattedModel::onConnectedDbColumn : invalid property value !" );
713*b1cdbd2cSJim Jagielski 		// das sollte im Constructor oder im read auf was richtiges gesetzt worden sein
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski 		Any aFmtKey = m_xAggregateSet->getPropertyValue(PROPERTY_FORMATKEY);
716*b1cdbd2cSJim Jagielski         if ( !(aFmtKey >>= nFormatKey ) )
717*b1cdbd2cSJim Jagielski 		{	// nobody gave us a format to use. So we examine the field we're bound to for a
718*b1cdbd2cSJim Jagielski             // format key, and use it ourself, too
719*b1cdbd2cSJim Jagielski 			sal_Int32 nType = DataType::VARCHAR;
720*b1cdbd2cSJim Jagielski 			if (xField.is())
721*b1cdbd2cSJim Jagielski 			{
722*b1cdbd2cSJim Jagielski 				aFmtKey = xField->getPropertyValue(PROPERTY_FORMATKEY);
723*b1cdbd2cSJim Jagielski 				xField->getPropertyValue(PROPERTY_FIELDTYPE) >>= nType ;
724*b1cdbd2cSJim Jagielski 			}
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski 			Reference<XNumberFormatsSupplier>  xSupplier = calcFormFormatsSupplier();
727*b1cdbd2cSJim Jagielski 			DBG_ASSERT(xSupplier.is(), "OFormattedModel::onConnectedDbColumn : bound to a field but no parent with a formatter ? how this ?");
728*b1cdbd2cSJim Jagielski 			if (xSupplier.is())
729*b1cdbd2cSJim Jagielski 			{
730*b1cdbd2cSJim Jagielski 				m_bOriginalNumeric = getBOOL(getPropertyValue(PROPERTY_TREATASNUMERIC));
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski 				if (!aFmtKey.hasValue())
733*b1cdbd2cSJim Jagielski 				{	// we aren't bound to a field (or this field's format is invalid)
734*b1cdbd2cSJim Jagielski 					// -> determine the standard text (or numeric) format of the supplier
735*b1cdbd2cSJim Jagielski 					Reference<XNumberFormatTypes>  xTypes(xSupplier->getNumberFormats(), UNO_QUERY);
736*b1cdbd2cSJim Jagielski 					if (xTypes.is())
737*b1cdbd2cSJim Jagielski 					{
738*b1cdbd2cSJim Jagielski 						Locale aApplicationLocale = Application::GetSettings().GetUILocale();
739*b1cdbd2cSJim Jagielski 
740*b1cdbd2cSJim Jagielski 						if (m_bOriginalNumeric)
741*b1cdbd2cSJim Jagielski 							aFmtKey <<= (sal_Int32)xTypes->getStandardFormat(NumberFormat::NUMBER, aApplicationLocale);
742*b1cdbd2cSJim Jagielski 						else
743*b1cdbd2cSJim Jagielski 							aFmtKey <<= (sal_Int32)xTypes->getStandardFormat(NumberFormat::TEXT, aApplicationLocale);
744*b1cdbd2cSJim Jagielski 					}
745*b1cdbd2cSJim Jagielski 				}
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 				aSupplier >>= m_xOriginalFormatter;
748*b1cdbd2cSJim Jagielski 				m_xAggregateSet->setPropertyValue(PROPERTY_FORMATSSUPPLIER, makeAny(xSupplier));
749*b1cdbd2cSJim Jagielski 				m_xAggregateSet->setPropertyValue(PROPERTY_FORMATKEY, aFmtKey);
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski 				// das Numeric-Flag an mein gebundenes Feld anpassen
752*b1cdbd2cSJim Jagielski 				if (xField.is())
753*b1cdbd2cSJim Jagielski 				{
754*b1cdbd2cSJim Jagielski 					m_bNumeric = sal_False;
755*b1cdbd2cSJim Jagielski 					switch (nType)
756*b1cdbd2cSJim Jagielski 					{
757*b1cdbd2cSJim Jagielski 						case DataType::BIT:
758*b1cdbd2cSJim Jagielski 						case DataType::BOOLEAN:
759*b1cdbd2cSJim Jagielski 						case DataType::TINYINT:
760*b1cdbd2cSJim Jagielski 						case DataType::SMALLINT:
761*b1cdbd2cSJim Jagielski 						case DataType::INTEGER:
762*b1cdbd2cSJim Jagielski 						case DataType::BIGINT:
763*b1cdbd2cSJim Jagielski 						case DataType::FLOAT:
764*b1cdbd2cSJim Jagielski 						case DataType::REAL:
765*b1cdbd2cSJim Jagielski 						case DataType::DOUBLE:
766*b1cdbd2cSJim Jagielski 						case DataType::NUMERIC:
767*b1cdbd2cSJim Jagielski 						case DataType::DECIMAL:
768*b1cdbd2cSJim Jagielski 						case DataType::DATE:
769*b1cdbd2cSJim Jagielski 						case DataType::TIME:
770*b1cdbd2cSJim Jagielski 						case DataType::TIMESTAMP:
771*b1cdbd2cSJim Jagielski 							m_bNumeric = sal_True;
772*b1cdbd2cSJim Jagielski 							break;
773*b1cdbd2cSJim Jagielski 					}
774*b1cdbd2cSJim Jagielski 				}
775*b1cdbd2cSJim Jagielski 				else
776*b1cdbd2cSJim Jagielski 					m_bNumeric = m_bOriginalNumeric;
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 				setPropertyValue(PROPERTY_TREATASNUMERIC, makeAny((sal_Bool)m_bNumeric));
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski                 OSL_VERIFY( aFmtKey >>= nFormatKey );
781*b1cdbd2cSJim Jagielski 			}
782*b1cdbd2cSJim Jagielski 		}
783*b1cdbd2cSJim Jagielski 	}
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski 	Reference<XNumberFormatsSupplier>  xSupplier = calcFormatsSupplier();
786*b1cdbd2cSJim Jagielski 	m_bNumeric = getBOOL( getPropertyValue( PROPERTY_TREATASNUMERIC ) );
787*b1cdbd2cSJim Jagielski 	m_nKeyType	= getNumberFormatType( xSupplier->getNumberFormats(), nFormatKey );
788*b1cdbd2cSJim Jagielski 	xSupplier->getNumberFormatSettings()->getPropertyValue( ::rtl::OUString::createFromAscii("NullDate") ) >>= m_aNullDate;
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski 	OEditBaseModel::onConnectedDbColumn( _rxForm );
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
onDisconnectedDbColumn()794*b1cdbd2cSJim Jagielski void OFormattedModel::onDisconnectedDbColumn()
795*b1cdbd2cSJim Jagielski {
796*b1cdbd2cSJim Jagielski 	OEditBaseModel::onDisconnectedDbColumn();
797*b1cdbd2cSJim Jagielski 	if (m_xOriginalFormatter.is())
798*b1cdbd2cSJim Jagielski 	{	// unser aggregiertes Model hatte keinerlei Format-Informationen
799*b1cdbd2cSJim Jagielski 		m_xAggregateSet->setPropertyValue(PROPERTY_FORMATSSUPPLIER, makeAny(m_xOriginalFormatter));
800*b1cdbd2cSJim Jagielski 		m_xAggregateSet->setPropertyValue(PROPERTY_FORMATKEY, Any());
801*b1cdbd2cSJim Jagielski 		setPropertyValue(PROPERTY_TREATASNUMERIC, makeAny((sal_Bool)m_bOriginalNumeric));
802*b1cdbd2cSJim Jagielski 		m_xOriginalFormatter = NULL;
803*b1cdbd2cSJim Jagielski 	}
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski 	m_nFieldType = DataType::OTHER;
806*b1cdbd2cSJim Jagielski 	m_nKeyType	 = NumberFormat::UNDEFINED;
807*b1cdbd2cSJim Jagielski 	m_aNullDate  = DBTypeConversion::getStandardDate();
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
write(const Reference<XObjectOutputStream> & _rxOutStream)811*b1cdbd2cSJim Jagielski void OFormattedModel::write(const Reference<XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
812*b1cdbd2cSJim Jagielski {
813*b1cdbd2cSJim Jagielski 	OEditBaseModel::write(_rxOutStream);
814*b1cdbd2cSJim Jagielski 	_rxOutStream->writeShort(0x0003);
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 	DBG_ASSERT(m_xAggregateSet.is(), "OFormattedModel::write : have no aggregate !");
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	// mein Format (evtl. void) in ein persistentes Format bringen (der Supplier zusammen mit dem Key ist es zwar auch,
819*b1cdbd2cSJim Jagielski 	// aber deswegen muessen wir ja nicht gleich den ganzen Supplier speichern, das waere ein klein wenig Overhead ;)
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski 		Reference<XNumberFormatsSupplier>  xSupplier;
822*b1cdbd2cSJim Jagielski 		Any aFmtKey;
823*b1cdbd2cSJim Jagielski 	sal_Bool bVoidKey = sal_True;
824*b1cdbd2cSJim Jagielski 	if (m_xAggregateSet.is())
825*b1cdbd2cSJim Jagielski 	{
826*b1cdbd2cSJim Jagielski 		Any aSupplier = m_xAggregateSet->getPropertyValue(PROPERTY_FORMATSSUPPLIER);
827*b1cdbd2cSJim Jagielski         if (aSupplier.getValueType().getTypeClass() != TypeClass_VOID)
828*b1cdbd2cSJim Jagielski 		{
829*b1cdbd2cSJim Jagielski             OSL_VERIFY( aSupplier >>= xSupplier );
830*b1cdbd2cSJim Jagielski 		}
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski 		aFmtKey = m_xAggregateSet->getPropertyValue(PROPERTY_FORMATKEY);
833*b1cdbd2cSJim Jagielski 		bVoidKey = (!xSupplier.is() || !aFmtKey.hasValue()) || (isLoaded() && m_xOriginalFormatter.is());
834*b1cdbd2cSJim Jagielski 			// (kein Fomatter und/oder Key) oder (loaded und faked Formatter)
835*b1cdbd2cSJim Jagielski 	}
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	_rxOutStream->writeBoolean(!bVoidKey);
838*b1cdbd2cSJim Jagielski 	if (!bVoidKey)
839*b1cdbd2cSJim Jagielski 	{
840*b1cdbd2cSJim Jagielski 		// aus dem FormatKey und dem Formatter persistente Angaben basteln
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski 		Any aKey = m_xAggregateSet->getPropertyValue(PROPERTY_FORMATKEY);
843*b1cdbd2cSJim Jagielski 		sal_Int32 nKey = aKey.hasValue() ? getINT32(aKey) : 0;
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski 		Reference<XNumberFormats>  xFormats = xSupplier->getNumberFormats();
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 		::rtl::OUString 		sFormatDescription;
848*b1cdbd2cSJim Jagielski 		LanguageType	eFormatLanguage = LANGUAGE_DONTKNOW;
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski 		static const ::rtl::OUString s_aLocaleProp = ::rtl::OUString::createFromAscii("Locale");
851*b1cdbd2cSJim Jagielski 		Reference<com::sun::star::beans::XPropertySet>	xFormat = xFormats->getByKey(nKey);
852*b1cdbd2cSJim Jagielski 		if (hasProperty(s_aLocaleProp, xFormat))
853*b1cdbd2cSJim Jagielski 		{
854*b1cdbd2cSJim Jagielski 			Any aLocale = xFormat->getPropertyValue(s_aLocaleProp);
855*b1cdbd2cSJim Jagielski 			DBG_ASSERT(isA(aLocale, static_cast<Locale*>(NULL)), "OFormattedModel::write : invalid language property !");
856*b1cdbd2cSJim Jagielski 			if (isA(aLocale, static_cast<Locale*>(NULL)))
857*b1cdbd2cSJim Jagielski 			{
858*b1cdbd2cSJim Jagielski 				Locale* pLocale = (Locale*)aLocale.getValue();
859*b1cdbd2cSJim Jagielski 				eFormatLanguage = MsLangId::convertLocaleToLanguage( *pLocale );
860*b1cdbd2cSJim Jagielski 			}
861*b1cdbd2cSJim Jagielski 		}
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski 		static const ::rtl::OUString s_aFormatStringProp = ::rtl::OUString::createFromAscii("FormatString");
864*b1cdbd2cSJim Jagielski 		if (hasProperty(s_aFormatStringProp, xFormat))
865*b1cdbd2cSJim Jagielski 			xFormat->getPropertyValue(s_aFormatStringProp) >>= sFormatDescription;
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 		_rxOutStream->writeUTF(sFormatDescription);
868*b1cdbd2cSJim Jagielski 		_rxOutStream->writeLong((sal_Int32)eFormatLanguage);
869*b1cdbd2cSJim Jagielski 	}
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 	// version 2 : write the properties common to all OEditBaseModels
872*b1cdbd2cSJim Jagielski 	writeCommonEditProperties(_rxOutStream);
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski 	// version 3 : write the effective value property of the aggregate
875*b1cdbd2cSJim Jagielski 	// Due to a bug within the UnoControlFormattedFieldModel implementation (our default aggregate) this props value isn't correctly read
876*b1cdbd2cSJim Jagielski 	// and this can't be corrected without being incompatible.
877*b1cdbd2cSJim Jagielski 	// so we have our own handling.
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 	// and to be a little bit more compatible we make the following section skippable
880*b1cdbd2cSJim Jagielski 	{
881*b1cdbd2cSJim Jagielski 		Reference< XDataOutputStream > xOut(_rxOutStream, UNO_QUERY);
882*b1cdbd2cSJim Jagielski 		OStreamSection aDownCompat(xOut);
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 		// a sub version within the skippable block
885*b1cdbd2cSJim Jagielski 		_rxOutStream->writeShort(0x0000);
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 		// version 0: the effective value of the aggregate
888*b1cdbd2cSJim Jagielski 				Any aEffectiveValue;
889*b1cdbd2cSJim Jagielski 		if (m_xAggregateSet.is())
890*b1cdbd2cSJim Jagielski 		{
891*b1cdbd2cSJim Jagielski 			try { aEffectiveValue = m_xAggregateSet->getPropertyValue(PROPERTY_EFFECTIVE_VALUE); } catch(Exception&) { }
892*b1cdbd2cSJim Jagielski 		}
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski 		{
895*b1cdbd2cSJim Jagielski 			OStreamSection aDownCompat2(xOut);
896*b1cdbd2cSJim Jagielski 			switch (aEffectiveValue.getValueType().getTypeClass())
897*b1cdbd2cSJim Jagielski 			{
898*b1cdbd2cSJim Jagielski 				case TypeClass_STRING:
899*b1cdbd2cSJim Jagielski 					_rxOutStream->writeShort(0x0000);
900*b1cdbd2cSJim Jagielski 					_rxOutStream->writeUTF(::comphelper::getString(aEffectiveValue));
901*b1cdbd2cSJim Jagielski 					break;
902*b1cdbd2cSJim Jagielski 				case TypeClass_DOUBLE:
903*b1cdbd2cSJim Jagielski 					_rxOutStream->writeShort(0x0001);
904*b1cdbd2cSJim Jagielski 					_rxOutStream->writeDouble(::comphelper::getDouble(aEffectiveValue));
905*b1cdbd2cSJim Jagielski 					break;
906*b1cdbd2cSJim Jagielski 				default:	// void and all unknown states
907*b1cdbd2cSJim Jagielski 					DBG_ASSERT(!aEffectiveValue.hasValue(), "FmXFormattedModel::write : unknown property value type !");
908*b1cdbd2cSJim Jagielski 					_rxOutStream->writeShort(0x0002);
909*b1cdbd2cSJim Jagielski 					break;
910*b1cdbd2cSJim Jagielski 			}
911*b1cdbd2cSJim Jagielski 		}
912*b1cdbd2cSJim Jagielski 	}
913*b1cdbd2cSJim Jagielski }
914*b1cdbd2cSJim Jagielski 
915*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
read(const Reference<XObjectInputStream> & _rxInStream)916*b1cdbd2cSJim Jagielski void OFormattedModel::read(const Reference<XObjectInputStream>& _rxInStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski 	OEditBaseModel::read(_rxInStream);
919*b1cdbd2cSJim Jagielski 	sal_uInt16 nVersion = _rxInStream->readShort();
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 	Reference<XNumberFormatsSupplier>  xSupplier;
922*b1cdbd2cSJim Jagielski 	sal_Int32 nKey = -1;
923*b1cdbd2cSJim Jagielski 	switch (nVersion)
924*b1cdbd2cSJim Jagielski 	{
925*b1cdbd2cSJim Jagielski 		case 0x0001 :
926*b1cdbd2cSJim Jagielski 		case 0x0002 :
927*b1cdbd2cSJim Jagielski 		case 0x0003 :
928*b1cdbd2cSJim Jagielski 		{
929*b1cdbd2cSJim Jagielski 			sal_Bool bNonVoidKey = _rxInStream->readBoolean();
930*b1cdbd2cSJim Jagielski 			if (bNonVoidKey)
931*b1cdbd2cSJim Jagielski 			{
932*b1cdbd2cSJim Jagielski 				// den String und die Language lesen ....
933*b1cdbd2cSJim Jagielski 				::rtl::OUString sFormatDescription = _rxInStream->readUTF();
934*b1cdbd2cSJim Jagielski 				LanguageType eDescriptionLanguage = (LanguageType)_rxInStream->readLong();
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 				// und daraus von einem Formatter zu einem Key zusammenwuerfeln lassen ...
937*b1cdbd2cSJim Jagielski 				xSupplier = calcFormatsSupplier();
938*b1cdbd2cSJim Jagielski 					// calcFormatsSupplier nimmt erst den vom Model, dann einen von der starform, dann einen ganz neuen ....
939*b1cdbd2cSJim Jagielski 				Reference<XNumberFormats>  xFormats = xSupplier->getNumberFormats();
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski 				if (xFormats.is())
942*b1cdbd2cSJim Jagielski 				{
943*b1cdbd2cSJim Jagielski 					Locale aDescriptionLanguage( MsLangId::convertLanguageToLocale(eDescriptionLanguage));
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski 					nKey = xFormats->queryKey(sFormatDescription, aDescriptionLanguage, sal_False);
946*b1cdbd2cSJim Jagielski 					if (nKey == (sal_Int32)-1)
947*b1cdbd2cSJim Jagielski 					{	// noch nicht vorhanden in meinem Formatter ...
948*b1cdbd2cSJim Jagielski 						nKey = xFormats->addNew(sFormatDescription, aDescriptionLanguage);
949*b1cdbd2cSJim Jagielski 					}
950*b1cdbd2cSJim Jagielski 				}
951*b1cdbd2cSJim Jagielski 			}
952*b1cdbd2cSJim Jagielski 			if ((nVersion == 0x0002) || (nVersion == 0x0003))
953*b1cdbd2cSJim Jagielski 				readCommonEditProperties(_rxInStream);
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 			if (nVersion == 0x0003)
956*b1cdbd2cSJim Jagielski 			{	// since version 3 there is a "skippable" block at this position
957*b1cdbd2cSJim Jagielski 				Reference< XDataInputStream > xIn(_rxInStream, UNO_QUERY);
958*b1cdbd2cSJim Jagielski 				OStreamSection aDownCompat(xIn);
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski 				sal_Int16 nSubVersion = _rxInStream->readShort();
961*b1cdbd2cSJim Jagielski                 (void)nSubVersion;
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 				// version 0 and higher : the "effective value" property
964*b1cdbd2cSJim Jagielski                 Any aEffectiveValue;
965*b1cdbd2cSJim Jagielski 				{
966*b1cdbd2cSJim Jagielski 					OStreamSection aDownCompat2(xIn);
967*b1cdbd2cSJim Jagielski 					switch (_rxInStream->readShort())
968*b1cdbd2cSJim Jagielski 					{
969*b1cdbd2cSJim Jagielski 						case 0: // String
970*b1cdbd2cSJim Jagielski 							aEffectiveValue <<= _rxInStream->readUTF();
971*b1cdbd2cSJim Jagielski 							break;
972*b1cdbd2cSJim Jagielski 						case 1: // double
973*b1cdbd2cSJim Jagielski 							aEffectiveValue <<= (double)_rxInStream->readDouble();
974*b1cdbd2cSJim Jagielski 							break;
975*b1cdbd2cSJim Jagielski 						case 2:
976*b1cdbd2cSJim Jagielski 							break;
977*b1cdbd2cSJim Jagielski 						case 3:
978*b1cdbd2cSJim Jagielski 							DBG_ERROR("FmXFormattedModel::read : unknown effective value type !");
979*b1cdbd2cSJim Jagielski 					}
980*b1cdbd2cSJim Jagielski 				}
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski 				// this property is only to be set if we have no control source : in all other cases the base class did a
983*b1cdbd2cSJim Jagielski 				// reset after it's read and this set the effective value to a default value
984*b1cdbd2cSJim Jagielski 				if ( m_xAggregateSet.is() && ( getControlSource().getLength() == 0 ) )
985*b1cdbd2cSJim Jagielski 				{
986*b1cdbd2cSJim Jagielski 					try
987*b1cdbd2cSJim Jagielski 					{
988*b1cdbd2cSJim Jagielski 						m_xAggregateSet->setPropertyValue(PROPERTY_EFFECTIVE_VALUE, aEffectiveValue);
989*b1cdbd2cSJim Jagielski 					}
990*b1cdbd2cSJim Jagielski 					catch(Exception&)
991*b1cdbd2cSJim Jagielski 					{
992*b1cdbd2cSJim Jagielski 					}
993*b1cdbd2cSJim Jagielski 				}
994*b1cdbd2cSJim Jagielski 			}
995*b1cdbd2cSJim Jagielski 		}
996*b1cdbd2cSJim Jagielski 		break;
997*b1cdbd2cSJim Jagielski 		default :
998*b1cdbd2cSJim Jagielski 			DBG_ERROR("OFormattedModel::read : unknown version !");
999*b1cdbd2cSJim Jagielski 			// dann bleibt das Format des aggregierten Sets, wie es bei der Erzeugung ist : void
1000*b1cdbd2cSJim Jagielski 			defaultCommonEditProperties();
1001*b1cdbd2cSJim Jagielski 			break;
1002*b1cdbd2cSJim Jagielski 	}
1003*b1cdbd2cSJim Jagielski 
1004*b1cdbd2cSJim Jagielski 	if ((nKey != -1) && m_xAggregateSet.is())
1005*b1cdbd2cSJim Jagielski 	{
1006*b1cdbd2cSJim Jagielski 				m_xAggregateSet->setPropertyValue(PROPERTY_FORMATSSUPPLIER, makeAny(xSupplier));
1007*b1cdbd2cSJim Jagielski 				m_xAggregateSet->setPropertyValue(PROPERTY_FORMATKEY, makeAny((sal_Int32)nKey));
1008*b1cdbd2cSJim Jagielski 	}
1009*b1cdbd2cSJim Jagielski 	else
1010*b1cdbd2cSJim Jagielski 	{
1011*b1cdbd2cSJim Jagielski 		setPropertyToDefault(PROPERTY_FORMATSSUPPLIER);
1012*b1cdbd2cSJim Jagielski 		setPropertyToDefault(PROPERTY_FORMATKEY);
1013*b1cdbd2cSJim Jagielski 	}
1014*b1cdbd2cSJim Jagielski }
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getPersistenceFlags() const1017*b1cdbd2cSJim Jagielski sal_uInt16 OFormattedModel::getPersistenceFlags() const
1018*b1cdbd2cSJim Jagielski {
1019*b1cdbd2cSJim Jagielski 	return (OEditBaseModel::getPersistenceFlags() & ~PF_HANDLE_COMMON_PROPS);
1020*b1cdbd2cSJim Jagielski 	// a) we do our own call to writeCommonEditProperties
1021*b1cdbd2cSJim Jagielski }
1022*b1cdbd2cSJim Jagielski 
1023*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
commitControlValueToDbColumn(bool)1024*b1cdbd2cSJim Jagielski sal_Bool OFormattedModel::commitControlValueToDbColumn( bool /*_bPostReset*/ )
1025*b1cdbd2cSJim Jagielski {
1026*b1cdbd2cSJim Jagielski 	Any aControlValue( m_xAggregateFastSet->getFastPropertyValue( getValuePropertyAggHandle() ) );
1027*b1cdbd2cSJim Jagielski 	if ( aControlValue != m_aSaveValue )
1028*b1cdbd2cSJim Jagielski 	{
1029*b1cdbd2cSJim Jagielski 		// Leerstring + EmptyIsNull = void
1030*b1cdbd2cSJim Jagielski 		if	(	!aControlValue.hasValue()
1031*b1cdbd2cSJim Jagielski 			||	(	( aControlValue.getValueType().getTypeClass() == TypeClass_STRING )
1032*b1cdbd2cSJim Jagielski 				&&	( getString( aControlValue ).getLength() == 0 )
1033*b1cdbd2cSJim Jagielski 				&&	m_bEmptyIsNull
1034*b1cdbd2cSJim Jagielski 				)
1035*b1cdbd2cSJim Jagielski 			)
1036*b1cdbd2cSJim Jagielski 			m_xColumnUpdate->updateNull();
1037*b1cdbd2cSJim Jagielski 		else
1038*b1cdbd2cSJim Jagielski 		{
1039*b1cdbd2cSJim Jagielski 			try
1040*b1cdbd2cSJim Jagielski 			{
1041*b1cdbd2cSJim Jagielski                 double f = 0.0;
1042*b1cdbd2cSJim Jagielski 				if ( aControlValue.getValueType().getTypeClass() == TypeClass_DOUBLE || (aControlValue >>= f)) // #i110323
1043*b1cdbd2cSJim Jagielski 				{
1044*b1cdbd2cSJim Jagielski 					DBTypeConversion::setValue( m_xColumnUpdate, m_aNullDate, getDouble( aControlValue ), m_nKeyType );
1045*b1cdbd2cSJim Jagielski 				}
1046*b1cdbd2cSJim Jagielski 				else
1047*b1cdbd2cSJim Jagielski 				{
1048*b1cdbd2cSJim Jagielski 					DBG_ASSERT( aControlValue.getValueType().getTypeClass() == TypeClass_STRING, "OFormattedModel::commitControlValueToDbColumn: invalud value type !" );
1049*b1cdbd2cSJim Jagielski 					m_xColumnUpdate->updateString( getString( aControlValue ) );
1050*b1cdbd2cSJim Jagielski 				}
1051*b1cdbd2cSJim Jagielski 			}
1052*b1cdbd2cSJim Jagielski 			catch(Exception&)
1053*b1cdbd2cSJim Jagielski 			{
1054*b1cdbd2cSJim Jagielski 				return sal_False;
1055*b1cdbd2cSJim Jagielski 			}
1056*b1cdbd2cSJim Jagielski 		}
1057*b1cdbd2cSJim Jagielski 		m_aSaveValue = aControlValue;
1058*b1cdbd2cSJim Jagielski 	}
1059*b1cdbd2cSJim Jagielski 	return sal_True;
1060*b1cdbd2cSJim Jagielski }
1061*b1cdbd2cSJim Jagielski 
1062*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
onConnectedExternalValue()1063*b1cdbd2cSJim Jagielski void OFormattedModel::onConnectedExternalValue( )
1064*b1cdbd2cSJim Jagielski {
1065*b1cdbd2cSJim Jagielski     OEditBaseModel::onConnectedExternalValue();
1066*b1cdbd2cSJim Jagielski     updateFormatterNullDate();
1067*b1cdbd2cSJim Jagielski }
1068*b1cdbd2cSJim Jagielski 
1069*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
translateExternalValueToControlValue(const Any & _rExternalValue) const1070*b1cdbd2cSJim Jagielski Any OFormattedModel::translateExternalValueToControlValue( const Any& _rExternalValue ) const
1071*b1cdbd2cSJim Jagielski {
1072*b1cdbd2cSJim Jagielski     Any aControlValue;
1073*b1cdbd2cSJim Jagielski     switch( _rExternalValue.getValueTypeClass() )
1074*b1cdbd2cSJim Jagielski     {
1075*b1cdbd2cSJim Jagielski     case TypeClass_VOID:
1076*b1cdbd2cSJim Jagielski         break;
1077*b1cdbd2cSJim Jagielski 
1078*b1cdbd2cSJim Jagielski     case TypeClass_STRING:
1079*b1cdbd2cSJim Jagielski         aControlValue = _rExternalValue;
1080*b1cdbd2cSJim Jagielski         break;
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski     case TypeClass_BOOLEAN:
1083*b1cdbd2cSJim Jagielski     {
1084*b1cdbd2cSJim Jagielski         sal_Bool bExternalValue = sal_False;
1085*b1cdbd2cSJim Jagielski         _rExternalValue >>= bExternalValue;
1086*b1cdbd2cSJim Jagielski         aControlValue <<= (double)( bExternalValue ? 1 : 0 );
1087*b1cdbd2cSJim Jagielski     }
1088*b1cdbd2cSJim Jagielski     break;
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski     default:
1091*b1cdbd2cSJim Jagielski     {
1092*b1cdbd2cSJim Jagielski         if ( _rExternalValue.getValueType().equals( ::getCppuType( static_cast< UNODate* >( NULL ) ) ) )
1093*b1cdbd2cSJim Jagielski         {
1094*b1cdbd2cSJim Jagielski             UNODate aDate;
1095*b1cdbd2cSJim Jagielski             _rExternalValue >>= aDate;
1096*b1cdbd2cSJim Jagielski             aControlValue <<= DBTypeConversion::toDouble( aDate, m_aNullDate );
1097*b1cdbd2cSJim Jagielski         }
1098*b1cdbd2cSJim Jagielski         else if ( _rExternalValue.getValueType().equals( ::getCppuType( static_cast< UNOTime* >( NULL ) ) ) )
1099*b1cdbd2cSJim Jagielski         {
1100*b1cdbd2cSJim Jagielski             UNOTime aTime;
1101*b1cdbd2cSJim Jagielski             _rExternalValue >>= aTime;
1102*b1cdbd2cSJim Jagielski             aControlValue <<= DBTypeConversion::toDouble( aTime );
1103*b1cdbd2cSJim Jagielski         }
1104*b1cdbd2cSJim Jagielski         else if ( _rExternalValue.getValueType().equals( ::getCppuType( static_cast< UNODateTime* >( NULL ) ) ) )
1105*b1cdbd2cSJim Jagielski         {
1106*b1cdbd2cSJim Jagielski             UNODateTime aDateTime;
1107*b1cdbd2cSJim Jagielski             _rExternalValue >>= aDateTime;
1108*b1cdbd2cSJim Jagielski             aControlValue <<= DBTypeConversion::toDouble( aDateTime, m_aNullDate );
1109*b1cdbd2cSJim Jagielski         }
1110*b1cdbd2cSJim Jagielski         else
1111*b1cdbd2cSJim Jagielski         {
1112*b1cdbd2cSJim Jagielski             OSL_ENSURE( _rExternalValue.getValueTypeClass() == TypeClass_DOUBLE,
1113*b1cdbd2cSJim Jagielski                 "OFormattedModel::translateExternalValueToControlValue: don't know how to translate this type!" );
1114*b1cdbd2cSJim Jagielski             double fValue = 0;
1115*b1cdbd2cSJim Jagielski             OSL_VERIFY( _rExternalValue >>= fValue );
1116*b1cdbd2cSJim Jagielski             aControlValue <<= fValue;
1117*b1cdbd2cSJim Jagielski         }
1118*b1cdbd2cSJim Jagielski     }
1119*b1cdbd2cSJim Jagielski     }
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski     return aControlValue;
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
translateControlValueToExternalValue() const1125*b1cdbd2cSJim Jagielski Any OFormattedModel::translateControlValueToExternalValue( ) const
1126*b1cdbd2cSJim Jagielski {
1127*b1cdbd2cSJim Jagielski     OSL_PRECOND( hasExternalValueBinding(),
1128*b1cdbd2cSJim Jagielski         "OFormattedModel::translateControlValueToExternalValue: precondition not met!" );
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski     Any aControlValue( getControlValue() );
1131*b1cdbd2cSJim Jagielski     if ( !aControlValue.hasValue() )
1132*b1cdbd2cSJim Jagielski         return aControlValue;
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski     Any aExternalValue;
1135*b1cdbd2cSJim Jagielski 
1136*b1cdbd2cSJim Jagielski     // translate into the the external value type
1137*b1cdbd2cSJim Jagielski     Type aExternalValueType( getExternalValueType() );
1138*b1cdbd2cSJim Jagielski     switch ( aExternalValueType.getTypeClass() )
1139*b1cdbd2cSJim Jagielski     {
1140*b1cdbd2cSJim Jagielski     case TypeClass_STRING:
1141*b1cdbd2cSJim Jagielski     {
1142*b1cdbd2cSJim Jagielski         ::rtl::OUString sString;
1143*b1cdbd2cSJim Jagielski         if ( aControlValue >>= sString )
1144*b1cdbd2cSJim Jagielski         {
1145*b1cdbd2cSJim Jagielski             aExternalValue <<= sString;
1146*b1cdbd2cSJim Jagielski             break;
1147*b1cdbd2cSJim Jagielski         }
1148*b1cdbd2cSJim Jagielski     }
1149*b1cdbd2cSJim Jagielski     // NO break here!
1150*b1cdbd2cSJim Jagielski 
1151*b1cdbd2cSJim Jagielski     case TypeClass_BOOLEAN:
1152*b1cdbd2cSJim Jagielski     {
1153*b1cdbd2cSJim Jagielski         double fValue = 0;
1154*b1cdbd2cSJim Jagielski         OSL_VERIFY( aControlValue >>= fValue );
1155*b1cdbd2cSJim Jagielski             // if this asserts ... well, the somebody set the TreatAsNumeric property to false,
1156*b1cdbd2cSJim Jagielski             // and the control value is a string. This implies some weird misconfiguration
1157*b1cdbd2cSJim Jagielski             // of the FormattedModel, so we won't care for it for the moment.
1158*b1cdbd2cSJim Jagielski         aExternalValue <<= (sal_Bool)( fValue ? sal_True : sal_False );
1159*b1cdbd2cSJim Jagielski     }
1160*b1cdbd2cSJim Jagielski     break;
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski     default:
1163*b1cdbd2cSJim Jagielski     {
1164*b1cdbd2cSJim Jagielski         double fValue = 0;
1165*b1cdbd2cSJim Jagielski         OSL_VERIFY( aControlValue >>= fValue );
1166*b1cdbd2cSJim Jagielski             // if this asserts ... well, the somebody set the TreatAsNumeric property to false,
1167*b1cdbd2cSJim Jagielski             // and the control value is a string. This implies some weird misconfiguration
1168*b1cdbd2cSJim Jagielski             // of the FormattedModel, so we won't care for it for the moment.
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski         if ( aExternalValueType.equals( ::getCppuType( static_cast< UNODate* >( NULL ) ) ) )
1171*b1cdbd2cSJim Jagielski         {
1172*b1cdbd2cSJim Jagielski             aExternalValue <<= DBTypeConversion::toDate( fValue, m_aNullDate );
1173*b1cdbd2cSJim Jagielski         }
1174*b1cdbd2cSJim Jagielski         else if ( aExternalValueType.equals( ::getCppuType( static_cast< UNOTime* >( NULL ) ) ) )
1175*b1cdbd2cSJim Jagielski         {
1176*b1cdbd2cSJim Jagielski             aExternalValue <<= DBTypeConversion::toTime( fValue );
1177*b1cdbd2cSJim Jagielski         }
1178*b1cdbd2cSJim Jagielski         else if ( aExternalValueType.equals( ::getCppuType( static_cast< UNODateTime* >( NULL ) ) ) )
1179*b1cdbd2cSJim Jagielski         {
1180*b1cdbd2cSJim Jagielski             aExternalValue <<= DBTypeConversion::toDateTime( fValue, m_aNullDate );
1181*b1cdbd2cSJim Jagielski         }
1182*b1cdbd2cSJim Jagielski         else
1183*b1cdbd2cSJim Jagielski         {
1184*b1cdbd2cSJim Jagielski             OSL_ENSURE( aExternalValueType.equals( ::getCppuType( static_cast< double* >( NULL ) ) ),
1185*b1cdbd2cSJim Jagielski                 "OFormattedModel::translateControlValueToExternalValue: don't know how to translate this type!" );
1186*b1cdbd2cSJim Jagielski             aExternalValue <<= fValue;
1187*b1cdbd2cSJim Jagielski         }
1188*b1cdbd2cSJim Jagielski     }
1189*b1cdbd2cSJim Jagielski     break;
1190*b1cdbd2cSJim Jagielski     }
1191*b1cdbd2cSJim Jagielski     return aExternalValue;
1192*b1cdbd2cSJim Jagielski }
1193*b1cdbd2cSJim Jagielski 
1194*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
translateDbColumnToControlValue()1195*b1cdbd2cSJim Jagielski Any OFormattedModel::translateDbColumnToControlValue()
1196*b1cdbd2cSJim Jagielski {
1197*b1cdbd2cSJim Jagielski 	if ( m_bNumeric )
1198*b1cdbd2cSJim Jagielski 		m_aSaveValue <<= DBTypeConversion::getValue( m_xColumn, m_aNullDate ); // #100056# OJ
1199*b1cdbd2cSJim Jagielski 	else
1200*b1cdbd2cSJim Jagielski 		m_aSaveValue <<= m_xColumn->getString();
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski 	if ( m_xColumn->wasNull() )
1203*b1cdbd2cSJim Jagielski 		m_aSaveValue.clear();
1204*b1cdbd2cSJim Jagielski 
1205*b1cdbd2cSJim Jagielski     return m_aSaveValue;
1206*b1cdbd2cSJim Jagielski }
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getSupportedBindingTypes()1209*b1cdbd2cSJim Jagielski Sequence< Type > OFormattedModel::getSupportedBindingTypes()
1210*b1cdbd2cSJim Jagielski {
1211*b1cdbd2cSJim Jagielski     ::std::list< Type > aTypes;
1212*b1cdbd2cSJim Jagielski     aTypes.push_back( ::getCppuType( static_cast< double* >( NULL ) ) );
1213*b1cdbd2cSJim Jagielski 
1214*b1cdbd2cSJim Jagielski     switch ( m_nKeyType & ~NumberFormat::DEFINED )
1215*b1cdbd2cSJim Jagielski     {
1216*b1cdbd2cSJim Jagielski     case NumberFormat::DATE:
1217*b1cdbd2cSJim Jagielski         aTypes.push_front(::getCppuType( static_cast< UNODate* >( NULL ) ) );
1218*b1cdbd2cSJim Jagielski         break;
1219*b1cdbd2cSJim Jagielski     case NumberFormat::TIME:
1220*b1cdbd2cSJim Jagielski         aTypes.push_front(::getCppuType( static_cast< UNOTime* >( NULL ) ) );
1221*b1cdbd2cSJim Jagielski         break;
1222*b1cdbd2cSJim Jagielski     case NumberFormat::DATETIME:
1223*b1cdbd2cSJim Jagielski         aTypes.push_front(::getCppuType( static_cast< UNODateTime* >( NULL ) ) );
1224*b1cdbd2cSJim Jagielski         break;
1225*b1cdbd2cSJim Jagielski     case NumberFormat::TEXT:
1226*b1cdbd2cSJim Jagielski         aTypes.push_front(::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ) );
1227*b1cdbd2cSJim Jagielski         break;
1228*b1cdbd2cSJim Jagielski     case NumberFormat::LOGICAL:
1229*b1cdbd2cSJim Jagielski         aTypes.push_front(::getCppuType( static_cast< sal_Bool* >( NULL ) ) );
1230*b1cdbd2cSJim Jagielski         break;
1231*b1cdbd2cSJim Jagielski     }
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski     Sequence< Type > aTypesRet( aTypes.size() );
1234*b1cdbd2cSJim Jagielski     ::std::copy( aTypes.begin(), aTypes.end(), aTypesRet.getArray() );
1235*b1cdbd2cSJim Jagielski     return aTypesRet;
1236*b1cdbd2cSJim Jagielski }
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getDefaultForReset() const1239*b1cdbd2cSJim Jagielski Any OFormattedModel::getDefaultForReset() const
1240*b1cdbd2cSJim Jagielski {
1241*b1cdbd2cSJim Jagielski     return m_xAggregateSet->getPropertyValue( PROPERTY_EFFECTIVE_DEFAULT );
1242*b1cdbd2cSJim Jagielski }
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
resetNoBroadcast()1245*b1cdbd2cSJim Jagielski void OFormattedModel::resetNoBroadcast()
1246*b1cdbd2cSJim Jagielski {
1247*b1cdbd2cSJim Jagielski     OEditBaseModel::resetNoBroadcast();
1248*b1cdbd2cSJim Jagielski     m_aSaveValue.clear();
1249*b1cdbd2cSJim Jagielski }
1250*b1cdbd2cSJim Jagielski 
1251*b1cdbd2cSJim Jagielski //.........................................................................
1252*b1cdbd2cSJim Jagielski }
1253*b1cdbd2cSJim Jagielski //.........................................................................
1254