1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 #include "svx/orienthelper.hxx" 27 28 #include <vector> 29 #include <utility> 30 31 #ifndef _SV_BUTTON_HXX 32 #include <vcl/button.hxx> 33 #endif 34 #include "svx/dialcontrol.hxx" 35 36 namespace svx { 37 38 // ============================================================================ 39 40 struct OrientationHelper_Impl 41 { 42 typedef std::pair< Window*, TriState > WindowPair; 43 typedef std::vector< WindowPair > WindowVec; 44 45 DialControl& mrCtrlDial; 46 CheckBox& mrCbStacked; 47 WindowVec maWinVec; 48 bool mbEnabled; 49 bool mbVisible; 50 51 explicit OrientationHelper_Impl( DialControl& rCtrlDial, CheckBox& rCbStacked ); 52 53 void AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ); 54 55 void EnableDependentWindows(); 56 void EnableWindow( Window& rWindow, TriState eDisableIfStacked ); 57 58 void ShowDependentWindows(); 59 60 DECL_LINK( ClickHdl, void* ); 61 }; 62 63 // ---------------------------------------------------------------------------- 64 65 OrientationHelper_Impl::OrientationHelper_Impl( DialControl& rCtrlDial, CheckBox& rCbStacked ) : 66 mrCtrlDial( rCtrlDial ), 67 mrCbStacked( rCbStacked ), 68 mbEnabled( rCtrlDial.IsEnabled() ), 69 mbVisible( rCtrlDial.IsVisible() ) 70 { 71 maWinVec.push_back( WindowPair( &mrCtrlDial, STATE_CHECK ) ); 72 maWinVec.push_back( WindowPair( &mrCbStacked, STATE_DONTKNOW ) ); 73 mrCbStacked.SetClickHdl( LINK( this, OrientationHelper_Impl, ClickHdl ) ); 74 } 75 76 void OrientationHelper_Impl::AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ) 77 { 78 maWinVec.push_back( std::make_pair( &rWindow, eDisableIfStacked ) ); 79 EnableWindow( rWindow, eDisableIfStacked ); 80 } 81 82 void OrientationHelper_Impl::EnableDependentWindows() 83 { 84 for( WindowVec::iterator aIt = maWinVec.begin(), aEnd = maWinVec.end(); aIt != aEnd; ++aIt ) 85 EnableWindow( *aIt->first, aIt->second ); 86 } 87 88 void OrientationHelper_Impl::EnableWindow( Window& rWindow, TriState eDisableIfStacked ) 89 { 90 bool bDisableOnStacked = false; 91 switch( eDisableIfStacked ) 92 { 93 // STATE_CHECK: Disable window, if stacked text is turned on or "don't know". 94 case STATE_CHECK: bDisableOnStacked = (mrCbStacked.GetState() != STATE_NOCHECK); break; 95 // STATE_NOCHECK: Disable window, if stacked text is turned off or "don't know". 96 case STATE_NOCHECK: bDisableOnStacked = (mrCbStacked.GetState() != STATE_CHECK); break; 97 default: ;//prevent warning 98 } 99 rWindow.Enable( mbEnabled && !bDisableOnStacked ); 100 } 101 102 void OrientationHelper_Impl::ShowDependentWindows() 103 { 104 for( WindowVec::iterator aIt = maWinVec.begin(), aEnd = maWinVec.end(); aIt != aEnd; ++aIt ) 105 aIt->first->Show( mbVisible ); 106 } 107 108 IMPL_LINK( OrientationHelper_Impl, ClickHdl, void*, EMPTYARG ) 109 { 110 EnableDependentWindows(); 111 return 0L; 112 } 113 114 // ============================================================================ 115 116 OrientationHelper::OrientationHelper( DialControl& rCtrlDial, CheckBox& rCbStacked ) : 117 mpImpl( new OrientationHelper_Impl( rCtrlDial, rCbStacked ) ) 118 { 119 mpImpl->EnableDependentWindows(); 120 mpImpl->ShowDependentWindows(); 121 } 122 123 OrientationHelper::OrientationHelper( DialControl& rCtrlDial, NumericField& rNfRotation, CheckBox& rCbStacked ) : 124 mpImpl( new OrientationHelper_Impl( rCtrlDial, rCbStacked ) ) 125 { 126 rCtrlDial.SetLinkedField( &rNfRotation ); 127 mpImpl->EnableDependentWindows(); 128 mpImpl->ShowDependentWindows(); 129 } 130 131 OrientationHelper::~OrientationHelper() 132 { 133 } 134 135 void OrientationHelper::AddDependentWindow( Window& rWindow, TriState eDisableIfStacked ) 136 { 137 mpImpl->AddDependentWindow( rWindow, eDisableIfStacked ); 138 } 139 140 void OrientationHelper::Enable( bool bEnable ) 141 { 142 mpImpl->mbEnabled = bEnable; 143 mpImpl->EnableDependentWindows(); 144 } 145 146 void OrientationHelper::Show( bool bShow ) 147 { 148 mpImpl->mbVisible = bShow; 149 mpImpl->ShowDependentWindows(); 150 } 151 152 void OrientationHelper::SetStackedState( TriState eState ) 153 { 154 if( eState != GetStackedState() ) 155 { 156 mpImpl->mrCbStacked.SetState( eState ); 157 mpImpl->EnableDependentWindows(); 158 } 159 } 160 161 TriState OrientationHelper::GetStackedState() const 162 { 163 return mpImpl->mrCbStacked.GetState(); 164 } 165 166 void OrientationHelper::EnableStackedTriState( bool bEnable ) 167 { 168 mpImpl->mrCbStacked.EnableTriState( bEnable ); 169 } 170 171 // ============================================================================ 172 173 OrientStackedWrapper::OrientStackedWrapper( OrientationHelper& rOrientHlp ) : 174 SingleControlWrapperType( rOrientHlp ) 175 { 176 } 177 178 bool OrientStackedWrapper::IsControlDontKnow() const 179 { 180 return GetControl().GetStackedState() == STATE_DONTKNOW; 181 } 182 183 void OrientStackedWrapper::SetControlDontKnow( bool bSet ) 184 { 185 GetControl().EnableStackedTriState( bSet ); 186 GetControl().SetStackedState( bSet ? STATE_DONTKNOW : STATE_NOCHECK ); 187 } 188 189 bool OrientStackedWrapper::GetControlValue() const 190 { 191 return GetControl().GetStackedState() == STATE_CHECK; 192 } 193 194 void OrientStackedWrapper::SetControlValue( bool bValue ) 195 { 196 GetControl().SetStackedState( bValue ? STATE_CHECK : STATE_NOCHECK ); 197 } 198 199 // ============================================================================ 200 201 } // namespace svx 202 203