xref: /AOO41X/main/dbaccess/source/ui/browser/brwctrlr.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "browserids.hxx"
34*cdf0e10cSrcweir #include "brwctrlr.hxx"
35*cdf0e10cSrcweir #include "brwview.hxx"
36*cdf0e10cSrcweir #include "dbu_brw.hrc"
37*cdf0e10cSrcweir #include "dbustrings.hrc"
38*cdf0e10cSrcweir #include "queryfilter.hxx"
39*cdf0e10cSrcweir #include "queryorder.hxx"
40*cdf0e10cSrcweir #include "sqlmessage.hxx"
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir /** === begin UNO includes === **/
43*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
44*cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
45*cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp>
46*cdf0e10cSrcweir #include <com/sun/star/form/FormButtonType.hpp>
47*cdf0e10cSrcweir #include <com/sun/star/form/FormSubmitEncoding.hpp>
48*cdf0e10cSrcweir #include <com/sun/star/form/FormSubmitMethod.hpp>
49*cdf0e10cSrcweir #include <com/sun/star/form/XApproveActionBroadcaster.hpp>
50*cdf0e10cSrcweir #include <com/sun/star/form/XBoundControl.hpp>
51*cdf0e10cSrcweir #include <com/sun/star/form/XChangeBroadcaster.hpp>
52*cdf0e10cSrcweir #include <com/sun/star/form/XChangeListener.hpp>
53*cdf0e10cSrcweir #include <com/sun/star/form/XDatabaseParameterBroadcaster.hpp>
54*cdf0e10cSrcweir #include <com/sun/star/form/XLoadable.hpp>
55*cdf0e10cSrcweir #include <com/sun/star/form/XReset.hpp>
56*cdf0e10cSrcweir #include <com/sun/star/form/XResetListener.hpp>
57*cdf0e10cSrcweir #include <com/sun/star/form/XSubmit.hpp>
58*cdf0e10cSrcweir #include <com/sun/star/form/XSubmitListener.hpp>
59*cdf0e10cSrcweir #include <com/sun/star/form/runtime/XFormController.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/sdb/ErrorCondition.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/sdb/ParametersRequest.hpp>
63*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp>
64*cdf0e10cSrcweir #include <com/sun/star/sdb/XInteractionSupplyParameters.hpp>
65*cdf0e10cSrcweir #include <com/sun/star/sdb/XSQLErrorBroadcaster.hpp>
66*cdf0e10cSrcweir #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
67*cdf0e10cSrcweir #include <com/sun/star/sdb/SQLFilterOperator.hpp>
68*cdf0e10cSrcweir #include <com/sun/star/sdbc/XConnection.hpp>
69*cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSetUpdate.hpp>
70*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRowSetListener.hpp>
71*cdf0e10cSrcweir #include <com/sun/star/sdbc/XWarningsSupplier.hpp>
72*cdf0e10cSrcweir #include <com/sun/star/sdbcx/Privilege.hpp>
73*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XRowLocate.hpp>
74*cdf0e10cSrcweir #include <com/sun/star/task/XInteractionHandler.hpp>
75*cdf0e10cSrcweir #include <com/sun/star/uno/TypeClass.hpp>
76*cdf0e10cSrcweir #include <com/sun/star/util/XCancellable.hpp>
77*cdf0e10cSrcweir /** === end UNO includes === **/
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir #include <comphelper/enumhelper.hxx>
80*cdf0e10cSrcweir #include <comphelper/extract.hxx>
81*cdf0e10cSrcweir #include <comphelper/interaction.hxx>
82*cdf0e10cSrcweir #include <comphelper/sequence.hxx>
83*cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
84*cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
85*cdf0e10cSrcweir #include <connectivity/sqlerror.hxx>
86*cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx>
87*cdf0e10cSrcweir #include <cppuhelper/implbase2.hxx>
88*cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
89*cdf0e10cSrcweir #include <osl/mutex.hxx>
90*cdf0e10cSrcweir #include <rtl/logfile.hxx>
91*cdf0e10cSrcweir #include <sfx2/app.hxx>
92*cdf0e10cSrcweir #include <sfx2/sfx.hrc>
93*cdf0e10cSrcweir #include <svx/fmsearch.hxx>
94*cdf0e10cSrcweir #include <svx/svxdlg.hxx>
95*cdf0e10cSrcweir #include <tools/color.hxx>
96*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
97*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
98*cdf0e10cSrcweir #include <vcl/waitobj.hxx>
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
101*cdf0e10cSrcweir using namespace ::com::sun::star::awt;
102*cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
103*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
104*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
105*cdf0e10cSrcweir using namespace ::com::sun::star::task;
106*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
107*cdf0e10cSrcweir using namespace ::com::sun::star::frame;
108*cdf0e10cSrcweir using namespace ::com::sun::star::form;
109*cdf0e10cSrcweir using namespace ::com::sun::star::util;
110*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
111*cdf0e10cSrcweir using namespace ::com::sun::star::container;
112*cdf0e10cSrcweir using namespace ::dbtools;
113*cdf0e10cSrcweir using namespace ::comphelper;
114*cdf0e10cSrcweir using namespace ::svt;
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir #define HANDLE_SQL_ERRORS( action, successflag, context, message )			\
117*cdf0e10cSrcweir 	try 																	\
118*cdf0e10cSrcweir 	{																		\
119*cdf0e10cSrcweir 		successflag = sal_False;											\
120*cdf0e10cSrcweir 		action; 															\
121*cdf0e10cSrcweir 		successflag = sal_True; 											\
122*cdf0e10cSrcweir 	}																		\
123*cdf0e10cSrcweir 	catch(SQLException& e)							                        \
124*cdf0e10cSrcweir 	{																		\
125*cdf0e10cSrcweir 		SQLException aError = ::dbtools::prependErrorInfo(e, *this, context); \
126*cdf0e10cSrcweir 		::com::sun::star::sdb::SQLErrorEvent aEvent;						\
127*cdf0e10cSrcweir 		aEvent.Reason <<= aError;									        \
128*cdf0e10cSrcweir 		errorOccured(aEvent);												\
129*cdf0e10cSrcweir 	}																		\
130*cdf0e10cSrcweir 	catch(Exception&)														\
131*cdf0e10cSrcweir 	{																		\
132*cdf0e10cSrcweir 		DBG_UNHANDLED_EXCEPTION();                                          \
133*cdf0e10cSrcweir 	}																		\
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir #define DO_SAFE( action, message ) try { action; } catch(Exception&) { DBG_ERROR(message); } ;
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir //..................................................................
138*cdf0e10cSrcweir namespace dbaui
139*cdf0e10cSrcweir {
140*cdf0e10cSrcweir //..................................................................
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir //==================================================================
143*cdf0e10cSrcweir // OParameterContinuation
144*cdf0e10cSrcweir //==================================================================
145*cdf0e10cSrcweir class OParameterContinuation : public OInteraction< XInteractionSupplyParameters >
146*cdf0e10cSrcweir {
147*cdf0e10cSrcweir 	Sequence< PropertyValue >		m_aValues;
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir public:
150*cdf0e10cSrcweir 	OParameterContinuation() { }
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 	Sequence< PropertyValue >	getValues() const { return m_aValues; }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir // XInteractionSupplyParameters
155*cdf0e10cSrcweir 	virtual void SAL_CALL setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException);
156*cdf0e10cSrcweir };
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir //------------------------------------------------------------------
159*cdf0e10cSrcweir void SAL_CALL OParameterContinuation::setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException)
160*cdf0e10cSrcweir {
161*cdf0e10cSrcweir 	m_aValues = _rValues;
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir //==============================================================================
166*cdf0e10cSrcweir // a helper class implementing a runtime::XFormController, will be aggregated by SbaXDataBrowserController
167*cdf0e10cSrcweir // (we can't derive from XFormController as it's base class is XTabController and the XTabController::getModel collides
168*cdf0e10cSrcweir // with the XController::getModel implemented in our base class SbaXDataBrowserController)
169*cdf0e10cSrcweir class SbaXDataBrowserController::FormControllerImpl
170*cdf0e10cSrcweir     : public ::cppu::WeakAggImplHelper2< ::com::sun::star::form::runtime::XFormController,
171*cdf0e10cSrcweir 										 ::com::sun::star::frame::XFrameActionListener >
172*cdf0e10cSrcweir {
173*cdf0e10cSrcweir 	friend class SbaXDataBrowserController;
174*cdf0e10cSrcweir 	::cppu::OInterfaceContainerHelper	m_aActivateListeners;
175*cdf0e10cSrcweir 	SbaXDataBrowserController*			m_pOwner;
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir public:
178*cdf0e10cSrcweir 	FormControllerImpl(SbaXDataBrowserController* pOwner);
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir 	// XFormController
181*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > SAL_CALL getFormOperations() throw (::com::sun::star::uno::RuntimeException);
182*cdf0e10cSrcweir 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >  SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException );
183*cdf0e10cSrcweir 	virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException );
184*cdf0e10cSrcweir 	virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException );
185*cdf0e10cSrcweir     virtual void SAL_CALL addChildController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController >& _ChildController ) throw( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException );
186*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException);
187*cdf0e10cSrcweir     virtual void SAL_CALL setContext( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext >& _context ) throw (::com::sun::star::uno::RuntimeException);
188*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > SAL_CALL getInteractionHandler() throw (::com::sun::star::uno::RuntimeException);
189*cdf0e10cSrcweir     virtual void SAL_CALL setInteractionHandler( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _interactionHandler ) throw (::com::sun::star::uno::RuntimeException);
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir     // XChild, base of XFormController
192*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent(  ) throw (::com::sun::star::uno::RuntimeException);
193*cdf0e10cSrcweir     virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir     // XComponent, base of XFormController
196*cdf0e10cSrcweir     virtual void SAL_CALL dispose(  ) throw (::com::sun::star::uno::RuntimeException);
197*cdf0e10cSrcweir     virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
198*cdf0e10cSrcweir     virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir     // XIndexAccess, base of XFormController
201*cdf0e10cSrcweir     virtual ::sal_Int32 SAL_CALL getCount(  ) throw (::com::sun::star::uno::RuntimeException);
202*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir     // XElementAccess, base of XIndexAccess
205*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Type SAL_CALL getElementType(  ) throw (::com::sun::star::uno::RuntimeException);
206*cdf0e10cSrcweir     virtual ::sal_Bool SAL_CALL hasElements(  ) throw (::com::sun::star::uno::RuntimeException);
207*cdf0e10cSrcweir 
208*cdf0e10cSrcweir     // XEnumerationAccess, base of XElementAccess
209*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration(  ) throw (::com::sun::star::uno::RuntimeException);
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir     // XModifyBroadcaster, base of XFormController
212*cdf0e10cSrcweir     virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
213*cdf0e10cSrcweir     virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir     // XConfirmDeleteBroadcaster, base of XFormController
216*cdf0e10cSrcweir     virtual void SAL_CALL addConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
217*cdf0e10cSrcweir     virtual void SAL_CALL removeConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir     // XSQLErrorBroadcaster, base of XFormController
220*cdf0e10cSrcweir     virtual void SAL_CALL addSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
221*cdf0e10cSrcweir     virtual void SAL_CALL removeSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException);
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir     // XRowSetApproveBroadcaster, base of XFormController
224*cdf0e10cSrcweir     virtual void SAL_CALL addRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException);
225*cdf0e10cSrcweir     virtual void SAL_CALL removeRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException);
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir     // XDatabaseParameterBroadcaster2, base of XFormController
228*cdf0e10cSrcweir     virtual void SAL_CALL addDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
229*cdf0e10cSrcweir     virtual void SAL_CALL removeDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir     // XDatabaseParameterBroadcaster, base of XDatabaseParameterBroadcaster2
232*cdf0e10cSrcweir     virtual void SAL_CALL addParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
233*cdf0e10cSrcweir     virtual void SAL_CALL removeParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir     // XModeSelector, base of XFormController
236*cdf0e10cSrcweir     virtual void SAL_CALL setMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException);
237*cdf0e10cSrcweir     virtual ::rtl::OUString SAL_CALL getMode(  ) throw (::com::sun::star::uno::RuntimeException);
238*cdf0e10cSrcweir     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes(  ) throw (::com::sun::star::uno::RuntimeException);
239*cdf0e10cSrcweir     virtual ::sal_Bool SAL_CALL supportsMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::uno::RuntimeException);
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir 	// XTabController, base of XFormController
242*cdf0e10cSrcweir 	virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel > & Model) throw( ::com::sun::star::uno::RuntimeException );
243*cdf0e10cSrcweir 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel >	SAL_CALL getModel(void) throw( ::com::sun::star::uno::RuntimeException );
244*cdf0e10cSrcweir 	virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > & _Container) throw( ::com::sun::star::uno::RuntimeException );
245*cdf0e10cSrcweir 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer >  SAL_CALL getContainer(void) throw( ::com::sun::star::uno::RuntimeException );
246*cdf0e10cSrcweir 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >  > SAL_CALL getControls(void) throw( ::com::sun::star::uno::RuntimeException );
247*cdf0e10cSrcweir 	virtual void SAL_CALL autoTabOrder(void) throw( ::com::sun::star::uno::RuntimeException );
248*cdf0e10cSrcweir 	virtual void SAL_CALL activateTabOrder(void) throw( ::com::sun::star::uno::RuntimeException );
249*cdf0e10cSrcweir 	virtual void SAL_CALL activateFirst(void) throw( ::com::sun::star::uno::RuntimeException );
250*cdf0e10cSrcweir 	virtual void SAL_CALL activateLast(void) throw( ::com::sun::star::uno::RuntimeException );
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir 	// XFrameActionListener
253*cdf0e10cSrcweir 	virtual void SAL_CALL frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException );
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir 	// XEventListener
256*cdf0e10cSrcweir 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException );
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir protected:
259*cdf0e10cSrcweir 	~FormControllerImpl();
260*cdf0e10cSrcweir };
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir DBG_NAME(FormControllerImpl)
264*cdf0e10cSrcweir //------------------------------------------------------------------
265*cdf0e10cSrcweir SbaXDataBrowserController::FormControllerImpl::FormControllerImpl(SbaXDataBrowserController* _pOwner)
266*cdf0e10cSrcweir     :m_aActivateListeners(_pOwner->getMutex())
267*cdf0e10cSrcweir 	,m_pOwner(_pOwner)
268*cdf0e10cSrcweir {
269*cdf0e10cSrcweir     DBG_CTOR(FormControllerImpl,NULL);
270*cdf0e10cSrcweir 
271*cdf0e10cSrcweir 	OSL_ENSURE(m_pOwner, "SbaXDataBrowserController::FormControllerImpl::FormControllerImpl : invalid Owner !");
272*cdf0e10cSrcweir }
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir //------------------------------------------------------------------
275*cdf0e10cSrcweir SbaXDataBrowserController::FormControllerImpl::~FormControllerImpl()
276*cdf0e10cSrcweir {
277*cdf0e10cSrcweir 
278*cdf0e10cSrcweir     DBG_DTOR(FormControllerImpl,NULL);
279*cdf0e10cSrcweir }
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir //------------------------------------------------------------------
282*cdf0e10cSrcweir Reference< runtime::XFormOperations > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getFormOperations() throw (RuntimeException)
283*cdf0e10cSrcweir {
284*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getFormOperations: not supported!" );
285*cdf0e10cSrcweir     return NULL;
286*cdf0e10cSrcweir }
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir //------------------------------------------------------------------
289*cdf0e10cSrcweir Reference< ::com::sun::star::awt::XControl >  SbaXDataBrowserController::FormControllerImpl::getCurrentControl(void) throw( RuntimeException )
290*cdf0e10cSrcweir {
291*cdf0e10cSrcweir 	return m_pOwner->getBrowserView() ? m_pOwner->getBrowserView()->getGridControl() : Reference< ::com::sun::star::awt::XControl > ();
292*cdf0e10cSrcweir }
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir //------------------------------------------------------------------
295*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException )
296*cdf0e10cSrcweir {
297*cdf0e10cSrcweir 	m_aActivateListeners.addInterface(l);
298*cdf0e10cSrcweir }
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir //------------------------------------------------------------------
301*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException )
302*cdf0e10cSrcweir {
303*cdf0e10cSrcweir 	m_aActivateListeners.removeInterface(l);
304*cdf0e10cSrcweir }
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir //------------------------------------------------------------------
307*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addChildController( const Reference< runtime::XFormController >& /*_ChildController*/ ) throw( RuntimeException, IllegalArgumentException )
308*cdf0e10cSrcweir {
309*cdf0e10cSrcweir     // not supported
310*cdf0e10cSrcweir     throw IllegalArgumentException( ::rtl::OUString(), *this, 1 );
311*cdf0e10cSrcweir }
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir //------------------------------------------------------------------
314*cdf0e10cSrcweir Reference< runtime::XFormControllerContext > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContext() throw (RuntimeException)
315*cdf0e10cSrcweir {
316*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getContext: no support!!" );
317*cdf0e10cSrcweir     return NULL;
318*cdf0e10cSrcweir }
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir //------------------------------------------------------------------
321*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContext( const Reference< runtime::XFormControllerContext >& /*_context*/ ) throw (RuntimeException)
322*cdf0e10cSrcweir {
323*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setContext: no support!!" );
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir //------------------------------------------------------------------
327*cdf0e10cSrcweir Reference< XInteractionHandler > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getInteractionHandler() throw (RuntimeException)
328*cdf0e10cSrcweir {
329*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getInteractionHandler: no support!!" );
330*cdf0e10cSrcweir     return NULL;
331*cdf0e10cSrcweir }
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir //------------------------------------------------------------------
334*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setInteractionHandler( const Reference< XInteractionHandler >& /*_interactionHandler*/ ) throw (RuntimeException)
335*cdf0e10cSrcweir {
336*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setInteractionHandler: no support!!" );
337*cdf0e10cSrcweir }
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir //------------------------------------------------------------------
340*cdf0e10cSrcweir Reference< XInterface > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getParent(  ) throw (RuntimeException)
341*cdf0e10cSrcweir {
342*cdf0e10cSrcweir     // don't have any parent form controllers
343*cdf0e10cSrcweir     return NULL;
344*cdf0e10cSrcweir }
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir //------------------------------------------------------------------
347*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setParent( const Reference< XInterface >& /*Parent*/ ) throw (NoSupportException, RuntimeException)
348*cdf0e10cSrcweir {
349*cdf0e10cSrcweir     throw NoSupportException( ::rtl::OUString(), *this );
350*cdf0e10cSrcweir }
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir //------------------------------------------------------------------
353*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::dispose(  ) throw (RuntimeException)
354*cdf0e10cSrcweir {
355*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::dispose: no, you do *not* want to do this!" );
356*cdf0e10cSrcweir }
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir //------------------------------------------------------------------
359*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addEventListener( const Reference< XEventListener >& /*xListener*/ ) throw (RuntimeException)
360*cdf0e10cSrcweir {
361*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addEventListener: no support!!" );
362*cdf0e10cSrcweir }
363*cdf0e10cSrcweir 
364*cdf0e10cSrcweir //------------------------------------------------------------------
365*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeEventListener( const Reference< XEventListener >& /*aListener*/ ) throw (RuntimeException)
366*cdf0e10cSrcweir {
367*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeEventListener: no support!!" );
368*cdf0e10cSrcweir }
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir //------------------------------------------------------------------
371*cdf0e10cSrcweir ::sal_Int32 SAL_CALL SbaXDataBrowserController::FormControllerImpl::getCount(  ) throw (RuntimeException)
372*cdf0e10cSrcweir {
373*cdf0e10cSrcweir     // no sub controllers, never
374*cdf0e10cSrcweir     return 0;
375*cdf0e10cSrcweir }
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir //------------------------------------------------------------------
378*cdf0e10cSrcweir Any SAL_CALL SbaXDataBrowserController::FormControllerImpl::getByIndex( ::sal_Int32 /*Index*/ ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
379*cdf0e10cSrcweir {
380*cdf0e10cSrcweir     // no sub controllers, never
381*cdf0e10cSrcweir     throw IndexOutOfBoundsException( ::rtl::OUString(), *this );
382*cdf0e10cSrcweir }
383*cdf0e10cSrcweir 
384*cdf0e10cSrcweir //------------------------------------------------------------------
385*cdf0e10cSrcweir Type SAL_CALL SbaXDataBrowserController::FormControllerImpl::getElementType(  ) throw (RuntimeException)
386*cdf0e10cSrcweir {
387*cdf0e10cSrcweir     return ::cppu::UnoType< runtime::XFormController >::get();
388*cdf0e10cSrcweir }
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir //------------------------------------------------------------------
391*cdf0e10cSrcweir ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::hasElements(  ) throw (RuntimeException)
392*cdf0e10cSrcweir {
393*cdf0e10cSrcweir     // no sub controllers, never
394*cdf0e10cSrcweir     return false;
395*cdf0e10cSrcweir }
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir //------------------------------------------------------------------
398*cdf0e10cSrcweir Reference< XEnumeration > SAL_CALL SbaXDataBrowserController::FormControllerImpl::createEnumeration(  ) throw (RuntimeException)
399*cdf0e10cSrcweir {
400*cdf0e10cSrcweir     return new ::comphelper::OEnumerationByIndex( this );
401*cdf0e10cSrcweir }
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir //------------------------------------------------------------------
404*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException)
405*cdf0e10cSrcweir {
406*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addModifyListener: no support!" );
407*cdf0e10cSrcweir }
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir //------------------------------------------------------------------
410*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException)
411*cdf0e10cSrcweir {
412*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeModifyListener: no support!" );
413*cdf0e10cSrcweir }
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir //------------------------------------------------------------------
416*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException)
417*cdf0e10cSrcweir {
418*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener: no support!" );
419*cdf0e10cSrcweir }
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir //------------------------------------------------------------------
422*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException)
423*cdf0e10cSrcweir {
424*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener: no support!" );
425*cdf0e10cSrcweir }
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir //------------------------------------------------------------------
428*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException)
429*cdf0e10cSrcweir {
430*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener: no support!" );
431*cdf0e10cSrcweir }
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir //------------------------------------------------------------------
434*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException)
435*cdf0e10cSrcweir {
436*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener: no support!" );
437*cdf0e10cSrcweir }
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir //------------------------------------------------------------------
440*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException)
441*cdf0e10cSrcweir {
442*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener: no support!" );
443*cdf0e10cSrcweir }
444*cdf0e10cSrcweir 
445*cdf0e10cSrcweir //------------------------------------------------------------------
446*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException)
447*cdf0e10cSrcweir {
448*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener: no support!" );
449*cdf0e10cSrcweir }
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir //------------------------------------------------------------------
452*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException)
453*cdf0e10cSrcweir {
454*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener: no support!" );
455*cdf0e10cSrcweir }
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir //------------------------------------------------------------------
458*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException)
459*cdf0e10cSrcweir {
460*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener: no support!" );
461*cdf0e10cSrcweir }
462*cdf0e10cSrcweir 
463*cdf0e10cSrcweir //------------------------------------------------------------------
464*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException)
465*cdf0e10cSrcweir {
466*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addParameterListener: no support!" );
467*cdf0e10cSrcweir }
468*cdf0e10cSrcweir 
469*cdf0e10cSrcweir //------------------------------------------------------------------
470*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException)
471*cdf0e10cSrcweir {
472*cdf0e10cSrcweir     OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeParameterListener: no support!" );
473*cdf0e10cSrcweir }
474*cdf0e10cSrcweir 
475*cdf0e10cSrcweir //------------------------------------------------------------------
476*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setMode( const ::rtl::OUString& _rMode ) throw (NoSupportException, RuntimeException)
477*cdf0e10cSrcweir {
478*cdf0e10cSrcweir     if ( !supportsMode( _rMode ) )
479*cdf0e10cSrcweir         throw NoSupportException();
480*cdf0e10cSrcweir }
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir //------------------------------------------------------------------
483*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SbaXDataBrowserController::FormControllerImpl::getMode(  ) throw (RuntimeException)
484*cdf0e10cSrcweir {
485*cdf0e10cSrcweir     return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) );
486*cdf0e10cSrcweir }
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir //------------------------------------------------------------------
489*cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getSupportedModes(  ) throw (RuntimeException)
490*cdf0e10cSrcweir {
491*cdf0e10cSrcweir     Sequence< ::rtl::OUString > aModes(1);
492*cdf0e10cSrcweir     aModes[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) );
493*cdf0e10cSrcweir     return aModes;
494*cdf0e10cSrcweir }
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir //------------------------------------------------------------------
497*cdf0e10cSrcweir ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::supportsMode( const ::rtl::OUString& aMode ) throw (RuntimeException)
498*cdf0e10cSrcweir {
499*cdf0e10cSrcweir     return aMode.compareToAscii( "DataMode" ) == 0;
500*cdf0e10cSrcweir }
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir //------------------------------------------------------------------
503*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setModel(const Reference< ::com::sun::star::awt::XTabControllerModel > & /*Model*/) throw( RuntimeException )
504*cdf0e10cSrcweir {
505*cdf0e10cSrcweir 	OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setModel : invalid call, can't change my model !");
506*cdf0e10cSrcweir }
507*cdf0e10cSrcweir 
508*cdf0e10cSrcweir //------------------------------------------------------------------
509*cdf0e10cSrcweir Reference< ::com::sun::star::awt::XTabControllerModel >  SAL_CALL SbaXDataBrowserController::FormControllerImpl::getModel(void) throw( RuntimeException )
510*cdf0e10cSrcweir {
511*cdf0e10cSrcweir 	return Reference< XTabControllerModel >(m_pOwner->getRowSet(), UNO_QUERY);
512*cdf0e10cSrcweir }
513*cdf0e10cSrcweir 
514*cdf0e10cSrcweir //------------------------------------------------------------------
515*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContainer(const Reference< ::com::sun::star::awt::XControlContainer > & /*_Container*/) throw( RuntimeException )
516*cdf0e10cSrcweir {
517*cdf0e10cSrcweir 	OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setContainer : invalid call, can't change my container !");
518*cdf0e10cSrcweir }
519*cdf0e10cSrcweir 
520*cdf0e10cSrcweir //------------------------------------------------------------------
521*cdf0e10cSrcweir Reference< ::com::sun::star::awt::XControlContainer >  SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContainer(void) throw( RuntimeException )
522*cdf0e10cSrcweir {
523*cdf0e10cSrcweir 	if (m_pOwner->getBrowserView())
524*cdf0e10cSrcweir 		return m_pOwner->getBrowserView()->getContainer();
525*cdf0e10cSrcweir 	return Reference< ::com::sun::star::awt::XControlContainer > ();
526*cdf0e10cSrcweir }
527*cdf0e10cSrcweir 
528*cdf0e10cSrcweir //------------------------------------------------------------------
529*cdf0e10cSrcweir Sequence< Reference< ::com::sun::star::awt::XControl > > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getControls(void) throw( RuntimeException )
530*cdf0e10cSrcweir {
531*cdf0e10cSrcweir 	if (m_pOwner->getBrowserView())
532*cdf0e10cSrcweir 	{
533*cdf0e10cSrcweir 		Reference< ::com::sun::star::awt::XControl >  xGrid = m_pOwner->getBrowserView()->getGridControl();
534*cdf0e10cSrcweir 		return Sequence< Reference< ::com::sun::star::awt::XControl > >(&xGrid, 1);
535*cdf0e10cSrcweir 	}
536*cdf0e10cSrcweir 	return Sequence< Reference< ::com::sun::star::awt::XControl > >();
537*cdf0e10cSrcweir }
538*cdf0e10cSrcweir 
539*cdf0e10cSrcweir //------------------------------------------------------------------
540*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::autoTabOrder(void) throw( RuntimeException )
541*cdf0e10cSrcweir {
542*cdf0e10cSrcweir 	OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::autoTabOrder : nothing to do (always have only one control) !");
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir //------------------------------------------------------------------
546*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateTabOrder(void) throw( RuntimeException )
547*cdf0e10cSrcweir {
548*cdf0e10cSrcweir 	OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::activateTabOrder : nothing to do (always have only one control) !");
549*cdf0e10cSrcweir }
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir //------------------------------------------------------------------
552*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateFirst(void) throw( RuntimeException )
553*cdf0e10cSrcweir {
554*cdf0e10cSrcweir 	if (m_pOwner->getBrowserView())
555*cdf0e10cSrcweir 		m_pOwner->getBrowserView()->getVclControl()->ActivateCell();
556*cdf0e10cSrcweir }
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir //------------------------------------------------------------------
559*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateLast(void) throw( RuntimeException )
560*cdf0e10cSrcweir {
561*cdf0e10cSrcweir 	if (m_pOwner->getBrowserView())
562*cdf0e10cSrcweir 		m_pOwner->getBrowserView()->getVclControl()->ActivateCell();
563*cdf0e10cSrcweir }
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir //------------------------------------------------------------------
566*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::frameAction(const ::com::sun::star::frame::FrameActionEvent& /*aEvent*/) throw( RuntimeException )
567*cdf0e10cSrcweir {
568*cdf0e10cSrcweir }
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir //------------------------------------------------------------------
571*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException )
572*cdf0e10cSrcweir {
573*cdf0e10cSrcweir 	// nothing to do
574*cdf0e10cSrcweir 	// we don't add ourself as listener to any broadcasters, so we are not resposible for removing us
575*cdf0e10cSrcweir }
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir //==================================================================
578*cdf0e10cSrcweir //= SbaXDataBrowserController
579*cdf0e10cSrcweir //==================================================================
580*cdf0e10cSrcweir //------------------------------------------------------------------
581*cdf0e10cSrcweir Sequence< Type > SAL_CALL SbaXDataBrowserController::getTypes(	) throw (RuntimeException)
582*cdf0e10cSrcweir {
583*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getTypes" );
584*cdf0e10cSrcweir 	return ::comphelper::concatSequences(
585*cdf0e10cSrcweir 		SbaXDataBrowserController_Base::getTypes(),
586*cdf0e10cSrcweir 		m_pFormControllerImpl->getTypes()
587*cdf0e10cSrcweir 	);
588*cdf0e10cSrcweir }
589*cdf0e10cSrcweir 
590*cdf0e10cSrcweir //------------------------------------------------------------------
591*cdf0e10cSrcweir Sequence< sal_Int8 > SAL_CALL SbaXDataBrowserController::getImplementationId(  ) throw (RuntimeException)
592*cdf0e10cSrcweir {
593*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getImplementationId" );
594*cdf0e10cSrcweir 	static ::cppu::OImplementationId * pId = 0;
595*cdf0e10cSrcweir 	if (! pId)
596*cdf0e10cSrcweir 	{
597*cdf0e10cSrcweir 		::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
598*cdf0e10cSrcweir 		if (! pId)
599*cdf0e10cSrcweir 		{
600*cdf0e10cSrcweir 			static ::cppu::OImplementationId aId;
601*cdf0e10cSrcweir 			pId = &aId;
602*cdf0e10cSrcweir 		}
603*cdf0e10cSrcweir 	}
604*cdf0e10cSrcweir 	return pId->getImplementationId();
605*cdf0e10cSrcweir }
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir //------------------------------------------------------------------
608*cdf0e10cSrcweir Any SAL_CALL SbaXDataBrowserController::queryInterface(const Type& _rType) throw (RuntimeException)
609*cdf0e10cSrcweir {
610*cdf0e10cSrcweir 	// check for our additional interfaces
611*cdf0e10cSrcweir 	Any aRet = SbaXDataBrowserController_Base::queryInterface(_rType);
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir 	// check for our aggregate (implementing the XFormController)
614*cdf0e10cSrcweir 	if (!aRet.hasValue())
615*cdf0e10cSrcweir 		aRet = m_xFormControllerImpl->queryAggregation(_rType);
616*cdf0e10cSrcweir 
617*cdf0e10cSrcweir 	// no more to offer
618*cdf0e10cSrcweir 	return aRet;
619*cdf0e10cSrcweir }
620*cdf0e10cSrcweir 
621*cdf0e10cSrcweir DBG_NAME(SbaXDataBrowserController)
622*cdf0e10cSrcweir //------------------------------------------------------------------------------
623*cdf0e10cSrcweir SbaXDataBrowserController::SbaXDataBrowserController(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM)
624*cdf0e10cSrcweir 	:SbaXDataBrowserController_Base(_rM)
625*cdf0e10cSrcweir     ,m_nRowSetPrivileges(0)
626*cdf0e10cSrcweir     ,m_pClipbordNotifier( NULL )
627*cdf0e10cSrcweir 	,m_aAsyncGetCellFocus(LINK(this, SbaXDataBrowserController, OnAsyncGetCellFocus))
628*cdf0e10cSrcweir     ,m_aAsyncDisplayError( LINK( this, SbaXDataBrowserController, OnAsyncDisplayError ) )
629*cdf0e10cSrcweir 	,m_sStateSaveRecord(ModuleRes(RID_STR_SAVE_CURRENT_RECORD))
630*cdf0e10cSrcweir 	,m_sStateUndoRecord(ModuleRes(RID_STR_UNDO_MODIFY_RECORD))
631*cdf0e10cSrcweir     ,m_sModuleIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DataSourceBrowser" ) ) )
632*cdf0e10cSrcweir 	,m_pFormControllerImpl(NULL)
633*cdf0e10cSrcweir 	,m_nPendingLoadFinished(0)
634*cdf0e10cSrcweir 	,m_nFormActionNestingLevel(0)
635*cdf0e10cSrcweir 	,m_bLoadCanceled( sal_False )
636*cdf0e10cSrcweir     ,m_bClosingKillOpen( sal_False )
637*cdf0e10cSrcweir     ,m_bCannotSelectUnfiltered( true )
638*cdf0e10cSrcweir {
639*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SbaXDataBrowserController" );
640*cdf0e10cSrcweir     DBG_CTOR(SbaXDataBrowserController,NULL);
641*cdf0e10cSrcweir 
642*cdf0e10cSrcweir 	// create the form controller aggregate
643*cdf0e10cSrcweir 	::comphelper::increment(m_refCount);
644*cdf0e10cSrcweir 	{
645*cdf0e10cSrcweir 		m_pFormControllerImpl = new FormControllerImpl(this);
646*cdf0e10cSrcweir 		m_xFormControllerImpl = m_pFormControllerImpl;
647*cdf0e10cSrcweir 		m_xFormControllerImpl->setDelegator(*this);
648*cdf0e10cSrcweir 	}
649*cdf0e10cSrcweir 	::comphelper::decrement(m_refCount);
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir     m_aInvalidateClipboard.SetTimeoutHdl(LINK(this, SbaXDataBrowserController, OnInvalidateClipboard));
652*cdf0e10cSrcweir 	m_aInvalidateClipboard.SetTimeout(300);
653*cdf0e10cSrcweir }
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir //------------------------------------------------------------------------------
656*cdf0e10cSrcweir SbaXDataBrowserController::~SbaXDataBrowserController()
657*cdf0e10cSrcweir {
658*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::~SbaXDataBrowserController" );
659*cdf0e10cSrcweir 	//	deleteView();
660*cdf0e10cSrcweir 	// release the aggregated form controller
661*cdf0e10cSrcweir 	if (m_xFormControllerImpl.is())
662*cdf0e10cSrcweir 	{
663*cdf0e10cSrcweir 		Reference< XInterface >  xEmpty;
664*cdf0e10cSrcweir 		m_xFormControllerImpl->setDelegator(xEmpty);
665*cdf0e10cSrcweir 	}
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir     DBG_DTOR(SbaXDataBrowserController,NULL);
668*cdf0e10cSrcweir }
669*cdf0e10cSrcweir 
670*cdf0e10cSrcweir // -----------------------------------------------------------------------
671*cdf0e10cSrcweir void SbaXDataBrowserController::startFrameListening( const Reference< XFrame >& _rxFrame )
672*cdf0e10cSrcweir {
673*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::startFrameListening" );
674*cdf0e10cSrcweir     SbaXDataBrowserController_Base::startFrameListening( _rxFrame );
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir     Reference< XFrameActionListener >	xAggListener;
677*cdf0e10cSrcweir 	if ( m_xFormControllerImpl.is() )
678*cdf0e10cSrcweir         m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener;
679*cdf0e10cSrcweir 
680*cdf0e10cSrcweir     if ( _rxFrame.is() && xAggListener.is() )
681*cdf0e10cSrcweir 		_rxFrame->addFrameActionListener( xAggListener );
682*cdf0e10cSrcweir }
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir // -----------------------------------------------------------------------
685*cdf0e10cSrcweir void SbaXDataBrowserController::stopFrameListening( const Reference< XFrame >& _rxFrame )
686*cdf0e10cSrcweir {
687*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::stopFrameListening" );
688*cdf0e10cSrcweir     SbaXDataBrowserController_Base::stopFrameListening( _rxFrame );
689*cdf0e10cSrcweir 
690*cdf0e10cSrcweir     Reference< XFrameActionListener >	xAggListener;
691*cdf0e10cSrcweir 	if ( m_xFormControllerImpl.is() )
692*cdf0e10cSrcweir         m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener;
693*cdf0e10cSrcweir 
694*cdf0e10cSrcweir 	if ( _rxFrame.is() && xAggListener.is() )
695*cdf0e10cSrcweir 		_rxFrame->removeFrameActionListener( xAggListener );
696*cdf0e10cSrcweir }
697*cdf0e10cSrcweir 
698*cdf0e10cSrcweir // -----------------------------------------------------------------------------
699*cdf0e10cSrcweir void SbaXDataBrowserController::onStartLoading( const Reference< XLoadable >& _rxLoadable )
700*cdf0e10cSrcweir {
701*cdf0e10cSrcweir     m_bLoadCanceled = sal_False;
702*cdf0e10cSrcweir     m_bCannotSelectUnfiltered = false;
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir     Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY );
705*cdf0e10cSrcweir     if ( xWarnings.is() )
706*cdf0e10cSrcweir         xWarnings->clearWarnings();
707*cdf0e10cSrcweir }
708*cdf0e10cSrcweir 
709*cdf0e10cSrcweir // -----------------------------------------------------------------------------
710*cdf0e10cSrcweir void SbaXDataBrowserController::impl_checkForCannotSelectUnfiltered( const SQLExceptionInfo& _rError )
711*cdf0e10cSrcweir {
712*cdf0e10cSrcweir     ::connectivity::SQLError aError( getORB() );
713*cdf0e10cSrcweir     ::connectivity::ErrorCode nErrorCode( aError.getErrorCode( ErrorCondition::DATA_CANNOT_SELECT_UNFILTERED ) );
714*cdf0e10cSrcweir     if ( ((const SQLException*)_rError)->ErrorCode == nErrorCode )
715*cdf0e10cSrcweir     {
716*cdf0e10cSrcweir         m_bCannotSelectUnfiltered = true;
717*cdf0e10cSrcweir         InvalidateFeature( ID_BROWSER_FILTERCRIT );
718*cdf0e10cSrcweir     }
719*cdf0e10cSrcweir }
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir // -----------------------------------------------------------------------------
722*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::reloadForm( const Reference< XLoadable >& _rxLoadable )
723*cdf0e10cSrcweir {
724*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloadForm" );
725*cdf0e10cSrcweir 	WaitObject aWO(getBrowserView());
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir 	onStartLoading( _rxLoadable );
728*cdf0e10cSrcweir 
729*cdf0e10cSrcweir 	FormErrorHelper aReportError(this);
730*cdf0e10cSrcweir 	if (_rxLoadable->isLoaded())
731*cdf0e10cSrcweir 		_rxLoadable->reload();
732*cdf0e10cSrcweir 	else
733*cdf0e10cSrcweir 		_rxLoadable->load();
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir     m_xParser.clear();
736*cdf0e10cSrcweir     const Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
737*cdf0e10cSrcweir 	if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)))
738*cdf0e10cSrcweir         xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser;
739*cdf0e10cSrcweir #if 0
740*cdf0e10cSrcweir     {
741*cdf0e10cSrcweir         const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY );
742*cdf0e10cSrcweir         const Reference< XSingleSelectQueryAnalyzer > xAnalyzer( xRowSetProps->getPropertyValue( PROPERTY_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY );
743*cdf0e10cSrcweir         if ( xAnalyzer.is() )
744*cdf0e10cSrcweir         {
745*cdf0e10cSrcweir             const Reference< XIndexAccess > xOrderColumns( xAnalyzer->getOrderColumns(), UNO_SET_THROW );
746*cdf0e10cSrcweir             const sal_Int32 nOrderColumns( xOrderColumns->getCount() );
747*cdf0e10cSrcweir             for ( sal_Int32 c=0; c<nOrderColumns; ++c )
748*cdf0e10cSrcweir             {
749*cdf0e10cSrcweir                 const Reference< XPropertySet > xOrderColumn( xOrderColumns->getByIndex(c), UNO_QUERY_THROW );
750*cdf0e10cSrcweir                 ::rtl::OUString sColumnName;
751*cdf0e10cSrcweir                 OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_NAME ) >>= sColumnName);
752*cdf0e10cSrcweir                 ::rtl::OUString sTableName;
753*cdf0e10cSrcweir                 OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_TABLENAME ) >>= sTableName);
754*cdf0e10cSrcweir                 (void)sColumnName;
755*cdf0e10cSrcweir                 (void)sTableName;
756*cdf0e10cSrcweir             }
757*cdf0e10cSrcweir         }
758*cdf0e10cSrcweir     }
759*cdf0e10cSrcweir #endif
760*cdf0e10cSrcweir 
761*cdf0e10cSrcweir     Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY );
762*cdf0e10cSrcweir     if ( xWarnings.is() )
763*cdf0e10cSrcweir     {
764*cdf0e10cSrcweir         try
765*cdf0e10cSrcweir         {
766*cdf0e10cSrcweir 	        SQLExceptionInfo aInfo( xWarnings->getWarnings() );
767*cdf0e10cSrcweir 	        if ( aInfo.isValid() )
768*cdf0e10cSrcweir             {
769*cdf0e10cSrcweir                 showError( aInfo );
770*cdf0e10cSrcweir                 impl_checkForCannotSelectUnfiltered( aInfo );
771*cdf0e10cSrcweir             }
772*cdf0e10cSrcweir         }
773*cdf0e10cSrcweir         catch(const SQLException& e)
774*cdf0e10cSrcweir         {
775*cdf0e10cSrcweir             (void)e;
776*cdf0e10cSrcweir         }
777*cdf0e10cSrcweir     }
778*cdf0e10cSrcweir 
779*cdf0e10cSrcweir 	return _rxLoadable->isLoaded();
780*cdf0e10cSrcweir }
781*cdf0e10cSrcweir 
782*cdf0e10cSrcweir // -----------------------------------------------------------------------------
783*cdf0e10cSrcweir void SbaXDataBrowserController::initFormatter()
784*cdf0e10cSrcweir {
785*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initFormatter" );
786*cdf0e10cSrcweir 	// ---------------------------------------------------------------
787*cdf0e10cSrcweir 	// create a formatter working with the connections format supplier
788*cdf0e10cSrcweir 	Reference< ::com::sun::star::util::XNumberFormatsSupplier >  xSupplier(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB()));
789*cdf0e10cSrcweir 
790*cdf0e10cSrcweir 	if(xSupplier.is())
791*cdf0e10cSrcweir 	{
792*cdf0e10cSrcweir 		// create a new formatter
793*cdf0e10cSrcweir 		m_xFormatter = Reference< ::com::sun::star::util::XNumberFormatter > (
794*cdf0e10cSrcweir 			getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY);
795*cdf0e10cSrcweir 		if (m_xFormatter.is())
796*cdf0e10cSrcweir 			m_xFormatter->attachNumberFormatsSupplier(xSupplier);
797*cdf0e10cSrcweir 	}
798*cdf0e10cSrcweir 	else // clear the formatter
799*cdf0e10cSrcweir 		m_xFormatter = NULL;
800*cdf0e10cSrcweir }
801*cdf0e10cSrcweir // -----------------------------------------------------------------------------
802*cdf0e10cSrcweir void SbaXDataBrowserController::describeSupportedFeatures()
803*cdf0e10cSrcweir {
804*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::describeSupportedFeatures" );
805*cdf0e10cSrcweir 	SbaXDataBrowserController_Base::describeSupportedFeatures();
806*cdf0e10cSrcweir     implDescribeSupportedFeature( ".uno:FormSlots/undoRecord",      ID_BROWSER_UNDORECORD,  CommandGroup::CONTROLS );
807*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:FormController/undoRecord", ID_BROWSER_UNDORECORD,  CommandGroup::CONTROLS );
808*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:RecUndo",                   ID_BROWSER_UNDORECORD,  CommandGroup::CONTROLS );
809*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:FormSlots/saveRecord",      ID_BROWSER_SAVERECORD,  CommandGroup::CONTROLS );
810*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:FormController/saveRecord", ID_BROWSER_SAVERECORD,  CommandGroup::CONTROLS );
811*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:RecSave",                   ID_BROWSER_SAVERECORD,  CommandGroup::CONTROLS );
812*cdf0e10cSrcweir     implDescribeSupportedFeature( ".uno:Save",                      ID_BROWSER_SAVERECORD,  CommandGroup::DOCUMENT );
813*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:RecSearch",                 SID_FM_SEARCH,          CommandGroup::CONTROLS );
814*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:AutoFilter",                SID_FM_AUTOFILTER,      CommandGroup::CONTROLS );
815*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:Refresh",                   SID_FM_REFRESH,         CommandGroup::CONTROLS );
816*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:OrderCrit",                 SID_FM_ORDERCRIT,       CommandGroup::CONTROLS );
817*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:RemoveFilterSort",          SID_FM_REMOVE_FILTER_SORT,CommandGroup::CONTROLS );
818*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:FormFiltered",              SID_FM_FORM_FILTERED,   CommandGroup::CONTROLS );
819*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:FilterCrit",                SID_FM_FILTERCRIT,      CommandGroup::CONTROLS );
820*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:Sortup",                    ID_BROWSER_SORTUP,      CommandGroup::CONTROLS );
821*cdf0e10cSrcweir 	implDescribeSupportedFeature( ".uno:SortDown",                  ID_BROWSER_SORTDOWN,    CommandGroup::CONTROLS );
822*cdf0e10cSrcweir     implDescribeSupportedFeature( ".uno:FormSlots/deleteRecord",    SID_FM_DELETEROWS,      CommandGroup::EDIT );
823*cdf0e10cSrcweir     implDescribeSupportedFeature( ".uno:FormSlots/insertRecord",    ID_BROWSER_INSERT_ROW,  CommandGroup::INSERT );
824*cdf0e10cSrcweir }
825*cdf0e10cSrcweir //------------------------------------------------------------------------------
826*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::Construct(Window* pParent)
827*cdf0e10cSrcweir {
828*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Construct" );
829*cdf0e10cSrcweir 	// ---------------------------------------------
830*cdf0e10cSrcweir 	// create/initialize the form and the grid model
831*cdf0e10cSrcweir 	m_xRowSet = CreateForm();
832*cdf0e10cSrcweir 	if (!m_xRowSet.is())
833*cdf0e10cSrcweir 		return sal_False;
834*cdf0e10cSrcweir 
835*cdf0e10cSrcweir 	m_xColumnsSupplier.set(m_xRowSet,UNO_QUERY);
836*cdf0e10cSrcweir 	m_xLoadable.set(m_xRowSet,UNO_QUERY);
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir     Reference< XPropertySet > xFormProperties( m_xRowSet, UNO_QUERY );
839*cdf0e10cSrcweir 	if ( !InitializeForm( xFormProperties ) )
840*cdf0e10cSrcweir 		return sal_False;
841*cdf0e10cSrcweir 
842*cdf0e10cSrcweir 	m_xGridModel = CreateGridModel();
843*cdf0e10cSrcweir 	if (!m_xGridModel.is())
844*cdf0e10cSrcweir 		return sal_False;
845*cdf0e10cSrcweir 
846*cdf0e10cSrcweir 	// set the formatter if available
847*cdf0e10cSrcweir 	initFormatter();
848*cdf0e10cSrcweir 	// ---------------------------------------------------------------
849*cdf0e10cSrcweir 
850*cdf0e10cSrcweir 	// we want to have a grid with a "flat" border
851*cdf0e10cSrcweir 	Reference< XPropertySet >  xGridSet(m_xGridModel, UNO_QUERY);
852*cdf0e10cSrcweir 	if ( xGridSet.is() )
853*cdf0e10cSrcweir 		xGridSet->setPropertyValue(PROPERTY_BORDER, makeAny((sal_Int16)2));
854*cdf0e10cSrcweir 
855*cdf0e10cSrcweir 	// ----------
856*cdf0e10cSrcweir 	// marry them
857*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XNameContainer >  xNameCont(m_xRowSet, UNO_QUERY);
858*cdf0e10cSrcweir 	{
859*cdf0e10cSrcweir 		String sText(ModuleRes(STR_DATASOURCE_GRIDCONTROL_NAME));
860*cdf0e10cSrcweir 		xNameCont->insertByName(::rtl::OUString(sText), makeAny(m_xGridModel));
861*cdf0e10cSrcweir 	}
862*cdf0e10cSrcweir 
863*cdf0e10cSrcweir 	// ---------------
864*cdf0e10cSrcweir 	// create the view
865*cdf0e10cSrcweir 	setView( * new UnoDataBrowserView( pParent, *this, getORB() ) );
866*cdf0e10cSrcweir 	if (!getBrowserView())
867*cdf0e10cSrcweir 		return sal_False;
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir 	// late construction
870*cdf0e10cSrcweir 	sal_Bool bSuccess = sal_False;
871*cdf0e10cSrcweir 	try
872*cdf0e10cSrcweir 	{
873*cdf0e10cSrcweir 		getBrowserView()->Construct(getControlModel());
874*cdf0e10cSrcweir 		bSuccess = sal_True;
875*cdf0e10cSrcweir 	}
876*cdf0e10cSrcweir 	catch(SQLException&)
877*cdf0e10cSrcweir 	{
878*cdf0e10cSrcweir 	}
879*cdf0e10cSrcweir 	catch(Exception&)
880*cdf0e10cSrcweir 	{
881*cdf0e10cSrcweir 		DBG_ERROR("SbaXDataBrowserController::Construct : the construction of UnoDataBrowserView failed !");
882*cdf0e10cSrcweir 	}
883*cdf0e10cSrcweir 
884*cdf0e10cSrcweir 	if (!bSuccess)
885*cdf0e10cSrcweir 	{
886*cdf0e10cSrcweir 		//	deleteView();
887*cdf0e10cSrcweir 		return sal_False;
888*cdf0e10cSrcweir 	}
889*cdf0e10cSrcweir 
890*cdf0e10cSrcweir 	// now that we have a view we can create the clipboard listener
891*cdf0e10cSrcweir 	m_aSystemClipboard = TransferableDataHelper::CreateFromSystemClipboard( getView() );
892*cdf0e10cSrcweir 	m_aSystemClipboard.StartClipboardListening( );
893*cdf0e10cSrcweir 
894*cdf0e10cSrcweir 	m_pClipbordNotifier = new TransferableClipboardListener( LINK( this, SbaXDataBrowserController, OnClipboardChanged ) );
895*cdf0e10cSrcweir 	m_pClipbordNotifier->acquire();
896*cdf0e10cSrcweir 	m_pClipbordNotifier->AddRemoveListener( getView(), sal_True );
897*cdf0e10cSrcweir 
898*cdf0e10cSrcweir     // this call create the toolbox
899*cdf0e10cSrcweir 	SbaXDataBrowserController_Base::Construct(pParent);
900*cdf0e10cSrcweir 
901*cdf0e10cSrcweir 	getBrowserView()->Show();
902*cdf0e10cSrcweir 
903*cdf0e10cSrcweir 	// set the callbacks for the grid control
904*cdf0e10cSrcweir 	SbaGridControl* pVclGrid = getBrowserView()->getVclControl();
905*cdf0e10cSrcweir 	DBG_ASSERT(pVclGrid, "SbaXDataBrowserController::Construct : have no VCL control !");
906*cdf0e10cSrcweir 	pVclGrid->SetMasterListener(this);
907*cdf0e10cSrcweir 
908*cdf0e10cSrcweir 	// --------------------------
909*cdf0e10cSrcweir 	// add listeners ...
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir 	// ... to the form model
912*cdf0e10cSrcweir 	Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
913*cdf0e10cSrcweir 	if (xFormSet.is())
914*cdf0e10cSrcweir 	{
915*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this));
916*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this));
917*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this));
918*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this));
919*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this));
920*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this));
921*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this));
922*cdf0e10cSrcweir 		xFormSet->addPropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this));
923*cdf0e10cSrcweir 	}
924*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster >  xFormError(getRowSet(), UNO_QUERY);
925*cdf0e10cSrcweir 	if (xFormError.is())
926*cdf0e10cSrcweir 		xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this);
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir 	if (m_xLoadable.is())
929*cdf0e10cSrcweir 		m_xLoadable->addLoadListener(this);
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster >	xFormParameter(getRowSet(), UNO_QUERY);
932*cdf0e10cSrcweir 	if (xFormParameter.is())
933*cdf0e10cSrcweir 		xFormParameter->addParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this);
934*cdf0e10cSrcweir 
935*cdf0e10cSrcweir 	addModelListeners(getControlModel());
936*cdf0e10cSrcweir 	addControlListeners(getBrowserView()->getGridControl());
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir 	// -------------
939*cdf0e10cSrcweir 	// load the form
940*cdf0e10cSrcweir 	return LoadForm();
941*cdf0e10cSrcweir }
942*cdf0e10cSrcweir 
943*cdf0e10cSrcweir //------------------------------------------------------------------------------
944*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::LoadForm()
945*cdf0e10cSrcweir {
946*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadForm" );
947*cdf0e10cSrcweir 	reloadForm( m_xLoadable );
948*cdf0e10cSrcweir 	return sal_True;
949*cdf0e10cSrcweir }
950*cdf0e10cSrcweir //------------------------------------------------------------------------------
951*cdf0e10cSrcweir void SbaXDataBrowserController::AddColumnListener(const Reference< XPropertySet > & /*xCol*/)
952*cdf0e10cSrcweir {
953*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AddColumnListener" );
954*cdf0e10cSrcweir 	// we're not interested in any column properties ...
955*cdf0e10cSrcweir }
956*cdf0e10cSrcweir 
957*cdf0e10cSrcweir //------------------------------------------------------------------------------
958*cdf0e10cSrcweir void SbaXDataBrowserController::RemoveColumnListener(const Reference< XPropertySet > & /*xCol*/)
959*cdf0e10cSrcweir {
960*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RemoveColumnListener" );
961*cdf0e10cSrcweir }
962*cdf0e10cSrcweir //------------------------------------------------------------------------------
963*cdf0e10cSrcweir Reference< XRowSet >  SbaXDataBrowserController::CreateForm()
964*cdf0e10cSrcweir {
965*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateForm" );
966*cdf0e10cSrcweir 	return Reference< XRowSet > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.Form")), UNO_QUERY);
967*cdf0e10cSrcweir }
968*cdf0e10cSrcweir 
969*cdf0e10cSrcweir //------------------------------------------------------------------------------
970*cdf0e10cSrcweir Reference< ::com::sun::star::form::XFormComponent >  SbaXDataBrowserController::CreateGridModel()
971*cdf0e10cSrcweir {
972*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateGridModel" );
973*cdf0e10cSrcweir 	return Reference< ::com::sun::star::form::XFormComponent > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.GridControl")), UNO_QUERY);
974*cdf0e10cSrcweir }
975*cdf0e10cSrcweir 
976*cdf0e10cSrcweir // -------------------------------------------------------------------------
977*cdf0e10cSrcweir void SbaXDataBrowserController::addModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel)
978*cdf0e10cSrcweir {
979*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addModelListeners" );
980*cdf0e10cSrcweir 	// ... all the grid columns
981*cdf0e10cSrcweir 	addColumnListeners(_xGridControlModel);
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir 	// (we are interested in all columns the grid has (and only in these) so we have to listen to the container, too)
984*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XContainer >  xColContainer(_xGridControlModel, UNO_QUERY);
985*cdf0e10cSrcweir 	if (xColContainer.is())
986*cdf0e10cSrcweir 		xColContainer->addContainerListener((::com::sun::star::container::XContainerListener*)this);
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XReset >  xReset(_xGridControlModel, UNO_QUERY);
989*cdf0e10cSrcweir 	if (xReset.is())
990*cdf0e10cSrcweir 		xReset->addResetListener((::com::sun::star::form::XResetListener*)this);
991*cdf0e10cSrcweir }
992*cdf0e10cSrcweir 
993*cdf0e10cSrcweir // -------------------------------------------------------------------------
994*cdf0e10cSrcweir void SbaXDataBrowserController::removeModelListeners(const Reference< XControlModel > & _xGridControlModel)
995*cdf0e10cSrcweir {
996*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeModelListeners" );
997*cdf0e10cSrcweir 	// every single column model
998*cdf0e10cSrcweir 	Reference< XIndexContainer >  xColumns(_xGridControlModel, UNO_QUERY);
999*cdf0e10cSrcweir 	if (xColumns.is())
1000*cdf0e10cSrcweir 	{
1001*cdf0e10cSrcweir 		sal_Int32 nCount = xColumns->getCount();
1002*cdf0e10cSrcweir 		for (sal_uInt16 i=0; i < nCount; ++i)
1003*cdf0e10cSrcweir 		{
1004*cdf0e10cSrcweir 			Reference< XPropertySet >  xCol(xColumns->getByIndex(i),UNO_QUERY);
1005*cdf0e10cSrcweir 			RemoveColumnListener(xCol);
1006*cdf0e10cSrcweir 		}
1007*cdf0e10cSrcweir 	}
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir 	Reference< XContainer >  xColContainer(_xGridControlModel, UNO_QUERY);
1010*cdf0e10cSrcweir 	if (xColContainer.is())
1011*cdf0e10cSrcweir 		xColContainer->removeContainerListener( this );
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir 	Reference< XReset >  xReset(_xGridControlModel, UNO_QUERY);
1014*cdf0e10cSrcweir 	if (xReset.is())
1015*cdf0e10cSrcweir 		xReset->removeResetListener( this );
1016*cdf0e10cSrcweir }
1017*cdf0e10cSrcweir 
1018*cdf0e10cSrcweir // -------------------------------------------------------------------------
1019*cdf0e10cSrcweir void SbaXDataBrowserController::addControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl)
1020*cdf0e10cSrcweir {
1021*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addControlListeners" );
1022*cdf0e10cSrcweir 	// to ge the 'modified' for the current cell
1023*cdf0e10cSrcweir 	Reference< XModifyBroadcaster >  xBroadcaster(getBrowserView()->getGridControl(), UNO_QUERY);
1024*cdf0e10cSrcweir 	if (xBroadcaster.is())
1025*cdf0e10cSrcweir 		xBroadcaster->addModifyListener(static_cast<XModifyListener*>(this));
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir 	// introduce ourself as dispatch provider for the grid
1028*cdf0e10cSrcweir 	Reference< XDispatchProviderInterception >	xInterception(getBrowserView()->getGridControl(), UNO_QUERY);
1029*cdf0e10cSrcweir 	if (xInterception.is())
1030*cdf0e10cSrcweir 		xInterception->registerDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this));
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir 	// add as focus listener to the control (needed for the form controller functionality)
1033*cdf0e10cSrcweir 	Reference< XWindow >  xWindow(_xGridControl, UNO_QUERY);
1034*cdf0e10cSrcweir 	if (xWindow.is())
1035*cdf0e10cSrcweir 		xWindow->addFocusListener(this);
1036*cdf0e10cSrcweir }
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir // -------------------------------------------------------------------------
1039*cdf0e10cSrcweir void SbaXDataBrowserController::removeControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl)
1040*cdf0e10cSrcweir {
1041*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeControlListeners" );
1042*cdf0e10cSrcweir 	Reference< XModifyBroadcaster >  xBroadcaster(_xGridControl, UNO_QUERY);
1043*cdf0e10cSrcweir 	if (xBroadcaster.is())
1044*cdf0e10cSrcweir 		xBroadcaster->removeModifyListener(static_cast<XModifyListener*>(this));
1045*cdf0e10cSrcweir 
1046*cdf0e10cSrcweir 	Reference< XDispatchProviderInterception >	xInterception(_xGridControl, UNO_QUERY);
1047*cdf0e10cSrcweir 	if (xInterception.is())
1048*cdf0e10cSrcweir 		xInterception->releaseDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this));
1049*cdf0e10cSrcweir 
1050*cdf0e10cSrcweir 	Reference< XWindow >  xWindow(_xGridControl, UNO_QUERY);
1051*cdf0e10cSrcweir 	if (xWindow.is())
1052*cdf0e10cSrcweir 		xWindow->removeFocusListener(this);
1053*cdf0e10cSrcweir }
1054*cdf0e10cSrcweir 
1055*cdf0e10cSrcweir //------------------------------------------------------------------
1056*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::focusGained(const FocusEvent& /*e*/) throw( RuntimeException )
1057*cdf0e10cSrcweir {
1058*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusGained" );
1059*cdf0e10cSrcweir 	// notify our activate listeners (registered on the form controller aggregate)
1060*cdf0e10cSrcweir 	EventObject aEvt(*this);
1061*cdf0e10cSrcweir 	::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners);
1062*cdf0e10cSrcweir 	while (aIter.hasMoreElements())
1063*cdf0e10cSrcweir 		static_cast<XFormControllerListener*>(aIter.next())->formActivated(aEvt);
1064*cdf0e10cSrcweir }
1065*cdf0e10cSrcweir 
1066*cdf0e10cSrcweir //------------------------------------------------------------------
1067*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::focusLost(const FocusEvent& e) throw( RuntimeException )
1068*cdf0e10cSrcweir {
1069*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusLost" );
1070*cdf0e10cSrcweir 	// some general checks
1071*cdf0e10cSrcweir 	if (!getBrowserView() || !getBrowserView()->getGridControl().is())
1072*cdf0e10cSrcweir 		return;
1073*cdf0e10cSrcweir 	Reference< XVclWindowPeer >  xMyGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY);
1074*cdf0e10cSrcweir 	if (!xMyGridPeer.is())
1075*cdf0e10cSrcweir 		return;
1076*cdf0e10cSrcweir 	Reference< XWindowPeer >  xNextControlPeer(e.NextFocus, UNO_QUERY);
1077*cdf0e10cSrcweir 	if (!xNextControlPeer.is())
1078*cdf0e10cSrcweir 		return;
1079*cdf0e10cSrcweir 
1080*cdf0e10cSrcweir 	// don't do a notification if it remains in the family (i.e. a child of the grid control gets the focus)
1081*cdf0e10cSrcweir 	if (xMyGridPeer->isChild(xNextControlPeer))
1082*cdf0e10cSrcweir 		return;
1083*cdf0e10cSrcweir 
1084*cdf0e10cSrcweir 	if (xMyGridPeer == xNextControlPeer)
1085*cdf0e10cSrcweir 		return;
1086*cdf0e10cSrcweir 
1087*cdf0e10cSrcweir 	// notify the listeners that the "form" we represent has been deactivated
1088*cdf0e10cSrcweir 	EventObject aEvt(*this);
1089*cdf0e10cSrcweir 	::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners);
1090*cdf0e10cSrcweir 	while (aIter.hasMoreElements())
1091*cdf0e10cSrcweir 		static_cast<XFormControllerListener*>(aIter.next())->formDeactivated(aEvt);
1092*cdf0e10cSrcweir 
1093*cdf0e10cSrcweir 	// commit the changes of the grid control (as we're deactivated)
1094*cdf0e10cSrcweir 	Reference< XBoundComponent >  xCommitable(getBrowserView()->getGridControl(), UNO_QUERY);
1095*cdf0e10cSrcweir 	if (xCommitable.is())
1096*cdf0e10cSrcweir 		xCommitable->commit();
1097*cdf0e10cSrcweir 	else
1098*cdf0e10cSrcweir 		OSL_ENSURE(sal_False, "SbaXDataBrowserController::focusLost : why is my control not commitable ?");
1099*cdf0e10cSrcweir }
1100*cdf0e10cSrcweir 
1101*cdf0e10cSrcweir // -------------------------------------------------------------------------
1102*cdf0e10cSrcweir void SbaXDataBrowserController::disposingGridControl(const ::com::sun::star::lang::EventObject& /*Source*/)
1103*cdf0e10cSrcweir {
1104*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridControl" );
1105*cdf0e10cSrcweir 	removeControlListeners(getBrowserView()->getGridControl());
1106*cdf0e10cSrcweir }
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir // -------------------------------------------------------------------------
1109*cdf0e10cSrcweir void SbaXDataBrowserController::disposingGridModel(const ::com::sun::star::lang::EventObject& /*Source*/)
1110*cdf0e10cSrcweir {
1111*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridModel" );
1112*cdf0e10cSrcweir 	removeModelListeners(getControlModel());
1113*cdf0e10cSrcweir }
1114*cdf0e10cSrcweir 
1115*cdf0e10cSrcweir // -------------------------------------------------------------------------
1116*cdf0e10cSrcweir void SbaXDataBrowserController::disposingFormModel(const ::com::sun::star::lang::EventObject& Source)
1117*cdf0e10cSrcweir {
1118*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingFormModel" );
1119*cdf0e10cSrcweir 	Reference< XPropertySet >  xSourceSet(Source.Source, UNO_QUERY);
1120*cdf0e10cSrcweir 	if (xSourceSet.is())
1121*cdf0e10cSrcweir 	{
1122*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this));
1123*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this));
1124*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this));
1125*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this));
1126*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this));
1127*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this));
1128*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this));
1129*cdf0e10cSrcweir 		xSourceSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this));
1130*cdf0e10cSrcweir 	}
1131*cdf0e10cSrcweir 
1132*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster >  xFormError(Source.Source, UNO_QUERY);
1133*cdf0e10cSrcweir 	if (xFormError.is())
1134*cdf0e10cSrcweir 		xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this);
1135*cdf0e10cSrcweir 
1136*cdf0e10cSrcweir 	if (m_xLoadable.is())
1137*cdf0e10cSrcweir 		m_xLoadable->removeLoadListener(this);
1138*cdf0e10cSrcweir 
1139*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster >	xFormParameter(Source.Source, UNO_QUERY);
1140*cdf0e10cSrcweir 	if (xFormParameter.is())
1141*cdf0e10cSrcweir 		xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this);
1142*cdf0e10cSrcweir }
1143*cdf0e10cSrcweir 
1144*cdf0e10cSrcweir // -------------------------------------------------------------------------
1145*cdf0e10cSrcweir void SbaXDataBrowserController::disposingColumnModel(const ::com::sun::star::lang::EventObject& Source)
1146*cdf0e10cSrcweir {
1147*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingColumnModel" );
1148*cdf0e10cSrcweir 	RemoveColumnListener(Reference< XPropertySet > (Source.Source, UNO_QUERY));
1149*cdf0e10cSrcweir }
1150*cdf0e10cSrcweir 
1151*cdf0e10cSrcweir // -------------------------------------------------------------------------
1152*cdf0e10cSrcweir void SbaXDataBrowserController::disposing(const EventObject& Source) throw( RuntimeException )
1153*cdf0e10cSrcweir {
1154*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposing" );
1155*cdf0e10cSrcweir 	// if it's a component other than our aggregate, forward it to the aggregate
1156*cdf0e10cSrcweir 	if ( m_xFormControllerImpl != Source.Source )
1157*cdf0e10cSrcweir 	{
1158*cdf0e10cSrcweir 		Reference< XEventListener > xAggListener;
1159*cdf0e10cSrcweir 		m_xFormControllerImpl->queryAggregation( ::getCppuType( &xAggListener ) ) >>= xAggListener;
1160*cdf0e10cSrcweir 		if ( xAggListener.is( ))
1161*cdf0e10cSrcweir 			xAggListener->disposing( Source );
1162*cdf0e10cSrcweir 	}
1163*cdf0e10cSrcweir 
1164*cdf0e10cSrcweir 	// is it the grid control ?
1165*cdf0e10cSrcweir 	if (getBrowserView())
1166*cdf0e10cSrcweir 	{
1167*cdf0e10cSrcweir 		Reference< ::com::sun::star::awt::XControl >  xSourceControl(Source.Source, UNO_QUERY);
1168*cdf0e10cSrcweir 		if (xSourceControl == getBrowserView()->getGridControl())
1169*cdf0e10cSrcweir 			disposingGridControl(Source);
1170*cdf0e10cSrcweir 	}
1171*cdf0e10cSrcweir 
1172*cdf0e10cSrcweir 	// it's model (the container of the columns) ?
1173*cdf0e10cSrcweir 	if (getControlModel() == Source.Source)
1174*cdf0e10cSrcweir 		disposingGridModel(Source);
1175*cdf0e10cSrcweir 
1176*cdf0e10cSrcweir 	// the form's model ?
1177*cdf0e10cSrcweir 	if ((getRowSet() == Source.Source))
1178*cdf0e10cSrcweir 		disposingFormModel(Source);
1179*cdf0e10cSrcweir 
1180*cdf0e10cSrcweir 	// from a single column model ?
1181*cdf0e10cSrcweir 	Reference< XPropertySet >  xSourceSet(Source.Source, UNO_QUERY);
1182*cdf0e10cSrcweir 	if (xSourceSet.is())
1183*cdf0e10cSrcweir 	{
1184*cdf0e10cSrcweir 		Reference< XPropertySetInfo >  xInfo = xSourceSet->getPropertySetInfo();
1185*cdf0e10cSrcweir 		// we assume that columns have a Width property and all other sets we are listening to don't have
1186*cdf0e10cSrcweir 		if (xInfo->hasPropertyByName(PROPERTY_WIDTH))
1187*cdf0e10cSrcweir 			disposingColumnModel(Source);
1188*cdf0e10cSrcweir 	}
1189*cdf0e10cSrcweir     SbaXDataBrowserController_Base::OGenericUnoController::disposing( Source );
1190*cdf0e10cSrcweir }
1191*cdf0e10cSrcweir 
1192*cdf0e10cSrcweir // -----------------------------------------------------------------------
1193*cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::setIdentifier( const ::rtl::OUString& _Identifier ) throw (RuntimeException)
1194*cdf0e10cSrcweir {
1195*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setIdentifier" );
1196*cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1197*cdf0e10cSrcweir     m_sModuleIdentifier = _Identifier;
1198*cdf0e10cSrcweir }
1199*cdf0e10cSrcweir 
1200*cdf0e10cSrcweir // -----------------------------------------------------------------------
1201*cdf0e10cSrcweir ::rtl::OUString SAL_CALL SbaXDataBrowserController::getIdentifier(  ) throw (RuntimeException)
1202*cdf0e10cSrcweir {
1203*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getIdentifier" );
1204*cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1205*cdf0e10cSrcweir     return m_sModuleIdentifier;
1206*cdf0e10cSrcweir }
1207*cdf0e10cSrcweir 
1208*cdf0e10cSrcweir // -----------------------------------------------------------------------
1209*cdf0e10cSrcweir void SbaXDataBrowserController::propertyChange(const PropertyChangeEvent& evt) throw ( RuntimeException )
1210*cdf0e10cSrcweir {
1211*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::propertyChange" );
1212*cdf0e10cSrcweir 	Reference< XPropertySet >  xSource(evt.Source, UNO_QUERY);
1213*cdf0e10cSrcweir 	if (!xSource.is())
1214*cdf0e10cSrcweir 		return;
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir 	::vos::OGuard aGuard(Application::GetSolarMutex());
1217*cdf0e10cSrcweir 	// the IsModified changed to sal_False ?
1218*cdf0e10cSrcweir 	if	(	(evt.PropertyName.equals(PROPERTY_ISMODIFIED))
1219*cdf0e10cSrcweir 		&&	(::comphelper::getBOOL(evt.NewValue) == sal_False)
1220*cdf0e10cSrcweir 		)
1221*cdf0e10cSrcweir 	{	// -> the current field isn't modified anymore, too
1222*cdf0e10cSrcweir 		setCurrentModified( sal_False );
1223*cdf0e10cSrcweir 	}
1224*cdf0e10cSrcweir 
1225*cdf0e10cSrcweir 	// switching to a new record ?
1226*cdf0e10cSrcweir 	if	(	(evt.PropertyName.equals(PROPERTY_ISNEW))
1227*cdf0e10cSrcweir 		&&	(::comphelper::getBOOL(evt.NewValue) == sal_True)
1228*cdf0e10cSrcweir 		)
1229*cdf0e10cSrcweir 	{
1230*cdf0e10cSrcweir 		if (::comphelper::getINT32(xSource->getPropertyValue(PROPERTY_ROWCOUNT)) == 0)
1231*cdf0e10cSrcweir 			// if we're switching to a new record and didn't have any records before we need to invalidate
1232*cdf0e10cSrcweir 			// all slots (as the cursor was invalid before the mode change and so the slots were disabled)
1233*cdf0e10cSrcweir 			InvalidateAll();
1234*cdf0e10cSrcweir 	}
1235*cdf0e10cSrcweir 
1236*cdf0e10cSrcweir 
1237*cdf0e10cSrcweir     if (evt.PropertyName.equals(PROPERTY_FILTER))
1238*cdf0e10cSrcweir 	{
1239*cdf0e10cSrcweir 		InvalidateFeature(ID_BROWSER_REMOVEFILTER);
1240*cdf0e10cSrcweir 	}
1241*cdf0e10cSrcweir 	else if (evt.PropertyName.equals(PROPERTY_HAVING_CLAUSE))
1242*cdf0e10cSrcweir 	{
1243*cdf0e10cSrcweir 		InvalidateFeature(ID_BROWSER_REMOVEFILTER);
1244*cdf0e10cSrcweir 	}
1245*cdf0e10cSrcweir 	else if (evt.PropertyName.equals(PROPERTY_ORDER))
1246*cdf0e10cSrcweir 	{
1247*cdf0e10cSrcweir 		InvalidateFeature(ID_BROWSER_REMOVEFILTER);
1248*cdf0e10cSrcweir 	}
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir 	// a new record count ? -> may be our search availability has changed
1251*cdf0e10cSrcweir 	if (evt.PropertyName.equals(PROPERTY_ROWCOUNT))
1252*cdf0e10cSrcweir 	{
1253*cdf0e10cSrcweir 		sal_Int32 nNewValue = 0, nOldValue = 0;
1254*cdf0e10cSrcweir 		evt.NewValue >>= nNewValue;
1255*cdf0e10cSrcweir 		evt.OldValue >>= nOldValue;
1256*cdf0e10cSrcweir 		if((nOldValue == 0 && nNewValue != 0) || (nOldValue != 0 && nNewValue == 0))
1257*cdf0e10cSrcweir 			InvalidateAll();
1258*cdf0e10cSrcweir 	}
1259*cdf0e10cSrcweir }
1260*cdf0e10cSrcweir 
1261*cdf0e10cSrcweir //------------------------------------------------------------------------
1262*cdf0e10cSrcweir void SbaXDataBrowserController::modified(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
1263*cdf0e10cSrcweir {
1264*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::modified" );
1265*cdf0e10cSrcweir 	setCurrentModified( sal_True );
1266*cdf0e10cSrcweir }
1267*cdf0e10cSrcweir 
1268*cdf0e10cSrcweir // -----------------------------------------------------------------------
1269*cdf0e10cSrcweir void SbaXDataBrowserController::elementInserted(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException )
1270*cdf0e10cSrcweir {
1271*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementInserted" );
1272*cdf0e10cSrcweir 	DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(),
1273*cdf0e10cSrcweir 		"SbaXDataBrowserController::elementInserted: where did this come from (not from the grid model)?!");
1274*cdf0e10cSrcweir 	Reference< XPropertySet >  xNewColumn(evt.Element,UNO_QUERY);
1275*cdf0e10cSrcweir 	if ( xNewColumn.is() )
1276*cdf0e10cSrcweir 		AddColumnListener(xNewColumn);
1277*cdf0e10cSrcweir }
1278*cdf0e10cSrcweir 
1279*cdf0e10cSrcweir // -----------------------------------------------------------------------
1280*cdf0e10cSrcweir void SbaXDataBrowserController::elementRemoved(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException )
1281*cdf0e10cSrcweir {
1282*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementRemoved" );
1283*cdf0e10cSrcweir 	DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(),
1284*cdf0e10cSrcweir 		"SbaXDataBrowserController::elementRemoved: where did this come from (not from the grid model)?!");
1285*cdf0e10cSrcweir 	Reference< XPropertySet >  xOldColumn(evt.Element,UNO_QUERY);
1286*cdf0e10cSrcweir 	if ( xOldColumn.is() )
1287*cdf0e10cSrcweir 		RemoveColumnListener(xOldColumn);
1288*cdf0e10cSrcweir }
1289*cdf0e10cSrcweir 
1290*cdf0e10cSrcweir // -----------------------------------------------------------------------
1291*cdf0e10cSrcweir void SbaXDataBrowserController::elementReplaced(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException )
1292*cdf0e10cSrcweir {
1293*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementReplaced" );
1294*cdf0e10cSrcweir 	DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(),
1295*cdf0e10cSrcweir 		"SbaXDataBrowserController::elementReplaced: where did this come from (not from the grid model)?!");
1296*cdf0e10cSrcweir 	Reference< XPropertySet >  xOldColumn(evt.ReplacedElement,UNO_QUERY);
1297*cdf0e10cSrcweir 	if ( xOldColumn.is() )
1298*cdf0e10cSrcweir 		RemoveColumnListener(xOldColumn);
1299*cdf0e10cSrcweir 
1300*cdf0e10cSrcweir 	Reference< XPropertySet >  xNewColumn(evt.Element,UNO_QUERY);
1301*cdf0e10cSrcweir 	if ( xNewColumn.is() )
1302*cdf0e10cSrcweir 		AddColumnListener(xNewColumn);
1303*cdf0e10cSrcweir }
1304*cdf0e10cSrcweir 
1305*cdf0e10cSrcweir // -----------------------------------------------------------------------
1306*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::suspend(sal_Bool /*bSuspend*/) throw( RuntimeException )
1307*cdf0e10cSrcweir {
1308*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::suspend" );
1309*cdf0e10cSrcweir 	DBG_ASSERT(m_nPendingLoadFinished == 0, "SbaXDataBrowserController::suspend : there shouldn't be a pending load !");
1310*cdf0e10cSrcweir 
1311*cdf0e10cSrcweir 	m_aAsyncGetCellFocus.CancelCall();
1312*cdf0e10cSrcweir     m_aAsyncDisplayError.CancelCall();
1313*cdf0e10cSrcweir 	m_aAsyncInvalidateAll.CancelCall();
1314*cdf0e10cSrcweir 
1315*cdf0e10cSrcweir 	sal_Bool bSuccess = SaveModified();
1316*cdf0e10cSrcweir 	return bSuccess;
1317*cdf0e10cSrcweir }
1318*cdf0e10cSrcweir // -----------------------------------------------------------------------
1319*cdf0e10cSrcweir void SbaXDataBrowserController::disposing()
1320*cdf0e10cSrcweir {
1321*cdf0e10cSrcweir 	// the base class
1322*cdf0e10cSrcweir     SbaXDataBrowserController_Base::OGenericUnoController::disposing();
1323*cdf0e10cSrcweir 
1324*cdf0e10cSrcweir 	// the data source
1325*cdf0e10cSrcweir 	Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1326*cdf0e10cSrcweir 	if (xFormSet.is())
1327*cdf0e10cSrcweir 	{
1328*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast<XPropertyChangeListener*>(this));
1329*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast<XPropertyChangeListener*>(this));
1330*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast<XPropertyChangeListener*>(this));
1331*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast<XPropertyChangeListener*>(this));
1332*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast<XPropertyChangeListener*>(this));
1333*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast<XPropertyChangeListener*>(this));
1334*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast<XPropertyChangeListener*>(this));
1335*cdf0e10cSrcweir 		xFormSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast<XPropertyChangeListener*>(this));
1336*cdf0e10cSrcweir 	}
1337*cdf0e10cSrcweir 
1338*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster >  xFormError(getRowSet(), UNO_QUERY);
1339*cdf0e10cSrcweir 	if (xFormError.is())
1340*cdf0e10cSrcweir 		xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this);
1341*cdf0e10cSrcweir 
1342*cdf0e10cSrcweir 	if (m_xLoadable.is())
1343*cdf0e10cSrcweir 		m_xLoadable->removeLoadListener(this);
1344*cdf0e10cSrcweir 
1345*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster >	xFormParameter(getRowSet(), UNO_QUERY);
1346*cdf0e10cSrcweir 	if (xFormParameter.is())
1347*cdf0e10cSrcweir 		xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this);
1348*cdf0e10cSrcweir 
1349*cdf0e10cSrcweir 	removeModelListeners(getControlModel());
1350*cdf0e10cSrcweir 
1351*cdf0e10cSrcweir 	if ( getView() && m_pClipbordNotifier  )
1352*cdf0e10cSrcweir 	{
1353*cdf0e10cSrcweir 		m_pClipbordNotifier->ClearCallbackLink();
1354*cdf0e10cSrcweir 		m_pClipbordNotifier->AddRemoveListener( getView(), sal_False );
1355*cdf0e10cSrcweir 		m_pClipbordNotifier->release();
1356*cdf0e10cSrcweir 		m_pClipbordNotifier = NULL;
1357*cdf0e10cSrcweir 	}
1358*cdf0e10cSrcweir 
1359*cdf0e10cSrcweir 	if (getBrowserView())
1360*cdf0e10cSrcweir 	{
1361*cdf0e10cSrcweir 		removeControlListeners(getBrowserView()->getGridControl());
1362*cdf0e10cSrcweir 		// don't delete explicitly, this is done by the owner (and user) of this controller (me hopes ...)
1363*cdf0e10cSrcweir 		clearView();
1364*cdf0e10cSrcweir 	}
1365*cdf0e10cSrcweir 
1366*cdf0e10cSrcweir 	if(m_aInvalidateClipboard.IsActive())
1367*cdf0e10cSrcweir 		m_aInvalidateClipboard.Stop();
1368*cdf0e10cSrcweir 
1369*cdf0e10cSrcweir 	// dispose the row set
1370*cdf0e10cSrcweir 	try
1371*cdf0e10cSrcweir 	{
1372*cdf0e10cSrcweir 		::comphelper::disposeComponent(m_xRowSet);
1373*cdf0e10cSrcweir 
1374*cdf0e10cSrcweir 		m_xRowSet			= NULL;
1375*cdf0e10cSrcweir 		m_xColumnsSupplier	= NULL;
1376*cdf0e10cSrcweir 		m_xLoadable 		= NULL;
1377*cdf0e10cSrcweir 	}
1378*cdf0e10cSrcweir 	catch(Exception&)
1379*cdf0e10cSrcweir 	{
1380*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
1381*cdf0e10cSrcweir 	}
1382*cdf0e10cSrcweir     m_xParser.clear();
1383*cdf0e10cSrcweir 		// don't dispose, just reset - it's owned by the RowSet
1384*cdf0e10cSrcweir }
1385*cdf0e10cSrcweir //------------------------------------------------------------------------------
1386*cdf0e10cSrcweir void SbaXDataBrowserController::frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( RuntimeException )
1387*cdf0e10cSrcweir {
1388*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::frameAction" );
1389*cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1390*cdf0e10cSrcweir 
1391*cdf0e10cSrcweir     SbaXDataBrowserController_Base::frameAction( aEvent );
1392*cdf0e10cSrcweir 
1393*cdf0e10cSrcweir     if ( aEvent.Source == getFrame() )
1394*cdf0e10cSrcweir 		switch ( aEvent.Action )
1395*cdf0e10cSrcweir 		{
1396*cdf0e10cSrcweir 			case FrameAction_FRAME_ACTIVATED:
1397*cdf0e10cSrcweir 			case FrameAction_FRAME_UI_ACTIVATED:
1398*cdf0e10cSrcweir 				// ensure that the active cell (if any) has the focus
1399*cdf0e10cSrcweir 				m_aAsyncGetCellFocus.Call();
1400*cdf0e10cSrcweir 				// start the clipboard timer
1401*cdf0e10cSrcweir 				if (getBrowserView() && getBrowserView()->getVclControl() && !m_aInvalidateClipboard.IsActive())
1402*cdf0e10cSrcweir 				{
1403*cdf0e10cSrcweir 					m_aInvalidateClipboard.Start();
1404*cdf0e10cSrcweir                     OnInvalidateClipboard( NULL );
1405*cdf0e10cSrcweir 				}
1406*cdf0e10cSrcweir 				break;
1407*cdf0e10cSrcweir 			case FrameAction_FRAME_DEACTIVATING:
1408*cdf0e10cSrcweir 			case FrameAction_FRAME_UI_DEACTIVATING:
1409*cdf0e10cSrcweir 				// stop the clipboard invalidator
1410*cdf0e10cSrcweir 				if (getBrowserView() && getBrowserView()->getVclControl() && m_aInvalidateClipboard.IsActive())
1411*cdf0e10cSrcweir 				{
1412*cdf0e10cSrcweir 					m_aInvalidateClipboard.Stop();
1413*cdf0e10cSrcweir                     OnInvalidateClipboard( NULL );
1414*cdf0e10cSrcweir 				}
1415*cdf0e10cSrcweir 				// remove the "get cell focus"-event
1416*cdf0e10cSrcweir 				m_aAsyncGetCellFocus.CancelCall();
1417*cdf0e10cSrcweir 				break;
1418*cdf0e10cSrcweir             default:
1419*cdf0e10cSrcweir                 break;
1420*cdf0e10cSrcweir 		}
1421*cdf0e10cSrcweir }
1422*cdf0e10cSrcweir 
1423*cdf0e10cSrcweir //------------------------------------------------------------------------------
1424*cdf0e10cSrcweir IMPL_LINK( SbaXDataBrowserController, OnAsyncDisplayError, void*, /* _pNotInterestedIn */ )
1425*cdf0e10cSrcweir {
1426*cdf0e10cSrcweir     if ( m_aCurrentError.isValid() )
1427*cdf0e10cSrcweir     {
1428*cdf0e10cSrcweir         OSQLMessageBox aDlg( getBrowserView(), m_aCurrentError );
1429*cdf0e10cSrcweir         aDlg.Execute();
1430*cdf0e10cSrcweir     }
1431*cdf0e10cSrcweir     return 0L;
1432*cdf0e10cSrcweir }
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir //------------------------------------------------------------------------------
1435*cdf0e10cSrcweir void SbaXDataBrowserController::errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( RuntimeException )
1436*cdf0e10cSrcweir {
1437*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::errorOccured" );
1438*cdf0e10cSrcweir     ::osl::MutexGuard aGuard( getMutex() );
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir     SQLExceptionInfo aInfo( aEvent.Reason );
1441*cdf0e10cSrcweir 	if ( !aInfo.isValid() )
1442*cdf0e10cSrcweir         return;
1443*cdf0e10cSrcweir 
1444*cdf0e10cSrcweir     if ( m_nFormActionNestingLevel )
1445*cdf0e10cSrcweir     {
1446*cdf0e10cSrcweir         OSL_ENSURE( !m_aCurrentError.isValid(), "SbaXDataBrowserController::errorOccured: can handle one error per transaction only!" );
1447*cdf0e10cSrcweir         m_aCurrentError = aInfo;
1448*cdf0e10cSrcweir     }
1449*cdf0e10cSrcweir     else
1450*cdf0e10cSrcweir     {
1451*cdf0e10cSrcweir         m_aCurrentError = aInfo;
1452*cdf0e10cSrcweir         m_aAsyncDisplayError.Call();
1453*cdf0e10cSrcweir     }
1454*cdf0e10cSrcweir }
1455*cdf0e10cSrcweir 
1456*cdf0e10cSrcweir //------------------------------------------------------------------------------
1457*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( RuntimeException )
1458*cdf0e10cSrcweir {
1459*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveParameter" );
1460*cdf0e10cSrcweir 	if (aEvent.Source != getRowSet())
1461*cdf0e10cSrcweir 	{
1462*cdf0e10cSrcweir 		// not my data source -> allow anything
1463*cdf0e10cSrcweir 		DBG_ERROR("SbaXDataBrowserController::approveParameter : invalid event source !");
1464*cdf0e10cSrcweir 		return sal_True;
1465*cdf0e10cSrcweir 	}
1466*cdf0e10cSrcweir 
1467*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexAccess >	xParameters = aEvent.Parameters;
1468*cdf0e10cSrcweir 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
1469*cdf0e10cSrcweir 		// this may be executed in a non-main thread and we want to use vcl ...
1470*cdf0e10cSrcweir 	Window* pParent = Application::GetDefDialogParent();
1471*cdf0e10cSrcweir 		// don't use the content as parent if it isn't visible
1472*cdf0e10cSrcweir 	// (and don't use NULL as parent : this may be displayed in the beamer and really shouldn't be task-local)
1473*cdf0e10cSrcweir 		// 69297 - FS - 25.10.99
1474*cdf0e10cSrcweir 	if (getBrowserView() && getBrowserView()->IsVisible())
1475*cdf0e10cSrcweir 		pParent = getBrowserView();
1476*cdf0e10cSrcweir 
1477*cdf0e10cSrcweir 	// default handling: instantiate an interaction handler and let it handle the parameter request
1478*cdf0e10cSrcweir 	try
1479*cdf0e10cSrcweir 	{
1480*cdf0e10cSrcweir 		// two continuations allowed: OK and Cancel
1481*cdf0e10cSrcweir 		OParameterContinuation* pParamValues = new OParameterContinuation;
1482*cdf0e10cSrcweir 		OInteractionAbort* pAbort = new OInteractionAbort;
1483*cdf0e10cSrcweir 		// the request
1484*cdf0e10cSrcweir 		ParametersRequest aRequest;
1485*cdf0e10cSrcweir 		aRequest.Parameters = xParameters;
1486*cdf0e10cSrcweir 		aRequest.Connection = getConnection(Reference< XRowSet >(aEvent.Source, UNO_QUERY));
1487*cdf0e10cSrcweir 		OInteractionRequest* pParamRequest = new OInteractionRequest(makeAny(aRequest));
1488*cdf0e10cSrcweir 		Reference< XInteractionRequest > xParamRequest(pParamRequest);
1489*cdf0e10cSrcweir 		// some knittings
1490*cdf0e10cSrcweir 		pParamRequest->addContinuation(pParamValues);
1491*cdf0e10cSrcweir 		pParamRequest->addContinuation(pAbort);
1492*cdf0e10cSrcweir 
1493*cdf0e10cSrcweir 		// create the handler, let it handle the request
1494*cdf0e10cSrcweir 		Reference< XInteractionHandler > xHandler(getORB()->createInstance(SERVICE_TASK_INTERACTION_HANDLER), UNO_QUERY);
1495*cdf0e10cSrcweir 		if (xHandler.is())
1496*cdf0e10cSrcweir 			xHandler->handle(xParamRequest);
1497*cdf0e10cSrcweir 
1498*cdf0e10cSrcweir 		if (!pParamValues->wasSelected())
1499*cdf0e10cSrcweir 		{	// canceled
1500*cdf0e10cSrcweir 			setLoadingCancelled();
1501*cdf0e10cSrcweir 			return sal_False;
1502*cdf0e10cSrcweir 		}
1503*cdf0e10cSrcweir 
1504*cdf0e10cSrcweir 		// transfer the values into the parameter supplier
1505*cdf0e10cSrcweir 		Sequence< PropertyValue > aFinalValues = pParamValues->getValues();
1506*cdf0e10cSrcweir 		if (aFinalValues.getLength() != aRequest.Parameters->getCount())
1507*cdf0e10cSrcweir 		{
1508*cdf0e10cSrcweir 			DBG_ERROR("SbaXDataBrowserController::approveParameter: the InteractionHandler returned nonsense!");
1509*cdf0e10cSrcweir 			setLoadingCancelled();
1510*cdf0e10cSrcweir 			return sal_False;
1511*cdf0e10cSrcweir 		}
1512*cdf0e10cSrcweir 		const PropertyValue* pFinalValues = aFinalValues.getConstArray();
1513*cdf0e10cSrcweir 		for (sal_Int32 i=0; i<aFinalValues.getLength(); ++i, ++pFinalValues)
1514*cdf0e10cSrcweir 		{
1515*cdf0e10cSrcweir 			Reference< XPropertySet > xParam;
1516*cdf0e10cSrcweir 			::cppu::extractInterface(xParam, aRequest.Parameters->getByIndex(i));
1517*cdf0e10cSrcweir 			DBG_ASSERT(xParam.is(), "SbaXDataBrowserController::approveParameter: one of the parameters is no property set!");
1518*cdf0e10cSrcweir 			if (xParam.is())
1519*cdf0e10cSrcweir 			{
1520*cdf0e10cSrcweir #ifdef DBG_UTIL
1521*cdf0e10cSrcweir 				::rtl::OUString sName;
1522*cdf0e10cSrcweir 				xParam->getPropertyValue(PROPERTY_NAME) >>= sName;
1523*cdf0e10cSrcweir 				DBG_ASSERT(sName.equals(pFinalValues->Name), "SbaXDataBrowserController::approveParameter: suspicious value names!");
1524*cdf0e10cSrcweir #endif
1525*cdf0e10cSrcweir 				try { xParam->setPropertyValue(PROPERTY_VALUE, pFinalValues->Value); }
1526*cdf0e10cSrcweir 				catch(Exception&)
1527*cdf0e10cSrcweir 				{
1528*cdf0e10cSrcweir 					DBG_ERROR("SbaXDataBrowserController::approveParameter: setting one of the properties failed!");
1529*cdf0e10cSrcweir 				}
1530*cdf0e10cSrcweir 			}
1531*cdf0e10cSrcweir 		}
1532*cdf0e10cSrcweir 	}
1533*cdf0e10cSrcweir 	catch( const Exception& )
1534*cdf0e10cSrcweir 	{
1535*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
1536*cdf0e10cSrcweir 	}
1537*cdf0e10cSrcweir 
1538*cdf0e10cSrcweir 	return sal_True;
1539*cdf0e10cSrcweir }
1540*cdf0e10cSrcweir 
1541*cdf0e10cSrcweir 
1542*cdf0e10cSrcweir //------------------------------------------------------------------------------
1543*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::approveReset(const ::com::sun::star::lang::EventObject& /*rEvent*/) throw( RuntimeException )
1544*cdf0e10cSrcweir {
1545*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveReset" );
1546*cdf0e10cSrcweir 	return sal_True;
1547*cdf0e10cSrcweir }
1548*cdf0e10cSrcweir 
1549*cdf0e10cSrcweir //------------------------------------------------------------------------------
1550*cdf0e10cSrcweir void SbaXDataBrowserController::resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( RuntimeException )
1551*cdf0e10cSrcweir {
1552*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::resetted" );
1553*cdf0e10cSrcweir 	DBG_ASSERT(rEvent.Source == getControlModel(), "SbaXDataBrowserController::resetted : where did this come from ?");
1554*cdf0e10cSrcweir     (void)rEvent;
1555*cdf0e10cSrcweir 	setCurrentModified( sal_False );
1556*cdf0e10cSrcweir }
1557*cdf0e10cSrcweir 
1558*cdf0e10cSrcweir //------------------------------------------------------------------------------
1559*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& /*aEvent*/) throw( RuntimeException )
1560*cdf0e10cSrcweir {
1561*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::confirmDelete" );
1562*cdf0e10cSrcweir 	if (QueryBox(getBrowserView(), ModuleRes(QUERY_BRW_DELETE_ROWS)).Execute() != RET_YES)
1563*cdf0e10cSrcweir 		return sal_False;
1564*cdf0e10cSrcweir 
1565*cdf0e10cSrcweir 	return sal_True;
1566*cdf0e10cSrcweir }
1567*cdf0e10cSrcweir //------------------------------------------------------------------------------
1568*cdf0e10cSrcweir FeatureState SbaXDataBrowserController::GetState(sal_uInt16 nId) const
1569*cdf0e10cSrcweir {
1570*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::GetState" );
1571*cdf0e10cSrcweir 	FeatureState aReturn;
1572*cdf0e10cSrcweir 		// (disabled automatically)
1573*cdf0e10cSrcweir 
1574*cdf0e10cSrcweir 	try
1575*cdf0e10cSrcweir 	{
1576*cdf0e10cSrcweir 		// no chance without a view
1577*cdf0e10cSrcweir 		if (!getBrowserView() || !getBrowserView()->getVclControl())
1578*cdf0e10cSrcweir 			return aReturn;
1579*cdf0e10cSrcweir 
1580*cdf0e10cSrcweir 		switch (nId)
1581*cdf0e10cSrcweir 		{
1582*cdf0e10cSrcweir 			case ID_BROWSER_REMOVEFILTER:
1583*cdf0e10cSrcweir 				if (!m_xParser.is())
1584*cdf0e10cSrcweir                 {
1585*cdf0e10cSrcweir                     aReturn.bEnabled = false;
1586*cdf0e10cSrcweir 					return aReturn;
1587*cdf0e10cSrcweir                 }
1588*cdf0e10cSrcweir 				// any filter or sort order set ?
1589*cdf0e10cSrcweir 				aReturn.bEnabled = m_xParser->getFilter().getLength() || m_xParser->getHavingClause().getLength() || m_xParser->getOrder().getLength();
1590*cdf0e10cSrcweir 				return aReturn;
1591*cdf0e10cSrcweir 		}
1592*cdf0e10cSrcweir 		// no chance without valid models
1593*cdf0e10cSrcweir 		if (isValid() && !isValidCursor())
1594*cdf0e10cSrcweir 			return aReturn;
1595*cdf0e10cSrcweir 
1596*cdf0e10cSrcweir 		switch (nId)
1597*cdf0e10cSrcweir 		{
1598*cdf0e10cSrcweir 			case ID_BROWSER_SEARCH:
1599*cdf0e10cSrcweir 			{
1600*cdf0e10cSrcweir 				Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1601*cdf0e10cSrcweir 				sal_Int32 nCount = ::comphelper::getINT32(xFormSet->getPropertyValue(PROPERTY_ROWCOUNT));
1602*cdf0e10cSrcweir 				aReturn.bEnabled = nCount != 0;
1603*cdf0e10cSrcweir 			}
1604*cdf0e10cSrcweir 			break;
1605*cdf0e10cSrcweir             case ID_BROWSER_INSERT_ROW:
1606*cdf0e10cSrcweir                 {
1607*cdf0e10cSrcweir                     // check if it is available
1608*cdf0e10cSrcweir                     sal_Bool bInsertPrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0;
1609*cdf0e10cSrcweir                     sal_Bool bAllowInsertions = sal_True;
1610*cdf0e10cSrcweir                     try
1611*cdf0e10cSrcweir                     {
1612*cdf0e10cSrcweir 				        Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW );
1613*cdf0e10cSrcweir                         OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowInserts" ) ) >>= bAllowInsertions );
1614*cdf0e10cSrcweir                     }
1615*cdf0e10cSrcweir                     catch( const Exception& )
1616*cdf0e10cSrcweir                     {
1617*cdf0e10cSrcweir                     	DBG_UNHANDLED_EXCEPTION();
1618*cdf0e10cSrcweir                     }
1619*cdf0e10cSrcweir 				    aReturn.bEnabled = bInsertPrivilege && bAllowInsertions;
1620*cdf0e10cSrcweir                 }
1621*cdf0e10cSrcweir                 break;
1622*cdf0e10cSrcweir             case SID_FM_DELETEROWS:
1623*cdf0e10cSrcweir                 {
1624*cdf0e10cSrcweir                     // check if it is available
1625*cdf0e10cSrcweir                     sal_Bool bDeletePrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0;
1626*cdf0e10cSrcweir                     sal_Bool bAllowDeletions = sal_True;
1627*cdf0e10cSrcweir                     sal_Int32 nRowCount = 0;
1628*cdf0e10cSrcweir                     sal_Bool bInsertionRow = sal_False;
1629*cdf0e10cSrcweir                     try
1630*cdf0e10cSrcweir                     {
1631*cdf0e10cSrcweir 				        Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW );
1632*cdf0e10cSrcweir                         OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowDeletes" ) ) >>= bAllowDeletions );
1633*cdf0e10cSrcweir                         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ROWCOUNT ) >>= nRowCount );
1634*cdf0e10cSrcweir                         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ISNEW ) >>= bInsertionRow );
1635*cdf0e10cSrcweir                     }
1636*cdf0e10cSrcweir                     catch( const Exception& )
1637*cdf0e10cSrcweir                     {
1638*cdf0e10cSrcweir                     	DBG_UNHANDLED_EXCEPTION();
1639*cdf0e10cSrcweir                     }
1640*cdf0e10cSrcweir                     aReturn.bEnabled = bDeletePrivilege && bAllowDeletions && ( nRowCount != 0 ) && !bInsertionRow;
1641*cdf0e10cSrcweir 			    }
1642*cdf0e10cSrcweir                 break;
1643*cdf0e10cSrcweir 
1644*cdf0e10cSrcweir             case ID_BROWSER_COPY:
1645*cdf0e10cSrcweir                 if ( getBrowserView()->getVclControl()->GetSelectRowCount() )
1646*cdf0e10cSrcweir                 {
1647*cdf0e10cSrcweir                     aReturn.bEnabled = m_aCurrentFrame.isActive();
1648*cdf0e10cSrcweir                     break;
1649*cdf0e10cSrcweir                 }
1650*cdf0e10cSrcweir                 // run through
1651*cdf0e10cSrcweir 			case ID_BROWSER_PASTE:
1652*cdf0e10cSrcweir 			case ID_BROWSER_CUT:
1653*cdf0e10cSrcweir 			{
1654*cdf0e10cSrcweir 				CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller();
1655*cdf0e10cSrcweir 				if (xCurrentController.Is() && xCurrentController->ISA(EditCellController))
1656*cdf0e10cSrcweir 				{
1657*cdf0e10cSrcweir 					Edit& rEdit = (Edit&)xCurrentController->GetWindow();
1658*cdf0e10cSrcweir 					sal_Bool bHasLen = (rEdit.GetSelection().Len() != 0);
1659*cdf0e10cSrcweir 					sal_Bool bIsReadOnly = rEdit.IsReadOnly();
1660*cdf0e10cSrcweir 					switch (nId)
1661*cdf0e10cSrcweir 					{
1662*cdf0e10cSrcweir 						case ID_BROWSER_CUT:	aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen && !bIsReadOnly; break;
1663*cdf0e10cSrcweir 						case SID_COPY	:		aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen; break;
1664*cdf0e10cSrcweir 						case ID_BROWSER_PASTE:
1665*cdf0e10cSrcweir 							aReturn.bEnabled = m_aCurrentFrame.isActive() && !bIsReadOnly;
1666*cdf0e10cSrcweir 							if(aReturn.bEnabled)
1667*cdf0e10cSrcweir 							{
1668*cdf0e10cSrcweir 								aReturn.bEnabled = aReturn.bEnabled && IsFormatSupported( m_aSystemClipboard.GetDataFlavorExVector(), FORMAT_STRING );
1669*cdf0e10cSrcweir 							}
1670*cdf0e10cSrcweir 							break;
1671*cdf0e10cSrcweir 					}
1672*cdf0e10cSrcweir 				}
1673*cdf0e10cSrcweir 			}
1674*cdf0e10cSrcweir 			break;
1675*cdf0e10cSrcweir 
1676*cdf0e10cSrcweir 			case ID_BROWSER_SORTUP:
1677*cdf0e10cSrcweir 			case ID_BROWSER_SORTDOWN:
1678*cdf0e10cSrcweir 			case ID_BROWSER_AUTOFILTER:
1679*cdf0e10cSrcweir 			{
1680*cdf0e10cSrcweir 				// a native statement can't be filtered or sorted
1681*cdf0e10cSrcweir 				const Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1682*cdf0e10cSrcweir 	            if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() )
1683*cdf0e10cSrcweir                     break;
1684*cdf0e10cSrcweir 
1685*cdf0e10cSrcweir 				Reference< XPropertySet >  xCurrentField = getBoundField();
1686*cdf0e10cSrcweir 				if (!xCurrentField.is())
1687*cdf0e10cSrcweir 					break;
1688*cdf0e10cSrcweir 
1689*cdf0e10cSrcweir 				aReturn.bEnabled = ::comphelper::getBOOL(xCurrentField->getPropertyValue(PROPERTY_ISSEARCHABLE));
1690*cdf0e10cSrcweir 				const Reference< XRowSet > xRow = getRowSet();
1691*cdf0e10cSrcweir                 aReturn.bEnabled =  aReturn.bEnabled
1692*cdf0e10cSrcweir                                 &&  xRow.is()
1693*cdf0e10cSrcweir                                 &&  !xRow->isBeforeFirst()
1694*cdf0e10cSrcweir                                 &&  !xRow->isAfterLast()
1695*cdf0e10cSrcweir                                 &&  !xRow->rowDeleted()
1696*cdf0e10cSrcweir                                 &&  ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 );
1697*cdf0e10cSrcweir 			}
1698*cdf0e10cSrcweir 			break;
1699*cdf0e10cSrcweir 
1700*cdf0e10cSrcweir 			case ID_BROWSER_FILTERCRIT:
1701*cdf0e10cSrcweir                 if ( m_bCannotSelectUnfiltered && m_xParser.is() )
1702*cdf0e10cSrcweir                 {
1703*cdf0e10cSrcweir                     aReturn.bEnabled = sal_True;
1704*cdf0e10cSrcweir                     break;
1705*cdf0e10cSrcweir                 }
1706*cdf0e10cSrcweir                 // no break
1707*cdf0e10cSrcweir             case ID_BROWSER_ORDERCRIT:
1708*cdf0e10cSrcweir 				{
1709*cdf0e10cSrcweir                     const Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1710*cdf0e10cSrcweir 		            if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() )
1711*cdf0e10cSrcweir                         break;
1712*cdf0e10cSrcweir 
1713*cdf0e10cSrcweir                     aReturn.bEnabled =  getRowSet().is()
1714*cdf0e10cSrcweir                                     &&  ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 );
1715*cdf0e10cSrcweir 				}
1716*cdf0e10cSrcweir 				break;
1717*cdf0e10cSrcweir 
1718*cdf0e10cSrcweir 			case ID_BROWSER_REFRESH:
1719*cdf0e10cSrcweir 				aReturn.bEnabled = sal_True;
1720*cdf0e10cSrcweir 				break;
1721*cdf0e10cSrcweir 
1722*cdf0e10cSrcweir 			case ID_BROWSER_REDO:
1723*cdf0e10cSrcweir 				aReturn.bEnabled = sal_False;	// simply forget it ;). no redo possible.
1724*cdf0e10cSrcweir 				break;
1725*cdf0e10cSrcweir 
1726*cdf0e10cSrcweir 			case ID_BROWSER_UNDORECORD:
1727*cdf0e10cSrcweir 			case ID_BROWSER_SAVERECORD:
1728*cdf0e10cSrcweir 			{
1729*cdf0e10cSrcweir 				if (!m_bCurrentlyModified)
1730*cdf0e10cSrcweir 				{
1731*cdf0e10cSrcweir 					Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1732*cdf0e10cSrcweir 					if (xFormSet.is())
1733*cdf0e10cSrcweir 						aReturn.bEnabled = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED));
1734*cdf0e10cSrcweir 				}
1735*cdf0e10cSrcweir 				else
1736*cdf0e10cSrcweir 					aReturn.bEnabled = sal_True;
1737*cdf0e10cSrcweir 
1738*cdf0e10cSrcweir 				aReturn.sTitle = (ID_BROWSER_UNDORECORD == nId) ? m_sStateUndoRecord : m_sStateSaveRecord;
1739*cdf0e10cSrcweir 			}
1740*cdf0e10cSrcweir 			break;
1741*cdf0e10cSrcweir 			case ID_BROWSER_EDITDOC:
1742*cdf0e10cSrcweir 			{
1743*cdf0e10cSrcweir 				// check if it is available
1744*cdf0e10cSrcweir 				Reference< XPropertySet >  xDataSourceSet(getRowSet(), UNO_QUERY);
1745*cdf0e10cSrcweir 				if (!xDataSourceSet.is())
1746*cdf0e10cSrcweir 					break;	// no datasource -> no edit mode
1747*cdf0e10cSrcweir 
1748*cdf0e10cSrcweir 				sal_Int32 nDataSourcePrivileges = ::comphelper::getINT32(xDataSourceSet->getPropertyValue(PROPERTY_PRIVILEGES));
1749*cdf0e10cSrcweir 				sal_Bool bInsertAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::INSERT) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowInserts")));
1750*cdf0e10cSrcweir 				sal_Bool bUpdateAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::UPDATE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowUpdates")));
1751*cdf0e10cSrcweir 				sal_Bool bDeleteAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::DELETE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowDeletes")));
1752*cdf0e10cSrcweir 				if (!bInsertAllowedAndPossible && !bUpdateAllowedAndPossible && !bDeleteAllowedAndPossible)
1753*cdf0e10cSrcweir 					break;	// no insert/update/delete -> no edit mode
1754*cdf0e10cSrcweir 
1755*cdf0e10cSrcweir 				if (!isValidCursor() || !isLoaded())
1756*cdf0e10cSrcweir 					break;	// no cursor -> no edit mode
1757*cdf0e10cSrcweir 
1758*cdf0e10cSrcweir 				aReturn.bEnabled = sal_True;
1759*cdf0e10cSrcweir 
1760*cdf0e10cSrcweir 				sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions();
1761*cdf0e10cSrcweir 				aReturn.bChecked = nGridMode > DbGridControl::OPT_READONLY;
1762*cdf0e10cSrcweir 			}
1763*cdf0e10cSrcweir 			break;
1764*cdf0e10cSrcweir 			case ID_BROWSER_FILTERED:
1765*cdf0e10cSrcweir 			{
1766*cdf0e10cSrcweir 				aReturn.bEnabled = sal_False;
1767*cdf0e10cSrcweir 				Reference< XPropertySet >  xActiveSet(getRowSet(), UNO_QUERY);
1768*cdf0e10cSrcweir 				::rtl::OUString aFilter = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_FILTER));
1769*cdf0e10cSrcweir 				::rtl::OUString aHaving = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_HAVING_CLAUSE));
1770*cdf0e10cSrcweir 				if ( aFilter.getLength() || aHaving.getLength() )
1771*cdf0e10cSrcweir 				{
1772*cdf0e10cSrcweir                     xActiveSet->getPropertyValue( PROPERTY_APPLYFILTER ) >>= aReturn.bChecked;
1773*cdf0e10cSrcweir 					aReturn.bEnabled = sal_True;
1774*cdf0e10cSrcweir 				}
1775*cdf0e10cSrcweir 				else
1776*cdf0e10cSrcweir 				{
1777*cdf0e10cSrcweir 					aReturn.bChecked = sal_False;
1778*cdf0e10cSrcweir 					aReturn.bEnabled = sal_False;
1779*cdf0e10cSrcweir 				}
1780*cdf0e10cSrcweir 			}
1781*cdf0e10cSrcweir 			break;
1782*cdf0e10cSrcweir 			default:
1783*cdf0e10cSrcweir 				return SbaXDataBrowserController_Base::GetState(nId);
1784*cdf0e10cSrcweir 		}
1785*cdf0e10cSrcweir 	}
1786*cdf0e10cSrcweir 	catch(const Exception& )
1787*cdf0e10cSrcweir 	{
1788*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
1789*cdf0e10cSrcweir 	}
1790*cdf0e10cSrcweir 
1791*cdf0e10cSrcweir 	return aReturn;
1792*cdf0e10cSrcweir }
1793*cdf0e10cSrcweir 
1794*cdf0e10cSrcweir //------------------------------------------------------------------------------
1795*cdf0e10cSrcweir void SbaXDataBrowserController::applyParserOrder(const ::rtl::OUString& _rOldOrder,const Reference< XSingleSelectQueryComposer >& _xParser)
1796*cdf0e10cSrcweir {
1797*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserOrder" );
1798*cdf0e10cSrcweir 	Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY);
1799*cdf0e10cSrcweir 	if (!m_xLoadable.is())
1800*cdf0e10cSrcweir 	{
1801*cdf0e10cSrcweir 		OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserOrder: invalid row set!");
1802*cdf0e10cSrcweir 		return;
1803*cdf0e10cSrcweir 	}
1804*cdf0e10cSrcweir 
1805*cdf0e10cSrcweir 	sal_uInt16 nPos = getCurrentColumnPosition();
1806*cdf0e10cSrcweir 	sal_Bool bSuccess = sal_False;
1807*cdf0e10cSrcweir 	try
1808*cdf0e10cSrcweir 	{
1809*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_xParser->getOrder()));
1810*cdf0e10cSrcweir 		bSuccess = reloadForm(m_xLoadable);
1811*cdf0e10cSrcweir 	}
1812*cdf0e10cSrcweir 	catch(Exception&)
1813*cdf0e10cSrcweir 	{
1814*cdf0e10cSrcweir 	}
1815*cdf0e10cSrcweir 
1816*cdf0e10cSrcweir 	if (!bSuccess)
1817*cdf0e10cSrcweir 	{
1818*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_rOldOrder));
1819*cdf0e10cSrcweir 		//DO_SAFE( _xParser->setOrder(_rOldOrder), "SbaXDataBrowserController::applyParserOrder: could not restore the old order of my parser !" );
1820*cdf0e10cSrcweir 
1821*cdf0e10cSrcweir 		try
1822*cdf0e10cSrcweir 		{
1823*cdf0e10cSrcweir 			if (loadingCancelled() || !reloadForm(m_xLoadable))
1824*cdf0e10cSrcweir 				criticalFail();
1825*cdf0e10cSrcweir 		}
1826*cdf0e10cSrcweir 		catch(Exception&)
1827*cdf0e10cSrcweir 		{
1828*cdf0e10cSrcweir 			criticalFail();
1829*cdf0e10cSrcweir 		}
1830*cdf0e10cSrcweir 		InvalidateAll();
1831*cdf0e10cSrcweir 	}
1832*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_REMOVEFILTER);
1833*cdf0e10cSrcweir 
1834*cdf0e10cSrcweir 	setCurrentColumnPosition(nPos);
1835*cdf0e10cSrcweir }
1836*cdf0e10cSrcweir 
1837*cdf0e10cSrcweir //------------------------------------------------------------------------------
1838*cdf0e10cSrcweir void SbaXDataBrowserController::applyParserFilter(const ::rtl::OUString& _rOldFilter, sal_Bool _bOldFilterApplied,const ::rtl::OUString& _sOldHaving,const Reference< XSingleSelectQueryComposer >& _xParser)
1839*cdf0e10cSrcweir {
1840*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserFilter" );
1841*cdf0e10cSrcweir 	Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1842*cdf0e10cSrcweir 	if (!m_xLoadable.is())
1843*cdf0e10cSrcweir 	{
1844*cdf0e10cSrcweir 		OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserFilter: invalid row set!");
1845*cdf0e10cSrcweir 		return;
1846*cdf0e10cSrcweir 	}
1847*cdf0e10cSrcweir 
1848*cdf0e10cSrcweir 	sal_uInt16 nPos = getCurrentColumnPosition();
1849*cdf0e10cSrcweir 
1850*cdf0e10cSrcweir 	sal_Bool bSuccess = sal_False;
1851*cdf0e10cSrcweir 	try
1852*cdf0e10cSrcweir 	{
1853*cdf0e10cSrcweir 		FormErrorHelper aError(this);
1854*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_xParser->getFilter()));
1855*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_xParser->getHavingClause()));
1856*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(sal_True)));
1857*cdf0e10cSrcweir 
1858*cdf0e10cSrcweir 		bSuccess = reloadForm(m_xLoadable);
1859*cdf0e10cSrcweir 	}
1860*cdf0e10cSrcweir 	catch(Exception&)
1861*cdf0e10cSrcweir 	{
1862*cdf0e10cSrcweir 	}
1863*cdf0e10cSrcweir 
1864*cdf0e10cSrcweir 	if (!bSuccess)
1865*cdf0e10cSrcweir 	{
1866*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_rOldFilter));
1867*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_sOldHaving));
1868*cdf0e10cSrcweir 		xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(_bOldFilterApplied));
1869*cdf0e10cSrcweir 
1870*cdf0e10cSrcweir 		try
1871*cdf0e10cSrcweir 		{
1872*cdf0e10cSrcweir 			if (loadingCancelled() || !reloadForm(m_xLoadable))
1873*cdf0e10cSrcweir 				criticalFail();
1874*cdf0e10cSrcweir 		}
1875*cdf0e10cSrcweir 		catch(Exception&)
1876*cdf0e10cSrcweir 		{
1877*cdf0e10cSrcweir 			criticalFail();
1878*cdf0e10cSrcweir 		}
1879*cdf0e10cSrcweir 		InvalidateAll();
1880*cdf0e10cSrcweir 	}
1881*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_REMOVEFILTER);
1882*cdf0e10cSrcweir 
1883*cdf0e10cSrcweir 	setCurrentColumnPosition(nPos);
1884*cdf0e10cSrcweir }
1885*cdf0e10cSrcweir 
1886*cdf0e10cSrcweir //------------------------------------------------------------------------------
1887*cdf0e10cSrcweir Reference< XSingleSelectQueryComposer > SbaXDataBrowserController::createParser_nothrow()
1888*cdf0e10cSrcweir {
1889*cdf0e10cSrcweir     Reference< XSingleSelectQueryComposer > xComposer;
1890*cdf0e10cSrcweir     try
1891*cdf0e10cSrcweir     {
1892*cdf0e10cSrcweir         const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW );
1893*cdf0e10cSrcweir         const Reference< XMultiServiceFactory > xFactory(
1894*cdf0e10cSrcweir             xRowSetProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ), UNO_QUERY_THROW );
1895*cdf0e10cSrcweir 		xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY_THROW );
1896*cdf0e10cSrcweir 
1897*cdf0e10cSrcweir         ::rtl::OUString sActiveCommand;
1898*cdf0e10cSrcweir         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ACTIVECOMMAND ) >>= sActiveCommand );
1899*cdf0e10cSrcweir         if ( sActiveCommand.getLength() > 0 )
1900*cdf0e10cSrcweir         {
1901*cdf0e10cSrcweir             xComposer->setElementaryQuery( sActiveCommand );
1902*cdf0e10cSrcweir         }
1903*cdf0e10cSrcweir         else
1904*cdf0e10cSrcweir         {
1905*cdf0e10cSrcweir             ::rtl::OUString sCommand;
1906*cdf0e10cSrcweir             OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND ) >>= sCommand );
1907*cdf0e10cSrcweir             sal_Int32 nCommandType = CommandType::COMMAND;
1908*cdf0e10cSrcweir             OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND_TYPE ) >>= nCommandType );
1909*cdf0e10cSrcweir             xComposer->setCommand( sCommand, nCommandType );
1910*cdf0e10cSrcweir         }
1911*cdf0e10cSrcweir 
1912*cdf0e10cSrcweir         ::rtl::OUString sFilter;
1913*cdf0e10cSrcweir         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_FILTER ) >>= sFilter );
1914*cdf0e10cSrcweir         xComposer->setFilter( sFilter );
1915*cdf0e10cSrcweir 
1916*cdf0e10cSrcweir         ::rtl::OUString sHavingClause;
1917*cdf0e10cSrcweir         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_HAVING_CLAUSE ) >>= sHavingClause );
1918*cdf0e10cSrcweir         xComposer->setHavingClause( sHavingClause );
1919*cdf0e10cSrcweir 
1920*cdf0e10cSrcweir         ::rtl::OUString sOrder;
1921*cdf0e10cSrcweir         OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ORDER ) >>= sOrder );
1922*cdf0e10cSrcweir         xComposer->setOrder( sOrder );
1923*cdf0e10cSrcweir     }
1924*cdf0e10cSrcweir     catch ( const Exception& )
1925*cdf0e10cSrcweir     {
1926*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
1927*cdf0e10cSrcweir     }
1928*cdf0e10cSrcweir     return xComposer;
1929*cdf0e10cSrcweir }
1930*cdf0e10cSrcweir //------------------------------------------------------------------------------
1931*cdf0e10cSrcweir void SbaXDataBrowserController::ExecuteFilterSortCrit(sal_Bool bFilter)
1932*cdf0e10cSrcweir {
1933*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteFilterSortCrit" );
1934*cdf0e10cSrcweir 	if (!SaveModified())
1935*cdf0e10cSrcweir 		return;
1936*cdf0e10cSrcweir 
1937*cdf0e10cSrcweir 	Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
1938*cdf0e10cSrcweir 
1939*cdf0e10cSrcweir 	const ::rtl::OUString sOldVal = bFilter ? m_xParser->getFilter() : m_xParser->getOrder();
1940*cdf0e10cSrcweir 	const ::rtl::OUString sOldHaving = m_xParser->getHavingClause();
1941*cdf0e10cSrcweir     Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow();
1942*cdf0e10cSrcweir 	try
1943*cdf0e10cSrcweir 	{
1944*cdf0e10cSrcweir 		Reference< ::com::sun::star::sdbcx::XColumnsSupplier> xSup = getColumnsSupplier();
1945*cdf0e10cSrcweir 		Reference< XConnection> xCon(xFormSet->getPropertyValue(PROPERTY_ACTIVE_CONNECTION),UNO_QUERY);
1946*cdf0e10cSrcweir 		if(bFilter)
1947*cdf0e10cSrcweir 		{
1948*cdf0e10cSrcweir 			DlgFilterCrit aDlg( getBrowserView(), getORB(), xCon, xParser, xSup->getColumns() );
1949*cdf0e10cSrcweir 			String aFilter;
1950*cdf0e10cSrcweir 			if ( !aDlg.Execute() )
1951*cdf0e10cSrcweir 				return; // if so we don't need to update the grid
1952*cdf0e10cSrcweir 			aDlg.BuildWherePart();
1953*cdf0e10cSrcweir 		}
1954*cdf0e10cSrcweir 		else
1955*cdf0e10cSrcweir 		{
1956*cdf0e10cSrcweir 			DlgOrderCrit aDlg( getBrowserView(),xCon,xParser,xSup->getColumns() );
1957*cdf0e10cSrcweir 			String aOrder;
1958*cdf0e10cSrcweir 			if(!aDlg.Execute())
1959*cdf0e10cSrcweir 			{
1960*cdf0e10cSrcweir 				return; // if so we don't need to actualize the grid
1961*cdf0e10cSrcweir 			}
1962*cdf0e10cSrcweir 			aDlg.BuildOrderPart();
1963*cdf0e10cSrcweir 		}
1964*cdf0e10cSrcweir 	}
1965*cdf0e10cSrcweir     catch(const SQLException& )
1966*cdf0e10cSrcweir     {
1967*cdf0e10cSrcweir         SQLExceptionInfo aError( ::cppu::getCaughtException() );
1968*cdf0e10cSrcweir         showError( aError );
1969*cdf0e10cSrcweir         return;
1970*cdf0e10cSrcweir     }
1971*cdf0e10cSrcweir 	catch(Exception&)
1972*cdf0e10cSrcweir 	{
1973*cdf0e10cSrcweir 		return;
1974*cdf0e10cSrcweir 	}
1975*cdf0e10cSrcweir 
1976*cdf0e10cSrcweir 	::rtl::OUString sNewVal = bFilter ? xParser->getFilter() : xParser->getOrder();
1977*cdf0e10cSrcweir 	sal_Bool bOldFilterApplied(sal_False);
1978*cdf0e10cSrcweir 	if (bFilter)
1979*cdf0e10cSrcweir 	{
1980*cdf0e10cSrcweir 		try { bOldFilterApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER)); } catch(Exception&) { } ;
1981*cdf0e10cSrcweir 	}
1982*cdf0e10cSrcweir 
1983*cdf0e10cSrcweir 	::rtl::OUString sNewHaving = xParser->getHavingClause();
1984*cdf0e10cSrcweir 	if ( sOldVal.equals(sNewVal) && (!bFilter || sOldHaving.equals(sNewHaving)) )
1985*cdf0e10cSrcweir 		// nothing to be done
1986*cdf0e10cSrcweir 		return;
1987*cdf0e10cSrcweir 
1988*cdf0e10cSrcweir 	if (bFilter)
1989*cdf0e10cSrcweir 		applyParserFilter(sOldVal, bOldFilterApplied,sOldHaving,xParser);
1990*cdf0e10cSrcweir 	else
1991*cdf0e10cSrcweir 		applyParserOrder(sOldVal,xParser);
1992*cdf0e10cSrcweir 
1993*cdf0e10cSrcweir     ::comphelper::disposeComponent(xParser);
1994*cdf0e10cSrcweir }
1995*cdf0e10cSrcweir 
1996*cdf0e10cSrcweir //------------------------------------------------------------------------------
1997*cdf0e10cSrcweir void SbaXDataBrowserController::ExecuteSearch()
1998*cdf0e10cSrcweir {
1999*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteSearch" );
2000*cdf0e10cSrcweir 	// calculate the control source of the active field
2001*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XGrid >	xGrid(getBrowserView()->getGridControl(), UNO_QUERY);
2002*cdf0e10cSrcweir 	DBG_ASSERT(xGrid.is(), "SbaXDataBrowserController::ExecuteSearch : the control should have an ::com::sun::star::form::XGrid interface !");
2003*cdf0e10cSrcweir 
2004*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XGridPeer >	xGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY);
2005*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexContainer >  xColumns = xGridPeer->getColumns();
2006*cdf0e10cSrcweir 	DBG_ASSERT(xGridPeer.is() && xColumns.is(), "SbaXDataBrowserController::ExecuteSearch : invalid peer !");
2007*cdf0e10cSrcweir 
2008*cdf0e10cSrcweir 	sal_Int16 nViewCol = xGrid->getCurrentColumnPosition();
2009*cdf0e10cSrcweir 	sal_Int16 nModelCol = getBrowserView()->View2ModelPos(nViewCol);
2010*cdf0e10cSrcweir 
2011*cdf0e10cSrcweir 	Reference< XPropertySet >  xCurrentCol(xColumns->getByIndex(nModelCol),UNO_QUERY);
2012*cdf0e10cSrcweir 	String sActiveField = ::comphelper::getString(xCurrentCol->getPropertyValue(PROPERTY_CONTROLSOURCE));
2013*cdf0e10cSrcweir 
2014*cdf0e10cSrcweir 	// the text within the current cell
2015*cdf0e10cSrcweir 	String sInitialText;
2016*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexAccess >	xColControls(xGridPeer, UNO_QUERY);
2017*cdf0e10cSrcweir 	Reference< XInterface >  xCurControl(xColControls->getByIndex(nViewCol),UNO_QUERY);
2018*cdf0e10cSrcweir 	::rtl::OUString aInitialText;
2019*cdf0e10cSrcweir 	if (IsSearchableControl(xCurControl, &aInitialText))
2020*cdf0e10cSrcweir 		sInitialText = (const sal_Unicode*)aInitialText;
2021*cdf0e10cSrcweir 
2022*cdf0e10cSrcweir 	// prohibit the synchronization of the grid's display with the cursor's position
2023*cdf0e10cSrcweir 	Reference< XPropertySet >  xModelSet(getControlModel(), UNO_QUERY);
2024*cdf0e10cSrcweir 	DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::ExecuteSearch : no model set ?!");
2025*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_False)));
2026*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_True)));
2027*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), makeAny(sal_Int32(COL_LIGHTRED)));
2028*cdf0e10cSrcweir 
2029*cdf0e10cSrcweir 	Reference< ::com::sun::star::util::XNumberFormatsSupplier >  xNFS(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB()));
2030*cdf0e10cSrcweir 
2031*cdf0e10cSrcweir 	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
2032*cdf0e10cSrcweir     AbstractFmSearchDialog* pDialog = NULL;
2033*cdf0e10cSrcweir     if ( pFact )
2034*cdf0e10cSrcweir     {
2035*cdf0e10cSrcweir         ::std::vector< String > aContextNames;
2036*cdf0e10cSrcweir         aContextNames.push_back( String::CreateFromAscii("Standard") );
2037*cdf0e10cSrcweir 	    pDialog = pFact->CreateFmSearchDialog(getBrowserView(), sInitialText, aContextNames, 0, LINK(this, SbaXDataBrowserController, OnSearchContextRequest));
2038*cdf0e10cSrcweir     }
2039*cdf0e10cSrcweir 	DBG_ASSERT( pDialog, "SbaXDataBrowserController::ExecuteSearch: could not get the search dialog!" );
2040*cdf0e10cSrcweir     if ( pDialog )
2041*cdf0e10cSrcweir     {
2042*cdf0e10cSrcweir 	    pDialog->SetActiveField( sActiveField );
2043*cdf0e10cSrcweir 	    pDialog->SetFoundHandler( LINK( this, SbaXDataBrowserController, OnFoundData ) );
2044*cdf0e10cSrcweir 	    pDialog->SetCanceledNotFoundHdl( LINK( this, SbaXDataBrowserController, OnCanceledNotFound ) );
2045*cdf0e10cSrcweir 	    pDialog->Execute();
2046*cdf0e10cSrcweir     	delete pDialog;
2047*cdf0e10cSrcweir     }
2048*cdf0e10cSrcweir 
2049*cdf0e10cSrcweir 	// restore the grid's normal operating state
2050*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True)));
2051*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_False)));
2052*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), Any());
2053*cdf0e10cSrcweir }
2054*cdf0e10cSrcweir 
2055*cdf0e10cSrcweir //------------------------------------------------------------------------------
2056*cdf0e10cSrcweir void SbaXDataBrowserController::Execute(sal_uInt16 nId, const Sequence< PropertyValue >& _rArgs)
2057*cdf0e10cSrcweir {
2058*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Execute" );
2059*cdf0e10cSrcweir 	sal_Bool bSortUp = sal_True;
2060*cdf0e10cSrcweir 
2061*cdf0e10cSrcweir 	switch (nId)
2062*cdf0e10cSrcweir 	{
2063*cdf0e10cSrcweir         default:
2064*cdf0e10cSrcweir             SbaXDataBrowserController_Base::Execute( nId, _rArgs );
2065*cdf0e10cSrcweir             return;
2066*cdf0e10cSrcweir 
2067*cdf0e10cSrcweir         case ID_BROWSER_INSERT_ROW:
2068*cdf0e10cSrcweir             try
2069*cdf0e10cSrcweir             {
2070*cdf0e10cSrcweir                 if (SaveModified())
2071*cdf0e10cSrcweir                 {
2072*cdf0e10cSrcweir 					getRowSet()->afterLast();
2073*cdf0e10cSrcweir                     // check if it is available
2074*cdf0e10cSrcweir 				    Reference< XResultSetUpdate >  xUpdateCursor(getRowSet(), UNO_QUERY_THROW);
2075*cdf0e10cSrcweir                     xUpdateCursor->moveToInsertRow();
2076*cdf0e10cSrcweir                 }
2077*cdf0e10cSrcweir             }
2078*cdf0e10cSrcweir             catch(Exception&)
2079*cdf0e10cSrcweir             {
2080*cdf0e10cSrcweir                 OSL_ENSURE(0,"Exception caught!");
2081*cdf0e10cSrcweir             }
2082*cdf0e10cSrcweir             break;
2083*cdf0e10cSrcweir         case SID_FM_DELETEROWS:
2084*cdf0e10cSrcweir 
2085*cdf0e10cSrcweir             if (SaveModified())
2086*cdf0e10cSrcweir             {
2087*cdf0e10cSrcweir 				SbaGridControl* pVclGrid = getBrowserView()->getVclControl();
2088*cdf0e10cSrcweir 				if ( pVclGrid )
2089*cdf0e10cSrcweir 				{
2090*cdf0e10cSrcweir 					if( !pVclGrid->GetSelectRowCount() )
2091*cdf0e10cSrcweir 					{
2092*cdf0e10cSrcweir 						pVclGrid->DeactivateCell();
2093*cdf0e10cSrcweir 						pVclGrid->SelectRow(pVclGrid->GetCurRow());
2094*cdf0e10cSrcweir 					}
2095*cdf0e10cSrcweir 					pVclGrid->DeleteSelectedRows();
2096*cdf0e10cSrcweir 				}
2097*cdf0e10cSrcweir             }
2098*cdf0e10cSrcweir             break;
2099*cdf0e10cSrcweir 
2100*cdf0e10cSrcweir         case ID_BROWSER_FILTERED:
2101*cdf0e10cSrcweir 			if (SaveModified())
2102*cdf0e10cSrcweir 			{
2103*cdf0e10cSrcweir 				Reference< XPropertySet >  xActiveSet(getRowSet(), UNO_QUERY);
2104*cdf0e10cSrcweir 				sal_Bool bApplied = ::comphelper::getBOOL(xActiveSet->getPropertyValue(PROPERTY_APPLYFILTER));
2105*cdf0e10cSrcweir 				xActiveSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(!bApplied)));
2106*cdf0e10cSrcweir 				reloadForm(m_xLoadable);
2107*cdf0e10cSrcweir 			}
2108*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_FILTERED);
2109*cdf0e10cSrcweir 			break;
2110*cdf0e10cSrcweir 		case ID_BROWSER_EDITDOC:
2111*cdf0e10cSrcweir 		{
2112*cdf0e10cSrcweir 			sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions();
2113*cdf0e10cSrcweir 			if (nGridMode == DbGridControl::OPT_READONLY)
2114*cdf0e10cSrcweir 				getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_UPDATE | DbGridControl::OPT_INSERT | DbGridControl::OPT_DELETE);
2115*cdf0e10cSrcweir 					// the options not supported by the data source will be removed automatically
2116*cdf0e10cSrcweir 			else
2117*cdf0e10cSrcweir 			{
2118*cdf0e10cSrcweir 				if ( !SaveModified( ) )
2119*cdf0e10cSrcweir 					// give the user a chance to save the current record (if neccessary)
2120*cdf0e10cSrcweir 					break;
2121*cdf0e10cSrcweir 
2122*cdf0e10cSrcweir 				// maybe the user wanted to reject the modified record ?
2123*cdf0e10cSrcweir 				if (GetState(ID_BROWSER_UNDORECORD).bEnabled)
2124*cdf0e10cSrcweir 					Execute(ID_BROWSER_UNDORECORD,Sequence<PropertyValue>());
2125*cdf0e10cSrcweir 
2126*cdf0e10cSrcweir 				getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_READONLY);
2127*cdf0e10cSrcweir 			}
2128*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_EDITDOC);
2129*cdf0e10cSrcweir 		}
2130*cdf0e10cSrcweir 		break;
2131*cdf0e10cSrcweir 
2132*cdf0e10cSrcweir 		case ID_BROWSER_SEARCH:
2133*cdf0e10cSrcweir 			if ( SaveModified( ) )
2134*cdf0e10cSrcweir 				ExecuteSearch();
2135*cdf0e10cSrcweir 			break;
2136*cdf0e10cSrcweir 
2137*cdf0e10cSrcweir 		case ID_BROWSER_COPY:
2138*cdf0e10cSrcweir             if ( getBrowserView()->getVclControl()->GetSelectRowCount() > 0 )
2139*cdf0e10cSrcweir             {
2140*cdf0e10cSrcweir                 getBrowserView()->getVclControl()->CopySelectedRowsToClipboard();
2141*cdf0e10cSrcweir                 break;
2142*cdf0e10cSrcweir             }
2143*cdf0e10cSrcweir             // run through
2144*cdf0e10cSrcweir 		case ID_BROWSER_CUT:
2145*cdf0e10cSrcweir 		case ID_BROWSER_PASTE:
2146*cdf0e10cSrcweir 		{
2147*cdf0e10cSrcweir 			CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller();
2148*cdf0e10cSrcweir 			if (!xCurrentController.Is())
2149*cdf0e10cSrcweir 				// should be intercepted by GetState. Normally.
2150*cdf0e10cSrcweir 				// Unfortunately ID_BROWSER_PASTE is a 'fast call' slot, which means it may be executed without checking if it is
2151*cdf0e10cSrcweir 				// enabled. This would be really deadly herein if the current cell has no controller ...
2152*cdf0e10cSrcweir 				// (FS - 13.04.99 - #64694#)
2153*cdf0e10cSrcweir 				return;
2154*cdf0e10cSrcweir 
2155*cdf0e10cSrcweir 			Edit& rEdit = (Edit&)xCurrentController->GetWindow();
2156*cdf0e10cSrcweir 			switch (nId)
2157*cdf0e10cSrcweir 			{
2158*cdf0e10cSrcweir 				case ID_BROWSER_CUT :       rEdit.Cut();    break;
2159*cdf0e10cSrcweir 				case SID_COPY	:           rEdit.Copy();   break;
2160*cdf0e10cSrcweir 				case ID_BROWSER_PASTE	:   rEdit.Paste();  break;
2161*cdf0e10cSrcweir 			}
2162*cdf0e10cSrcweir 			if (ID_BROWSER_CUT == nId || ID_BROWSER_PASTE == nId)
2163*cdf0e10cSrcweir 			{
2164*cdf0e10cSrcweir 				xCurrentController->SetModified();
2165*cdf0e10cSrcweir 				rEdit.Modify();
2166*cdf0e10cSrcweir 			}
2167*cdf0e10cSrcweir 		}
2168*cdf0e10cSrcweir 		break;
2169*cdf0e10cSrcweir 
2170*cdf0e10cSrcweir 		case ID_BROWSER_SORTDOWN:
2171*cdf0e10cSrcweir 			bSortUp = sal_False;
2172*cdf0e10cSrcweir 			// DON'T break
2173*cdf0e10cSrcweir 		case ID_BROWSER_SORTUP:
2174*cdf0e10cSrcweir 		{
2175*cdf0e10cSrcweir 			if (!SaveModified())
2176*cdf0e10cSrcweir 				break;
2177*cdf0e10cSrcweir 
2178*cdf0e10cSrcweir 			if (!isValidCursor())
2179*cdf0e10cSrcweir 				break;
2180*cdf0e10cSrcweir 
2181*cdf0e10cSrcweir 			// only one sort order
2182*cdf0e10cSrcweir 			Reference< XPropertySet >  xField(getBoundField(), UNO_QUERY);
2183*cdf0e10cSrcweir 			if (!xField.is())
2184*cdf0e10cSrcweir 				break;
2185*cdf0e10cSrcweir 
2186*cdf0e10cSrcweir             Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow();
2187*cdf0e10cSrcweir 			const ::rtl::OUString sOldSort = xParser->getOrder();
2188*cdf0e10cSrcweir 			sal_Bool bParserSuccess = sal_False;
2189*cdf0e10cSrcweir 			HANDLE_SQL_ERRORS(
2190*cdf0e10cSrcweir 				xParser->setOrder(::rtl::OUString()); xParser->appendOrderByColumn(xField, bSortUp),
2191*cdf0e10cSrcweir 				bParserSuccess,
2192*cdf0e10cSrcweir 				UniString(ModuleRes(SBA_BROWSER_SETTING_ORDER)),
2193*cdf0e10cSrcweir 				"SbaXDataBrowserController::Execute : caught an exception while composing the new filter !"
2194*cdf0e10cSrcweir 			)
2195*cdf0e10cSrcweir 
2196*cdf0e10cSrcweir 			if (bParserSuccess)
2197*cdf0e10cSrcweir 				applyParserOrder(sOldSort,xParser);
2198*cdf0e10cSrcweir 		}
2199*cdf0e10cSrcweir 		break;
2200*cdf0e10cSrcweir 
2201*cdf0e10cSrcweir 		case ID_BROWSER_AUTOFILTER:
2202*cdf0e10cSrcweir 		{
2203*cdf0e10cSrcweir 			if (!SaveModified())
2204*cdf0e10cSrcweir 				break;
2205*cdf0e10cSrcweir 
2206*cdf0e10cSrcweir 			if (!isValidCursor())
2207*cdf0e10cSrcweir 				break;
2208*cdf0e10cSrcweir 
2209*cdf0e10cSrcweir 			Reference< XPropertySet >  xField(getBoundField(), UNO_QUERY);
2210*cdf0e10cSrcweir 			if (!xField.is())
2211*cdf0e10cSrcweir 				break;
2212*cdf0e10cSrcweir 
2213*cdf0e10cSrcweir 			// check if the column is a aggregate function
2214*cdf0e10cSrcweir 			sal_Bool bHaving = sal_False;
2215*cdf0e10cSrcweir 			::rtl::OUString sName;
2216*cdf0e10cSrcweir 			xField->getPropertyValue(PROPERTY_NAME) >>= sName;
2217*cdf0e10cSrcweir 			Reference< XColumnsSupplier > xColumnsSupplier(m_xParser, UNO_QUERY);
2218*cdf0e10cSrcweir 			Reference< ::com::sun::star::container::XNameAccess >  xCols = xColumnsSupplier.is() ? xColumnsSupplier->getColumns() : Reference< ::com::sun::star::container::XNameAccess > ();
2219*cdf0e10cSrcweir 			if ( xCols.is() && xCols->hasByName(sName) )
2220*cdf0e10cSrcweir 			{
2221*cdf0e10cSrcweir 				Reference<XPropertySet> xProp(xCols->getByName(sName),UNO_QUERY);
2222*cdf0e10cSrcweir 				static ::rtl::OUString sAgg(RTL_CONSTASCII_USTRINGPARAM("AggregateFunction"));
2223*cdf0e10cSrcweir 				if ( xProp->getPropertySetInfo()->hasPropertyByName(sAgg) )
2224*cdf0e10cSrcweir 					xProp->getPropertyValue(sAgg) >>= bHaving;
2225*cdf0e10cSrcweir 			}
2226*cdf0e10cSrcweir 
2227*cdf0e10cSrcweir             Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow();
2228*cdf0e10cSrcweir 			const ::rtl::OUString sOldFilter = xParser->getFilter();
2229*cdf0e10cSrcweir 			const ::rtl::OUString sOldHaving = xParser->getHavingClause();
2230*cdf0e10cSrcweir 
2231*cdf0e10cSrcweir 			Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
2232*cdf0e10cSrcweir 			sal_Bool bApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER));
2233*cdf0e10cSrcweir 			// do we have a filter but it's not applied ?
2234*cdf0e10cSrcweir 			// -> completely overwrite it, else append one
2235*cdf0e10cSrcweir 			if (!bApplied)
2236*cdf0e10cSrcweir 			{
2237*cdf0e10cSrcweir 				DO_SAFE( (bHaving ? xParser->setHavingClause(::rtl::OUString()) : xParser->setFilter(::rtl::OUString())), "SbaXDataBrowserController::Execute : caught an exception while resetting the new filter !" );
2238*cdf0e10cSrcweir 			}
2239*cdf0e10cSrcweir 
2240*cdf0e10cSrcweir 			sal_Bool bParserSuccess = sal_False;
2241*cdf0e10cSrcweir 
2242*cdf0e10cSrcweir             sal_Int32 nOp = SQLFilterOperator::EQUAL;
2243*cdf0e10cSrcweir             if ( xField.is() )
2244*cdf0e10cSrcweir             {
2245*cdf0e10cSrcweir                 sal_Int32 nType = 0;
2246*cdf0e10cSrcweir                 xField->getPropertyValue(PROPERTY_TYPE) >>= nType;
2247*cdf0e10cSrcweir                 switch(nType)
2248*cdf0e10cSrcweir                 {
2249*cdf0e10cSrcweir                     case DataType::VARCHAR:
2250*cdf0e10cSrcweir 		            case DataType::CHAR:
2251*cdf0e10cSrcweir 		            case DataType::LONGVARCHAR:
2252*cdf0e10cSrcweir                         nOp = SQLFilterOperator::LIKE;
2253*cdf0e10cSrcweir                         break;
2254*cdf0e10cSrcweir                     default:
2255*cdf0e10cSrcweir                         nOp = SQLFilterOperator::EQUAL;
2256*cdf0e10cSrcweir                 }
2257*cdf0e10cSrcweir             }
2258*cdf0e10cSrcweir 
2259*cdf0e10cSrcweir 			if ( bHaving )
2260*cdf0e10cSrcweir 			{
2261*cdf0e10cSrcweir 				HANDLE_SQL_ERRORS(
2262*cdf0e10cSrcweir                     xParser->appendHavingClauseByColumn(xField,sal_True,nOp),
2263*cdf0e10cSrcweir 					bParserSuccess,
2264*cdf0e10cSrcweir 					UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)),
2265*cdf0e10cSrcweir 					"SbaXDataBrowserController::Execute : caught an exception while composing the new filter !"
2266*cdf0e10cSrcweir 				)
2267*cdf0e10cSrcweir 			}
2268*cdf0e10cSrcweir 			else
2269*cdf0e10cSrcweir 			{
2270*cdf0e10cSrcweir 				HANDLE_SQL_ERRORS(
2271*cdf0e10cSrcweir 					xParser->appendFilterByColumn(xField,sal_True,nOp),
2272*cdf0e10cSrcweir 					bParserSuccess,
2273*cdf0e10cSrcweir 					UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)),
2274*cdf0e10cSrcweir 					"SbaXDataBrowserController::Execute : caught an exception while composing the new filter !"
2275*cdf0e10cSrcweir 				)
2276*cdf0e10cSrcweir 			}
2277*cdf0e10cSrcweir 
2278*cdf0e10cSrcweir 			if (bParserSuccess)
2279*cdf0e10cSrcweir 				applyParserFilter(sOldFilter, bApplied,sOldHaving,xParser);
2280*cdf0e10cSrcweir 
2281*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_REMOVEFILTER);
2282*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_FILTERED);
2283*cdf0e10cSrcweir 		}
2284*cdf0e10cSrcweir 		break;
2285*cdf0e10cSrcweir 
2286*cdf0e10cSrcweir 		case ID_BROWSER_ORDERCRIT:
2287*cdf0e10cSrcweir 			ExecuteFilterSortCrit(sal_False);
2288*cdf0e10cSrcweir 			break;
2289*cdf0e10cSrcweir 
2290*cdf0e10cSrcweir 		case ID_BROWSER_FILTERCRIT:
2291*cdf0e10cSrcweir 			ExecuteFilterSortCrit(sal_True);
2292*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_FILTERED);
2293*cdf0e10cSrcweir 			break;
2294*cdf0e10cSrcweir 
2295*cdf0e10cSrcweir 		case ID_BROWSER_REMOVEFILTER:
2296*cdf0e10cSrcweir 		{
2297*cdf0e10cSrcweir 			if (!SaveModified())
2298*cdf0e10cSrcweir 				break;
2299*cdf0e10cSrcweir 
2300*cdf0e10cSrcweir 			sal_Bool bNeedPostReload = preReloadForm();
2301*cdf0e10cSrcweir 			// reset the filter and the sort property simutaneously so only _one_ new statement has to be
2302*cdf0e10cSrcweir 			// sent
2303*cdf0e10cSrcweir 			Reference< XPropertySet >  xSet(getRowSet(), UNO_QUERY);
2304*cdf0e10cSrcweir 			if ( xSet.is() )
2305*cdf0e10cSrcweir 			{
2306*cdf0e10cSrcweir 				xSet->setPropertyValue(PROPERTY_FILTER,makeAny(::rtl::OUString()));
2307*cdf0e10cSrcweir 				xSet->setPropertyValue(PROPERTY_HAVING_CLAUSE,makeAny(::rtl::OUString()));
2308*cdf0e10cSrcweir 				xSet->setPropertyValue(PROPERTY_ORDER,makeAny(::rtl::OUString()));
2309*cdf0e10cSrcweir 			}
2310*cdf0e10cSrcweir 			try
2311*cdf0e10cSrcweir 			{
2312*cdf0e10cSrcweir 				reloadForm(m_xLoadable);
2313*cdf0e10cSrcweir 				if ( bNeedPostReload )
2314*cdf0e10cSrcweir 					postReloadForm();
2315*cdf0e10cSrcweir 			}
2316*cdf0e10cSrcweir 			catch(Exception&)
2317*cdf0e10cSrcweir 			{
2318*cdf0e10cSrcweir 			}
2319*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_REMOVEFILTER);
2320*cdf0e10cSrcweir 			InvalidateFeature(ID_BROWSER_FILTERED);
2321*cdf0e10cSrcweir 		}
2322*cdf0e10cSrcweir 		break;
2323*cdf0e10cSrcweir 
2324*cdf0e10cSrcweir 		case ID_BROWSER_REFRESH:
2325*cdf0e10cSrcweir 			if ( SaveModified( ) )
2326*cdf0e10cSrcweir 			{
2327*cdf0e10cSrcweir 				if (!reloadForm(m_xLoadable))
2328*cdf0e10cSrcweir 					criticalFail();
2329*cdf0e10cSrcweir 			}
2330*cdf0e10cSrcweir 			break;
2331*cdf0e10cSrcweir 
2332*cdf0e10cSrcweir 		case ID_BROWSER_SAVERECORD:
2333*cdf0e10cSrcweir 			if ( SaveModified( sal_False ) )
2334*cdf0e10cSrcweir 				setCurrentModified( sal_False );
2335*cdf0e10cSrcweir 			break;
2336*cdf0e10cSrcweir 
2337*cdf0e10cSrcweir 		case ID_BROWSER_UNDORECORD:
2338*cdf0e10cSrcweir 		{
2339*cdf0e10cSrcweir 			try
2340*cdf0e10cSrcweir 			{
2341*cdf0e10cSrcweir 				// restore the cursor state
2342*cdf0e10cSrcweir 				Reference< XResultSetUpdate >  xCursor(getRowSet(), UNO_QUERY);
2343*cdf0e10cSrcweir 				Reference< XPropertySet >  xSet(xCursor, UNO_QUERY);
2344*cdf0e10cSrcweir 				Any aVal = xSet->getPropertyValue(PROPERTY_ISNEW);
2345*cdf0e10cSrcweir 				if (aVal.hasValue() && ::comphelper::getBOOL(aVal))
2346*cdf0e10cSrcweir 				{
2347*cdf0e10cSrcweir 					xCursor->moveToInsertRow();
2348*cdf0e10cSrcweir 					// no need to reset the grid model after we moved to the insert row, this is done implicitly by the
2349*cdf0e10cSrcweir 					// form
2350*cdf0e10cSrcweir 					// (and in some cases it may be deadly to do the reset explicitly after the form did it implicitly,
2351*cdf0e10cSrcweir 					// cause the form's reset may be async, and this leads to some nice deadlock scenarios ....)
2352*cdf0e10cSrcweir 				}
2353*cdf0e10cSrcweir 				else
2354*cdf0e10cSrcweir 				{
2355*cdf0e10cSrcweir 					xCursor->cancelRowUpdates();
2356*cdf0e10cSrcweir 
2357*cdf0e10cSrcweir 					// restore the grids state
2358*cdf0e10cSrcweir 					Reference< ::com::sun::star::form::XReset >  xReset(getControlModel(), UNO_QUERY);
2359*cdf0e10cSrcweir 					if (xReset.is())
2360*cdf0e10cSrcweir 						xReset->reset();
2361*cdf0e10cSrcweir 				}
2362*cdf0e10cSrcweir 			}
2363*cdf0e10cSrcweir 			catch(SQLException&)
2364*cdf0e10cSrcweir 			{
2365*cdf0e10cSrcweir 			}
2366*cdf0e10cSrcweir 
2367*cdf0e10cSrcweir 			setCurrentModified( sal_False );
2368*cdf0e10cSrcweir 		}
2369*cdf0e10cSrcweir 	}
2370*cdf0e10cSrcweir }
2371*cdf0e10cSrcweir 
2372*cdf0e10cSrcweir //------------------------------------------------------------------------------
2373*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::SaveModified(sal_Bool bAskFor)
2374*cdf0e10cSrcweir {
2375*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveModified" );
2376*cdf0e10cSrcweir 	if ( bAskFor && GetState(ID_BROWSER_SAVERECORD).bEnabled )
2377*cdf0e10cSrcweir 	{
2378*cdf0e10cSrcweir 		getBrowserView()->getVclControl()->GrabFocus();
2379*cdf0e10cSrcweir 
2380*cdf0e10cSrcweir 		QueryBox aQry(getBrowserView()->getVclControl(), ModuleRes(QUERY_BRW_SAVEMODIFIED));
2381*cdf0e10cSrcweir 
2382*cdf0e10cSrcweir 		switch (aQry.Execute())
2383*cdf0e10cSrcweir 		{
2384*cdf0e10cSrcweir 			case RET_NO:
2385*cdf0e10cSrcweir 				Execute(ID_BROWSER_UNDORECORD,Sequence<PropertyValue>());
2386*cdf0e10cSrcweir 				return sal_True;
2387*cdf0e10cSrcweir 			case RET_CANCEL:
2388*cdf0e10cSrcweir 				return sal_False;
2389*cdf0e10cSrcweir 		}
2390*cdf0e10cSrcweir 	}
2391*cdf0e10cSrcweir 
2392*cdf0e10cSrcweir 	if ( !CommitCurrent() )	// das aktuelle Control committen lassen
2393*cdf0e10cSrcweir 		return sal_False;
2394*cdf0e10cSrcweir 
2395*cdf0e10cSrcweir 	Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
2396*cdf0e10cSrcweir 	sal_Bool bResult = sal_False;
2397*cdf0e10cSrcweir 	try
2398*cdf0e10cSrcweir 	{
2399*cdf0e10cSrcweir 		if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED)))
2400*cdf0e10cSrcweir 		{
2401*cdf0e10cSrcweir 			Reference< XResultSetUpdate >  xCursor(getRowSet(), UNO_QUERY);
2402*cdf0e10cSrcweir 			if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISNEW)))
2403*cdf0e10cSrcweir 				xCursor->insertRow();
2404*cdf0e10cSrcweir 			else
2405*cdf0e10cSrcweir 				xCursor->updateRow();
2406*cdf0e10cSrcweir 		}
2407*cdf0e10cSrcweir 		bResult = sal_True;
2408*cdf0e10cSrcweir 	}
2409*cdf0e10cSrcweir 	catch(SQLException&)
2410*cdf0e10cSrcweir 	{
2411*cdf0e10cSrcweir 	}
2412*cdf0e10cSrcweir 	catch(Exception&)
2413*cdf0e10cSrcweir 	{
2414*cdf0e10cSrcweir 		DBG_ERROR("SbaXDataBrowserController::SaveModified : could not save the current record !");
2415*cdf0e10cSrcweir 		bResult = sal_False;
2416*cdf0e10cSrcweir 	}
2417*cdf0e10cSrcweir 
2418*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_SAVERECORD);
2419*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_UNDORECORD);
2420*cdf0e10cSrcweir 	return bResult;
2421*cdf0e10cSrcweir }
2422*cdf0e10cSrcweir 
2423*cdf0e10cSrcweir //------------------------------------------------------------------------------
2424*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::CommitCurrent()
2425*cdf0e10cSrcweir {
2426*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CommitCurrent" );
2427*cdf0e10cSrcweir 	if (!getBrowserView())
2428*cdf0e10cSrcweir 		return sal_True;
2429*cdf0e10cSrcweir 
2430*cdf0e10cSrcweir 	Reference< ::com::sun::star::awt::XControl >  xActiveControl(getBrowserView()->getGridControl());
2431*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XBoundControl >	xLockingTest(xActiveControl, UNO_QUERY);
2432*cdf0e10cSrcweir 	sal_Bool bControlIsLocked = xLockingTest.is() && xLockingTest->getLock();
2433*cdf0e10cSrcweir 	if (xActiveControl.is() && !bControlIsLocked)
2434*cdf0e10cSrcweir 	{
2435*cdf0e10cSrcweir 		// zunaechst das Control fragen ob es das IFace unterstuetzt
2436*cdf0e10cSrcweir 		Reference< ::com::sun::star::form::XBoundComponent >  xBoundControl(xActiveControl, UNO_QUERY);
2437*cdf0e10cSrcweir 		if (!xBoundControl.is())
2438*cdf0e10cSrcweir 			xBoundControl  = Reference< ::com::sun::star::form::XBoundComponent > (xActiveControl->getModel(), UNO_QUERY);
2439*cdf0e10cSrcweir 		if (xBoundControl.is() && !xBoundControl->commit())
2440*cdf0e10cSrcweir 			return sal_False;
2441*cdf0e10cSrcweir 	}
2442*cdf0e10cSrcweir 	return sal_True;
2443*cdf0e10cSrcweir }
2444*cdf0e10cSrcweir 
2445*cdf0e10cSrcweir //------------------------------------------------------------------------------
2446*cdf0e10cSrcweir void SbaXDataBrowserController::setCurrentModified( sal_Bool _bSet )
2447*cdf0e10cSrcweir {
2448*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentModified" );
2449*cdf0e10cSrcweir 	m_bCurrentlyModified = _bSet;
2450*cdf0e10cSrcweir 	InvalidateFeature( ID_BROWSER_SAVERECORD );
2451*cdf0e10cSrcweir 	InvalidateFeature( ID_BROWSER_UNDORECORD );
2452*cdf0e10cSrcweir }
2453*cdf0e10cSrcweir 
2454*cdf0e10cSrcweir //------------------------------------------------------------------------------
2455*cdf0e10cSrcweir void SbaXDataBrowserController::RowChanged()
2456*cdf0e10cSrcweir {
2457*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RowChanged" );
2458*cdf0e10cSrcweir 	setCurrentModified( sal_False );
2459*cdf0e10cSrcweir }
2460*cdf0e10cSrcweir 
2461*cdf0e10cSrcweir //------------------------------------------------------------------------------
2462*cdf0e10cSrcweir void SbaXDataBrowserController::ColumnChanged()
2463*cdf0e10cSrcweir {
2464*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ColumnChanged" );
2465*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_SORTUP);
2466*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_SORTDOWN);
2467*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_ORDERCRIT);
2468*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_FILTERCRIT);
2469*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_AUTOFILTER);
2470*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_REMOVEFILTER);
2471*cdf0e10cSrcweir 
2472*cdf0e10cSrcweir 	setCurrentModified( sal_False );
2473*cdf0e10cSrcweir }
2474*cdf0e10cSrcweir 
2475*cdf0e10cSrcweir //------------------------------------------------------------------------------
2476*cdf0e10cSrcweir void SbaXDataBrowserController::SelectionChanged()
2477*cdf0e10cSrcweir {
2478*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SelectionChanged" );
2479*cdf0e10cSrcweir     // not interested in
2480*cdf0e10cSrcweir }
2481*cdf0e10cSrcweir 
2482*cdf0e10cSrcweir //------------------------------------------------------------------------------
2483*cdf0e10cSrcweir void SbaXDataBrowserController::CellActivated()
2484*cdf0e10cSrcweir {
2485*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellActivated" );
2486*cdf0e10cSrcweir 	m_aInvalidateClipboard.Start();
2487*cdf0e10cSrcweir     OnInvalidateClipboard( NULL );
2488*cdf0e10cSrcweir }
2489*cdf0e10cSrcweir 
2490*cdf0e10cSrcweir //------------------------------------------------------------------------------
2491*cdf0e10cSrcweir void SbaXDataBrowserController::CellDeactivated()
2492*cdf0e10cSrcweir {
2493*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellDeactivated" );
2494*cdf0e10cSrcweir 	m_aInvalidateClipboard.Stop();
2495*cdf0e10cSrcweir     OnInvalidateClipboard( NULL );
2496*cdf0e10cSrcweir }
2497*cdf0e10cSrcweir 
2498*cdf0e10cSrcweir //------------------------------------------------------------------------------
2499*cdf0e10cSrcweir IMPL_LINK( SbaXDataBrowserController, OnClipboardChanged, void*, EMPTYARG )
2500*cdf0e10cSrcweir {
2501*cdf0e10cSrcweir 	::vos::OGuard aGuard(Application::GetSolarMutex());
2502*cdf0e10cSrcweir 	return OnInvalidateClipboard( NULL );
2503*cdf0e10cSrcweir }
2504*cdf0e10cSrcweir 
2505*cdf0e10cSrcweir //------------------------------------------------------------------------------
2506*cdf0e10cSrcweir IMPL_LINK(SbaXDataBrowserController, OnInvalidateClipboard, AutoTimer*, _pTimer)
2507*cdf0e10cSrcweir {
2508*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_CUT);
2509*cdf0e10cSrcweir 	InvalidateFeature(ID_BROWSER_COPY);
2510*cdf0e10cSrcweir 
2511*cdf0e10cSrcweir     // if the invalidation was triggered by the timer, we do not need to invalidate PASTE.
2512*cdf0e10cSrcweir     // The timer is only for checking the CUT/COPY slots regulariry, which depend on the
2513*cdf0e10cSrcweir     // selection state of the active cell
2514*cdf0e10cSrcweir     // TODO: get a callback at the Edit which allows to be notified when the selection
2515*cdf0e10cSrcweir     // changes. This would be much better than this cycle-eating polling mechanism here ....
2516*cdf0e10cSrcweir     if ( _pTimer != &m_aInvalidateClipboard )
2517*cdf0e10cSrcweir 	    InvalidateFeature(ID_BROWSER_PASTE);
2518*cdf0e10cSrcweir 
2519*cdf0e10cSrcweir 	return 0L;
2520*cdf0e10cSrcweir }
2521*cdf0e10cSrcweir 
2522*cdf0e10cSrcweir // -------------------------------------------------------------------------
2523*cdf0e10cSrcweir Reference< XPropertySet >  SbaXDataBrowserController::getBoundField(sal_uInt16 nViewPos) const
2524*cdf0e10cSrcweir {
2525*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveData" );
2526*cdf0e10cSrcweir 	Reference< XPropertySet >  xEmptyReturn;
2527*cdf0e10cSrcweir 
2528*cdf0e10cSrcweir 	// get the current column from the grid
2529*cdf0e10cSrcweir 	if (nViewPos == (sal_uInt16)-1)
2530*cdf0e10cSrcweir 	{
2531*cdf0e10cSrcweir 		Reference< ::com::sun::star::form::XGrid >	xGrid(getBrowserView()->getGridControl(), UNO_QUERY);
2532*cdf0e10cSrcweir 		if (!xGrid.is())
2533*cdf0e10cSrcweir 			return xEmptyReturn;
2534*cdf0e10cSrcweir 		nViewPos = xGrid->getCurrentColumnPosition();
2535*cdf0e10cSrcweir 	}
2536*cdf0e10cSrcweir 	sal_uInt16 nCurrentCol = getBrowserView()->View2ModelPos(nViewPos);
2537*cdf0e10cSrcweir 	if (nCurrentCol == (sal_uInt16)-1)
2538*cdf0e10cSrcweir 		return xEmptyReturn;
2539*cdf0e10cSrcweir 
2540*cdf0e10cSrcweir 	// get the according column from the model
2541*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexContainer >  xCols(getControlModel(), UNO_QUERY);
2542*cdf0e10cSrcweir 	Reference< XPropertySet >  xCurrentCol(xCols->getByIndex(nCurrentCol),UNO_QUERY);
2543*cdf0e10cSrcweir 	if (!xCurrentCol.is())
2544*cdf0e10cSrcweir 		return xEmptyReturn;
2545*cdf0e10cSrcweir 
2546*cdf0e10cSrcweir 	xEmptyReturn.set(xCurrentCol->getPropertyValue(PROPERTY_BOUNDFIELD) ,UNO_QUERY);
2547*cdf0e10cSrcweir 	return xEmptyReturn;
2548*cdf0e10cSrcweir }
2549*cdf0e10cSrcweir 
2550*cdf0e10cSrcweir //------------------------------------------------------------------------------
2551*cdf0e10cSrcweir IMPL_LINK(SbaXDataBrowserController, OnSearchContextRequest, FmSearchContext*, pContext)
2552*cdf0e10cSrcweir {
2553*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexAccess >	xPeerContainer(getBrowserView()->getGridControl(), UNO_QUERY);
2554*cdf0e10cSrcweir 
2555*cdf0e10cSrcweir 	// check all grid columns for their control source
2556*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexAccess >	xModelColumns(getFormComponent(), UNO_QUERY);
2557*cdf0e10cSrcweir 	DBG_ASSERT(xModelColumns.is(), "SbaXDataBrowserController::OnSearchContextRequest : there is a grid control without columns !");
2558*cdf0e10cSrcweir 		// the case 'no columns' should be indicated with an empty container, I think ...
2559*cdf0e10cSrcweir 	DBG_ASSERT(xModelColumns->getCount() >= xPeerContainer->getCount(), "SbaXDataBrowserController::OnSearchContextRequest : impossible : have more view than model columns !");
2560*cdf0e10cSrcweir 
2561*cdf0e10cSrcweir 	String sFieldList;
2562*cdf0e10cSrcweir 	for (sal_Int32 nViewPos=0; nViewPos<xPeerContainer->getCount(); ++nViewPos)
2563*cdf0e10cSrcweir 	{
2564*cdf0e10cSrcweir 		Reference< XInterface >  xCurrentColumn(xPeerContainer->getByIndex(nViewPos),UNO_QUERY);
2565*cdf0e10cSrcweir 		if (!xCurrentColumn.is())
2566*cdf0e10cSrcweir 			continue;
2567*cdf0e10cSrcweir 
2568*cdf0e10cSrcweir 		// can we use this column control fo searching ?
2569*cdf0e10cSrcweir 		if (!IsSearchableControl(xCurrentColumn))
2570*cdf0e10cSrcweir 			continue;
2571*cdf0e10cSrcweir 
2572*cdf0e10cSrcweir 		sal_uInt16 nModelPos = getBrowserView()->View2ModelPos((sal_uInt16)nViewPos);
2573*cdf0e10cSrcweir 		Reference< XPropertySet >  xCurrentColModel(xModelColumns->getByIndex(nModelPos),UNO_QUERY);
2574*cdf0e10cSrcweir 		::rtl::OUString aName = ::comphelper::getString(xCurrentColModel->getPropertyValue(PROPERTY_CONTROLSOURCE));
2575*cdf0e10cSrcweir 
2576*cdf0e10cSrcweir 		sFieldList += (const sal_Unicode*)aName;
2577*cdf0e10cSrcweir 		sFieldList += ';';
2578*cdf0e10cSrcweir 
2579*cdf0e10cSrcweir 		pContext->arrFields.push_back(xCurrentColumn);
2580*cdf0e10cSrcweir 	}
2581*cdf0e10cSrcweir 	sFieldList.EraseTrailingChars(';');
2582*cdf0e10cSrcweir 
2583*cdf0e10cSrcweir 	pContext->xCursor.set(getRowSet(),UNO_QUERY);
2584*cdf0e10cSrcweir 	pContext->strUsedFields = sFieldList;
2585*cdf0e10cSrcweir 
2586*cdf0e10cSrcweir 	// if the cursor is in a mode other than STANDARD -> reset
2587*cdf0e10cSrcweir 	Reference< XPropertySet >  xCursorSet(pContext->xCursor, UNO_QUERY);
2588*cdf0e10cSrcweir 	DBG_ASSERT(xCursorSet.is() && !::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISMODIFIED)),
2589*cdf0e10cSrcweir 		"SbaXDataBrowserController::OnSearchContextRequest : please do not call for cursors with modified rows !");
2590*cdf0e10cSrcweir 	if (xCursorSet.is() && ::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISNEW)))
2591*cdf0e10cSrcweir 	{
2592*cdf0e10cSrcweir 		Reference< XResultSetUpdate >  xUpdateCursor(pContext->xCursor, UNO_QUERY);
2593*cdf0e10cSrcweir 		xUpdateCursor->moveToCurrentRow();
2594*cdf0e10cSrcweir 	}
2595*cdf0e10cSrcweir 	return pContext->arrFields.size();
2596*cdf0e10cSrcweir }
2597*cdf0e10cSrcweir 
2598*cdf0e10cSrcweir //------------------------------------------------------------------------------
2599*cdf0e10cSrcweir IMPL_LINK(SbaXDataBrowserController, OnFoundData, FmFoundRecordInformation*, pInfo)
2600*cdf0e10cSrcweir {
2601*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdbcx::XRowLocate >  xCursor(getRowSet(), UNO_QUERY);
2602*cdf0e10cSrcweir 	DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnFoundData : shit happens. sometimes. but this is simply impossible !");
2603*cdf0e10cSrcweir 
2604*cdf0e10cSrcweir 	// move the cursor
2605*cdf0e10cSrcweir 	xCursor->moveToBookmark(pInfo->aPosition);
2606*cdf0e10cSrcweir 
2607*cdf0e10cSrcweir 	// let the grid snyc it's display with the cursor
2608*cdf0e10cSrcweir 	Reference< XPropertySet >  xModelSet(getControlModel(), UNO_QUERY);
2609*cdf0e10cSrcweir 	DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnFoundData : no model set ?!");
2610*cdf0e10cSrcweir 	Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"));
2611*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True)));
2612*cdf0e10cSrcweir 	xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld);
2613*cdf0e10cSrcweir 
2614*cdf0e10cSrcweir 	// and move to the field
2615*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexAccess >	aColumnControls(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY);
2616*cdf0e10cSrcweir 	sal_uInt16 nViewPos;
2617*cdf0e10cSrcweir 
2618*cdf0e10cSrcweir 	for ( nViewPos = 0; nViewPos < aColumnControls->getCount(); ++nViewPos )
2619*cdf0e10cSrcweir 	{
2620*cdf0e10cSrcweir 		Reference< XInterface >  xCurrent(aColumnControls->getByIndex(nViewPos),UNO_QUERY);
2621*cdf0e10cSrcweir 		if (IsSearchableControl(xCurrent))
2622*cdf0e10cSrcweir 		{
2623*cdf0e10cSrcweir 			if (pInfo->nFieldPos)
2624*cdf0e10cSrcweir 				--pInfo->nFieldPos;
2625*cdf0e10cSrcweir 			else
2626*cdf0e10cSrcweir 				break;
2627*cdf0e10cSrcweir 		}
2628*cdf0e10cSrcweir 	}
2629*cdf0e10cSrcweir 
2630*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XGrid >	xGrid(getBrowserView()->getGridControl(), UNO_QUERY);
2631*cdf0e10cSrcweir 	xGrid->setCurrentColumnPosition(nViewPos);
2632*cdf0e10cSrcweir 
2633*cdf0e10cSrcweir 	return 0;
2634*cdf0e10cSrcweir }
2635*cdf0e10cSrcweir 
2636*cdf0e10cSrcweir //------------------------------------------------------------------------------
2637*cdf0e10cSrcweir IMPL_LINK(SbaXDataBrowserController, OnCanceledNotFound, FmFoundRecordInformation*, pInfo)
2638*cdf0e10cSrcweir {
2639*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdbcx::XRowLocate >  xCursor(getRowSet(), UNO_QUERY);
2640*cdf0e10cSrcweir 
2641*cdf0e10cSrcweir     try
2642*cdf0e10cSrcweir     {
2643*cdf0e10cSrcweir 	    DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnCanceledNotFound : shit happens. sometimes. but this is simply impossible !");
2644*cdf0e10cSrcweir         // move the cursor
2645*cdf0e10cSrcweir 	    xCursor->moveToBookmark(pInfo->aPosition);
2646*cdf0e10cSrcweir     }
2647*cdf0e10cSrcweir     catch( const Exception& )
2648*cdf0e10cSrcweir     {
2649*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
2650*cdf0e10cSrcweir     }
2651*cdf0e10cSrcweir 
2652*cdf0e10cSrcweir     try
2653*cdf0e10cSrcweir     {
2654*cdf0e10cSrcweir         // let the grid snyc it's display with the cursor
2655*cdf0e10cSrcweir 	    Reference< XPropertySet >  xModelSet(getControlModel(), UNO_QUERY);
2656*cdf0e10cSrcweir 	    DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnCanceledNotFound : no model set ?!");
2657*cdf0e10cSrcweir 	    Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"));
2658*cdf0e10cSrcweir 	    xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True)));
2659*cdf0e10cSrcweir 	    xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld);
2660*cdf0e10cSrcweir     }
2661*cdf0e10cSrcweir     catch( const Exception& )
2662*cdf0e10cSrcweir     {
2663*cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
2664*cdf0e10cSrcweir     }
2665*cdf0e10cSrcweir 
2666*cdf0e10cSrcweir     return 0L;
2667*cdf0e10cSrcweir }
2668*cdf0e10cSrcweir 
2669*cdf0e10cSrcweir //------------------------------------------------------------------------------
2670*cdf0e10cSrcweir IMPL_LINK(SbaXDataBrowserController, OnAsyncGetCellFocus, void*, EMPTYARG)
2671*cdf0e10cSrcweir {
2672*cdf0e10cSrcweir 	SbaGridControl* pVclGrid = getBrowserView() ? getBrowserView()->getVclControl() : NULL;
2673*cdf0e10cSrcweir 	// if we have a controller, but the window for the controller doesn't have the focus, we correct this
2674*cdf0e10cSrcweir 	if(pVclGrid)
2675*cdf0e10cSrcweir 	{
2676*cdf0e10cSrcweir 		if (!pVclGrid->IsEditing())
2677*cdf0e10cSrcweir 			return 0L;
2678*cdf0e10cSrcweir 
2679*cdf0e10cSrcweir 		if (pVclGrid->HasChildPathFocus())
2680*cdf0e10cSrcweir 			pVclGrid->Controller()->GetWindow().GrabFocus();
2681*cdf0e10cSrcweir 	}
2682*cdf0e10cSrcweir 
2683*cdf0e10cSrcweir 	return 0L;
2684*cdf0e10cSrcweir }
2685*cdf0e10cSrcweir 
2686*cdf0e10cSrcweir //------------------------------------------------------------------------------
2687*cdf0e10cSrcweir void SbaXDataBrowserController::criticalFail()
2688*cdf0e10cSrcweir {
2689*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::criticalFail" );
2690*cdf0e10cSrcweir 	InvalidateAll();
2691*cdf0e10cSrcweir     m_nRowSetPrivileges = 0;
2692*cdf0e10cSrcweir }
2693*cdf0e10cSrcweir 
2694*cdf0e10cSrcweir //------------------------------------------------------------------------------
2695*cdf0e10cSrcweir void SbaXDataBrowserController::LoadFinished(sal_Bool /*bWasSynch*/)
2696*cdf0e10cSrcweir {
2697*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadFinished" );
2698*cdf0e10cSrcweir     m_nRowSetPrivileges = 0;
2699*cdf0e10cSrcweir 
2700*cdf0e10cSrcweir 	if (isValid() && !loadingCancelled())
2701*cdf0e10cSrcweir 	{
2702*cdf0e10cSrcweir         // obtain cached values
2703*cdf0e10cSrcweir         try
2704*cdf0e10cSrcweir         {
2705*cdf0e10cSrcweir             Reference< XPropertySet > xFormProps( m_xLoadable, UNO_QUERY_THROW );
2706*cdf0e10cSrcweir             OSL_VERIFY( xFormProps->getPropertyValue( PROPERTY_PRIVILEGES ) >>= m_nRowSetPrivileges );
2707*cdf0e10cSrcweir         }
2708*cdf0e10cSrcweir         catch( const Exception& )
2709*cdf0e10cSrcweir         {
2710*cdf0e10cSrcweir     	    DBG_UNHANDLED_EXCEPTION();
2711*cdf0e10cSrcweir         }
2712*cdf0e10cSrcweir 
2713*cdf0e10cSrcweir 		// --------------------------------
2714*cdf0e10cSrcweir 		// switch the control to alive mode
2715*cdf0e10cSrcweir 		getBrowserView()->getGridControl()->setDesignMode(sal_False);
2716*cdf0e10cSrcweir 
2717*cdf0e10cSrcweir 		// -------------------------------
2718*cdf0e10cSrcweir         initializeParser();
2719*cdf0e10cSrcweir 
2720*cdf0e10cSrcweir 		// -------------------------------
2721*cdf0e10cSrcweir 		InvalidateAll();
2722*cdf0e10cSrcweir 
2723*cdf0e10cSrcweir 		m_aAsyncGetCellFocus.Call();
2724*cdf0e10cSrcweir 	}
2725*cdf0e10cSrcweir }
2726*cdf0e10cSrcweir // -----------------------------------------------------------------------------
2727*cdf0e10cSrcweir void SbaXDataBrowserController::initializeParser() const
2728*cdf0e10cSrcweir {
2729*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initializeParser" );
2730*cdf0e10cSrcweir     if ( !m_xParser.is() )
2731*cdf0e10cSrcweir     {
2732*cdf0e10cSrcweir         // ----------------------------------------------
2733*cdf0e10cSrcweir 	    // create a parser (needed for filtering/sorting)
2734*cdf0e10cSrcweir 	    try
2735*cdf0e10cSrcweir 	    {
2736*cdf0e10cSrcweir 		    const Reference< XPropertySet >  xFormSet(getRowSet(), UNO_QUERY);
2737*cdf0e10cSrcweir 		    if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)))
2738*cdf0e10cSrcweir 		    {	// (only if the statement isn't native)
2739*cdf0e10cSrcweir 			    // (it is allowed to use the PROPERTY_ISPASSTHROUGH : _after_ loading a form it is valid)
2740*cdf0e10cSrcweir                 xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser;
2741*cdf0e10cSrcweir 		    }
2742*cdf0e10cSrcweir 	    }
2743*cdf0e10cSrcweir         catch(Exception&)
2744*cdf0e10cSrcweir 	    {
2745*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
2746*cdf0e10cSrcweir 		    m_xParser = NULL;
2747*cdf0e10cSrcweir 		    // no further handling, we ignore the error
2748*cdf0e10cSrcweir 	    }
2749*cdf0e10cSrcweir     }
2750*cdf0e10cSrcweir }
2751*cdf0e10cSrcweir //------------------------------------------------------------------------------
2752*cdf0e10cSrcweir void SbaXDataBrowserController::loaded(const EventObject& /*aEvent*/) throw( RuntimeException )
2753*cdf0e10cSrcweir {
2754*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::loaded" );
2755*cdf0e10cSrcweir 	// not interested in
2756*cdf0e10cSrcweir 	// we're loading within an separate thread and have a handling	for it's "finished event"
2757*cdf0e10cSrcweir }
2758*cdf0e10cSrcweir 
2759*cdf0e10cSrcweir //------------------------------------------------------------------------------
2760*cdf0e10cSrcweir void SbaXDataBrowserController::unloading(const EventObject& /*aEvent*/) throw( RuntimeException )
2761*cdf0e10cSrcweir {
2762*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloading" );
2763*cdf0e10cSrcweir 	// not interested in
2764*cdf0e10cSrcweir }
2765*cdf0e10cSrcweir 
2766*cdf0e10cSrcweir //------------------------------------------------------------------------------
2767*cdf0e10cSrcweir void SbaXDataBrowserController::unloaded(const EventObject& /*aEvent*/) throw( RuntimeException )
2768*cdf0e10cSrcweir {
2769*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloaded" );
2770*cdf0e10cSrcweir     m_xParser.clear();
2771*cdf0e10cSrcweir 	InvalidateAll();
2772*cdf0e10cSrcweir 		// do this asynchron, there are other listeners reacting on this message ...
2773*cdf0e10cSrcweir 		// (it's a little hack : the grid columns are listening to this event, too, and their bound field may
2774*cdf0e10cSrcweir 		// change as a reaction on that event. as we have no chance to be notified of this change (which is
2775*cdf0e10cSrcweir 		// the one we're interested in) we give them time to do what they want to before invalidating our
2776*cdf0e10cSrcweir 		// bound-field-dependent slots ....
2777*cdf0e10cSrcweir }
2778*cdf0e10cSrcweir 
2779*cdf0e10cSrcweir //------------------------------------------------------------------------------
2780*cdf0e10cSrcweir void SbaXDataBrowserController::reloading(const EventObject& /*aEvent*/) throw( RuntimeException )
2781*cdf0e10cSrcweir {
2782*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloading" );
2783*cdf0e10cSrcweir 	// not interested in
2784*cdf0e10cSrcweir }
2785*cdf0e10cSrcweir 
2786*cdf0e10cSrcweir //------------------------------------------------------------------------------
2787*cdf0e10cSrcweir void SbaXDataBrowserController::reloaded(const EventObject& /*aEvent*/) throw( RuntimeException )
2788*cdf0e10cSrcweir {
2789*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloaded" );
2790*cdf0e10cSrcweir 	InvalidateAll();
2791*cdf0e10cSrcweir 		// do this asynchronously, there are other listeners reacting on this message ...
2792*cdf0e10cSrcweir 		// (it's a little hack : the grid columns are listening to this event, too, and their bound field may
2793*cdf0e10cSrcweir 		// change as a reaction on that event. as we have no chance to be notified of this change (which is
2794*cdf0e10cSrcweir 		// the one we're interested in) we give them time to do what they want to before invalidating our
2795*cdf0e10cSrcweir 		// bound-field-dependent slots ....
2796*cdf0e10cSrcweir }
2797*cdf0e10cSrcweir //------------------------------------------------------------------------------
2798*cdf0e10cSrcweir void SbaXDataBrowserController::enterFormAction()
2799*cdf0e10cSrcweir {
2800*cdf0e10cSrcweir 	if ( !m_nFormActionNestingLevel )
2801*cdf0e10cSrcweir 		// first action -> reset
2802*cdf0e10cSrcweir         m_aCurrentError.clear();
2803*cdf0e10cSrcweir 
2804*cdf0e10cSrcweir 	++m_nFormActionNestingLevel;
2805*cdf0e10cSrcweir }
2806*cdf0e10cSrcweir 
2807*cdf0e10cSrcweir //------------------------------------------------------------------------------
2808*cdf0e10cSrcweir void SbaXDataBrowserController::leaveFormAction()
2809*cdf0e10cSrcweir {
2810*cdf0e10cSrcweir 	DBG_ASSERT( m_nFormActionNestingLevel > 0, "SbaXDataBrowserController::leaveFormAction : invalid call !" );
2811*cdf0e10cSrcweir 	if ( --m_nFormActionNestingLevel > 0 )
2812*cdf0e10cSrcweir         return;
2813*cdf0e10cSrcweir 
2814*cdf0e10cSrcweir     if ( !m_aCurrentError.isValid() )
2815*cdf0e10cSrcweir         return;
2816*cdf0e10cSrcweir 
2817*cdf0e10cSrcweir     m_aAsyncDisplayError.Call();
2818*cdf0e10cSrcweir }
2819*cdf0e10cSrcweir 
2820*cdf0e10cSrcweir // -------------------------------------------------------------------------
2821*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::isLoaded() const
2822*cdf0e10cSrcweir {
2823*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isLoaded" );
2824*cdf0e10cSrcweir 	return m_xLoadable.is() && m_xLoadable->isLoaded();
2825*cdf0e10cSrcweir }
2826*cdf0e10cSrcweir 
2827*cdf0e10cSrcweir // -------------------------------------------------------------------------
2828*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::isValidCursor() const
2829*cdf0e10cSrcweir {
2830*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isValidCursor" );
2831*cdf0e10cSrcweir 	if (!m_xColumnsSupplier.is())
2832*cdf0e10cSrcweir 		return sal_False;
2833*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XNameAccess >  xCols = m_xColumnsSupplier->getColumns();
2834*cdf0e10cSrcweir 	if (!xCols.is() || !xCols->hasElements())
2835*cdf0e10cSrcweir 		return sal_False;
2836*cdf0e10cSrcweir 
2837*cdf0e10cSrcweir     sal_Bool bIsValid = !(m_xRowSet->isBeforeFirst() || m_xRowSet->isAfterLast());
2838*cdf0e10cSrcweir     if ( !bIsValid )
2839*cdf0e10cSrcweir     {
2840*cdf0e10cSrcweir 	    Reference<XPropertySet> xProp(m_xRowSet,UNO_QUERY);
2841*cdf0e10cSrcweir 	    bIsValid = ::cppu::any2bool(xProp->getPropertyValue(PROPERTY_ISNEW));
2842*cdf0e10cSrcweir         if ( !bIsValid )
2843*cdf0e10cSrcweir         {
2844*cdf0e10cSrcweir             bIsValid = m_xParser.is();
2845*cdf0e10cSrcweir         }
2846*cdf0e10cSrcweir     } // if ( !bIsValid )
2847*cdf0e10cSrcweir     return bIsValid;
2848*cdf0e10cSrcweir }
2849*cdf0e10cSrcweir 
2850*cdf0e10cSrcweir //==================================================================
2851*cdf0e10cSrcweir // LoadFormHelper
2852*cdf0e10cSrcweir //==================================================================
2853*cdf0e10cSrcweir 
2854*cdf0e10cSrcweir class LoadFormHelper :public ::cppu::WeakImplHelper2< ::com::sun::star::form::XLoadListener,
2855*cdf0e10cSrcweir 													  XRowSetListener>
2856*cdf0e10cSrcweir {
2857*cdf0e10cSrcweir 	enum STATE { STARTED, LOADED, POSITIONED, DISPOSED };
2858*cdf0e10cSrcweir 	STATE	m_eState;
2859*cdf0e10cSrcweir 
2860*cdf0e10cSrcweir 	Reference< XRowSet >				m_xForm;
2861*cdf0e10cSrcweir 
2862*cdf0e10cSrcweir 	::osl::Mutex	m_aAccessSafety;
2863*cdf0e10cSrcweir 
2864*cdf0e10cSrcweir public:
2865*cdf0e10cSrcweir 	LoadFormHelper(const Reference< XRowSet > & _rxForm);
2866*cdf0e10cSrcweir 
2867*cdf0e10cSrcweir 	// ::com::sun::star::form::XLoadListener
2868*cdf0e10cSrcweir 	virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException );
2869*cdf0e10cSrcweir 	virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException );
2870*cdf0e10cSrcweir 	virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException );
2871*cdf0e10cSrcweir 	virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException );
2872*cdf0e10cSrcweir 	virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException );
2873*cdf0e10cSrcweir 
2874*cdf0e10cSrcweir 	// XRowSetListener
2875*cdf0e10cSrcweir 	virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException );
2876*cdf0e10cSrcweir 	virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException );
2877*cdf0e10cSrcweir     virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException );
2878*cdf0e10cSrcweir 
2879*cdf0e10cSrcweir 	// ::com::sun::star::lang::XEventListener
2880*cdf0e10cSrcweir 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( RuntimeException );
2881*cdf0e10cSrcweir 
2882*cdf0e10cSrcweir 
2883*cdf0e10cSrcweir 	bool WaitUntilReallyLoaded(bool _bOnlyIfLoaded);
2884*cdf0e10cSrcweir 		// waits 'til the first positioned event after the loaded event. returns true if successfull,
2885*cdf0e10cSrcweir 		// false if the form was disposed or unloaded before or while waiting
2886*cdf0e10cSrcweir 		// if _bOnlyIfLoaded is false and the form isn't loaded already loaded, false will be returned
2887*cdf0e10cSrcweir 		// (without any wating)
2888*cdf0e10cSrcweir 
2889*cdf0e10cSrcweir 	void cancel();
2890*cdf0e10cSrcweir 
2891*cdf0e10cSrcweir protected:
2892*cdf0e10cSrcweir 	~LoadFormHelper();
2893*cdf0e10cSrcweir 
2894*cdf0e10cSrcweir 	void implDispose();
2895*cdf0e10cSrcweir };
2896*cdf0e10cSrcweir 
2897*cdf0e10cSrcweir DBG_NAME(LoadFormHelper)
2898*cdf0e10cSrcweir //------------------------------------------------------------------------------
2899*cdf0e10cSrcweir LoadFormHelper::LoadFormHelper(const Reference< XRowSet > & _rxForm)
2900*cdf0e10cSrcweir 	:m_eState(STARTED)
2901*cdf0e10cSrcweir 	,m_xForm(_rxForm)
2902*cdf0e10cSrcweir {
2903*cdf0e10cSrcweir     DBG_CTOR(LoadFormHelper,NULL);
2904*cdf0e10cSrcweir 
2905*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->addLoadListener(this);
2906*cdf0e10cSrcweir 	m_xForm->addRowSetListener(this);
2907*cdf0e10cSrcweir }
2908*cdf0e10cSrcweir 
2909*cdf0e10cSrcweir //------------------------------------------------------------------------------
2910*cdf0e10cSrcweir LoadFormHelper::~LoadFormHelper()
2911*cdf0e10cSrcweir {
2912*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aAccessSafety);
2913*cdf0e10cSrcweir 	implDispose();
2914*cdf0e10cSrcweir 
2915*cdf0e10cSrcweir     DBG_DTOR(LoadFormHelper,NULL);
2916*cdf0e10cSrcweir }
2917*cdf0e10cSrcweir 
2918*cdf0e10cSrcweir //------------------------------------------------------------------------------
2919*cdf0e10cSrcweir void LoadFormHelper::implDispose()
2920*cdf0e10cSrcweir {
2921*cdf0e10cSrcweir 	if (DISPOSED != m_eState)
2922*cdf0e10cSrcweir 	{
2923*cdf0e10cSrcweir 
2924*cdf0e10cSrcweir 		Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->removeLoadListener(this);
2925*cdf0e10cSrcweir 		m_xForm->removeRowSetListener(this);
2926*cdf0e10cSrcweir 		m_xForm = NULL;
2927*cdf0e10cSrcweir 		m_eState = DISPOSED;
2928*cdf0e10cSrcweir 	}
2929*cdf0e10cSrcweir }
2930*cdf0e10cSrcweir 
2931*cdf0e10cSrcweir //------------------------------------------------------------------------------
2932*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::loaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
2933*cdf0e10cSrcweir {
2934*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aAccessSafety);
2935*cdf0e10cSrcweir 	DBG_ASSERT(m_eState == STARTED || m_eState == DISPOSED, "LoadFormHelper::loaded : wrong call !");
2936*cdf0e10cSrcweir 	if (m_eState == STARTED)
2937*cdf0e10cSrcweir 		m_eState = LOADED;
2938*cdf0e10cSrcweir }
2939*cdf0e10cSrcweir 
2940*cdf0e10cSrcweir //------------------------------------------------------------------------------
2941*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::unloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
2942*cdf0e10cSrcweir {
2943*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aAccessSafety);
2944*cdf0e10cSrcweir 	DBG_ERROR("LoadFormHelper::unloaded : shouldn't be called !");
2945*cdf0e10cSrcweir 	implDispose();
2946*cdf0e10cSrcweir }
2947*cdf0e10cSrcweir 
2948*cdf0e10cSrcweir //------------------------------------------------------------------------------
2949*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::unloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
2950*cdf0e10cSrcweir {
2951*cdf0e10cSrcweir }
2952*cdf0e10cSrcweir 
2953*cdf0e10cSrcweir //------------------------------------------------------------------------------
2954*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::reloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
2955*cdf0e10cSrcweir {
2956*cdf0e10cSrcweir }
2957*cdf0e10cSrcweir 
2958*cdf0e10cSrcweir //------------------------------------------------------------------------------
2959*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::reloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException )
2960*cdf0e10cSrcweir {
2961*cdf0e10cSrcweir }
2962*cdf0e10cSrcweir 
2963*cdf0e10cSrcweir //------------------------------------------------------------------------------
2964*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::cursorMoved(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException )
2965*cdf0e10cSrcweir {
2966*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aAccessSafety);
2967*cdf0e10cSrcweir 	if (m_eState == LOADED)
2968*cdf0e10cSrcweir 		m_eState = POSITIONED;
2969*cdf0e10cSrcweir }
2970*cdf0e10cSrcweir 
2971*cdf0e10cSrcweir //------------------------------------------------------------------------------
2972*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::rowChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException )
2973*cdf0e10cSrcweir {
2974*cdf0e10cSrcweir }
2975*cdf0e10cSrcweir 
2976*cdf0e10cSrcweir //------------------------------------------------------------------------------
2977*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::rowSetChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException )
2978*cdf0e10cSrcweir {
2979*cdf0e10cSrcweir }
2980*cdf0e10cSrcweir 
2981*cdf0e10cSrcweir //------------------------------------------------------------------------------
2982*cdf0e10cSrcweir void SAL_CALL LoadFormHelper::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException )
2983*cdf0e10cSrcweir {
2984*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aAccessSafety);
2985*cdf0e10cSrcweir 	implDispose();
2986*cdf0e10cSrcweir }
2987*cdf0e10cSrcweir 
2988*cdf0e10cSrcweir //------------------------------------------------------------------------------
2989*cdf0e10cSrcweir void LoadFormHelper::cancel()
2990*cdf0e10cSrcweir {
2991*cdf0e10cSrcweir 	implDispose();
2992*cdf0e10cSrcweir }
2993*cdf0e10cSrcweir 
2994*cdf0e10cSrcweir //------------------------------------------------------------------------------
2995*cdf0e10cSrcweir bool LoadFormHelper::WaitUntilReallyLoaded(bool _bOnlyIfLoaded)
2996*cdf0e10cSrcweir {
2997*cdf0e10cSrcweir 	::osl::ResettableMutexGuard aGuard( m_aAccessSafety );
2998*cdf0e10cSrcweir 	if (DISPOSED == m_eState)
2999*cdf0e10cSrcweir 		return false;
3000*cdf0e10cSrcweir 
3001*cdf0e10cSrcweir 	if (_bOnlyIfLoaded && (STARTED == m_eState))
3002*cdf0e10cSrcweir 		// we did't get a "loaded" event ....
3003*cdf0e10cSrcweir 		return false;
3004*cdf0e10cSrcweir 
3005*cdf0e10cSrcweir 	sal_Bool bDone = (POSITIONED == m_eState);
3006*cdf0e10cSrcweir 	aGuard.clear();
3007*cdf0e10cSrcweir 
3008*cdf0e10cSrcweir 	while (!bDone)
3009*cdf0e10cSrcweir 	{
3010*cdf0e10cSrcweir 		aGuard.reset();
3011*cdf0e10cSrcweir 		bDone = (POSITIONED == m_eState);
3012*cdf0e10cSrcweir         aGuard.clear();
3013*cdf0e10cSrcweir 	}
3014*cdf0e10cSrcweir 
3015*cdf0e10cSrcweir 	aGuard.reset();
3016*cdf0e10cSrcweir 	implDispose();
3017*cdf0e10cSrcweir 
3018*cdf0e10cSrcweir 	return true;
3019*cdf0e10cSrcweir }
3020*cdf0e10cSrcweir 
3021*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3022*cdf0e10cSrcweir sal_Int16 SbaXDataBrowserController::getCurrentColumnPosition()
3023*cdf0e10cSrcweir {
3024*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getCurrentColumnPosition" );
3025*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XGrid >	xGrid(getBrowserView()->getGridControl(), UNO_QUERY);
3026*cdf0e10cSrcweir 	sal_Int16 nViewPos = -1;
3027*cdf0e10cSrcweir 	try
3028*cdf0e10cSrcweir 	{
3029*cdf0e10cSrcweir 		if ( xGrid.is() )
3030*cdf0e10cSrcweir 			nViewPos = xGrid->getCurrentColumnPosition();
3031*cdf0e10cSrcweir 	}
3032*cdf0e10cSrcweir 	catch(Exception&) {}
3033*cdf0e10cSrcweir 	return nViewPos;
3034*cdf0e10cSrcweir }
3035*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3036*cdf0e10cSrcweir void SbaXDataBrowserController::setCurrentColumnPosition( sal_Int16 _nPos )
3037*cdf0e10cSrcweir {
3038*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentColumnPosition" );
3039*cdf0e10cSrcweir 	Reference< ::com::sun::star::form::XGrid >	xGrid(getBrowserView()->getGridControl(), UNO_QUERY);
3040*cdf0e10cSrcweir 	try
3041*cdf0e10cSrcweir 	{
3042*cdf0e10cSrcweir 		if ( -1 != _nPos )
3043*cdf0e10cSrcweir 			xGrid->setCurrentColumnPosition(_nPos);
3044*cdf0e10cSrcweir 	}
3045*cdf0e10cSrcweir 	catch(Exception&) {}
3046*cdf0e10cSrcweir }
3047*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3048*cdf0e10cSrcweir void SbaXDataBrowserController::BeforeDrop()
3049*cdf0e10cSrcweir {
3050*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::BeforeDrop" );
3051*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster >  xFormError(getRowSet(), UNO_QUERY);
3052*cdf0e10cSrcweir 	if (xFormError.is())
3053*cdf0e10cSrcweir 		xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this);
3054*cdf0e10cSrcweir }
3055*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3056*cdf0e10cSrcweir void SbaXDataBrowserController::AfterDrop()
3057*cdf0e10cSrcweir {
3058*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AfterDrop" );
3059*cdf0e10cSrcweir 	Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster >  xFormError(getRowSet(), UNO_QUERY);
3060*cdf0e10cSrcweir 	if (xFormError.is())
3061*cdf0e10cSrcweir 		xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this);
3062*cdf0e10cSrcweir }
3063*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3064*cdf0e10cSrcweir void SbaXDataBrowserController::addColumnListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel)
3065*cdf0e10cSrcweir {
3066*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addColumnListeners" );
3067*cdf0e10cSrcweir // ... all the grid columns
3068*cdf0e10cSrcweir 	Reference< ::com::sun::star::container::XIndexContainer >  xColumns(_xGridControlModel, UNO_QUERY);
3069*cdf0e10cSrcweir 	if (xColumns.is())
3070*cdf0e10cSrcweir 	{
3071*cdf0e10cSrcweir 		sal_Int32 nCount = xColumns->getCount();
3072*cdf0e10cSrcweir 		for (sal_uInt16 i=0; i < nCount; ++i)
3073*cdf0e10cSrcweir 		{
3074*cdf0e10cSrcweir 			Reference< XPropertySet >  xCol(xColumns->getByIndex(i),UNO_QUERY);
3075*cdf0e10cSrcweir 			AddColumnListener(xCol);
3076*cdf0e10cSrcweir 		}
3077*cdf0e10cSrcweir 	}
3078*cdf0e10cSrcweir }
3079*cdf0e10cSrcweir // -----------------------------------------------------------------------------
3080*cdf0e10cSrcweir sal_Bool SbaXDataBrowserController::InitializeGridModel(const Reference< ::com::sun::star::form::XFormComponent > & /*xGrid*/)
3081*cdf0e10cSrcweir {
3082*cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::InitializeGridModel" );
3083*cdf0e10cSrcweir 	return sal_True;
3084*cdf0e10cSrcweir }
3085*cdf0e10cSrcweir //..................................................................
3086*cdf0e10cSrcweir }	// namespace dbaui
3087*cdf0e10cSrcweir //..................................................................
3088