/////////////////////////////////////////////////////////////////////////////
-// Name: sashwin.cpp
+// Name: src/generic/sashwin.cpp
// Purpose: wxSashWindow implementation. A sash window has an optional
// sash on each edge, allowing it to be dragged. An event
// is generated when the sash is released.
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
-// Licence: wxWidgets licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "sashwin.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#if wxUSE_SASH
+#include "wx/sashwin.h"
+
#ifndef WX_PRECOMP
#include "wx/dialog.h"
#include "wx/frame.h"
#include "wx/settings.h"
+ #include "wx/dcclient.h"
+ #include "wx/dcscreen.h"
+ #include "wx/math.h"
#endif
-#include <math.h>
#include <stdlib.h>
-#include "wx/dcscreen.h"
-#include "wx/sashwin.h"
#include "wx/laywin.h"
-DEFINE_EVENT_TYPE(wxEVT_SASH_DRAGGED)
+wxDEFINE_EVENT( wxEVT_SASH_DRAGGED, wxSashEvent );
IMPLEMENT_DYNAMIC_CLASS(wxSashWindow, wxWindow)
IMPLEMENT_DYNAMIC_CLASS(wxSashEvent, wxCommandEvent)
EVT_MOUSE_EVENTS(wxSashWindow::OnMouseEvent)
#if defined( __WXMSW__ ) || defined( __WXMAC__)
EVT_SET_CURSOR(wxSashWindow::OnSetCursor)
-#endif // wxMSW
+#endif // __WXMSW__ || __WXMAC__
END_EVENT_TABLE()
m_maximumPaneSizeY = 10000;
m_sashCursorWE = new wxCursor(wxCURSOR_SIZEWE);
m_sashCursorNS = new wxCursor(wxCURSOR_SIZENS);
- m_mouseCaptured = FALSE;
+ m_mouseCaptured = false;
m_currentCursor = NULL;
// Eventually, we'll respond to colour change messages
void wxSashWindow::OnMouseEvent(wxMouseEvent& event)
{
- wxCoord x, y;
+ wxCoord x = 0, y = 0;
event.GetPosition(&x, &y);
wxSashEdgePosition sashHit = SashHitTest(x, y);
if (event.LeftDown())
{
CaptureMouse();
- m_mouseCaptured = TRUE;
+ m_mouseCaptured = true;
if ( sashHit != wxSASH_NONE )
{
// the area to draw on.
wxWindow* parent = this;
- while (parent && !parent->IsKindOf(CLASSINFO(wxDialog)) &&
- !parent->IsKindOf(CLASSINFO(wxFrame)))
+ while (parent && !wxDynamicCast(parent, wxDialog) &&
+ !wxDynamicCast(parent, wxFrame))
parent = parent->GetParent();
wxScreenDC::StartDrawingOnTop(parent);
// Wasn't a proper drag
if (m_mouseCaptured)
ReleaseMouse();
- m_mouseCaptured = FALSE;
+ m_mouseCaptured = false;
wxScreenDC::EndDrawingOnTop();
m_dragMode = wxSASH_DRAG_NONE;
m_dragMode = wxSASH_DRAG_NONE;
if (m_mouseCaptured)
ReleaseMouse();
- m_mouseCaptured = FALSE;
+ m_mouseCaptured = false;
// Erase old tracker
DrawSashTracker(m_draggingEdge, m_oldX, m_oldY);
wxSashDragStatus status = wxSASH_STATUS_OK;
// the new height and width of the window - if -1, it didn't change
- int newHeight = -1,
- newWidth = -1;
+ int newHeight = wxDefaultCoord,
+ newWidth = wxDefaultCoord;
// NB: x and y may be negative and they're relative to the sash window
// upper left corner, while xp and yp are expressed in the parent
break;
}
- if ( newHeight == -1 )
+ if ( newHeight == wxDefaultCoord )
{
// didn't change
newHeight = h;
newHeight = wxMin(newHeight, m_maximumPaneSizeY);
}
- if ( newWidth == -1 )
+ if ( newWidth == wxDefaultCoord )
{
// didn't change
newWidth = w;
dragRect = wxRect(x, y, newWidth, newHeight);
- wxSashEvent event(GetId(), edge);
- event.SetEventObject(this);
- event.SetDragStatus(status);
- event.SetDragRect(dragRect);
- GetEventHandler()->ProcessEvent(event);
+ wxSashEvent eventSash(GetId(), edge);
+ eventSash.SetEventObject(this);
+ eventSash.SetDragStatus(status);
+ eventSash.SetDragRect(dragRect);
+ GetEventHandler()->ProcessEvent(eventSash);
}
else if ( event.LeftUp() )
{
if (m_mouseCaptured)
ReleaseMouse();
- m_mouseCaptured = FALSE;
+ m_mouseCaptured = false;
}
- else if (event.Moving() && !event.Dragging())
+ else if ((event.Moving() || event.Leaving()) && !event.Dragging())
{
// Just change the cursor if required
if ( sashHit != wxSASH_NONE )
int w, h;
GetClientSize(&w, &h);
- wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID);
- wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID);
- wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID);
- wxPen hilightPen(m_hilightColour, 1, wxSOLID);
+ wxPen mediumShadowPen(m_mediumShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen darkShadowPen(m_darkShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen lightShadowPen(m_lightShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen hilightPen(m_hilightColour, 1, wxPENSTYLE_SOLID);
if ( GetWindowStyleFlag() & wxSW_3DBORDER )
{
int w, h;
GetClientSize(&w, &h);
- wxPen facePen(m_faceColour, 1, wxSOLID);
- wxBrush faceBrush(m_faceColour, wxSOLID);
- wxPen mediumShadowPen(m_mediumShadowColour, 1, wxSOLID);
- wxPen darkShadowPen(m_darkShadowColour, 1, wxSOLID);
- wxPen lightShadowPen(m_lightShadowColour, 1, wxSOLID);
- wxPen hilightPen(m_hilightColour, 1, wxSOLID);
- wxPen blackPen(wxColour(0, 0, 0), 1, wxSOLID);
- wxPen whitePen(wxColour(255, 255, 255), 1, wxSOLID);
+ wxPen facePen(m_faceColour, 1, wxPENSTYLE_SOLID);
+ wxBrush faceBrush(m_faceColour, wxBRUSHSTYLE_SOLID);
+ wxPen mediumShadowPen(m_mediumShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen darkShadowPen(m_darkShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen lightShadowPen(m_lightShadowColour, 1, wxPENSTYLE_SOLID);
+ wxPen hilightPen(m_hilightColour, 1, wxPENSTYLE_SOLID);
+ wxColour blackClr(0, 0, 0);
+ wxColour whiteClr(255, 255, 255);
+ wxPen blackPen(blackClr, 1, wxPENSTYLE_SOLID);
+ wxPen whitePen(whiteClr, 1, wxPENSTYLE_SOLID);
if ( edge == wxSASH_LEFT || edge == wxSASH_RIGHT )
{
ClientToScreen(&x1, &y1);
ClientToScreen(&x2, &y2);
- wxPen sashTrackerPen(*wxBLACK, 2, wxSOLID);
+ wxPen sashTrackerPen(*wxBLACK, 2, wxPENSTYLE_SOLID);
screenDC.SetLogicalFunction(wxINVERT);
screenDC.SetPen(sashTrackerPen);
//else: do nothing, in particular, don't call Skip()
}
-#endif // wxMSW
+#endif // __WXMSW__ || __WXMAC__
#endif // wxUSE_SASH