blob: d079309b894c7a9e52396fc05fb1f859bc477c64 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#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:
/** called when an event happened which should be reacted to
@param _rTrigger
the event which triggered the call. If the Id of the event is 0, then this is the initial
call which is made when ->_rOperateOn is added to the responsibility of the DialogController.
@param _rOperateOn
the window on which to operate
*/
virtual void operateOn( const VclWindowEvent& _rTrigger, Window& _rOperateOn ) const = 0;
virtual ~IWindowOperator();
};
typedef ::boost::shared_ptr< IWindowOperator > PWindowOperator;
//=====================================================================
//= IWindowEventFilter
//=====================================================================
/** an abstract interface for deciding whether a ->VclWindowEvent
is worth paying attention to
*/
class SVT_DLLPUBLIC SAL_NO_VTABLE IWindowEventFilter
{
public:
virtual bool payAttentionTo( const VclWindowEvent& _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( const VclWindowEvent& _rTriggerEvent );
void impl_update( const VclWindowEvent& _rTriggerEvent, Window& _rWindow );
DECL_LINK( OnWindowEvent, const VclWindowEvent* );
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/>.
*/
void addController( const PDialogController& _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 IsChecked. Usually
a ->RadioButton or ->CheckBox
*/
EnableOnCheck( SourceType& _rCheckable )
:m_rCheckable( _rCheckable )
{
}
virtual void operateOn( const VclWindowEvent& /*_rTrigger*/, 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 VclWindowEvent& _rEvent ) const
{
if ( ( _rEvent.GetWindow() == &m_rWindow )
&& ( ( _rEvent.GetId() == VCLEVENT_RADIOBUTTON_TOGGLE )
|| ( _rEvent.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