summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2004-04-13 10:04:12 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2004-04-13 10:04:12 +0000
commit03f2b938c2eb631778dcfc557ff000c98f85be3c (patch)
treec46ede80e1aa34af46528340542dbef6a751af0a
parentc2e154b46f7ac720d0ea25dc0f1deb63ffcc1af2 (diff)
INTEGRATION: CWS frmcontrols02 (1.1.2); FILE ADDED
2004/01/22 10:04:53 fs 1.1.2.1: helper class for form controller related functionality
-rw-r--r--svx/source/inc/formcontrolling.hxx550
1 files changed, 550 insertions, 0 deletions
diff --git a/svx/source/inc/formcontrolling.hxx b/svx/source/inc/formcontrolling.hxx
new file mode 100644
index 000000000000..338900d18c7e
--- /dev/null
+++ b/svx/source/inc/formcontrolling.hxx
@@ -0,0 +1,550 @@
+/*************************************************************************
+ *
+ * $RCSfile: formcontrolling.hxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: hr $ $Date: 2004-04-13 11:04:12 $
+ *
+ * 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 EXPRESS 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 SVX_FORMCONTROLLING_HXX
+#define SVX_FORMCONTROLLING_HXX
+
+#ifndef _COM_SUN_STAR_FORM_XFORMCONTROLLER_HPP_
+#include <com/sun/star/form/XFormController.hpp>
+#endif
+#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
+#include <com/sun/star/form/XForm.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XRESULTSET_HPP_
+#include <com/sun/star/sdbc/XRowSet.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XROWSETLISTENER_HPP_
+#include <com/sun/star/sdbc/XRowSetListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XRESULTSETUPDATE_HPP_
+#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
+#endif
+#ifndef _COM_SUN_STAR_FORM_XLOADABLE_HPP_
+#include <com/sun/star/form/XLoadable.hpp>
+#endif
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDB_XSQLQUERYCOMPOSER_HPP_
+#include <com/sun/star/sdb/XSQLQueryComposer.hpp>
+#endif
+#ifndef _COM_SUN_STAR_UTIL_XMODIFYLISTENER_HPP_
+#include <com/sun/star/util/XModifyListener.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#endif
+
+#ifndef SVX_DBTOOLSCLIENT_HXX
+#include "dbtoolsclient.hxx"
+#endif
+
+#ifndef _CPPUHELPER_IMPLBASE3_HXX_
+#include <cppuhelper/implbase3.hxx>
+#endif
+
+//........................................................................
+namespace svx
+{
+//........................................................................
+
+ //====================================================================
+ //= FeatureSlotTranslation
+ //====================================================================
+ class FeatureSlotTranslation
+ {
+ public:
+ /// retrieves the feature id for a given feature URL
+ static sal_Int32 getControllerFeatureIdForURL( const ::rtl::OUString& _rMainURL );
+
+ /// retrieves the feature URL for a given feature id
+ static ::rtl::OUString getControllerFeatureURLForId( sal_Int32 _nId );
+
+ // determines whether the given URL is a controller feature URL
+ static sal_Bool isFeatureURL( const ::rtl::OUString& _rMainURL );
+ };
+
+ //====================================================================
+ //= IControllerFeatureInvalidation
+ //====================================================================
+ class IControllerFeatureInvalidation
+ {
+ public:
+ /** invalidates the given features
+
+ Invalidation means that any user interface representation (such as toolbox buttons), or
+ any dispatches associated with the features in question are potentially out-of-date, and
+ need to be updated
+
+ @param _rFeatures
+ Ids of the features to be invalidated.
+ */
+ virtual void invalidateFeatures( const ::std::vector< sal_Int32 >& _rFeatures ) = 0;
+ };
+
+ //====================================================================
+ //= ControllerFeatures
+ //====================================================================
+ class FormControllerHelper;
+ /** easier access to an FormControllerHelper instance
+ */
+ class ControllerFeatures
+ {
+ protected:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+ IControllerFeatureInvalidation* m_pInvalidationCallback; // necessary as long as m_pImpl is not yet constructed
+ FormControllerHelper* m_pImpl;
+
+ public:
+ /** standard ctor
+
+ The instance is not functional until <method>assign</method> is used.
+
+ @param _rxORB
+ a multi service factory for creating various needed components
+
+ @param _pInvalidationCallback
+ the callback for invalidating feature states
+ */
+ ControllerFeatures(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ IControllerFeatureInvalidation* _pInvalidationCallback
+ );
+
+ /** constructs the instance from a <type scope="com::sun::star::form">XFormController<type> instance
+
+ @param _rxORB
+ a multi service factory for creating various needed components
+
+ @param _rxController
+ The form controller which the helper should be responsible for. Must not
+ be <NULL/>, and must have a valid model (form).
+
+ @param _pInvalidationCallback
+ the callback for invalidating feature states
+ */
+ ControllerFeatures(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController,
+ IControllerFeatureInvalidation* _pInvalidationCallback
+ );
+
+ /** constructs the helper form a <type scope="com::sun::star::form">XForm<type> instance
+
+ Any functionality which depends on a controller will not be available.
+
+ @param _rxORB
+ a multi service factory for creating various needed components
+
+ @param _rxForm
+ The form which the helper should be responsible for. Must not be <NULL/>.
+
+ @param _pInvalidationCallback
+ the callback for invalidating feature states
+ */
+ ControllerFeatures(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm,
+ IControllerFeatureInvalidation* _pInvalidationCallback
+ );
+
+ /// dtor
+ ~ControllerFeatures();
+
+ /// checks whether the instance is properly assigned to a form and/or controller
+ inline bool isAssigned( ) const { return m_pImpl != NULL; }
+
+ /** assign to a controller
+ */
+ void assign(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController
+ );
+
+ /** assign to a controller
+ */
+ void assign(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm
+ );
+
+ /// clears the instance so that it cannot be used afterwards
+ void dispose();
+
+ // access to the instance which implements the functionality. Not to be used when not assigned
+ inline const FormControllerHelper* operator->() const { return m_pImpl; }
+ inline FormControllerHelper* operator->() { return m_pImpl; }
+ inline const FormControllerHelper& operator*() const { return *m_pImpl; }
+ inline FormControllerHelper& operator*() { return *m_pImpl; }
+ };
+
+ //====================================================================
+ //= ControllerFeatureState
+ //====================================================================
+ struct ControllerFeatureState
+ {
+ sal_Bool bEnabled;
+ ::com::sun::star::uno::Any aState;
+
+ inline ControllerFeatureState() : bEnabled( sal_False ) { }
+ };
+
+ //====================================================================
+ //= FormControllerHelper
+ //====================================================================
+ typedef ::cppu::WeakImplHelper3 < ::com::sun::star::beans::XPropertyChangeListener
+ , ::com::sun::star::util::XModifyListener
+ , ::com::sun::star::sdbc::XRowSetListener
+ > FormControllerHelper_Base;
+
+ /** is a helper class which manages form controller functionality (such as moveNext etc.).
+
+ <p>The class helps implementing form controller functionality, by providing
+ methods to determine the state of, and execute, various common form features.<br/>
+ A <em>feature</em> is for instance moving the form associated with the controller
+ to a certain position, or reloading the form, and so on.</p>
+ */
+ class FormControllerHelper : public FormControllerHelper_Base
+ {
+ protected:
+ mutable
+ ::osl::Mutex m_aMutex;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+ ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >
+ m_xController;
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >
+ m_xCursor;
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetUpdate >
+ m_xUpdateCursor;
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+ m_xCursorProperties;
+ ::com::sun::star::uno::Reference< ::com::sun::star::form::XLoadable >
+ m_xLoadableForm;
+
+ mutable
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSQLQueryComposer >
+ m_xParser;
+
+ sal_Bool m_bInitializedParser : 1;
+ sal_Bool m_bActiveControlModified : 1;
+
+ ::svxform::OStaticDataAccessTools*
+ m_pDbTools;
+ IControllerFeatureInvalidation*
+ m_pInvalidationCallback;
+
+ public:
+ /** constructs the helper from a <type scope="com::sun::star::form">XFormController<type> instance
+
+ @param _rxORB
+ a multi service factory for creating various needed components
+ @param _rxController
+ The form controller which the helper should be responsible for. Must not
+ be <NULL/>, and must have a valid model (form).
+ @param _pInvalidationCallback
+ the callback for invalidating feature states
+ */
+ FormControllerHelper(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController,
+ IControllerFeatureInvalidation* _pInvalidationCallback
+ );
+
+ /** constructs the helper form a <type scope="com::sun::star::form">XForm<type> instance
+
+ Any functionality which depends on a controller will not be available.
+
+ @param _rxORB
+ a multi service factory for creating various needed components
+ @param _rxForm
+ The form which the helper should be responsible for. Must not be <NULL/>.
+ @param _pInvalidationCallback
+ the callback for invalidating feature states
+ */
+ FormControllerHelper(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm,
+ IControllerFeatureInvalidation* _pInvalidationCallback
+ );
+
+ // attribute access
+ inline const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >&
+ getCursor() const { return m_xCursor; }
+ inline const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetUpdate >&
+ getUpdateCursor() const { return m_xUpdateCursor; }
+
+ /** gets the state of a given feature
+ @param _nFeatureId
+ the id of the feature in question. Must be one of the SID_FM_* slots
+ @param _rState
+ is the output parameter for the state
+ */
+ void getState(
+ sal_Int32 _nFeatureId,
+ ControllerFeatureState& /* [out] */ _rState
+ ) const;
+
+ /** gets the state of a given feature, caring only whether or not
+ it's enabled
+ @param _nFeatureId
+ the id of the feature in question. Must be one of the SID_FM_* slots
+ */
+ sal_Bool getSimpleState( sal_Int32 _nFeatureId ) const;
+
+ /** determines whether our cursor can be moved right
+ @precond hasCursor()
+ */
+ sal_Bool canMoveRight( ) const;
+
+ /** determines whether our cursor can be moved left
+ @precond hasCursor()
+ */
+ sal_Bool canMoveLeft( ) const;
+
+ /** executes the given feature
+ */
+ void execute( sal_Int32 _nFeatureId ) const;
+
+ /** executes the given feature, carign for a named parameter for the execution
+ */
+ void execute( sal_Int32 _nFeatureId, const ::rtl::OUString& _rParamName,
+ const ::com::sun::star::uno::Any& _rParamValue ) const;
+
+ /** moves our cursor one position to the left, caring for different possible
+ cursor states.
+
+ <p>Before the movement is done, the current row is saved, if necessary.</p>
+
+ @precond
+ canMoveLeft()
+ */
+ sal_Bool moveLeft( ) const;
+
+ /** moves our cursor one position to the right, caring for different possible
+ cursor states.
+
+ <p>Before the movement is done, the current row is saved, if necessary.</p>
+
+ @precond
+ canMoveRight()
+ */
+ sal_Bool moveRight( ) const;
+
+ /** commits the current record of our form if necessary
+
+ @precond
+ hasCursor()
+ @param _pRecordInserted
+ f not <NULL/>, the boolean pointed to by this arg will be <TRUE/> if and only
+ if a new record has been inserted.
+ */
+ sal_Bool commitCurrentRecord( sal_Bool* _pRecordInserted = NULL ) const;
+
+ /** commits the current control of our controller
+ @precond
+ we have a valid controller
+ */
+ sal_Bool commitCurrentControl( ) const;
+
+ // retrieving various information about the curren record
+ sal_Bool isNewRecord() const;
+ sal_Bool isModifiedRecord() const;
+ sal_Int32 getRecordCount() const;
+ sal_Bool isRecordCountFinal() const;
+ sal_Bool isInsertOnlyForm() const;
+
+ /// determines whether we can parse the query of our form
+ sal_Bool isParsable() const;
+
+ /** resets all control models in the given form
+ */
+ static void resetAllControls( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& _rxForm );
+
+ /** disposes this instance.
+
+ After this method has been called, the instance is not functional anymore
+ */
+ void dispose();
+
+ protected:
+ /// dtor
+ ~FormControllerHelper();
+
+ // XRowSetListener
+ virtual void SAL_CALL cursorMoved( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL rowChanged( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL rowSetChanged( const ::com::sun::star::lang::EventObject& event ) throw (::com::sun::star::uno::RuntimeException);
+
+ // XModifyListener
+ virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& _rSource ) throw( ::com::sun::star::uno::RuntimeException );
+
+ // XPropertyChangeListener
+ virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) 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);
+
+ private:
+ /** resets all control models in our own form
+ */
+ void resetAllControls( ) const;
+
+ /** initializes the cursor-related members
+ <p>Only to be called from within a constructor.</p>
+ */
+ void initCursor(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxForm
+ );
+
+ /** initializes the controller-related members
+ <p>Only to be called from within a constructor.</p>
+ */
+ void initController(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController >& _rxController
+ );
+
+ /** retrieces the column to which the current control of our controller is bound
+ @precond
+ m_xController.is()
+ */
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+ getCurrentBoundField( ) const;
+
+ /** determines if we have a valid cursor, including the property set and the XLoadable
+ interface
+ */
+ inline sal_Bool hasCursor() const { return m_xCursorProperties.is(); }
+
+ /** determines if we have a filter in place
+ */
+ sal_Bool hasFilterOrOrder() const;
+
+ /// ensures that our parse is initialized, or at least that we attempted to do so
+ void ensureInitializedParser();
+
+ /** disposes our parser, if we have one
+ */
+ void disposeParser();
+
+ /** executes the "auto sort ascending" and "auto sort descending" features
+ */
+ void executeAutoSort( sal_Bool _bUp ) const;
+
+ /** executes the "auto filter" feature
+ */
+ void executeAutoFilter( ) const;
+
+ /** executes the "sort..." feature
+ */
+ void executeFilterOrSort( bool _bFilter ) const;
+
+ /// typedef for member method of this class
+ typedef void (FormControllerHelper::*Action)( const void* ) const;
+
+ /** calls a member function, with reporting an error - in case it happens - to the user
+
+ @param _pAction
+ the member function to call
+ @param _pParam
+ the parameters to pass to the member function
+ @param _nErrorResourceId
+ the id of the resources string to use as error message
+ @return
+ <TRUE/> if and only if the call was successfull (i.e. no error occured)
+ */
+ sal_Bool doActionReportError( Action _pAction, const void* _pParam, sal_uInt16 _nErrorResourceId ) const;
+
+ // parameter structure for appendOrderByColumn
+ struct param_appendOrderByColumn
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+ xField;
+ sal_Bool bUp;
+ };
+ void appendOrderByColumn( const void* _pActionParam ) const;
+
+ // parameter structure for appendFilterByColumn
+ struct param_appendFilterByColumn
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+ xField;
+ };
+ void appendFilterByColumn( const void* _pActionParam ) const;
+
+ /// invalidate the full palette of features which we know
+ void invalidateAllSupportedFeatures( ::osl::ClearableMutexGuard& _rClearForCallback ) const;
+ /** invalidate the features which depend on the "modified" state of the current control
+ of our controller
+ */
+ void invalidateModifyDependentFeatures( ::osl::ClearableMutexGuard& _rClearForCallback ) const;
+
+ private:
+ FormControllerHelper(); // never implemented
+ FormControllerHelper( const FormControllerHelper& ); // never implemented
+ FormControllerHelper& operator=( const FormControllerHelper& ); // never implemented
+ };
+
+//........................................................................
+} // namespace svx
+//........................................................................
+
+#endif // SVX_FORMCONTROLLING_HXX