/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_dbaccess.hxx" #include "browserids.hxx" #include "brwctrlr.hxx" #include "brwview.hxx" #include "dbu_brw.hrc" #include "dbustrings.hrc" #include "queryfilter.hxx" #include "queryorder.hxx" #include "sqlmessage.hxx" /** === begin UNO includes === **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** === end UNO includes === **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star::uno; using namespace ::com::sun::star::awt; using namespace ::com::sun::star::sdb; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::task; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::frame; using namespace ::com::sun::star::form; using namespace ::com::sun::star::util; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::container; using namespace ::dbtools; using namespace ::comphelper; using namespace ::svt; #define HANDLE_SQL_ERRORS( action, successflag, context, message ) \ try \ { \ successflag = sal_False; \ action; \ successflag = sal_True; \ } \ catch(SQLException& e) \ { \ SQLException aError = ::dbtools::prependErrorInfo(e, *this, context); \ ::com::sun::star::sdb::SQLErrorEvent aEvent; \ aEvent.Reason <<= aError; \ errorOccured(aEvent); \ } \ catch(Exception&) \ { \ DBG_UNHANDLED_EXCEPTION(); \ } \ #define DO_SAFE( action, message ) try { action; } catch(Exception&) { DBG_ERROR(message); } ; //.................................................................. namespace dbaui { //.................................................................. //================================================================== // OParameterContinuation //================================================================== class OParameterContinuation : public OInteraction< XInteractionSupplyParameters > { Sequence< PropertyValue > m_aValues; public: OParameterContinuation() { } Sequence< PropertyValue > getValues() const { return m_aValues; } // XInteractionSupplyParameters virtual void SAL_CALL setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException); }; //------------------------------------------------------------------ void SAL_CALL OParameterContinuation::setParameters( const Sequence< PropertyValue >& _rValues ) throw(RuntimeException) { m_aValues = _rValues; } //============================================================================== // a helper class implementing a runtime::XFormController, will be aggregated by SbaXDataBrowserController // (we can't derive from XFormController as it's base class is XTabController and the XTabController::getModel collides // with the XController::getModel implemented in our base class SbaXDataBrowserController) class SbaXDataBrowserController::FormControllerImpl : public ::cppu::WeakAggImplHelper2< ::com::sun::star::form::runtime::XFormController, ::com::sun::star::frame::XFrameActionListener > { friend class SbaXDataBrowserController; ::cppu::OInterfaceContainerHelper m_aActivateListeners; SbaXDataBrowserController* m_pOwner; public: FormControllerImpl(SbaXDataBrowserController* pOwner); // XFormController virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormOperations > SAL_CALL getFormOperations() throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > SAL_CALL getCurrentControl(void) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL addActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL removeActivateListener(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( ::com::sun::star::uno::RuntimeException ); 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 ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext > SAL_CALL getContext() throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setContext( const ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormControllerContext >& _context ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler > SAL_CALL getInteractionHandler() throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setInteractionHandler( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& _interactionHandler ) throw (::com::sun::star::uno::RuntimeException); // XChild, base of XFormController virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ) throw (::com::sun::star::uno::RuntimeException); 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); // XComponent, base of XFormController virtual void SAL_CALL dispose( ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); // XIndexAccess, base of XFormController virtual ::sal_Int32 SAL_CALL getCount( ) throw (::com::sun::star::uno::RuntimeException); 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); // XElementAccess, base of XIndexAccess virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); // XEnumerationAccess, base of XElementAccess virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration( ) throw (::com::sun::star::uno::RuntimeException); // XModifyBroadcaster, base of XFormController virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); // XConfirmDeleteBroadcaster, base of XFormController virtual void SAL_CALL addConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeConfirmDeleteListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XConfirmDeleteListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); // XSQLErrorBroadcaster, base of XFormController virtual void SAL_CALL addSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeSQLErrorListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLErrorListener >& Listener ) throw (::com::sun::star::uno::RuntimeException); // XRowSetApproveBroadcaster, base of XFormController virtual void SAL_CALL addRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeRowSetApproveListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XRowSetApproveListener >& listener ) throw (::com::sun::star::uno::RuntimeException); // XDatabaseParameterBroadcaster2, base of XFormController virtual void SAL_CALL addDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeDatabaseParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); // XDatabaseParameterBroadcaster, base of XDatabaseParameterBroadcaster2 virtual void SAL_CALL addParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL removeParameterListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XDatabaseParameterListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); // XModeSelector, base of XFormController virtual void SAL_CALL setMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); virtual ::rtl::OUString SAL_CALL getMode( ) throw (::com::sun::star::uno::RuntimeException); virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedModes( ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL supportsMode( const ::rtl::OUString& aMode ) throw (::com::sun::star::uno::RuntimeException); // XTabController, base of XFormController virtual void SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel > & Model) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTabControllerModel > SAL_CALL getModel(void) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL setContainer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > & _Container) throw( ::com::sun::star::uno::RuntimeException ); virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SAL_CALL getContainer(void) throw( ::com::sun::star::uno::RuntimeException ); 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 ); virtual void SAL_CALL autoTabOrder(void) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL activateTabOrder(void) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL activateFirst(void) throw( ::com::sun::star::uno::RuntimeException ); virtual void SAL_CALL activateLast(void) throw( ::com::sun::star::uno::RuntimeException ); // XFrameActionListener virtual void SAL_CALL frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException ); // XEventListener virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException ); protected: ~FormControllerImpl(); }; DBG_NAME(FormControllerImpl) //------------------------------------------------------------------ SbaXDataBrowserController::FormControllerImpl::FormControllerImpl(SbaXDataBrowserController* _pOwner) :m_aActivateListeners(_pOwner->getMutex()) ,m_pOwner(_pOwner) { DBG_CTOR(FormControllerImpl,NULL); OSL_ENSURE(m_pOwner, "SbaXDataBrowserController::FormControllerImpl::FormControllerImpl : invalid Owner !"); } //------------------------------------------------------------------ SbaXDataBrowserController::FormControllerImpl::~FormControllerImpl() { DBG_DTOR(FormControllerImpl,NULL); } //------------------------------------------------------------------ Reference< runtime::XFormOperations > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getFormOperations() throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getFormOperations: not supported!" ); return NULL; } //------------------------------------------------------------------ Reference< ::com::sun::star::awt::XControl > SbaXDataBrowserController::FormControllerImpl::getCurrentControl(void) throw( RuntimeException ) { return m_pOwner->getBrowserView() ? m_pOwner->getBrowserView()->getGridControl() : Reference< ::com::sun::star::awt::XControl > (); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException ) { m_aActivateListeners.addInterface(l); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeActivateListener(const Reference< ::com::sun::star::form::XFormControllerListener > & l) throw( RuntimeException ) { m_aActivateListeners.removeInterface(l); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addChildController( const Reference< runtime::XFormController >& /*_ChildController*/ ) throw( RuntimeException, IllegalArgumentException ) { // not supported throw IllegalArgumentException( ::rtl::OUString(), *this, 1 ); } //------------------------------------------------------------------ Reference< runtime::XFormControllerContext > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContext() throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getContext: no support!!" ); return NULL; } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContext( const Reference< runtime::XFormControllerContext >& /*_context*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setContext: no support!!" ); } //------------------------------------------------------------------ Reference< XInteractionHandler > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getInteractionHandler() throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::getInteractionHandler: no support!!" ); return NULL; } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setInteractionHandler( const Reference< XInteractionHandler >& /*_interactionHandler*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::setInteractionHandler: no support!!" ); } //------------------------------------------------------------------ Reference< XInterface > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getParent( ) throw (RuntimeException) { // don't have any parent form controllers return NULL; } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setParent( const Reference< XInterface >& /*Parent*/ ) throw (NoSupportException, RuntimeException) { throw NoSupportException( ::rtl::OUString(), *this ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::dispose( ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::dispose: no, you do *not* want to do this!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addEventListener( const Reference< XEventListener >& /*xListener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addEventListener: no support!!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeEventListener( const Reference< XEventListener >& /*aListener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeEventListener: no support!!" ); } //------------------------------------------------------------------ ::sal_Int32 SAL_CALL SbaXDataBrowserController::FormControllerImpl::getCount( ) throw (RuntimeException) { // no sub controllers, never return 0; } //------------------------------------------------------------------ Any SAL_CALL SbaXDataBrowserController::FormControllerImpl::getByIndex( ::sal_Int32 /*Index*/ ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException) { // no sub controllers, never throw IndexOutOfBoundsException( ::rtl::OUString(), *this ); } //------------------------------------------------------------------ Type SAL_CALL SbaXDataBrowserController::FormControllerImpl::getElementType( ) throw (RuntimeException) { return ::cppu::UnoType< runtime::XFormController >::get(); } //------------------------------------------------------------------ ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::hasElements( ) throw (RuntimeException) { // no sub controllers, never return false; } //------------------------------------------------------------------ Reference< XEnumeration > SAL_CALL SbaXDataBrowserController::FormControllerImpl::createEnumeration( ) throw (RuntimeException) { return new ::comphelper::OEnumerationByIndex( this ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addModifyListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeModifyListener( const Reference< XModifyListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeModifyListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addConfirmDeleteListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener( const Reference< XConfirmDeleteListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeConfirmDeleteListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addSQLErrorListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener( const Reference< XSQLErrorListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeSQLErrorListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addRowSetApproveListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener( const Reference< XRowSetApproveListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeRowSetApproveListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addDatabaseParameterListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeDatabaseParameterListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::addParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::addParameterListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::removeParameterListener( const Reference< XDatabaseParameterListener >& /*_Listener*/ ) throw (RuntimeException) { OSL_ENSURE( false, "SbaXDataBrowserController::FormControllerImpl::removeParameterListener: no support!" ); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setMode( const ::rtl::OUString& _rMode ) throw (NoSupportException, RuntimeException) { if ( !supportsMode( _rMode ) ) throw NoSupportException(); } //------------------------------------------------------------------ ::rtl::OUString SAL_CALL SbaXDataBrowserController::FormControllerImpl::getMode( ) throw (RuntimeException) { return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); } //------------------------------------------------------------------ Sequence< ::rtl::OUString > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getSupportedModes( ) throw (RuntimeException) { Sequence< ::rtl::OUString > aModes(1); aModes[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DataMode" ) ); return aModes; } //------------------------------------------------------------------ ::sal_Bool SAL_CALL SbaXDataBrowserController::FormControllerImpl::supportsMode( const ::rtl::OUString& aMode ) throw (RuntimeException) { return aMode.compareToAscii( "DataMode" ) == 0; } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setModel(const Reference< ::com::sun::star::awt::XTabControllerModel > & /*Model*/) throw( RuntimeException ) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setModel : invalid call, can't change my model !"); } //------------------------------------------------------------------ Reference< ::com::sun::star::awt::XTabControllerModel > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getModel(void) throw( RuntimeException ) { return Reference< XTabControllerModel >(m_pOwner->getRowSet(), UNO_QUERY); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::setContainer(const Reference< ::com::sun::star::awt::XControlContainer > & /*_Container*/) throw( RuntimeException ) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::setContainer : invalid call, can't change my container !"); } //------------------------------------------------------------------ Reference< ::com::sun::star::awt::XControlContainer > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getContainer(void) throw( RuntimeException ) { if (m_pOwner->getBrowserView()) return m_pOwner->getBrowserView()->getContainer(); return Reference< ::com::sun::star::awt::XControlContainer > (); } //------------------------------------------------------------------ Sequence< Reference< ::com::sun::star::awt::XControl > > SAL_CALL SbaXDataBrowserController::FormControllerImpl::getControls(void) throw( RuntimeException ) { if (m_pOwner->getBrowserView()) { Reference< ::com::sun::star::awt::XControl > xGrid = m_pOwner->getBrowserView()->getGridControl(); return Sequence< Reference< ::com::sun::star::awt::XControl > >(&xGrid, 1); } return Sequence< Reference< ::com::sun::star::awt::XControl > >(); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::autoTabOrder(void) throw( RuntimeException ) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::autoTabOrder : nothing to do (always have only one control) !"); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateTabOrder(void) throw( RuntimeException ) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::FormControllerImpl::activateTabOrder : nothing to do (always have only one control) !"); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateFirst(void) throw( RuntimeException ) { if (m_pOwner->getBrowserView()) m_pOwner->getBrowserView()->getVclControl()->ActivateCell(); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::activateLast(void) throw( RuntimeException ) { if (m_pOwner->getBrowserView()) m_pOwner->getBrowserView()->getVclControl()->ActivateCell(); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::frameAction(const ::com::sun::star::frame::FrameActionEvent& /*aEvent*/) throw( RuntimeException ) { } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::FormControllerImpl::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException ) { // nothing to do // we don't add ourself as listener to any broadcasters, so we are not resposible for removing us } //================================================================== //= SbaXDataBrowserController //================================================================== //------------------------------------------------------------------ Sequence< Type > SAL_CALL SbaXDataBrowserController::getTypes( ) throw (RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getTypes" ); return ::comphelper::concatSequences( SbaXDataBrowserController_Base::getTypes(), m_pFormControllerImpl->getTypes() ); } //------------------------------------------------------------------ Sequence< sal_Int8 > SAL_CALL SbaXDataBrowserController::getImplementationId( ) throw (RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getImplementationId" ); static ::cppu::OImplementationId * pId = 0; if (! pId) { ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); if (! pId) { static ::cppu::OImplementationId aId; pId = &aId; } } return pId->getImplementationId(); } //------------------------------------------------------------------ Any SAL_CALL SbaXDataBrowserController::queryInterface(const Type& _rType) throw (RuntimeException) { // check for our additional interfaces Any aRet = SbaXDataBrowserController_Base::queryInterface(_rType); // check for our aggregate (implementing the XFormController) if (!aRet.hasValue()) aRet = m_xFormControllerImpl->queryAggregation(_rType); // no more to offer return aRet; } DBG_NAME(SbaXDataBrowserController) //------------------------------------------------------------------------------ SbaXDataBrowserController::SbaXDataBrowserController(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM) :SbaXDataBrowserController_Base(_rM) ,m_nRowSetPrivileges(0) ,m_pClipbordNotifier( NULL ) ,m_aAsyncGetCellFocus(LINK(this, SbaXDataBrowserController, OnAsyncGetCellFocus)) ,m_aAsyncDisplayError( LINK( this, SbaXDataBrowserController, OnAsyncDisplayError ) ) ,m_sStateSaveRecord(ModuleRes(RID_STR_SAVE_CURRENT_RECORD)) ,m_sStateUndoRecord(ModuleRes(RID_STR_UNDO_MODIFY_RECORD)) ,m_sModuleIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DataSourceBrowser" ) ) ) ,m_pFormControllerImpl(NULL) ,m_nPendingLoadFinished(0) ,m_nFormActionNestingLevel(0) ,m_bLoadCanceled( sal_False ) ,m_bClosingKillOpen( sal_False ) ,m_bCannotSelectUnfiltered( true ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SbaXDataBrowserController" ); DBG_CTOR(SbaXDataBrowserController,NULL); // create the form controller aggregate ::comphelper::increment(m_refCount); { m_pFormControllerImpl = new FormControllerImpl(this); m_xFormControllerImpl = m_pFormControllerImpl; m_xFormControllerImpl->setDelegator(*this); } ::comphelper::decrement(m_refCount); m_aInvalidateClipboard.SetTimeoutHdl(LINK(this, SbaXDataBrowserController, OnInvalidateClipboard)); m_aInvalidateClipboard.SetTimeout(300); } //------------------------------------------------------------------------------ SbaXDataBrowserController::~SbaXDataBrowserController() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::~SbaXDataBrowserController" ); // deleteView(); // release the aggregated form controller if (m_xFormControllerImpl.is()) { Reference< XInterface > xEmpty; m_xFormControllerImpl->setDelegator(xEmpty); } DBG_DTOR(SbaXDataBrowserController,NULL); } // ----------------------------------------------------------------------- void SbaXDataBrowserController::startFrameListening( const Reference< XFrame >& _rxFrame ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::startFrameListening" ); SbaXDataBrowserController_Base::startFrameListening( _rxFrame ); Reference< XFrameActionListener > xAggListener; if ( m_xFormControllerImpl.is() ) m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener; if ( _rxFrame.is() && xAggListener.is() ) _rxFrame->addFrameActionListener( xAggListener ); } // ----------------------------------------------------------------------- void SbaXDataBrowserController::stopFrameListening( const Reference< XFrame >& _rxFrame ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::stopFrameListening" ); SbaXDataBrowserController_Base::stopFrameListening( _rxFrame ); Reference< XFrameActionListener > xAggListener; if ( m_xFormControllerImpl.is() ) m_xFormControllerImpl->queryAggregation( XFrameActionListener::static_type() ) >>= xAggListener; if ( _rxFrame.is() && xAggListener.is() ) _rxFrame->removeFrameActionListener( xAggListener ); } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::onStartLoading( const Reference< XLoadable >& _rxLoadable ) { m_bLoadCanceled = sal_False; m_bCannotSelectUnfiltered = false; Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY ); if ( xWarnings.is() ) xWarnings->clearWarnings(); } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::impl_checkForCannotSelectUnfiltered( const SQLExceptionInfo& _rError ) { ::connectivity::SQLError aError( getORB() ); ::connectivity::ErrorCode nErrorCode( aError.getErrorCode( ErrorCondition::DATA_CANNOT_SELECT_UNFILTERED ) ); if ( ((const SQLException*)_rError)->ErrorCode == nErrorCode ) { m_bCannotSelectUnfiltered = true; InvalidateFeature( ID_BROWSER_FILTERCRIT ); } } // ----------------------------------------------------------------------------- sal_Bool SbaXDataBrowserController::reloadForm( const Reference< XLoadable >& _rxLoadable ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloadForm" ); WaitObject aWO(getBrowserView()); onStartLoading( _rxLoadable ); FormErrorHelper aReportError(this); if (_rxLoadable->isLoaded()) _rxLoadable->reload(); else _rxLoadable->load(); m_xParser.clear(); const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING))) xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser; #if 0 { const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY ); const Reference< XSingleSelectQueryAnalyzer > xAnalyzer( xRowSetProps->getPropertyValue( PROPERTY_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY ); if ( xAnalyzer.is() ) { const Reference< XIndexAccess > xOrderColumns( xAnalyzer->getOrderColumns(), UNO_SET_THROW ); const sal_Int32 nOrderColumns( xOrderColumns->getCount() ); for ( sal_Int32 c=0; c xOrderColumn( xOrderColumns->getByIndex(c), UNO_QUERY_THROW ); ::rtl::OUString sColumnName; OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_NAME ) >>= sColumnName); ::rtl::OUString sTableName; OSL_VERIFY( xOrderColumn->getPropertyValue( PROPERTY_TABLENAME ) >>= sTableName); (void)sColumnName; (void)sTableName; } } } #endif Reference< XWarningsSupplier > xWarnings( _rxLoadable, UNO_QUERY ); if ( xWarnings.is() ) { try { SQLExceptionInfo aInfo( xWarnings->getWarnings() ); if ( aInfo.isValid() ) { showError( aInfo ); impl_checkForCannotSelectUnfiltered( aInfo ); } } catch(const SQLException& e) { (void)e; } } return _rxLoadable->isLoaded(); } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::initFormatter() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initFormatter" ); // --------------------------------------------------------------- // create a formatter working with the connections format supplier Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB())); if(xSupplier.is()) { // create a new formatter m_xFormatter = Reference< ::com::sun::star::util::XNumberFormatter > ( getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY); if (m_xFormatter.is()) m_xFormatter->attachNumberFormatsSupplier(xSupplier); } else // clear the formatter m_xFormatter = NULL; } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::describeSupportedFeatures() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::describeSupportedFeatures" ); SbaXDataBrowserController_Base::describeSupportedFeatures(); implDescribeSupportedFeature( ".uno:FormSlots/undoRecord", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FormController/undoRecord", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:RecUndo", ID_BROWSER_UNDORECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FormSlots/saveRecord", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FormController/saveRecord", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:RecSave", ID_BROWSER_SAVERECORD, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:Save", ID_BROWSER_SAVERECORD, CommandGroup::DOCUMENT ); implDescribeSupportedFeature( ".uno:RecSearch", SID_FM_SEARCH, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:AutoFilter", SID_FM_AUTOFILTER, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:Refresh", SID_FM_REFRESH, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:OrderCrit", SID_FM_ORDERCRIT, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:RemoveFilterSort", SID_FM_REMOVE_FILTER_SORT,CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FormFiltered", SID_FM_FORM_FILTERED, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FilterCrit", SID_FM_FILTERCRIT, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:Sortup", ID_BROWSER_SORTUP, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:SortDown", ID_BROWSER_SORTDOWN, CommandGroup::CONTROLS ); implDescribeSupportedFeature( ".uno:FormSlots/deleteRecord", SID_FM_DELETEROWS, CommandGroup::EDIT ); implDescribeSupportedFeature( ".uno:FormSlots/insertRecord", ID_BROWSER_INSERT_ROW, CommandGroup::INSERT ); } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::Construct(Window* pParent) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Construct" ); // --------------------------------------------- // create/initialize the form and the grid model m_xRowSet = CreateForm(); if (!m_xRowSet.is()) return sal_False; m_xColumnsSupplier.set(m_xRowSet,UNO_QUERY); m_xLoadable.set(m_xRowSet,UNO_QUERY); Reference< XPropertySet > xFormProperties( m_xRowSet, UNO_QUERY ); if ( !InitializeForm( xFormProperties ) ) return sal_False; m_xGridModel = CreateGridModel(); if (!m_xGridModel.is()) return sal_False; // set the formatter if available initFormatter(); // --------------------------------------------------------------- // we want to have a grid with a "flat" border Reference< XPropertySet > xGridSet(m_xGridModel, UNO_QUERY); if ( xGridSet.is() ) xGridSet->setPropertyValue(PROPERTY_BORDER, makeAny((sal_Int16)2)); // ---------- // marry them Reference< ::com::sun::star::container::XNameContainer > xNameCont(m_xRowSet, UNO_QUERY); { String sText(ModuleRes(STR_DATASOURCE_GRIDCONTROL_NAME)); xNameCont->insertByName(::rtl::OUString(sText), makeAny(m_xGridModel)); } // --------------- // create the view setView( * new UnoDataBrowserView( pParent, *this, getORB() ) ); if (!getBrowserView()) return sal_False; // late construction sal_Bool bSuccess = sal_False; try { getBrowserView()->Construct(getControlModel()); bSuccess = sal_True; } catch(SQLException&) { } catch(Exception&) { DBG_ERROR("SbaXDataBrowserController::Construct : the construction of UnoDataBrowserView failed !"); } if (!bSuccess) { // deleteView(); return sal_False; } // now that we have a view we can create the clipboard listener m_aSystemClipboard = TransferableDataHelper::CreateFromSystemClipboard( getView() ); m_aSystemClipboard.StartClipboardListening( ); m_pClipbordNotifier = new TransferableClipboardListener( LINK( this, SbaXDataBrowserController, OnClipboardChanged ) ); m_pClipbordNotifier->acquire(); m_pClipbordNotifier->AddRemoveListener( getView(), sal_True ); // this call create the toolbox SbaXDataBrowserController_Base::Construct(pParent); getBrowserView()->Show(); // set the callbacks for the grid control SbaGridControl* pVclGrid = getBrowserView()->getVclControl(); DBG_ASSERT(pVclGrid, "SbaXDataBrowserController::Construct : have no VCL control !"); pVclGrid->SetMasterListener(this); // -------------------------- // add listeners ... // ... to the form model Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (xFormSet.is()) { xFormSet->addPropertyChangeListener(PROPERTY_ISNEW, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_ISMODIFIED, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_ROWCOUNT, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_ORDER, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_FILTER, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast(this)); xFormSet->addPropertyChangeListener(PROPERTY_APPLYFILTER, static_cast(this)); } Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); if (xFormError.is()) xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); if (m_xLoadable.is()) m_xLoadable->addLoadListener(this); Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(getRowSet(), UNO_QUERY); if (xFormParameter.is()) xFormParameter->addParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); addModelListeners(getControlModel()); addControlListeners(getBrowserView()->getGridControl()); // ------------- // load the form return LoadForm(); } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::LoadForm() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadForm" ); reloadForm( m_xLoadable ); return sal_True; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::AddColumnListener(const Reference< XPropertySet > & /*xCol*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AddColumnListener" ); // we're not interested in any column properties ... } //------------------------------------------------------------------------------ void SbaXDataBrowserController::RemoveColumnListener(const Reference< XPropertySet > & /*xCol*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RemoveColumnListener" ); } //------------------------------------------------------------------------------ Reference< XRowSet > SbaXDataBrowserController::CreateForm() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateForm" ); return Reference< XRowSet > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.Form")), UNO_QUERY); } //------------------------------------------------------------------------------ Reference< ::com::sun::star::form::XFormComponent > SbaXDataBrowserController::CreateGridModel() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CreateGridModel" ); return Reference< ::com::sun::star::form::XFormComponent > (getORB()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.form.component.GridControl")), UNO_QUERY); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::addModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addModelListeners" ); // ... all the grid columns addColumnListeners(_xGridControlModel); // (we are interested in all columns the grid has (and only in these) so we have to listen to the container, too) Reference< ::com::sun::star::container::XContainer > xColContainer(_xGridControlModel, UNO_QUERY); if (xColContainer.is()) xColContainer->addContainerListener((::com::sun::star::container::XContainerListener*)this); Reference< ::com::sun::star::form::XReset > xReset(_xGridControlModel, UNO_QUERY); if (xReset.is()) xReset->addResetListener((::com::sun::star::form::XResetListener*)this); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::removeModelListeners(const Reference< XControlModel > & _xGridControlModel) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeModelListeners" ); // every single column model Reference< XIndexContainer > xColumns(_xGridControlModel, UNO_QUERY); if (xColumns.is()) { sal_Int32 nCount = xColumns->getCount(); for (sal_uInt16 i=0; i < nCount; ++i) { Reference< XPropertySet > xCol(xColumns->getByIndex(i),UNO_QUERY); RemoveColumnListener(xCol); } } Reference< XContainer > xColContainer(_xGridControlModel, UNO_QUERY); if (xColContainer.is()) xColContainer->removeContainerListener( this ); Reference< XReset > xReset(_xGridControlModel, UNO_QUERY); if (xReset.is()) xReset->removeResetListener( this ); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::addControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addControlListeners" ); // to ge the 'modified' for the current cell Reference< XModifyBroadcaster > xBroadcaster(getBrowserView()->getGridControl(), UNO_QUERY); if (xBroadcaster.is()) xBroadcaster->addModifyListener(static_cast(this)); // introduce ourself as dispatch provider for the grid Reference< XDispatchProviderInterception > xInterception(getBrowserView()->getGridControl(), UNO_QUERY); if (xInterception.is()) xInterception->registerDispatchProviderInterceptor(static_cast(this)); // add as focus listener to the control (needed for the form controller functionality) Reference< XWindow > xWindow(_xGridControl, UNO_QUERY); if (xWindow.is()) xWindow->addFocusListener(this); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::removeControlListeners(const Reference< ::com::sun::star::awt::XControl > & _xGridControl) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::removeControlListeners" ); Reference< XModifyBroadcaster > xBroadcaster(_xGridControl, UNO_QUERY); if (xBroadcaster.is()) xBroadcaster->removeModifyListener(static_cast(this)); Reference< XDispatchProviderInterception > xInterception(_xGridControl, UNO_QUERY); if (xInterception.is()) xInterception->releaseDispatchProviderInterceptor(static_cast(this)); Reference< XWindow > xWindow(_xGridControl, UNO_QUERY); if (xWindow.is()) xWindow->removeFocusListener(this); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::focusGained(const FocusEvent& /*e*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusGained" ); // notify our activate listeners (registered on the form controller aggregate) EventObject aEvt(*this); ::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners); while (aIter.hasMoreElements()) static_cast(aIter.next())->formActivated(aEvt); } //------------------------------------------------------------------ void SAL_CALL SbaXDataBrowserController::focusLost(const FocusEvent& e) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::focusLost" ); // some general checks if (!getBrowserView() || !getBrowserView()->getGridControl().is()) return; Reference< XVclWindowPeer > xMyGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); if (!xMyGridPeer.is()) return; Reference< XWindowPeer > xNextControlPeer(e.NextFocus, UNO_QUERY); if (!xNextControlPeer.is()) return; // don't do a notification if it remains in the family (i.e. a child of the grid control gets the focus) if (xMyGridPeer->isChild(xNextControlPeer)) return; if (xMyGridPeer == xNextControlPeer) return; // notify the listeners that the "form" we represent has been deactivated EventObject aEvt(*this); ::cppu::OInterfaceIteratorHelper aIter(m_pFormControllerImpl->m_aActivateListeners); while (aIter.hasMoreElements()) static_cast(aIter.next())->formDeactivated(aEvt); // commit the changes of the grid control (as we're deactivated) Reference< XBoundComponent > xCommitable(getBrowserView()->getGridControl(), UNO_QUERY); if (xCommitable.is()) xCommitable->commit(); else OSL_ENSURE(sal_False, "SbaXDataBrowserController::focusLost : why is my control not commitable ?"); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::disposingGridControl(const ::com::sun::star::lang::EventObject& /*Source*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridControl" ); removeControlListeners(getBrowserView()->getGridControl()); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::disposingGridModel(const ::com::sun::star::lang::EventObject& /*Source*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingGridModel" ); removeModelListeners(getControlModel()); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::disposingFormModel(const ::com::sun::star::lang::EventObject& Source) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingFormModel" ); Reference< XPropertySet > xSourceSet(Source.Source, UNO_QUERY); if (xSourceSet.is()) { xSourceSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast(this)); xSourceSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast(this)); } Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(Source.Source, UNO_QUERY); if (xFormError.is()) xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); if (m_xLoadable.is()) m_xLoadable->removeLoadListener(this); Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(Source.Source, UNO_QUERY); if (xFormParameter.is()) xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::disposingColumnModel(const ::com::sun::star::lang::EventObject& Source) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposingColumnModel" ); RemoveColumnListener(Reference< XPropertySet > (Source.Source, UNO_QUERY)); } // ------------------------------------------------------------------------- void SbaXDataBrowserController::disposing(const EventObject& Source) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::disposing" ); // if it's a component other than our aggregate, forward it to the aggregate if ( m_xFormControllerImpl != Source.Source ) { Reference< XEventListener > xAggListener; m_xFormControllerImpl->queryAggregation( ::getCppuType( &xAggListener ) ) >>= xAggListener; if ( xAggListener.is( )) xAggListener->disposing( Source ); } // is it the grid control ? if (getBrowserView()) { Reference< ::com::sun::star::awt::XControl > xSourceControl(Source.Source, UNO_QUERY); if (xSourceControl == getBrowserView()->getGridControl()) disposingGridControl(Source); } // it's model (the container of the columns) ? if (getControlModel() == Source.Source) disposingGridModel(Source); // the form's model ? if ((getRowSet() == Source.Source)) disposingFormModel(Source); // from a single column model ? Reference< XPropertySet > xSourceSet(Source.Source, UNO_QUERY); if (xSourceSet.is()) { Reference< XPropertySetInfo > xInfo = xSourceSet->getPropertySetInfo(); // we assume that columns have a Width property and all other sets we are listening to don't have if (xInfo->hasPropertyByName(PROPERTY_WIDTH)) disposingColumnModel(Source); } SbaXDataBrowserController_Base::OGenericUnoController::disposing( Source ); } // ----------------------------------------------------------------------- void SAL_CALL SbaXDataBrowserController::setIdentifier( const ::rtl::OUString& _Identifier ) throw (RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setIdentifier" ); ::osl::MutexGuard aGuard( getMutex() ); m_sModuleIdentifier = _Identifier; } // ----------------------------------------------------------------------- ::rtl::OUString SAL_CALL SbaXDataBrowserController::getIdentifier( ) throw (RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getIdentifier" ); ::osl::MutexGuard aGuard( getMutex() ); return m_sModuleIdentifier; } // ----------------------------------------------------------------------- void SbaXDataBrowserController::propertyChange(const PropertyChangeEvent& evt) throw ( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::propertyChange" ); Reference< XPropertySet > xSource(evt.Source, UNO_QUERY); if (!xSource.is()) return; ::vos::OGuard aGuard(Application::GetSolarMutex()); // the IsModified changed to sal_False ? if ( (evt.PropertyName.equals(PROPERTY_ISMODIFIED)) && (::comphelper::getBOOL(evt.NewValue) == sal_False) ) { // -> the current field isn't modified anymore, too setCurrentModified( sal_False ); } // switching to a new record ? if ( (evt.PropertyName.equals(PROPERTY_ISNEW)) && (::comphelper::getBOOL(evt.NewValue) == sal_True) ) { if (::comphelper::getINT32(xSource->getPropertyValue(PROPERTY_ROWCOUNT)) == 0) // if we're switching to a new record and didn't have any records before we need to invalidate // all slots (as the cursor was invalid before the mode change and so the slots were disabled) InvalidateAll(); } if (evt.PropertyName.equals(PROPERTY_FILTER)) { InvalidateFeature(ID_BROWSER_REMOVEFILTER); } else if (evt.PropertyName.equals(PROPERTY_HAVING_CLAUSE)) { InvalidateFeature(ID_BROWSER_REMOVEFILTER); } else if (evt.PropertyName.equals(PROPERTY_ORDER)) { InvalidateFeature(ID_BROWSER_REMOVEFILTER); } // a new record count ? -> may be our search availability has changed if (evt.PropertyName.equals(PROPERTY_ROWCOUNT)) { sal_Int32 nNewValue = 0, nOldValue = 0; evt.NewValue >>= nNewValue; evt.OldValue >>= nOldValue; if((nOldValue == 0 && nNewValue != 0) || (nOldValue != 0 && nNewValue == 0)) InvalidateAll(); } } //------------------------------------------------------------------------ void SbaXDataBrowserController::modified(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::modified" ); setCurrentModified( sal_True ); } // ----------------------------------------------------------------------- void SbaXDataBrowserController::elementInserted(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementInserted" ); DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), "SbaXDataBrowserController::elementInserted: where did this come from (not from the grid model)?!"); Reference< XPropertySet > xNewColumn(evt.Element,UNO_QUERY); if ( xNewColumn.is() ) AddColumnListener(xNewColumn); } // ----------------------------------------------------------------------- void SbaXDataBrowserController::elementRemoved(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementRemoved" ); DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), "SbaXDataBrowserController::elementRemoved: where did this come from (not from the grid model)?!"); Reference< XPropertySet > xOldColumn(evt.Element,UNO_QUERY); if ( xOldColumn.is() ) RemoveColumnListener(xOldColumn); } // ----------------------------------------------------------------------- void SbaXDataBrowserController::elementReplaced(const ::com::sun::star::container::ContainerEvent& evt) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::elementReplaced" ); DBG_ASSERT(Reference< XInterface >(evt.Source, UNO_QUERY).get() == Reference< XInterface >(getControlModel(), UNO_QUERY).get(), "SbaXDataBrowserController::elementReplaced: where did this come from (not from the grid model)?!"); Reference< XPropertySet > xOldColumn(evt.ReplacedElement,UNO_QUERY); if ( xOldColumn.is() ) RemoveColumnListener(xOldColumn); Reference< XPropertySet > xNewColumn(evt.Element,UNO_QUERY); if ( xNewColumn.is() ) AddColumnListener(xNewColumn); } // ----------------------------------------------------------------------- sal_Bool SbaXDataBrowserController::suspend(sal_Bool /*bSuspend*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::suspend" ); DBG_ASSERT(m_nPendingLoadFinished == 0, "SbaXDataBrowserController::suspend : there shouldn't be a pending load !"); m_aAsyncGetCellFocus.CancelCall(); m_aAsyncDisplayError.CancelCall(); m_aAsyncInvalidateAll.CancelCall(); sal_Bool bSuccess = SaveModified(); return bSuccess; } // ----------------------------------------------------------------------- void SbaXDataBrowserController::disposing() { // the base class SbaXDataBrowserController_Base::OGenericUnoController::disposing(); // the data source Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (xFormSet.is()) { xFormSet->removePropertyChangeListener(PROPERTY_ISNEW, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_ISMODIFIED, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_ROWCOUNT, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_ACTIVECOMMAND, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_ORDER, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_FILTER, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_HAVING_CLAUSE, static_cast(this)); xFormSet->removePropertyChangeListener(PROPERTY_APPLYFILTER, static_cast(this)); } Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); if (xFormError.is()) xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); if (m_xLoadable.is()) m_xLoadable->removeLoadListener(this); Reference< ::com::sun::star::form::XDatabaseParameterBroadcaster > xFormParameter(getRowSet(), UNO_QUERY); if (xFormParameter.is()) xFormParameter->removeParameterListener((::com::sun::star::form::XDatabaseParameterListener*)this); removeModelListeners(getControlModel()); if ( getView() && m_pClipbordNotifier ) { m_pClipbordNotifier->ClearCallbackLink(); m_pClipbordNotifier->AddRemoveListener( getView(), sal_False ); m_pClipbordNotifier->release(); m_pClipbordNotifier = NULL; } if (getBrowserView()) { removeControlListeners(getBrowserView()->getGridControl()); // don't delete explicitly, this is done by the owner (and user) of this controller (me hopes ...) clearView(); } if(m_aInvalidateClipboard.IsActive()) m_aInvalidateClipboard.Stop(); // dispose the row set try { ::comphelper::disposeComponent(m_xRowSet); m_xRowSet = NULL; m_xColumnsSupplier = NULL; m_xLoadable = NULL; } catch(Exception&) { DBG_UNHANDLED_EXCEPTION(); } m_xParser.clear(); // don't dispose, just reset - it's owned by the RowSet } //------------------------------------------------------------------------------ void SbaXDataBrowserController::frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::frameAction" ); ::osl::MutexGuard aGuard( getMutex() ); SbaXDataBrowserController_Base::frameAction( aEvent ); if ( aEvent.Source == getFrame() ) switch ( aEvent.Action ) { case FrameAction_FRAME_ACTIVATED: case FrameAction_FRAME_UI_ACTIVATED: // ensure that the active cell (if any) has the focus m_aAsyncGetCellFocus.Call(); // start the clipboard timer if (getBrowserView() && getBrowserView()->getVclControl() && !m_aInvalidateClipboard.IsActive()) { m_aInvalidateClipboard.Start(); OnInvalidateClipboard( NULL ); } break; case FrameAction_FRAME_DEACTIVATING: case FrameAction_FRAME_UI_DEACTIVATING: // stop the clipboard invalidator if (getBrowserView() && getBrowserView()->getVclControl() && m_aInvalidateClipboard.IsActive()) { m_aInvalidateClipboard.Stop(); OnInvalidateClipboard( NULL ); } // remove the "get cell focus"-event m_aAsyncGetCellFocus.CancelCall(); break; default: break; } } //------------------------------------------------------------------------------ IMPL_LINK( SbaXDataBrowserController, OnAsyncDisplayError, void*, /* _pNotInterestedIn */ ) { if ( m_aCurrentError.isValid() ) { OSQLMessageBox aDlg( getBrowserView(), m_aCurrentError ); aDlg.Execute(); } return 0L; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::errorOccured" ); ::osl::MutexGuard aGuard( getMutex() ); SQLExceptionInfo aInfo( aEvent.Reason ); if ( !aInfo.isValid() ) return; if ( m_nFormActionNestingLevel ) { OSL_ENSURE( !m_aCurrentError.isValid(), "SbaXDataBrowserController::errorOccured: can handle one error per transaction only!" ); m_aCurrentError = aInfo; } else { m_aCurrentError = aInfo; m_aAsyncDisplayError.Call(); } } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveParameter" ); if (aEvent.Source != getRowSet()) { // not my data source -> allow anything DBG_ERROR("SbaXDataBrowserController::approveParameter : invalid event source !"); return sal_True; } Reference< ::com::sun::star::container::XIndexAccess > xParameters = aEvent.Parameters; ::vos::OGuard aSolarGuard(Application::GetSolarMutex()); // this may be executed in a non-main thread and we want to use vcl ... Window* pParent = Application::GetDefDialogParent(); // don't use the content as parent if it isn't visible // (and don't use NULL as parent : this may be displayed in the beamer and really shouldn't be task-local) // 69297 - FS - 25.10.99 if (getBrowserView() && getBrowserView()->IsVisible()) pParent = getBrowserView(); // default handling: instantiate an interaction handler and let it handle the parameter request try { // two continuations allowed: OK and Cancel OParameterContinuation* pParamValues = new OParameterContinuation; OInteractionAbort* pAbort = new OInteractionAbort; // the request ParametersRequest aRequest; aRequest.Parameters = xParameters; aRequest.Connection = getConnection(Reference< XRowSet >(aEvent.Source, UNO_QUERY)); OInteractionRequest* pParamRequest = new OInteractionRequest(makeAny(aRequest)); Reference< XInteractionRequest > xParamRequest(pParamRequest); // some knittings pParamRequest->addContinuation(pParamValues); pParamRequest->addContinuation(pAbort); // create the handler, let it handle the request Reference< XInteractionHandler > xHandler(getORB()->createInstance(SERVICE_TASK_INTERACTION_HANDLER), UNO_QUERY); if (xHandler.is()) xHandler->handle(xParamRequest); if (!pParamValues->wasSelected()) { // canceled setLoadingCancelled(); return sal_False; } // transfer the values into the parameter supplier Sequence< PropertyValue > aFinalValues = pParamValues->getValues(); if (aFinalValues.getLength() != aRequest.Parameters->getCount()) { DBG_ERROR("SbaXDataBrowserController::approveParameter: the InteractionHandler returned nonsense!"); setLoadingCancelled(); return sal_False; } const PropertyValue* pFinalValues = aFinalValues.getConstArray(); for (sal_Int32 i=0; i xParam; ::cppu::extractInterface(xParam, aRequest.Parameters->getByIndex(i)); DBG_ASSERT(xParam.is(), "SbaXDataBrowserController::approveParameter: one of the parameters is no property set!"); if (xParam.is()) { #ifdef DBG_UTIL ::rtl::OUString sName; xParam->getPropertyValue(PROPERTY_NAME) >>= sName; DBG_ASSERT(sName.equals(pFinalValues->Name), "SbaXDataBrowserController::approveParameter: suspicious value names!"); #endif try { xParam->setPropertyValue(PROPERTY_VALUE, pFinalValues->Value); } catch(Exception&) { DBG_ERROR("SbaXDataBrowserController::approveParameter: setting one of the properties failed!"); } } } } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return sal_True; } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::approveReset(const ::com::sun::star::lang::EventObject& /*rEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::approveReset" ); return sal_True; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::resetted" ); DBG_ASSERT(rEvent.Source == getControlModel(), "SbaXDataBrowserController::resetted : where did this come from ?"); (void)rEvent; setCurrentModified( sal_False ); } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::confirmDelete" ); if (QueryBox(getBrowserView(), ModuleRes(QUERY_BRW_DELETE_ROWS)).Execute() != RET_YES) return sal_False; return sal_True; } //------------------------------------------------------------------------------ FeatureState SbaXDataBrowserController::GetState(sal_uInt16 nId) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::GetState" ); FeatureState aReturn; // (disabled automatically) try { // no chance without a view if (!getBrowserView() || !getBrowserView()->getVclControl()) return aReturn; switch (nId) { case ID_BROWSER_REMOVEFILTER: if (!m_xParser.is()) { aReturn.bEnabled = false; return aReturn; } // any filter or sort order set ? aReturn.bEnabled = m_xParser->getFilter().getLength() || m_xParser->getHavingClause().getLength() || m_xParser->getOrder().getLength(); return aReturn; } // no chance without valid models if (isValid() && !isValidCursor()) return aReturn; switch (nId) { case ID_BROWSER_SEARCH: { Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); sal_Int32 nCount = ::comphelper::getINT32(xFormSet->getPropertyValue(PROPERTY_ROWCOUNT)); aReturn.bEnabled = nCount != 0; } break; case ID_BROWSER_INSERT_ROW: { // check if it is available sal_Bool bInsertPrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0; sal_Bool bAllowInsertions = sal_True; try { Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowInserts" ) ) >>= bAllowInsertions ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } aReturn.bEnabled = bInsertPrivilege && bAllowInsertions; } break; case SID_FM_DELETEROWS: { // check if it is available sal_Bool bDeletePrivilege = ( m_nRowSetPrivileges & Privilege::INSERT) != 0; sal_Bool bAllowDeletions = sal_True; sal_Int32 nRowCount = 0; sal_Bool bInsertionRow = sal_False; try { Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); OSL_VERIFY( xRowSetProps->getPropertyValue( ::rtl::OUString::createFromAscii( "AllowDeletes" ) ) >>= bAllowDeletions ); OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ROWCOUNT ) >>= nRowCount ); OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ISNEW ) >>= bInsertionRow ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } aReturn.bEnabled = bDeletePrivilege && bAllowDeletions && ( nRowCount != 0 ) && !bInsertionRow; } break; case ID_BROWSER_COPY: if ( getBrowserView()->getVclControl()->GetSelectRowCount() ) { aReturn.bEnabled = m_aCurrentFrame.isActive(); break; } // run through case ID_BROWSER_PASTE: case ID_BROWSER_CUT: { CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller(); if (xCurrentController.Is() && xCurrentController->ISA(EditCellController)) { Edit& rEdit = (Edit&)xCurrentController->GetWindow(); sal_Bool bHasLen = (rEdit.GetSelection().Len() != 0); sal_Bool bIsReadOnly = rEdit.IsReadOnly(); switch (nId) { case ID_BROWSER_CUT: aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen && !bIsReadOnly; break; case SID_COPY : aReturn.bEnabled = m_aCurrentFrame.isActive() && bHasLen; break; case ID_BROWSER_PASTE: aReturn.bEnabled = m_aCurrentFrame.isActive() && !bIsReadOnly; if(aReturn.bEnabled) { aReturn.bEnabled = aReturn.bEnabled && IsFormatSupported( m_aSystemClipboard.GetDataFlavorExVector(), FORMAT_STRING ); } break; } } } break; case ID_BROWSER_SORTUP: case ID_BROWSER_SORTDOWN: case ID_BROWSER_AUTOFILTER: { // a native statement can't be filtered or sorted const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() ) break; Reference< XPropertySet > xCurrentField = getBoundField(); if (!xCurrentField.is()) break; aReturn.bEnabled = ::comphelper::getBOOL(xCurrentField->getPropertyValue(PROPERTY_ISSEARCHABLE)); const Reference< XRowSet > xRow = getRowSet(); aReturn.bEnabled = aReturn.bEnabled && xRow.is() && !xRow->isBeforeFirst() && !xRow->isAfterLast() && !xRow->rowDeleted() && ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 ); } break; case ID_BROWSER_FILTERCRIT: if ( m_bCannotSelectUnfiltered && m_xParser.is() ) { aReturn.bEnabled = sal_True; break; } // no break case ID_BROWSER_ORDERCRIT: { const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if ( !::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING)) || !m_xParser.is() ) break; aReturn.bEnabled = getRowSet().is() && ( ::comphelper::getINT32( xFormSet->getPropertyValue( PROPERTY_ROWCOUNT ) ) != 0 ); } break; case ID_BROWSER_REFRESH: aReturn.bEnabled = sal_True; break; case ID_BROWSER_REDO: aReturn.bEnabled = sal_False; // simply forget it ;). no redo possible. break; case ID_BROWSER_UNDORECORD: case ID_BROWSER_SAVERECORD: { if (!m_bCurrentlyModified) { Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (xFormSet.is()) aReturn.bEnabled = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED)); } else aReturn.bEnabled = sal_True; aReturn.sTitle = (ID_BROWSER_UNDORECORD == nId) ? m_sStateUndoRecord : m_sStateSaveRecord; } break; case ID_BROWSER_EDITDOC: { // check if it is available Reference< XPropertySet > xDataSourceSet(getRowSet(), UNO_QUERY); if (!xDataSourceSet.is()) break; // no datasource -> no edit mode sal_Int32 nDataSourcePrivileges = ::comphelper::getINT32(xDataSourceSet->getPropertyValue(PROPERTY_PRIVILEGES)); sal_Bool bInsertAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::INSERT) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowInserts"))); sal_Bool bUpdateAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::UPDATE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowUpdates"))); sal_Bool bDeleteAllowedAndPossible = ((nDataSourcePrivileges & ::com::sun::star::sdbcx::Privilege::DELETE) != 0) && ::comphelper::getBOOL(xDataSourceSet->getPropertyValue(::rtl::OUString::createFromAscii("AllowDeletes"))); if (!bInsertAllowedAndPossible && !bUpdateAllowedAndPossible && !bDeleteAllowedAndPossible) break; // no insert/update/delete -> no edit mode if (!isValidCursor() || !isLoaded()) break; // no cursor -> no edit mode aReturn.bEnabled = sal_True; sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions(); aReturn.bChecked = nGridMode > DbGridControl::OPT_READONLY; } break; case ID_BROWSER_FILTERED: { aReturn.bEnabled = sal_False; Reference< XPropertySet > xActiveSet(getRowSet(), UNO_QUERY); ::rtl::OUString aFilter = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_FILTER)); ::rtl::OUString aHaving = ::comphelper::getString(xActiveSet->getPropertyValue(PROPERTY_HAVING_CLAUSE)); if ( aFilter.getLength() || aHaving.getLength() ) { xActiveSet->getPropertyValue( PROPERTY_APPLYFILTER ) >>= aReturn.bChecked; aReturn.bEnabled = sal_True; } else { aReturn.bChecked = sal_False; aReturn.bEnabled = sal_False; } } break; default: return SbaXDataBrowserController_Base::GetState(nId); } } catch(const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return aReturn; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::applyParserOrder(const ::rtl::OUString& _rOldOrder,const Reference< XSingleSelectQueryComposer >& _xParser) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserOrder" ); Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (!m_xLoadable.is()) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserOrder: invalid row set!"); return; } sal_uInt16 nPos = getCurrentColumnPosition(); sal_Bool bSuccess = sal_False; try { xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_xParser->getOrder())); bSuccess = reloadForm(m_xLoadable); } catch(Exception&) { } if (!bSuccess) { xFormSet->setPropertyValue(PROPERTY_ORDER, makeAny(_rOldOrder)); //DO_SAFE( _xParser->setOrder(_rOldOrder), "SbaXDataBrowserController::applyParserOrder: could not restore the old order of my parser !" ); try { if (loadingCancelled() || !reloadForm(m_xLoadable)) criticalFail(); } catch(Exception&) { criticalFail(); } InvalidateAll(); } InvalidateFeature(ID_BROWSER_REMOVEFILTER); setCurrentColumnPosition(nPos); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::applyParserFilter(const ::rtl::OUString& _rOldFilter, sal_Bool _bOldFilterApplied,const ::rtl::OUString& _sOldHaving,const Reference< XSingleSelectQueryComposer >& _xParser) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::applyParserFilter" ); Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (!m_xLoadable.is()) { OSL_ENSURE(sal_False, "SbaXDataBrowserController::applyParserFilter: invalid row set!"); return; } sal_uInt16 nPos = getCurrentColumnPosition(); sal_Bool bSuccess = sal_False; try { FormErrorHelper aError(this); xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_xParser->getFilter())); xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_xParser->getHavingClause())); xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(sal_True))); bSuccess = reloadForm(m_xLoadable); } catch(Exception&) { } if (!bSuccess) { xFormSet->setPropertyValue(PROPERTY_FILTER, makeAny(_rOldFilter)); xFormSet->setPropertyValue(PROPERTY_HAVING_CLAUSE, makeAny(_sOldHaving)); xFormSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(_bOldFilterApplied)); try { if (loadingCancelled() || !reloadForm(m_xLoadable)) criticalFail(); } catch(Exception&) { criticalFail(); } InvalidateAll(); } InvalidateFeature(ID_BROWSER_REMOVEFILTER); setCurrentColumnPosition(nPos); } //------------------------------------------------------------------------------ Reference< XSingleSelectQueryComposer > SbaXDataBrowserController::createParser_nothrow() { Reference< XSingleSelectQueryComposer > xComposer; try { const Reference< XPropertySet > xRowSetProps( getRowSet(), UNO_QUERY_THROW ); const Reference< XMultiServiceFactory > xFactory( xRowSetProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ), UNO_QUERY_THROW ); xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY_THROW ); ::rtl::OUString sActiveCommand; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ACTIVECOMMAND ) >>= sActiveCommand ); if ( sActiveCommand.getLength() > 0 ) { xComposer->setElementaryQuery( sActiveCommand ); } else { ::rtl::OUString sCommand; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND ) >>= sCommand ); sal_Int32 nCommandType = CommandType::COMMAND; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_COMMAND_TYPE ) >>= nCommandType ); xComposer->setCommand( sCommand, nCommandType ); } ::rtl::OUString sFilter; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_FILTER ) >>= sFilter ); xComposer->setFilter( sFilter ); ::rtl::OUString sHavingClause; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_HAVING_CLAUSE ) >>= sHavingClause ); xComposer->setHavingClause( sHavingClause ); ::rtl::OUString sOrder; OSL_VERIFY( xRowSetProps->getPropertyValue( PROPERTY_ORDER ) >>= sOrder ); xComposer->setOrder( sOrder ); } catch ( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return xComposer; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::ExecuteFilterSortCrit(sal_Bool bFilter) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteFilterSortCrit" ); if (!SaveModified()) return; Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); const ::rtl::OUString sOldVal = bFilter ? m_xParser->getFilter() : m_xParser->getOrder(); const ::rtl::OUString sOldHaving = m_xParser->getHavingClause(); Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); try { Reference< ::com::sun::star::sdbcx::XColumnsSupplier> xSup = getColumnsSupplier(); Reference< XConnection> xCon(xFormSet->getPropertyValue(PROPERTY_ACTIVE_CONNECTION),UNO_QUERY); if(bFilter) { DlgFilterCrit aDlg( getBrowserView(), getORB(), xCon, xParser, xSup->getColumns() ); String aFilter; if ( !aDlg.Execute() ) return; // if so we don't need to update the grid aDlg.BuildWherePart(); } else { DlgOrderCrit aDlg( getBrowserView(),xCon,xParser,xSup->getColumns() ); String aOrder; if(!aDlg.Execute()) { return; // if so we don't need to actualize the grid } aDlg.BuildOrderPart(); } } catch(const SQLException& ) { SQLExceptionInfo aError( ::cppu::getCaughtException() ); showError( aError ); return; } catch(Exception&) { return; } ::rtl::OUString sNewVal = bFilter ? xParser->getFilter() : xParser->getOrder(); sal_Bool bOldFilterApplied(sal_False); if (bFilter) { try { bOldFilterApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER)); } catch(Exception&) { } ; } ::rtl::OUString sNewHaving = xParser->getHavingClause(); if ( sOldVal.equals(sNewVal) && (!bFilter || sOldHaving.equals(sNewHaving)) ) // nothing to be done return; if (bFilter) applyParserFilter(sOldVal, bOldFilterApplied,sOldHaving,xParser); else applyParserOrder(sOldVal,xParser); ::comphelper::disposeComponent(xParser); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::ExecuteSearch() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ExecuteSearch" ); // calculate the control source of the active field Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); DBG_ASSERT(xGrid.is(), "SbaXDataBrowserController::ExecuteSearch : the control should have an ::com::sun::star::form::XGrid interface !"); Reference< ::com::sun::star::form::XGridPeer > xGridPeer(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); Reference< ::com::sun::star::container::XIndexContainer > xColumns = xGridPeer->getColumns(); DBG_ASSERT(xGridPeer.is() && xColumns.is(), "SbaXDataBrowserController::ExecuteSearch : invalid peer !"); sal_Int16 nViewCol = xGrid->getCurrentColumnPosition(); sal_Int16 nModelCol = getBrowserView()->View2ModelPos(nViewCol); Reference< XPropertySet > xCurrentCol(xColumns->getByIndex(nModelCol),UNO_QUERY); String sActiveField = ::comphelper::getString(xCurrentCol->getPropertyValue(PROPERTY_CONTROLSOURCE)); // the text within the current cell String sInitialText; Reference< ::com::sun::star::container::XIndexAccess > xColControls(xGridPeer, UNO_QUERY); Reference< XInterface > xCurControl(xColControls->getByIndex(nViewCol),UNO_QUERY); ::rtl::OUString aInitialText; if (IsSearchableControl(xCurControl, &aInitialText)) sInitialText = (const sal_Unicode*)aInitialText; // prohibit the synchronization of the grid's display with the cursor's position Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::ExecuteSearch : no model set ?!"); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_False))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), makeAny(sal_Int32(COL_LIGHTRED))); Reference< ::com::sun::star::util::XNumberFormatsSupplier > xNFS(::dbtools::getNumberFormats(::dbtools::getConnection(m_xRowSet), sal_True,getORB())); SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); AbstractFmSearchDialog* pDialog = NULL; if ( pFact ) { ::std::vector< String > aContextNames; aContextNames.push_back( String::CreateFromAscii("Standard") ); pDialog = pFact->CreateFmSearchDialog(getBrowserView(), sInitialText, aContextNames, 0, LINK(this, SbaXDataBrowserController, OnSearchContextRequest)); } DBG_ASSERT( pDialog, "SbaXDataBrowserController::ExecuteSearch: could not get the search dialog!" ); if ( pDialog ) { pDialog->SetActiveField( sActiveField ); pDialog->SetFoundHandler( LINK( this, SbaXDataBrowserController, OnFoundData ) ); pDialog->SetCanceledNotFoundHdl( LINK( this, SbaXDataBrowserController, OnCanceledNotFound ) ); pDialog->Execute(); delete pDialog; } // restore the grid's normal operating state xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("AlwaysShowCursor"), ::comphelper::makeBoolAny(sal_Bool(sal_False))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("CursorColor"), Any()); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::Execute(sal_uInt16 nId, const Sequence< PropertyValue >& _rArgs) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::Execute" ); sal_Bool bSortUp = sal_True; switch (nId) { default: SbaXDataBrowserController_Base::Execute( nId, _rArgs ); return; case ID_BROWSER_INSERT_ROW: try { if (SaveModified()) { getRowSet()->afterLast(); // check if it is available Reference< XResultSetUpdate > xUpdateCursor(getRowSet(), UNO_QUERY_THROW); xUpdateCursor->moveToInsertRow(); } } catch(Exception&) { OSL_ENSURE(0,"Exception caught!"); } break; case SID_FM_DELETEROWS: if (SaveModified()) { SbaGridControl* pVclGrid = getBrowserView()->getVclControl(); if ( pVclGrid ) { if( !pVclGrid->GetSelectRowCount() ) { pVclGrid->DeactivateCell(); pVclGrid->SelectRow(pVclGrid->GetCurRow()); } pVclGrid->DeleteSelectedRows(); } } break; case ID_BROWSER_FILTERED: if (SaveModified()) { Reference< XPropertySet > xActiveSet(getRowSet(), UNO_QUERY); sal_Bool bApplied = ::comphelper::getBOOL(xActiveSet->getPropertyValue(PROPERTY_APPLYFILTER)); xActiveSet->setPropertyValue(PROPERTY_APPLYFILTER, ::comphelper::makeBoolAny(sal_Bool(!bApplied))); reloadForm(m_xLoadable); } InvalidateFeature(ID_BROWSER_FILTERED); break; case ID_BROWSER_EDITDOC: { sal_Int16 nGridMode = getBrowserView()->getVclControl()->GetOptions(); if (nGridMode == DbGridControl::OPT_READONLY) getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_UPDATE | DbGridControl::OPT_INSERT | DbGridControl::OPT_DELETE); // the options not supported by the data source will be removed automatically else { if ( !SaveModified( ) ) // give the user a chance to save the current record (if neccessary) break; // maybe the user wanted to reject the modified record ? if (GetState(ID_BROWSER_UNDORECORD).bEnabled) Execute(ID_BROWSER_UNDORECORD,Sequence()); getBrowserView()->getVclControl()->SetOptions(DbGridControl::OPT_READONLY); } InvalidateFeature(ID_BROWSER_EDITDOC); } break; case ID_BROWSER_SEARCH: if ( SaveModified( ) ) ExecuteSearch(); break; case ID_BROWSER_COPY: if ( getBrowserView()->getVclControl()->GetSelectRowCount() > 0 ) { getBrowserView()->getVclControl()->CopySelectedRowsToClipboard(); break; } // run through case ID_BROWSER_CUT: case ID_BROWSER_PASTE: { CellControllerRef xCurrentController = getBrowserView()->getVclControl()->Controller(); if (!xCurrentController.Is()) // should be intercepted by GetState. Normally. // Unfortunately ID_BROWSER_PASTE is a 'fast call' slot, which means it may be executed without checking if it is // enabled. This would be really deadly herein if the current cell has no controller ... // (FS - 13.04.99 - #64694#) return; Edit& rEdit = (Edit&)xCurrentController->GetWindow(); switch (nId) { case ID_BROWSER_CUT : rEdit.Cut(); break; case SID_COPY : rEdit.Copy(); break; case ID_BROWSER_PASTE : rEdit.Paste(); break; } if (ID_BROWSER_CUT == nId || ID_BROWSER_PASTE == nId) { xCurrentController->SetModified(); rEdit.Modify(); } } break; case ID_BROWSER_SORTDOWN: bSortUp = sal_False; // DON'T break case ID_BROWSER_SORTUP: { if (!SaveModified()) break; if (!isValidCursor()) break; // only one sort order Reference< XPropertySet > xField(getBoundField(), UNO_QUERY); if (!xField.is()) break; Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); const ::rtl::OUString sOldSort = xParser->getOrder(); sal_Bool bParserSuccess = sal_False; HANDLE_SQL_ERRORS( xParser->setOrder(::rtl::OUString()); xParser->appendOrderByColumn(xField, bSortUp), bParserSuccess, UniString(ModuleRes(SBA_BROWSER_SETTING_ORDER)), "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" ) if (bParserSuccess) applyParserOrder(sOldSort,xParser); } break; case ID_BROWSER_AUTOFILTER: { if (!SaveModified()) break; if (!isValidCursor()) break; Reference< XPropertySet > xField(getBoundField(), UNO_QUERY); if (!xField.is()) break; // check if the column is a aggregate function sal_Bool bHaving = sal_False; ::rtl::OUString sName; xField->getPropertyValue(PROPERTY_NAME) >>= sName; Reference< XColumnsSupplier > xColumnsSupplier(m_xParser, UNO_QUERY); Reference< ::com::sun::star::container::XNameAccess > xCols = xColumnsSupplier.is() ? xColumnsSupplier->getColumns() : Reference< ::com::sun::star::container::XNameAccess > (); if ( xCols.is() && xCols->hasByName(sName) ) { Reference xProp(xCols->getByName(sName),UNO_QUERY); static ::rtl::OUString sAgg(RTL_CONSTASCII_USTRINGPARAM("AggregateFunction")); if ( xProp->getPropertySetInfo()->hasPropertyByName(sAgg) ) xProp->getPropertyValue(sAgg) >>= bHaving; } Reference< XSingleSelectQueryComposer > xParser = createParser_nothrow(); const ::rtl::OUString sOldFilter = xParser->getFilter(); const ::rtl::OUString sOldHaving = xParser->getHavingClause(); Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); sal_Bool bApplied = ::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_APPLYFILTER)); // do we have a filter but it's not applied ? // -> completely overwrite it, else append one if (!bApplied) { DO_SAFE( (bHaving ? xParser->setHavingClause(::rtl::OUString()) : xParser->setFilter(::rtl::OUString())), "SbaXDataBrowserController::Execute : caught an exception while resetting the new filter !" ); } sal_Bool bParserSuccess = sal_False; sal_Int32 nOp = SQLFilterOperator::EQUAL; if ( xField.is() ) { sal_Int32 nType = 0; xField->getPropertyValue(PROPERTY_TYPE) >>= nType; switch(nType) { case DataType::VARCHAR: case DataType::CHAR: case DataType::LONGVARCHAR: nOp = SQLFilterOperator::LIKE; break; default: nOp = SQLFilterOperator::EQUAL; } } if ( bHaving ) { HANDLE_SQL_ERRORS( xParser->appendHavingClauseByColumn(xField,sal_True,nOp), bParserSuccess, UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)), "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" ) } else { HANDLE_SQL_ERRORS( xParser->appendFilterByColumn(xField,sal_True,nOp), bParserSuccess, UniString(ModuleRes(SBA_BROWSER_SETTING_FILTER)), "SbaXDataBrowserController::Execute : caught an exception while composing the new filter !" ) } if (bParserSuccess) applyParserFilter(sOldFilter, bApplied,sOldHaving,xParser); InvalidateFeature(ID_BROWSER_REMOVEFILTER); InvalidateFeature(ID_BROWSER_FILTERED); } break; case ID_BROWSER_ORDERCRIT: ExecuteFilterSortCrit(sal_False); break; case ID_BROWSER_FILTERCRIT: ExecuteFilterSortCrit(sal_True); InvalidateFeature(ID_BROWSER_FILTERED); break; case ID_BROWSER_REMOVEFILTER: { if (!SaveModified()) break; sal_Bool bNeedPostReload = preReloadForm(); // reset the filter and the sort property simutaneously so only _one_ new statement has to be // sent Reference< XPropertySet > xSet(getRowSet(), UNO_QUERY); if ( xSet.is() ) { xSet->setPropertyValue(PROPERTY_FILTER,makeAny(::rtl::OUString())); xSet->setPropertyValue(PROPERTY_HAVING_CLAUSE,makeAny(::rtl::OUString())); xSet->setPropertyValue(PROPERTY_ORDER,makeAny(::rtl::OUString())); } try { reloadForm(m_xLoadable); if ( bNeedPostReload ) postReloadForm(); } catch(Exception&) { } InvalidateFeature(ID_BROWSER_REMOVEFILTER); InvalidateFeature(ID_BROWSER_FILTERED); } break; case ID_BROWSER_REFRESH: if ( SaveModified( ) ) { if (!reloadForm(m_xLoadable)) criticalFail(); } break; case ID_BROWSER_SAVERECORD: if ( SaveModified( sal_False ) ) setCurrentModified( sal_False ); break; case ID_BROWSER_UNDORECORD: { try { // restore the cursor state Reference< XResultSetUpdate > xCursor(getRowSet(), UNO_QUERY); Reference< XPropertySet > xSet(xCursor, UNO_QUERY); Any aVal = xSet->getPropertyValue(PROPERTY_ISNEW); if (aVal.hasValue() && ::comphelper::getBOOL(aVal)) { xCursor->moveToInsertRow(); // no need to reset the grid model after we moved to the insert row, this is done implicitly by the // form // (and in some cases it may be deadly to do the reset explicitly after the form did it implicitly, // cause the form's reset may be async, and this leads to some nice deadlock scenarios ....) } else { xCursor->cancelRowUpdates(); // restore the grids state Reference< ::com::sun::star::form::XReset > xReset(getControlModel(), UNO_QUERY); if (xReset.is()) xReset->reset(); } } catch(SQLException&) { } setCurrentModified( sal_False ); } } } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::SaveModified(sal_Bool bAskFor) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveModified" ); if ( bAskFor && GetState(ID_BROWSER_SAVERECORD).bEnabled ) { getBrowserView()->getVclControl()->GrabFocus(); QueryBox aQry(getBrowserView()->getVclControl(), ModuleRes(QUERY_BRW_SAVEMODIFIED)); switch (aQry.Execute()) { case RET_NO: Execute(ID_BROWSER_UNDORECORD,Sequence()); return sal_True; case RET_CANCEL: return sal_False; } } if ( !CommitCurrent() ) // das aktuelle Control committen lassen return sal_False; Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); sal_Bool bResult = sal_False; try { if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISMODIFIED))) { Reference< XResultSetUpdate > xCursor(getRowSet(), UNO_QUERY); if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ISNEW))) xCursor->insertRow(); else xCursor->updateRow(); } bResult = sal_True; } catch(SQLException&) { } catch(Exception&) { DBG_ERROR("SbaXDataBrowserController::SaveModified : could not save the current record !"); bResult = sal_False; } InvalidateFeature(ID_BROWSER_SAVERECORD); InvalidateFeature(ID_BROWSER_UNDORECORD); return bResult; } //------------------------------------------------------------------------------ sal_Bool SbaXDataBrowserController::CommitCurrent() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CommitCurrent" ); if (!getBrowserView()) return sal_True; Reference< ::com::sun::star::awt::XControl > xActiveControl(getBrowserView()->getGridControl()); Reference< ::com::sun::star::form::XBoundControl > xLockingTest(xActiveControl, UNO_QUERY); sal_Bool bControlIsLocked = xLockingTest.is() && xLockingTest->getLock(); if (xActiveControl.is() && !bControlIsLocked) { // zunaechst das Control fragen ob es das IFace unterstuetzt Reference< ::com::sun::star::form::XBoundComponent > xBoundControl(xActiveControl, UNO_QUERY); if (!xBoundControl.is()) xBoundControl = Reference< ::com::sun::star::form::XBoundComponent > (xActiveControl->getModel(), UNO_QUERY); if (xBoundControl.is() && !xBoundControl->commit()) return sal_False; } return sal_True; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::setCurrentModified( sal_Bool _bSet ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentModified" ); m_bCurrentlyModified = _bSet; InvalidateFeature( ID_BROWSER_SAVERECORD ); InvalidateFeature( ID_BROWSER_UNDORECORD ); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::RowChanged() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::RowChanged" ); setCurrentModified( sal_False ); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::ColumnChanged() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::ColumnChanged" ); InvalidateFeature(ID_BROWSER_SORTUP); InvalidateFeature(ID_BROWSER_SORTDOWN); InvalidateFeature(ID_BROWSER_ORDERCRIT); InvalidateFeature(ID_BROWSER_FILTERCRIT); InvalidateFeature(ID_BROWSER_AUTOFILTER); InvalidateFeature(ID_BROWSER_REMOVEFILTER); setCurrentModified( sal_False ); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::SelectionChanged() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SelectionChanged" ); // not interested in } //------------------------------------------------------------------------------ void SbaXDataBrowserController::CellActivated() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellActivated" ); m_aInvalidateClipboard.Start(); OnInvalidateClipboard( NULL ); } //------------------------------------------------------------------------------ void SbaXDataBrowserController::CellDeactivated() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::CellDeactivated" ); m_aInvalidateClipboard.Stop(); OnInvalidateClipboard( NULL ); } //------------------------------------------------------------------------------ IMPL_LINK( SbaXDataBrowserController, OnClipboardChanged, void*, EMPTYARG ) { ::vos::OGuard aGuard(Application::GetSolarMutex()); return OnInvalidateClipboard( NULL ); } //------------------------------------------------------------------------------ IMPL_LINK(SbaXDataBrowserController, OnInvalidateClipboard, AutoTimer*, _pTimer) { InvalidateFeature(ID_BROWSER_CUT); InvalidateFeature(ID_BROWSER_COPY); // if the invalidation was triggered by the timer, we do not need to invalidate PASTE. // The timer is only for checking the CUT/COPY slots regulariry, which depend on the // selection state of the active cell // TODO: get a callback at the Edit which allows to be notified when the selection // changes. This would be much better than this cycle-eating polling mechanism here .... if ( _pTimer != &m_aInvalidateClipboard ) InvalidateFeature(ID_BROWSER_PASTE); return 0L; } // ------------------------------------------------------------------------- Reference< XPropertySet > SbaXDataBrowserController::getBoundField(sal_uInt16 nViewPos) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::SaveData" ); Reference< XPropertySet > xEmptyReturn; // get the current column from the grid if (nViewPos == (sal_uInt16)-1) { Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); if (!xGrid.is()) return xEmptyReturn; nViewPos = xGrid->getCurrentColumnPosition(); } sal_uInt16 nCurrentCol = getBrowserView()->View2ModelPos(nViewPos); if (nCurrentCol == (sal_uInt16)-1) return xEmptyReturn; // get the according column from the model Reference< ::com::sun::star::container::XIndexContainer > xCols(getControlModel(), UNO_QUERY); Reference< XPropertySet > xCurrentCol(xCols->getByIndex(nCurrentCol),UNO_QUERY); if (!xCurrentCol.is()) return xEmptyReturn; xEmptyReturn.set(xCurrentCol->getPropertyValue(PROPERTY_BOUNDFIELD) ,UNO_QUERY); return xEmptyReturn; } //------------------------------------------------------------------------------ IMPL_LINK(SbaXDataBrowserController, OnSearchContextRequest, FmSearchContext*, pContext) { Reference< ::com::sun::star::container::XIndexAccess > xPeerContainer(getBrowserView()->getGridControl(), UNO_QUERY); // check all grid columns for their control source Reference< ::com::sun::star::container::XIndexAccess > xModelColumns(getFormComponent(), UNO_QUERY); DBG_ASSERT(xModelColumns.is(), "SbaXDataBrowserController::OnSearchContextRequest : there is a grid control without columns !"); // the case 'no columns' should be indicated with an empty container, I think ... DBG_ASSERT(xModelColumns->getCount() >= xPeerContainer->getCount(), "SbaXDataBrowserController::OnSearchContextRequest : impossible : have more view than model columns !"); String sFieldList; for (sal_Int32 nViewPos=0; nViewPosgetCount(); ++nViewPos) { Reference< XInterface > xCurrentColumn(xPeerContainer->getByIndex(nViewPos),UNO_QUERY); if (!xCurrentColumn.is()) continue; // can we use this column control fo searching ? if (!IsSearchableControl(xCurrentColumn)) continue; sal_uInt16 nModelPos = getBrowserView()->View2ModelPos((sal_uInt16)nViewPos); Reference< XPropertySet > xCurrentColModel(xModelColumns->getByIndex(nModelPos),UNO_QUERY); ::rtl::OUString aName = ::comphelper::getString(xCurrentColModel->getPropertyValue(PROPERTY_CONTROLSOURCE)); sFieldList += (const sal_Unicode*)aName; sFieldList += ';'; pContext->arrFields.push_back(xCurrentColumn); } sFieldList.EraseTrailingChars(';'); pContext->xCursor.set(getRowSet(),UNO_QUERY); pContext->strUsedFields = sFieldList; // if the cursor is in a mode other than STANDARD -> reset Reference< XPropertySet > xCursorSet(pContext->xCursor, UNO_QUERY); DBG_ASSERT(xCursorSet.is() && !::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISMODIFIED)), "SbaXDataBrowserController::OnSearchContextRequest : please do not call for cursors with modified rows !"); if (xCursorSet.is() && ::comphelper::getBOOL(xCursorSet->getPropertyValue(PROPERTY_ISNEW))) { Reference< XResultSetUpdate > xUpdateCursor(pContext->xCursor, UNO_QUERY); xUpdateCursor->moveToCurrentRow(); } return pContext->arrFields.size(); } //------------------------------------------------------------------------------ IMPL_LINK(SbaXDataBrowserController, OnFoundData, FmFoundRecordInformation*, pInfo) { Reference< ::com::sun::star::sdbcx::XRowLocate > xCursor(getRowSet(), UNO_QUERY); DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnFoundData : shit happens. sometimes. but this is simply impossible !"); // move the cursor xCursor->moveToBookmark(pInfo->aPosition); // let the grid snyc it's display with the cursor Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnFoundData : no model set ?!"); Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron")); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld); // and move to the field Reference< ::com::sun::star::container::XIndexAccess > aColumnControls(getBrowserView()->getGridControl()->getPeer(), UNO_QUERY); sal_uInt16 nViewPos; for ( nViewPos = 0; nViewPos < aColumnControls->getCount(); ++nViewPos ) { Reference< XInterface > xCurrent(aColumnControls->getByIndex(nViewPos),UNO_QUERY); if (IsSearchableControl(xCurrent)) { if (pInfo->nFieldPos) --pInfo->nFieldPos; else break; } } Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); xGrid->setCurrentColumnPosition(nViewPos); return 0; } //------------------------------------------------------------------------------ IMPL_LINK(SbaXDataBrowserController, OnCanceledNotFound, FmFoundRecordInformation*, pInfo) { Reference< ::com::sun::star::sdbcx::XRowLocate > xCursor(getRowSet(), UNO_QUERY); try { DBG_ASSERT(xCursor.is(), "SbaXDataBrowserController::OnCanceledNotFound : shit happens. sometimes. but this is simply impossible !"); // move the cursor xCursor->moveToBookmark(pInfo->aPosition); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } try { // let the grid snyc it's display with the cursor Reference< XPropertySet > xModelSet(getControlModel(), UNO_QUERY); DBG_ASSERT(xModelSet.is(), "SbaXDataBrowserController::OnCanceledNotFound : no model set ?!"); Any aOld = xModelSet->getPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron")); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), ::comphelper::makeBoolAny(sal_Bool(sal_True))); xModelSet->setPropertyValue(::rtl::OUString::createFromAscii("DisplayIsSynchron"), aOld); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return 0L; } //------------------------------------------------------------------------------ IMPL_LINK(SbaXDataBrowserController, OnAsyncGetCellFocus, void*, EMPTYARG) { SbaGridControl* pVclGrid = getBrowserView() ? getBrowserView()->getVclControl() : NULL; // if we have a controller, but the window for the controller doesn't have the focus, we correct this if(pVclGrid) { if (!pVclGrid->IsEditing()) return 0L; if (pVclGrid->HasChildPathFocus()) pVclGrid->Controller()->GetWindow().GrabFocus(); } return 0L; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::criticalFail() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::criticalFail" ); InvalidateAll(); m_nRowSetPrivileges = 0; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::LoadFinished(sal_Bool /*bWasSynch*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::LoadFinished" ); m_nRowSetPrivileges = 0; if (isValid() && !loadingCancelled()) { // obtain cached values try { Reference< XPropertySet > xFormProps( m_xLoadable, UNO_QUERY_THROW ); OSL_VERIFY( xFormProps->getPropertyValue( PROPERTY_PRIVILEGES ) >>= m_nRowSetPrivileges ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } // -------------------------------- // switch the control to alive mode getBrowserView()->getGridControl()->setDesignMode(sal_False); // ------------------------------- initializeParser(); // ------------------------------- InvalidateAll(); m_aAsyncGetCellFocus.Call(); } } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::initializeParser() const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::initializeParser" ); if ( !m_xParser.is() ) { // ---------------------------------------------- // create a parser (needed for filtering/sorting) try { const Reference< XPropertySet > xFormSet(getRowSet(), UNO_QUERY); if (::comphelper::getBOOL(xFormSet->getPropertyValue(PROPERTY_ESCAPE_PROCESSING))) { // (only if the statement isn't native) // (it is allowed to use the PROPERTY_ISPASSTHROUGH : _after_ loading a form it is valid) xFormSet->getPropertyValue(PROPERTY_SINGLESELECTQUERYCOMPOSER) >>= m_xParser; } } catch(Exception&) { DBG_UNHANDLED_EXCEPTION(); m_xParser = NULL; // no further handling, we ignore the error } } } //------------------------------------------------------------------------------ void SbaXDataBrowserController::loaded(const EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::loaded" ); // not interested in // we're loading within an separate thread and have a handling for it's "finished event" } //------------------------------------------------------------------------------ void SbaXDataBrowserController::unloading(const EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloading" ); // not interested in } //------------------------------------------------------------------------------ void SbaXDataBrowserController::unloaded(const EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::unloaded" ); m_xParser.clear(); InvalidateAll(); // do this asynchron, there are other listeners reacting on this message ... // (it's a little hack : the grid columns are listening to this event, too, and their bound field may // change as a reaction on that event. as we have no chance to be notified of this change (which is // the one we're interested in) we give them time to do what they want to before invalidating our // bound-field-dependent slots .... } //------------------------------------------------------------------------------ void SbaXDataBrowserController::reloading(const EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloading" ); // not interested in } //------------------------------------------------------------------------------ void SbaXDataBrowserController::reloaded(const EventObject& /*aEvent*/) throw( RuntimeException ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::reloaded" ); InvalidateAll(); // do this asynchronously, there are other listeners reacting on this message ... // (it's a little hack : the grid columns are listening to this event, too, and their bound field may // change as a reaction on that event. as we have no chance to be notified of this change (which is // the one we're interested in) we give them time to do what they want to before invalidating our // bound-field-dependent slots .... } //------------------------------------------------------------------------------ void SbaXDataBrowserController::enterFormAction() { if ( !m_nFormActionNestingLevel ) // first action -> reset m_aCurrentError.clear(); ++m_nFormActionNestingLevel; } //------------------------------------------------------------------------------ void SbaXDataBrowserController::leaveFormAction() { DBG_ASSERT( m_nFormActionNestingLevel > 0, "SbaXDataBrowserController::leaveFormAction : invalid call !" ); if ( --m_nFormActionNestingLevel > 0 ) return; if ( !m_aCurrentError.isValid() ) return; m_aAsyncDisplayError.Call(); } // ------------------------------------------------------------------------- sal_Bool SbaXDataBrowserController::isLoaded() const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isLoaded" ); return m_xLoadable.is() && m_xLoadable->isLoaded(); } // ------------------------------------------------------------------------- sal_Bool SbaXDataBrowserController::isValidCursor() const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::isValidCursor" ); if (!m_xColumnsSupplier.is()) return sal_False; Reference< ::com::sun::star::container::XNameAccess > xCols = m_xColumnsSupplier->getColumns(); if (!xCols.is() || !xCols->hasElements()) return sal_False; sal_Bool bIsValid = !(m_xRowSet->isBeforeFirst() || m_xRowSet->isAfterLast()); if ( !bIsValid ) { Reference xProp(m_xRowSet,UNO_QUERY); bIsValid = ::cppu::any2bool(xProp->getPropertyValue(PROPERTY_ISNEW)); if ( !bIsValid ) { bIsValid = m_xParser.is(); } } // if ( !bIsValid ) return bIsValid; } //================================================================== // LoadFormHelper //================================================================== class LoadFormHelper :public ::cppu::WeakImplHelper2< ::com::sun::star::form::XLoadListener, XRowSetListener> { enum STATE { STARTED, LOADED, POSITIONED, DISPOSED }; STATE m_eState; Reference< XRowSet > m_xForm; ::osl::Mutex m_aAccessSafety; public: LoadFormHelper(const Reference< XRowSet > & _rxForm); // ::com::sun::star::form::XLoadListener virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( RuntimeException ); // XRowSetListener virtual void SAL_CALL cursorMoved(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); virtual void SAL_CALL rowChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); virtual void SAL_CALL rowSetChanged(const ::com::sun::star::lang::EventObject& event) throw( RuntimeException ); // ::com::sun::star::lang::XEventListener virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( RuntimeException ); bool WaitUntilReallyLoaded(bool _bOnlyIfLoaded); // waits 'til the first positioned event after the loaded event. returns true if successfull, // false if the form was disposed or unloaded before or while waiting // if _bOnlyIfLoaded is false and the form isn't loaded already loaded, false will be returned // (without any wating) void cancel(); protected: ~LoadFormHelper(); void implDispose(); }; DBG_NAME(LoadFormHelper) //------------------------------------------------------------------------------ LoadFormHelper::LoadFormHelper(const Reference< XRowSet > & _rxForm) :m_eState(STARTED) ,m_xForm(_rxForm) { DBG_CTOR(LoadFormHelper,NULL); Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->addLoadListener(this); m_xForm->addRowSetListener(this); } //------------------------------------------------------------------------------ LoadFormHelper::~LoadFormHelper() { ::osl::MutexGuard aGuard(m_aAccessSafety); implDispose(); DBG_DTOR(LoadFormHelper,NULL); } //------------------------------------------------------------------------------ void LoadFormHelper::implDispose() { if (DISPOSED != m_eState) { Reference< ::com::sun::star::form::XLoadable > (m_xForm, UNO_QUERY)->removeLoadListener(this); m_xForm->removeRowSetListener(this); m_xForm = NULL; m_eState = DISPOSED; } } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::loaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { ::osl::MutexGuard aGuard(m_aAccessSafety); DBG_ASSERT(m_eState == STARTED || m_eState == DISPOSED, "LoadFormHelper::loaded : wrong call !"); if (m_eState == STARTED) m_eState = LOADED; } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::unloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { ::osl::MutexGuard aGuard(m_aAccessSafety); DBG_ERROR("LoadFormHelper::unloaded : shouldn't be called !"); implDispose(); } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::unloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::reloading(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::reloaded(const ::com::sun::star::lang::EventObject& /*aEvent*/) throw( RuntimeException ) { } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::cursorMoved(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) { ::osl::MutexGuard aGuard(m_aAccessSafety); if (m_eState == LOADED) m_eState = POSITIONED; } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::rowChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) { } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::rowSetChanged(const ::com::sun::star::lang::EventObject& /*event*/) throw( RuntimeException ) { } //------------------------------------------------------------------------------ void SAL_CALL LoadFormHelper::disposing(const ::com::sun::star::lang::EventObject& /*Source*/) throw( RuntimeException ) { ::osl::MutexGuard aGuard(m_aAccessSafety); implDispose(); } //------------------------------------------------------------------------------ void LoadFormHelper::cancel() { implDispose(); } //------------------------------------------------------------------------------ bool LoadFormHelper::WaitUntilReallyLoaded(bool _bOnlyIfLoaded) { ::osl::ResettableMutexGuard aGuard( m_aAccessSafety ); if (DISPOSED == m_eState) return false; if (_bOnlyIfLoaded && (STARTED == m_eState)) // we did't get a "loaded" event .... return false; sal_Bool bDone = (POSITIONED == m_eState); aGuard.clear(); while (!bDone) { aGuard.reset(); bDone = (POSITIONED == m_eState); aGuard.clear(); } aGuard.reset(); implDispose(); return true; } // ----------------------------------------------------------------------------- sal_Int16 SbaXDataBrowserController::getCurrentColumnPosition() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::getCurrentColumnPosition" ); Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); sal_Int16 nViewPos = -1; try { if ( xGrid.is() ) nViewPos = xGrid->getCurrentColumnPosition(); } catch(Exception&) {} return nViewPos; } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::setCurrentColumnPosition( sal_Int16 _nPos ) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::setCurrentColumnPosition" ); Reference< ::com::sun::star::form::XGrid > xGrid(getBrowserView()->getGridControl(), UNO_QUERY); try { if ( -1 != _nPos ) xGrid->setCurrentColumnPosition(_nPos); } catch(Exception&) {} } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::BeforeDrop() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::BeforeDrop" ); Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); if (xFormError.is()) xFormError->removeSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::AfterDrop() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::AfterDrop" ); Reference< ::com::sun::star::sdb::XSQLErrorBroadcaster > xFormError(getRowSet(), UNO_QUERY); if (xFormError.is()) xFormError->addSQLErrorListener((::com::sun::star::sdb::XSQLErrorListener*)this); } // ----------------------------------------------------------------------------- void SbaXDataBrowserController::addColumnListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::addColumnListeners" ); // ... all the grid columns Reference< ::com::sun::star::container::XIndexContainer > xColumns(_xGridControlModel, UNO_QUERY); if (xColumns.is()) { sal_Int32 nCount = xColumns->getCount(); for (sal_uInt16 i=0; i < nCount; ++i) { Reference< XPropertySet > xCol(xColumns->getByIndex(i),UNO_QUERY); AddColumnListener(xCol); } } } // ----------------------------------------------------------------------------- sal_Bool SbaXDataBrowserController::InitializeGridModel(const Reference< ::com::sun::star::form::XFormComponent > & /*xGrid*/) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaui", "Ocke.Janssen@sun.com", "SbaXDataBrowserController::InitializeGridModel" ); return sal_True; } //.................................................................. } // namespace dbaui //..................................................................