X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9e1fc0e42822fdf1159582f1b73cde0c7d15bc92..1f91072fc86dca08851486ec19cd573f5bf27279:/src/aui/framemanager.cpp diff --git a/src/aui/framemanager.cpp b/src/aui/framemanager.cpp index 3997bf2646..93242053ce 100644 --- a/src/aui/framemanager.cpp +++ b/src/aui/framemanager.cpp @@ -52,12 +52,12 @@ WX_DEFINE_OBJARRAY(wxAuiPaneInfoArray) wxAuiPaneInfo wxAuiNullPaneInfo; wxAuiDockInfo wxAuiNullDockInfo; -DEFINE_EVENT_TYPE(wxEVT_AUI_PANEBUTTON) -DEFINE_EVENT_TYPE(wxEVT_AUI_PANECLOSE) -DEFINE_EVENT_TYPE(wxEVT_AUI_PANEMAXIMIZE) -DEFINE_EVENT_TYPE(wxEVT_AUI_PANERESTORE) +DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_BUTTON) +DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_CLOSE) +DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_MAXIMIZE) +DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_RESTORE) DEFINE_EVENT_TYPE(wxEVT_AUI_RENDER) -DEFINE_EVENT_TYPE(wxEVT_AUI_FINDMANAGER) +DEFINE_EVENT_TYPE(wxEVT_AUI_FIND_MANAGER) #ifdef __WXMAC__ // a few defines to avoid nameclashes @@ -69,11 +69,6 @@ DEFINE_EVENT_TYPE(wxEVT_AUI_FINDMANAGER) IMPLEMENT_DYNAMIC_CLASS(wxAuiManagerEvent, wxEvent) IMPLEMENT_CLASS(wxAuiManager, wxEvtHandler) -// private manager flags (not yet on the public API) -enum wxAuiPrivateManagerOption -{ - wxAUI_MGR_NO_DOCK_SIZE_LIMIT = 1 << 28 -}; const int auiToolBarLayer = 10; @@ -477,7 +472,7 @@ static int PaneSortFunc(wxAuiPaneInfo** p1, wxAuiPaneInfo** p2) BEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler) - EVT_AUI_PANEBUTTON(wxAuiManager::OnPaneButton) + EVT_AUI_PANE_BUTTON(wxAuiManager::OnPaneButton) EVT_AUI_RENDER(wxAuiManager::OnRender) EVT_PAINT(wxAuiManager::OnPaint) EVT_ERASE_BACKGROUND(wxAuiManager::OnEraseBackground) @@ -488,7 +483,7 @@ BEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler) EVT_MOTION(wxAuiManager::OnMotion) EVT_LEAVE_WINDOW(wxAuiManager::OnLeaveWindow) EVT_CHILD_FOCUS(wxAuiManager::OnChildFocus) - EVT_AUI_FINDMANAGER(wxAuiManager::OnFindManager) + EVT_AUI_FIND_MANAGER(wxAuiManager::OnFindManager) EVT_TIMER(101, wxAuiManager::OnHintFadeTimer) END_EVENT_TABLE() @@ -504,6 +499,8 @@ wxAuiManager::wxAuiManager(wxWindow* managed_wnd, unsigned int flags) m_skipping = false; m_has_maximized = false; m_frame = NULL; + m_dock_constraint_x = 0.3; + m_dock_constraint_y = 0.3; if (managed_wnd) { @@ -647,7 +644,7 @@ wxFrame* wxAuiManager::GetFrame() const // need to be managed by the manager itself. wxAuiManager* wxAuiManager::GetManager(wxWindow* window) { - wxAuiManagerEvent evt(wxEVT_AUI_FINDMANAGER); + wxAuiManagerEvent evt(wxEVT_AUI_FIND_MANAGER); evt.SetManager(NULL); evt.ResumePropagation(wxEVENT_PROPAGATE_MAX); if (!window->ProcessEvent(evt)) @@ -825,10 +822,19 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) if (!window) return false; - // check if the pane already exists + // check if the window is already managed by us if (GetPane(pane_info.window).IsOk()) return false; + // check if the pane name already exists, this could reveal a + // bug in the library user's application + bool already_exists = false; + if (!pane_info.name.empty() && GetPane(pane_info.name).IsOk()) + { + wxFAIL_MSG(wxT("A pane with that name already exists in the manager!")); + already_exists = true; + } + // if the new pane is docked then we should undo maximize if (pane_info.IsDocked()) RestoreMaximizedPane(); @@ -840,8 +846,9 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) // set the pane window pinfo.window = window; + // if the pane's name identifier is blank, create a random string - if (pinfo.name.empty()) + if (pinfo.name.empty() || already_exists) { pinfo.name.Printf(wxT("%08lx%08x%08x%08lx"), ((unsigned long)pinfo.window) & 0xffffffff, @@ -1962,17 +1969,22 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, } } - if (!(m_flags & wxAUI_MGR_NO_DOCK_SIZE_LIMIT)) - { - // new dock's size may not be more than 1/3 of the frame size - if (dock.IsHorizontal()) - size = wxMin(size, cli_size.y/3); - else - size = wxMin(size, cli_size.x/3); - } + + // new dock's size may not be more than the dock constraint + // parameter specifies. See SetDockSizeConstraint() + int max_dock_x_size = (int)(m_dock_constraint_x * ((double)cli_size.x)); + int max_dock_y_size = (int)(m_dock_constraint_y * ((double)cli_size.y)); + + if (dock.IsHorizontal()) + size = wxMin(size, max_dock_y_size); + else + size = wxMin(size, max_dock_x_size); + + // absolute minimum size for a dock is 10 pixels if (size < 10) size = 10; + dock.size = size; } @@ -2205,6 +2217,27 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, } +// SetDockSizeConstraint() allows the dock constraints to be set. For example, +// specifying values of 0.5, 0.5 will mean that upon dock creation, a dock may +// not be larger than half of the window's size + +void wxAuiManager::SetDockSizeConstraint(double width_pct, double height_pct) +{ + m_dock_constraint_x = wxMax(0.0, wxMin(1.0, width_pct)); + m_dock_constraint_y = wxMax(0.0, wxMin(1.0, height_pct)); +} + +void wxAuiManager::GetDockSizeConstraint(double* width_pct, double* height_pct) const +{ + if (width_pct) + *width_pct = m_dock_constraint_x; + + if (height_pct) + *height_pct = m_dock_constraint_y; +} + + + // Update() updates the layout. Whenever changes are made to // one or more panes, this function should be called. It is the // external entry point for running the layout engine. @@ -3440,7 +3473,7 @@ void wxAuiManager::OnFloatingPaneClosed(wxWindow* wnd, wxCloseEvent& evt) // fire pane close event - wxAuiManagerEvent e(wxEVT_AUI_PANECLOSE); + wxAuiManagerEvent e(wxEVT_AUI_PANE_CLOSE); e.SetPane(&pane); e.SetCanVeto(evt.CanVeto()); ProcessMgrEvent(e); @@ -3748,6 +3781,26 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event) else if (part->type == wxAuiDockUIPart::typeCaption || part->type == wxAuiDockUIPart::typeGripper) { + // if we are managing a wxAuiFloatingFrame window, then + // we are an embedded wxAuiManager inside the wxAuiFloatingFrame. + // We want to initiate a toolbar drag in our owner manager + wxWindow* managed_wnd = GetManagedWindow(); + + if (part->pane && + part->pane->window && + managed_wnd && + managed_wnd->IsKindOf(CLASSINFO(wxAuiFloatingFrame))) + { + wxAuiFloatingFrame* floating_frame = (wxAuiFloatingFrame*)managed_wnd; + wxAuiManager* owner_mgr = floating_frame->GetOwnerManager(); + owner_mgr->StartPaneDrag(part->pane->window, + wxPoint(event.m_x - part->rect.x, + event.m_y - part->rect.y)); + return; + } + + + if (part->dock && part->dock->dock_direction == wxAUI_DOCK_CENTER) return; @@ -3983,7 +4036,7 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) if (m_action_part == HitTest(event.GetX(), event.GetY())) { // fire button-click event - wxAuiManagerEvent e(wxEVT_AUI_PANEBUTTON); + wxAuiManagerEvent e(wxEVT_AUI_PANE_BUTTON); e.SetManager(this); e.SetPane(m_action_part->pane); e.SetButton(m_action_part->button->button_id); @@ -4233,7 +4286,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) if (evt.button == wxAUI_BUTTON_CLOSE) { // fire pane close event - wxAuiManagerEvent e(wxEVT_AUI_PANECLOSE); + wxAuiManagerEvent e(wxEVT_AUI_PANE_CLOSE); e.SetManager(this); e.SetPane(evt.pane); ProcessMgrEvent(e); @@ -4247,7 +4300,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && !pane.IsMaximized()) { // fire pane close event - wxAuiManagerEvent e(wxEVT_AUI_PANEMAXIMIZE); + wxAuiManagerEvent e(wxEVT_AUI_PANE_MAXIMIZE); e.SetManager(this); e.SetPane(evt.pane); ProcessMgrEvent(e); @@ -4261,7 +4314,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && pane.IsMaximized()) { // fire pane close event - wxAuiManagerEvent e(wxEVT_AUI_PANERESTORE); + wxAuiManagerEvent e(wxEVT_AUI_PANE_RESTORE); e.SetManager(this); e.SetPane(evt.pane); ProcessMgrEvent(e);