LibreOffice Module vcl (master)  1
split.cxx
Go to the documentation of this file.
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/poly.hxx>
21 
22 #include <vcl/event.hxx>
23 #include <vcl/split.hxx>
24 #include <vcl/svapp.hxx>
25 #include <vcl/syswin.hxx>
26 #include <vcl/taskpanelist.hxx>
27 #include <vcl/lineinfo.hxx>
28 #include <vcl/settings.hxx>
29 #include <vcl/ptrstyle.hxx>
30 #include <vcl/lazydelete.hxx>
31 
32 #include <window.h>
33 
34 namespace
35 {
36  Wallpaper& ImplBlackWall()
37  {
38  static vcl::DeleteOnDeinit< Wallpaper > SINGLETON(COL_BLACK);
39  return *SINGLETON.get();
40  }
41  Wallpaper& ImplWhiteWall()
42  {
43  static vcl::DeleteOnDeinit< Wallpaper > SINGLETON(COL_LIGHTGRAY);
44  return *SINGLETON.get();
45  }
46 }
47 
48 // Should only be called from an ImplInit method for initialization or
49 // after checking bNew is different from the current mbHorzSplit value.
50 // The public method that does that check is Splitter::SetHorizontal().
51 void Splitter::ImplInitHorVer(bool bNew)
52 {
53  mbHorzSplit = bNew;
54 
55  PointerStyle ePointerStyle;
56  const StyleSettings& rSettings = GetSettings().GetStyleSettings();
57 
58  if ( mbHorzSplit )
59  {
60  ePointerStyle = PointerStyle::HSplit;
62  }
63  else
64  {
65  ePointerStyle = PointerStyle::VSplit;
67  }
68 
69  SetPointer( ePointerStyle );
70 }
71 
72 void Splitter::ImplInit( vcl::Window* pParent, WinBits nWinStyle )
73 {
74  Window::ImplInit( pParent, nWinStyle, nullptr );
75 
76  mpRefWin = pParent;
77 
78  ImplInitHorVer(nWinStyle & WB_HSCROLL);
79 
80  if( GetSettings().GetStyleSettings().GetFaceColor().IsDark() )
81  SetBackground( ImplWhiteWall() );
82  else
83  SetBackground( ImplBlackWall() );
84 
86  pTList->AddWindow( this );
87 }
88 
89 void Splitter::ImplSplitMousePos( Point& rPos )
90 {
91  if ( mbHorzSplit )
92  {
93  if ( rPos.X() > maDragRect.Right()-1 )
94  rPos.setX( maDragRect.Right()-1 );
95  if ( rPos.X() < maDragRect.Left()+1 )
96  rPos.setX( maDragRect.Left()+1 );
97  }
98  else
99  {
100  if ( rPos.Y() > maDragRect.Bottom()-1 )
101  rPos.setY( maDragRect.Bottom()-1 );
102  if ( rPos.Y() < maDragRect.Top()+1 )
103  rPos.setY( maDragRect.Top()+1 );
104  }
105 }
106 
108 {
109  tools::Rectangle aInvRect( maDragRect );
110 
111  if ( mbHorzSplit )
112  {
113  aInvRect.SetLeft( maDragPos.X() - 1 );
114  aInvRect.SetRight( maDragPos.X() + 1 );
115  }
116  else
117  {
118  aInvRect.SetTop( maDragPos.Y() - 1 );
119  aInvRect.SetBottom( maDragPos.Y() + 1 );
120  }
121 
123 }
124 
127  mpRefWin( nullptr ),
128  mnSplitPos( 0 ),
129  mnLastSplitPos( 0 ),
130  mnStartSplitPos( 0 ),
131  mbDragFull( false ),
132  mbKbdSplitting( false ),
133  mbInKeyEvent( false ),
134  mnKeyboardStepSize( SPLITTER_DEFAULTSTEPSIZE )
135 {
136  ImplGetWindowImpl()->mbSplitter = true;
137 
138  ImplInit( pParent, nStyle );
139 
140  GetOutDev()->SetLineColor();
141  GetOutDev()->SetFillColor();
142 }
143 
145 {
146  disposeOnce();
147 }
148 
150 {
151  SystemWindow *pSysWin = GetSystemWindow();
152  if(pSysWin)
153  {
154  TaskPaneList *pTList = pSysWin->GetTaskPaneList();
155  pTList->RemoveWindow(this);
156  }
157  mpRefWin.clear();
158  Window::dispose();
159 }
160 
161 void Splitter::SetHorizontal(bool bNew)
162 {
163  if(bNew != mbHorzSplit)
164  {
165  ImplInitHorVer(bNew);
166  }
167 }
168 
170 {
171  mnKeyboardStepSize = nStepSize;
172 }
173 
175 {
176  // look for another splitter with the same parent but different orientation
178  Splitter *pSplitter = nullptr;
179  while( pWin )
180  {
181  if( pWin->ImplIsSplitter() )
182  {
183  pSplitter = static_cast<Splitter*>(pWin);
184  if( pSplitter != this && IsHorizontal() != pSplitter->IsHorizontal() )
185  return pSplitter;
186  }
187  pWin = pWin->GetWindow( GetWindowType::Next );
188  }
189  return nullptr;
190 }
191 
193 {
194  // is splitter in document or at scrollbar handle ?
195 
196  bool bActive = true;
197  const StyleSettings& rSettings = GetSettings().GetStyleSettings();
198  tools::Long nA = rSettings.GetScrollBarSize();
200 
201  Size aSize = GetOutDev()->GetOutputSize();
202  if ( mbHorzSplit )
203  {
204  if( aSize.Width() == nB && aSize.Height() == nA )
205  bActive = false;
206  }
207  else
208  {
209  if( aSize.Width() == nA && aSize.Height() == nB )
210  bActive = false;
211  }
212  return bActive;
213 }
214 
216 {
217  if ( rMEvt.GetClicks() == 2 )
218  {
219  if ( mnLastSplitPos != mnSplitPos )
220  {
221  StartSplit();
222  Point aPos = rMEvt.GetPosPixel();
223  if ( mbHorzSplit )
224  aPos.setX( mnLastSplitPos );
225  else
226  aPos.setY( mnLastSplitPos );
227  ImplSplitMousePos( aPos );
228  tools::Long nTemp = mnSplitPos;
229  if ( mbHorzSplit )
230  SetSplitPosPixel( aPos.X() );
231  else
232  SetSplitPosPixel( aPos.Y() );
233  mnLastSplitPos = nTemp;
234  Split();
235  EndSplit();
236  }
237  }
238  else
239  StartDrag();
240 }
241 
242 void Splitter::Tracking( const TrackingEvent& rTEvt )
243 {
244  if ( rTEvt.IsTrackingEnded() )
245  {
246  if ( !mbDragFull )
248 
249  if ( !rTEvt.IsTrackingCanceled() )
250  {
251  tools::Long nNewPos;
252  if ( mbHorzSplit )
253  nNewPos = maDragPos.X();
254  else
255  nNewPos = maDragPos.Y();
256  if ( nNewPos != mnStartSplitPos )
257  {
258  SetSplitPosPixel( nNewPos );
259  mnLastSplitPos = 0;
260  Split();
261  }
262  EndSplit();
263  }
264  else if ( mbDragFull )
265  {
267  Split();
268  }
269  mnStartSplitPos = 0;
270  }
271  else
272  {
273  //Point aNewPos = mpRefWin->ScreenToOutputPixel( OutputToScreenPixel( rTEvt.GetMouseEvent().GetPosPixel() ) );
275  ImplSplitMousePos( aNewPos );
276 
277  if ( mbHorzSplit )
278  {
279  if ( aNewPos.X() == maDragPos.X() )
280  return;
281  }
282  else
283  {
284  if ( aNewPos.Y() == maDragPos.Y() )
285  return;
286  }
287 
288  if ( mbDragFull )
289  {
290  maDragPos = aNewPos;
291  tools::Long nNewPos;
292  if ( mbHorzSplit )
293  nNewPos = maDragPos.X();
294  else
295  nNewPos = maDragPos.Y();
296  if ( nNewPos != mnSplitPos )
297  {
298  SetSplitPosPixel( nNewPos );
299  mnLastSplitPos = 0;
300  Split();
301  }
302 
304  }
305  else
306  {
308  maDragPos = aNewPos;
310  }
311  }
312 }
313 
315 {
316  sal_uInt16 nCode = aKeyCode.GetCode();
317  if ( nCode == KEY_ESCAPE || nCode == KEY_RETURN )
318  {
319  if( !mbKbdSplitting )
320  return;
321  else
322  mbKbdSplitting = false;
323 
324  if ( nCode != KEY_ESCAPE )
325  {
326  tools::Long nNewPos;
327  if ( mbHorzSplit )
328  nNewPos = maDragPos.X();
329  else
330  nNewPos = maDragPos.Y();
331  if ( nNewPos != mnStartSplitPos )
332  {
333  SetSplitPosPixel( nNewPos );
334  mnLastSplitPos = 0;
335  Split();
336  }
337  }
338  else
339  {
341  Split();
342  EndSplit();
343  }
344  mnStartSplitPos = 0;
345  }
346  else
347  {
348  Point aNewPos;
349  Size aSize = mpRefWin->GetOutDev()->GetOutputSize();
350  Point aPos = GetPosPixel();
351  // depending on the position calc allows continuous moves or snaps to row/columns
352  // continuous mode is active when position is at the origin or end of the splitter
353  // otherwise snap mode is active
354  // default here is snap, holding shift sets continuous mode
355  if( mbHorzSplit )
356  aNewPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aKeyCode.IsShift() ? 0 : aSize.Height()/2);
357  else
358  aNewPos = Point( aKeyCode.IsShift() ? 0 : aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
359 
360  Point aOldWindowPos = GetPosPixel();
361 
362  int maxiter = 500; // avoid endless loop
363  int delta=0;
364  int delta_step = mbHorzSplit ? aSize.Width()/10 : aSize.Height()/10;
365 
366  // use the specified step size if it was set
368  delta_step = mnKeyboardStepSize;
369 
370  while( maxiter-- && aOldWindowPos == GetPosPixel() )
371  {
372  // inc/dec position until application performs changes
373  // thus a single key press really moves the splitter
374  if( aKeyCode.IsShift() )
375  delta++;
376  else
377  delta += delta_step;
378 
379  switch( nCode )
380  {
381  case KEY_LEFT:
382  aNewPos.AdjustX( -delta );
383  break;
384  case KEY_RIGHT:
385  aNewPos.AdjustX(delta );
386  break;
387  case KEY_UP:
388  aNewPos.AdjustY( -delta );
389  break;
390  case KEY_DOWN:
391  aNewPos.AdjustY(delta );
392  break;
393  default:
394  maxiter = 0; // leave loop
395  break;
396  }
397  ImplSplitMousePos( aNewPos );
398 
399  if ( mbHorzSplit )
400  {
401  if ( aNewPos.X() == maDragPos.X() )
402  continue;
403  }
404  else
405  {
406  if ( aNewPos.Y() == maDragPos.Y() )
407  continue;
408  }
409 
410  maDragPos = aNewPos;
411  tools::Long nNewPos;
412  if ( mbHorzSplit )
413  nNewPos = maDragPos.X();
414  else
415  nNewPos = maDragPos.Y();
416  if ( nNewPos != mnSplitPos )
417  {
418  SetSplitPosPixel( nNewPos );
419  mnLastSplitPos = 0;
420  Split();
421  }
423  }
424  }
425 }
426 
428 {
429  maStartSplitHdl.Call( this );
430 }
431 
433 {
434  maSplitHdl.Call( this );
435 }
436 
438 {
439  maEndSplitHdl.Call( this );
440 }
441 
442 void Splitter::SetDragRectPixel( const tools::Rectangle& rDragRect, vcl::Window* _pRefWin )
443 {
444  maDragRect = rDragRect;
445  if ( !_pRefWin )
446  mpRefWin = GetParent();
447  else
448  mpRefWin = _pRefWin;
449 }
450 
452 {
453  mnSplitPos = nNewPos;
454 }
455 
457 {
458  if ( IsTracking() )
459  return;
460 
461  StartSplit();
462 
463  // Tracking starten
464  StartTracking();
465 
466  // Start-Position ermitteln
469  if ( mbHorzSplit )
471  else
473 
474  mbDragFull = bool(Application::GetSettings().GetStyleSettings().GetDragFullOptions() & DragFullOptions::Split);
475  if ( !mbDragFull )
477 }
478 
480 {
481  if( mbKbdSplitting )
482  return;
483 
484  mbKbdSplitting = true;
485 
486  StartSplit();
487 
488  // determine start position
489  // because we have no mouse position we take either the position
490  // of the splitter window or the last split position
491  // the other coordinate is just the center of the reference window
492  Size aSize = mpRefWin->GetOutDev()->GetOutputSize();
493  Point aPos = GetPosPixel();
494  if( mbHorzSplit )
495  maDragPos = Point( ImplSplitterActive() ? aPos.X() : mnSplitPos, aSize.Height()/2 );
496  else
497  maDragPos = Point( aSize.Width()/2, ImplSplitterActive() ? aPos.Y() : mnSplitPos );
498  ImplSplitMousePos( maDragPos );
499  if ( mbHorzSplit )
500  mnStartSplitPos = maDragPos.X();
501  else
502  mnStartSplitPos = maDragPos.Y();
503 }
504 
506 {
507  // set splitter in the center of the ref window
508  StartSplit();
509  Size aSize = mpRefWin->GetOutDev()->GetOutputSize();
510  Point aPos( aSize.Width()/2 , aSize.Height()/2);
511  if ( mnLastSplitPos != mnSplitPos && mnLastSplitPos > 5 )
512  {
513  // restore last pos if it was a useful position (>5)
514  if ( mbHorzSplit )
515  aPos.setX( mnLastSplitPos );
516  else
517  aPos.setY( mnLastSplitPos );
518  }
519 
520  ImplSplitMousePos( aPos );
521  tools::Long nTemp = mnSplitPos;
522  if ( mbHorzSplit )
523  SetSplitPosPixel( aPos.X() );
524  else
525  SetSplitPosPixel( aPos.Y() );
526  mnLastSplitPos = nTemp;
527  Split();
528  EndSplit();
529 }
530 
532 {
533  if( !ImplSplitterActive() )
535 
536  Invalidate();
537 }
538 
540 {
541  if( mbKbdSplitting )
542  {
543  vcl::KeyCode aReturnKey( KEY_RETURN );
544  ImplKbdTracking( aReturnKey );
545  mbKbdSplitting = false;
546  }
547  Invalidate();
548 }
549 
550 void Splitter::KeyInput( const KeyEvent& rKEvt )
551 {
552  if( mbInKeyEvent )
553  return;
554 
555  mbInKeyEvent = true;
556 
557  Splitter *pSibling = ImplFindSibling();
558  vcl::KeyCode aKeyCode = rKEvt.GetKeyCode();
559  sal_uInt16 nCode = aKeyCode.GetCode();
560  switch ( nCode )
561  {
562  case KEY_UP:
563  case KEY_DOWN:
564  if( !mbHorzSplit )
565  {
567  ImplKbdTracking( aKeyCode );
568  }
569  else
570  {
571  if( pSibling )
572  {
573  pSibling->GrabFocus();
574  pSibling->KeyInput( rKEvt );
575  }
576  }
577  break;
578  case KEY_RIGHT:
579  case KEY_LEFT:
580  if( mbHorzSplit )
581  {
583  ImplKbdTracking( aKeyCode );
584  }
585  else
586  {
587  if( pSibling )
588  {
589  pSibling->GrabFocus();
590  pSibling->KeyInput( rKEvt );
591  }
592  }
593  break;
594 
595  case KEY_DELETE:
596  if( ImplSplitterActive() )
597  {
598  if( mbKbdSplitting )
599  {
600  vcl::KeyCode aKey( KEY_ESCAPE );
601  ImplKbdTracking( aKey );
602  }
603 
604  StartSplit();
605  Point aPos;
606  if ( mbHorzSplit )
607  aPos.setX( 0 );
608  else
609  aPos.setY( 0 );
610  ImplSplitMousePos( aPos );
611  tools::Long nTemp = mnSplitPos;
612  if ( mbHorzSplit )
613  SetSplitPosPixel( aPos.X() );
614  else
615  SetSplitPosPixel( aPos.Y() );
616  mnLastSplitPos = nTemp;
617  Split();
618  EndSplit();
619 
620  // Shift-Del deletes both splitters
621  if( aKeyCode.IsShift() && pSibling )
622  pSibling->KeyInput( rKEvt );
623 
625  }
626  break;
627 
628  case KEY_ESCAPE:
629  if( mbKbdSplitting )
630  ImplKbdTracking( aKeyCode );
631  else
633  break;
634 
635  case KEY_RETURN:
636  ImplKbdTracking( aKeyCode );
638  break;
639  default: // let any key input fix the splitter
640  Window::KeyInput( rKEvt );
642  break;
643  }
644  mbInKeyEvent = false;
645 }
646 
648 {
649  Window::DataChanged( rDCEvt );
650  if( rDCEvt.GetType() != DataChangedEventType::SETTINGS )
651  return;
652 
653  const AllSettings* pOldSettings = rDCEvt.GetOldSettings();
654  if(!pOldSettings)
655  return;
656 
657  Color oldFaceColor = pOldSettings->GetStyleSettings().GetFaceColor();
659  if( oldFaceColor.IsDark() != newFaceColor.IsDark() )
660  {
661  if( newFaceColor.IsDark() )
662  SetBackground( ImplWhiteWall() );
663  else
664  SetBackground( ImplBlackWall() );
665  }
666 }
667 
668 void Splitter::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rPaintRect)
669 {
670  rRenderContext.DrawRect(rPaintRect);
671 
672  tools::Polygon aPoly(rPaintRect);
673  tools::PolyPolygon aPolyPoly(aPoly);
674  rRenderContext.DrawTransparent(aPolyPoly, 85);
675 
676  if (mbKbdSplitting)
677  {
678  LineInfo aInfo( LineStyle::Dash );
679  //aInfo.SetDashLen( 2 );
680  //aInfo.SetDashCount( 1 );
681  aInfo.SetDistance( 1 );
682  aInfo.SetDotLen( 2 );
683  aInfo.SetDotCount( 3 );
684 
685  rRenderContext.DrawPolyLine( aPoly, aInfo );
686  }
687  else
688  {
689  rRenderContext.DrawRect(rPaintRect);
690  }
691 }
692 
694 {
695  return LogicToPixel(Size(3, 3), MapMode(MapUnit::MapAppFont));
696 }
697 
698 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SAL_DLLPRIVATE void ImplRestoreSplitter()
Definition: split.cxx:505
virtual Point GetPosPixel() const
Definition: window.cxx:2796
virtual void MouseButtonDown(const MouseEvent &rMEvt) override
Definition: split.cxx:215
void SetBackground()
Definition: window3.cxx:100
void SetDragRectPixel(const tools::Rectangle &rDragRect, vcl::Window *pRefWin=nullptr)
Definition: split.cxx:442
static sal_Int32 GetSplitSize()
Point GetPointerPosPixel()
Definition: mouse.cxx:564
tools::Long mnStartSplitPos
Definition: split.hxx:35
bool mbSplitter
Definition: window.h:317
SAL_DLLPRIVATE Splitter * ImplFindSibling()
Definition: split.cxx:174
SystemWindow * GetSystemWindow() const
Definition: stacking.cxx:806
void StartSplit()
Definition: split.cxx:427
void Split()
Definition: split.cxx:432
Point OutputToNormalizedScreenPixel(const Point &rPos) const
Definition: window.cxx:2843
const AllSettings * GetOldSettings() const
Definition: event.hxx:377
constexpr tools::Long Left() const
void InvertTracking(const tools::Rectangle &rRect, ShowTrackFlags nFlags)
Definition: window2.cxx:161
long Long
void EndSplit()
Definition: split.cxx:437
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
Gets the application's settings.
Definition: svapp.cxx:760
const Color & GetFaceColor() const
bool IsHorizontal() const
Definition: split.hxx:91
virtual void SetSizePixel(const Size &rNewSize)
Definition: window2.cxx:1285
SAL_DLLPRIVATE WindowImpl * ImplGetWindowImpl() const
Definition: window.hxx:527
SAL_DLLPRIVATE void ImplStartKbdSplitting()
Definition: split.cxx:479
void DrawPolyLine(const tools::Polygon &rPoly)
Render the given polygon as a line stroke.
Definition: polyline.cxx:33
virtual void LoseFocus() override
Definition: split.cxx:539
sal_uInt16 GetCode() const
Definition: keycod.hxx:49
DataChangedEventType GetType() const
Definition: event.hxx:362
tools::Long mnKeyboardStepSize
Definition: split.hxx:42
void PaintImmediately()
Definition: paint.cxx:1268
void StartTracking(StartTrackingFlags nFlags=StartTrackingFlags::NONE)
Definition: window2.cxx:251
bool IsTracking() const
Definition: window2.cxx:339
constexpr sal_uInt16 KEY_UP
Definition: keycodes.hxx:111
constexpr tools::Long Width() const
sal_uInt16 GetClicks() const
Definition: event.hxx:126
sal_Int64 WinBits
Link< Splitter *, void > maEndSplitHdl
Definition: split.hxx:45
SAL_DLLPRIVATE void ImplKbdTracking(vcl::KeyCode aKeyCode)
Definition: split.cxx:314
WinBits const WB_HSCROLL
bool mbKbdSplitting
Definition: split.hxx:40
SAL_DLLPRIVATE bool ImplIsSplitter() const
Definition: window2.cxx:939
virtual void DataChanged(const DataChangedEvent &rDCEvt) override
Definition: split.cxx:647
sal_uInt16 nCode
void DrawRect(const tools::Rectangle &rRect)
Definition: rect.cxx:51
virtual void KeyInput(const KeyEvent &rKEvt) override
Definition: split.cxx:550
constexpr void SetLeft(tools::Long v)
constexpr sal_uInt16 KEY_DOWN
Definition: keycodes.hxx:110
void SetLineColor()
Definition: line.cxx:36
sal_Int32 GetScrollBarSize() const
void clear()
Definition: vclptr.hxx:190
virtual ~Splitter() override
Definition: split.cxx:144
Point LogicToPixel(const Point &rLogicPt) const
Definition: window3.cxx:131
Link< Splitter *, void > maSplitHdl
Definition: split.hxx:44
tools::Long mnLastSplitPos
Definition: split.hxx:34
SAL_DLLPRIVATE void ImplInitHorVer(bool bNew)
Definition: split.cxx:51
bool IsDark() const
Link< Splitter *, void > maStartSplitHdl
Definition: split.hxx:43
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rPaintRect) override
Definition: split.cxx:668
void DrawTransparent(const tools::PolyPolygon &rPolyPoly, sal_uInt16 nTransparencePercent)
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE)
Definition: paint.cxx:1143
Size GetOutputSize() const
Definition: outdev.hxx:334
constexpr tools::Long Right() const
void SetFillColor()
Definition: fill.cxx:29
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:175
const AllSettings & GetSettings() const
Definition: window3.cxx:129
virtual void GetFocus() override
Definition: split.cxx:531
Point NormalizedScreenToOutputPixel(const Point &rPos) const
Definition: window.cxx:2850
constexpr tools::Long Top() const
void GrabFocusToDocument()
Definition: window.cxx:2991
VclPtr< vcl::Window > mpRefWin
Definition: split.hxx:32
void SetKeyboardStepSize(tools::Long nStepSize)
Definition: split.cxx:169
constexpr void SetRight(tools::Long v)
constexpr void SetBottom(tools::Long v)
void SetSplitPosPixel(tools::Long nPos)
Definition: split.cxx:451
tools::Rectangle maDragRect
Definition: split.hxx:37
Point PixelToLogic(const Point &rDevicePt) const
Definition: window3.cxx:161
Splitter(const Splitter &)=delete
tools::Long mnSplitPos
Definition: split.hxx:33
bool mbHorzSplit
Definition: split.hxx:38
void GrabFocus()
Definition: window.cxx:2981
#define SPLITTER_DEFAULTSTEPSIZE
Definition: split.hxx:27
vcl::Window * GetParent() const
Definition: window2.cxx:1120
virtual void dispose() override
This is intended to be used to clear any locally held references to other Window-subclass objects...
Definition: split.cxx:149
constexpr void SetTop(tools::Long v)
bool IsTrackingEnded() const
Definition: event.hxx:261
constexpr sal_uInt16 KEY_RETURN
Definition: keycodes.hxx:119
vcl::Window * GetWindow(GetWindowType nType) const
Definition: stacking.cxx:1035
constexpr sal_uInt16 KEY_RIGHT
Definition: keycodes.hxx:113
constexpr tools::Long Bottom() const
void SetPointer(PointerStyle)
Definition: mouse.cxx:486
const vcl::KeyCode & GetKeyCode() const
Definition: event.hxx:57
bool IsShift() const
Definition: keycod.hxx:54
WindowType
constexpr tools::Long Height() const
void StartDrag()
Definition: split.cxx:456
constexpr sal_uInt16 KEY_ESCAPE
Definition: keycodes.hxx:120
virtual Size GetOptimalSize() const override
Definition: split.cxx:693
::OutputDevice const * GetOutDev() const
Definition: window.cxx:567
SAL_DLLPRIVATE void ImplDrawSplitter()
Definition: split.cxx:107
bool mbDragFull
Definition: split.hxx:39
bool mbInKeyEvent
Definition: split.hxx:41
void RemoveWindow(vcl::Window *pWindow)
const Point & GetPosPixel() const
Definition: event.hxx:123
PointerStyle
Definition: ptrstyle.hxx:25
Point maDragPos
Definition: split.hxx:36
virtual void Tracking(const TrackingEvent &rTEvt) override
Definition: split.cxx:242
SAL_DLLPRIVATE bool ImplSplitterActive()
Definition: split.cxx:192
bool IsTrackingCanceled() const
Definition: event.hxx:263
void AddWindow(vcl::Window *pWindow)
TaskPaneList * GetTaskPaneList()
Definition: syswin.cxx:240
constexpr sal_uInt16 KEY_DELETE
Definition: keycodes.hxx:125
constexpr sal_uInt16 KEY_LEFT
Definition: keycodes.hxx:112
void SetHorizontal(bool bNew)
Definition: split.cxx:161
SAL_DLLPRIVATE void ImplSplitMousePos(Point &rPos)
Definition: split.cxx:89
const MouseEvent & GetMouseEvent() const
Definition: event.hxx:257
SAL_DLLPRIVATE void ImplInit(vcl::Window *pParent, WinBits nWinStyle)
Definition: split.cxx:72
bool m_bDetectedRangeSegmentation false