#pragma hdrstop
#endif
+#if wxUSE_SASH
+
#ifndef WX_PRECOMP
#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/sashwin.h"
#include "wx/laywin.h"
-#if !USE_SHARED_LIBRARY
+DEFINE_EVENT_TYPE(wxEVT_SASH_DRAGGED)
+
IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow)
IMPLEMENT_DYNAMIC_CLASS(wxSashEvent, wxCommandEvent)
EVT_SIZE(wxSashWindow::OnSize)
EVT_MOUSE_EVENTS(wxSashWindow::OnMouseEvent)
END_EVENT_TABLE()
-#endif
-wxSashWindow::wxSashWindow()
+bool wxSashWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos,
+ const wxSize& size, long style, const wxString& name)
{
- m_draggingEdge = wxSASH_NONE;
- m_dragMode = wxSASH_DRAG_NONE;
- m_oldX = 0;
- m_oldY = 0;
- m_firstX = 0;
- m_firstY = 0;
- m_borderSize = 3 ;
- m_extraBorderSize = 0;
- m_sashCursorWE = NULL;
- m_sashCursorNS = NULL;
+ return wxWindow::Create(parent, id, pos, size, style, name);
+}
- m_minimumPaneSizeX = 0;
- m_minimumPaneSizeY = 0;
- m_maximumPaneSizeX = 10000;
- m_maximumPaneSizeY = 10000;
+wxSashWindow::~wxSashWindow()
+{
+ delete m_sashCursorWE;
+ delete m_sashCursorNS;
}
-wxSashWindow::wxSashWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos,
- const wxSize& size, long style, const wxString& name)
- :wxWindow(parent, id, pos, size, style, name)
+void wxSashWindow::Init()
{
m_draggingEdge = wxSASH_NONE;
m_dragMode = wxSASH_DRAG_NONE;
m_maximumPaneSizeY = 10000;
m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE);
m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS);
+ m_mouseCaptured = FALSE;
// Eventually, we'll respond to colour change messages
InitColours();
}
-wxSashWindow::~wxSashWindow()
-{
- delete m_sashCursorWE;
- delete m_sashCursorNS;
-}
-
void wxSashWindow::OnPaint(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc(this);
wxSashEdgePosition sashHit = SashHitTest(x, y);
// reset the cursor
-#ifdef __WXMOTIF__
- SetCursor(* wxSTANDARD_CURSOR);
+#if defined(__WXMOTIF__) || defined(__WXGTK__)
+ // Not necessary and in fact inhibits proper cursor setting (JACS 8/2000)
+ //SetCursor(* wxSTANDARD_CURSOR);
#endif
#ifdef __WXMSW__
- SetCursor(wxCursor());
+ SetCursor(wxNullCursor);
#endif
if (event.LeftDown())
{
+ CaptureMouse();
+ m_mouseCaptured = TRUE;
+
if ( sashHit != wxSASH_NONE )
{
- CaptureMouse();
-
// Required for X to specify that
// that we wish to draw on top of all windows
// - and we optimise by specifying the area
m_draggingEdge = sashHit;
m_firstX = x;
m_firstY = y;
+
+ if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) )
+ {
+ SetCursor(*m_sashCursorWE);
+ }
+ else
+ {
+ SetCursor(*m_sashCursorNS);
+ }
}
}
else if ( event.LeftUp() && m_dragMode == wxSASH_DRAG_LEFT_DOWN )
{
// Wasn't a proper drag
- ReleaseMouse();
+ if (m_mouseCaptured)
+ ReleaseMouse();
+ m_mouseCaptured = FALSE;
+
wxScreenDC::EndDrawingOnTop();
m_dragMode = wxSASH_DRAG_NONE;
m_draggingEdge = wxSASH_NONE;
{
// We can stop dragging now and see what we've got.
m_dragMode = wxSASH_DRAG_NONE;
- ReleaseMouse();
+ if (m_mouseCaptured)
+ ReleaseMouse();
+ m_mouseCaptured = FALSE;
+
// Erase old tracker
DrawSashTracker(m_draggingEdge, m_oldX, m_oldY);
event.SetDragRect(dragRect);
GetEventHandler()->ProcessEvent(event);
}
+ else if ( event.LeftUp() )
+ {
+ if (m_mouseCaptured)
+ ReleaseMouse();
+ m_mouseCaptured = FALSE;
+ }
else if (event.Moving() && !event.Dragging())
{
// Just change the cursor if required
SetCursor(*m_sashCursorNS);
}
}
+ else
+ {
+ SetCursor(wxNullCursor);
+ }
}
else if ( event.Dragging() &&
((m_dragMode == wxSASH_DRAG_DRAGGING) ||
wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID);
wxPen hilightPen(m_hilightColour, 1, wxSOLID);
- if ( GetWindowStyleFlag() & wxSW_3D )
+ if ( GetWindowStyleFlag() & wxSW_3DBORDER )
{
dc.SetPen(mediumShadowPen);
dc.DrawLine(0, 0, w-1, 0);
dc.SetBrush(faceBrush);
dc.DrawRectangle(sashPosition, 0, GetEdgeMargin(edge), h);
- if (GetWindowStyleFlag() & wxSW_3D)
+ if (GetWindowStyleFlag() & wxSW_3DSASH)
{
if (edge == wxSASH_LEFT)
{
- // Draw a black line on the left to indicate that the
+ // Draw a dark grey line on the left to indicate that the
// sash is raised
- dc.SetPen(blackPen);
+ dc.SetPen(mediumShadowPen);
dc.DrawLine(GetEdgeMargin(edge), 0, GetEdgeMargin(edge), h);
}
else
{
- // Draw a white line on the right to indicate that the
+ // Draw a highlight line on the right to indicate that the
// sash is raised
- dc.SetPen(whitePen);
+ dc.SetPen(hilightPen);
dc.DrawLine(w - GetEdgeMargin(edge), 0, w - GetEdgeMargin(edge), h);
}
}
dc.SetBrush(faceBrush);
dc.DrawRectangle(0, sashPosition, w, GetEdgeMargin(edge));
- if (GetWindowStyleFlag() & wxSW_3D)
+ if (GetWindowStyleFlag() & wxSW_3DSASH)
{
if (edge == wxSASH_BOTTOM)
{
- // Draw a black line on the bottom to indicate that the
+ // Draw a highlight line on the bottom to indicate that the
// sash is raised
- dc.SetPen(blackPen);
+ dc.SetPen(hilightPen);
dc.DrawLine(0, h - GetEdgeMargin(edge), w, h - GetEdgeMargin(edge));
}
else
{
- // Draw a white line on the top to indicate that the
+ // Draw a drak grey line on the top to indicate that the
// sash is raised
- dc.SetPen(whitePen);
- dc.DrawLine(0, GetEdgeMargin(edge), w, GetEdgeMargin(edge));
+ dc.SetPen(mediumShadowPen);
+ dc.DrawLine(1, GetEdgeMargin(edge), w-1, GetEdgeMargin(edge));
}
}
}
void wxSashWindow::InitColours()
{
// Shadow colours
-#if defined(__WIN95__)
+#ifndef __WIN16__
m_faceColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
m_mediumShadowColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW);
m_darkShadowColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DDKSHADOW);
m_sashes[edge].m_margin = 0;
}
+#endif // wxUSE_SASH