1*96de5490SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*96de5490SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*96de5490SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*96de5490SAndrew Rist * distributed with this work for additional information 6*96de5490SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*96de5490SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*96de5490SAndrew Rist * "License"); you may not use this file except in compliance 9*96de5490SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*96de5490SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*96de5490SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*96de5490SAndrew Rist * software distributed under the License is distributed on an 15*96de5490SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*96de5490SAndrew Rist * KIND, either express or implied. See the License for the 17*96de5490SAndrew Rist * specific language governing permissions and limitations 18*96de5490SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*96de5490SAndrew Rist *************************************************************/ 21*96de5490SAndrew Rist 22*96de5490SAndrew 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: 146cdf0e10cSrcweir OParameterContinuation() { } 147cdf0e10cSrcweir 148cdf0e10cSrcweir 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 //------------------------------------------------------------------ 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 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 //------------------------------------------------------------------ 271cdf0e10cSrcweir SbaXDataBrowserController::FormControllerImpl::~FormControllerImpl() 272cdf0e10cSrcweir { 273cdf0e10cSrcweir 274cdf0e10cSrcweir DBG_DTOR(FormControllerImpl,NULL); 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 343cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setParent( const Reference< XInterface >& /*Parent*/ ) throw (NoSupportException, RuntimeException) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir throw NoSupportException( ::rtl::OUString(), *this ); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir 348cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 367cdf0e10cSrcweir ::sal_Int32 SAL_CALL SbaXDataBrowserController::FormControllerImpl::getCount( ) throw (RuntimeException) 368cdf0e10cSrcweir { 369cdf0e10cSrcweir // no sub controllers, never 370cdf0e10cSrcweir return 0; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 381cdf0e10cSrcweir Type SAL_CALL SbaXDataBrowserController::FormControllerImpl::getElementType( ) throw (RuntimeException) 382cdf0e10cSrcweir { 383cdf0e10cSrcweir return ::cppu::UnoType< runtime::XFormController >::get(); 384cdf0e10cSrcweir } 385cdf0e10cSrcweir 386cdf0e10cSrcweir //------------------------------------------------------------------ 387cdf0e10cSrcweir ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::hasElements( ) throw (RuntimeException) 388cdf0e10cSrcweir { 389cdf0e10cSrcweir // no sub controllers, never 390cdf0e10cSrcweir return false; 391cdf0e10cSrcweir } 392cdf0e10cSrcweir 393cdf0e10cSrcweir //------------------------------------------------------------------ 394cdf0e10cSrcweir Reference< XEnumeration > SAL_CALL SbaXDataBrowserController::FormControllerImpl::createEnumeration( ) throw (RuntimeException) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir return new ::comphelper::OEnumerationByIndex( this ); 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 479cdf0e10cSrcweir ::rtl::OUString SAL_CALL SbaXDataBrowserController::FormControllerImpl::getMode( ) throw (RuntimeException) 480cdf0e10cSrcweir { 481cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 493cdf0e10cSrcweir ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::supportsMode( const ::rtl::OUString& aMode ) throw (RuntimeException) 494cdf0e10cSrcweir { 495cdf0e10cSrcweir return aMode.compareToAscii( "DataMode" ) == 0; 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 562cdf0e10cSrcweir void SAL_CALL SbaXDataBrowserController::FormControllerImpl::frameAction(const ::com::sun::star::frame::FrameActionEvent& /*aEvent*/) throw( RuntimeException ) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir } 565cdf0e10cSrcweir 566cdf0e10cSrcweir //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 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 //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 954cdf0e10cSrcweir void SbaXDataBrowserController::RemoveColumnListener(const Reference< XPropertySet > & /*xCol*/) 955cdf0e10cSrcweir { 956cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RemoveColumnListener" ); 957cdf0e10cSrcweir } 958cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 //------------------------------------------------------------------ 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 //------------------------------------------------------------------ 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 //------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 // ----------------------------------------------------------------------- 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 1564cdf0e10cSrcweir 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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)) 2016cdf0e10cSrcweir sInitialText = (const sal_Unicode*)aInitialText; 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 2495cdf0e10cSrcweir IMPL_LINK( SbaXDataBrowserController, OnClipboardChanged, void*, EMPTYARG ) 2496cdf0e10cSrcweir { 2497cdf0e10cSrcweir ::vos::OGuard aGuard(Application::GetSolarMutex()); 2498cdf0e10cSrcweir return OnInvalidateClipboard( NULL ); 2499cdf0e10cSrcweir } 2500cdf0e10cSrcweir 2501cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 // ------------------------------------------------------------------------- 2519cdf0e10cSrcweir 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 //------------------------------------------------------------------------------ 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 2572cdf0e10cSrcweir sFieldList += (const sal_Unicode*)aName; 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------------- 2723cdf0e10cSrcweir 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 2794cdf0e10cSrcweir void SbaXDataBrowserController::enterFormAction() 2795cdf0e10cSrcweir { 2796cdf0e10cSrcweir if ( !m_nFormActionNestingLevel ) 2797cdf0e10cSrcweir // first action -> reset 2798cdf0e10cSrcweir m_aCurrentError.clear(); 2799cdf0e10cSrcweir 2800cdf0e10cSrcweir ++m_nFormActionNestingLevel; 2801cdf0e10cSrcweir } 2802cdf0e10cSrcweir 2803cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 // ------------------------------------------------------------------------- 2817cdf0e10cSrcweir 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 // ------------------------------------------------------------------------- 2824cdf0e10cSrcweir 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 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 //------------------------------------------------------------------------------ 2906cdf0e10cSrcweir LoadFormHelper::~LoadFormHelper() 2907cdf0e10cSrcweir { 2908cdf0e10cSrcweir ::osl::MutexGuard aGuard(m_aAccessSafety); 2909cdf0e10cSrcweir implDispose(); 2910cdf0e10cSrcweir 2911cdf0e10cSrcweir DBG_DTOR(LoadFormHelper,NULL); 2912cdf0e10cSrcweir } 2913cdf0e10cSrcweir 2914cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 2945cdf0e10cSrcweir void SAL_CALL LoadFormHelper::unloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2946cdf0e10cSrcweir { 2947cdf0e10cSrcweir } 2948cdf0e10cSrcweir 2949cdf0e10cSrcweir //------------------------------------------------------------------------------ 2950cdf0e10cSrcweir void SAL_CALL LoadFormHelper::reloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2951cdf0e10cSrcweir { 2952cdf0e10cSrcweir } 2953cdf0e10cSrcweir 2954cdf0e10cSrcweir //------------------------------------------------------------------------------ 2955cdf0e10cSrcweir void SAL_CALL LoadFormHelper::reloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) 2956cdf0e10cSrcweir { 2957cdf0e10cSrcweir } 2958cdf0e10cSrcweir 2959cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 2968cdf0e10cSrcweir void SAL_CALL LoadFormHelper::rowChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) 2969cdf0e10cSrcweir { 2970cdf0e10cSrcweir } 2971cdf0e10cSrcweir 2972cdf0e10cSrcweir //------------------------------------------------------------------------------ 2973cdf0e10cSrcweir void SAL_CALL LoadFormHelper::rowSetChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) 2974cdf0e10cSrcweir { 2975cdf0e10cSrcweir } 2976cdf0e10cSrcweir 2977cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 2985cdf0e10cSrcweir void LoadFormHelper::cancel() 2986cdf0e10cSrcweir { 2987cdf0e10cSrcweir implDispose(); 2988cdf0e10cSrcweir } 2989cdf0e10cSrcweir 2990cdf0e10cSrcweir //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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