X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/41286fd1def19641be3ae5bb9666c84a1c0b5525..4b7ded8bad3a45ea4838e6d3f5d1957a134050ec:/contrib/src/gizmos/dynamicsash.cpp?ds=inline diff --git a/contrib/src/gizmos/dynamicsash.cpp b/contrib/src/gizmos/dynamicsash.cpp index 37d37bf15c..fa9ee2d622 100644 --- a/contrib/src/gizmos/dynamicsash.cpp +++ b/contrib/src/gizmos/dynamicsash.cpp @@ -10,8 +10,29 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ + #pragma implementation "splittree.h" +#endif + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +// for all others, include the necessary headers (this file is usually all you +// need because it includes almost all "standard" wxWidgets headers) +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + #include "wx/gizmos/dynamicsash.h" + +const wxChar* wxDynamicSashWindowNameStr = wxT("dynamicSashWindow"); + + /* wxDynamicSashWindow works by internally storing a tree of Implementation objects (wxDynamicSsahWindowImpl) and Leaf objects @@ -83,8 +104,9 @@ class wxDynamicSashReparentEvent : public wxEvent { public: wxDynamicSashReparentEvent(); wxDynamicSashReparentEvent(wxObject *object); + wxDynamicSashReparentEvent(const wxDynamicSashReparentEvent& evt); - virtual wxEvent* Clone() const { return NULL; } + virtual wxEvent* Clone() const { return new wxDynamicSashReparentEvent(*this); } DECLARE_DYNAMIC_CLASS(wxDynamicSashReparentEvent); }; @@ -208,22 +230,22 @@ bool wxDynamicSashWindow::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { if (m_impl) - return FALSE; + return false; if (!wxWindow::Create(parent, id, pos, size, style, name)) - return FALSE; + return false; m_impl = new wxDynamicSashWindowImpl(this); if (!m_impl) - return FALSE; + return false; if (!m_impl->Create()) { delete m_impl; m_impl = NULL; - return FALSE; + return false; } - return TRUE; + return true; } void wxDynamicSashWindow::AddChild(wxWindowBase *child) { @@ -281,25 +303,39 @@ bool wxDynamicSashWindowImpl::Create() { m_leaf = new wxDynamicSashWindowLeaf(this); if (!m_leaf) - return FALSE; + return false; if (!m_leaf->Create()) { delete m_leaf; m_leaf = NULL; - return FALSE; + return false; } m_container->SetEventHandler(this); - Connect(-1, wxEVT_SIZE, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnSize); - Connect(-1, wxEVT_PAINT, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnPaint); - Connect(-1, wxEVT_MOTION, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnMouseMove); - Connect(-1, wxEVT_ENTER_WINDOW, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnMouseMove); - Connect(-1, wxEVT_LEAVE_WINDOW, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnLeave); - Connect(-1, wxEVT_LEFT_DOWN, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnPress); - Connect(-1, wxEVT_LEFT_UP, (wxObjectEventFunction)&wxDynamicSashWindowImpl::OnRelease); - - return TRUE; + Connect(wxID_ANY, wxEVT_SIZE, (wxObjectEventFunction) + (wxEventFunction) + (wxSizeEventFunction)&wxDynamicSashWindowImpl::OnSize); + Connect(wxID_ANY, wxEVT_PAINT, (wxObjectEventFunction) + (wxEventFunction) + (wxPaintEventFunction)&wxDynamicSashWindowImpl::OnPaint); + Connect(wxID_ANY, wxEVT_MOTION, (wxObjectEventFunction) + (wxEventFunction) + (wxMouseEventFunction)&wxDynamicSashWindowImpl::OnMouseMove); + Connect(wxID_ANY, wxEVT_ENTER_WINDOW, (wxObjectEventFunction) + (wxEventFunction) + (wxMouseEventFunction)&wxDynamicSashWindowImpl::OnMouseMove); + Connect(wxID_ANY, wxEVT_LEAVE_WINDOW, (wxObjectEventFunction) + (wxEventFunction) + (wxMouseEventFunction)&wxDynamicSashWindowImpl::OnLeave); + Connect(wxID_ANY, wxEVT_LEFT_DOWN, (wxObjectEventFunction) + (wxEventFunction) + (wxMouseEventFunction)&wxDynamicSashWindowImpl::OnPress); + Connect(wxID_ANY, wxEVT_LEFT_UP, (wxObjectEventFunction) + (wxEventFunction) + (wxMouseEventFunction)&wxDynamicSashWindowImpl::OnRelease); + + return true; } void wxDynamicSashWindowImpl::AddChild(wxWindow *window) { @@ -330,7 +366,8 @@ void wxDynamicSashWindowImpl::DrawSash(int x, int y) const { dc.SetBrush(brush); dc.SetLogicalFunction(wxXOR); - if (m_dragging == DSR_CORNER) { + if ((m_dragging == DSR_CORNER) && + (m_window->GetWindowStyle() & wxDS_DRAG_CORNER) != 0) { int cx = 0; int cy = 0; @@ -532,12 +569,11 @@ void wxDynamicSashWindowImpl::Unify(int panel) { } void wxDynamicSashWindowImpl::Split(int px, int py) { - m_window->Hide(); m_add_child_target = NULL; m_child[0] = new wxDynamicSashWindowImpl(m_window); - m_child[0]->m_container = new wxWindow(m_container, -1); + m_child[0]->m_container = new wxWindow(m_container, wxID_ANY); m_child[0]->m_parent = this; m_child[0]->m_top = m_top; m_child[0]->Create(); @@ -547,7 +583,7 @@ void wxDynamicSashWindowImpl::Split(int px, int py) { } m_child[1] = new wxDynamicSashWindowImpl(m_window); - m_child[1]->m_container = new wxWindow(m_container, -1); + m_child[1]->m_container = new wxWindow(m_container, wxID_ANY); m_child[1]->m_parent = this; m_child[1]->m_top = m_top; m_child[1]->Create(); @@ -579,10 +615,9 @@ void wxDynamicSashWindowImpl::Split(int px, int py) { m_leaf = NULL; m_container->Layout(); - - m_window->Show(); } + /* This code is called when you finish resizing a view by dragging the corner tab, but I think this implementation is lousy and will surprise the user more often than it will do what they are trying to do. What @@ -774,7 +809,8 @@ void wxDynamicSashWindowImpl::OnPress(wxMouseEvent &event) { } void wxDynamicSashWindowImpl::OnRelease(wxMouseEvent &event) { - if (m_dragging == DSR_CORNER) { + if ((m_dragging == DSR_CORNER) && + (m_window->GetWindowStyle() & wxDS_DRAG_CORNER) != 0) { DrawSash(m_drag_x, m_drag_y); m_container->ReleaseMouse(); @@ -856,16 +892,16 @@ bool wxDynamicSashWindowLeaf::Create() { m_viewport = new wxWindow(); if (!m_hscroll || !m_vscroll || !m_viewport) { - return FALSE; + return false; } wxDynamicSashWindowImpl *add_child_target = m_impl->m_add_child_target; m_impl->m_add_child_target = NULL; - success = m_hscroll->Create(m_impl->m_container, -1, wxDefaultPosition, wxDefaultSize, + success = m_hscroll->Create(m_impl->m_container, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_HORIZONTAL); - success = success && m_vscroll->Create(m_impl->m_container, -1, wxDefaultPosition, wxDefaultSize, + success = success && m_vscroll->Create(m_impl->m_container, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL); - success = success && m_viewport->Create(m_impl->m_container, -1); + success = success && m_viewport->Create(m_impl->m_container, wxID_ANY); m_impl->m_add_child_target = add_child_target; wxCursor cursor(wxCURSOR_ARROW); @@ -874,26 +910,44 @@ bool wxDynamicSashWindowLeaf::Create() { m_viewport->SetCursor(cursor); m_viewport->SetEventHandler(this); - Connect(-1, wxEVT_DYNAMIC_SASH_REPARENT, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnReparent); + Connect(wxID_ANY, wxEVT_DYNAMIC_SASH_REPARENT, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnReparent); - if (m_impl->m_window->GetWindowStyle() & wxMANAGE_SCROLLBARS) { + if (m_impl->m_window->GetWindowStyle() & wxDS_MANAGE_SCROLLBARS) { m_hscroll->SetEventHandler(this); m_vscroll->SetEventHandler(this); - Connect(-1, wxEVT_SET_FOCUS, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnFocus); - Connect(-1, wxEVT_SCROLL_TOP, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_BOTTOM, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_LINEUP, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_LINEDOWN, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_PAGEUP, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_PAGEDOWN, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); - Connect(-1, wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SET_FOCUS, (wxObjectEventFunction) + (wxEventFunction) + (wxFocusEventFunction)&wxDynamicSashWindowLeaf::OnFocus); + Connect(wxID_ANY, wxEVT_SCROLL_TOP, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_BOTTOM, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_LINEUP, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_LINEDOWN, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_PAGEUP, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_PAGEDOWN, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); + Connect(wxID_ANY, wxEVT_SCROLL_THUMBRELEASE, (wxObjectEventFunction) + (wxEventFunction) + (wxScrollEventFunction)&wxDynamicSashWindowLeaf::OnScroll); } wxLayoutConstraints *layout = new wxLayoutConstraints(); if (!layout) - return FALSE; + return false; wxSize size = m_hscroll->GetBestSize(); #ifdef __WXMSW__ size = m_hscroll->GetSize(); @@ -907,7 +961,7 @@ bool wxDynamicSashWindowLeaf::Create() { layout = new wxLayoutConstraints(); if (!layout) - return FALSE; + return false; size = size = m_vscroll->GetBestSize(); #ifdef __WXMSW__ size = m_vscroll->GetSize(); @@ -921,7 +975,7 @@ bool wxDynamicSashWindowLeaf::Create() { layout = new wxLayoutConstraints(); if (!layout) - return FALSE; + return false; layout->left.SameAs(m_impl->m_container, wxLeft, 3); layout->right.LeftOf(m_vscroll); layout->top.SameAs(m_impl->m_container, wxTop, 3); @@ -973,7 +1027,7 @@ DynamicSashRegion wxDynamicSashWindowLeaf::GetRegion(int x, int y) { void wxDynamicSashWindowLeaf::ResizeChild(wxSize size) { if (m_child) { - if (m_impl->m_window->GetWindowStyle() & wxMANAGE_SCROLLBARS) { + if (m_impl->m_window->GetWindowStyle() & wxDS_MANAGE_SCROLLBARS) { m_child->SetSize(size); wxSize best_size = m_child->GetBestSize(); if (best_size.GetWidth() < size.GetWidth()) { @@ -1030,18 +1084,18 @@ wxScrollBar *wxDynamicSashWindowLeaf::FindScrollBar(const wxWindow *child, int v return NULL; } -void wxDynamicSashWindowLeaf::OnSize(wxSizeEvent &event) { +void wxDynamicSashWindowLeaf::OnSize(wxSizeEvent &WXUNUSED(event)) { m_impl->m_container->Refresh(); ResizeChild(m_viewport->GetSize()); } -void wxDynamicSashWindowLeaf::OnPaint(wxPaintEvent &event) { +void wxDynamicSashWindowLeaf::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxPaintDC dc(m_impl->m_container); dc.SetBackground(wxBrush(m_impl->m_container->GetBackgroundColour(), wxSOLID)); dc.Clear(); - wxPen highlight(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNHIGHLIGHT), 1, wxSOLID); - wxPen shadow(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNSHADOW), 1, wxSOLID); + wxPen highlight(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT), 1, wxSOLID); + wxPen shadow(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW), 1, wxSOLID); wxPen black(*wxBLACK, 1, wxSOLID); wxSize size = m_impl->m_container->GetSize(); @@ -1084,7 +1138,6 @@ void wxDynamicSashWindowLeaf::OnPaint(wxPaintEvent &event) { dc.DrawLine(9, h - sh - 3, 9, h - 4); dc.DrawLine(9, h - 4, 3, h - 4); - int cy = (h - sh + h - 6) / 2 + 1; int cx = (w - sw + w - 6) / 2 + 1; int sy = cy; @@ -1107,7 +1160,7 @@ void wxDynamicSashWindowLeaf::OnPaint(wxPaintEvent &event) { } } -void wxDynamicSashWindowLeaf::OnScroll(wxScrollEvent &event) { +void wxDynamicSashWindowLeaf::OnScroll(wxScrollEvent &WXUNUSED(event)) { int nx = -m_hscroll->GetThumbPosition(); int ny = -m_vscroll->GetThumbPosition(); @@ -1137,7 +1190,8 @@ void wxDynamicSashWindowLeaf::OnMouseMove(wxMouseEvent &event) { cursor = wxCursor(wxCURSOR_SIZENS); } else if (region == DSR_VERTICAL_TAB) { cursor = wxCursor(wxCURSOR_SIZEWE); - } else if (region == DSR_CORNER) { + } else if ((region == DSR_CORNER) && + (m_impl->m_window->GetWindowStyle() & wxDS_DRAG_CORNER) != 0) { cursor = wxCursor(wxCURSOR_SIZENWSE); } else if (region == DSR_LEFT_EDGE || region == DSR_TOP_EDGE || region == DSR_RIGHT_EDGE || region == DSR_BOTTOM_EDGE) { @@ -1153,7 +1207,7 @@ void wxDynamicSashWindowLeaf::OnMouseMove(wxMouseEvent &event) { m_impl->m_container->SetCursor(cursor); } -void wxDynamicSashWindowLeaf::OnLeave(wxMouseEvent &event) { +void wxDynamicSashWindowLeaf::OnLeave(wxMouseEvent &WXUNUSED(event)) { wxCursor cursor(wxCURSOR_ARROW); m_impl->m_container->SetCursor(cursor); } @@ -1162,6 +1216,9 @@ void wxDynamicSashWindowLeaf::OnLeave(wxMouseEvent &event) { void wxDynamicSashWindowLeaf::OnPress(wxMouseEvent &event) { DynamicSashRegion region = GetRegion(event.m_x, event.m_y); + if ((region == DSR_CORNER) && (m_impl->m_window->GetWindowStyle() & wxDS_DRAG_CORNER) == 0) + return; + if (region == DSR_HORIZONTAL_TAB || region == DSR_VERTICAL_TAB || region == DSR_CORNER) { m_impl->m_dragging = region; m_impl->m_drag_x = event.m_x; @@ -1188,10 +1245,10 @@ void wxDynamicSashWindowLeaf::OnPress(wxMouseEvent &event) { } } -void wxDynamicSashWindowLeaf::OnRelease(wxMouseEvent &event) { +void wxDynamicSashWindowLeaf::OnRelease(wxMouseEvent &WXUNUSED(event)) { } -void wxDynamicSashWindowLeaf::OnReparent(wxEvent &event) { +void wxDynamicSashWindowLeaf::OnReparent(wxEvent &WXUNUSED(event)) { if (m_child) { m_child->Reparent(m_viewport); } @@ -1239,6 +1296,11 @@ wxDynamicSashReparentEvent::wxDynamicSashReparentEvent(wxObject *object) { m_eventType = wxEVT_DYNAMIC_SASH_REPARENT; } +wxDynamicSashReparentEvent::wxDynamicSashReparentEvent(const wxDynamicSashReparentEvent& evt) + : wxEvent(evt) +{ +} + IMPLEMENT_DYNAMIC_CLASS(wxDynamicSashReparentEvent, wxEvent) /////////////////////////////////////////////////////////////////////////////