X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/72d5e8d9175fb2fdd4903f5b85a599b514696e67..779e158bb20a8c56551f6b61dac6d194d230d828:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index c7d18b61d2..87fcc78454 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -25,11 +25,11 @@ #ifndef WX_PRECOMP #include "wx/settings.h" #include "wx/image.h" + #include "wx/menu.h" #endif #include "wx/aui/tabmdi.h" #include "wx/dcbuffer.h" -#include "wx/menu.h" #ifdef __WXMAC__ #include "wx/mac/carbon/private.h" @@ -201,7 +201,7 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt() { base_colour = wxAuiStepColour(base_colour, 92); } - + m_base_colour = base_colour; wxColor border_colour = wxAuiStepColour(base_colour, 75); @@ -244,7 +244,7 @@ void wxAuiDefaultTabArt::SetSizingInfo(const wxSize& tab_ctrl_size, m_fixed_tab_width = 100; int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4; - + if (m_flags & wxAUI_NB_CLOSE_BUTTON) tot_width -= m_active_close_bmp.GetWidth(); if (m_flags & wxAUI_NB_WINDOWLIST_BUTTON) @@ -299,10 +299,8 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxWindow* wnd, + const wxAuiNotebookPage& page, const wxRect& in_rect, - const wxString& caption_text, - const wxBitmap& bitmap, - bool active, int close_button_state, wxRect* out_tab_rect, wxRect* out_button_rect, @@ -313,8 +311,8 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxCoord textx, texty; // if the caption is empty, measure some temporary text - wxString caption = caption_text; - if (caption_text.empty()) + wxString caption = page.caption; + if (caption.empty()) caption = wxT("Xj"); dc.SetFont(m_selected_font); @@ -326,9 +324,9 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // figure out the size of the tab wxSize tab_size = GetTabSize(dc, wnd, - caption, - bitmap, - active, + page.caption, + page.bitmap, + page.active, close_button_state, x_extent); @@ -338,12 +336,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - caption = caption_text; + caption = page.caption; // select pen, brush and font for the tab to be drawn - if (active) + if (page.active) { dc.SetFont(m_selected_font); textx = selected_textx; @@ -383,7 +381,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // we'll just use a rectangle for the clipping region for now -- dc.SetClippingRegion(tab_x, tab_y, clip_width+1, tab_height-3); - + wxPoint border_points[6]; border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); border_points[1] = wxPoint(tab_x, tab_y+2); @@ -397,7 +395,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, int drawn_tab_height = border_points[0].y - border_points[1].y; - if (active) + if (page.active) { // draw active tab @@ -443,15 +441,15 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, r.width -= 4; r.height /= 2; r.height--; - + // -- draw top gradient fill for glossy look wxColor top_color = m_base_colour; wxColor bottom_color = wxAuiStepColour(top_color, 160); dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); - + r.y += r.height; r.y--; - + // -- draw bottom fill for glossy look top_color = m_base_colour; bottom_color = m_base_colour; @@ -465,7 +463,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // there are two horizontal grey lines at the bottom of the tab control, // this gets rid of the top one of those lines in the tab control - if (active) + if (page.active) { wxColor start_color = m_base_colour; dc.SetPen(m_base_colour_pen); @@ -484,17 +482,17 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, } - if (bitmap.IsOk()) + if (page.bitmap.IsOk()) { int bitmap_offset = tab_x + 8; // draw bitmap - dc.DrawBitmap(bitmap, + dc.DrawBitmap(page.bitmap, bitmap_offset, - drawn_tab_yoff + (drawn_tab_height/2) - (bitmap.GetHeight()/2), + drawn_tab_yoff + (drawn_tab_height/2) - (page.bitmap.GetHeight()/2), true); - text_offset = bitmap_offset + bitmap.GetWidth(); + text_offset = bitmap_offset + page.bitmap.GetWidth(); text_offset += 3; // bitmap padding } else @@ -598,47 +596,40 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc, int bitmap_id, int button_state, int orientation, - const wxBitmap& bitmap_override, wxRect* out_rect) { wxBitmap bmp; wxRect rect; - if (bitmap_override.IsOk()) - { - bmp = bitmap_override; - } - else + switch (bitmap_id) { - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_close_bmp; - else - bmp = m_active_close_bmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_left_bmp; - else - bmp = m_active_left_bmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_right_bmp; - else - bmp = m_active_right_bmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_windowlist_bmp; - else - bmp = m_active_windowlist_bmp; - break; - } + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_close_bmp; + else + bmp = m_active_close_bmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_left_bmp; + else + bmp = m_active_left_bmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_right_bmp; + else + bmp = m_active_right_bmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_windowlist_bmp; + else + bmp = m_active_windowlist_bmp; + break; } + if (!bmp.IsOk()) return; @@ -665,16 +656,17 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc, } -int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd, - const wxArrayString& items, - int active_idx) +int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int active_idx) { - wxMenu menuPopup; + wxMenu menuPopup; - size_t i, count = items.GetCount(); + size_t i, count = pages.GetCount(); for (i = 0; i < count; ++i) { - menuPopup.AppendCheckItem(1000+i, items.Item(i)); + const wxAuiNotebookPage& page = pages.Item(i); + menuPopup.AppendCheckItem(1000+i, page.caption); } if (active_idx != -1) @@ -703,7 +695,7 @@ int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd, } int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, - wxAuiNotebookPageArray& pages, + const wxAuiNotebookPageArray& pages, const wxSize& required_bmp_size) { wxClientDC dc(wnd); @@ -718,7 +710,7 @@ int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, measure_bmp.Create(required_bmp_size.x, required_bmp_size.y); } - + int max_y = 0; size_t i, page_count = pages.GetCount(); @@ -744,7 +736,7 @@ int wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd, true, wxAUI_BUTTON_STATE_HIDDEN, &x_ext); - + max_y = wxMax(max_y, s.y); } @@ -874,10 +866,8 @@ void wxAuiSimpleTabArt::DrawBackground(wxDC& dc, void wxAuiSimpleTabArt::DrawTab(wxDC& dc, wxWindow* wnd, + const wxAuiNotebookPage& page, const wxRect& in_rect, - const wxString& caption_text, - const wxBitmap& bitmap, - bool active, int close_button_state, wxRect* out_tab_rect, wxRect* out_button_rect, @@ -888,8 +878,8 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, wxCoord textx, texty; // if the caption is empty, measure some temporary text - wxString caption = caption_text; - if (caption_text.empty()) + wxString caption = page.caption; + if (caption.empty()) caption = wxT("Xj"); dc.SetFont(m_selected_font); @@ -901,9 +891,9 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, // figure out the size of the tab wxSize tab_size = GetTabSize(dc, wnd, - caption, - bitmap, - active, + page.caption, + page.bitmap, + page.active, close_button_state, x_extent); @@ -912,11 +902,11 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, wxCoord tab_x = in_rect.x; wxCoord tab_y = in_rect.y + in_rect.height - tab_height; - caption = caption_text; + caption = page.caption; // select pen, brush and font for the tab to be drawn - if (active) + if (page.active) { dc.SetPen(m_selected_bkpen); dc.SetBrush(m_selected_bkbrush); @@ -993,7 +983,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN) { wxBitmap bmp; - if (active) + if (page.active) bmp = m_active_close_bmp; else bmp = m_disabled_close_bmp; @@ -1054,45 +1044,37 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc, int bitmap_id, int button_state, int orientation, - const wxBitmap& bitmap_override, wxRect* out_rect) { wxBitmap bmp; wxRect rect; - if (bitmap_override.IsOk()) + switch (bitmap_id) { - bmp = bitmap_override; - } - else - { - switch (bitmap_id) - { - case wxAUI_BUTTON_CLOSE: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_close_bmp; - else - bmp = m_active_close_bmp; - break; - case wxAUI_BUTTON_LEFT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_left_bmp; - else - bmp = m_active_left_bmp; - break; - case wxAUI_BUTTON_RIGHT: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_right_bmp; - else - bmp = m_active_right_bmp; - break; - case wxAUI_BUTTON_WINDOWLIST: - if (button_state & wxAUI_BUTTON_STATE_DISABLED) - bmp = m_disabled_windowlist_bmp; - else - bmp = m_active_windowlist_bmp; - break; - } + case wxAUI_BUTTON_CLOSE: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_close_bmp; + else + bmp = m_active_close_bmp; + break; + case wxAUI_BUTTON_LEFT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_left_bmp; + else + bmp = m_active_left_bmp; + break; + case wxAUI_BUTTON_RIGHT: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_right_bmp; + else + bmp = m_active_right_bmp; + break; + case wxAUI_BUTTON_WINDOWLIST: + if (button_state & wxAUI_BUTTON_STATE_DISABLED) + bmp = m_disabled_windowlist_bmp; + else + bmp = m_active_windowlist_bmp; + break; } if (!bmp.IsOk()) @@ -1121,16 +1103,17 @@ void wxAuiSimpleTabArt::DrawButton(wxDC& dc, } -int wxAuiSimpleTabArt::ShowWindowList(wxWindow* wnd, - const wxArrayString& items, - int active_idx) +int wxAuiSimpleTabArt::ShowDropDown(wxWindow* wnd, + const wxAuiNotebookPageArray& pages, + int active_idx) { - wxMenu menuPopup; + wxMenu menuPopup; - size_t i, count = items.GetCount(); + size_t i, count = pages.GetCount(); for (i = 0; i < count; ++i) { - menuPopup.AppendCheckItem(1000+i, items.Item(i)); + const wxAuiNotebookPage& page = pages.Item(i); + menuPopup.AppendCheckItem(1000+i, page.caption); } if (active_idx != -1) @@ -1165,7 +1148,7 @@ int wxAuiSimpleTabArt::ShowWindowList(wxWindow* wnd, } int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd, - wxAuiNotebookPageArray& WXUNUSED(pages), + const wxAuiNotebookPageArray& WXUNUSED(pages), const wxSize& WXUNUSED(required_bmp_size)) { wxClientDC dc(wnd); @@ -1471,6 +1454,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; @@ -1667,7 +1657,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) button.id, button.cur_state, wxRIGHT, - wxNullBitmap, &button.rect); offset -= button.rect.GetWidth(); @@ -1697,7 +1686,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) button.id, button.cur_state, wxLEFT, - wxNullBitmap, &button.rect); offset += button.rect.GetWidth(); @@ -1775,10 +1763,8 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) m_art->DrawTab(dc, wnd, + page, rect, - page.caption, - page.bitmap, - page.active, tab_button.cur_state, &page.rect, &tab_button.rect, @@ -1820,10 +1806,8 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) rect.x = active_offset; m_art->DrawTab(dc, wnd, + page, active_rect, - page.caption, - page.bitmap, - page.active, tab_button.cur_state, &page.rect, &tab_button.rect, @@ -1973,7 +1957,7 @@ BEGIN_EVENT_TABLE(wxAuiTabCtrl, wxControl) EVT_LEFT_UP(wxAuiTabCtrl::OnLeftUp) EVT_MOTION(wxAuiTabCtrl::OnMotion) EVT_LEAVE_WINDOW(wxAuiTabCtrl::OnLeaveWindow) - EVT_AUINOTEBOOK_BUTTON(-1, wxAuiTabCtrl::OnButton) + EVT_AUINOTEBOOK_BUTTON(wxID_ANY, wxAuiTabCtrl::OnButton) END_EVENT_TABLE() @@ -2028,7 +2012,11 @@ void wxAuiTabCtrl::OnLeftDown(wxMouseEvent& evt) { int new_selection = GetIdxFromWindow(wnd); - if (new_selection != GetActivePage()) + // wxAuiNotebooks always want to receive this event + // even if the tab is already active, because they may + // have multiple tab controls + if (new_selection != GetActivePage() || + GetParent()->IsKindOf(CLASSINFO(wxAuiNotebook))) { wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); e.SetSelection(new_selection); @@ -2200,16 +2188,7 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event) } else if (button == wxAUI_BUTTON_WINDOWLIST) { - wxArrayString as; - - size_t i, page_count = m_pages.GetCount(); - for (i = 0; i < page_count; ++i) - { - wxAuiNotebookPage& page = m_pages.Item(i); - as.Add(page.caption); - } - - int idx = GetArtProvider()->ShowWindowList(this, as, GetActivePage()); + int idx = GetArtProvider()->ShowDropDown(this, m_pages, GetActivePage()); if (idx != -1) { @@ -2316,7 +2295,7 @@ public: }; - +const int wxAuiBaseTabCtrlId = 5380; // -- wxAuiNotebook class implementation -- @@ -2324,19 +2303,19 @@ public: BEGIN_EVENT_TABLE(wxAuiNotebook, wxControl) EVT_SIZE(wxAuiNotebook::OnSize) EVT_CHILD_FOCUS(wxAuiNotebook::OnChildFocus) - EVT_COMMAND_RANGE(10000, 10100, + EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, wxAuiNotebook::OnTabClicked) - EVT_COMMAND_RANGE(10000, 10100, + EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebook::OnTabBeginDrag) - EVT_COMMAND_RANGE(10000, 10100, + EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, wxAuiNotebook::OnTabEndDrag) - EVT_COMMAND_RANGE(10000, 10100, + EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebook::OnTabDragMotion) - EVT_COMMAND_RANGE(10000, 10100, + EVT_COMMAND_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500, wxEVT_COMMAND_AUINOTEBOOK_BUTTON, wxAuiNotebook::OnTabButton) END_EVENT_TABLE() @@ -2344,7 +2323,7 @@ END_EVENT_TABLE() wxAuiNotebook::wxAuiNotebook() { m_curpage = -1; - m_tab_id_counter = 10000; + m_tab_id_counter = wxAuiBaseTabCtrlId; m_dummy_wnd = NULL; m_tab_ctrl_height = 20; m_requested_bmp_size = wxDefaultSize; @@ -2382,11 +2361,11 @@ bool wxAuiNotebook::Create(wxWindow* parent, void wxAuiNotebook::InitNotebook(long style) { m_curpage = -1; - m_tab_id_counter = 10000; + m_tab_id_counter = wxAuiBaseTabCtrlId; m_dummy_wnd = NULL; m_flags = (unsigned int)style; m_tab_ctrl_height = 20; - + m_normal_font = *wxNORMAL_FONT; m_selected_font = *wxNORMAL_FONT; m_selected_font.SetWeight(wxBOLD); @@ -2398,7 +2377,8 @@ void wxAuiNotebook::InitNotebook(long style) m_dummy_wnd->Show(false); m_mgr.SetManagedWindow(this); - m_mgr.SetFlags(wxAUI_MGR_DEFAULT | (1 << 28) /*wxAUI_MGR_NO_DOCK_SIZE_LIMIT*/); + m_mgr.SetFlags(wxAUI_MGR_DEFAULT); + m_mgr.SetDockSizeConstraint(1.0, 1.0); // no dock size constraint m_mgr.AddPane(m_dummy_wnd, wxAuiPaneInfo().Name(wxT("dummy")).Bottom().CaptionVisible(false).Show(false)); @@ -2428,7 +2408,7 @@ void wxAuiNotebook::SetArtProvider(wxAuiTabArt* art) void wxAuiNotebook::SetTabCtrlHeight(int height) { m_requested_tabctrl_height = height; - + // if window is already initialized, recalculate the tab height if (m_dummy_wnd) { @@ -2447,7 +2427,7 @@ void wxAuiNotebook::SetTabCtrlHeight(int height) void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size) { m_requested_bmp_size = size; - + // if window is already initialized, recalculate the tab height if (m_dummy_wnd) { @@ -2461,7 +2441,7 @@ void wxAuiNotebook::UpdateTabCtrlHeight() { // get the tab ctrl height we will use int height = CalculateTabCtrlHeight(); - + // if the tab control height needs to change, update // all of our tab controls with the new height if (m_tab_ctrl_height != height) @@ -2489,7 +2469,7 @@ void wxAuiNotebook::UpdateTabCtrlHeight() void wxAuiNotebook::UpdateHintWindowSize() { wxSize size = CalculateNewSplitSize(); - + // the placeholder hint window should be set to this size wxAuiPaneInfo& info = m_mgr.GetPane(wxT("dummy")); if (info.IsOk()) @@ -2517,7 +2497,7 @@ wxSize wxAuiNotebook::CalculateNewSplitSize() } wxSize new_split_size; - + // if there is only one tab control, the first split // should happen around the middle if (tab_ctrl_count < 2) @@ -2532,7 +2512,7 @@ wxSize wxAuiNotebook::CalculateNewSplitSize() // that needs to be implemented new_split_size = wxSize(180,180); } - + return new_split_size; } @@ -2543,7 +2523,7 @@ int wxAuiNotebook::CalculateTabCtrlHeight() // tab height if (m_requested_tabctrl_height != -1) return m_requested_tabctrl_height; - + // find out new best tab height wxAuiTabArt* art = m_tabs.GetArtProvider(); @@ -2760,6 +2740,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) { @@ -2787,6 +2777,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 @@ -2797,6 +2797,10 @@ int wxAuiNotebook::GetSelection() const // SetSelection() sets the currently active page size_t wxAuiNotebook::SetSelection(size_t new_page) { + // don't change the page unless necessary + if ((int)new_page == m_curpage) + return m_curpage; + wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page); if (!wnd) return m_curpage; @@ -2956,10 +2960,124 @@ 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 + SetSelection(m_tabs.GetIdxFromWindow(page_info.window)); + + UpdateHintWindowSize(); +} + + void wxAuiNotebook::OnSize(wxSizeEvent& evt) { UpdateHintWindowSize(); - + evt.Skip(); } @@ -3306,8 +3424,12 @@ void wxAuiNotebook::OnTabEndDrag(wxCommandEvent& command_evt) 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 SetSelection(m_tabs.GetIdxFromWindow(page_info.window)); - + UpdateHintWindowSize(); } }