1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: interface of wxSplitterWindow
4 // Author: wxWidgets team
6 // Licence: wxWindows licence
7 /////////////////////////////////////////////////////////////////////////////
10 #define wxSP_NOBORDER 0x0000
11 #define wxSP_THIN_SASH 0x0000 // NB: the default is 3D sash
12 #define wxSP_NOSASH 0x0010
13 #define wxSP_PERMIT_UNSPLIT 0x0040
14 #define wxSP_LIVE_UPDATE 0x0080
15 #define wxSP_3DSASH 0x0100
16 #define wxSP_3DBORDER 0x0200
17 #define wxSP_NO_XP_THEME 0x0400
18 #define wxSP_BORDER wxSP_3DBORDER
19 #define wxSP_3D (wxSP_3DBORDER | wxSP_3DSASH)
24 wxSPLIT_HORIZONTAL
= 1,
31 wxSPLIT_DRAG_DRAGGING
,
32 wxSPLIT_DRAG_LEFT_DOWN
36 @class wxSplitterWindow
38 This class manages up to two subwindows. The current view can be split
39 into two programmatically (perhaps from a menu command), and unsplit
40 either programmatically or via the wxSplitterWindow user interface.
44 Draws a 3D effect border and sash.
45 @style{wxSP_THIN_SASH}
48 Draws a 3D effect sash (part of default style).
50 Synonym for wxSP_BORDER.
52 Draws a standard border.
55 @style{wxSP_NO_XP_THEME}
56 Under Windows XP, switches off the attempt to draw the splitter
57 using Windows XP theming, so the borders and sash will take on the
59 @style{wxSP_PERMIT_UNSPLIT}
60 Always allow to unsplit, even with the minimum pane size other than zero.
61 @style{wxSP_LIVE_UPDATE}
62 Don't draw XOR line but resize the child windows immediately.
66 @beginEventEmissionTable{wxSplitterEvent}
67 @event{EVT_SPLITTER_SASH_POS_CHANGING(id, func)}
68 The sash position is in the process of being changed.
69 May be used to modify the position of the tracking bar to properly
70 reflect the position that would be set if the drag were to be completed
71 at this point. Processes a @c wxEVT_SPLITTER_SASH_POS_CHANGING event.
72 @event{EVT_SPLITTER_SASH_POS_CHANGED(id, func)}
73 The sash position was changed. May be used to modify the sash position
74 before it is set, or to prevent the change from taking place.
75 Processes a @c wxEVT_SPLITTER_SASH_POS_CHANGED event.
76 @event{EVT_SPLITTER_UNSPLIT(id, func)}
77 The splitter has been just unsplit. Processes a @c wxEVT_SPLITTER_UNSPLIT event.
78 @event{EVT_SPLITTER_DCLICK(id, func)}
79 The sash was double clicked. The default behaviour is to unsplit the
80 window when this happens (unless the minimum pane size has been set
81 to a value greater than zero). Processes a @c wxEVT_SPLITTER_DOUBLECLICKED event.
88 @see wxSplitterEvent, @ref overview_splitterwindow
90 class wxSplitterWindow
: public wxWindow
99 Constructor for creating the window.
102 The parent of the splitter window.
104 The window identifier.
110 The window style. See wxSplitterWindow.
115 After using this constructor, you must create either one or two
116 subwindows with the splitter window as parent, and then call one
117 of Initialize(), SplitVertically() and SplitHorizontally() in order
119 You can create two windows, with one hidden when not being shown;
120 or you can create and delete the second pane on demand.
122 @see Initialize(), SplitVertically(), SplitHorizontally(), Create()
124 wxSplitterWindow(wxWindow
* parent
, wxWindowID id
= wxID_ANY
,
125 const wxPoint
& pos
= wxDefaultPosition
,
126 const wxSize
& size
= wxDefaultSize
,
127 long style
= wxSP_3D
,
128 const wxString
& name
= "splitterWindow");
131 Destroys the wxSplitterWindow and its children.
133 virtual ~wxSplitterWindow();
136 Creation function, for two-step construction.
137 See wxSplitterWindow() for details.
139 bool Create(wxWindow
* parent
, wxWindowID id
= wxID_ANY
,
140 const wxPoint
& point
= wxDefaultPosition
,
141 const wxSize
& size
= wxDefaultSize
, long style
= wxSP_3D
,
142 const wxString
& name
= "splitter");
145 Returns the current minimum pane size (defaults to zero).
147 @see SetMinimumPaneSize()
149 int GetMinimumPaneSize() const;
152 Returns the current sash gravity.
154 @see SetSashGravity()
156 double GetSashGravity() const;
159 Returns the current sash position.
161 @see SetSashPosition()
163 int GetSashPosition() const;
166 Returns the default sash size in pixels or 0 if it is invisible.
168 @see GetDefaultSashSize(), IsSashInvisible()
170 int GetSashSize() const;
173 Returns the default sash size in pixels.
175 The size of the sash is its width for a vertically split window and its
176 height for a horizontally split one. Its other direction is the same as
177 the client size of the window in the corresponding direction.
179 The default sash size is platform-dependent because it conforms to the
180 current platform look-and-feel and cannot be changed.
184 int GetDefaultSashSize() const;
189 @see SetSplitMode(), SplitVertically(), SplitHorizontally().
191 wxSplitMode
GetSplitMode() const;
194 Returns the left/top or only pane.
196 wxWindow
* GetWindow1() const;
199 Returns the right/bottom pane.
201 wxWindow
* GetWindow2() const;
204 Initializes the splitter window to have one pane.
205 The child window is shown if it is currently hidden.
208 The pane for the unsplit window.
210 @remarks This should be called if you wish to initially view only a
211 single pane in the splitter window.
213 @see SplitVertically(), SplitHorizontally()
215 void Initialize(wxWindow
* window
);
218 Returns @true if the sash is invisible even when the window is split, @false otherwise.
220 @remark This is a shortcut for HasFlag(wxSP_NOSASH)
222 @see SetSashInvisible()
226 bool IsSashInvisible() const;
229 Returns @true if the window is split, @false otherwise.
231 bool IsSplit() const;
234 Application-overridable function called when the sash is double-clicked with
235 the left mouse button.
238 The x position of the mouse cursor.
240 The y position of the mouse cursor.
242 @remarks The default implementation of this function calls Unsplit if the
243 minimum pane size is zero.
247 virtual void OnDoubleClickSash(int x
, int y
);
250 Application-overridable function called when the sash position is changed by
251 user. It may return @false to prevent the change or @true to allow it.
253 @param newSashPosition
254 The new sash position (always positive or zero)
256 @remarks The default implementation of this function verifies that the
257 sizes of both panes of the splitter are greater than
260 virtual bool OnSashPositionChange(int newSashPosition
);
263 Application-overridable function called when the window is unsplit, either
264 programmatically or using the wxSplitterWindow user interface.
267 The window being removed.
269 @remarks The default implementation of this function simply hides
270 removed. You may wish to delete the window.
272 virtual void OnUnsplit(wxWindow
* removed
);
275 This function replaces one of the windows managed by the wxSplitterWindow with
276 another one. It is in general better to use it instead of calling Unsplit()
277 and then resplitting the window back because it will provoke much less flicker
278 (if any). It is valid to call this function whether the splitter has two
281 Both parameters should be non-@NULL and @a winOld must specify one of the
282 windows managed by the splitter. If the parameters are incorrect or the window
283 couldn't be replaced, @false is returned. Otherwise the function will return
284 @true, but please notice that it will not delete the replaced window and you
285 may wish to do it yourself.
287 @see GetMinimumPaneSize()
289 bool ReplaceWindow(wxWindow
* winOld
, wxWindow
* winNew
);
292 Sets the minimum pane size.
295 Minimum pane size in pixels.
297 @remarks The default minimum pane size is zero, which means that either
298 pane can be reduced to zero by dragging the sash, thus
299 removing one of the panes. To prevent this behaviour
300 (and veto out-of-range sash dragging), set a minimum
301 size, for example 20 pixels. If the wxSP_PERMIT_UNSPLIT
302 style is used when a splitter window is created, the
303 window may be unsplit even if minimum size is non-zero.
305 @see GetMinimumPaneSize()
307 void SetMinimumPaneSize(int paneSize
);
310 Sets the sash gravity.
313 The sash gravity. Value between 0.0 and 1.0.
316 Gravity is real factor which controls position of sash while resizing
317 wxSplitterWindow. Gravity tells wxSplitterWindow how much will left/top
318 window grow while resizing.
320 - 0.0: only the bottom/right window is automatically resized
321 - 0.5: both windows grow by equal size
322 - 1.0: only left/top window grows
323 Gravity should be a real value between 0.0 and 1.0.
324 Default value of sash gravity is 0.0.
325 That value is compatible with previous (before gravity was introduced)
326 behaviour of wxSplitterWindow.
328 @see GetSashGravity()
330 void SetSashGravity(double gravity
);
333 Sets the sash position.
336 The sash position in pixels.
338 If @true, resizes the panes and redraws the sash and border.
340 @remarks Does not currently check for an out-of-range value.
342 @see GetSashPosition()
344 void SetSashPosition(int position
, bool redraw
= true);
350 Can be wxSPLIT_VERTICAL or wxSPLIT_HORIZONTAL.
352 @remarks Only sets the internal variable; does not update the display.
354 @see GetSplitMode(), SplitVertically(), SplitHorizontally().
356 void SetSplitMode(int mode
);
359 Sets whether the sash should be invisible, even when the window is
362 When the sash is invisible, it doesn't appear on the screen at all and,
363 in particular, doesn't allow the user to resize the windows.
365 @remarks Only sets the internal variable; does not update the display.
368 If @true, the sash is always invisible, else it is shown when the
371 @see IsSashInvisible()
375 void SetSashInvisible(bool invisible
=true);
378 Initializes the top and bottom panes of the splitter window.
379 The child windows are shown if they are currently hidden.
386 The initial position of the sash. If this value is positive,
387 it specifies the size of the upper pane. If it is negative, its
388 absolute value gives the size of the lower pane.
389 Finally, specify 0 (default) to choose the default position
390 (half of the total window height).
392 @return @true if successful, @false otherwise (the window was already split).
394 @remarks This should be called if you wish to initially view two panes.
395 It can also be called at any subsequent time, but the application
396 should check that the window is not currently split using IsSplit().
398 @see SplitVertically(), IsSplit(), Unsplit()
400 virtual bool SplitHorizontally(wxWindow
* window1
, wxWindow
* window2
,
401 int sashPosition
= 0);
404 Initializes the left and right panes of the splitter window.
405 The child windows are shown if they are currently hidden.
412 The initial position of the sash. If this value is positive, it
413 specifies the size of the left pane. If it is negative, it is
414 absolute value gives the size of the right pane.
415 Finally, specify 0 (default) to choose the default position
416 (half of the total window width).
418 @return @true if successful, @false otherwise (the window was already split).
420 @remarks This should be called if you wish to initially view two panes.
421 It can also be called at any subsequent time, but the
422 application should check that the window is not currently
423 split using IsSplit().
425 @see SplitHorizontally(), IsSplit(), Unsplit().
427 virtual bool SplitVertically(wxWindow
* window1
, wxWindow
* window2
,
428 int sashPosition
= 0);
434 The pane to remove, or @NULL to remove the right or bottom pane.
436 @return @true if successful, @false otherwise (the window was not split).
438 @remarks This call will not actually delete the pane being removed; it
439 calls OnUnsplit() which can be overridden for the desired
440 behaviour. By default, the pane being removed is hidden.
442 @see SplitHorizontally(), SplitVertically(), IsSplit(), OnUnsplit()
444 bool Unsplit(wxWindow
* toRemove
= NULL
);
447 Causes any pending sizing of the sash and child panes to take place
450 Such resizing normally takes place in idle time, in order to wait for
451 layout to be completed. However, this can cause unacceptable flicker as
452 the panes are resized after the window has been shown.
453 To work around this, you can perform window layout (for example by
454 sending a size event to the parent window), and then call this function,
455 before showing the top-level window.
463 @class wxSplitterEvent
465 This class represents the events generated by a splitter control.
467 Also there is only one event class, the data associated to the different events
468 is not the same and so not all accessor functions may be called for each event.
469 The documentation mentions the kind of event(s) for which the given accessor
470 function makes sense: calling it for other types of events will result
471 in assert failure (in debug mode) and will return meaningless results.
473 @beginEventTable{wxSplitterEvent}
474 @event{EVT_SPLITTER_SASH_POS_CHANGING(id, func)}
475 The sash position is in the process of being changed.
476 May be used to modify the position of the tracking bar to properly
477 reflect the position that would be set if the drag were to be completed
478 at this point. Processes a @c wxEVT_SPLITTER_SASH_POS_CHANGING event.
479 @event{EVT_SPLITTER_SASH_POS_CHANGED(id, func)}
480 The sash position was changed. May be used to modify the sash position
481 before it is set, or to prevent the change from taking place.
482 Processes a @c wxEVT_SPLITTER_SASH_POS_CHANGED event.
483 @event{EVT_SPLITTER_UNSPLIT(id, func)}
484 The splitter has been just unsplit. Processes a @c wxEVT_SPLITTER_UNSPLIT event.
485 @event{EVT_SPLITTER_DCLICK(id, func)}
486 The sash was double clicked. The default behaviour is to unsplit the
487 window when this happens (unless the minimum pane size has been set
488 to a value greater than zero). Processes a @c wxEVT_SPLITTER_DOUBLECLICKED event.
494 @see wxSplitterWindow, @ref overview_events
496 class wxSplitterEvent
: public wxNotifyEvent
500 Constructor. Used internally by wxWidgets only.
502 wxSplitterEvent(wxEventType eventType
= wxEVT_NULL
,
503 wxSplitterWindow
* splitter
= NULL
);
506 Returns the new sash position.
508 May only be called while processing
509 @c wxEVT_SPLITTER_SASH_POS_CHANGING and
510 @c wxEVT_SPLITTER_SASH_POS_CHANGED events.
512 int GetSashPosition() const;
515 Returns a pointer to the window being removed when a splitter window
518 May only be called while processing
519 @c wxEVT_SPLITTER_UNSPLIT events.
521 wxWindow
* GetWindowBeingRemoved() const;
524 Returns the x coordinate of the double-click point.
526 May only be called while processing
527 @c wxEVT_SPLITTER_DOUBLECLICKED events.
532 Returns the y coordinate of the double-click point.
534 May only be called while processing
535 @c wxEVT_SPLITTER_DOUBLECLICKED events.
540 In the case of @c wxEVT_SPLITTER_SASH_POS_CHANGED events,
541 sets the new sash position.
542 In the case of @c wxEVT_SPLITTER_SASH_POS_CHANGING events,
543 sets the new tracking bar position so visual feedback during dragging will
544 represent that change that will actually take place. Set to -1 from
545 the event handler code to prevent repositioning.
547 May only be called while processing
548 @c wxEVT_SPLITTER_SASH_POS_CHANGING and
549 @c wxEVT_SPLITTER_SASH_POS_CHANGED events.
554 void SetSashPosition(int pos
);
558 wxEventType wxEVT_SPLITTER_SASH_POS_CHANGED
;
559 wxEventType wxEVT_SPLITTER_SASH_POS_CHANGING
;
560 wxEventType wxEVT_SPLITTER_DOUBLECLICKED
;
561 wxEventType wxEVT_SPLITTER_UNSPLIT
;