]> git.saurik.com Git - wxWidgets.git/blame - src/generic/sashwin.cpp
regenerated makefiles
[wxWidgets.git] / src / generic / sashwin.cpp
CommitLineData
a6d70308
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: sashwin.cpp
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
6aa89a22 11// Licence: wxWindows licence
a6d70308
JS
12/////////////////////////////////////////////////////////////////////////////
13
14f355c2 14#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
a6d70308
JS
15#pragma implementation "sashwin.h"
16#endif
17
18// For compilers that support precompilation, includes "wx.h".
19#include "wx/wxprec.h"
20
21#ifdef __BORLANDC__
22#pragma hdrstop
23#endif
24
1e6feb95
VZ
25#if wxUSE_SASH
26
a6d70308 27#ifndef WX_PRECOMP
04dbb646
VZ
28 #include "wx/dialog.h"
29 #include "wx/frame.h"
30 #include "wx/settings.h"
a6d70308
JS
31#endif
32
33#include <math.h>
34#include <stdlib.h>
35
a6d70308
JS
36#include "wx/dcscreen.h"
37#include "wx/sashwin.h"
f9b1708c 38#include "wx/laywin.h"
a6d70308 39
32956769
JS
40DEFINE_EVENT_TYPE(wxEVT_SASH_DRAGGED)
41
a6d70308
JS
42IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow)
43IMPLEMENT_DYNAMIC_CLASS(wxSashEvent, wxCommandEvent)
44
45BEGIN_EVENT_TABLE(wxSashWindow, wxWindow)
46 EVT_PAINT(wxSashWindow::OnPaint)
47 EVT_SIZE(wxSashWindow::OnSize)
48 EVT_MOUSE_EVENTS(wxSashWindow::OnMouseEvent)
64407854 49#if defined( __WXMSW__ ) || defined( __WXMAC__)
2b5f62a0
VZ
50 EVT_SET_CURSOR(wxSashWindow::OnSetCursor)
51#endif // wxMSW
52
a6d70308 53END_EVENT_TABLE()
a6d70308 54
f6bcfd97
BP
55bool wxSashWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
56 const wxSize& size, long style, const wxString& name)
a6d70308 57{
f6bcfd97
BP
58 return wxWindow::Create(parent, id, pos, size, style, name);
59}
a6d70308 60
f6bcfd97
BP
61wxSashWindow::~wxSashWindow()
62{
63 delete m_sashCursorWE;
64 delete m_sashCursorNS;
a6d70308
JS
65}
66
f6bcfd97 67void wxSashWindow::Init()
a6d70308
JS
68{
69 m_draggingEdge = wxSASH_NONE;
70 m_dragMode = wxSASH_DRAG_NONE;
71 m_oldX = 0;
72 m_oldY = 0;
73 m_firstX = 0;
74 m_firstY = 0;
75 m_borderSize = 3;
76 m_extraBorderSize = 0;
77 m_minimumPaneSizeX = 0;
78 m_minimumPaneSizeY = 0;
f66b7050
MR
79 m_maximumPaneSizeX = 10000;
80 m_maximumPaneSizeY = 10000;
a6d70308
JS
81 m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE);
82 m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS);
40fab78b 83 m_mouseCaptured = FALSE;
2b5f62a0 84 m_currentCursor = NULL;
a6d70308
JS
85
86 // Eventually, we'll respond to colour change messages
87 InitColours();
88}
89
a6d70308
JS
90void wxSashWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
91{
92 wxPaintDC dc(this);
93
ee4c6942 94 DrawBorders(dc);
a6d70308
JS
95 DrawSashes(dc);
96}
97
98void wxSashWindow::OnMouseEvent(wxMouseEvent& event)
99{
cfeb83fd
VZ
100 wxCoord x, y;
101 event.GetPosition(&x, &y);
a6d70308
JS
102
103 wxSashEdgePosition sashHit = SashHitTest(x, y);
104
a1b82138
VZ
105 if (event.LeftDown())
106 {
9f334bea 107 CaptureMouse();
40fab78b 108 m_mouseCaptured = TRUE;
9f334bea 109
a6d70308
JS
110 if ( sashHit != wxSASH_NONE )
111 {
a1b82138 112 // Required for X to specify that
b412f9be
JS
113 // that we wish to draw on top of all windows
114 // - and we optimise by specifying the area
115 // for creating the overlap window.
116 // Find the first frame or dialog and use this to specify
117 // the area to draw on.
118 wxWindow* parent = this;
119
120 while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) &&
121 !parent->IsKindOf(CLASSINFO(wxFrame)))
122 parent = parent->GetParent();
123
124 wxScreenDC::StartDrawingOnTop(parent);
a6d70308
JS
125
126 // We don't say we're dragging yet; we leave that
127 // decision for the Dragging() branch, to ensure
128 // the user has dragged a little bit.
129 m_dragMode = wxSASH_DRAG_LEFT_DOWN;
130 m_draggingEdge = sashHit;
131 m_firstX = x;
132 m_firstY = y;
9f334bea
JS
133
134 if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) )
135 {
2b5f62a0
VZ
136 if (m_currentCursor != m_sashCursorWE)
137 {
138 SetCursor(*m_sashCursorWE);
139 }
140 m_currentCursor = m_sashCursorWE;
9f334bea
JS
141 }
142 else
143 {
2b5f62a0
VZ
144 if (m_currentCursor != m_sashCursorNS)
145 {
146 SetCursor(*m_sashCursorNS);
147 }
148 m_currentCursor = m_sashCursorNS;
9f334bea 149 }
a6d70308 150 }
a1b82138 151 }
a6d70308
JS
152 else if ( event.LeftUp() && m_dragMode == wxSASH_DRAG_LEFT_DOWN )
153 {
154 // Wasn't a proper drag
40fab78b
JS
155 if (m_mouseCaptured)
156 ReleaseMouse();
157 m_mouseCaptured = FALSE;
158
a6d70308
JS
159 wxScreenDC::EndDrawingOnTop();
160 m_dragMode = wxSASH_DRAG_NONE;
161 m_draggingEdge = wxSASH_NONE;
a6d70308 162 }
a1b82138
VZ
163 else if (event.LeftUp() && m_dragMode == wxSASH_DRAG_DRAGGING)
164 {
a6d70308
JS
165 // We can stop dragging now and see what we've got.
166 m_dragMode = wxSASH_DRAG_NONE;
40fab78b
JS
167 if (m_mouseCaptured)
168 ReleaseMouse();
169 m_mouseCaptured = FALSE;
170
a6d70308
JS
171 // Erase old tracker
172 DrawSashTracker(m_draggingEdge, m_oldX, m_oldY);
173
174 // End drawing on top (frees the window used for drawing
175 // over the screen)
176 wxScreenDC::EndDrawingOnTop();
177
178 int w, h;
a1b82138 179 GetSize(&w, &h);
a6d70308 180 int xp, yp;
a1b82138 181 GetPosition(&xp, &yp);
a6d70308
JS
182
183 wxSashEdgePosition edge = m_draggingEdge;
184 m_draggingEdge = wxSASH_NONE;
185
186 wxRect dragRect;
187 wxSashDragStatus status = wxSASH_STATUS_OK;
a1b82138
VZ
188
189 // the new height and width of the window - if -1, it didn't change
190 int newHeight = -1,
191 newWidth = -1;
192
193 // NB: x and y may be negative and they're relative to the sash window
194 // upper left corner, while xp and yp are expressed in the parent
195 // window system of coordinates, so adjust them! After this
196 // adjustment, all coordinates are relative to the parent window.
197 y += yp;
198 x += xp;
199
a6d70308
JS
200 switch (edge)
201 {
202 case wxSASH_TOP:
a1b82138
VZ
203 if ( y > yp + h )
204 {
205 // top sash shouldn't get below the bottom one
a6d70308 206 status = wxSASH_STATUS_OUT_OF_RANGE;
a1b82138
VZ
207 }
208 else
209 {
210 newHeight = h - (y - yp);
211 }
a6d70308 212 break;
a1b82138 213
a6d70308 214 case wxSASH_BOTTOM:
a1b82138
VZ
215 if ( y < yp )
216 {
217 // bottom sash shouldn't get above the top one
a6d70308 218 status = wxSASH_STATUS_OUT_OF_RANGE;
a1b82138
VZ
219 }
220 else
221 {
222 newHeight = y - yp;
223 }
a6d70308 224 break;
a1b82138 225
a6d70308 226 case wxSASH_LEFT:
a1b82138
VZ
227 if ( x > xp + w )
228 {
229 // left sash shouldn't get beyond the right one
a6d70308 230 status = wxSASH_STATUS_OUT_OF_RANGE;
a1b82138
VZ
231 }
232 else
233 {
234 newWidth = w - (x - xp);
235 }
a6d70308 236 break;
a1b82138 237
a6d70308 238 case wxSASH_RIGHT:
a1b82138
VZ
239 if ( x < xp )
240 {
241 // and the right sash, finally, shouldn't be beyond the
242 // left one
a6d70308 243 status = wxSASH_STATUS_OUT_OF_RANGE;
a1b82138
VZ
244 }
245 else
246 {
247 newWidth = x - xp;
248 }
a6d70308 249 break;
a1b82138
VZ
250
251 case wxSASH_NONE:
252 // can this happen at all?
253 break;
254 }
255
256 if ( newHeight == -1 )
257 {
258 // didn't change
259 newHeight = h;
260 }
261 else
262 {
263 // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range
264 newHeight = wxMax(newHeight, m_minimumPaneSizeY);
265 newHeight = wxMin(newHeight, m_maximumPaneSizeY);
a6d70308
JS
266 }
267
a1b82138
VZ
268 if ( newWidth == -1 )
269 {
270 // didn't change
271 newWidth = w;
272 }
273 else
274 {
275 // make sure it's in m_minimumPaneSizeY..m_maximumPaneSizeY range
276 newWidth = wxMax(newWidth, m_minimumPaneSizeX);
277 newWidth = wxMin(newWidth, m_maximumPaneSizeX);
278 }
279
280 dragRect = wxRect(x, y, newWidth, newHeight);
281
a6d70308
JS
282 wxSashEvent event(GetId(), edge);
283 event.SetEventObject(this);
284 event.SetDragStatus(status);
285 event.SetDragRect(dragRect);
286 GetEventHandler()->ProcessEvent(event);
a1b82138 287 }
9f334bea
JS
288 else if ( event.LeftUp() )
289 {
40fab78b
JS
290 if (m_mouseCaptured)
291 ReleaseMouse();
292 m_mouseCaptured = FALSE;
9f334bea 293 }
a1b82138
VZ
294 else if (event.Moving() && !event.Dragging())
295 {
a6d70308
JS
296 // Just change the cursor if required
297 if ( sashHit != wxSASH_NONE )
298 {
a1b82138
VZ
299 if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) )
300 {
2b5f62a0
VZ
301 if (m_currentCursor != m_sashCursorWE)
302 {
303 SetCursor(*m_sashCursorWE);
304 }
305 m_currentCursor = m_sashCursorWE;
a1b82138
VZ
306 }
307 else
308 {
2b5f62a0
VZ
309 if (m_currentCursor != m_sashCursorNS)
310 {
311 SetCursor(*m_sashCursorNS);
312 }
313 m_currentCursor = m_sashCursorNS;
a1b82138
VZ
314 }
315 }
c0bcc480
JS
316 else
317 {
8a9c2246 318 SetCursor(wxNullCursor);
2b5f62a0 319 m_currentCursor = NULL;
c0bcc480 320 }
a1b82138
VZ
321 }
322 else if ( event.Dragging() &&
323 ((m_dragMode == wxSASH_DRAG_DRAGGING) ||
324 (m_dragMode == wxSASH_DRAG_LEFT_DOWN)) )
325 {
326 if ( (m_draggingEdge == wxSASH_LEFT) || (m_draggingEdge == wxSASH_RIGHT) )
327 {
2b5f62a0
VZ
328 if (m_currentCursor != m_sashCursorWE)
329 {
330 SetCursor(*m_sashCursorWE);
331 }
332 m_currentCursor = m_sashCursorWE;
a1b82138
VZ
333 }
334 else
335 {
2b5f62a0
VZ
336 if (m_currentCursor != m_sashCursorNS)
337 {
338 SetCursor(*m_sashCursorNS);
339 }
340 m_currentCursor = m_sashCursorNS;
a6d70308 341 }
a6d70308
JS
342
343 if (m_dragMode == wxSASH_DRAG_LEFT_DOWN)
344 {
345 m_dragMode = wxSASH_DRAG_DRAGGING;
346 DrawSashTracker(m_draggingEdge, x, y);
347 }
348 else
349 {
a1b82138
VZ
350 if ( m_dragMode == wxSASH_DRAG_DRAGGING )
351 {
352 // Erase old tracker
353 DrawSashTracker(m_draggingEdge, m_oldX, m_oldY);
a6d70308 354
a1b82138
VZ
355 // Draw new one
356 DrawSashTracker(m_draggingEdge, x, y);
357 }
a6d70308
JS
358 }
359 m_oldX = x;
360 m_oldY = y;
a1b82138 361 }
a6d70308
JS
362 else if ( event.LeftDClick() )
363 {
364 // Nothing
365 }
366 else
367 {
368 }
369}
370
371void wxSashWindow::OnSize(wxSizeEvent& WXUNUSED(event))
372{
373 SizeWindows();
374}
375
341287bf 376wxSashEdgePosition wxSashWindow::SashHitTest(int x, int y, int WXUNUSED(tolerance))
a6d70308
JS
377{
378 int cx, cy;
379 GetClientSize(& cx, & cy);
380
381 int i;
382 for (i = 0; i < 4; i++)
383 {
384 wxSashEdge& edge = m_sashes[i];
385 wxSashEdgePosition position = (wxSashEdgePosition) i ;
386
387 if (edge.m_show)
388 {
389 switch (position)
390 {
391 case wxSASH_TOP:
392 {
393 if (y >= 0 && y <= GetEdgeMargin(position))
394 return wxSASH_TOP;
395 break;
396 }
397 case wxSASH_RIGHT:
398 {
399 if ((x >= cx - GetEdgeMargin(position)) && (x <= cx))
400 return wxSASH_RIGHT;
401 break;
402 }
403 case wxSASH_BOTTOM:
404 {
405 if ((y >= cy - GetEdgeMargin(position)) && (y <= cy))
406 return wxSASH_BOTTOM;
407 break;
408 }
409 case wxSASH_LEFT:
410 {
82540ef2 411 if ((x <= GetEdgeMargin(position)) && (x >= 0))
a6d70308
JS
412 return wxSASH_LEFT;
413 break;
414 }
341287bf
JS
415 case wxSASH_NONE:
416 {
417 break;
418 }
a6d70308
JS
419 }
420 }
421 }
422 return wxSASH_NONE;
423}
424
425// Draw 3D effect borders
426void wxSashWindow::DrawBorders(wxDC& dc)
427{
428 int w, h;
429 GetClientSize(&w, &h);
430
431 wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID);
432 wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID);
433 wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID);
434 wxPen hilightPen(m_hilightColour, 1, wxSOLID);
435
f6bcfd97 436 if ( GetWindowStyleFlag() & wxSW_3DBORDER )
a6d70308
JS
437 {
438 dc.SetPen(mediumShadowPen);
439 dc.DrawLine(0, 0, w-1, 0);
440 dc.DrawLine(0, 0, 0, h - 1);
441
442 dc.SetPen(darkShadowPen);
443 dc.DrawLine(1, 1, w-2, 1);
444 dc.DrawLine(1, 1, 1, h-2);
445
446 dc.SetPen(hilightPen);
447 dc.DrawLine(0, h-1, w-1, h-1);
448 dc.DrawLine(w-1, 0, w-1, h); // Surely the maximum y pos. should be h - 1.
449 /// Anyway, h is required for MSW.
450
451 dc.SetPen(lightShadowPen);
452 dc.DrawLine(w-2, 1, w-2, h-2); // Right hand side
453 dc.DrawLine(1, h-2, w-1, h-2); // Bottom
454 }
448af9a4 455 else if ( GetWindowStyleFlag() & wxSW_BORDER )
a6d70308
JS
456 {
457 dc.SetBrush(*wxTRANSPARENT_BRUSH);
458 dc.SetPen(*wxBLACK_PEN);
459 dc.DrawRectangle(0, 0, w-1, h-1);
460 }
461
462 dc.SetPen(wxNullPen);
463 dc.SetBrush(wxNullBrush);
464}
465
466void wxSashWindow::DrawSashes(wxDC& dc)
467{
468 int i;
469 for (i = 0; i < 4; i++)
470 if (m_sashes[i].m_show)
471 DrawSash((wxSashEdgePosition) i, dc);
472}
473
474// Draw the sash
475void wxSashWindow::DrawSash(wxSashEdgePosition edge, wxDC& dc)
476{
477 int w, h;
478 GetClientSize(&w, &h);
479
480 wxPen facePen(m_faceColour, 1, wxSOLID);
481 wxBrush faceBrush(m_faceColour, wxSOLID);
482 wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID);
483 wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID);
484 wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID);
485 wxPen hilightPen(m_hilightColour, 1, wxSOLID);
486 wxPen blackPen(wxColour(0, 0, 0), 1, wxSOLID);
487 wxPen whitePen(wxColour(255, 255, 255), 1, wxSOLID);
488
489 if ( edge == wxSASH_LEFT || edge == wxSASH_RIGHT )
490 {
491 int sashPosition = 0;
492 if (edge == wxSASH_LEFT)
493 sashPosition = 0;
494 else
495 sashPosition = w - GetEdgeMargin(edge);
496
497 dc.SetPen(facePen);
498 dc.SetBrush(faceBrush);
499 dc.DrawRectangle(sashPosition, 0, GetEdgeMargin(edge), h);
500
f6bcfd97 501 if (GetWindowStyleFlag() & wxSW_3DSASH)
a6d70308
JS
502 {
503 if (edge == wxSASH_LEFT)
504 {
d0b223a1 505 // Draw a dark grey line on the left to indicate that the
a6d70308 506 // sash is raised
d0b223a1 507 dc.SetPen(mediumShadowPen);
a6d70308
JS
508 dc.DrawLine(GetEdgeMargin(edge), 0, GetEdgeMargin(edge), h);
509 }
510 else
511 {
f6bcfd97 512 // Draw a highlight line on the right to indicate that the
a6d70308 513 // sash is raised
f6bcfd97 514 dc.SetPen(hilightPen);
a6d70308
JS
515 dc.DrawLine(w - GetEdgeMargin(edge), 0, w - GetEdgeMargin(edge), h);
516 }
517 }
518 }
519 else // top or bottom
520 {
521 int sashPosition = 0;
522 if (edge == wxSASH_TOP)
523 sashPosition = 0;
524 else
525 sashPosition = h - GetEdgeMargin(edge);
526
527 dc.SetPen(facePen);
528 dc.SetBrush(faceBrush);
529 dc.DrawRectangle(0, sashPosition, w, GetEdgeMargin(edge));
530
f6bcfd97 531 if (GetWindowStyleFlag() & wxSW_3DSASH)
a6d70308
JS
532 {
533 if (edge == wxSASH_BOTTOM)
534 {
f6bcfd97 535 // Draw a highlight line on the bottom to indicate that the
a6d70308 536 // sash is raised
f6bcfd97 537 dc.SetPen(hilightPen);
058939fc 538 dc.DrawLine(0, h - GetEdgeMargin(edge), w, h - GetEdgeMargin(edge));
a6d70308
JS
539 }
540 else
541 {
d0b223a1 542 // Draw a drak grey line on the top to indicate that the
a6d70308 543 // sash is raised
d0b223a1 544 dc.SetPen(mediumShadowPen);
c0bcc480 545 dc.DrawLine(1, GetEdgeMargin(edge), w-1, GetEdgeMargin(edge));
a6d70308
JS
546 }
547 }
548 }
549
550 dc.SetPen(wxNullPen);
551 dc.SetBrush(wxNullBrush);
552}
553
554// Draw the sash tracker (for whilst moving the sash)
555void wxSashWindow::DrawSashTracker(wxSashEdgePosition edge, int x, int y)
556{
557 int w, h;
558 GetClientSize(&w, &h);
559
560 wxScreenDC screenDC;
561 int x1, y1;
562 int x2, y2;
563
564 if ( edge == wxSASH_LEFT || edge == wxSASH_RIGHT )
565 {
566 x1 = x; y1 = 2;
567 x2 = x; y2 = h-2;
568
569 if ( (edge == wxSASH_LEFT) && (x1 > w) )
570 {
571 x1 = w; x2 = w;
572 }
573 else if ( (edge == wxSASH_RIGHT) && (x1 < 0) )
574 {
575 x1 = 0; x2 = 0;
576 }
577 }
578 else
579 {
580 x1 = 2; y1 = y;
581 x2 = w-2; y2 = y;
582
583 if ( (edge == wxSASH_TOP) && (y1 > h) )
584 {
585 y1 = h;
586 y2 = h;
587 }
588 else if ( (edge == wxSASH_BOTTOM) && (y1 < 0) )
589 {
590 y1 = 0;
591 y2 = 0;
592 }
593 }
594
595 ClientToScreen(&x1, &y1);
596 ClientToScreen(&x2, &y2);
597
598 wxPen sashTrackerPen(*wxBLACK, 2, wxSOLID);
599
3c679789 600 screenDC.SetLogicalFunction(wxINVERT);
a6d70308
JS
601 screenDC.SetPen(sashTrackerPen);
602 screenDC.SetBrush(*wxTRANSPARENT_BRUSH);
603
604 screenDC.DrawLine(x1, y1, x2, y2);
605
606 screenDC.SetLogicalFunction(wxCOPY);
607
608 screenDC.SetPen(wxNullPen);
609 screenDC.SetBrush(wxNullBrush);
610}
611
612// Position and size subwindows.
613// Note that the border size applies to each subwindow, not
614// including the edges next to the sash.
615void wxSashWindow::SizeWindows()
616{
617 int cw, ch;
618 GetClientSize(&cw, &ch);
619
b1d4dd7a 620 if (GetChildren().GetCount() == 1)
a6d70308 621 {
b1d4dd7a 622 wxWindow* child = GetChildren().GetFirst()->GetData();
a6d70308
JS
623
624 int x = 0;
625 int y = 0;
626 int width = cw;
627 int height = ch;
628
629 // Top
630 if (m_sashes[0].m_show)
631 {
632 y = m_borderSize;
633 height -= m_borderSize;
634 }
635 y += m_extraBorderSize;
636
637 // Left
638 if (m_sashes[3].m_show)
639 {
640 x = m_borderSize;
641 width -= m_borderSize;
642 }
643 x += m_extraBorderSize;
644
645 // Right
646 if (m_sashes[1].m_show)
647 {
648 width -= m_borderSize;
649 }
650 width -= 2*m_extraBorderSize;
651
652 // Bottom
653 if (m_sashes[2].m_show)
654 {
655 height -= m_borderSize;
656 }
657 height -= 2*m_extraBorderSize;
658
659 child->SetSize(x, y, width, height);
660 }
b1d4dd7a 661 else if (GetChildren().GetCount() > 1)
f9b1708c
JS
662 {
663 // Perhaps multiple children are themselves sash windows.
664 // TODO: this doesn't really work because the subwindows sizes/positions
665 // must be set to leave a gap for the parent's sash (hit-test and decorations).
666 // Perhaps we can allow for this within LayoutWindow, testing whether the parent
667 // is a sash window, and if so, allowing some space for the edges.
668 wxLayoutAlgorithm layout;
669 layout.LayoutWindow(this);
670 }
a6d70308
JS
671
672 wxClientDC dc(this);
673 DrawBorders(dc);
674 DrawSashes(dc);
675}
676
677// Initialize colours
678void wxSashWindow::InitColours()
679{
680 // Shadow colours
37d403aa 681#ifndef __WIN16__
a756f210
VS
682 m_faceColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
683 m_mediumShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW);
684 m_darkShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW);
685 m_lightShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT);
686 m_hilightColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT);
a6d70308
JS
687#else
688 m_faceColour = *(wxTheColourDatabase->FindColour("LIGHT GREY"));
341287bf 689 m_mediumShadowColour = *(wxTheColourDatabase->FindColour("GREY"));
a6d70308
JS
690 m_darkShadowColour = *(wxTheColourDatabase->FindColour("BLACK"));
691 m_lightShadowColour = *(wxTheColourDatabase->FindColour("LIGHT GREY"));
692 m_hilightColour = *(wxTheColourDatabase->FindColour("WHITE"));
693#endif
694}
695
696void wxSashWindow::SetSashVisible(wxSashEdgePosition edge, bool sash)
697{
698 m_sashes[edge].m_show = sash;
699 if (sash)
700 m_sashes[edge].m_margin = m_borderSize;
701 else
702 m_sashes[edge].m_margin = 0;
703}
704
64407854 705#if defined( __WXMSW__ ) || defined( __WXMAC__)
2b5f62a0
VZ
706
707// this is currently called (and needed) under MSW only...
708void wxSashWindow::OnSetCursor(wxSetCursorEvent& event)
709{
710 // if we don't do it, the resizing cursor might be set for child window:
711 // and like this we explicitly say that our cursor should not be used for
712 // children windows which overlap us
713
714 if ( SashHitTest(event.GetX(), event.GetY()) != wxSASH_NONE)
715 {
716 // default processing is ok
717 event.Skip();
718 }
719 //else: do nothing, in particular, don't call Skip()
720}
721
722#endif // wxMSW
723
75be3f5e 724#endif // wxUSE_SASH