Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include "DialogListBox.hxx"
30 : :
31 : : namespace sd
32 : : {
33 : :
34 : 0 : DialogListBox::DialogListBox( Window* pParent, WinBits nWinStyle ) :
35 : : Control( pParent, nWinStyle ),
36 : 0 : mpChild( 0 )
37 : : {
38 [ # # ][ # # ]: 0 : mpVScrollBar = new ScrollBar( this, WB_VSCROLL | WB_DRAG );
39 [ # # ][ # # ]: 0 : mpHScrollBar = new ScrollBar( this, WB_HSCROLL | WB_DRAG );
40 [ # # ][ # # ]: 0 : mpScrollBarBox = new ScrollBarBox( this );
41 : :
42 [ # # ]: 0 : Link aLink( LINK( this, DialogListBox, ScrollBarHdl ) );
43 : 0 : mpVScrollBar->SetScrollHdl( aLink );
44 : 0 : mpHScrollBar->SetScrollHdl( aLink );
45 : :
46 : 0 : mbVScroll = false;
47 : 0 : mbHScroll = false;
48 : 0 : mbAutoHScroll = ( nWinStyle & WB_AUTOHSCROLL ) ? true : false;
49 : 0 : }
50 : :
51 : : // -----------------------------------------------------------------------
52 : :
53 : 0 : DialogListBox::~DialogListBox()
54 : : {
55 [ # # ][ # # ]: 0 : delete mpHScrollBar;
56 [ # # ][ # # ]: 0 : delete mpVScrollBar;
57 [ # # ][ # # ]: 0 : delete mpScrollBarBox;
58 [ # # ][ # # ]: 0 : delete mpChild;
59 [ # # ]: 0 : }
60 : :
61 : : // -----------------------------------------------------------------------
62 : :
63 : 0 : void DialogListBox::SetChildWindow( Window* pChild, const Size& rMinSize )
64 : : {
65 [ # # ]: 0 : if( mpChild )
66 [ # # ]: 0 : delete mpChild;
67 : :
68 : 0 : mpChild = pChild;
69 : 0 : maMinSize = rMinSize;
70 : 0 : ImplResizeControls();
71 : 0 : ImplCheckScrollBars();
72 : 0 : }
73 : :
74 : : // -----------------------------------------------------------------------
75 : :
76 : 0 : void DialogListBox::GetFocus()
77 : : {
78 [ # # ]: 0 : if( mpChild )
79 : 0 : mpChild->GrabFocus();
80 : 0 : }
81 : :
82 : : // -----------------------------------------------------------------------
83 : :
84 : 0 : ::Window* DialogListBox::GetPreferredKeyInputWindow()
85 : : {
86 [ # # ]: 0 : if( mpChild )
87 : 0 : return mpChild;
88 : : else
89 : 0 : return this;
90 : : }
91 : :
92 : : // -----------------------------------------------------------------------
93 : :
94 : 0 : void DialogListBox::Resize()
95 : : {
96 : 0 : Control::Resize();
97 : 0 : ImplResizeControls();
98 : 0 : ImplCheckScrollBars();
99 : 0 : }
100 : :
101 : : // -----------------------------------------------------------------------
102 : :
103 : 0 : IMPL_LINK_NOARG(DialogListBox, ScrollBarHdl)
104 : : {
105 : 0 : ImplResizeChild();
106 : 0 : return 1;
107 : : }
108 : :
109 : : // -----------------------------------------------------------------------
110 : :
111 : 0 : void DialogListBox::ImplCheckScrollBars()
112 : : {
113 : 0 : bool bArrange = false;
114 : :
115 : 0 : Size aOutSz = GetOutputSizePixel();
116 : :
117 : : // vert. ScrollBar
118 [ # # ]: 0 : if( aOutSz.Height() < maMinSize.Height() )
119 : : {
120 [ # # ]: 0 : if( !mbVScroll )
121 : 0 : bArrange = true;
122 : 0 : mbVScroll = true;
123 : : }
124 : : else
125 : : {
126 [ # # ]: 0 : if( mbVScroll )
127 : 0 : bArrange = true;
128 : 0 : mbVScroll = false;
129 : : }
130 : :
131 : : // horz. ScrollBar
132 [ # # ]: 0 : if( mbAutoHScroll )
133 : : {
134 : 0 : long nWidth = aOutSz.Width();
135 [ # # ]: 0 : if ( mbVScroll )
136 [ # # ]: 0 : nWidth -= mpVScrollBar->GetSizePixel().Width();
137 [ # # ]: 0 : if( nWidth < maMinSize.Width() )
138 : : {
139 [ # # ]: 0 : if( !mbHScroll )
140 : 0 : bArrange = true;
141 : 0 : mbHScroll = true;
142 : :
143 [ # # ]: 0 : if ( !mbVScroll )
144 : : {
145 [ # # ]: 0 : int nHeight = aOutSz.Height() - mpHScrollBar->GetSizePixel().Height();
146 [ # # ]: 0 : if( nHeight < maMinSize.Height() )
147 : : {
148 [ # # ]: 0 : if( !mbVScroll )
149 : 0 : bArrange = true;
150 : 0 : mbVScroll = true;
151 : : }
152 : : }
153 : : }
154 : : else
155 : : {
156 [ # # ]: 0 : if( mbHScroll )
157 : 0 : bArrange = true;
158 : 0 : mbHScroll = false;
159 : : }
160 : : }
161 : :
162 [ # # ]: 0 : if( bArrange )
163 [ # # ]: 0 : ImplResizeControls();
164 : :
165 [ # # ]: 0 : ImplInitScrollBars();
166 : 0 : }
167 : :
168 : : // -----------------------------------------------------------------------
169 : :
170 : 0 : void DialogListBox::ImplInitScrollBars()
171 : : {
172 [ # # ]: 0 : if( mpChild )
173 : : {
174 : 0 : Size aOutSize( GetOutputSizePixel() );
175 [ # # ][ # # ]: 0 : if( mbHScroll ) aOutSize.Height() -= mpHScrollBar->GetSizePixel().Height();
176 [ # # ][ # # ]: 0 : if( mbVScroll ) aOutSize.Width() -= mpVScrollBar->GetSizePixel().Width();
177 : :
178 [ # # ]: 0 : if ( mbVScroll )
179 : : {
180 [ # # ]: 0 : mpVScrollBar->SetRangeMax( maMinSize.Height() );
181 [ # # ]: 0 : mpVScrollBar->SetVisibleSize( aOutSize.Height() );
182 : 0 : mpVScrollBar->SetPageSize( 16 );
183 : : }
184 : :
185 [ # # ]: 0 : if ( mbHScroll )
186 : : {
187 [ # # ]: 0 : mpHScrollBar->SetRangeMax( maMinSize.Width() );
188 [ # # ]: 0 : mpHScrollBar->SetVisibleSize( aOutSize.Width() );
189 : 0 : mpHScrollBar->SetPageSize( 16 );
190 : : }
191 : : }
192 : 0 : }
193 : :
194 : : // -----------------------------------------------------------------------
195 : :
196 : 0 : void DialogListBox::ImplResizeControls()
197 : : {
198 : 0 : Size aOutSz( GetOutputSizePixel() );
199 : 0 : long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
200 [ # # ]: 0 : nSBWidth = CalcZoom( nSBWidth );
201 : :
202 : 0 : maInnerSize = aOutSz;
203 [ # # ]: 0 : if ( mbVScroll )
204 : 0 : maInnerSize.Width() -= nSBWidth;
205 [ # # ]: 0 : if ( mbHScroll )
206 : 0 : maInnerSize.Height() -= nSBWidth;
207 : :
208 : : // ScrollBarBox
209 [ # # ][ # # ]: 0 : if( mbVScroll && mbHScroll )
210 : : {
211 : 0 : Point aBoxPos( maInnerSize.Width(), maInnerSize.Height() );
212 [ # # ]: 0 : mpScrollBarBox->SetPosSizePixel( aBoxPos, Size( nSBWidth, nSBWidth ) );
213 [ # # ]: 0 : mpScrollBarBox->Show();
214 : : }
215 : : else
216 : : {
217 [ # # ]: 0 : mpScrollBarBox->Hide();
218 : : }
219 : :
220 : : // vert. ScrollBar
221 [ # # ]: 0 : if( mbVScroll )
222 : : {
223 : : // Scrollbar on left or right side?
224 : 0 : Point aVPos( aOutSz.Width() - nSBWidth, 0 );
225 [ # # ]: 0 : mpVScrollBar->SetPosSizePixel( aVPos, Size( nSBWidth, maInnerSize.Height() ) );
226 [ # # ]: 0 : mpVScrollBar->Show();
227 : : }
228 : : else
229 : : {
230 [ # # ]: 0 : mpVScrollBar->Hide();
231 : : }
232 : :
233 : : // horz. ScrollBar
234 [ # # ]: 0 : if( mbHScroll )
235 : : {
236 : 0 : Point aHPos( 0, aOutSz.Height() - nSBWidth );
237 [ # # ]: 0 : mpHScrollBar->SetPosSizePixel( aHPos, Size( maInnerSize.Width(), nSBWidth ) );
238 [ # # ]: 0 : mpHScrollBar->Show();
239 : : }
240 : : else
241 : : {
242 [ # # ]: 0 : mpHScrollBar->Hide();
243 : : }
244 : :
245 [ # # ]: 0 : ImplResizeChild();
246 : 0 : }
247 : :
248 : 0 : void DialogListBox::ImplResizeChild()
249 : : {
250 : 0 : Point aWinPos;
251 : 0 : Size aSize( maInnerSize );
252 : :
253 : : int nOffset;
254 [ # # ]: 0 : if( mbHScroll )
255 : : {
256 : 0 : nOffset = mpHScrollBar->GetThumbPos();
257 : 0 : aWinPos.X() = -nOffset;
258 : 0 : aSize.Width() += nOffset;
259 : : }
260 : :
261 [ # # ]: 0 : if( mbVScroll )
262 : : {
263 : 0 : nOffset = mpVScrollBar->GetThumbPos();
264 : 0 : aWinPos.Y() = -nOffset;
265 : 0 : aSize.Height() += nOffset;
266 : : }
267 : :
268 [ # # ]: 0 : mpChild->SetPosSizePixel( aWinPos, aSize );
269 : 0 : }
270 : :
271 : : // -----------------------------------------------------------------------
272 : :
273 : 0 : void DialogListBox::StateChanged( StateChangedType nType )
274 : : {
275 [ # # ]: 0 : if ( nType == STATE_CHANGE_INITSHOW )
276 : : {
277 : 0 : ImplCheckScrollBars();
278 : : }
279 [ # # ][ # # ]: 0 : else if ( ( nType == STATE_CHANGE_UPDATEMODE ) || ( nType == STATE_CHANGE_DATA ) )
280 : : {
281 : 0 : sal_Bool bUpdate = IsUpdateMode();
282 : 0 : mpChild->SetUpdateMode( bUpdate );
283 [ # # ][ # # ]: 0 : if ( bUpdate && IsReallyVisible() )
[ # # ]
284 : 0 : ImplCheckScrollBars();
285 : : }
286 [ # # ]: 0 : else if( nType == STATE_CHANGE_ENABLE )
287 : : {
288 : 0 : mpHScrollBar->Enable( IsEnabled() );
289 : 0 : mpVScrollBar->Enable( IsEnabled() );
290 : 0 : mpScrollBarBox->Enable( IsEnabled() );
291 : 0 : Invalidate();
292 : : }
293 [ # # ]: 0 : else if ( nType == STATE_CHANGE_ZOOM )
294 : : {
295 : 0 : mpChild->SetZoom( GetZoom() );
296 : 0 : Resize();
297 : : }
298 [ # # ]: 0 : else if ( nType == STATE_CHANGE_CONTROLFONT )
299 : : {
300 [ # # ]: 0 : mpChild->SetControlFont( GetControlFont() );
301 : : }
302 [ # # ]: 0 : else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
303 : : {
304 [ # # ]: 0 : mpChild->SetControlForeground( GetControlForeground() );
305 : : }
306 [ # # ]: 0 : else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
307 : : {
308 [ # # ]: 0 : mpChild->SetControlBackground( GetControlBackground() );
309 : : }
310 [ # # ]: 0 : else if( nType == STATE_CHANGE_VISIBLE )
311 : : {
312 : 0 : mpChild->Show( IsVisible() );
313 : : }
314 : :
315 : 0 : Control::StateChanged( nType );
316 : 0 : }
317 : :
318 : : // -----------------------------------------------------------------------
319 : :
320 : 0 : long DialogListBox::Notify( NotifyEvent& rNEvt )
321 : : {
322 : 0 : long nDone = 0;
323 [ # # ]: 0 : if ( rNEvt.GetType() == EVENT_COMMAND )
324 : : {
325 : 0 : const CommandEvent& rCEvt = *rNEvt.GetCommandEvent();
326 [ # # ]: 0 : if ( rCEvt.GetCommand() == COMMAND_WHEEL )
327 : : {
328 : 0 : const CommandWheelData* pData = rCEvt.GetWheelData();
329 [ # # ][ # # ]: 0 : if( !pData->GetModifier() && ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) )
[ # # ]
330 : : {
331 : 0 : nDone = HandleScrollCommand( rCEvt, mpHScrollBar, mpVScrollBar );
332 : : }
333 : : }
334 : : }
335 : :
336 [ # # ]: 0 : return nDone ? nDone : Window::Notify( rNEvt );
337 : : }
338 : :
339 : : } // namespace sd
340 : :
341 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|