xref: /AOO41X/main/sd/source/ui/animations/DialogListBox.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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_sd.hxx"
26 #include "DialogListBox.hxx"
27 
28 namespace sd
29 {
30 
DialogListBox(Window * pParent,WinBits nWinStyle)31 DialogListBox::DialogListBox( Window* pParent, WinBits nWinStyle ) :
32     Control( pParent, nWinStyle ),
33     mpChild( 0 )
34 {
35     mpVScrollBar    = new ScrollBar( this, WB_VSCROLL | WB_DRAG );
36     mpHScrollBar    = new ScrollBar( this, WB_HSCROLL | WB_DRAG );
37     mpScrollBarBox  = new ScrollBarBox( this );
38 
39     Link aLink( LINK( this, DialogListBox, ScrollBarHdl ) );
40     mpVScrollBar->SetScrollHdl( aLink );
41     mpHScrollBar->SetScrollHdl( aLink );
42 
43     mbVScroll       = false;
44     mbHScroll       = false;
45     mbAutoHScroll   = ( nWinStyle & WB_AUTOHSCROLL ) ? true : false;
46 }
47 
48 // -----------------------------------------------------------------------
49 
~DialogListBox()50 DialogListBox::~DialogListBox()
51 {
52     delete mpHScrollBar;
53     delete mpVScrollBar;
54     delete mpScrollBarBox;
55     delete mpChild;
56 }
57 
58 // -----------------------------------------------------------------------
59 
SetChildWindow(Window * pChild,const Size & rMinSize)60 void DialogListBox::SetChildWindow( Window* pChild, const Size& rMinSize )
61 {
62     if( mpChild )
63         delete mpChild;
64 
65     mpChild = pChild;
66     maMinSize = rMinSize;
67     ImplResizeControls();
68     ImplCheckScrollBars();
69 }
70 
71 // -----------------------------------------------------------------------
72 
GetFocus()73 void DialogListBox::GetFocus()
74 {
75     if( mpChild )
76         mpChild->GrabFocus();
77 }
78 
79 // -----------------------------------------------------------------------
80 
GetPreferredKeyInputWindow()81 ::Window* DialogListBox::GetPreferredKeyInputWindow()
82 {
83     if( mpChild )
84         return mpChild;
85     else
86         return this;
87 }
88 
89 // -----------------------------------------------------------------------
90 
Resize()91 void DialogListBox::Resize()
92 {
93     Control::Resize();
94     ImplResizeControls();
95     ImplCheckScrollBars();
96 }
97 
98 // -----------------------------------------------------------------------
99 
IMPL_LINK(DialogListBox,ScrollBarHdl,ScrollBar *,EMPTYARG)100 IMPL_LINK( DialogListBox, ScrollBarHdl, ScrollBar*, EMPTYARG )
101 {
102     ImplResizeChild();
103     return 1;
104 }
105 
106 // -----------------------------------------------------------------------
107 
ImplCheckScrollBars()108 void DialogListBox::ImplCheckScrollBars()
109 {
110     bool bArrange = false;
111 
112     Size aOutSz = GetOutputSizePixel();
113 
114     // vert. ScrollBar
115     if( aOutSz.Height() < maMinSize.Height() )
116     {
117         if( !mbVScroll )
118             bArrange = true;
119         mbVScroll = true;
120     }
121     else
122     {
123         if( mbVScroll )
124             bArrange = true;
125         mbVScroll = false;
126     }
127 
128     // horz. ScrollBar
129     if( mbAutoHScroll )
130     {
131         long nWidth = aOutSz.Width();
132         if ( mbVScroll )
133             nWidth -= mpVScrollBar->GetSizePixel().Width();
134         if( nWidth < maMinSize.Width() )
135         {
136             if( !mbHScroll )
137                 bArrange = true;
138             mbHScroll = true;
139 
140             if ( !mbVScroll )
141             {
142                 int nHeight = aOutSz.Height() - mpHScrollBar->GetSizePixel().Height();
143                 if( nHeight < maMinSize.Height() )
144                 {
145                     if( !mbVScroll )
146                         bArrange = true;
147                     mbVScroll = true;
148                 }
149             }
150         }
151         else
152         {
153             if( mbHScroll )
154                 bArrange = true;
155             mbHScroll = false;
156         }
157     }
158 
159     if( bArrange )
160         ImplResizeControls();
161 
162     ImplInitScrollBars();
163 }
164 
165 // -----------------------------------------------------------------------
166 
ImplInitScrollBars()167 void DialogListBox::ImplInitScrollBars()
168 {
169     if( mpChild )
170     {
171         Size aOutSize( GetOutputSizePixel() );
172         if( mbHScroll ) aOutSize.Height() -= mpHScrollBar->GetSizePixel().Height();
173         if( mbVScroll ) aOutSize.Width() -= mpVScrollBar->GetSizePixel().Width();
174 
175         if ( mbVScroll )
176         {
177             mpVScrollBar->SetRangeMax( maMinSize.Height() );
178             mpVScrollBar->SetVisibleSize( aOutSize.Height() );
179             mpVScrollBar->SetPageSize( 16 );
180         }
181 
182         if ( mbHScroll )
183         {
184             mpHScrollBar->SetRangeMax( maMinSize.Width() );
185             mpHScrollBar->SetVisibleSize( aOutSize.Width() );
186             mpHScrollBar->SetPageSize( 16 );
187         }
188     }
189 }
190 
191 // -----------------------------------------------------------------------
192 
ImplResizeControls()193 void DialogListBox::ImplResizeControls()
194 {
195     Size aOutSz( GetOutputSizePixel() );
196     long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
197     nSBWidth = CalcZoom( nSBWidth );
198 
199     maInnerSize = aOutSz;
200     if ( mbVScroll )
201         maInnerSize.Width() -= nSBWidth;
202     if ( mbHScroll )
203         maInnerSize.Height() -= nSBWidth;
204 
205     // ScrollBarBox
206     if( mbVScroll && mbHScroll )
207     {
208         Point aBoxPos( maInnerSize.Width(), maInnerSize.Height() );
209         mpScrollBarBox->SetPosSizePixel( aBoxPos, Size( nSBWidth, nSBWidth ) );
210         mpScrollBarBox->Show();
211     }
212     else
213     {
214         mpScrollBarBox->Hide();
215     }
216 
217     // vert. ScrollBar
218     if( mbVScroll )
219     {
220         // Scrollbar on left or right side?
221         Point aVPos( aOutSz.Width() - nSBWidth, 0 );
222         mpVScrollBar->SetPosSizePixel( aVPos, Size( nSBWidth, maInnerSize.Height() ) );
223         mpVScrollBar->Show();
224     }
225     else
226     {
227         mpVScrollBar->Hide();
228     }
229 
230     // horz. ScrollBar
231     if( mbHScroll )
232     {
233         Point aHPos( 0, aOutSz.Height() - nSBWidth );
234         mpHScrollBar->SetPosSizePixel( aHPos, Size( maInnerSize.Width(), nSBWidth ) );
235         mpHScrollBar->Show();
236     }
237     else
238     {
239         mpHScrollBar->Hide();
240     }
241 
242     ImplResizeChild();
243 }
244 
ImplResizeChild()245 void DialogListBox::ImplResizeChild()
246 {
247     Point aWinPos;
248     Size aSize( maInnerSize );
249 
250     int nOffset;
251     if( mbHScroll )
252     {
253         nOffset = mpHScrollBar->GetThumbPos();
254         aWinPos.X() = -nOffset;
255         aSize.Width() += nOffset;
256     }
257 
258     if( mbVScroll )
259     {
260         nOffset = mpVScrollBar->GetThumbPos();
261         aWinPos.Y() = -nOffset;
262         aSize.Height() += nOffset;
263     }
264 
265     mpChild->SetPosSizePixel( aWinPos, aSize );
266 }
267 
268 // -----------------------------------------------------------------------
269 
StateChanged(StateChangedType nType)270 void DialogListBox::StateChanged( StateChangedType nType )
271 {
272     if ( nType == STATE_CHANGE_INITSHOW )
273     {
274         ImplCheckScrollBars();
275     }
276     else if ( ( nType == STATE_CHANGE_UPDATEMODE ) || ( nType == STATE_CHANGE_DATA ) )
277     {
278         sal_Bool bUpdate = IsUpdateMode();
279         mpChild->SetUpdateMode( bUpdate );
280         if ( bUpdate && IsReallyVisible() )
281             ImplCheckScrollBars();
282     }
283     else if( nType == STATE_CHANGE_ENABLE )
284     {
285         mpHScrollBar->Enable( IsEnabled() );
286         mpVScrollBar->Enable( IsEnabled() );
287         mpScrollBarBox->Enable( IsEnabled() );
288         Invalidate();
289     }
290     else if ( nType == STATE_CHANGE_ZOOM )
291     {
292         mpChild->SetZoom( GetZoom() );
293         Resize();
294     }
295     else if ( nType == STATE_CHANGE_CONTROLFONT )
296     {
297         mpChild->SetControlFont( GetControlFont() );
298     }
299     else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
300     {
301         mpChild->SetControlForeground( GetControlForeground() );
302     }
303     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
304     {
305         mpChild->SetControlBackground( GetControlBackground() );
306     }
307     else if( nType == STATE_CHANGE_VISIBLE )
308     {
309         mpChild->Show( IsVisible() );
310     }
311 
312     Control::StateChanged( nType );
313 }
314 
315 // -----------------------------------------------------------------------
316 
Notify(NotifyEvent & rNEvt)317 long DialogListBox::Notify( NotifyEvent& rNEvt )
318 {
319     long nDone = 0;
320     if ( rNEvt.GetType() == EVENT_COMMAND )
321     {
322         const CommandEvent& rCEvt = *rNEvt.GetCommandEvent();
323         if ( rCEvt.GetCommand() == COMMAND_WHEEL )
324         {
325             const CommandWheelData* pData = rCEvt.GetWheelData();
326             if( !pData->GetModifier() && ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) )
327             {
328                 nDone = HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar );
329             }
330         }
331     }
332 
333     return nDone ? nDone : Window::Notify( rNEvt );
334 }
335 
336 } //  namespace sd
337