office-gobmx/svtools/inc/dialogcontrolling.hxx
Kurt Zenker 94883ebdfa INTEGRATION: CWS dba22ui (1.3.2); FILE ADDED
2006/12/05 20:45:21 fs 1.3.2.1: (small, at the moment) framework for handlign generic changes in (dialog) controls in a generic way
2006-12-13 15:28:27 +00:00

308 lines
13 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: dialogcontrolling.hxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: kz $ $Date: 2006-12-13 16:28:27 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 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
*
************************************************************************/
#ifndef SVTOOLS_DIALOGCONTROLLING_HXX
#define SVTOOLS_DIALOGCONTROLLING_HXX
#include <svtools/svtdllapi.h>
#include <tools/link.hxx>
#include <vcl/button.hxx>
#include <vector>
#include <boost/shared_ptr.hpp>
//........................................................................
namespace svt
{
//........................................................................
//=====================================================================
//= IWindowOperator
//=====================================================================
/** an abstract interface for operating on a ->Window
*/
class SVT_DLLPUBLIC SAL_NO_VTABLE IWindowOperator
{
public:
virtual void operateOn( Window& _rOperateOn ) const = 0;
virtual ~IWindowOperator();
};
typedef ::boost::shared_ptr< IWindowOperator > PWindowOperator;
//=====================================================================
//= IWindowEventFilter
//=====================================================================
/** an abstract interface for deciding whether a ->VclSimpleEvent
is worth paying attention to
*/
class SVT_DLLPUBLIC SAL_NO_VTABLE IWindowEventFilter
{
public:
virtual bool payAttentionTo( const VclSimpleEvent& _rEvent ) const = 0;
virtual ~IWindowEventFilter();
};
typedef ::boost::shared_ptr< IWindowEventFilter > PWindowEventFilter;
//=====================================================================
//= DialogController
//=====================================================================
struct DialogController_Data;
/** a class controlling interactions between dialog controls
An instance of this class listens to all events fired by a certain
->Control (more precise, a ->Window), the so-called instigator.
Additionally, the ->DialogController maintains a list of windows which
are affected by changes in the instigator window. Let's call those the
dependent windows.
Now, by help of an owner-provided ->IWindowEventFilter, the ->DialogController
decides which events are worth attention. By help of an owner-provided
->IWindowOperator, it handles those events for all dependent windows.
*/
class SVT_DLLPUBLIC DialogController
{
private:
::std::auto_ptr< DialogController_Data > m_pImpl;
public:
DialogController( Window& _rInstigator, const PWindowEventFilter _pEventFilter, const PWindowOperator _pOperator );
virtual ~DialogController();
/** adds a window to the list of dependent windows
@param _rWindow
The window to add to the list of dependent windows.
The caller is responsible for life-time control: The given window
must live at least as long as the ->DialogController instance does.
*/
void addDependentWindow( Window& _rWindow );
/** resets the controller so that no actions happend anymore.
The instances is disfunctional after this method has been called.
*/
void reset();
private:
void impl_Init();
void impl_updateAll();
void impl_update( Window& _rWindow );
DECL_LINK( OnWindowEvent, const VclSimpleEvent* );
private:
DialogController( const DialogController& ); // never implemented
DialogController& operator=( const DialogController& ); // never implemented
};
typedef ::boost::shared_ptr< DialogController > PDialogController;
//=====================================================================
//= ControlDependencyManager
//=====================================================================
struct ControlDependencyManager_Data;
/** helper class for managing control dependencies
Instances of this class are intended to be held as members of a dialog/tabpage/whatever
class, with easy administration of inter-control dependencies (such as "Enable
control X if and only if checkbox Y is checked).
*/
class SVT_DLLPUBLIC ControlDependencyManager
{
private:
::std::auto_ptr< ControlDependencyManager_Data > m_pImpl;
public:
ControlDependencyManager();
~ControlDependencyManager();
/** clears all dialog controllers previously added to the manager
*/
void clear();
/** ensures that a given window is enabled or disabled, according to the check state
of a given radio button
@param _rRadio
denotes the radio button whose check state is to observe
@param _rDependentWindow
denotes the window which should be enabled when ->_rRadio is checked, and
disabled when it's unchecked
*/
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow );
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2 );
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3 );
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4 );
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5 );
void enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5, Window& _rDependentWindow6 );
/** ensures that a given window is enabled or disabled, according to the mark state
of a given check box
@param _rBox
denotes the check box whose mark state is to observe
@param _rDependentWindow
denotes the window which should be enabled when ->_rBox is marked, and
disabled when it's unmarked
*/
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow );
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2 );
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3 );
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4 );
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5 );
void enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5, Window& _rDependentWindow6 );
/** adds a non-standard controller whose functionality is not covered by the other methods
@param _pController
the controller to add to the manager. Must not be <NULL/>. The manager takes ownership
of the controller.
*/
void addController( DialogController* _pController );
private:
ControlDependencyManager( const ControlDependencyManager& ); // never implemented
ControlDependencyManager& operator=( const ControlDependencyManager& ); // never implemented
};
//=====================================================================
//= EnableOnCheck
//=====================================================================
/** a helper class implementing the ->IWindowOperator interface,
which enables a dependent window depending on the check state of
an instigator window.
@see DialogController
*/
template< class CHECKABLE >
class SVT_DLLPUBLIC EnableOnCheck : public IWindowOperator
{
public:
typedef CHECKABLE SourceType;
private:
SourceType& m_rCheckable;
public:
/** constructs the instance
@param _rCheckable
a ->Window instance which supports a boolean method IsCheckable. Usually
a ->RadioButton or ->CheckBox
*/
EnableOnCheck( SourceType& _rCheckable )
:m_rCheckable( _rCheckable )
{
}
virtual void operateOn( Window& _rOperateOn ) const
{
_rOperateOn.Enable( m_rCheckable.IsChecked() );
}
};
//=====================================================================
//= FilterForRadioOrCheckToggle
//=====================================================================
/** a helper class implementing the ->IWindowEventFilter interface,
which filters for radio buttons or check boxes being toggled.
Technically, the class simply filters for the ->VCLEVENT_RADIOBUTTON_TOGGLE
and the ->VCLEVENT_CHECKBOX_TOGGLE event.
*/
class SVT_DLLPUBLIC FilterForRadioOrCheckToggle : public IWindowEventFilter
{
const Window& m_rWindow;
public:
FilterForRadioOrCheckToggle( const Window& _rWindow )
:m_rWindow( _rWindow )
{
}
bool payAttentionTo( const VclSimpleEvent& _rEvent ) const
{
const VclWindowEvent& rWindowEvent = dynamic_cast< const VclWindowEvent& >( _rEvent );
if ( ( rWindowEvent.GetWindow() == &m_rWindow )
&& ( ( rWindowEvent.GetId() == VCLEVENT_RADIOBUTTON_TOGGLE )
|| ( rWindowEvent.GetId() == VCLEVENT_CHECKBOX_TOGGLE )
)
)
return true;
return false;
}
};
//=====================================================================
//= RadioDependentEnabler
//=====================================================================
/** a ->DialogController derivee which enables or disables its dependent windows,
depending on the check state of a radio button.
The usage of this class is as simple as
<code>
pController = new RadioDependentEnabler( m_aOptionSelectSomething );
pController->addDependentWindow( m_aLabelSelection );
pController->addDependentWindow( m_aListSelection );
</code>
With this, both <code>m_aLabelSelection</code> and <code>m_aListSelection</code> will
be disabled if and only <code>m_aOptionSelectSomething</code> is checked.
*/
class SVT_DLLPUBLIC RadioDependentEnabler : public DialogController
{
public:
RadioDependentEnabler( RadioButton& _rButton )
:DialogController( _rButton,
PWindowEventFilter( new FilterForRadioOrCheckToggle( _rButton ) ),
PWindowOperator( new EnableOnCheck< RadioButton >( _rButton ) ) )
{
}
RadioDependentEnabler( CheckBox& _rBox )
:DialogController( _rBox,
PWindowEventFilter( new FilterForRadioOrCheckToggle( _rBox ) ),
PWindowOperator( new EnableOnCheck< CheckBox >( _rBox ) ) )
{
}
};
//........................................................................
} // namespace svt
//........................................................................
#endif // SVTOOLS_DIALOGCONTROLLING_HXX