#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"
{
base_colour = wxAuiStepColour(base_colour, 92);
}
-
+
m_base_colour = base_colour;
wxColor border_colour = wxAuiStepColour(base_colour, 75);
wxAuiTabArt* wxAuiDefaultTabArt::Clone()
{
- return static_cast<wxAuiTabArt*>(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)
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)
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,
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);
// 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);
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;
// 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);
int drawn_tab_height = border_points[0].y - border_points[1].y;
- if (active)
+ if (page.active)
{
// draw active tab
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;
// 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);
}
- 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
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;
}
-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);
+ 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 wxAuiDefaultTabArt::GetBestTabCtrlSize(wxWindow* wnd,
- wxAuiNotebookPageArray& pages,
+ const wxAuiNotebookPageArray& pages,
const wxSize& required_bmp_size)
{
wxClientDC dc(wnd);
measure_bmp.Create(required_bmp_size.x,
required_bmp_size.y);
}
-
+
int max_y = 0;
size_t i, page_count = pages.GetCount();
true,
wxAUI_BUTTON_STATE_HIDDEN,
&x_ext);
-
+
max_y = wxMax(max_y, s.y);
}
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,
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);
// 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);
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);
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;
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())
}
-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)
}
int wxAuiSimpleTabArt::GetBestTabCtrlSize(wxWindow* wnd,
- wxAuiNotebookPageArray& WXUNUSED(pages),
+ const wxAuiNotebookPageArray& WXUNUSED(pages),
const wxSize& WXUNUSED(required_bmp_size))
{
wxClientDC dc(wnd);
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;
button.id,
button.cur_state,
wxRIGHT,
- wxNullBitmap,
&button.rect);
offset -= button.rect.GetWidth();
button.id,
button.cur_state,
wxLEFT,
- wxNullBitmap,
&button.rect);
offset += button.rect.GetWidth();
m_art->DrawTab(dc,
wnd,
+ page,
rect,
- page.caption,
- page.bitmap,
- page.active,
tab_button.cur_state,
&page.rect,
&tab_button.rect,
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,
for (i = 0; i < page_count; ++i)
{
wxAuiNotebookPage& page = pages.Item(i);
- ShowWnd(page.window, page.active);
+ if (!page.active)
+ ShowWnd(page.window, false);
}
}
EVT_ERASE_BACKGROUND(wxAuiTabCtrl::OnEraseBackground)
EVT_SIZE(wxAuiTabCtrl::OnSize)
EVT_LEFT_DOWN(wxAuiTabCtrl::OnLeftDown)
+ EVT_LEFT_DCLICK(wxAuiTabCtrl::OnLeftDown)
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()
{
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);
}
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)
{
m_tab_ctrl_height = 20;
}
+ ~wxTabFrame()
+ {
+ wxDELETE(m_tabs);
+ }
+
void SetTabCtrlHeight(int h)
{
m_tab_ctrl_height = h;
};
-
+const int wxAuiBaseTabCtrlId = 5380;
// -- wxAuiNotebook class implementation --
BEGIN_EVENT_TABLE(wxAuiNotebook, wxControl)
- //EVT_ERASE_BACKGROUND(wxAuiNotebook::OnEraseBackground)
EVT_SIZE(wxAuiNotebook::OnSize)
- //EVT_LEFT_DOWN(wxAuiNotebook::OnLeftDown)
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()
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;
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);
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));
void wxAuiNotebook::SetTabCtrlHeight(int height)
{
m_requested_tabctrl_height = height;
-
+
// if window is already initialized, recalculate the tab height
if (m_dummy_wnd)
{
void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size)
{
m_requested_bmp_size = size;
-
+
// if window is already initialized, recalculate the tab height
if (m_dummy_wnd)
{
{
// 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)
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())
}
wxSize new_split_size;
-
+
// if there is only one tab control, the first split
// should happen around the middle
if (tab_ctrl_count < 2)
// that needs to be implemented
new_split_size = wxSize(180,180);
}
-
+
return new_split_size;
}
// tab height
if (m_requested_tabctrl_height != -1)
return m_requested_tabctrl_height;
-
+
// find out new best tab height
wxAuiTabArt* art = m_tabs.GetArtProvider();
m_tabs.InsertPage(page, info, page_idx);
+ // if that was the first page added, even if
+ // select is false, it must become the "current page"
+ // (though no select events will be fired)
+ if (!select && m_tabs.GetPageCount() == 1)
+ select = true;
+ //m_curpage = GetPageIndex(page);
+
wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl();
if (page_idx >= active_tabctrl->GetPageCount())
active_tabctrl->AddPage(page, info);
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
// 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;
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::OnEraseBackground(wxEraseEvent&)
+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();
-
+
evt.Skip();
}
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,
dest_tabs->DoShowHide();
dest_tabs->Refresh();
- SetSelection(m_tabs.GetIdxFromWindow(page_info.window));
-
+ // 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();
}
}
{
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