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 51 : Wallpaper operator () () {
41 51 : 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 704 : void Splitter::ImplInitSplitterData()
53 : {
54 704 : ImplGetWindowImpl()->mbSplitter = true;
55 704 : mpRefWin = NULL;
56 704 : mnSplitPos = 0;
57 704 : mnLastSplitPos = 0;
58 704 : mnStartSplitPos = 0;
59 704 : mbDragFull = false;
60 704 : mbKbdSplitting = false;
61 704 : mbInKeyEvent = 0;
62 704 : mnKeyboardStepSize = SPLITTER_DEFAULTSTEPSIZE;
63 704 : }
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 704 : void Splitter::ImplInitHorVer(bool bNew)
69 : {
70 704 : mbHorzSplit = bNew;
71 :
72 : PointerStyle ePointerStyle;
73 704 : const StyleSettings& rSettings = GetSettings().GetStyleSettings();
74 :
75 704 : if ( mbHorzSplit )
76 : {
77 349 : ePointerStyle = PointerStyle::HSplit;
78 349 : SetSizePixel( Size( rSettings.GetSplitSize(), rSettings.GetScrollBarSize() ) );
79 : }
80 : else
81 : {
82 355 : ePointerStyle = PointerStyle::VSplit;
83 355 : SetSizePixel( Size( rSettings.GetScrollBarSize(), rSettings.GetSplitSize() ) );
84 : }
85 :
86 704 : SetPointer( Pointer( ePointerStyle ) );
87 704 : }
88 :
89 704 : void Splitter::ImplInit( vcl::Window* pParent, WinBits nWinStyle )
90 : {
91 704 : Window::ImplInit( pParent, nWinStyle, NULL );
92 :
93 704 : mpRefWin = pParent;
94 :
95 704 : ImplInitHorVer(nWinStyle & WB_HSCROLL);
96 :
97 704 : if( GetSettings().GetStyleSettings().GetFaceColor().IsDark() )
98 0 : SetBackground( ImplWhiteWall::get() );
99 : else
100 704 : SetBackground( ImplBlackWall::get() );
101 :
102 704 : TaskPaneList *pTList = GetSystemWindow()->GetTaskPaneList();
103 704 : pTList->AddWindow( this );
104 704 : }
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 704 : Splitter::Splitter( vcl::Window* pParent, WinBits nStyle ) :
143 704 : Window( WINDOW_SPLITTER )
144 : {
145 704 : ImplInitSplitterData();
146 704 : ImplInit( pParent, nStyle );
147 :
148 704 : SetLineColor();
149 704 : SetFillColor();
150 704 : }
151 :
152 1398 : Splitter::~Splitter()
153 : {
154 696 : disposeOnce();
155 702 : }
156 :
157 696 : void Splitter::dispose()
158 : {
159 696 : SystemWindow *pSysWin = GetSystemWindow();
160 696 : if(pSysWin)
161 : {
162 696 : TaskPaneList *pTList = pSysWin->GetTaskPaneList();
163 696 : pTList->RemoveWindow(this);
164 : }
165 696 : mpRefWin.clear();
166 696 : Window::dispose();
167 696 : }
168 :
169 0 : void Splitter::SetHorizontal(bool bNew)
170 : {
171 0 : if(bNew != (bool)mbHorzSplit)
172 : {
173 0 : ImplInitHorVer(bNew);
174 : }
175 0 : }
176 :
177 696 : void Splitter::SetKeyboardStepSize( long nStepSize )
178 : {
179 696 : mnKeyboardStepSize = nStepSize;
180 696 : }
181 :
182 0 : Splitter* Splitter::ImplFindSibling()
183 : {
184 : // look for another splitter with the same parent but different orientation
185 0 : vcl::Window *pWin = GetParent()->GetWindow( GetWindowType::FirstChild );
186 0 : Splitter *pSplitter = NULL;
187 0 : while( pWin )
188 : {
189 0 : if( pWin->ImplIsSplitter() )
190 : {
191 0 : pSplitter = static_cast<Splitter*>(pWin);
192 0 : if( pSplitter != this && IsHorizontal() != pSplitter->IsHorizontal() )
193 0 : return pSplitter;
194 : }
195 0 : pWin = pWin->GetWindow( GetWindowType::Next );
196 : }
197 0 : return NULL;
198 : }
199 :
200 0 : bool Splitter::ImplSplitterActive()
201 : {
202 : // is splitter in document or at scrollbar handle ?
203 :
204 0 : bool bActive = true;
205 0 : const StyleSettings& rSettings = GetSettings().GetStyleSettings();
206 0 : long nA = rSettings.GetScrollBarSize();
207 0 : long nB = rSettings.GetSplitSize();
208 :
209 0 : Size aSize = GetOutputSize();
210 0 : if ( mbHorzSplit )
211 : {
212 0 : if( aSize.Width() == nB && aSize.Height() == nA )
213 0 : bActive = false;
214 : }
215 : else
216 : {
217 0 : if( aSize.Width() == nA && aSize.Height() == nB )
218 0 : bActive = false;
219 : }
220 0 : return bActive;
221 : }
222 :
223 0 : void Splitter::MouseButtonDown( const MouseEvent& rMEvt )
224 : {
225 0 : if ( rMEvt.GetClicks() == 2 )
226 : {
227 0 : if ( mnLastSplitPos != mnSplitPos )
228 : {
229 0 : StartSplit();
230 0 : Point aPos = rMEvt.GetPosPixel();
231 0 : if ( mbHorzSplit )
232 0 : aPos.X() = mnLastSplitPos;
233 : else
234 0 : aPos.Y() = mnLastSplitPos;
235 0 : ImplSplitMousePos( aPos );
236 0 : Splitting( aPos );
237 0 : ImplSplitMousePos( aPos );
238 0 : long nTemp = mnSplitPos;
239 0 : if ( mbHorzSplit )
240 0 : SetSplitPosPixel( aPos.X() );
241 : else
242 0 : SetSplitPosPixel( aPos.Y() );
243 0 : mnLastSplitPos = nTemp;
244 0 : Split();
245 0 : EndSplit();
246 : }
247 : }
248 : else
249 0 : StartDrag();
250 0 : }
251 :
252 0 : void Splitter::Tracking( const TrackingEvent& rTEvt )
253 : {
254 0 : if ( rTEvt.IsTrackingEnded() )
255 : {
256 0 : if ( !mbDragFull )
257 0 : ImplDrawSplitter();
258 :
259 0 : if ( !rTEvt.IsTrackingCanceled() )
260 : {
261 : long nNewPos;
262 0 : if ( mbHorzSplit )
263 0 : nNewPos = maDragPos.X();
264 : else
265 0 : nNewPos = maDragPos.Y();
266 0 : if ( nNewPos != mnStartSplitPos )
267 : {
268 0 : SetSplitPosPixel( nNewPos );
269 0 : mnLastSplitPos = 0;
270 0 : Split();
271 : }
272 0 : EndSplit();
273 : }
274 0 : else if ( mbDragFull )
275 : {
276 0 : SetSplitPosPixel( mnStartSplitPos );
277 0 : Split();
278 : }
279 0 : mnStartSplitPos = 0;
280 : }
281 : else
282 : {
283 : //Point aNewPos = mpRefWin->ScreenToOutputPixel( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
284 0 : Point aNewPos = mpRefWin->NormalizedScreenToOutputPixel( OutputToNormalizedScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
285 0 : ImplSplitMousePos( aNewPos );
286 0 : Splitting( aNewPos );
287 0 : ImplSplitMousePos( aNewPos );
288 :
289 0 : if ( mbHorzSplit )
290 : {
291 0 : if ( aNewPos.X() == maDragPos.X() )
292 0 : return;
293 : }
294 : else
295 : {
296 0 : if ( aNewPos.Y() == maDragPos.Y() )
297 0 : return;
298 : }
299 :
300 0 : if ( mbDragFull )
301 : {
302 0 : maDragPos = aNewPos;
303 : long nNewPos;
304 0 : if ( mbHorzSplit )
305 0 : nNewPos = maDragPos.X();
306 : else
307 0 : nNewPos = maDragPos.Y();
308 0 : if ( nNewPos != mnSplitPos )
309 : {
310 0 : SetSplitPosPixel( nNewPos );
311 0 : mnLastSplitPos = 0;
312 0 : Split();
313 : }
314 :
315 0 : GetParent()->Update();
316 : }
317 : else
318 : {
319 0 : ImplDrawSplitter();
320 0 : maDragPos = aNewPos;
321 0 : ImplDrawSplitter();
322 : }
323 : }
324 : }
325 :
326 0 : void Splitter::ImplKbdTracking( vcl::KeyCode aKeyCode )
327 : {
328 0 : sal_uInt16 nCode = aKeyCode.GetCode();
329 0 : if ( nCode == KEY_ESCAPE || nCode == KEY_RETURN )
330 : {
331 0 : if( !mbKbdSplitting )
332 0 : return;
333 : else
334 0 : mbKbdSplitting = false;
335 :
336 0 : if ( nCode != KEY_ESCAPE )
337 : {
338 : long nNewPos;
339 0 : if ( mbHorzSplit )
340 0 : nNewPos = maDragPos.X();
341 : else
342 0 : nNewPos = maDragPos.Y();
343 0 : if ( nNewPos != mnStartSplitPos )
344 : {
345 0 : SetSplitPosPixel( nNewPos );
346 0 : mnLastSplitPos = 0;
347 0 : Split();
348 : }
349 : }
350 : else
351 : {
352 0 : SetSplitPosPixel( mnStartSplitPos );
353 0 : Split();
354 0 : EndSplit();
355 : }
356 0 : mnStartSplitPos = 0;
357 : }
358 : else
359 : {
360 0 : Point aNewPos;
361 0 : Size aSize = mpRefWin->GetOutputSize();
362 0 : Point aPos = GetPosPixel();
363 : // depending on the position calc allows continuous moves or snaps to row/columns
364 : // continuous mode is active when position is at the origin or end of the splitter
365 : // otherwise snap mode is active
366 : // default here is snap, holding shift sets continuous mode
367 0 : if( mbHorzSplit )
368 0 : aNewPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aKeyCode.IsShift() ? 0 : aSize.Height()/2);
369 : else
370 0 : aNewPos = Point( aKeyCode.IsShift() ? 0 : aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
371 :
372 0 : Point aOldWindowPos = GetPosPixel();
373 :
374 0 : int maxiter = 500; // avoid endless loop
375 0 : int delta=0;
376 0 : int delta_step = mbHorzSplit ? aSize.Width()/10 : aSize.Height()/10;
377 :
378 : // use the specified step size if it was set
379 0 : if( mnKeyboardStepSize != SPLITTER_DEFAULTSTEPSIZE )
380 0 : delta_step = mnKeyboardStepSize;
381 :
382 0 : while( maxiter-- && aOldWindowPos == GetPosPixel() )
383 : {
384 : // inc/dec position until application performs changes
385 : // thus a single key press really moves the splitter
386 0 : if( aKeyCode.IsShift() )
387 0 : delta++;
388 : else
389 0 : delta += delta_step;
390 :
391 0 : switch( nCode )
392 : {
393 : case KEY_LEFT:
394 0 : aNewPos.X()-=delta;
395 0 : break;
396 : case KEY_RIGHT:
397 0 : aNewPos.X()+=delta;
398 0 : break;
399 : case KEY_UP:
400 0 : aNewPos.Y()-=delta;
401 0 : break;
402 : case KEY_DOWN:
403 0 : aNewPos.Y()+=delta;
404 0 : break;
405 : default:
406 0 : maxiter = 0; // leave loop
407 0 : break;
408 : }
409 0 : ImplSplitMousePos( aNewPos );
410 0 : Splitting( aNewPos );
411 0 : ImplSplitMousePos( aNewPos );
412 :
413 0 : if ( mbHorzSplit )
414 : {
415 0 : if ( aNewPos.X() == maDragPos.X() )
416 0 : continue;
417 : }
418 : else
419 : {
420 0 : if ( aNewPos.Y() == maDragPos.Y() )
421 0 : continue;
422 : }
423 :
424 0 : maDragPos = aNewPos;
425 : long nNewPos;
426 0 : if ( mbHorzSplit )
427 0 : nNewPos = maDragPos.X();
428 : else
429 0 : nNewPos = maDragPos.Y();
430 0 : if ( nNewPos != mnSplitPos )
431 : {
432 0 : SetSplitPosPixel( nNewPos );
433 0 : mnLastSplitPos = 0;
434 0 : Split();
435 : }
436 0 : GetParent()->Update();
437 : }
438 : }
439 : }
440 :
441 0 : void Splitter::StartSplit()
442 : {
443 0 : maStartSplitHdl.Call( this );
444 0 : }
445 :
446 0 : void Splitter::Split()
447 : {
448 0 : maSplitHdl.Call( this );
449 0 : }
450 :
451 0 : void Splitter::EndSplit()
452 : {
453 0 : if ( maEndSplitHdl.IsSet() )
454 0 : maEndSplitHdl.Call( this );
455 0 : }
456 :
457 0 : void Splitter::Splitting( Point& /* rSplitPos */ )
458 : {
459 0 : }
460 :
461 3709 : void Splitter::SetDragRectPixel( const Rectangle& rDragRect, vcl::Window* _pRefWin )
462 : {
463 3709 : maDragRect = rDragRect;
464 3709 : if ( !_pRefWin )
465 39 : mpRefWin = GetParent();
466 : else
467 3670 : mpRefWin = _pRefWin;
468 3709 : }
469 :
470 8 : void Splitter::SetSplitPosPixel( long nNewPos )
471 : {
472 8 : mnSplitPos = nNewPos;
473 8 : }
474 :
475 0 : void Splitter::StartDrag()
476 : {
477 0 : if ( IsTracking() )
478 0 : return;
479 :
480 0 : StartSplit();
481 :
482 : // Tracking starten
483 0 : StartTracking();
484 :
485 : // Start-Position ermitteln
486 0 : maDragPos = mpRefWin->GetPointerPosPixel();
487 0 : ImplSplitMousePos( maDragPos );
488 0 : Splitting( maDragPos );
489 0 : ImplSplitMousePos( maDragPos );
490 0 : if ( mbHorzSplit )
491 0 : mnStartSplitPos = maDragPos.X();
492 : else
493 0 : mnStartSplitPos = maDragPos.Y();
494 :
495 0 : mbDragFull = bool(Application::GetSettings().GetStyleSettings().GetDragFullOptions() & DragFullOptions::Split);
496 0 : if ( !mbDragFull )
497 0 : ImplDrawSplitter();
498 : }
499 :
500 0 : void Splitter::ImplStartKbdSplitting()
501 : {
502 0 : if( mbKbdSplitting )
503 0 : return;
504 :
505 0 : mbKbdSplitting = true;
506 :
507 0 : StartSplit();
508 :
509 : // determine start position
510 : // because we have no mouse position we take either the position
511 : // of the splitter window or the last split position
512 : // the other coordinate is just the center of the reference window
513 0 : Size aSize = mpRefWin->GetOutputSize();
514 0 : Point aPos = GetPosPixel();
515 0 : if( mbHorzSplit )
516 0 : maDragPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aSize.Height()/2 );
517 : else
518 0 : maDragPos = Point( aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
519 0 : ImplSplitMousePos( maDragPos );
520 0 : Splitting( maDragPos );
521 0 : ImplSplitMousePos( maDragPos );
522 0 : if ( mbHorzSplit )
523 0 : mnStartSplitPos = maDragPos.X();
524 : else
525 0 : mnStartSplitPos = maDragPos.Y();
526 : }
527 :
528 0 : void Splitter::ImplRestoreSplitter()
529 : {
530 : // set splitter in the center of the ref window
531 0 : StartSplit();
532 0 : Size aSize = mpRefWin->GetOutputSize();
533 0 : Point aPos = Point( aSize.Width()/2 , aSize.Height()/2);
534 0 : if ( mnLastSplitPos != mnSplitPos && mnLastSplitPos > 5 )
535 : {
536 : // restore last pos if it was a useful position (>5)
537 0 : if ( mbHorzSplit )
538 0 : aPos.X() = mnLastSplitPos;
539 : else
540 0 : aPos.Y() = mnLastSplitPos;
541 : }
542 :
543 0 : ImplSplitMousePos( aPos );
544 0 : Splitting( aPos );
545 0 : ImplSplitMousePos( aPos );
546 0 : long nTemp = mnSplitPos;
547 0 : if ( mbHorzSplit )
548 0 : SetSplitPosPixel( aPos.X() );
549 : else
550 0 : SetSplitPosPixel( aPos.Y() );
551 0 : mnLastSplitPos = nTemp;
552 0 : Split();
553 0 : EndSplit();
554 0 : }
555 :
556 0 : void Splitter::GetFocus()
557 : {
558 0 : if( !ImplSplitterActive() )
559 0 : ImplRestoreSplitter();
560 :
561 0 : Invalidate();
562 0 : }
563 :
564 0 : void Splitter::LoseFocus()
565 : {
566 0 : if( mbKbdSplitting )
567 : {
568 0 : vcl::KeyCode aReturnKey( KEY_RETURN );
569 0 : ImplKbdTracking( aReturnKey );
570 0 : mbKbdSplitting = false;
571 : }
572 0 : Invalidate();
573 0 : }
574 :
575 0 : void Splitter::KeyInput( const KeyEvent& rKEvt )
576 : {
577 0 : if( mbInKeyEvent )
578 0 : return;
579 :
580 0 : mbInKeyEvent = 1;
581 :
582 0 : Splitter *pSibling = ImplFindSibling();
583 0 : vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
584 0 : sal_uInt16 nCode = aKeyCode.GetCode();
585 0 : switch ( nCode )
586 : {
587 : case KEY_UP:
588 : case KEY_DOWN:
589 0 : if( !mbHorzSplit )
590 : {
591 0 : ImplStartKbdSplitting();
592 0 : ImplKbdTracking( aKeyCode );
593 : }
594 : else
595 : {
596 0 : if( pSibling )
597 : {
598 0 : pSibling->GrabFocus();
599 0 : pSibling->KeyInput( rKEvt );
600 : }
601 : }
602 0 : break;
603 : case KEY_RIGHT:
604 : case KEY_LEFT:
605 0 : if( mbHorzSplit )
606 : {
607 0 : ImplStartKbdSplitting();
608 0 : ImplKbdTracking( aKeyCode );
609 : }
610 : else
611 : {
612 0 : if( pSibling )
613 : {
614 0 : pSibling->GrabFocus();
615 0 : pSibling->KeyInput( rKEvt );
616 : }
617 : }
618 0 : break;
619 :
620 : case KEY_DELETE:
621 0 : if( ImplSplitterActive() )
622 : {
623 0 : if( mbKbdSplitting )
624 : {
625 0 : vcl::KeyCode aKey( KEY_ESCAPE );
626 0 : ImplKbdTracking( aKey );
627 : }
628 :
629 0 : StartSplit();
630 0 : Point aPos;
631 0 : if ( mbHorzSplit )
632 0 : aPos.X() = 0;
633 : else
634 0 : aPos.Y() = 0;
635 0 : ImplSplitMousePos( aPos );
636 0 : Splitting( aPos );
637 0 : ImplSplitMousePos( aPos );
638 0 : long nTemp = mnSplitPos;
639 0 : if ( mbHorzSplit )
640 0 : SetSplitPosPixel( aPos.X() );
641 : else
642 0 : SetSplitPosPixel( aPos.Y() );
643 0 : mnLastSplitPos = nTemp;
644 0 : Split();
645 0 : EndSplit();
646 :
647 : // Shift-Del deletes both splitters
648 0 : if( aKeyCode.IsShift() && pSibling )
649 0 : pSibling->KeyInput( rKEvt );
650 :
651 0 : GrabFocusToDocument();
652 : }
653 0 : break;
654 :
655 : case KEY_ESCAPE:
656 0 : if( mbKbdSplitting )
657 0 : ImplKbdTracking( aKeyCode );
658 : else
659 0 : GrabFocusToDocument();
660 0 : break;
661 :
662 : case KEY_RETURN:
663 0 : ImplKbdTracking( aKeyCode );
664 0 : GrabFocusToDocument();
665 0 : break;
666 : default: // let any key input fix the splitter
667 0 : Window::KeyInput( rKEvt );
668 0 : GrabFocusToDocument();
669 0 : break;
670 : }
671 0 : mbInKeyEvent = 0;
672 : }
673 :
674 54 : bool Splitter::Notify( NotifyEvent& rNEvt )
675 : {
676 54 : return Window::Notify( rNEvt );
677 : }
678 :
679 52 : void Splitter::DataChanged( const DataChangedEvent& rDCEvt )
680 : {
681 52 : Window::DataChanged( rDCEvt );
682 52 : if( rDCEvt.GetType() == DataChangedEventType::SETTINGS )
683 : {
684 52 : const AllSettings* pOldSettings = rDCEvt.GetOldSettings();
685 52 : if(!pOldSettings)
686 52 : return;
687 :
688 52 : Color oldFaceColor = pOldSettings->GetStyleSettings().GetFaceColor();
689 52 : Color newFaceColor = Application::GetSettings().GetStyleSettings().GetFaceColor();
690 52 : if( oldFaceColor.IsDark() != newFaceColor.IsDark() )
691 : {
692 0 : if( newFaceColor.IsDark() )
693 0 : SetBackground( ImplWhiteWall::get() );
694 : else
695 0 : SetBackground( ImplBlackWall::get() );
696 : }
697 : }
698 : }
699 :
700 5 : void Splitter::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rPaintRect)
701 : {
702 5 : rRenderContext.DrawRect(rPaintRect);
703 :
704 5 : Polygon aPoly(rPaintRect);
705 10 : tools::PolyPolygon aPolyPoly(aPoly);
706 5 : rRenderContext.DrawTransparent(aPolyPoly, 85);
707 :
708 5 : if (mbKbdSplitting)
709 : {
710 0 : LineInfo aInfo( LINE_DASH );
711 : //aInfo.SetDashLen( 2 );
712 : //aInfo.SetDashCount( 1 );
713 0 : aInfo.SetDistance( 1 );
714 0 : aInfo.SetDotLen( 2 );
715 0 : aInfo.SetDotCount( 3 );
716 :
717 0 : rRenderContext.DrawPolyLine( aPoly, aInfo );
718 : }
719 : else
720 : {
721 5 : rRenderContext.DrawRect(rPaintRect);
722 5 : }
723 5 : }
724 :
725 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|