X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/601398b9b1e63109f44af34ff79bc558fe929b4d..c9c023ddeb1ba8d5c50b8a2d7718b1dd18665b2b:/src/aui/framemanager.cpp diff --git a/src/aui/framemanager.cpp b/src/aui/framemanager.cpp index 4c856f2c52..4c7d3831c3 100644 --- a/src/aui/framemanager.cpp +++ b/src/aui/framemanager.cpp @@ -29,6 +29,7 @@ #include "wx/aui/dockart.h" #include "wx/aui/floatpane.h" #include "wx/aui/tabmdi.h" +#include "wx/aui/auibar.h" #ifndef WX_PRECOMP #include "wx/panel.h" @@ -64,7 +65,7 @@ DEFINE_EVENT_TYPE(wxEVT_AUI_FIND_MANAGER) // a few defines to avoid nameclashes #define __MAC_OS_X_MEMORY_MANAGER_CLEAN__ 1 #define __AIFF__ - #include "wx/mac/private.h" + #include "wx/osx/private.h" #endif #ifdef __WXMSW__ @@ -256,6 +257,9 @@ public: m_title = title; m_widget = gtk_window_new( GTK_WINDOW_POPUP ); + g_object_ref(m_widget); + + if (parent) parent->AddChild(this); g_signal_connect( m_widget, "realize", G_CALLBACK (gtk_pseudo_window_realized_callback), this ); @@ -568,6 +572,7 @@ BEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler) EVT_LEFT_UP(wxAuiManager::OnLeftUp) EVT_MOTION(wxAuiManager::OnMotion) EVT_LEAVE_WINDOW(wxAuiManager::OnLeaveWindow) + EVT_MOUSE_CAPTURE_LOST(wxAuiManager::OnCaptureLost) EVT_CHILD_FOCUS(wxAuiManager::OnChildFocus) EVT_AUI_FIND_MANAGER(wxAuiManager::OnFindManager) EVT_TIMER(101, wxAuiManager::OnHintFadeTimer) @@ -610,17 +615,6 @@ wxAuiManager::~wxAuiManager() } #endif - // We need to remove any reference to this wxAuiManager in any of the - // wxAuiFloatingFrames associated with this manager in case they haven't - // been deleted just yet. - // We need an array copy since Unregister removes the items. - wxAuiFloatingFramePtrArray array_copy = m_floating_frames; - int i, count = array_copy.GetCount(); - for (i = 0; i < count; ++i) - { - UnregisterFloatingFrame(array_copy.Item(i)); - } - delete m_art; } @@ -628,9 +622,7 @@ wxAuiManager::~wxAuiManager() wxAuiFloatingFrame* wxAuiManager::CreateFloatingFrame(wxWindow* parent, const wxAuiPaneInfo& pane_info) { - wxAuiFloatingFrame* frame = new wxAuiFloatingFrame(parent, this, pane_info); - RegisterFloatingFrame(frame); - return frame; + return new wxAuiFloatingFrame(parent, this, pane_info); } bool wxAuiManager::CanDockPanel(const wxAuiPaneInfo & WXUNUSED(p)) @@ -640,37 +632,6 @@ bool wxAuiManager::CanDockPanel(const wxAuiPaneInfo & WXUNUSED(p)) return !(wxGetKeyState(WXK_CONTROL) || wxGetKeyState(WXK_ALT)); } -// registers a floating frame with this manager (see header) -void wxAuiManager::RegisterFloatingFrame(wxAuiFloatingFrame* frame) -{ - frame->SetOwnerManager(this); - int i, count = m_floating_frames.GetCount(); - for (i = 0; i < count; ++i) - { - wxAuiFloatingFrame* f = m_floating_frames.Item(i); - if (f == frame) - // this frame is already registered - return; - } - m_floating_frames.Add(frame); -} - -// unregisters a floating frame from this manager (see header) -void wxAuiManager::UnregisterFloatingFrame(wxAuiFloatingFrame* frame) -{ - frame->SetOwnerManager(NULL); - int i, count = m_floating_frames.GetCount(); - for (i = 0; i < count; ++i) - { - wxAuiFloatingFrame* f = m_floating_frames.Item(i); - if (f == frame) - { - m_floating_frames.Remove(f); - return; - } - } -} - // GetPane() looks up a wxAuiPaneInfo structure based // on the supplied window pointer. Upon failure, GetPane() // returns an empty wxAuiPaneInfo, a condition which can be checked @@ -853,6 +814,8 @@ void wxAuiManager::UpdateHintWindowConfig() wxDefaultPosition, wxSize(1,1), wxFRAME_FLOAT_ON_PARENT | wxFRAME_TOOL_WINDOW ); + m_hint_wnd->Connect(wxEVT_ACTIVATE, + wxActivateEventHandler(wxAuiManager::OnHintActivate), NULL, this); // Can't set the bg colour of a Frame in wxMac wxPanel* p = new wxPanel(m_hint_wnd); @@ -981,6 +944,8 @@ void wxAuiManager::SetArtProvider(wxAuiDockArt* art_provider) bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) { + wxASSERT_MSG(window, wxT("NULL window ptrs are not allowed")); + // check if the pane has a valid window if (!window) return false; @@ -1014,7 +979,7 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) if (pinfo.name.empty() || already_exists) { pinfo.name.Printf(wxT("%08lx%08x%08x%08lx"), - ((unsigned long)pinfo.window) & 0xffffffff, + wxPtrToUInt(pinfo.window) & 0xffffffff, (unsigned int)time(NULL), #ifdef __WXWINCE__ (unsigned int)GetTickCount(), @@ -1048,6 +1013,22 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) button.button_id = wxAUI_BUTTON_CLOSE; pinfo.buttons.Add(button); } + + if (pinfo.HasGripper()) + { + if (pinfo.window->IsKindOf(CLASSINFO(wxAuiToolBar))) + { + // prevent duplicate gripper -- both wxAuiManager and wxAuiToolBar + // have a gripper control. The toolbar's built-in gripper + // meshes better with the look and feel of the control than ours, + // so turn wxAuiManager's gripper off, and the toolbar's on. + + wxAuiToolBar* tb = static_cast(pinfo.window); + pinfo.SetFlag(wxAuiPaneInfo::optionGripper, false); + tb->SetGripperVisible(true); + } + } + if (pinfo.best_size == wxDefaultSize && pinfo.window) @@ -1079,6 +1060,8 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) } } + + return true; } @@ -1116,6 +1099,8 @@ bool wxAuiManager::AddPane(wxWindow* window, bool wxAuiManager::InsertPane(wxWindow* window, const wxAuiPaneInfo& pane_info, int insert_level) { + wxASSERT_MSG(window, wxT("NULL window ptrs are not allowed")); + // shift the panes around, depending on the insert level switch (insert_level) { @@ -1176,6 +1161,8 @@ bool wxAuiManager::InsertPane(wxWindow* window, const wxAuiPaneInfo& pane_info, // method will not destroy the window that is removed. bool wxAuiManager::DetachPane(wxWindow* window) { + wxASSERT_MSG(window, wxT("NULL window ptrs are not allowed")); + int i, count; for (i = 0, count = m_panes.GetCount(); i < count; ++i) { @@ -1614,7 +1601,7 @@ void wxAuiManager::GetPanePositionsAndSizes(wxAuiDockInfo& dock, { wxAuiPaneInfo& pane = *(dock.panes.Item(pane_i)); - if (pane.state & wxAuiPaneInfo::actionPane) + if (pane.HasFlag(wxAuiPaneInfo::actionPane)) { wxASSERT_MSG(action_pane==-1, wxT("Too many fixed action panes")); action_pane = pane_i; @@ -2226,7 +2213,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, dock.toolbar = false; if (pane.HasFlag(wxAuiPaneInfo::optionDockFixed)) dock.fixed = true; - if (pane.state & wxAuiPaneInfo::actionPane) + if (pane.HasFlag(wxAuiPaneInfo::actionPane)) action_pane_marked = true; } @@ -2363,8 +2350,11 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, LayoutAddDock(middle, *arr.Item(row), uiparts, spacer_only); } - cont->Add(middle, 1, wxEXPAND); - + if (middle->GetChildren().GetCount() > 0) + cont->Add(middle, 1, wxEXPAND); + else + delete middle; + // find any bottom docks in this layer @@ -2426,6 +2416,7 @@ void wxAuiManager::GetDockSizeConstraint(double* width_pct, double* height_pct) void wxAuiManager::Update() { m_hover_button = NULL; + m_action_part = NULL; wxSizer* sizer; int i, pane_count = m_panes.GetCount(); @@ -2904,7 +2895,8 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, (part->dock->dock_direction != wxAUI_DOCK_CENTER && part->dock->dock_direction != wxAUI_DOCK_NONE))) { - drop.Float(); + if (drop.IsFloatable()) + drop.Float(); } m_skipping = false; @@ -3272,7 +3264,7 @@ void wxAuiManager::ShowHint(const wxRect& rect) // nasty redrawn problems. clip.Intersect(m_frame->GetRect()); - screendc.SetClippingRegion(clip); + screendc.SetDeviceClippingRegion(clip); wxBitmap stipple = wxPaneCreateStippleBitmap(); wxBrush brush(stipple); @@ -3308,6 +3300,17 @@ void wxAuiManager::HideHint() } } +void wxAuiManager::OnHintActivate(wxActivateEvent& WXUNUSED(event)) +{ + // Do nothing so this event isn't handled in the base handlers. + + // Letting the hint window activate without this handler can lead to + // weird behavior on Mac where the menu is switched out to the top + // window's menu in MDI applications when it shouldn't be. So since + // we don't want user interaction with the hint window anyway, we just + // prevent it from activating here. +} + void wxAuiManager::StartPaneDrag(wxWindow* pane_window, @@ -3605,7 +3608,6 @@ void wxAuiManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir) wxPoint frame_pos = pane.frame->GetPosition(); wxPoint action_offset(pt.x-frame_pos.x, pt.y-frame_pos.y); - // if a key modifier is pressed while dragging the frame, // don't dock the window if (CanDockPanel(pane)) @@ -4218,17 +4220,21 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) { m_hover_button = NULL; m_frame->ReleaseMouse(); - UpdateButtonOnScreen(m_action_part, event); - - // make sure we're still over the item that was originally clicked - if (m_action_part == HitTest(event.GetX(), event.GetY())) + + if (m_action_part) { - // fire button-click event - wxAuiManagerEvent e(wxEVT_AUI_PANE_BUTTON); - e.SetManager(this); - e.SetPane(m_action_part->pane); - e.SetButton(m_action_part->button->button_id); - ProcessMgrEvent(e); + UpdateButtonOnScreen(m_action_part, event); + + // make sure we're still over the item that was originally clicked + if (m_action_part == HitTest(event.GetX(), event.GetY())) + { + // fire button-click event + wxAuiManagerEvent e(wxEVT_AUI_PANE_BUTTON); + e.SetManager(this); + e.SetPane(m_action_part->pane); + e.SetButton(m_action_part->button->button_id); + ProcessMgrEvent(e); + } } } else if (m_action == actionClickCaption) @@ -4291,20 +4297,23 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) if (m_action == actionResize) { - wxPoint pos = m_action_part->rect.GetPosition(); - if (m_action_part->orientation == wxHORIZONTAL) - pos.y = wxMax(0, event.m_y - m_action_offset.y); - else - pos.x = wxMax(0, event.m_x - m_action_offset.x); + if (m_action_part) + { + wxPoint pos = m_action_part->rect.GetPosition(); + if (m_action_part->orientation == wxHORIZONTAL) + pos.y = wxMax(0, event.m_y - m_action_offset.y); + else + pos.x = wxMax(0, event.m_x - m_action_offset.x); - wxRect rect(m_frame->ClientToScreen(pos), - m_action_part->rect.GetSize()); + wxRect rect(m_frame->ClientToScreen(pos), + m_action_part->rect.GetSize()); - wxScreenDC dc; - if (!m_action_hintrect.IsEmpty()) - DrawResizeHint(dc, m_action_hintrect); - DrawResizeHint(dc, rect); - m_action_hintrect = rect; + wxScreenDC dc; + if (!m_action_hintrect.IsEmpty()) + DrawResizeHint(dc, m_action_hintrect); + DrawResizeHint(dc, rect); + m_action_hintrect = rect; + } } else if (m_action == actionClickCaption) { @@ -4314,8 +4323,9 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) // caption has been clicked. we need to check if the mouse // is now being dragged. if it is, we need to change the // mouse action to 'drag' - if (abs(event.m_x - m_action_start.x) > drag_x_threshold || - abs(event.m_y - m_action_start.y) > drag_y_threshold) + if (m_action_part && + (abs(event.m_x - m_action_start.x) > drag_x_threshold || + abs(event.m_y - m_action_start.y) > drag_y_threshold)) { wxAuiPaneInfo* pane_info = m_action_part->pane; @@ -4370,7 +4380,7 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) wxAuiPaneInfo& pane = GetPane(m_action_window); wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found")); - pane.state |= wxAuiPaneInfo::actionPane; + pane.SetFlag(wxAuiPaneInfo::actionPane, true); wxPoint pt = event.GetPosition(); DoDrop(m_docks, m_panes, pane, pt, m_action_offset); @@ -4445,6 +4455,16 @@ void wxAuiManager::OnLeaveWindow(wxMouseEvent& WXUNUSED(event)) } } +void wxAuiManager::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) +{ + // cancel the operation in progress, if any + if ( m_action != actionNone ) + { + m_action = actionNone; + HideHint(); + } +} + void wxAuiManager::OnChildFocus(wxChildFocusEvent& event) { // when a child pane has it's focus set, we should change the