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)
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)
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;
for (i = 0; i < page_count; ++i)
{
wxAuiNotebookPage& page = pages.Item(i);
- ShowWnd(page.window, page.active);
+ if (!page.active)
+ ShowWnd(page.window, false);
}
}
// 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())
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;
if (new_active)
{
m_curpage = -1;
- SetSelection(m_tabs.GetIdxFromWindow(new_active));
+ SetSelectionToWindow(new_active);
}
return true;
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)
{
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
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
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();
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&)
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();
// 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);
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;
}
// 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
insert_idx = dest_tabs->GetIdxFromWindow(target);
}
}
- else
+ else
{
wxPoint zero(0,0);
wxRect rect = m_mgr.CalculateHintRect(m_dummy_wnd,
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();
}
{
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);
}
}