X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/32956769e9470c617a968ede7da90423897fdaea..ad653fa23069c5d9378247084f03c9a718c3ad62:/src/generic/sashwin.cpp?ds=inline diff --git a/src/generic/sashwin.cpp b/src/generic/sashwin.cpp index 1b64276b86..0b8a17a8e4 100644 --- a/src/generic/sashwin.cpp +++ b/src/generic/sashwin.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// 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. @@ -8,35 +8,34 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#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/wx.h" + #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 -#if wxUSE_SASH - -#include #include -#include "wx/string.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) @@ -45,6 +44,10 @@ BEGIN_EVENT_TABLE(wxSashWindow, wxWindow) EVT_PAINT(wxSashWindow::OnPaint) EVT_SIZE(wxSashWindow::OnSize) EVT_MOUSE_EVENTS(wxSashWindow::OnMouseEvent) +#if defined( __WXMSW__ ) || defined( __WXMAC__) + EVT_SET_CURSOR(wxSashWindow::OnSetCursor) +#endif // __WXMSW__ || __WXMAC__ + END_EVENT_TABLE() bool wxSashWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, @@ -75,7 +78,8 @@ void wxSashWindow::Init() 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 InitColours(); @@ -85,32 +89,21 @@ void wxSashWindow::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); - // if ( m_borderSize > 0 ) DrawBorders(dc); - DrawSashes(dc); } void wxSashWindow::OnMouseEvent(wxMouseEvent& event) { - wxCoord x, y; + wxCoord x = 0, y = 0; event.GetPosition(&x, &y); wxSashEdgePosition sashHit = SashHitTest(x, y); - // reset the 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(wxNullCursor); -#endif - if (event.LeftDown()) { CaptureMouse(); - m_mouseCaptured = TRUE; + m_mouseCaptured = true; if ( sashHit != wxSASH_NONE ) { @@ -122,8 +115,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) // 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); @@ -138,11 +131,19 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) { - SetCursor(*m_sashCursorWE); + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; } else { - SetCursor(*m_sashCursorNS); + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; } } } @@ -151,7 +152,7 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) // Wasn't a proper drag if (m_mouseCaptured) ReleaseMouse(); - m_mouseCaptured = FALSE; + m_mouseCaptured = false; wxScreenDC::EndDrawingOnTop(); m_dragMode = wxSASH_DRAG_NONE; @@ -163,7 +164,7 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) 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); @@ -184,8 +185,8 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) 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 @@ -250,7 +251,7 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) break; } - if ( newHeight == -1 ) + if ( newHeight == wxDefaultCoord ) { // didn't change newHeight = h; @@ -262,7 +263,7 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) newHeight = wxMin(newHeight, m_maximumPaneSizeY); } - if ( newWidth == -1 ) + if ( newWidth == wxDefaultCoord ) { // didn't change newWidth = w; @@ -276,35 +277,44 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) 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 ) { if ( (sashHit == wxSASH_LEFT) || (sashHit == wxSASH_RIGHT) ) { - SetCursor(*m_sashCursorWE); + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; } else { - SetCursor(*m_sashCursorNS); + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; } } else { SetCursor(wxNullCursor); + m_currentCursor = NULL; } } else if ( event.Dragging() && @@ -313,11 +323,19 @@ void wxSashWindow::OnMouseEvent(wxMouseEvent& event) { if ( (m_draggingEdge == wxSASH_LEFT) || (m_draggingEdge == wxSASH_RIGHT) ) { - SetCursor(*m_sashCursorWE); + if (m_currentCursor != m_sashCursorWE) + { + SetCursor(*m_sashCursorWE); + } + m_currentCursor = m_sashCursorWE; } else { - SetCursor(*m_sashCursorNS); + if (m_currentCursor != m_sashCursorNS) + { + SetCursor(*m_sashCursorNS); + } + m_currentCursor = m_sashCursorNS; } if (m_dragMode == wxSASH_DRAG_LEFT_DOWN) @@ -408,10 +426,10 @@ void wxSashWindow::DrawBorders(wxDC& dc) 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 ) { @@ -457,22 +475,20 @@ void wxSashWindow::DrawSash(wxSashEdgePosition edge, wxDC& dc) 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 ) { - int sashPosition = 0; - if (edge == wxSASH_LEFT) - sashPosition = 0; - else - sashPosition = w - GetEdgeMargin(edge); + int sashPosition = (edge == wxSASH_LEFT) ? 0 : ( w - GetEdgeMargin(edge) ); dc.SetPen(facePen); dc.SetBrush(faceBrush); @@ -498,11 +514,7 @@ void wxSashWindow::DrawSash(wxSashEdgePosition edge, wxDC& dc) } else // top or bottom { - int sashPosition = 0; - if (edge == wxSASH_TOP) - sashPosition = 0; - else - sashPosition = h - GetEdgeMargin(edge); + int sashPosition = (edge == wxSASH_TOP) ? 0 : ( h - GetEdgeMargin(edge) ); dc.SetPen(facePen); dc.SetBrush(faceBrush); @@ -575,7 +587,7 @@ void wxSashWindow::DrawSashTracker(wxSashEdgePosition edge, int x, int y) ClientToScreen(&x1, &y1); ClientToScreen(&x2, &y2); - wxPen sashTrackerPen(*wxBLACK, 2, wxSOLID); + wxPen sashTrackerPen(*wxBLACK, 2, wxPENSTYLE_SOLID); screenDC.SetLogicalFunction(wxINVERT); screenDC.SetPen(sashTrackerPen); @@ -597,9 +609,9 @@ void wxSashWindow::SizeWindows() int cw, ch; GetClientSize(&cw, &ch); - if (GetChildren().Number() == 1) + if (GetChildren().GetCount() == 1) { - wxWindow* child = (wxWindow*) (GetChildren().First()->Data()); + wxWindow* child = GetChildren().GetFirst()->GetData(); int x = 0; int y = 0; @@ -638,7 +650,7 @@ void wxSashWindow::SizeWindows() child->SetSize(x, y, width, height); } - else if (GetChildren().Number() > 1) + else if (GetChildren().GetCount() > 1) { // Perhaps multiple children are themselves sash windows. // TODO: this doesn't really work because the subwindows sizes/positions @@ -658,19 +670,11 @@ void wxSashWindow::SizeWindows() void wxSashWindow::InitColours() { // Shadow colours -#ifndef __WIN16__ - m_faceColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); - m_mediumShadowColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW); - m_darkShadowColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DDKSHADOW); - m_lightShadowColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT); - m_hilightColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHILIGHT); -#else - m_faceColour = *(wxTheColourDatabase->FindColour("LIGHT GREY")); - m_mediumShadowColour = *(wxTheColourDatabase->FindColour("GREY")); - m_darkShadowColour = *(wxTheColourDatabase->FindColour("BLACK")); - m_lightShadowColour = *(wxTheColourDatabase->FindColour("LIGHT GREY")); - m_hilightColour = *(wxTheColourDatabase->FindColour("WHITE")); -#endif + m_faceColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + m_mediumShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); + m_darkShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DDKSHADOW); + m_lightShadowColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); + m_hilightColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHILIGHT); } void wxSashWindow::SetSashVisible(wxSashEdgePosition edge, bool sash) @@ -682,4 +686,23 @@ void wxSashWindow::SetSashVisible(wxSashEdgePosition edge, bool sash) m_sashes[edge].m_margin = 0; } +#if defined( __WXMSW__ ) || defined( __WXMAC__) + +// this is currently called (and needed) under MSW only... +void wxSashWindow::OnSetCursor(wxSetCursorEvent& event) +{ + // if we don't do it, the resizing cursor might be set for child window: + // and like this we explicitly say that our cursor should not be used for + // children windows which overlap us + + if ( SashHitTest(event.GetX(), event.GetY()) != wxSASH_NONE) + { + // default processing is ok + event.Skip(); + } + //else: do nothing, in particular, don't call Skip() +} + +#endif // __WXMSW__ || __WXMAC__ + #endif // wxUSE_SASH