office-gobmx/dbaccess/source/ui/inc/brwctrlr.hxx
2000-11-03 13:46:21 +00:00

612 lines
35 KiB
C++

/*************************************************************************
*
* $RCSfile: brwctrlr.hxx,v $
*
* $Revision: 1.2 $
*
* last change: $Author: oj $ $Date: 2000-11-03 14:44:55 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef _SBA_BWRCTRLR_HXX
#define _SBA_BWRCTRLR_HXX
#ifndef _SBX_BRWVIEW_HXX
#include "brwview.hxx"
#endif
#ifndef _SBA_GRID_HXX
#include "sbagrid.hxx"
#endif
#ifndef _COM_SUN_STAR_SDBC_XSQLERRORLISTENER_HPP_
#include <com/sun/star/sdb/XSQLErrorListener.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROWSET_HPP_
#include <com/sun/star/sdbc/XRowSet.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XRESETLISTENER_HPP_
#include <com/sun/star/form/XResetListener.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XURLTRANSFORMER_HPP_
#include <com/sun/star/util/XURLTransformer.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
#include <com/sun/star/frame/XController.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XFRAMEACTIONLISTENER_HPP_
#include <com/sun/star/frame/XFrameActionListener.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XDATABASEPARAMETERLISTENER_HPP_
#include <com/sun/star/form/XDatabaseParameterListener.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XCONFIRMDELETELISTENER_HPP_
#include <com/sun/star/form/XConfirmDeleteListener.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMCOMPONENT_HPP_
#include <com/sun/star/form/XFormComponent.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_
#include <com/sun/star/lang/XInitialization.hpp>
#endif
#ifndef _SV_TIMER_HXX //autogen
#include <vcl/timer.hxx>
#endif
#ifndef _OSL_MUTEX_HXX_ //autogen
#include <osl/mutex.hxx>
#endif
#ifndef _VOS_THREAD_HXX_ //autogen
#include <vos/thread.hxx>
#endif
#ifndef _SFXCANCEL_HXX //autogen
#include <svtools/cancel.hxx>
#endif
#ifndef _CPPUHELPER_IMPLBASE12_HXX_
#include <cppuhelper/implbase12.hxx>
#endif
#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx>
#endif
#ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_
#include <comphelper/proparrhlp.hxx>
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
#include <com/sun/star/lang/XServiceInfo.hpp>
#endif
#ifndef _COMPHELPER_PROPERTYCONTAINER_HXX_
#include <comphelper/propertycontainer.hxx>
#endif
class ToolBox;
class ResMgr;
struct FmFoundRecordInformation;
struct FmSearchContext;
namespace dbaui
{
// =========================================================================
// a helper for multi-threaded handling of async events
// -------------------------------------------------------------------------
/** handles asynchronous links which may be called in multi-threaded environments
If you use an instance of this class as member of your own class, it will handle
several crucial points for you (for instance the case that somebody posts the
event while another thread tries to delete this event in the _destructor_ of the
class).
*/
class OAsyncronousLink
{
Link m_aHandler;
protected:
NAMESPACE_VOS(OMutex)* m_pEventSafety;
NAMESPACE_VOS(OMutex)* m_pDestructionSafety;
BOOL m_bOwnMutexes;
ULONG m_nEventId;
public:
/** constructs the object
@param _rHandler The link to be called asyncronously
@param _pEventSafety A pointer to a mutex to be used for event safety. See below.
@param _pDestructionSafety A pointer to a mutex to be used for destruction safety. See below.
For a really safe behaviour two mutexes are required. In case your class needs more than one
OAsyncronousLink instance, you may want to share these mutexes (and hold them as members of
your class). Thus, if _pEventSafety and _pDestructionSafety are both non-NULL, they will be
used for the thread-safety of the link. Otherwise the instance will create it's own mutexes.
<BR>
If you use this "mutex feature" be aware of the lifetime of all involved objects : the mutexes
you specify upon construction should live (at least) as long as the OAsyncronousLink object does.
*/
OAsyncronousLink(const Link& _rHandler, NAMESPACE_VOS(OMutex)* _pEventSafety = NULL, NAMESPACE_VOS(OMutex)* _pDestructionSafety = NULL);
virtual ~OAsyncronousLink();
void Call(void* _pArgument = NULL);
void CancelCall();
protected:
DECL_LINK(OnAsyncCall, void*);
};
// a smaller version of the FeatureEvent to be broadcasted by an ::com::sun::star::frame::XController
// -------------------------------------------------------------------------
struct FeatureState
{
::com::sun::star::uno::Any aState;
sal_Bool bEnabled;
sal_Bool bRequery;
FeatureState() : bEnabled(sal_False), bRequery(sal_False) { }
};
// =========================================================================
typedef ::cppu::WeakImplHelper12< ::com::sun::star::frame::XController
, ::com::sun::star::frame::XDispatch
, ::com::sun::star::frame::XDispatchProviderInterceptor
, ::com::sun::star::beans::XPropertyChangeListener
, ::com::sun::star::util::XModifyListener
, ::com::sun::star::container::XContainerListener
, ::com::sun::star::frame::XFrameActionListener
, ::com::sun::star::sdb::XSQLErrorListener
, ::com::sun::star::form::XDatabaseParameterListener
, ::com::sun::star::form::XConfirmDeleteListener
, ::com::sun::star::form::XLoadListener
, ::com::sun::star::form::XResetListener > SbaXDataBrowserController_Base;
typedef ::cppu::ImplHelper2< ::com::sun::star::lang::XInitialization
,::com::sun::star::lang::XServiceInfo > SbaXDataBrowserController_Base2;
class SbaXDataBrowserController
:public SbaXDataBrowserController_Base
,public ::comphelper::OPropertyContainer
,public SbaGridListener
,public ::comphelper::OPropertyArrayUsageHelper < SbaXDataBrowserController>
,public dbaui::OModuleClient
,public SbaXDataBrowserController_Base2
{
// ==========
// attributes
private:
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > m_xRowSet; // our rowset
::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > m_xGridModel; // the model of our grid
::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > m_xFormatter; // a number formatter working with the connection's NumberFormatsSupplier
::osl::Mutex m_aAsyncLoadSafety; // for multi-thread access to our members
UnoDataBrowserView* m_pContent; // our (VCL) "main window"
// members for asynchronous load operations
::vos::OThread* m_pLoadThread; // the thread wherein the form is loaded
sal_uInt32 m_nPendingLoadFinished; // the event used to tell ourself that the load is finished
sal_Bool m_bClosingKillOpen; // are we killing the load thread because we are to be suspended ?
OAsyncronousLink m_aAsynClose;
OAsyncronousLink m_aAsyncGetCellFocus;
OAsyncronousLink m_aAsyncInvalidateAll;
::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLQueryComposer > m_xParser; // for sorting 'n filtering
::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > m_xSlaveDispatcher; // for intercepting dispatches of the grid control
::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > m_xMasterDispatcher; // dito
// ------------------
struct DispatchTarget
{
::com::sun::star::util::URL aURL;
::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > xListener;
DispatchTarget() { }
DispatchTarget(const ::com::sun::star::util::URL& rURL, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > xRef) : aURL(rURL), xListener(xRef) { }
};
// all our listeners where we dispatch status changes
DECLARE_STL_VECTOR(DispatchTarget,Dispatch);
Dispatch m_arrStatusListener;
String m_sStateSaveRecord;
String m_sStateUndoRecord;
sal_uInt16 m_nFormActionNestingLevel; // see enter-/leaveFormAction
bool m_bErrorOccured; // dito
::cppu::OBroadcastHelper m_aPropertyBroadcastHelper;
protected:
DECLARE_STL_MAP(::rtl::OUString,sal_Int32, comphelper::UStringMixEqual, SupportedFeatures);
SupportedFeatures m_aSupportedFeatures;
::osl::Mutex m_aPropertyMutex;
::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > m_xCurrentFrame; // the frame we're residing in
::cppu::OInterfaceContainerHelper m_aDisposeListeners; // clear enough
sal_Bool m_bCurrentlyModified : 1;
// the RecordStatus of the form is insufficient for deciding whether the current record is modified
// because it doesn't reflect the state of the current cell
sal_Bool m_bLoadCanceled : 1; // the load was canceled somehow
sal_Bool m_bFrameUiActive : 1; // updated in ::frameAction
sal_Bool m_bSuspending : 1; // we're within suspend
String m_sLoadStopperCaption;
// If the data source is loaded asynchronously a stopper is created (which will result in activation of
// the office's red button). This string is used as caption for the stopper.
AutoTimer m_aInvalidateClipboard; // for testing the state of the CUT/COPY/PASTE-slots
::com::sun::star::uno::Reference< ::com::sun::star::util::XURLTransformer > m_xUrlTransformer; // needed sometimes
DECLARE_STL_MAP(sal_uInt16,FeatureState,::std::less<sal_uInt16> ,StateCache);
StateCache m_aStateCache;
::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xMultiServiceFacatory;
class FormErrorHelper
{
SbaXDataBrowserController* m_pOwner;
public:
FormErrorHelper(SbaXDataBrowserController* pOwner) : m_pOwner(pOwner) { m_pOwner->enterFormAction(); }
virtual ~FormErrorHelper() { m_pOwner->leaveFormAction(); }
};
friend class FormErrorHelper;
// ================
// attribute access
public:
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > getRowSet() const { return m_xRowSet; }
::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > getFormComponent() const { return m_xGridModel; }
::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > getControlModel() const { return ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > (m_xGridModel, ::com::sun::star::uno::UNO_QUERY); }
::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > getNumberFormatter()const { return m_xFormatter; }
sal_Bool isValid() const { return m_xRowSet.is() && m_xGridModel.is(); }
sal_Bool isValidCursor() const; // checks the ::com::sun::star::data::XDatabaseCursor-interface of m_xRowSet
UnoDataBrowserView* getContent() const { return m_pContent; }
protected:
::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLQueryComposer > getParser() const { return m_xParser; }
// OPropertyArrayUsageHelper
virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
// OPropertySetHelper
virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper();
public:
SbaXDataBrowserController(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM);
// late construction
virtual sal_Bool Construct(Window* pParent);
// UNO
virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException);
// ::com::sun::star::lang::XEventListener
virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& Source) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::beans::XPropertyChangeListener
virtual void SAL_CALL propertyChange(const ::com::sun::star::beans::PropertyChangeEvent& evt);
// ::com::sun::star::util::XModifyListener
virtual void SAL_CALL modified(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::container::XContainerListener
virtual void SAL_CALL elementInserted(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL elementRemoved(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL elementReplaced(const ::com::sun::star::container::ContainerEvent& Event) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::frame::XController
virtual void SAL_CALL attachFrame(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & xFrame) throw( ::com::sun::star::uno::RuntimeException );
virtual sal_Bool SAL_CALL attachModel(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > & xModel) throw( ::com::sun::star::uno::RuntimeException ){ return sal_False; };
virtual sal_Bool SAL_CALL suspend(sal_Bool bSuspend) throw( ::com::sun::star::uno::RuntimeException );
virtual ::com::sun::star::uno::Any SAL_CALL getViewData(void) throw( ::com::sun::star::uno::RuntimeException ){ return ::com::sun::star::uno::Any(); };
virtual void SAL_CALL restoreViewData(const ::com::sun::star::uno::Any& Data) throw( ::com::sun::star::uno::RuntimeException ){};
virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > SAL_CALL getModel(void) throw( ::com::sun::star::uno::RuntimeException ){ return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > (); };
virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SAL_CALL getFrame(void) throw( ::com::sun::star::uno::RuntimeException ){ return m_xCurrentFrame; };
// ::com::sun::star::frame::XDispatch
virtual void SAL_CALL dispatch(const ::com::sun::star::util::URL& aURL, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& aArgs);
virtual void SAL_CALL addStatusListener(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > & aListener, const ::com::sun::star::util::URL& aURL);
virtual void SAL_CALL removeStatusListener(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > & aListener, const ::com::sun::star::util::URL& aURL);
// ::com::sun::star::frame::XDispatchProviderInterceptor
virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getSlaveDispatchProvider(void) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL setSlaveDispatchProvider(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > & _xNewProvider) throw( ::com::sun::star::uno::RuntimeException );
virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL getMasterDispatchProvider(void) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL setMasterDispatchProvider(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > & _xNewProvider) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::frame::XDispatchProvider
virtual ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > SAL_CALL queryDispatch(const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags) throw( ::com::sun::star::uno::RuntimeException );
virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL queryDispatches(const ::com::sun::star::uno::Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::lang::XComponent
virtual void SAL_CALL dispose();
virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener);
virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > & aListener);
// ::com::sun::star::frame::XFrameActionListener
virtual void SAL_CALL frameAction(const ::com::sun::star::frame::FrameActionEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::sdb::XSQLErrorListener
virtual void SAL_CALL errorOccured(const ::com::sun::star::sdb::SQLErrorEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::form::XDatabaseParameterListener
virtual sal_Bool SAL_CALL approveParameter(const ::com::sun::star::form::DatabaseParameterEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::form::XConfirmDeleteListener
virtual sal_Bool SAL_CALL confirmDelete(const ::com::sun::star::sdb::RowChangeEvent& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::form::XLoadListener
virtual void SAL_CALL loaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL unloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL unloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL reloading(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL reloaded(const ::com::sun::star::lang::EventObject& aEvent) throw( ::com::sun::star::uno::RuntimeException );
// ::com::sun::star::form::XResetListener
virtual sal_Bool SAL_CALL approveReset(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException );
virtual void SAL_CALL resetted(const ::com::sun::star::lang::EventObject& rEvent) throw( ::com::sun::star::uno::RuntimeException );
// lang::XInitialization
virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
// XServiceInfo
virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException) = 0;
virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& ServiceName) throw(::com::sun::star::uno::RuntimeException);
virtual ::comphelper::StringSequence SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException) = 0;
// XPropertySet
virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException)
{
return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
}
// SbaGridListener
virtual void RowChanged() { /* we're not interested in */ };
virtual void ColumnChanged();
virtual void SelectionChanged();
virtual void CellActivated();
virtual void CellDeactivated();
protected:
virtual ~SbaXDataBrowserController();
// --------------------
// our own overridables
virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > CreateForm();
// our default implementation simply instantiates a stardiv.one.form.component.Form service
// (probably this needs not to be overloaded, but you may return anything you want as long as it
// supports the ::com::sun::star::form::DatabaseForm service. For instance you may want to create an adapter here which
// is synchronized with a foreign ::com::sun::star::form::DatabaseForm you got elsewhere)
virtual sal_Bool InitializeForm(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > & xForm) = 0;
// called immediately after a successfull CreateForm
// do any initialization (data source etc.) here. the form should be fully functional after that.
// return sal_False if you didn't succeed (don't throw exceptions, they won't be catched)
virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > CreateGridModel();
// our default implementation simply instantiates a stardiv.one.form.component.Grid service
// you most probably don't want to override this behaviuor
virtual sal_Bool InitializeGridModel(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormComponent > & xGrid) = 0;
// called immediately after a successfull CreateGridModel
// do any initialization (data source etc.) here. the grid model should be fully functional after that.
// return sal_False if you didn't succeed (don't throw exceptions, they won't be catched)
//
// the form returned by getDataSource() is already valid so you may want to use it ...
virtual ToolBox* CreateToolBox(Window* pParent) { return NULL; }
// If you want a toolbar to be displayed at the top of the grid overload this function.
// The ToolBox returned here has to be fully initialized (you get no further chance ;)
// the default implementation of disposing distributes the events to the following disposingXXX functions
virtual void disposingGridControl(const ::com::sun::star::lang::EventObject& Source); // calls removeControlListeners
virtual void disposingGridModel(const ::com::sun::star::lang::EventObject& Source); // calls removeModelListeners
virtual void disposingFormModel(const ::com::sun::star::lang::EventObject& Source);
virtual void disposingColumnModel(const ::com::sun::star::lang::EventObject& Source);
// want to be a listener to the grid control ? use this !
virtual void addControlListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > & _xGridControl);
virtual void removeControlListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl > & _xGridControl);
// want to be a listener to the grid model ? use this !
virtual void addModelListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
virtual void removeModelListeners(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel);
// want to be a listener grid columns ? use this !
virtual void AddColumnListener(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xCol);
virtual void RemoveColumnListener(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & xCol);
// all the features which should be handled by this class
virtual void AddSupportedFeatures();
// the features have to be sorted alphabetically !
// (and please keep in mind that a _reference_ to a sequence is returned !)
// state of a feature. 'feature' may be the handle of a ::com::sun::star::util::URL somebody requested a dispatch interface for OR a toolbar slot.
virtual FeatureState GetState(sal_uInt16 nId);
// execute a feature
virtual void Execute(sal_uInt16 nId);
virtual void InvalidateFeature(const ::rtl::OUString& rURLPath, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > & xListener = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > (), sal_Bool _bForceBroadcast = sal_False);
// if xListener is NULL the change will be forwarded to all listeners to the given ::com::sun::star::util::URL
// if _bForceBroadcast is sal_True, the current feature state is broadcasted no matter if it is the same as the cached state
virtual void InvalidateFeature(sal_uInt16 nId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > & xListener = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > (), sal_Bool _bForceBroadcast = sal_False);
// if there is an ::com::sun::star::util::URL translation for the id ('handle') the preceding InvalidateFeature is used.
// if there is a toolbar slot with the given id it is updated (the new state is determined via GetState)
// if _bForceBroadcast is sal_True, the current feature state is broadcasted no matter if it is the same as the cached state
virtual void InvalidateAll(sal_Bool bAsync = sal_False);
// call after "major changes" (e.g. the completion of the async load).
// invalidates all toolbox slots and all supported features.
virtual sal_Bool LoadForm();
// load the form
// the default implementation does an direct load or starts a load thread, depending on the multithread capabilities
// of the data source.
// the default implementation also calls FormLoaded after a syncronous load, so be sure to do the same if you override
// this metod and don't call the base class' method
virtual void FormLoaded(sal_Bool bWasSynch);
// called if the loading is done (no matter if synchron or asynchron).
// --------------------
virtual void EmptyWindow();
// empty the frame where our view resides
virtual sal_Bool CommitCurrent();
// commit the current column (i.e. cell)
virtual sal_Bool SaveModified(sal_Bool bCommit = sal_True);
// save the modified record
virtual sal_uInt16 SaveData(sal_Bool bUI = sal_True, sal_Bool bForBrowsing = sal_False);
// save all data if modified, eventually ask the user
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > getBoundField(sal_uInt16 nViewPos = (sal_uInt16)-1) const;
// a PropertySet corresponding to the cursor field a column is bound to
// if nViewPos is (sal_uInt16)-1 (the default) then the field for the current column will be retrieved
sal_Bool PendingLoad() { return m_pLoadThread != NULL; }
// is there an asyncronous load operation in progress ?
void enterFormAction();
void leaveFormAction();
bool errorOccured() const { return m_bErrorOccured; }
// As many form actions don't throw an exception but call their error handler instead we don't have
// a chance to recognize errors by exception catching.
// So for error recognition the above methods may be used.
// init the formatter if form changes
void initFormatter();
private:
// invalidate features - implementation
sal_Bool ImplInvalidateTBItem(sal_uInt16 nId, const FeatureState& rState);
void ImplBroadcastFeatureState(const ::rtl::OUString& _rFeature, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XStatusListener > & xListener, sal_Bool _bIgnoreCache);
// execute the filter or sort slot
void ExecuteFilterSortCrit(sal_Bool bFilter);
// execute the search slot
void ExecuteSearch();
// click a TB slot
DECL_LINK(OnToolBoxSelected, ToolBox*);
// time to check the CUT/COPY/PASTE-slot-states
DECL_LINK(OnInvalidateClipboard, void*);
// search callbacks
DECL_LINK(OnSearchContextRequest, FmSearchContext*);
DECL_LINK(OnFoundData, FmFoundRecordInformation*);
DECL_LINK(OnCanceledNotFound, FmFoundRecordInformation*);
// callbacks for the completed loading process
DECL_LINK(OnOpenFinished, void*);
DECL_LINK(OnOpenFinishedMainThread, void*);
// OnOpenFinsihed is called in a foreign thread (the one which does the loading) so it simply posts the
// OnOpenFinishedMainThread-link (which will be called in the main thread, then) as user event.
// (the alternative would be to lock the SolarMutex in OnOpenFinished to avoid problems with the needed updates,
// but playing with this mutex seems very hazardous to me ....)
DECL_LINK(OnAsyncClose, void*);
DECL_LINK(OnAsyncGetCellFocus, void*);
DECL_LINK(OnAsyncInvalidateAll, void*);
};
//==================================================================
// LoadFormThread - a thread for asynchronously loading a form
//==================================================================
class LoadFormThread : public ::vos::OThread
{
::osl::Mutex m_aAccessSafety; // for securing the multi-thread access
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > m_xRowSet; // the data source to be loaded
Link m_aTerminationHandler; // the handler to be called upon termination
sal_Bool m_bCanceled; // StopIt has been called ?
String m_sStopperCaption; // the caption for the ThreadStopper
// a ThreadStopper will be instantiated so that the open can be canceled via the UI
class ThreadStopper : protected SfxCancellable
{
LoadFormThread* m_pOwner;
public:
ThreadStopper(LoadFormThread* pOwner, const String& rTitle);
virtual ~ThreadStopper() { }
virtual void Cancel();
virtual void OwnerTerminated();
// Normally the Owner (a LoadFormThread) would delete the stopper when terminated.
// Unfortunally the application doesn't remove the 'red light' when a SfxCancellable is deleted
// if it (the app) can't acquire the solar mutex. The deletion is IGNORED then. So we have to make
// sure that a) the stopper is deleted from inside the main thread (where the solar mutex is locked)
// and b) that in the time between the termination of the thread and the deletion of the stopper
// the latter doesn't access the former.
// The OwnerTerminated cares for both aspects.
// SO DON'T DELETE THE STOPPER EXPLICITLY !
protected:
// HACK HACK HACK HACK HACK : this should be private, but MSVC doesn't accept the LINK-macro then ....
DECL_LINK(OnDeleteInMainThread, ThreadStopper*);
};
friend class LoadFormThread::ThreadStopper;
public:
LoadFormThread(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > & _xRowSet, const String& _rStopperCaption) : m_xRowSet(_xRowSet), m_sStopperCaption(_rStopperCaption) { }
virtual void SAL_CALL run();
virtual void SAL_CALL onTerminated();
void SetTerminationHdl(const Link& aTermHdl) { m_aTerminationHandler = aTermHdl; }
// the handler will be called synchronously (the parameter is a pointer to the thread)
// if no termination handler is set, the thread disposes the data source and deletes
// itself upon termination
// cancels the process. to be called from another thread (of course ;)
void StopIt();
// ask if the load canceled
sal_Bool WasCanceled() const { return m_bCanceled; }
};
}
#endif // _SBA_BWRCTRLR_HXX