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
OrientationHelper_Impl(DialControl & rCtrlDial,CheckBox & rCbStacked)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
AddDependentWindow(Window & rWindow,TriState eDisableIfStacked)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
EnableDependentWindows()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
EnableWindow(Window & rWindow,TriState eDisableIfStacked)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
ShowDependentWindows()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
IMPL_LINK(OrientationHelper_Impl,ClickHdl,void *,EMPTYARG)108 IMPL_LINK( OrientationHelper_Impl, ClickHdl, void*, EMPTYARG )
109 {
110 EnableDependentWindows();
111 return 0L;
112 }
113
114 // ============================================================================
115
OrientationHelper(DialControl & rCtrlDial,CheckBox & rCbStacked)116 OrientationHelper::OrientationHelper( DialControl& rCtrlDial, CheckBox& rCbStacked ) :
117 mpImpl( new OrientationHelper_Impl( rCtrlDial, rCbStacked ) )
118 {
119 mpImpl->EnableDependentWindows();
120 mpImpl->ShowDependentWindows();
121 }
122
OrientationHelper(DialControl & rCtrlDial,NumericField & rNfRotation,CheckBox & rCbStacked)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
~OrientationHelper()131 OrientationHelper::~OrientationHelper()
132 {
133 }
134
AddDependentWindow(Window & rWindow,TriState eDisableIfStacked)135 void OrientationHelper::AddDependentWindow( Window& rWindow, TriState eDisableIfStacked )
136 {
137 mpImpl->AddDependentWindow( rWindow, eDisableIfStacked );
138 }
139
Enable(bool bEnable)140 void OrientationHelper::Enable( bool bEnable )
141 {
142 mpImpl->mbEnabled = bEnable;
143 mpImpl->EnableDependentWindows();
144 }
145
Show(bool bShow)146 void OrientationHelper::Show( bool bShow )
147 {
148 mpImpl->mbVisible = bShow;
149 mpImpl->ShowDependentWindows();
150 }
151
SetStackedState(TriState eState)152 void OrientationHelper::SetStackedState( TriState eState )
153 {
154 if( eState != GetStackedState() )
155 {
156 mpImpl->mrCbStacked.SetState( eState );
157 mpImpl->EnableDependentWindows();
158 }
159 }
160
GetStackedState() const161 TriState OrientationHelper::GetStackedState() const
162 {
163 return mpImpl->mrCbStacked.GetState();
164 }
165
EnableStackedTriState(bool bEnable)166 void OrientationHelper::EnableStackedTriState( bool bEnable )
167 {
168 mpImpl->mrCbStacked.EnableTriState( bEnable );
169 }
170
171 // ============================================================================
172
OrientStackedWrapper(OrientationHelper & rOrientHlp)173 OrientStackedWrapper::OrientStackedWrapper( OrientationHelper& rOrientHlp ) :
174 SingleControlWrapperType( rOrientHlp )
175 {
176 }
177
IsControlDontKnow() const178 bool OrientStackedWrapper::IsControlDontKnow() const
179 {
180 return GetControl().GetStackedState() == STATE_DONTKNOW;
181 }
182
SetControlDontKnow(bool bSet)183 void OrientStackedWrapper::SetControlDontKnow( bool bSet )
184 {
185 GetControl().EnableStackedTriState( bSet );
186 GetControl().SetStackedState( bSet ? STATE_DONTKNOW : STATE_NOCHECK );
187 }
188
GetControlValue() const189 bool OrientStackedWrapper::GetControlValue() const
190 {
191 return GetControl().GetStackedState() == STATE_CHECK;
192 }
193
SetControlValue(bool bValue)194 void OrientStackedWrapper::SetControlValue( bool bValue )
195 {
196 GetControl().SetStackedState( bValue ? STATE_CHECK : STATE_NOCHECK );
197 }
198
199 // ============================================================================
200
201 } // namespace svx
202
203