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