X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/092d7f88f6819e52dd8ea69d66e474571e527eba..129b8b1a215fc1fcc1b9f06daa0aeaf22bbce614:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index a3b7b64be8..64e0d728e5 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -666,7 +666,14 @@ int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, for (i = 0; i < count; ++i) { const wxAuiNotebookPage& page = pages.Item(i); - menuPopup.AppendCheckItem(1000+i, page.caption); + wxString caption = page.caption; + + // if there is no caption, make it a space. This will prevent + // an assert in the menu code. + if (caption.IsEmpty()) + caption = wxT(" "); + + menuPopup.AppendCheckItem(1000+i, caption); } if (active_idx != -1) @@ -1437,14 +1444,14 @@ wxWindow* wxAuiTabContainer::GetWindowFromIdx(size_t idx) const int wxAuiTabContainer::GetIdxFromWindow(wxWindow* wnd) const { - size_t i, page_count = m_pages.GetCount(); - for (i = 0; i < page_count; ++i) + const size_t page_count = m_pages.GetCount(); + for ( size_t i = 0; i < page_count; ++i ) { wxAuiNotebookPage& page = m_pages.Item(i); if (page.window == wnd) return i; } - return -1; + return wxNOT_FOUND; } wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx) @@ -2225,6 +2232,11 @@ public: m_tab_ctrl_height = 20; } + ~wxTabFrame() + { + wxDELETE(m_tabs); + } + void SetTabCtrlHeight(int h) { m_tab_ctrl_height = h; @@ -2614,10 +2626,7 @@ bool wxAuiNotebook::InsertPage(size_t page_idx, if (select) { - int idx = m_tabs.GetIdxFromWindow(page); - wxASSERT_MSG(idx != -1, wxT("Invalid Page index returned on wxAuiNotebook::InsertPage()")); - - SetSelection(idx); + SetSelectionToWindow(page); } return true; @@ -2703,7 +2712,7 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) if (new_active) { m_curpage = -1; - SetSelection(m_tabs.GetIdxFromWindow(new_active)); + SetSelectionToWindow(new_active); } return true; @@ -2858,6 +2867,14 @@ size_t wxAuiNotebook::SetSelection(size_t new_page) return m_curpage; } +void wxAuiNotebook::SetSelectionToWindow(wxWindow *win) +{ + const int idx = m_tabs.GetIdxFromWindow(win); + wxCHECK_RET( idx != wxNOT_FOUND, _T("invalid notebook page") ); + + SetSelection(idx); +} + // GetPageCount() returns the total number of // pages managed by the multi-notebook size_t wxAuiNotebook::GetPageCount() const @@ -2965,16 +2982,16 @@ bool wxAuiNotebook::FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx) void wxAuiNotebook::Split(size_t page, int direction) { wxSize cli_size = GetClientSize(); - + // get the page's window pointer wxWindow* wnd = GetPage(page); if (!wnd) return; - + // notebooks with 1 or less pages can't be split if (GetPageCount() < 2) return; - + // find out which tab control the page currently belongs to wxAuiTabCtrl *src_tabs, *dest_tabs; int src_idx = -1; @@ -2983,7 +3000,7 @@ void wxAuiNotebook::Split(size_t page, int direction) return; if (!src_tabs || src_idx == -1) return; - + // choose a split size wxSize split_size; if (GetPageCount() > 2) @@ -2998,8 +3015,8 @@ void wxAuiNotebook::Split(size_t page, int direction) split_size.x /= 2; split_size.y /= 2; } - - + + // create a new tab frame wxTabFrame* new_tabs = new wxTabFrame; new_tabs->m_rect = wxRect(wxPoint(0,0), split_size); @@ -3017,7 +3034,7 @@ void wxAuiNotebook::Split(size_t page, int direction) // about where the pane should be added wxAuiPaneInfo pane_info = wxAuiPaneInfo().Bottom().CaptionVisible(false); wxPoint mouse_pt; - + if (direction == wxLEFT) { pane_info.Left(); @@ -3038,10 +3055,10 @@ void wxAuiNotebook::Split(size_t page, int direction) pane_info.Bottom(); mouse_pt = wxPoint(cli_size.x/2, cli_size.y); } - + m_mgr.AddPane(new_tabs, pane_info, mouse_pt); m_mgr.Update(); - + // remove the page from the source tabs wxAuiNotebookPage page_info = src_tabs->GetPage(src_idx); page_info.active = false; @@ -3068,10 +3085,10 @@ void wxAuiNotebook::Split(size_t page, int direction) // force the set selection function reset the selection m_curpage = -1; - + // set the active page to the one we just split off - SetSelection(m_tabs.GetIdxFromWindow(page_info.window)); - + SetSelectionToPage(page_info); + UpdateHintWindowSize(); } @@ -3093,10 +3110,7 @@ void wxAuiNotebook::OnTabClicked(wxCommandEvent& command_evt) wxWindow* wnd = ctrl->GetWindowFromIdx(evt.GetSelection()); wxASSERT(wnd != NULL); - int idx = m_tabs.GetIdxFromWindow(wnd); - wxASSERT(idx != -1); - - SetSelection(idx); + SetSelectionToWindow(wnd); } void wxAuiNotebook::OnTabBeginDrag(wxCommandEvent&) @@ -3243,12 +3257,9 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject(); - wxAuiTabCtrl* dest_tabs = NULL; - if (src_tabs) - { - // set cursor back to an arrow - src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW)); - } + wxCHECK_RET( src_tabs, _T("no source object?") ); + + src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW)); // get the mouse position, which will be used to determine the drop point wxPoint mouse_screen_pt = ::wxGetMousePosition(); @@ -3298,9 +3309,11 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) // get main index of the page int main_idx = m_tabs.GetIdxFromWindow(src_page); + wxCHECK_RET( main_idx != wxNOT_FOUND, _T("no source page?") ); + // make a copy of the page info - wxAuiNotebookPage page_info = m_tabs.GetPage((size_t)main_idx); + wxAuiNotebookPage page_info = m_tabs.GetPage(main_idx); // remove the page from the source notebook RemovePage(main_idx); @@ -3333,7 +3346,7 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) dest_tabs->Refresh(); // set the selection in the destination tab control - nb->SetSelection(nb->m_tabs.GetIdxFromWindow(page_info.window)); + nb->SetSelectionToPage(page_info); return; } @@ -3344,6 +3357,8 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) // only perform a tab split if it's allowed + wxAuiTabCtrl* dest_tabs = NULL; + if ((m_flags & wxAUI_NB_TAB_SPLIT) && m_tabs.GetPageCount() >= 2) { // If the pointer is in an existing tab frame, do a tab insert @@ -3366,7 +3381,7 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) insert_idx = dest_tabs->GetIdxFromWindow(target); } } - else + else { wxPoint zero(0,0); wxRect rect = m_mgr.CalculateHintRect(m_dummy_wnd, @@ -3430,7 +3445,7 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) m_curpage = -1; // set the active page to the one we just split off - SetSelection(m_tabs.GetIdxFromWindow(page_info.window)); + SetSelectionToPage(page_info); UpdateHintWindowSize(); } @@ -3569,9 +3584,11 @@ void wxAuiNotebook::OnTabButton(wxCommandEvent& command_evt) { close_wnd->Close(); } - else + else { int main_idx = m_tabs.GetIdxFromWindow(close_wnd); + wxCHECK_RET( main_idx != wxNOT_FOUND, _T("no page to delete?") ); + DeletePage(main_idx); } }