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