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