// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#include "wx/wx.h"
#endif
+#if !wxUSE_SASH
+ #error "Thisfile requires wxUSE_SASH to be defined."
+#endif // wxUSE_SASH
+
#include <math.h>
#include <stdlib.h>
#include "wx/string.h"
#include "wx/dcscreen.h"
#include "wx/sashwin.h"
+#include "wx/laywin.h"
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow)
m_minimumPaneSizeX = 0;
m_minimumPaneSizeY = 0;
- m_maximumPaneSizeX = 0;
- m_maximumPaneSizeY = 0;
+ m_maximumPaneSizeX = 10000;
+ m_maximumPaneSizeY = 10000;
}
wxSashWindow::wxSashWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos,
m_extraBorderSize = 0;
m_minimumPaneSizeX = 0;
m_minimumPaneSizeY = 0;
- m_maximumPaneSizeX = 0;
- m_maximumPaneSizeY = 0;
+ m_maximumPaneSizeX = 10000;
+ m_maximumPaneSizeY = 10000;
m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE);
m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS);
{
wxPaintDC dc(this);
-#if 0
- if ( m_borderSize > 0 )
- DrawBorders(dc);
-#endif
+ // if ( m_borderSize > 0 )
+ DrawBorders(dc);
DrawSashes(dc);
}
wxSashEdgePosition sashHit = SashHitTest(x, y);
+ // reset the cursor
+#ifdef __WXMOTIF__
+ SetCursor(* wxSTANDARD_CURSOR);
+#endif
+#ifdef __WXMSW__
+ SetCursor(wxCursor());
+#endif
+
if (event.LeftDown())
{
if ( sashHit != wxSASH_NONE )
{
- CaptureMouse();
+ CaptureMouse();
// Required for X to specify that
- // that we wish to draw on top of all windows
- // - and we optimise by specifying the area
- // for creating the overlap window.
- wxScreenDC::StartDrawingOnTop(this);
+ // that we wish to draw on top of all windows
+ // - and we optimise by specifying the area
+ // for creating the overlap window.
+ // Find the first frame or dialog and use this to specify
+ // the area to draw on.
+ wxWindow* parent = this;
+
+ while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) &&
+ !parent->IsKindOf(CLASSINFO(wxFrame)))
+ parent = parent->GetParent();
+
+ wxScreenDC::StartDrawingOnTop(parent);
// We don't say we're dragging yet; we leave that
// decision for the Dragging() branch, to ensure
wxScreenDC::EndDrawingOnTop();
m_dragMode = wxSASH_DRAG_NONE;
m_draggingEdge = wxSASH_NONE;
-
- SetCursor(*wxSTANDARD_CURSOR);
}
else if (event.LeftUp() && m_dragMode == wxSASH_DRAG_DRAGGING)
{
if (y > (yp + h))
status = wxSASH_STATUS_OUT_OF_RANGE;
int newHeight = (h - y);
+ newHeight=wxMax(newHeight,m_minimumPaneSizeY);
+ newHeight=wxMin(newHeight,m_maximumPaneSizeY);
dragRect = wxRect(xp, (yp + h) - newHeight, w, newHeight);
break;
}
if (y < 0)
status = wxSASH_STATUS_OUT_OF_RANGE;
int newHeight = y;
+ newHeight=wxMax(newHeight,m_minimumPaneSizeY);
+ newHeight=wxMin(newHeight,m_maximumPaneSizeY);
dragRect = wxRect(xp, yp, w, newHeight);
break;
}
if (x > (xp + w))
status = wxSASH_STATUS_OUT_OF_RANGE;
int newWidth = (w - x);
+ newWidth=wxMax(newWidth,m_minimumPaneSizeX);
+ newWidth=wxMin(newWidth,m_maximumPaneSizeX);
dragRect = wxRect((xp + w) - newWidth, yp, newWidth, h);
break;
}
if (x < 0)
status = wxSASH_STATUS_OUT_OF_RANGE;
int newWidth = x;
+ newWidth=wxMax(newWidth,m_minimumPaneSizeX);
+ newWidth=wxMin(newWidth,m_maximumPaneSizeX);
dragRect = wxRect(xp, yp, newWidth, h);
break;
}
+ case wxSASH_NONE:
+ {
+ break;
+ }
}
wxSashEvent event(GetId(), edge);
SetCursor(*m_sashCursorNS);
}
}
- else
- {
- SetCursor(*wxSTANDARD_CURSOR);
- }
}
else if ( event.Dragging() &&
((m_dragMode == wxSASH_DRAG_DRAGGING) || (m_dragMode == wxSASH_DRAG_LEFT_DOWN))
SizeWindows();
}
-wxSashEdgePosition wxSashWindow::SashHitTest(int x, int y, int tolerance)
+wxSashEdgePosition wxSashWindow::SashHitTest(int x, int y, int WXUNUSED(tolerance))
{
int cx, cy;
GetClientSize(& cx, & cy);
}
case wxSASH_LEFT:
{
- if ((x >= GetEdgeMargin(position)) && (x >= 0))
+ if ((x <= GetEdgeMargin(position)) && (x >= 0))
return wxSASH_LEFT;
break;
}
+ case wxSASH_NONE:
+ {
+ break;
+ }
}
}
}
wxPen sashTrackerPen(*wxBLACK, 2, wxSOLID);
- screenDC.SetLogicalFunction(wxXOR);
+ screenDC.SetLogicalFunction(wxINVERT);
screenDC.SetPen(sashTrackerPen);
screenDC.SetBrush(*wxTRANSPARENT_BRUSH);
int cw, ch;
GetClientSize(&cw, &ch);
- if (GetChildren()->Number() > 0)
+ if (GetChildren().Number() == 1)
{
- wxWindow* child = (wxWindow*) (GetChildren()->First()->Data());
+ wxWindow* child = (wxWindow*) (GetChildren().First()->Data());
int x = 0;
int y = 0;
child->SetSize(x, y, width, height);
}
+ else if (GetChildren().Number() > 1)
+ {
+ // Perhaps multiple children are themselves sash windows.
+ // TODO: this doesn't really work because the subwindows sizes/positions
+ // must be set to leave a gap for the parent's sash (hit-test and decorations).
+ // Perhaps we can allow for this within LayoutWindow, testing whether the parent
+ // is a sash window, and if so, allowing some space for the edges.
+ wxLayoutAlgorithm layout;
+ layout.LayoutWindow(this);
+ }
wxClientDC dc(this);
DrawBorders(dc);
m_hilightColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHILIGHT);
#else
m_faceColour = *(wxTheColourDatabase->FindColour("LIGHT GREY"));
- m_mediumShadowColour = *(wxTheColourDatabase->FindColour("GREY", 1, wxSOLID));
+ m_mediumShadowColour = *(wxTheColourDatabase->FindColour("GREY"));
m_darkShadowColour = *(wxTheColourDatabase->FindColour("BLACK"));
m_lightShadowColour = *(wxTheColourDatabase->FindColour("LIGHT GREY"));
m_hilightColour = *(wxTheColourDatabase->FindColour("WHITE"));