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