]> git.saurik.com Git - wxWidgets.git/blob - include/wx/generic/sashwin.h
Move constant strings to .rodata/.data.rel.ro ELF segment from .data by making them...
[wxWidgets.git] / include / wx / generic / sashwin.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: sashwin.h
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
7 // Modified by:
8 // Created: 01/02/97
9 // RCS-ID: $Id$
10 // Copyright: (c) Julian Smart
11 // Licence: wxWindows licence
12 /////////////////////////////////////////////////////////////////////////////
13
14 #ifndef _WX_SASHWIN_H_G_
15 #define _WX_SASHWIN_H_G_
16
17 #if wxUSE_SASH
18
19 #include "wx/defs.h"
20 #include "wx/window.h"
21 #include "wx/string.h"
22
23 #define wxSASH_DRAG_NONE 0
24 #define wxSASH_DRAG_DRAGGING 1
25 #define wxSASH_DRAG_LEFT_DOWN 2
26
27 enum wxSashEdgePosition {
28 wxSASH_TOP = 0,
29 wxSASH_RIGHT,
30 wxSASH_BOTTOM,
31 wxSASH_LEFT,
32 wxSASH_NONE = 100
33 };
34
35 /*
36 * wxSashEdge represents one of the four edges of a window.
37 */
38
39 class WXDLLIMPEXP_ADV wxSashEdge
40 {
41 public:
42 wxSashEdge() { m_show = false; m_border = false; m_margin = 0; }
43
44 bool m_show; // Is the sash showing?
45 bool m_border; // Do we draw a border?
46 int m_margin; // The margin size
47 };
48
49 /*
50 * wxSashWindow flags
51 */
52
53 #define wxSW_NOBORDER 0x0000
54 //#define wxSW_3D 0x0010
55 #define wxSW_BORDER 0x0020
56 #define wxSW_3DSASH 0x0040
57 #define wxSW_3DBORDER 0x0080
58 #define wxSW_3D (wxSW_3DSASH | wxSW_3DBORDER)
59
60 /*
61 * wxSashWindow allows any of its edges to have a sash which can be dragged
62 * to resize the window. The actual content window will be created as a child
63 * of wxSashWindow.
64 */
65
66 class WXDLLIMPEXP_ADV wxSashWindow: public wxWindow
67 {
68 public:
69 // Default constructor
70 wxSashWindow()
71 {
72 Init();
73 }
74
75 // Normal constructor
76 wxSashWindow(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
77 const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow"))
78 {
79 Init();
80 Create(parent, id, pos, size, style, name);
81 }
82
83 ~wxSashWindow();
84
85 bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
86 const wxSize& size = wxDefaultSize, long style = wxSW_3D|wxCLIP_CHILDREN, const wxString& name = wxT("sashWindow"));
87
88 // Set whether there's a sash in this position
89 void SetSashVisible(wxSashEdgePosition edge, bool sash);
90
91 // Get whether there's a sash in this position
92 bool GetSashVisible(wxSashEdgePosition edge) const { return m_sashes[edge].m_show; }
93
94 // Set whether there's a border in this position
95 void SetSashBorder(wxSashEdgePosition edge, bool border) { m_sashes[edge].m_border = border; }
96
97 // Get whether there's a border in this position
98 bool HasBorder(wxSashEdgePosition edge) const { return m_sashes[edge].m_border; }
99
100 // Get border size
101 int GetEdgeMargin(wxSashEdgePosition edge) const { return m_sashes[edge].m_margin; }
102
103 // Sets the default sash border size
104 void SetDefaultBorderSize(int width) { m_borderSize = width; }
105
106 // Gets the default sash border size
107 int GetDefaultBorderSize() const { return m_borderSize; }
108
109 // Sets the addition border size between child and sash window
110 void SetExtraBorderSize(int width) { m_extraBorderSize = width; }
111
112 // Gets the addition border size between child and sash window
113 int GetExtraBorderSize() const { return m_extraBorderSize; }
114
115 virtual void SetMinimumSizeX(int min) { m_minimumPaneSizeX = min; }
116 virtual void SetMinimumSizeY(int min) { m_minimumPaneSizeY = min; }
117 virtual int GetMinimumSizeX() const { return m_minimumPaneSizeX; }
118 virtual int GetMinimumSizeY() const { return m_minimumPaneSizeY; }
119
120 virtual void SetMaximumSizeX(int max) { m_maximumPaneSizeX = max; }
121 virtual void SetMaximumSizeY(int max) { m_maximumPaneSizeY = max; }
122 virtual int GetMaximumSizeX() const { return m_maximumPaneSizeX; }
123 virtual int GetMaximumSizeY() const { return m_maximumPaneSizeY; }
124
125 ////////////////////////////////////////////////////////////////////////////
126 // Implementation
127
128 // Paints the border and sash
129 void OnPaint(wxPaintEvent& event);
130
131 // Handles mouse events
132 void OnMouseEvent(wxMouseEvent& ev);
133
134 // Adjusts the panes
135 void OnSize(wxSizeEvent& event);
136
137 #if defined(__WXMSW__) || defined(__WXMAC__)
138 // Handle cursor correctly
139 void OnSetCursor(wxSetCursorEvent& event);
140 #endif // wxMSW
141
142 // Draws borders
143 void DrawBorders(wxDC& dc);
144
145 // Draws the sashes
146 void DrawSash(wxSashEdgePosition edge, wxDC& dc);
147
148 // Draws the sashes
149 void DrawSashes(wxDC& dc);
150
151 // Draws the sash tracker (for whilst moving the sash)
152 void DrawSashTracker(wxSashEdgePosition edge, int x, int y);
153
154 // Tests for x, y over sash
155 wxSashEdgePosition SashHitTest(int x, int y, int tolerance = 2);
156
157 // Resizes subwindows
158 void SizeWindows();
159
160 // Initialize colours
161 void InitColours();
162
163 private:
164 void Init();
165
166 wxSashEdge m_sashes[4];
167 int m_dragMode;
168 wxSashEdgePosition m_draggingEdge;
169 int m_oldX;
170 int m_oldY;
171 int m_borderSize;
172 int m_extraBorderSize;
173 int m_firstX;
174 int m_firstY;
175 int m_minimumPaneSizeX;
176 int m_minimumPaneSizeY;
177 int m_maximumPaneSizeX;
178 int m_maximumPaneSizeY;
179 wxCursor* m_sashCursorWE;
180 wxCursor* m_sashCursorNS;
181 wxColour m_lightShadowColour;
182 wxColour m_mediumShadowColour;
183 wxColour m_darkShadowColour;
184 wxColour m_hilightColour;
185 wxColour m_faceColour;
186 bool m_mouseCaptured;
187 wxCursor* m_currentCursor;
188
189 private:
190 DECLARE_DYNAMIC_CLASS(wxSashWindow)
191 DECLARE_EVENT_TABLE()
192 DECLARE_NO_COPY_CLASS(wxSashWindow)
193 };
194
195 BEGIN_DECLARE_EVENT_TYPES()
196 DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV,
197 wxEVT_SASH_DRAGGED, wxEVT_FIRST + 1200)
198 END_DECLARE_EVENT_TYPES()
199
200 enum wxSashDragStatus
201 {
202 wxSASH_STATUS_OK,
203 wxSASH_STATUS_OUT_OF_RANGE
204 };
205
206 class WXDLLIMPEXP_ADV wxSashEvent: public wxCommandEvent
207 {
208 public:
209 wxSashEvent(int id = 0, wxSashEdgePosition edge = wxSASH_NONE)
210 {
211 m_eventType = (wxEventType) wxEVT_SASH_DRAGGED;
212 m_id = id;
213 m_edge = edge;
214 }
215
216 void SetEdge(wxSashEdgePosition edge) { m_edge = edge; }
217 wxSashEdgePosition GetEdge() const { return m_edge; }
218
219 //// The rectangle formed by the drag operation
220 void SetDragRect(const wxRect& rect) { m_dragRect = rect; }
221 wxRect GetDragRect() const { return m_dragRect; }
222
223 //// Whether the drag caused the rectangle to be reversed (e.g.
224 //// dragging the top below the bottom)
225 void SetDragStatus(wxSashDragStatus status) { m_dragStatus = status; }
226 wxSashDragStatus GetDragStatus() const { return m_dragStatus; }
227
228 private:
229 wxSashEdgePosition m_edge;
230 wxRect m_dragRect;
231 wxSashDragStatus m_dragStatus;
232
233 private:
234 DECLARE_DYNAMIC_CLASS_NO_COPY(wxSashEvent)
235 };
236
237 typedef void (wxEvtHandler::*wxSashEventFunction)(wxSashEvent&);
238
239 #define wxSashEventHandler(func) \
240 (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxSashEventFunction, &func)
241
242 #define EVT_SASH_DRAGGED(id, fn) \
243 wx__DECLARE_EVT1(wxEVT_SASH_DRAGGED, id, wxSashEventHandler(fn))
244 #define EVT_SASH_DRAGGED_RANGE(id1, id2, fn) \
245 wx__DECLARE_EVT2(wxEVT_SASH_DRAGGED, id1, id2, wxSashEventHandler(fn))
246
247 #endif // wxUSE_SASH
248
249 #endif
250 // _WX_SASHWIN_H_G_