1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxSashWindow implementation. A sash window has an optional
4 // sash on each edge, allowing it to be dragged. An event
5 // is generated when the sash is released.
6 // Author: Julian Smart
10 // Copyright: (c) Julian Smart
11 // Licence: wxWindows license
12 /////////////////////////////////////////////////////////////////////////////
14 #ifndef _WX_SASHWIN_H_G_
15 #define _WX_SASHWIN_H_G_
18 #pragma interface "sashwin.h"
24 #include "wx/window.h"
25 #include "wx/string.h"
27 #define wxSASH_DRAG_NONE 0
28 #define wxSASH_DRAG_DRAGGING 1
29 #define wxSASH_DRAG_LEFT_DOWN 2
31 enum wxSashEdgePosition
{
40 * wxSashEdge represents one of the four edges of a window.
43 class WXDLLEXPORT wxSashEdge
46 wxSashEdge() { m_show
= FALSE
; m_border
= FALSE
; m_margin
= 0; }
48 bool m_show
; // Is the sash showing?
49 bool m_border
; // Do we draw a border?
50 int m_margin
; // The margin size
57 #define wxSW_NOBORDER 0x0000
58 #define wxSW_3D 0x0010
59 #define wxSW_BORDER 0x0020
62 * wxSashWindow allows any of its edges to have a sash which can be dragged
63 * to resize the window. The actual content window will be created as a child
67 class WXDLLEXPORT wxSashWindow
: public wxWindow
69 DECLARE_DYNAMIC_CLASS(wxSashWindow
)
73 ////////////////////////////////////////////////////////////////////////////
76 // Default constructor
80 wxSashWindow(wxWindow
*parent
, wxWindowID id
= -1, const wxPoint
& pos
= wxDefaultPosition
,
81 const wxSize
& size
= wxDefaultSize
, long style
= wxSW_3D
|wxCLIP_CHILDREN
, const wxString
& name
= "sashWindow");
84 // Set whether there's a sash in this position
85 void SetSashVisible(wxSashEdgePosition edge
, bool sash
);
87 // Get whether there's a sash in this position
88 inline bool GetSashVisible(wxSashEdgePosition edge
) const { return m_sashes
[edge
].m_show
; }
90 // Set whether there's a border in this position
91 inline void SetSashBorder(wxSashEdgePosition edge
, bool border
) { m_sashes
[edge
].m_border
= border
; }
93 // Get whether there's a border in this position
94 inline bool HasBorder(wxSashEdgePosition edge
) const { return m_sashes
[edge
].m_border
; }
97 inline int GetEdgeMargin(wxSashEdgePosition edge
) const { return m_sashes
[edge
].m_margin
; }
99 // Sets the default sash border size
100 inline void SetDefaultBorderSize(int width
) { m_borderSize
= width
; }
102 // Gets the default sash border size
103 inline int GetDefaultBorderSize() const { return m_borderSize
; }
105 // Sets the addition border size between child and sash window
106 inline void SetExtraBorderSize(int width
) { m_extraBorderSize
= width
; }
108 // Gets the addition border size between child and sash window
109 inline int GetExtraBorderSize() const { return m_extraBorderSize
; }
111 virtual void SetMinimumSizeX(int min
) { m_minimumPaneSizeX
= min
; }
112 virtual void SetMinimumSizeY(int min
) { m_minimumPaneSizeY
= min
; }
113 virtual int GetMinimumSizeX() const { return m_minimumPaneSizeX
; }
114 virtual int GetMinimumSizeY() const { return m_minimumPaneSizeY
; }
116 virtual void SetMaximumSizeX(int max
) { m_maximumPaneSizeX
= max
; }
117 virtual void SetMaximumSizeY(int max
) { m_maximumPaneSizeY
= max
; }
118 virtual int GetMaximumSizeX() const { return m_maximumPaneSizeX
; }
119 virtual int GetMaximumSizeY() const { return m_maximumPaneSizeY
; }
121 ////////////////////////////////////////////////////////////////////////////
124 // Paints the border and sash
125 void OnPaint(wxPaintEvent
& event
);
127 // Handles mouse events
128 void OnMouseEvent(wxMouseEvent
& ev
);
131 void OnSize(wxSizeEvent
& event
);
134 void DrawBorders(wxDC
& dc
);
137 void DrawSash(wxSashEdgePosition edge
, wxDC
& dc
);
140 void DrawSashes(wxDC
& dc
);
142 // Draws the sash tracker (for whilst moving the sash)
143 void DrawSashTracker(wxSashEdgePosition edge
, int x
, int y
);
145 // Tests for x, y over sash
146 wxSashEdgePosition
SashHitTest(int x
, int y
, int tolerance
= 2);
148 // Resizes subwindows
151 // Initialize colours
155 wxSashEdge m_sashes
[4];
157 wxSashEdgePosition m_draggingEdge
;
161 int m_extraBorderSize
;
164 int m_minimumPaneSizeX
;
165 int m_minimumPaneSizeY
;
166 int m_maximumPaneSizeX
;
167 int m_maximumPaneSizeY
;
168 wxCursor
* m_sashCursorWE
;
169 wxCursor
* m_sashCursorNS
;
170 wxColour m_lightShadowColour
;
171 wxColour m_mediumShadowColour
;
172 wxColour m_darkShadowColour
;
173 wxColour m_hilightColour
;
174 wxColour m_faceColour
;
176 DECLARE_EVENT_TABLE()
179 #define wxEVT_SASH_DRAGGED (wxEVT_FIRST + 1200)
181 enum wxSashDragStatus
184 wxSASH_STATUS_OUT_OF_RANGE
187 class WXDLLEXPORT wxSashEvent
: public wxCommandEvent
189 DECLARE_DYNAMIC_CLASS(wxSashEvent
)
192 inline wxSashEvent(int id
= 0, wxSashEdgePosition edge
= wxSASH_NONE
) {
193 m_eventType
= (wxEventType
) wxEVT_SASH_DRAGGED
; m_id
= id
; m_edge
= edge
; }
195 inline void SetEdge(wxSashEdgePosition edge
) { m_edge
= edge
; }
196 inline wxSashEdgePosition
GetEdge() const { return m_edge
; }
198 //// The rectangle formed by the drag operation
199 inline void SetDragRect(const wxRect
& rect
) { m_dragRect
= rect
; }
200 inline wxRect
GetDragRect() const { return m_dragRect
; }
202 //// Whether the drag caused the rectangle to be reversed (e.g.
203 //// dragging the top below the bottom)
204 inline void SetDragStatus(wxSashDragStatus status
) { m_dragStatus
= status
; }
205 inline wxSashDragStatus
GetDragStatus() const { return m_dragStatus
; }
207 wxSashEdgePosition m_edge
;
209 wxSashDragStatus m_dragStatus
;
212 typedef void (wxEvtHandler::*wxSashEventFunction
)(wxSashEvent
&);
214 #define EVT_SASH_DRAGGED(id, fn) { wxEVT_SASH_DRAGGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxSashEventFunction) & fn, NULL },
215 #define EVT_SASH_DRAGGED_RANGE(id1, id2, fn) { wxEVT_SASH_DRAGGED, id1, id2, (wxObjectEventFunction) (wxEventFunction) (wxSashEventFunction) & fn, NULL },