X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c58ba15f083aa287c17fe40501f0a53b16cf685a..40e5ebbf98728d627e4d3c9e3a57f28f5bb8fcb9:/src/aui/auibook.cpp?ds=inline diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index e6baedb46d..405ae7bffa 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -230,7 +230,12 @@ wxAuiDefaultTabArt::~wxAuiDefaultTabArt() wxAuiTabArt* wxAuiDefaultTabArt::Clone() { - return static_cast(new wxAuiDefaultTabArt); + wxAuiDefaultTabArt* art = new wxAuiDefaultTabArt; + art->SetNormalFont(m_normal_font); + art->SetSelectedFont(m_selected_font); + art->SetMeasuringFont(m_measuring_font); + + return art; } void wxAuiDefaultTabArt::SetFlags(unsigned int flags) @@ -666,7 +671,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 +1449,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) @@ -1454,6 +1466,13 @@ wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx) return m_pages[idx]; } +const wxAuiNotebookPage& wxAuiTabContainer::GetPage(size_t idx) const +{ + wxASSERT_MSG(idx < m_pages.GetCount(), wxT("Invalid Page index")); + + return m_pages[idx]; +} + wxAuiNotebookPageArray& wxAuiTabContainer::GetPages() { return m_pages; @@ -1928,7 +1947,8 @@ void wxAuiTabContainer::DoShowHide() for (i = 0; i < page_count; ++i) { wxAuiNotebookPage& page = pages.Item(i); - ShowWnd(page.window, page.active); + if (!page.active) + ShowWnd(page.window, false); } } @@ -2217,6 +2237,11 @@ public: m_tab_ctrl_height = 20; } + ~wxTabFrame() + { + wxDELETE(m_tabs); + } + void SetTabCtrlHeight(int h) { m_tab_ctrl_height = h; @@ -2591,7 +2616,8 @@ bool wxAuiNotebook::InsertPage(size_t page_idx, // select is false, it must become the "current page" // (though no select events will be fired) if (!select && m_tabs.GetPageCount() == 1) - m_curpage = GetPageIndex(page); + select = true; + //m_curpage = GetPageIndex(page); wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl(); if (page_idx >= active_tabctrl->GetPageCount()) @@ -2605,10 +2631,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; @@ -2694,7 +2717,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; @@ -2733,6 +2756,16 @@ bool wxAuiNotebook::SetPageText(size_t page_idx, const wxString& text) return true; } +// returns the page caption +wxString wxAuiNotebook::GetPageText(size_t page_idx) const +{ + if (page_idx >= m_tabs.GetPageCount()) + return wxEmptyString; + + // update our own tab catalog + const wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx); + return page_info.caption; +} bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap) { @@ -2760,6 +2793,16 @@ bool wxAuiNotebook::SetPageBitmap(size_t page_idx, const wxBitmap& bitmap) return true; } +// returns the page bitmap +wxBitmap wxAuiNotebook::GetPageBitmap(size_t page_idx) const +{ + if (page_idx >= m_tabs.GetPageCount()) + return wxBitmap(); + + // update our own tab catalog + const wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx); + return page_info.bitmap; +} // GetSelection() returns the index of the currently active page int wxAuiNotebook::GetSelection() const @@ -2829,6 +2872,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 @@ -2933,6 +2984,120 @@ bool wxAuiNotebook::FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx) return false; } +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; + src_tabs = NULL; + if (!FindTab(wnd, &src_tabs, &src_idx)) + return; + if (!src_tabs || src_idx == -1) + return; + + // choose a split size + wxSize split_size; + if (GetPageCount() > 2) + { + split_size = CalculateNewSplitSize(); + } + else + { + // because there are two panes, always split them + // equally + split_size = GetClientSize(); + 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); + new_tabs->SetTabCtrlHeight(m_tab_ctrl_height); + new_tabs->m_tabs = new wxAuiTabCtrl(this, + m_tab_id_counter++, + wxDefaultPosition, + wxDefaultSize, + wxNO_BORDER); + new_tabs->m_tabs->SetArtProvider(m_tabs.GetArtProvider()->Clone()); + new_tabs->m_tabs->SetFlags(m_flags); + dest_tabs = new_tabs->m_tabs; + + // create a pane info structure with the information + // about where the pane should be added + wxAuiPaneInfo pane_info = wxAuiPaneInfo().Bottom().CaptionVisible(false); + wxPoint mouse_pt; + + if (direction == wxLEFT) + { + pane_info.Left(); + mouse_pt = wxPoint(0, cli_size.y/2); + } + else if (direction == wxRIGHT) + { + pane_info.Right(); + mouse_pt = wxPoint(cli_size.x, cli_size.y/2); + } + else if (direction == wxTOP) + { + pane_info.Top(); + mouse_pt = wxPoint(cli_size.x/2, 0); + } + else if (direction == wxBOTTOM) + { + 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; + src_tabs->RemovePage(page_info.window); + if (src_tabs->GetPageCount() > 0) + { + src_tabs->SetActivePage((size_t)0); + src_tabs->DoShowHide(); + src_tabs->Refresh(); + } + + + // add the page to the destination tabs + dest_tabs->InsertPage(page_info.window, page_info, 0); + + if (src_tabs->GetPageCount() == 0) + { + RemoveEmptyTabFrames(); + } + + DoSizing(); + dest_tabs->DoShowHide(); + dest_tabs->Refresh(); + + // force the set selection function reset the selection + m_curpage = -1; + + // set the active page to the one we just split off + SetSelectionToPage(page_info); + + UpdateHintWindowSize(); +} + + void wxAuiNotebook::OnSize(wxSizeEvent& evt) { UpdateHintWindowSize(); @@ -2950,10 +3115,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&) @@ -3100,12 +3262,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(); @@ -3155,9 +3314,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); @@ -3190,7 +3351,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; } @@ -3201,6 +3362,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 @@ -3223,7 +3386,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, @@ -3287,7 +3450,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(); } @@ -3426,16 +3589,68 @@ 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); } } } } +// Sets the normal font +void wxAuiNotebook::SetNormalFont(const wxFont& font) +{ + m_normal_font = font; + GetArtProvider()->SetNormalFont(font); +} + +// Sets the selected tab font +void wxAuiNotebook::SetSelectedFont(const wxFont& font) +{ + m_selected_font = font; + GetArtProvider()->SetSelectedFont(font); +} + +// Sets the measuring font +void wxAuiNotebook::SetMeasuringFont(const wxFont& font) +{ + GetArtProvider()->SetMeasuringFont(font); +} +// Sets the tab font +bool wxAuiNotebook::SetFont(const wxFont& font) +{ + wxControl::SetFont(font); + + wxFont normalFont(font); + wxFont selectedFont(normalFont); + selectedFont.SetWeight(wxBOLD); + + SetNormalFont(normalFont); + SetSelectedFont(selectedFont); + SetMeasuringFont(selectedFont); + + return true; +} + +// Gets the tab control height +int wxAuiNotebook::GetTabCtrlHeight() const +{ + return m_tab_ctrl_height; +} + +// Gets the height of the notebook for a given page height +int wxAuiNotebook::GetHeightForPageHeight(int pageHeight) +{ + UpdateTabCtrlHeight(); + + int tabCtrlHeight = GetTabCtrlHeight(); + int decorHeight = 2; + return tabCtrlHeight + pageHeight + decorHeight; +} #endif // wxUSE_AUI