1*5900e8ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5900e8ecSAndrew Rist * distributed with this work for additional information 6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance 9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an 15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the 17*5900e8ecSAndrew Rist * specific language governing permissions and limitations 18*5900e8ecSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*5900e8ecSAndrew Rist *************************************************************/ 21*5900e8ecSAndrew Rist 22*5900e8ecSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svtools.hxx" 26cdf0e10cSrcweir #include <svtools/dialogcontrolling.hxx> 27cdf0e10cSrcweir #include <vcl/window.hxx> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <algorithm> 30cdf0e10cSrcweir #include <functional> 31cdf0e10cSrcweir 32cdf0e10cSrcweir //........................................................................ 33cdf0e10cSrcweir namespace svt 34cdf0e10cSrcweir { 35cdf0e10cSrcweir //........................................................................ 36cdf0e10cSrcweir 37cdf0e10cSrcweir //===================================================================== 38cdf0e10cSrcweir //= IWindowOperator 39cdf0e10cSrcweir //===================================================================== 40cdf0e10cSrcweir //--------------------------------------------------------------------- ~IWindowOperator()41cdf0e10cSrcweir IWindowOperator::~IWindowOperator() 42cdf0e10cSrcweir { 43cdf0e10cSrcweir } 44cdf0e10cSrcweir 45cdf0e10cSrcweir //===================================================================== 46cdf0e10cSrcweir //= IWindowEventFilter 47cdf0e10cSrcweir //===================================================================== 48cdf0e10cSrcweir //--------------------------------------------------------------------- ~IWindowEventFilter()49cdf0e10cSrcweir IWindowEventFilter::~IWindowEventFilter() 50cdf0e10cSrcweir { 51cdf0e10cSrcweir } 52cdf0e10cSrcweir 53cdf0e10cSrcweir //===================================================================== 54cdf0e10cSrcweir //= DialogController_Data 55cdf0e10cSrcweir //===================================================================== 56cdf0e10cSrcweir struct DialogController_Data 57cdf0e10cSrcweir { 58cdf0e10cSrcweir Window& rInstigator; 59cdf0e10cSrcweir ::std::vector< Window* > aConcernedWindows; 60cdf0e10cSrcweir PWindowEventFilter pEventFilter; 61cdf0e10cSrcweir PWindowOperator pOperator; 62cdf0e10cSrcweir DialogController_Datasvt::DialogController_Data63cdf0e10cSrcweir DialogController_Data( Window& _rInstigator, const PWindowEventFilter _pEventFilter, const PWindowOperator _pOperator ) 64cdf0e10cSrcweir :rInstigator( _rInstigator ) 65cdf0e10cSrcweir ,pEventFilter( _pEventFilter ) 66cdf0e10cSrcweir ,pOperator( _pOperator ) 67cdf0e10cSrcweir { 68cdf0e10cSrcweir } 69cdf0e10cSrcweir }; 70cdf0e10cSrcweir 71cdf0e10cSrcweir //===================================================================== 72cdf0e10cSrcweir //= DialogController 73cdf0e10cSrcweir //===================================================================== 74cdf0e10cSrcweir //--------------------------------------------------------------------- DialogController(Window & _rInstigator,const PWindowEventFilter & _pEventFilter,const PWindowOperator & _pOperator)75cdf0e10cSrcweir DialogController::DialogController( Window& _rInstigator, const PWindowEventFilter& _pEventFilter, 76cdf0e10cSrcweir const PWindowOperator& _pOperator ) 77cdf0e10cSrcweir :m_pImpl( new DialogController_Data( _rInstigator, _pEventFilter, _pOperator ) ) 78cdf0e10cSrcweir { 79cdf0e10cSrcweir DBG_ASSERT( m_pImpl->pEventFilter.get() && m_pImpl->pOperator.get(), 80cdf0e10cSrcweir "DialogController::DialogController: invalid filter and/or operator!" ); 81cdf0e10cSrcweir 82cdf0e10cSrcweir m_pImpl->rInstigator.AddEventListener( LINK( this, DialogController, OnWindowEvent ) ); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir //--------------------------------------------------------------------- ~DialogController()86cdf0e10cSrcweir DialogController::~DialogController() 87cdf0e10cSrcweir { 88cdf0e10cSrcweir reset(); 89cdf0e10cSrcweir } 90cdf0e10cSrcweir 91cdf0e10cSrcweir //--------------------------------------------------------------------- reset()92cdf0e10cSrcweir void DialogController::reset() 93cdf0e10cSrcweir { 94cdf0e10cSrcweir m_pImpl->rInstigator.RemoveEventListener( LINK( this, DialogController, OnWindowEvent ) ); 95cdf0e10cSrcweir m_pImpl->aConcernedWindows.clear(); 96cdf0e10cSrcweir m_pImpl->pEventFilter.reset(); 97cdf0e10cSrcweir m_pImpl->pOperator.reset(); 98cdf0e10cSrcweir } 99cdf0e10cSrcweir 100cdf0e10cSrcweir //--------------------------------------------------------------------- addDependentWindow(Window & _rWindow)101cdf0e10cSrcweir void DialogController::addDependentWindow( Window& _rWindow ) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir m_pImpl->aConcernedWindows.push_back( &_rWindow ); 104cdf0e10cSrcweir 105cdf0e10cSrcweir VclWindowEvent aEvent( &_rWindow, 0, NULL ); 106cdf0e10cSrcweir impl_update( aEvent, _rWindow ); 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir //--------------------------------------------------------------------- IMPL_LINK(DialogController,OnWindowEvent,const VclWindowEvent *,_pEvent)110cdf0e10cSrcweir IMPL_LINK( DialogController, OnWindowEvent, const VclWindowEvent*, _pEvent ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir if ( m_pImpl->pEventFilter->payAttentionTo( *_pEvent ) ) 113cdf0e10cSrcweir impl_updateAll( *_pEvent ); 114cdf0e10cSrcweir return 0L; 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir //--------------------------------------------------------------------- impl_updateAll(const VclWindowEvent & _rTriggerEvent)118cdf0e10cSrcweir void DialogController::impl_updateAll( const VclWindowEvent& _rTriggerEvent ) 119cdf0e10cSrcweir { 120cdf0e10cSrcweir for ( ::std::vector< Window* >::iterator loop = m_pImpl->aConcernedWindows.begin(); 121cdf0e10cSrcweir loop != m_pImpl->aConcernedWindows.end(); 122cdf0e10cSrcweir ++loop 123cdf0e10cSrcweir ) 124cdf0e10cSrcweir impl_update( _rTriggerEvent, *(*loop) ); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir 127cdf0e10cSrcweir //--------------------------------------------------------------------- impl_update(const VclWindowEvent & _rTriggerEvent,Window & _rWindow)128cdf0e10cSrcweir void DialogController::impl_update( const VclWindowEvent& _rTriggerEvent, Window& _rWindow ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir m_pImpl->pOperator->operateOn( _rTriggerEvent, _rWindow ); 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir //===================================================================== 134cdf0e10cSrcweir //= ControlDependencyManager_Data 135cdf0e10cSrcweir //===================================================================== 136cdf0e10cSrcweir struct ControlDependencyManager_Data 137cdf0e10cSrcweir { 138cdf0e10cSrcweir ::std::vector< PDialogController > aControllers; 139cdf0e10cSrcweir }; 140cdf0e10cSrcweir 141cdf0e10cSrcweir //===================================================================== 142cdf0e10cSrcweir //= ControlDependencyManager 143cdf0e10cSrcweir //===================================================================== 144cdf0e10cSrcweir //--------------------------------------------------------------------- ControlDependencyManager()145cdf0e10cSrcweir ControlDependencyManager::ControlDependencyManager() 146cdf0e10cSrcweir :m_pImpl( new ControlDependencyManager_Data ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir //--------------------------------------------------------------------- ~ControlDependencyManager()151cdf0e10cSrcweir ControlDependencyManager::~ControlDependencyManager() 152cdf0e10cSrcweir { 153cdf0e10cSrcweir } 154cdf0e10cSrcweir 155cdf0e10cSrcweir //--------------------------------------------------------------------- 156cdf0e10cSrcweir namespace 157cdf0e10cSrcweir { 158cdf0e10cSrcweir struct ResetDialogController : public ::std::unary_function< const PDialogController&, void > 159cdf0e10cSrcweir { operator ()svt::__anon9afb545e0111::ResetDialogController160cdf0e10cSrcweir void operator()( const PDialogController& _pController ) 161cdf0e10cSrcweir { 162cdf0e10cSrcweir _pController->reset(); 163cdf0e10cSrcweir } 164cdf0e10cSrcweir }; 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir //--------------------------------------------------------------------- clear()168cdf0e10cSrcweir void ControlDependencyManager::clear() 169cdf0e10cSrcweir { 170cdf0e10cSrcweir ::std::for_each( m_pImpl->aControllers.begin(), m_pImpl->aControllers.end(), ResetDialogController() ); 171cdf0e10cSrcweir m_pImpl->aControllers.clear(); 172cdf0e10cSrcweir } 173cdf0e10cSrcweir 174cdf0e10cSrcweir //--------------------------------------------------------------------- addController(const PDialogController & _pController)175cdf0e10cSrcweir void ControlDependencyManager::addController( const PDialogController& _pController ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir OSL_ENSURE( _pController.get() != NULL, "ControlDependencyManager::addController: invalid controller, this will crash, sooner or later!" ); 178cdf0e10cSrcweir m_pImpl->aControllers.push_back( _pController ); 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow)182cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow ) 183cdf0e10cSrcweir { 184cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 185cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow ); 186cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow1,Window & _rDependentWindow2)190cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2 ) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 193cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 194cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 195cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 196cdf0e10cSrcweir } 197cdf0e10cSrcweir 198cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3)199cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3 ) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 202cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 203cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 204cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 205cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir 208cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4)209cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4 ) 210cdf0e10cSrcweir { 211cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 212cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 213cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 214cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 215cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 216cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4,Window & _rDependentWindow5)220cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5 ) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 223cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 224cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 225cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 226cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 227cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow5 ); 228cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnRadioCheck(RadioButton & _rRadio,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4,Window & _rDependentWindow5,Window & _rDependentWindow6)232cdf0e10cSrcweir void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5, Window& _rDependentWindow6 ) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rRadio ) ); 235cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 236cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 237cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 238cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 239cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow5 ); 240cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow6 ); 241cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow)245cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow ) 246cdf0e10cSrcweir { 247cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 248cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow ); 249cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow1,Window & _rDependentWindow2)253cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2 ) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 256cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 257cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 258cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 261cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3)262cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3 ) 263cdf0e10cSrcweir { 264cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 265cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 266cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 267cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 268cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4)272cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4 ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 275cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 276cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 277cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 278cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 279cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 280cdf0e10cSrcweir } 281cdf0e10cSrcweir 282cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4,Window & _rDependentWindow5)283cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5 ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 286cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 287cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 288cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 289cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 290cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow5 ); 291cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir //--------------------------------------------------------------------- enableOnCheckMark(CheckBox & _rBox,Window & _rDependentWindow1,Window & _rDependentWindow2,Window & _rDependentWindow3,Window & _rDependentWindow4,Window & _rDependentWindow5,Window & _rDependentWindow6)295cdf0e10cSrcweir void ControlDependencyManager::enableOnCheckMark( CheckBox& _rBox, Window& _rDependentWindow1, Window& _rDependentWindow2, Window& _rDependentWindow3, Window& _rDependentWindow4, Window& _rDependentWindow5, Window& _rDependentWindow6 ) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir PDialogController pController( new RadioDependentEnabler( _rBox ) ); 298cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow1 ); 299cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow2 ); 300cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow3 ); 301cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow4 ); 302cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow5 ); 303cdf0e10cSrcweir pController->addDependentWindow( _rDependentWindow6 ); 304cdf0e10cSrcweir m_pImpl->aControllers.push_back( pController ); 305cdf0e10cSrcweir } 306cdf0e10cSrcweir 307cdf0e10cSrcweir //........................................................................ 308cdf0e10cSrcweir } // namespace svt 309cdf0e10cSrcweir //........................................................................ 310cdf0e10cSrcweir 311