Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <tools/rc.h>
21 : #include <tools/poly.hxx>
22 :
23 : #include <vcl/event.hxx>
24 : #include <vcl/split.hxx>
25 : #include <vcl/svapp.hxx>
26 : #include <vcl/syswin.hxx>
27 : #include <vcl/taskpanelist.hxx>
28 : #include <vcl/gradient.hxx>
29 : #include <vcl/lineinfo.hxx>
30 : #include <vcl/settings.hxx>
31 :
32 : #include <rtl/instance.hxx>
33 :
34 : #include <window.h>
35 :
36 : namespace
37 : {
38 : struct ImplBlackWall
39 : : public rtl::StaticWithInit<Wallpaper, ImplBlackWall> {
40 0 : Wallpaper operator () () {
41 0 : return Wallpaper(COL_BLACK);
42 : }
43 : };
44 : struct ImplWhiteWall
45 : : public rtl::StaticWithInit<Wallpaper, ImplWhiteWall> {
46 0 : Wallpaper operator () () {
47 0 : return Wallpaper(COL_LIGHTGRAY);
48 : }
49 : };
50 : }
51 :
52 0 : void Splitter::ImplInitSplitterData()
53 : {
54 0 : ImplGetWindowImpl()->mbSplitter = true;
55 0 : mpRefWin = NULL;
56 0 : mnSplitPos = 0;
57 0 : mnLastSplitPos = 0;
58 0 : mnStartSplitPos = 0;
59 0 : mbDragFull = false;
60 0 : mbKbdSplitting = false;
61 0 : mbInKeyEvent = 0;
62 0 : mnKeyboardStepSize = SPLITTER_DEFAULTSTEPSIZE;
63 0 : }
64 :
65 : // Should only be called from a ImplInit method for initialization or
66 : // after checking bNew is different from the current mbHorzSplit value.
67 : // The public method that does that check is Splitter::SetHorizontal().
68 0 : void Splitter::ImplInitHorVer(bool bNew)
69 : {
70 0 : mbHorzSplit = bNew;
71 :
72 : PointerStyle ePointerStyle;
73 0 : const StyleSettings& rSettings = GetSettings().GetStyleSettings();
74 :
75 0 : if ( mbHorzSplit )
76 : {
77 0 : ePointerStyle = POINTER_HSPLIT;
78 0 : SetSizePixel( Size( rSettings.GetSplitSize(), rSettings.GetScrollBarSize() ) );
79 : }
80 : else
81 : {
82 0 : ePointerStyle = POINTER_VSPLIT;
83 0 : SetSizePixel( Size( rSettings.GetScrollBarSize(), rSettings.GetSplitSize() ) );
84 : }
85 :
86 0 : SetPointer( Pointer( ePointerStyle ) );
87 0 : }
88 :
89 0 : void Splitter::ImplInit( Window* pParent, WinBits nWinStyle )
90 : {
91 0 : Window::ImplInit( pParent, nWinStyle, NULL );
92 :
93 0 : mpRefWin = pParent;
94 :
95 0 : ImplInitHorVer(nWinStyle & WB_HSCROLL);
96 :
97 0 : if( GetSettings().GetStyleSettings().GetFaceColor().IsDark() )
98 0 : SetBackground( ImplWhiteWall::get() );
99 : else
100 0 : SetBackground( ImplBlackWall::get() );
101 :
102 0 : TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList();
103 0 : pTList->AddWindow( this );
104 0 : }
105 :
106 0 : void Splitter::ImplSplitMousePos( Point& rPos )
107 : {
108 0 : if ( mbHorzSplit )
109 : {
110 0 : if ( rPos.X() > maDragRect.Right()-1 )
111 0 : rPos.X() = maDragRect.Right()-1;
112 0 : if ( rPos.X() < maDragRect.Left()+1 )
113 0 : rPos.X() = maDragRect.Left()+1;
114 : }
115 : else
116 : {
117 0 : if ( rPos.Y() > maDragRect.Bottom()-1 )
118 0 : rPos.Y() = maDragRect.Bottom()-1;
119 0 : if ( rPos.Y() < maDragRect.Top()+1 )
120 0 : rPos.Y() = maDragRect.Top()+1;
121 : }
122 0 : }
123 :
124 0 : void Splitter::ImplDrawSplitter()
125 : {
126 0 : Rectangle aInvRect( maDragRect );
127 :
128 0 : if ( mbHorzSplit )
129 : {
130 0 : aInvRect.Left() = maDragPos.X() - 1;
131 0 : aInvRect.Right() = maDragPos.X() + 1;
132 : }
133 : else
134 : {
135 0 : aInvRect.Top() = maDragPos.Y() - 1;
136 0 : aInvRect.Bottom() = maDragPos.Y() + 1;
137 : }
138 :
139 0 : mpRefWin->InvertTracking( mpRefWin->PixelToLogic(aInvRect), SHOWTRACK_SPLIT );
140 0 : }
141 :
142 0 : Splitter::Splitter( Window* pParent, WinBits nStyle ) :
143 0 : Window( WINDOW_SPLITTER )
144 : {
145 0 : ImplInitSplitterData();
146 0 : ImplInit( pParent, nStyle );
147 :
148 0 : SetLineColor();
149 0 : SetFillColor();
150 0 : }
151 :
152 0 : Splitter::Splitter( Window* pParent, const ResId& rResId ) :
153 0 : Window( WINDOW_SPLITTER )
154 : {
155 0 : ImplInitSplitterData();
156 0 : rResId.SetRT( RSC_SPLITTER );
157 0 : WinBits nStyle = ImplInitRes( rResId );
158 0 : ImplInit( pParent, nStyle );
159 0 : ImplLoadRes( rResId );
160 :
161 0 : SetLineColor();
162 0 : SetFillColor();
163 :
164 0 : if ( !(nStyle & WB_HIDE) )
165 0 : Show();
166 0 : }
167 :
168 0 : Splitter::~Splitter()
169 : {
170 0 : TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList();
171 0 : pTList->RemoveWindow( this );
172 0 : }
173 :
174 0 : void Splitter::SetHorizontal(bool bNew)
175 : {
176 0 : if(bNew != (bool)mbHorzSplit)
177 : {
178 0 : ImplInitHorVer(bNew);
179 : }
180 0 : }
181 :
182 0 : void Splitter::SetKeyboardStepSize( long nStepSize )
183 : {
184 0 : mnKeyboardStepSize = nStepSize;
185 0 : }
186 :
187 0 : Splitter* Splitter::ImplFindSibling()
188 : {
189 : // look for another splitter with the same parent but different orientation
190 0 : Window *pWin = GetParent()->GetWindow( WINDOW_FIRSTCHILD );
191 0 : Splitter *pSplitter = NULL;
192 0 : while( pWin )
193 : {
194 0 : if( pWin->ImplIsSplitter() )
195 : {
196 0 : pSplitter = (Splitter*) pWin;
197 0 : if( pSplitter != this && IsHorizontal() != pSplitter->IsHorizontal() )
198 0 : return pSplitter;
199 : }
200 0 : pWin = pWin->GetWindow( WINDOW_NEXT );
201 : }
202 0 : return NULL;
203 : }
204 :
205 0 : bool Splitter::ImplSplitterActive()
206 : {
207 : // is splitter in document or at scrollbar handle ?
208 :
209 0 : bool bActive = true;
210 0 : const StyleSettings& rSettings = GetSettings().GetStyleSettings();
211 0 : long nA = rSettings.GetScrollBarSize();
212 0 : long nB = rSettings.GetSplitSize();
213 :
214 0 : Size aSize = GetOutputSize();
215 0 : if ( mbHorzSplit )
216 : {
217 0 : if( aSize.Width() == nB && aSize.Height() == nA )
218 0 : bActive = false;
219 : }
220 : else
221 : {
222 0 : if( aSize.Width() == nA && aSize.Height() == nB )
223 0 : bActive = false;
224 : }
225 0 : return bActive;
226 : }
227 :
228 0 : void Splitter::MouseButtonDown( const MouseEvent& rMEvt )
229 : {
230 0 : if ( rMEvt.GetClicks() == 2 )
231 : {
232 0 : if ( mnLastSplitPos != mnSplitPos )
233 : {
234 0 : StartSplit();
235 0 : Point aPos = rMEvt.GetPosPixel();
236 0 : if ( mbHorzSplit )
237 0 : aPos.X() = mnLastSplitPos;
238 : else
239 0 : aPos.Y() = mnLastSplitPos;
240 0 : ImplSplitMousePos( aPos );
241 0 : Splitting( aPos );
242 0 : ImplSplitMousePos( aPos );
243 0 : long nTemp = mnSplitPos;
244 0 : if ( mbHorzSplit )
245 0 : SetSplitPosPixel( aPos.X() );
246 : else
247 0 : SetSplitPosPixel( aPos.Y() );
248 0 : mnLastSplitPos = nTemp;
249 0 : Split();
250 0 : EndSplit();
251 : }
252 : }
253 : else
254 0 : StartDrag();
255 0 : }
256 :
257 0 : void Splitter::Tracking( const TrackingEvent& rTEvt )
258 : {
259 0 : if ( rTEvt.IsTrackingEnded() )
260 : {
261 0 : if ( !mbDragFull )
262 0 : ImplDrawSplitter();
263 :
264 0 : if ( !rTEvt.IsTrackingCanceled() )
265 : {
266 : long nNewPos;
267 0 : if ( mbHorzSplit )
268 0 : nNewPos = maDragPos.X();
269 : else
270 0 : nNewPos = maDragPos.Y();
271 0 : if ( nNewPos != mnStartSplitPos )
272 : {
273 0 : SetSplitPosPixel( nNewPos );
274 0 : mnLastSplitPos = 0;
275 0 : Split();
276 : }
277 0 : EndSplit();
278 : }
279 0 : else if ( mbDragFull )
280 : {
281 0 : SetSplitPosPixel( mnStartSplitPos );
282 0 : Split();
283 : }
284 0 : mnStartSplitPos = 0;
285 : }
286 : else
287 : {
288 : //Point aNewPos = mpRefWin->ScreenToOutputPixel( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
289 0 : Point aNewPos = mpRefWin->NormalizedScreenToOutputPixel( OutputToNormalizedScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
290 0 : ImplSplitMousePos( aNewPos );
291 0 : Splitting( aNewPos );
292 0 : ImplSplitMousePos( aNewPos );
293 :
294 0 : if ( mbHorzSplit )
295 : {
296 0 : if ( aNewPos.X() == maDragPos.X() )
297 0 : return;
298 : }
299 : else
300 : {
301 0 : if ( aNewPos.Y() == maDragPos.Y() )
302 0 : return;
303 : }
304 :
305 0 : if ( mbDragFull )
306 : {
307 0 : maDragPos = aNewPos;
308 : long nNewPos;
309 0 : if ( mbHorzSplit )
310 0 : nNewPos = maDragPos.X();
311 : else
312 0 : nNewPos = maDragPos.Y();
313 0 : if ( nNewPos != mnSplitPos )
314 : {
315 0 : SetSplitPosPixel( nNewPos );
316 0 : mnLastSplitPos = 0;
317 0 : Split();
318 : }
319 :
320 0 : GetParent()->Update();
321 : }
322 : else
323 : {
324 0 : ImplDrawSplitter();
325 0 : maDragPos = aNewPos;
326 0 : ImplDrawSplitter();
327 : }
328 : }
329 : }
330 :
331 0 : void Splitter::ImplKbdTracking( KeyCode aKeyCode )
332 : {
333 0 : sal_uInt16 nCode = aKeyCode.GetCode();
334 0 : if ( nCode == KEY_ESCAPE || nCode == KEY_RETURN )
335 : {
336 0 : if( !mbKbdSplitting )
337 0 : return;
338 : else
339 0 : mbKbdSplitting = false;
340 :
341 0 : if ( nCode != KEY_ESCAPE )
342 : {
343 : long nNewPos;
344 0 : if ( mbHorzSplit )
345 0 : nNewPos = maDragPos.X();
346 : else
347 0 : nNewPos = maDragPos.Y();
348 0 : if ( nNewPos != mnStartSplitPos )
349 : {
350 0 : SetSplitPosPixel( nNewPos );
351 0 : mnLastSplitPos = 0;
352 0 : Split();
353 : }
354 : }
355 : else
356 : {
357 0 : SetSplitPosPixel( mnStartSplitPos );
358 0 : Split();
359 0 : EndSplit();
360 : }
361 0 : mnStartSplitPos = 0;
362 : }
363 : else
364 : {
365 0 : Point aNewPos;
366 0 : Size aSize = mpRefWin->GetOutputSize();
367 0 : Point aPos = GetPosPixel();
368 : // depending on the position calc allows continuous moves or snaps to row/columns
369 : // continuous mode is active when position is at the origin or end of the splitter
370 : // otherwise snap mode is active
371 : // default here is snap, holding shift sets continuous mode
372 0 : if( mbHorzSplit )
373 0 : aNewPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aKeyCode.IsShift() ? 0 : aSize.Height()/2);
374 : else
375 0 : aNewPos = Point( aKeyCode.IsShift() ? 0 : aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
376 :
377 0 : Point aOldWindowPos = GetPosPixel();
378 :
379 0 : int maxiter = 500; // avoid endless loop
380 0 : int delta=0;
381 0 : int delta_step = mbHorzSplit ? aSize.Width()/10 : aSize.Height()/10;
382 :
383 : // use the specified step size if it was set
384 0 : if( mnKeyboardStepSize != SPLITTER_DEFAULTSTEPSIZE )
385 0 : delta_step = mnKeyboardStepSize;
386 :
387 0 : while( maxiter-- && aOldWindowPos == GetPosPixel() )
388 : {
389 : // inc/dec position until application performs changes
390 : // thus a single key press really moves the splitter
391 0 : if( aKeyCode.IsShift() )
392 0 : delta++;
393 : else
394 0 : delta += delta_step;
395 :
396 0 : switch( nCode )
397 : {
398 : case KEY_LEFT:
399 0 : aNewPos.X()-=delta;
400 0 : break;
401 : case KEY_RIGHT:
402 0 : aNewPos.X()+=delta;
403 0 : break;
404 : case KEY_UP:
405 0 : aNewPos.Y()-=delta;
406 0 : break;
407 : case KEY_DOWN:
408 0 : aNewPos.Y()+=delta;
409 0 : break;
410 : default:
411 0 : maxiter = 0; // leave loop
412 0 : break;
413 : }
414 0 : ImplSplitMousePos( aNewPos );
415 0 : Splitting( aNewPos );
416 0 : ImplSplitMousePos( aNewPos );
417 :
418 0 : if ( mbHorzSplit )
419 : {
420 0 : if ( aNewPos.X() == maDragPos.X() )
421 0 : continue;
422 : }
423 : else
424 : {
425 0 : if ( aNewPos.Y() == maDragPos.Y() )
426 0 : continue;
427 : }
428 :
429 0 : maDragPos = aNewPos;
430 : long nNewPos;
431 0 : if ( mbHorzSplit )
432 0 : nNewPos = maDragPos.X();
433 : else
434 0 : nNewPos = maDragPos.Y();
435 0 : if ( nNewPos != mnSplitPos )
436 : {
437 0 : SetSplitPosPixel( nNewPos );
438 0 : mnLastSplitPos = 0;
439 0 : Split();
440 : }
441 0 : GetParent()->Update();
442 : }
443 : }
444 : }
445 :
446 0 : void Splitter::StartSplit()
447 : {
448 0 : maStartSplitHdl.Call( this );
449 0 : }
450 :
451 0 : void Splitter::Split()
452 : {
453 0 : maSplitHdl.Call( this );
454 0 : }
455 :
456 0 : void Splitter::EndSplit()
457 : {
458 0 : if ( maEndSplitHdl.IsSet() )
459 0 : maEndSplitHdl.Call( this );
460 0 : }
461 :
462 0 : void Splitter::Splitting( Point& /* rSplitPos */ )
463 : {
464 0 : }
465 :
466 0 : void Splitter::SetDragRectPixel( const Rectangle& rDragRect, Window* _pRefWin )
467 : {
468 0 : maDragRect = rDragRect;
469 0 : if ( !_pRefWin )
470 0 : mpRefWin = GetParent();
471 : else
472 0 : mpRefWin = _pRefWin;
473 0 : }
474 :
475 0 : void Splitter::SetSplitPosPixel( long nNewPos )
476 : {
477 0 : mnSplitPos = nNewPos;
478 0 : }
479 :
480 0 : void Splitter::StartDrag()
481 : {
482 0 : if ( IsTracking() )
483 0 : return;
484 :
485 0 : StartSplit();
486 :
487 : // Tracking starten
488 0 : StartTracking();
489 :
490 : // Start-Positon ermitteln
491 0 : maDragPos = mpRefWin->GetPointerPosPixel();
492 0 : ImplSplitMousePos( maDragPos );
493 0 : Splitting( maDragPos );
494 0 : ImplSplitMousePos( maDragPos );
495 0 : if ( mbHorzSplit )
496 0 : mnStartSplitPos = maDragPos.X();
497 : else
498 0 : mnStartSplitPos = maDragPos.Y();
499 :
500 0 : mbDragFull = (Application::GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SPLIT) != 0;
501 0 : if ( !mbDragFull )
502 0 : ImplDrawSplitter();
503 : }
504 :
505 0 : void Splitter::ImplStartKbdSplitting()
506 : {
507 0 : if( mbKbdSplitting )
508 0 : return;
509 :
510 0 : mbKbdSplitting = true;
511 :
512 0 : StartSplit();
513 :
514 : // determine start position
515 : // because we have no mouse position we take either the position
516 : // of the splitter window or the last split position
517 : // the other coordinate is just the center of the reference window
518 0 : Size aSize = mpRefWin->GetOutputSize();
519 0 : Point aPos = GetPosPixel();
520 0 : if( mbHorzSplit )
521 0 : maDragPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aSize.Height()/2 );
522 : else
523 0 : maDragPos = Point( aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
524 0 : ImplSplitMousePos( maDragPos );
525 0 : Splitting( maDragPos );
526 0 : ImplSplitMousePos( maDragPos );
527 0 : if ( mbHorzSplit )
528 0 : mnStartSplitPos = maDragPos.X();
529 : else
530 0 : mnStartSplitPos = maDragPos.Y();
531 : }
532 :
533 0 : void Splitter::ImplRestoreSplitter()
534 : {
535 : // set splitter in the center of the ref window
536 0 : StartSplit();
537 0 : Size aSize = mpRefWin->GetOutputSize();
538 0 : Point aPos = Point( aSize.Width()/2 , aSize.Height()/2);
539 0 : if ( mnLastSplitPos != mnSplitPos && mnLastSplitPos > 5 )
540 : {
541 : // restore last pos if it was a useful position (>5)
542 0 : if ( mbHorzSplit )
543 0 : aPos.X() = mnLastSplitPos;
544 : else
545 0 : aPos.Y() = mnLastSplitPos;
546 : }
547 :
548 0 : ImplSplitMousePos( aPos );
549 0 : Splitting( aPos );
550 0 : ImplSplitMousePos( aPos );
551 0 : long nTemp = mnSplitPos;
552 0 : if ( mbHorzSplit )
553 0 : SetSplitPosPixel( aPos.X() );
554 : else
555 0 : SetSplitPosPixel( aPos.Y() );
556 0 : mnLastSplitPos = nTemp;
557 0 : Split();
558 0 : EndSplit();
559 0 : }
560 :
561 0 : void Splitter::GetFocus()
562 : {
563 0 : if( !ImplSplitterActive() )
564 0 : ImplRestoreSplitter();
565 :
566 0 : Invalidate();
567 0 : }
568 :
569 0 : void Splitter::LoseFocus()
570 : {
571 0 : if( mbKbdSplitting )
572 : {
573 0 : KeyCode aReturnKey( KEY_RETURN );
574 0 : ImplKbdTracking( aReturnKey );
575 0 : mbKbdSplitting = false;
576 : }
577 0 : Invalidate();
578 0 : }
579 :
580 0 : void Splitter::KeyInput( const KeyEvent& rKEvt )
581 : {
582 0 : if( mbInKeyEvent )
583 0 : return;
584 :
585 0 : mbInKeyEvent = 1;
586 :
587 0 : Splitter *pSibling = ImplFindSibling();
588 0 : KeyCode aKeyCode = rKEvt.GetKeyCode();
589 0 : sal_uInt16 nCode = aKeyCode.GetCode();
590 0 : switch ( nCode )
591 : {
592 : case KEY_UP:
593 : case KEY_DOWN:
594 0 : if( !mbHorzSplit )
595 : {
596 0 : ImplStartKbdSplitting();
597 0 : ImplKbdTracking( aKeyCode );
598 : }
599 : else
600 : {
601 0 : if( pSibling )
602 : {
603 0 : pSibling->GrabFocus();
604 0 : pSibling->KeyInput( rKEvt );
605 : }
606 : }
607 0 : break;
608 : case KEY_RIGHT:
609 : case KEY_LEFT:
610 0 : if( mbHorzSplit )
611 : {
612 0 : ImplStartKbdSplitting();
613 0 : ImplKbdTracking( aKeyCode );
614 : }
615 : else
616 : {
617 0 : if( pSibling )
618 : {
619 0 : pSibling->GrabFocus();
620 0 : pSibling->KeyInput( rKEvt );
621 : }
622 : }
623 0 : break;
624 :
625 : case KEY_DELETE:
626 0 : if( ImplSplitterActive() )
627 : {
628 0 : if( mbKbdSplitting )
629 : {
630 0 : KeyCode aKey( KEY_ESCAPE );
631 0 : ImplKbdTracking( aKey );
632 : }
633 :
634 0 : StartSplit();
635 0 : Point aPos;
636 0 : if ( mbHorzSplit )
637 0 : aPos.X() = 0;
638 : else
639 0 : aPos.Y() = 0;
640 0 : ImplSplitMousePos( aPos );
641 0 : Splitting( aPos );
642 0 : ImplSplitMousePos( aPos );
643 0 : long nTemp = mnSplitPos;
644 0 : if ( mbHorzSplit )
645 0 : SetSplitPosPixel( aPos.X() );
646 : else
647 0 : SetSplitPosPixel( aPos.Y() );
648 0 : mnLastSplitPos = nTemp;
649 0 : Split();
650 0 : EndSplit();
651 :
652 : // Shift-Del deletes both splitters
653 0 : if( aKeyCode.IsShift() && pSibling )
654 0 : pSibling->KeyInput( rKEvt );
655 :
656 0 : GrabFocusToDocument();
657 : }
658 0 : break;
659 :
660 : case KEY_ESCAPE:
661 0 : if( mbKbdSplitting )
662 0 : ImplKbdTracking( aKeyCode );
663 : else
664 0 : GrabFocusToDocument();
665 0 : break;
666 :
667 : case KEY_RETURN:
668 0 : ImplKbdTracking( aKeyCode );
669 0 : GrabFocusToDocument();
670 0 : break;
671 : default: // let any key input fix the splitter
672 0 : Window::KeyInput( rKEvt );
673 0 : GrabFocusToDocument();
674 0 : break;
675 : }
676 0 : mbInKeyEvent = 0;
677 : }
678 :
679 0 : bool Splitter::Notify( NotifyEvent& rNEvt )
680 : {
681 0 : return Window::Notify( rNEvt );
682 : }
683 :
684 0 : void Splitter::DataChanged( const DataChangedEvent& rDCEvt )
685 : {
686 0 : Window::DataChanged( rDCEvt );
687 0 : if( rDCEvt.GetType() == DATACHANGED_SETTINGS )
688 : {
689 0 : const AllSettings* pOldSettings = rDCEvt.GetOldSettings();
690 0 : if(!pOldSettings)
691 0 : return;
692 :
693 0 : Color oldFaceColor = pOldSettings->GetStyleSettings().GetFaceColor();
694 0 : Color newFaceColor = Application::GetSettings().GetStyleSettings().GetFaceColor();
695 0 : if( oldFaceColor.IsDark() != newFaceColor.IsDark() )
696 : {
697 0 : if( newFaceColor.IsDark() )
698 0 : SetBackground( ImplWhiteWall::get() );
699 : else
700 0 : SetBackground( ImplBlackWall::get() );
701 : }
702 : }
703 : }
704 :
705 0 : void Splitter::Paint( const Rectangle& rPaintRect )
706 : {
707 0 : DrawRect( rPaintRect );
708 :
709 0 : Polygon aPoly( rPaintRect );
710 0 : PolyPolygon aPolyPoly( aPoly );
711 0 : DrawTransparent( aPolyPoly, 85 );
712 :
713 0 : if( mbKbdSplitting )
714 : {
715 0 : LineInfo aInfo( LINE_DASH );
716 : //aInfo.SetDashLen( 2 );
717 : //aInfo.SetDashCount( 1 );
718 0 : aInfo.SetDistance( 1 );
719 0 : aInfo.SetDotLen( 2 );
720 0 : aInfo.SetDotCount( 3 );
721 :
722 0 : DrawPolyLine( aPoly, aInfo );
723 : }
724 : else
725 : {
726 0 : DrawRect( rPaintRect );
727 0 : }
728 0 : }
729 :
730 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|