wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BUTTON, wxAuiNotebookEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG, wxAuiNotebookEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_END_DRAG, wxAuiNotebookEvent);
+wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, wxAuiNotebookEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION, wxAuiNotebookEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND, wxAuiNotebookEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK, wxAuiNotebookEvent);
IMPLEMENT_CLASS(wxAuiNotebook, wxControl)
IMPLEMENT_CLASS(wxAuiTabCtrl, wxControl)
-IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxEvent)
+IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxBookCtrlEvent)
base_colour = base_colour.ChangeLightness(92);
}
+ m_active_colour = base_colour;
m_base_colour = base_colour;
wxColor border_colour = base_colour.ChangeLightness(75);
// draw base background color
wxRect r(tab_x, tab_y, tab_width, tab_height);
- dc.SetPen(m_base_colour_pen);
- dc.SetBrush(m_base_colour_brush);
+ dc.SetPen(wxPen(m_active_colour));
+ dc.SetBrush(wxBrush(m_active_colour));
dc.DrawRectangle(r.x+1, r.y+1, r.width-1, r.height-4);
// this white helps fill out the gradient at the top of the tab
dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height-4);
// these two points help the rounded corners appear more antialiased
- dc.SetPen(m_base_colour_pen);
+ dc.SetPen(wxPen(m_active_colour));
dc.DrawPoint(r.x+2, r.y+1);
dc.DrawPoint(r.x+r.width-2, r.y+1);
// draw gradient background
wxColor top_color = *wxWHITE;
- wxColor bottom_color = m_base_colour;
+ wxColor bottom_color = m_active_colour;
dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH);
}
else
m_measuring_font = font;
}
+void wxAuiDefaultTabArt::SetColour(const wxColour& colour)
+{
+ m_base_colour = colour;
+ m_border_pen = wxPen(m_base_colour.ChangeLightness(75));
+ m_base_colour_pen = wxPen(m_base_colour);
+ m_base_colour_brush = wxBrush(m_base_colour);
+}
+
+void wxAuiDefaultTabArt::SetActiveColour(const wxColour& colour)
+{
+ m_active_colour = colour;
+}
// -- wxAuiSimpleTabArt class implementation --
wxAuiTabArt* wxAuiSimpleTabArt::Clone()
{
- return static_cast<wxAuiTabArt*>(new wxAuiSimpleTabArt);
+ return new wxAuiSimpleTabArt(*this);
}
-
void wxAuiSimpleTabArt::SetFlags(unsigned int flags)
{
m_flags = flags;
m_fixed_tab_width = 220;
}
+void wxAuiSimpleTabArt::SetColour(const wxColour& colour)
+{
+ m_bkbrush = wxBrush(colour);
+ m_normal_bkbrush = wxBrush(colour);
+ m_normal_bkpen = wxPen(colour);
+}
+
+void wxAuiSimpleTabArt::SetActiveColour(const wxColour& colour)
+{
+ m_selected_bkbrush = wxBrush(colour);
+ m_selected_bkpen = wxPen(colour);
+}
+
void wxAuiSimpleTabArt::DrawBackground(wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& rect)
m_art->SetMeasuringFont(font);
}
+void wxAuiTabContainer::SetColour(const wxColour& colour)
+{
+ m_art->SetColour(colour);
+}
+
+void wxAuiTabContainer::SetActiveColour(const wxColour& colour)
+{
+ m_art->SetActiveColour(colour);
+}
+
void wxAuiTabContainer::SetRect(const wxRect& rect)
{
m_rect = rect;
void wxAuiTabCtrl::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event))
{
+ if (m_is_dragging)
+ {
+ m_is_dragging = false;
+
+ wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG, m_windowId);
+ evt.SetSelection(GetIdxFromWindow(m_click_tab));
+ evt.SetOldSelection(evt.GetSelection());
+ evt.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(evt);
+ }
}
void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt)
EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
wxAuiNotebook::OnTabEndDrag)
+ EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
+ wxEVT_COMMAND_AUINOTEBOOK_CANCEL_DRAG,
+ wxAuiNotebook::OnTabCancelDrag)
EVT_AUI_RANGE(wxAuiBaseTabCtrlId, wxAuiBaseTabCtrlId+500,
wxEVT_COMMAND_AUINOTEBOOK_DRAG_MOTION,
wxAuiNotebook::OnTabDragMotion)
wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
wxAuiNotebook::OnTabBgDClick)
EVT_NAVIGATION_KEY(wxAuiNotebook::OnNavigationKeyNotebook)
-
-#ifdef wxHAS_NATIVE_TAB_TRAVERSAL
- WX_EVENT_TABLE_CONTROL_CONTAINER(wxAuiNotebook)
-#else
- // Avoid clash with container event handler functions
- EVT_SET_FOCUS(wxAuiNotebook::OnFocus)
-#endif
END_EVENT_TABLE()
-WX_DELEGATE_TO_CONTROL_CONTAINER(wxAuiNotebook, wxControl)
-
-wxAuiNotebook::wxAuiNotebook()
+void wxAuiNotebook::Init()
{
m_curpage = -1;
m_tab_id_counter = wxAuiBaseTabCtrlId;
m_requested_tabctrl_height = -1;
}
-wxAuiNotebook::wxAuiNotebook(wxWindow *parent,
- wxWindowID id,
- const wxPoint& pos,
- const wxSize& size,
- long style) : wxControl(parent, id, pos, size, style)
-{
- m_dummy_wnd = NULL;
- m_requested_bmp_size = wxDefaultSize;
- m_requested_tabctrl_height = -1;
- InitNotebook(style);
-}
-
bool wxAuiNotebook::Create(wxWindow* parent,
wxWindowID id,
const wxPoint& pos,
// code called by all constructors
void wxAuiNotebook::InitNotebook(long style)
{
- WX_INIT_CONTROL_CONTAINER();
- // SetCanFocus(false);
-
SetName(wxT("wxAuiNotebook"));
m_curpage = -1;
m_tab_id_counter = wxAuiBaseTabCtrlId;
}
// SetSelection() sets the currently active page
-size_t wxAuiNotebook::SetSelection(size_t new_page)
+int wxAuiNotebook::SetSelection(size_t new_page)
{
- wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page);
- if (!wnd)
- return m_curpage;
-
- // don't change the page unless necessary;
- // however, clicking again on a tab should give it the focus.
- if ((int)new_page == m_curpage)
- {
- wxAuiTabCtrl* ctrl;
- int ctrl_idx;
- if (FindTab(wnd, &ctrl, &ctrl_idx))
- {
- if (FindFocus() != ctrl)
- ctrl->SetFocus();
- }
- return m_curpage;
- }
-
- wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId);
- evt.SetSelection(new_page);
- evt.SetOldSelection(m_curpage);
- evt.SetEventObject(this);
- if (!GetEventHandler()->ProcessEvent(evt) || evt.IsAllowed())
- {
- int old_curpage = m_curpage;
- m_curpage = new_page;
-
- // program allows the page change
- evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED);
- (void)GetEventHandler()->ProcessEvent(evt);
-
-
- wxAuiTabCtrl* ctrl;
- int ctrl_idx;
- if (FindTab(wnd, &ctrl, &ctrl_idx))
- {
- m_tabs.SetActivePage(wnd);
-
- ctrl->SetActivePage(ctrl_idx);
- DoSizing();
- ctrl->DoShowHide();
-
- ctrl->MakeTabVisible(ctrl_idx, ctrl);
-
- // set fonts
- wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes();
- size_t i, pane_count = all_panes.GetCount();
- for (i = 0; i < pane_count; ++i)
- {
- wxAuiPaneInfo& pane = all_panes.Item(i);
- if (pane.name == wxT("dummy"))
- continue;
- wxAuiTabCtrl* tabctrl = ((wxTabFrame*)pane.window)->m_tabs;
- if (tabctrl != ctrl)
- tabctrl->SetSelectedFont(m_normal_font);
- else
- tabctrl->SetSelectedFont(m_selected_font);
- tabctrl->Refresh();
- }
-
- // Set the focus to the page if we're not currently focused on the tab.
- // This is Firefox-like behaviour.
- if (wnd->IsShownOnScreen() && FindFocus() != ctrl)
- wnd->SetFocus();
-
- return old_curpage;
- }
- }
-
- return m_curpage;
+ return DoModifySelection(new_page, true);
}
void wxAuiNotebook::SetSelectionToWindow(wxWindow *win)
+void wxAuiNotebook::OnTabCancelDrag(wxAuiNotebookEvent& command_evt)
+{
+ wxAuiNotebookEvent& evt = (wxAuiNotebookEvent&)command_evt;
+
+ m_mgr.HideHint();
+
+ wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject();
+ wxCHECK_RET( src_tabs, _T("no source object?") );
+
+ src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW));
+}
+
wxAuiTabCtrl* wxAuiNotebook::GetTabCtrlFromPoint(const wxPoint& pt)
{
// if we've just removed the last tab from the source
wxControl::Thaw();
}
+void wxAuiNotebook::SetPageSize (const wxSize& WXUNUSED(size))
+{
+ wxFAIL_MSG("Not implemented for wxAuiNotebook");
+}
+
+int wxAuiNotebook::HitTest (const wxPoint& WXUNUSED(pt), long* WXUNUSED(flags)) const
+{
+ wxFAIL_MSG("Not implemented for wxAuiNotebook");
+ return wxNOT_FOUND;
+}
+
+int wxAuiNotebook::GetPageImage(size_t WXUNUSED(n)) const
+{
+ wxFAIL_MSG("Not implemented for wxAuiNotebook");
+ return -1;
+}
+
+bool wxAuiNotebook::SetPageImage(size_t n, int imageId)
+{
+ return SetPageBitmap(n, GetImageList()->GetBitmap(imageId));
+}
+
+wxWindow* wxAuiNotebook::GetCurrentPage () const
+{
+ return GetPage(GetSelection());
+}
+
+int wxAuiNotebook::ChangeSelection(size_t n)
+{
+ return DoModifySelection(n, false);
+}
+
+bool wxAuiNotebook::AddPage(wxWindow *page, const wxString &text, bool select,
+ int imageId)
+{
+ if(HasImageList())
+ {
+ return AddPage(page, text, select, GetImageList()->GetBitmap(imageId));
+ }
+ else
+ {
+ return AddPage(page, text, select, wxNullBitmap);
+ }
+}
+
+bool wxAuiNotebook::DeleteAllPages()
+{
+ size_t count = GetPageCount();
+ for(size_t i = 0; i < count; i++)
+ {
+ DeletePage(0);
+ }
+ return true;
+}
+
+bool wxAuiNotebook::InsertPage(size_t index, wxWindow *page,
+ const wxString &text, bool select,
+ int imageId)
+{
+ if(HasImageList())
+ {
+ return InsertPage(index, page, text, select,
+ GetImageList()->GetBitmap(imageId));
+ }
+ else
+ {
+ return InsertPage(index, page, text, select, wxNullBitmap);
+ }
+}
+
+int wxAuiNotebook::DoModifySelection(size_t n, bool events)
+{
+ wxWindow* wnd = m_tabs.GetWindowFromIdx(n);
+ if (!wnd)
+ return m_curpage;
+
+ // don't change the page unless necessary;
+ // however, clicking again on a tab should give it the focus.
+ if ((int)n == m_curpage)
+ {
+ wxAuiTabCtrl* ctrl;
+ int ctrl_idx;
+ if (FindTab(wnd, &ctrl, &ctrl_idx))
+ {
+ if (FindFocus() != ctrl)
+ ctrl->SetFocus();
+ }
+ return m_curpage;
+ }
+
+ bool vetoed = false;
+
+ wxAuiNotebookEvent evt(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId);
+
+ if(events)
+ {
+ evt.SetSelection(n);
+ evt.SetOldSelection(m_curpage);
+ evt.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(evt);
+ vetoed = !evt.IsAllowed();
+ }
+
+ if (!vetoed)
+ {
+ int old_curpage = m_curpage;
+ m_curpage = n;
+
+ // program allows the page change
+ if(events)
+ {
+ evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED);
+ (void)GetEventHandler()->ProcessEvent(evt);
+ }
+
+
+ wxAuiTabCtrl* ctrl;
+ int ctrl_idx;
+ if (FindTab(wnd, &ctrl, &ctrl_idx))
+ {
+ m_tabs.SetActivePage(wnd);
+
+ ctrl->SetActivePage(ctrl_idx);
+ DoSizing();
+ ctrl->DoShowHide();
+
+ ctrl->MakeTabVisible(ctrl_idx, ctrl);
+
+ // set fonts
+ wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes();
+ size_t i, pane_count = all_panes.GetCount();
+ for (i = 0; i < pane_count; ++i)
+ {
+ wxAuiPaneInfo& pane = all_panes.Item(i);
+ if (pane.name == wxT("dummy"))
+ continue;
+ wxAuiTabCtrl* tabctrl = ((wxTabFrame*)pane.window)->m_tabs;
+ if (tabctrl != ctrl)
+ tabctrl->SetSelectedFont(m_normal_font);
+ else
+ tabctrl->SetSelectedFont(m_selected_font);
+ tabctrl->Refresh();
+ }
+
+ // Set the focus to the page if we're not currently focused on the tab.
+ // This is Firefox-like behaviour.
+ if (wnd->IsShownOnScreen() && FindFocus() != ctrl)
+ wnd->SetFocus();
+
+ return old_curpage;
+ }
+ }
+
+ return m_curpage;
+}
+
+
#endif // wxUSE_AUI