X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2a8f8889eb5676b8b606759630f586a47aae7025..50e27899137071a7379e0bcca3ced4097d982e5b:/src/aui/framemanager.cpp diff --git a/src/aui/framemanager.cpp b/src/aui/framemanager.cpp index 7344576a2d..5ae4d181a1 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,7 +499,10 @@ 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; + m_reserved = NULL; + if (managed_wnd) { SetManagedWindow(managed_wnd); @@ -513,6 +511,13 @@ wxAuiManager::wxAuiManager(wxWindow* managed_wnd, unsigned int flags) wxAuiManager::~wxAuiManager() { + for ( size_t i = 0; i < m_panes.size(); i++ ) + { + wxAuiPaneInfo& pinfo = m_panes[i]; + if (pinfo.window && !pinfo.window->GetParent()) + delete pinfo.window; + } + delete m_art; } @@ -614,7 +619,7 @@ void wxAuiManager::SetFlags(unsigned int flags) // set the new flags m_flags = flags; - + if (update_hint_wnd) { UpdateHintWindowConfig(); @@ -647,12 +652,12 @@ 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)) return NULL; - + return evt.GetManager(); } @@ -661,7 +666,7 @@ void wxAuiManager::UpdateHintWindowConfig() { // find out if the the system can do transparent frames bool can_do_transparent = false; - + wxWindow* w = m_frame; while (w) { @@ -671,10 +676,10 @@ void wxAuiManager::UpdateHintWindowConfig() can_do_transparent = f->CanSetTransparent(); break; } - + w = w->GetParent(); } - + // if there is an existing hint window, delete it if (m_hint_wnd) { @@ -684,9 +689,9 @@ void wxAuiManager::UpdateHintWindowConfig() m_hint_fademax = 50; m_hint_wnd = NULL; - + if ((m_flags & wxAUI_MGR_TRANSPARENT_HINT) && can_do_transparent) - { + { // Make a window to use for a transparent hint #if defined(__WXMSW__) || defined(__WXGTK__) m_hint_wnd = new wxFrame(m_frame, wxID_ANY, wxEmptyString, @@ -714,9 +719,9 @@ void wxAuiManager::UpdateHintWindowConfig() // blue. p->SetBackgroundColour(*wxBLUE); #endif - + } - else + else { if ((m_flags & wxAUI_MGR_TRANSPARENT_HINT) != 0 || (m_flags & wxAUI_MGR_VENETIAN_BLINDS_HINT) != 0) @@ -825,9 +830,13 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) if (!window) return false; + // 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; - - // check if the pane already exists if (!pane_info.name.empty() && GetPane(pane_info.name).IsOk()) { wxFAIL_MSG(wxT("A pane with that name already exists in the manager!")); @@ -870,14 +879,14 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) button.button_id = wxAUI_BUTTON_MAXIMIZE_RESTORE; pinfo.buttons.Add(button); } - + if (pinfo.HasPinButton()) { wxAuiPaneButton button; button.button_id = wxAUI_BUTTON_PIN; pinfo.buttons.Add(button); } - + if (pinfo.HasCloseButton()) { wxAuiPaneButton button; @@ -918,8 +927,8 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info) } bool wxAuiManager::AddPane(wxWindow* window, - int direction, - const wxString& caption) + int direction, + const wxString& caption) { wxAuiPaneInfo pinfo; pinfo.Caption(caption); @@ -935,8 +944,8 @@ bool wxAuiManager::AddPane(wxWindow* window, } bool wxAuiManager::AddPane(wxWindow* window, - const wxAuiPaneInfo& pane_info, - const wxPoint& drop_pos) + const wxAuiPaneInfo& pane_info, + const wxPoint& drop_pos) { if (!AddPane(window, pane_info)) return false; @@ -981,7 +990,7 @@ bool wxAuiManager::InsertPane(wxWindow* window, const wxAuiPaneInfo& pane_info, { return AddPane(window, pane_info); } - else + else { if (pane_info.IsFloating()) { @@ -991,7 +1000,7 @@ bool wxAuiManager::InsertPane(wxWindow* window, const wxAuiPaneInfo& pane_info, if (pane_info.floating_size != wxDefaultSize) existing_pane.FloatingSize(pane_info.floating_size); } - else + else { // if the new pane is docked then we should undo maximize RestoreMaximizedPane(); @@ -1033,7 +1042,7 @@ bool wxAuiManager::DetachPane(wxWindow* window) { m_action_window = NULL; } - + p.window->Reparent(m_frame); p.frame->SetSizer(NULL); p.frame->Destroy(); @@ -1094,7 +1103,7 @@ void wxAuiManager::ClosePane(wxAuiPaneInfo& pane_info) } // now we need to either destroy or hide the pane - if (pane_info.IsDestroyOnClose()) + if (pane_info.IsDestroyOnClose()) { wxWindow * window = pane_info.window; DetachPane(window); @@ -1102,8 +1111,8 @@ void wxAuiManager::ClosePane(wxAuiPaneInfo& pane_info) { window->Destroy(); } - } - else + } + else { pane_info.Hide(); } @@ -1120,7 +1129,13 @@ void wxAuiManager::MaximizePane(wxAuiPaneInfo& pane_info) if (!p.IsToolbar()) { p.Restore(); - p.SaveHidden(); + + // save hidden state + p.SetFlag(wxAuiPaneInfo::savedHiddenState, + p.HasFlag(wxAuiPaneInfo::optionHidden)); + + // hide the pane, because only the newly + // maximized pane should show p.Hide(); } } @@ -1147,7 +1162,8 @@ void wxAuiManager::RestorePane(wxAuiPaneInfo& pane_info) wxAuiPaneInfo& p = m_panes.Item(i); if (!p.IsToolbar()) { - p.RestoreHidden(); + p.SetFlag(wxAuiPaneInfo::optionHidden, + p.HasFlag(wxAuiPaneInfo::savedHiddenState)); } } @@ -1312,7 +1328,7 @@ wxString wxAuiManager::SavePerspective() { wxString result; result.Alloc(500); - result = wxT("layout1|"); + result = wxT("layout2|"); int pane_i, pane_count = m_panes.GetCount(); for (pane_i = 0; pane_i < pane_count; ++pane_i) @@ -1343,11 +1359,13 @@ bool wxAuiManager::LoadPerspective(const wxString& layout, bool update) wxString part; // check layout string version + // 'layout1' = wxAUI 0.9.0 - wxAUI 0.9.2 + // 'layout2' = wxAUI 0.9.2 (wxWidgets 2.8) part = input.BeforeFirst(wxT('|')); input = input.AfterFirst(wxT('|')); part.Trim(true); part.Trim(false); - if (part != wxT("layout1")) + if (part != wxT("layout2")) return false; // mark all panes currently managed as docked and hidden @@ -1467,7 +1485,7 @@ void wxAuiManager::GetPanePositionsAndSizes(wxAuiDockInfo& dock, size += gripper_size; size += pane.best_size.x; } - else + else { if (pane.HasGripper() && pane.HasGripperTop()) size += gripper_size; @@ -1492,7 +1510,7 @@ void wxAuiManager::GetPanePositionsAndSizes(wxAuiDockInfo& dock, if (amount >= 0) offset += amount; - else + else positions[pane_i] -= -amount; offset += sizes[pane_i]; @@ -1506,7 +1524,7 @@ void wxAuiManager::GetPanePositionsAndSizes(wxAuiDockInfo& dock, int amount = positions[pane_i] - offset; if (amount >= 0) offset += amount; - else + else positions[pane_i] += -amount; offset += sizes[pane_i]; @@ -1515,10 +1533,10 @@ void wxAuiManager::GetPanePositionsAndSizes(wxAuiDockInfo& dock, void wxAuiManager::LayoutAddPane(wxSizer* cont, - wxAuiDockInfo& dock, - wxAuiPaneInfo& pane, - wxAuiDockUIPartArray& uiparts, - bool spacer_only) + wxAuiDockInfo& dock, + wxAuiPaneInfo& pane, + wxAuiDockUIPartArray& uiparts, + bool spacer_only) { wxAuiDockUIPart part; wxSizerItem* sizer_item; @@ -1533,7 +1551,7 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont, int orientation; if (dock.IsHorizontal()) orientation = wxHORIZONTAL; - else + else orientation = wxVERTICAL; // this variable will store the proportion @@ -1597,7 +1615,7 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont, part.sizer_item = sizer_item; uiparts.Add(part); } - + // if we have buttons, add a little space to the right // of them to ease visual crowding if (button_count >= 1) @@ -1636,7 +1654,7 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont, // determine if the pane should have a minimum size; if the pane is - // non-resizable (fixed) then we must set a minimum size. Alternitavely, + // non-resizable (fixed) then we must set a minimum size. Alternatively, // if the pane.min_size is set, we must use that value as well wxSize min_size = pane.min_size; @@ -1678,7 +1696,7 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont, part.sizer_item = sizer_item; uiparts.Add(part); } - else + else { sizer_item = cont->Add(horz_pane_sizer, pane_proportion, wxEXPAND); } @@ -1731,7 +1749,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, { wxAuiPaneInfo& pane = *(dock.panes.Item(pane_i)); int pane_pos = pane_positions.Item(pane_i); - + if (pane.IsMaximized()) has_maximized_pane = true; @@ -1741,7 +1759,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, { if (dock.IsVertical()) sizer_item = dock_sizer->Add(1, amount, 0, wxEXPAND); - else + else sizer_item = dock_sizer->Add(amount, 1, 0, wxEXPAND); part.type = wxAuiDockUIPart::typeBackground; @@ -1778,7 +1796,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, for (pane_i = 0; pane_i < pane_count; ++pane_i) { wxAuiPaneInfo& pane = *(dock.panes.Item(pane_i)); - + if (pane.IsMaximized()) has_maximized_pane = true; @@ -1804,7 +1822,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, if (dock.dock_direction == wxAUI_DOCK_CENTER || has_maximized_pane) sizer_item = cont->Add(dock_sizer, 1, wxEXPAND); - else + else sizer_item = cont->Add(dock_sizer, 0, wxEXPAND); part.type = wxAuiDockUIPart::typeDock; @@ -1818,7 +1836,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, if (dock.IsHorizontal()) cont->SetItemMinSize(dock_sizer, 0, dock.size); - else + else cont->SetItemMinSize(dock_sizer, dock.size, 0); // top and left docks have a sash after them @@ -1841,9 +1859,9 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont, } wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, - wxAuiDockInfoArray& docks, - wxAuiDockUIPartArray& uiparts, - bool spacer_only) + wxAuiDockInfoArray& docks, + wxAuiDockUIPartArray& uiparts, + bool spacer_only) { wxBoxSizer* container = new wxBoxSizer(wxVERTICAL); @@ -1855,7 +1873,19 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, // empty all docks out for (i = 0, dock_count = docks.GetCount(); i < dock_count; ++i) - docks.Item(i).panes.Empty(); + { + wxAuiDockInfo& dock = docks.Item(i); + + // empty out all panes, as they will be readded below + dock.panes.Empty(); + + if (dock.fixed) + { + // always reset fixed docks' sizes, because + // the contained windows may have been resized + dock.size = 0; + } + } // iterate through all known panes, filing each @@ -1876,7 +1906,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, // found the right dock dock = arr.Item(0); } - else + else { // dock was not found, so we need to create a new one wxAuiDockInfo d; @@ -1898,7 +1928,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, if (!FindPaneInDock(*dock, p.window)) dock->panes.Add(&p); } - else + else { // remove the pane from any existing docks RemovePaneFromDocks(docks, p); @@ -1939,7 +1969,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, if (dock.IsHorizontal()) size = wxMax(pane_size.y, size); - else + else size = wxMax(pane_size.x, size); } @@ -1968,17 +1998,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; } @@ -2001,7 +2036,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, if (pane.min_size.y > dock_min_size) dock_min_size = pane.min_size.y; } - else + else { if (pane.min_size.x > dock_min_size) dock_min_size = pane.min_size.x; @@ -2070,7 +2105,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, int amount = pane.dock_pos - offset; if (amount >= 0) offset += amount; - else + else pane.dock_pos += -amount; offset += pane_sizes[j]; @@ -2147,7 +2182,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, for (row = 0,row_count = arr.GetCount(); rowAdd(1,1, 1, wxEXPAND); @@ -2161,7 +2196,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes, uiparts.Add(part); } } - else + else { middle->Add(old_cont, 1, wxEXPAND); } @@ -2211,6 +2246,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. @@ -2259,7 +2315,7 @@ void wxAuiManager::Update() { m_action_window = NULL; } - + p.window->Reparent(m_frame); p.frame->SetSizer(NULL); p.frame->Destroy(); @@ -2301,7 +2357,7 @@ void wxAuiManager::Update() if (p.IsShown() && !frame->IsShown()) frame->Show(); } - else + else { // frame already exists, make sure it's position // and size reflect the information in wxAuiPaneInfo @@ -2322,7 +2378,7 @@ void wxAuiManager::Update() p.frame->Show(p.IsShown()); } } - else + else { if (p.window->IsShown() != p.IsShown()) p.window->Show(p.IsShown()); @@ -2525,7 +2581,7 @@ int wxAuiManager::GetDockPixelOffset(wxAuiPaneInfo& test) { if (dock.IsVertical()) return dock.rect.y; - else + else return dock.rect.x; } } @@ -2540,7 +2596,7 @@ int wxAuiManager::GetDockPixelOffset(wxAuiPaneInfo& test) // the target info. If the operation was allowed, the function returns true. bool wxAuiManager::ProcessDockResult(wxAuiPaneInfo& target, - const wxAuiPaneInfo& new_pos) + const wxAuiPaneInfo& new_pos) { bool allowed = false; switch (new_pos.dock_direction) @@ -2601,10 +2657,10 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_LEFT), GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)), GetMaxLayer(docks, wxAUI_DOCK_TOP)) + 1; - + if (drop.IsToolbar()) new_layer = auiToolBarLayer; - + drop.Dock().Left(). Layer(new_layer). Row(0). @@ -2617,10 +2673,10 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_TOP), GetMaxLayer(docks, wxAUI_DOCK_LEFT)), GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1; - + if (drop.IsToolbar()) new_layer = auiToolBarLayer; - + drop.Dock().Top(). Layer(new_layer). Row(0). @@ -2632,11 +2688,11 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, { int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_RIGHT), GetMaxLayer(docks, wxAUI_DOCK_TOP)), - GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)) + 1; - + GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)) + 1; + if (drop.IsToolbar()) new_layer = auiToolBarLayer; - + drop.Dock().Right(). Layer(new_layer). Row(0). @@ -2649,10 +2705,10 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, int new_layer = wxMax( wxMax( GetMaxLayer(docks, wxAUI_DOCK_BOTTOM), GetMaxLayer(docks, wxAUI_DOCK_LEFT)), GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1; - + if (drop.IsToolbar()) new_layer = auiToolBarLayer; - + drop.Dock().Bottom(). Layer(new_layer). Row(0). @@ -2674,7 +2730,7 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, int dock_drop_offset = 0; if (part->dock->IsHorizontal()) dock_drop_offset = pt.x - part->dock->rect.x - offset.x; - else + else dock_drop_offset = pt.y - part->dock->rect.y - offset.y; @@ -2893,23 +2949,19 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, insert_layer = 0; insert_dock_row = true; - if (pt.x >= part->rect.x && - pt.x < part->rect.x+new_row_pixels_x) - insert_dir = wxAUI_DOCK_LEFT; - else - if (pt.y >= part->rect.y && - pt.y < part->rect.y+new_row_pixels_y) - insert_dir = wxAUI_DOCK_TOP; - else - if (pt.x >= part->rect.x + part->rect.width-new_row_pixels_x && - pt.x < part->rect.x + part->rect.width) - insert_dir = wxAUI_DOCK_RIGHT; - else - if (pt.y >= part->rect.y+ part->rect.height-new_row_pixels_y && - pt.y < part->rect.y + part->rect.height) - insert_dir = wxAUI_DOCK_BOTTOM; - else - return false; + const wxRect& pr = part->rect; + if (pt.x >= pr.x && pt.x < pr.x + new_row_pixels_x) + insert_dir = wxAUI_DOCK_LEFT; + else if (pt.y >= pr.y && pt.y < pr.y + new_row_pixels_y) + insert_dir = wxAUI_DOCK_TOP; + else if (pt.x >= pr.x + pr.width - new_row_pixels_x && + pt.x < pr.x + pr.width) + insert_dir = wxAUI_DOCK_RIGHT; + else if (pt.y >= pr.y+ pr.height - new_row_pixels_y && + pt.y < pr.y + pr.height) + insert_dir = wxAUI_DOCK_BOTTOM; + else + return false; insert_row = GetMaxRow(panes, insert_dir, insert_layer) + 1; } @@ -2935,7 +2987,7 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks, offset = pt.y - part->rect.y; size = part->rect.GetHeight(); } - else + else { offset = pt.x - part->rect.x; size = part->rect.GetWidth(); @@ -3001,7 +3053,7 @@ void wxAuiManager::ShowHint(const wxRect& rect) m_last_hint = rect; m_hint_fadeamt = m_hint_fademax; - + if ((m_flags & wxAUI_MGR_HINT_FADE) && !((m_hint_wnd->IsKindOf(CLASSINFO(wxPseudoTransparentFrame))) && (m_flags & wxAUI_MGR_NO_VENETIAN_BLINDS_FADE)) @@ -3029,11 +3081,11 @@ void wxAuiManager::ShowHint(const wxRect& rect) m_hint_fadetimer.Start(5); } } - else // Not using a transparent hint window... + else // Not using a transparent hint window... { if (!(m_flags & wxAUI_MGR_RECTANGLE_HINT)) return; - + if (m_last_hint != rect) { // remove the last hint rectangle @@ -3115,16 +3167,16 @@ void wxAuiManager::StartPaneDrag(wxWindow* pane_window, wxAuiPaneInfo& pane = GetPane(pane_window); if (!pane.IsOk()) return; - + if (pane.IsToolbar()) { m_action = actionDragToolbarPane; } - else + else { m_action = actionDragFloatingPane; } - + m_action_window = pane_window; m_action_offset = offset; m_frame->CaptureMouse(); @@ -3213,6 +3265,12 @@ wxRect wxAuiManager::CalculateHintRect(wxWindow* pane_window, // actually show the hint rectangle on the screen m_frame->ClientToScreen(&rect.x, &rect.y); + if ( m_frame->GetLayoutDirection() == wxLayout_RightToLeft ) + { + // Mirror rectangle in RTL mode + rect.x -= rect.GetWidth(); + } + return rect; } @@ -3225,12 +3283,12 @@ void wxAuiManager::DrawHintRect(wxWindow* pane_window, const wxPoint& offset) { wxRect rect = CalculateHintRect(pane_window, pt, offset); - + if (rect.IsEmpty()) { HideHint(); } - else + else { ShowHint(rect); } @@ -3264,22 +3322,22 @@ void wxAuiManager::OnFloatingPaneMoving(wxWindow* wnd, wxDirection dir) pt.y = pos.y; // and some more pixels for the title bar pt.y -= 5; - } else - if (dir == wxWEST) + } + else if (dir == wxWEST) { // move to pane's left border wxPoint pos( 0,0 ); pos = wnd->ClientToScreen( pos ); pt.x = pos.x; - } else - if (dir == wxEAST) + } + else if (dir == wxEAST) { // move to pane's right border wxPoint pos( wnd->GetSize().x, 0 ); pos = wnd->ClientToScreen( pos ); pt.x = pos.x; - } else - if (dir == wxSOUTH) + } + else if (dir == wxSOUTH) { // move to pane's bottom border wxPoint pos( 0, wnd->GetSize().y ); @@ -3367,22 +3425,22 @@ void wxAuiManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir) pt.y = pos.y; // and some more pixels for the title bar pt.y -= 10; - } else - if (dir == wxWEST) + } + else if (dir == wxWEST) { // move to pane's left border wxPoint pos( 0,0 ); pos = wnd->ClientToScreen( pos ); pt.x = pos.x; - } else - if (dir == wxEAST) + } + else if (dir == wxEAST) { // move to pane's right border wxPoint pos( wnd->GetSize().x, 0 ); pos = wnd->ClientToScreen( pos ); pt.x = pos.x; - } else - if (dir == wxSOUTH) + } + else if (dir == wxSOUTH) { // move to pane's bottom border wxPoint pos( 0, wnd->GetSize().y ); @@ -3418,7 +3476,7 @@ void wxAuiManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir) if (m_flags & wxAUI_MGR_TRANSPARENT_DRAG) pane.frame->SetTransparent(255); } - else if (m_has_maximized) + else if (m_has_maximized) { RestoreMaximizedPane(); } @@ -3446,7 +3504,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); @@ -3456,7 +3514,7 @@ void wxAuiManager::OnFloatingPaneClosed(wxWindow* wnd, wxCloseEvent& evt) evt.Veto(); return; } - else + else { ClosePane(pane); } @@ -3482,6 +3540,10 @@ void wxAuiManager::OnFloatingPaneActivated(wxWindow* wnd) void wxAuiManager::OnRender(wxAuiManagerEvent& evt) { + // if the frame is about to be deleted, don't bother + if (!m_frame || wxPendingDelete.Member(m_frame)) + return; + wxDC* dc = evt.GetDC(); #ifdef __WXMAC__ @@ -3596,7 +3658,7 @@ void wxAuiManager::OnSize(wxSizeEvent& event) { DoFrameLayout(); Repaint(); - + #if wxUSE_MDI if (m_frame->IsKindOf(CLASSINFO(wxMDIParentFrame))) { @@ -3620,7 +3682,7 @@ void wxAuiManager::OnFindManager(wxAuiManagerEvent& evt) evt.SetManager(NULL); return; } - + // if we are managing a child frame, get the 'real' manager if (window->IsKindOf(CLASSINFO(wxAuiFloatingFrame))) { @@ -3628,7 +3690,7 @@ void wxAuiManager::OnFindManager(wxAuiManagerEvent& evt) evt.SetManager(float_frame->GetOwnerManager()); return; } - + // return pointer to ourself evt.SetManager(this); } @@ -3657,10 +3719,10 @@ void wxAuiManager::OnSetCursor(wxSetCursorEvent& event) if (part->orientation == wxVERTICAL) cursor = wxCursor(wxCURSOR_SIZEWE); - else + else cursor = wxCursor(wxCURSOR_SIZENS); } - else if (part->type == wxAuiDockUIPart::typeGripper) + else if (part->type == wxAuiDockUIPart::typeGripper) { cursor = wxCursor(wxCURSOR_SIZING); } @@ -3677,17 +3739,17 @@ void wxAuiManager::UpdateButtonOnScreen(wxAuiDockUIPart* button_ui_part, wxAuiDockUIPart* hit_test = HitTest(event.GetX(), event.GetY()); if (!hit_test || !button_ui_part) return; - + int state = wxAUI_BUTTON_STATE_NORMAL; if (hit_test == button_ui_part) { if (event.LeftDown()) state = wxAUI_BUTTON_STATE_PRESSED; - else + else state = wxAUI_BUTTON_STATE_HOVER; } - else + else { if (event.LeftDown()) state = wxAUI_BUTTON_STATE_HOVER; @@ -3722,7 +3784,7 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event) { if (part->dock && part->dock->dock_direction == wxAUI_DOCK_CENTER) return; - + // a dock may not be resized if it has a single // pane which is not resizable if (part->type == wxAuiDockUIPart::typeDockSizer && part->dock && @@ -3742,7 +3804,7 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event) event.m_y - part->rect.y); m_frame->CaptureMouse(); } - else if (part->type == wxAuiDockUIPart::typePaneButton) + else if (part->type == wxAuiDockUIPart::typePaneButton) { m_action = actionClickButton; m_action_part = part; @@ -3751,9 +3813,29 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event) UpdateButtonOnScreen(part, event); } - else if (part->type == wxAuiDockUIPart::typeCaption || + 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; @@ -3828,8 +3910,8 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) Update(); Repaint(NULL); } - else if (m_action_part && - m_action_part->type == wxAuiDockUIPart::typePaneSizer) + else if (m_action_part && + m_action_part->type == wxAuiDockUIPart::typePaneSizer) { wxAuiDockInfo& dock = *m_action_part->dock; wxAuiPaneInfo& pane = *m_action_part->pane; @@ -3854,13 +3936,13 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) // this will help us recalculate the pane's proportion if (dock.IsHorizontal()) new_pixsize = new_pos.x - pane_part->rect.x; - else + else new_pixsize = new_pos.y - pane_part->rect.y; // determine the size of the dock, based on orientation if (dock.IsHorizontal()) dock_pixels = dock.rect.GetWidth(); - else + else dock_pixels = dock.rect.GetHeight(); // determine the total proportion of all resizable panes, @@ -3887,10 +3969,10 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) { if (dock.IsHorizontal()) dock_pixels -= p.best_size.x; - else + else dock_pixels -= p.best_size.y; } - else + else { total_proportion += p.dock_proportion; } @@ -3947,7 +4029,7 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event) if (pane.HasCaption()) min_size += caption_size; } - else + else { min_size += pane.min_size.x; } @@ -3989,7 +4071,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); @@ -4059,7 +4141,7 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) 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 + else pos.x = wxMax(0, event.m_x - m_action_offset.x); wxRect rect(m_frame->ClientToScreen(pos), @@ -4114,7 +4196,7 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) m_action_offset.x = 30; } } - else + else { m_action = actionDragToolbarPane; m_action_window = pane_info->window; @@ -4178,22 +4260,22 @@ void wxAuiManager::OnMotion(wxMouseEvent& event) UpdateButtonOnScreen(m_hover_button, event); Repaint(); } - + // mouse is over a button, so repaint the // button in hover mode UpdateButtonOnScreen(part, event); m_hover_button = part; - + } } - else + else { if (m_hover_button) { m_hover_button = NULL; Repaint(); } - else + else { event.Skip(); } @@ -4239,7 +4321,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); @@ -4253,7 +4335,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); @@ -4267,7 +4349,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); @@ -4278,7 +4360,7 @@ void wxAuiManager::OnPaneButton(wxAuiManagerEvent& evt) Update(); } } - else if (evt.button == wxAUI_BUTTON_PIN) + else if (evt.button == wxAUI_BUTTON_PIN) { if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && pane.IsFloatable())