| /************************************************************** | 
 |  * | 
 |  * 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. | 
 |  * | 
 |  *************************************************************/ | 
 |  | 
 |  | 
 |  | 
 | // MARKER(update_precomp.py): autogen include statement, do not remove | 
 | #include "precompiled_svx.hxx" | 
 | #include "svx/orienthelper.hxx" | 
 |  | 
 | #include <vector> | 
 | #include <utility> | 
 |  | 
 | #ifndef _SV_BUTTON_HXX | 
 | #include <vcl/button.hxx> | 
 | #endif | 
 | #include "svx/dialcontrol.hxx" | 
 |  | 
 | namespace svx { | 
 |  | 
 | // ============================================================================ | 
 |  | 
 | struct OrientationHelper_Impl | 
 | { | 
 |     typedef std::pair< Window*, TriState >  WindowPair; | 
 |     typedef std::vector< WindowPair >       WindowVec; | 
 |  | 
 |     DialControl&        mrCtrlDial; | 
 |     CheckBox&           mrCbStacked; | 
 |     WindowVec           maWinVec; | 
 |     bool                mbEnabled; | 
 |     bool                mbVisible; | 
 |  | 
 |     explicit            OrientationHelper_Impl( DialControl& rCtrlDial, CheckBox& rCbStacked ); | 
 |  | 
 |     void                AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ); | 
 |  | 
 |     void                EnableDependentWindows(); | 
 |     void                EnableWindow( Window& rWindow, TriState eDisableIfStacked ); | 
 |  | 
 |     void                ShowDependentWindows(); | 
 |  | 
 |     DECL_LINK( ClickHdl, void* ); | 
 | }; | 
 |  | 
 | // ---------------------------------------------------------------------------- | 
 |  | 
 | OrientationHelper_Impl::OrientationHelper_Impl( DialControl& rCtrlDial, CheckBox& rCbStacked ) : | 
 |     mrCtrlDial( rCtrlDial ), | 
 |     mrCbStacked( rCbStacked ), | 
 |     mbEnabled( rCtrlDial.IsEnabled() ), | 
 |     mbVisible( rCtrlDial.IsVisible() ) | 
 | { | 
 |     maWinVec.push_back( WindowPair( &mrCtrlDial, STATE_CHECK ) ); | 
 |     maWinVec.push_back( WindowPair( &mrCbStacked, STATE_DONTKNOW ) ); | 
 |     mrCbStacked.SetClickHdl( LINK( this, OrientationHelper_Impl, ClickHdl ) ); | 
 | } | 
 |  | 
 | void OrientationHelper_Impl::AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ) | 
 | { | 
 |     maWinVec.push_back( std::make_pair( &rWindow, eDisableIfStacked ) ); | 
 |     EnableWindow( rWindow, eDisableIfStacked ); | 
 | } | 
 |  | 
 | void OrientationHelper_Impl::EnableDependentWindows() | 
 | { | 
 |     for( WindowVec::iterator aIt = maWinVec.begin(), aEnd = maWinVec.end(); aIt != aEnd; ++aIt ) | 
 |         EnableWindow( *aIt->first, aIt->second ); | 
 | } | 
 |  | 
 | void OrientationHelper_Impl::EnableWindow( Window& rWindow, TriState eDisableIfStacked ) | 
 | { | 
 |     bool bDisableOnStacked = false; | 
 |     switch( eDisableIfStacked ) | 
 |     { | 
 |         // STATE_CHECK: Disable window, if stacked text is turned on or "don't know". | 
 |         case STATE_CHECK:   bDisableOnStacked = (mrCbStacked.GetState() != STATE_NOCHECK);  break; | 
 |         // STATE_NOCHECK: Disable window, if stacked text is turned off or "don't know". | 
 |         case STATE_NOCHECK: bDisableOnStacked = (mrCbStacked.GetState() != STATE_CHECK);    break; | 
 |         default: ;//prevent warning | 
 |     } | 
 |     rWindow.Enable( mbEnabled && !bDisableOnStacked ); | 
 | } | 
 |  | 
 | void OrientationHelper_Impl::ShowDependentWindows() | 
 | { | 
 |     for( WindowVec::iterator aIt = maWinVec.begin(), aEnd = maWinVec.end(); aIt != aEnd; ++aIt ) | 
 |         aIt->first->Show( mbVisible ); | 
 | } | 
 |  | 
 | IMPL_LINK( OrientationHelper_Impl, ClickHdl, void*, EMPTYARG ) | 
 | { | 
 |     EnableDependentWindows(); | 
 | 	return 0L; | 
 | } | 
 |  | 
 | // ============================================================================ | 
 |  | 
 | OrientationHelper::OrientationHelper( DialControl& rCtrlDial, CheckBox& rCbStacked ) : | 
 |     mpImpl( new OrientationHelper_Impl( rCtrlDial, rCbStacked ) ) | 
 | { | 
 |     mpImpl->EnableDependentWindows(); | 
 |     mpImpl->ShowDependentWindows(); | 
 | } | 
 |  | 
 | OrientationHelper::OrientationHelper( DialControl& rCtrlDial, NumericField& rNfRotation, CheckBox& rCbStacked ) : | 
 |     mpImpl( new OrientationHelper_Impl( rCtrlDial, rCbStacked ) ) | 
 | { | 
 |     rCtrlDial.SetLinkedField( &rNfRotation ); | 
 |     mpImpl->EnableDependentWindows(); | 
 |     mpImpl->ShowDependentWindows(); | 
 | } | 
 |  | 
 | OrientationHelper::~OrientationHelper() | 
 | { | 
 | } | 
 |  | 
 | void OrientationHelper::AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ) | 
 | { | 
 |     mpImpl->AddDependentWindow( rWindow, eDisableIfStacked ); | 
 | } | 
 |  | 
 | void OrientationHelper::Enable( bool bEnable ) | 
 | { | 
 |     mpImpl->mbEnabled = bEnable; | 
 |     mpImpl->EnableDependentWindows(); | 
 | } | 
 |  | 
 | void OrientationHelper::Show( bool bShow ) | 
 | { | 
 |     mpImpl->mbVisible = bShow; | 
 |     mpImpl->ShowDependentWindows(); | 
 | } | 
 |  | 
 | void OrientationHelper::SetStackedState( TriState eState ) | 
 | { | 
 |     if( eState != GetStackedState() ) | 
 |     { | 
 |         mpImpl->mrCbStacked.SetState( eState ); | 
 |         mpImpl->EnableDependentWindows(); | 
 |     } | 
 | } | 
 |  | 
 | TriState OrientationHelper::GetStackedState() const | 
 | { | 
 |     return mpImpl->mrCbStacked.GetState(); | 
 | } | 
 |  | 
 | void OrientationHelper::EnableStackedTriState( bool bEnable ) | 
 | { | 
 |     mpImpl->mrCbStacked.EnableTriState( bEnable ); | 
 | } | 
 |  | 
 | // ============================================================================ | 
 |  | 
 | OrientStackedWrapper::OrientStackedWrapper( OrientationHelper& rOrientHlp ) : | 
 |     SingleControlWrapperType( rOrientHlp ) | 
 | { | 
 | } | 
 |  | 
 | bool OrientStackedWrapper::IsControlDontKnow() const | 
 | { | 
 |     return GetControl().GetStackedState() == STATE_DONTKNOW; | 
 | } | 
 |  | 
 | void OrientStackedWrapper::SetControlDontKnow( bool bSet ) | 
 | { | 
 |     GetControl().EnableStackedTriState( bSet ); | 
 |     GetControl().SetStackedState( bSet ? STATE_DONTKNOW : STATE_NOCHECK ); | 
 | } | 
 |  | 
 | bool OrientStackedWrapper::GetControlValue() const | 
 | { | 
 |     return GetControl().GetStackedState() == STATE_CHECK; | 
 | } | 
 |  | 
 | void OrientStackedWrapper::SetControlValue( bool bValue ) | 
 | { | 
 |     GetControl().SetStackedState( bValue ? STATE_CHECK : STATE_NOCHECK ); | 
 | } | 
 |  | 
 | // ============================================================================ | 
 |  | 
 | } // namespace svx |