X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6a93539e74b5b932679de0f49a56c37b06b22424..c8743553a137e13f8e66ff191c8da9b34cc62b8f:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index eabe9a747a..4ecd4c1617 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -57,27 +57,15 @@ IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxEvent) -// This functions are here for this proof of concept -// and will be factored out later. See dockart.cpp -static wxColor StepColour(const wxColor& c, int percent) -{ - int r = c.Red(), g = c.Green(), b = c.Blue(); - return wxColour((unsigned char)wxMin((r*percent)/100,255), - (unsigned char)wxMin((g*percent)/100,255), - (unsigned char)wxMin((b*percent)/100,255)); -} +// these functions live in dockart.cpp -- they'll eventually +// be moved to a new utility cpp file -// This functions are here for this proof of concept -// and will be factored out later. See dockart.cpp -static wxBitmap BitmapFromBits(const unsigned char bits[], int w, int h, - const wxColour& color) -{ - wxImage img = wxBitmap((const char*)bits, w, h).ConvertToImage(); - img.Replace(0,0,0,123,123,123); - img.Replace(255,255,255,color.Red(),color.Green(),color.Blue()); - img.SetMaskColour(123,123,123); - return wxBitmap(img); -} +wxColor wxAuiStepColour(const wxColor& c, int percent); + +wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, + const wxColour& color); + +wxString wxAuiChopText(wxDC& dc, const wxString& text, int max_size); static void DrawButtons(wxDC& dc, const wxRect& _rect, @@ -96,8 +84,8 @@ static void DrawButtons(wxDC& dc, if (button_state == wxAUI_BUTTON_STATE_HOVER || button_state == wxAUI_BUTTON_STATE_PRESSED) { - dc.SetBrush(wxBrush(StepColour(bkcolour, 120))); - dc.SetPen(wxPen(StepColour(bkcolour, 70))); + dc.SetBrush(wxBrush(wxAuiStepColour(bkcolour, 120))); + dc.SetPen(wxPen(wxAuiStepColour(bkcolour, 75))); // draw the background behind the button dc.DrawRectangle(rect.x, rect.y, 15, 15); @@ -116,36 +104,6 @@ static void IndentPressedBitmap(wxRect* rect, int button_state) } } -// chops the text so that it fits within |max_size| pixels. -// Also adds an elipsis if necessary - -static wxString ChopText(wxDC& dc, const wxString& text, int max_size) -{ - wxCoord x,y; - - // first check if the text fits with no problems - dc.GetTextExtent(text, &x, &y); - if (x <= max_size) - return text; - - size_t i, len = text.Length(); - size_t last_good_length = 0; - for (i = 0; i < len; ++i) - { - wxString s = text.Left(i); - s += wxT("..."); - - dc.GetTextExtent(s, &x, &y); - if (x > max_size) - break; - - last_good_length = i; - } - - wxString ret = text.Left(last_good_length); - ret += wxT("..."); - return ret; -} // -- GUI helper classes and functions -- @@ -235,24 +193,33 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt() wxColor base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); #endif + // the base_colour is too pale to use as our base colour, + // so darken it a bit -- + if ((255-base_colour.Red()) + + (255-base_colour.Green()) + + (255-base_colour.Blue()) < 60) + { + base_colour = wxAuiStepColour(base_colour, 92); + } + m_base_colour = base_colour; - wxColor darker2_colour = StepColour(base_colour, 70); + wxColor border_colour = wxAuiStepColour(base_colour, 75); - m_border_pen = wxPen(darker2_colour); + m_border_pen = wxPen(border_colour); m_base_colour_pen = wxPen(m_base_colour); m_base_colour_brush = wxBrush(m_base_colour); - m_active_close_bmp = BitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabled_close_bmp = BitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + m_active_close_bmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabled_close_bmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - m_active_left_bmp = BitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabled_left_bmp = BitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + m_active_left_bmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabled_left_bmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - m_active_right_bmp = BitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabled_right_bmp = BitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + m_active_right_bmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabled_right_bmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - m_active_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabled_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + m_active_windowlist_bmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabled_windowlist_bmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); m_flags = 0; } @@ -308,8 +275,8 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, { // draw background wxRect r(rect.x, rect.y, rect.width+2, rect.height-3); - wxColor top_color = StepColour(m_base_colour, 90); - wxColor bottom_color = StepColour(m_base_colour, 110); + wxColor top_color = wxAuiStepColour(m_base_colour, 90); + wxColor bottom_color = wxAuiStepColour(m_base_colour, 170); dc.GradientFillLinear(r, top_color, bottom_color, wxSOUTH); // draw base lines @@ -332,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, @@ -346,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); @@ -359,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); @@ -371,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; @@ -396,6 +361,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, if (tab_x + clip_width > in_rect.x + in_rect.width) clip_width = (in_rect.x + in_rect.width) - tab_x; +/* wxPoint clip_points[6]; clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); clip_points[1] = wxPoint(tab_x, tab_y+2); @@ -410,7 +376,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxRegion clipping_region(WXSIZEOF(clip_points), clip_points); dc.SetClippingRegion(clipping_region); #endif // !wxDFB && !wxCocoa +*/ + // since the above code above doesn't play well with WXDFB or WXCOCOA, + // 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); @@ -424,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 @@ -432,12 +403,12 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, wxRect r(tab_x, tab_y, tab_width, tab_height); dc.SetPen(m_base_colour_pen); dc.SetBrush(m_base_colour_brush); - dc.DrawRectangle(r.x, r.y, r.width, r.height); + 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.SetPen(*wxWHITE_PEN); dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle(r.x+2, r.y+1, r.width-3, r.height); + 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); @@ -473,7 +444,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // -- draw top gradient fill for glossy look wxColor top_color = m_base_colour; - wxColor bottom_color = StepColour(top_color, 106); + wxColor bottom_color = wxAuiStepColour(top_color, 160); dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); r.y += r.height; @@ -492,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); @@ -511,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) + 1, + 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 @@ -530,7 +501,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, } - wxString draw_text = ChopText(dc, + wxString draw_text = wxAuiChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width); @@ -625,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()) + 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()) return; @@ -692,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; - 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) @@ -709,15 +674,9 @@ int wxAuiDefaultTabArt::ShowWindowList(wxWindow* wnd, menuPopup.Check(1000+active_idx, true); } - // find out where to put the popup menu of window - // items. Subtract 100 for now to center the menu - // a bit, until a better mechanism can be implemented + // find out where to put the popup menu of window items wxPoint pt = ::wxGetMousePosition(); pt = wnd->ScreenToClient(pt); - if (pt.x < 100) - pt.x = 0; - else - pt.x -= 100; // find out the screen coordinate at the bottom of the tab ctrl wxRect cli_rect = wnd->GetClientRect(); @@ -736,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); @@ -814,7 +773,7 @@ wxAuiSimpleTabArt::wxAuiSimpleTabArt() wxColour base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - wxColour background_colour = StepColour(base_colour, 95); + wxColour background_colour = base_colour; wxColour normaltab_colour = base_colour; wxColour selectedtab_colour = *wxWHITE; @@ -824,17 +783,17 @@ wxAuiSimpleTabArt::wxAuiSimpleTabArt() m_selected_bkbrush = wxBrush(selectedtab_colour); m_selected_bkpen = wxPen(selectedtab_colour); - m_active_close_bmp = BitmapFromBits(close_bits, 16, 16, *wxBLACK); - m_disabled_close_bmp = BitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); + m_active_close_bmp = wxAuiBitmapFromBits(close_bits, 16, 16, *wxBLACK); + m_disabled_close_bmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxColour(128,128,128)); - m_active_left_bmp = BitmapFromBits(left_bits, 16, 16, *wxBLACK); - m_disabled_left_bmp = BitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); + m_active_left_bmp = wxAuiBitmapFromBits(left_bits, 16, 16, *wxBLACK); + m_disabled_left_bmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxColour(128,128,128)); - m_active_right_bmp = BitmapFromBits(right_bits, 16, 16, *wxBLACK); - m_disabled_right_bmp = BitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); + m_active_right_bmp = wxAuiBitmapFromBits(right_bits, 16, 16, *wxBLACK); + m_disabled_right_bmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxColour(128,128,128)); - m_active_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, *wxBLACK); - m_disabled_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); + m_active_windowlist_bmp = wxAuiBitmapFromBits(list_bits, 16, 16, *wxBLACK); + m_disabled_windowlist_bmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxColour(128,128,128)); } @@ -907,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, @@ -921,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); @@ -934,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); @@ -945,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); @@ -1012,7 +969,7 @@ void wxAuiSimpleTabArt::DrawTab(wxDC& dc, text_offset = tab_x + tab_height; // chop text if necessary - wxString draw_text = ChopText(dc, + wxString draw_text = wxAuiChopText(dc, caption, tab_width - (text_offset-tab_x) - close_button_width); @@ -1026,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; @@ -1087,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()) - { - 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()) @@ -1154,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; - 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) @@ -1198,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); @@ -1700,7 +1650,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) button.id, button.cur_state, wxRIGHT, - wxNullBitmap, &button.rect); offset -= button.rect.GetWidth(); @@ -1730,7 +1679,6 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) button.id, button.cur_state, wxLEFT, - wxNullBitmap, &button.rect); offset += button.rect.GetWidth(); @@ -1808,10 +1756,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, @@ -1853,10 +1799,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, @@ -2002,6 +1946,7 @@ BEGIN_EVENT_TABLE(wxAuiTabCtrl, wxControl) 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) @@ -2060,7 +2005,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); @@ -2232,16 +2181,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) { @@ -2348,29 +2288,27 @@ public: }; - +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() @@ -2378,7 +2316,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; @@ -2416,7 +2354,7 @@ 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; @@ -2432,7 +2370,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)); @@ -2648,6 +2587,12 @@ bool wxAuiNotebook::InsertPage(size_t page_idx, 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) + m_curpage = GetPageIndex(page); + wxAuiTabCtrl* active_tabctrl = GetActiveTabCtrl(); if (page_idx >= active_tabctrl->GetPageCount()) active_tabctrl->AddPage(page, info); @@ -2825,6 +2770,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 (new_page == m_curpage) + return m_curpage; + wxWindow* wnd = m_tabs.GetWindowFromIdx(new_page); if (!wnd) return m_curpage; @@ -2984,11 +2933,6 @@ bool wxAuiNotebook::FindTab(wxWindow* page, wxAuiTabCtrl** ctrl, int* idx) return false; } - -void wxAuiNotebook::OnEraseBackground(wxEraseEvent&) -{ -} - void wxAuiNotebook::OnSize(wxSizeEvent& evt) { UpdateHintWindowSize(); @@ -3339,6 +3283,10 @@ 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();