X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cedd7b22f4efca68479ec4bb79a9ce5f80164a3b..8ba4faba4de4af7613911d83263b9470e5bb1207:/src/aui/floatpane.cpp?ds=sidebyside diff --git a/src/aui/floatpane.cpp b/src/aui/floatpane.cpp index 1a7357f824..05740acecb 100644 --- a/src/aui/floatpane.cpp +++ b/src/aui/floatpane.cpp @@ -73,10 +73,11 @@ wxAuiFloatingFrame::wxAuiFloatingFrame(wxWindow* parent, wxAuiFloatingFrame::~wxAuiFloatingFrame() { // if we do not do this, then we can crash... - if(m_owner_mgr && m_owner_mgr->m_action_window == this) + if (m_owner_mgr && m_owner_mgr->m_action_window == this) { m_owner_mgr->m_action_window = NULL; } + m_mgr.UnInit(); } @@ -122,7 +123,22 @@ void wxAuiFloatingFrame::SetPaneWindow(const wxAuiPaneInfo& pane) SetTitle(pane.caption); - if (pane.floating_size != wxDefaultSize) + // This code is slightly awkward because we need to reset wxRESIZE_BORDER + // before calling SetClientSize() below as doing it after setting the + // client size would actually change it, at least under MSW, where the + // total window size doesn't change and hence, as the borders size changes, + // the client size does change. + // + // So we must call it first but doing it generates a size event and updates + // pane.floating_size from inside it so we must also record its original + // value before doing it. + const bool hasFloatingSize = pane.floating_size != wxDefaultSize; + if (pane.IsFixed()) + { + SetWindowStyleFlag(GetWindowStyleFlag() & ~wxRESIZE_BORDER); + } + + if ( hasFloatingSize ) { SetSize(pane.floating_size); } @@ -133,7 +149,7 @@ void wxAuiFloatingFrame::SetPaneWindow(const wxAuiPaneInfo& pane) size = pane.min_size; if (size == wxDefaultSize) size = m_pane_window->GetSize(); - if (pane.HasGripper()) + if (m_owner_mgr && pane.HasGripper()) { if (pane.HasGripperTop()) size.y += m_owner_mgr->m_art->GetMetric(wxAUI_DOCKART_GRIPPER_SIZE); @@ -151,15 +167,22 @@ wxAuiManager* wxAuiFloatingFrame::GetOwnerManager() const } -void wxAuiFloatingFrame::OnSize(wxSizeEvent& event) +void wxAuiFloatingFrame::OnSize(wxSizeEvent& WXUNUSED(event)) { - m_owner_mgr->OnFloatingPaneResized(m_pane_window, event.GetSize()); + if (m_owner_mgr) + { + m_owner_mgr->OnFloatingPaneResized(m_pane_window, GetRect()); + } } void wxAuiFloatingFrame::OnClose(wxCloseEvent& evt) { - m_owner_mgr->OnFloatingPaneClosed(m_pane_window, evt); - if (!evt.GetVeto()) { + if (m_owner_mgr) + { + m_owner_mgr->OnFloatingPaneClosed(m_pane_window, evt); + } + if (!evt.GetVeto()) + { m_mgr.DetachPane(m_pane_window); Destroy(); } @@ -201,6 +224,15 @@ void wxAuiFloatingFrame::OnMoveEvent(wxMoveEvent& event) m_last3_rect = m_last2_rect; m_last2_rect = m_last_rect; m_last_rect = win_rect; + + // However still update the internally stored position to avoid + // snapping back to the old one later. + if (m_owner_mgr) + { + m_owner_mgr->GetPane(m_pane_window). + floating_pos = win_rect.GetPosition(); + } + return; } @@ -271,25 +303,34 @@ void wxAuiFloatingFrame::OnIdle(wxIdleEvent& event) void wxAuiFloatingFrame::OnMoveStart() { // notify the owner manager that the pane has started to move - m_owner_mgr->OnFloatingPaneMoveStart(m_pane_window); + if (m_owner_mgr) + { + m_owner_mgr->OnFloatingPaneMoveStart(m_pane_window); + } } void wxAuiFloatingFrame::OnMoving(const wxRect& WXUNUSED(window_rect), wxDirection dir) { // notify the owner manager that the pane is moving - m_owner_mgr->OnFloatingPaneMoving(m_pane_window, dir); + if (m_owner_mgr) + { + m_owner_mgr->OnFloatingPaneMoving(m_pane_window, dir); + } m_lastDirection = dir; } void wxAuiFloatingFrame::OnMoveFinished() { // notify the owner manager that the pane has finished moving - m_owner_mgr->OnFloatingPaneMoved(m_pane_window, m_lastDirection); + if (m_owner_mgr) + { + m_owner_mgr->OnFloatingPaneMoved(m_pane_window, m_lastDirection); + } } void wxAuiFloatingFrame::OnActivate(wxActivateEvent& event) { - if (event.GetActive()) + if (m_owner_mgr && event.GetActive()) { m_owner_mgr->OnFloatingPaneActivated(m_pane_window); } @@ -301,7 +342,7 @@ void wxAuiFloatingFrame::OnActivate(wxActivateEvent& event) // functionality to wxWidgets itself) bool wxAuiFloatingFrame::isMouseDown() { - return wxGetMouseState().LeftDown(); + return wxGetMouseState().LeftIsDown(); }