X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..5eed855656b3996f4c0aa0a585a4820a2af6d628:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index 0d8462de1d..bc109ddec5 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -35,8 +35,6 @@ #ifdef __WXMAC__ #include "wx/osx/private.h" -// for themeing support -#include #endif #include "wx/arrimpl.cpp" @@ -70,8 +68,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxAuiNotebookEvent, wxEvent) // these functions live in dockart.cpp -- they'll eventually // be moved to a new utility cpp file -wxColor wxAuiStepColour(const wxColor& c, int percent); - wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, const wxColour& color); @@ -94,8 +90,8 @@ static void DrawButtons(wxDC& dc, if (button_state == wxAUI_BUTTON_STATE_HOVER || button_state == wxAUI_BUTTON_STATE_PRESSED) { - dc.SetBrush(wxBrush(wxAuiStepColour(bkcolour, 120))); - dc.SetPen(wxPen(wxAuiStepColour(bkcolour, 75))); + dc.SetBrush(wxBrush(bkcolour.ChangeLightness(120))); + dc.SetPen(wxPen(bkcolour.ChangeLightness(75))); // draw the background behind the button dc.DrawRectangle(rect.x, rect.y, 15, 15); @@ -147,33 +143,33 @@ private: // -- bitmaps -- #if defined( __WXMAC__ ) - static unsigned char close_bits[]={ + static const unsigned char close_bits[]={ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3, 0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3, 0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF }; #elif defined( __WXGTK__) - static unsigned char close_bits[]={ + static const unsigned char close_bits[]={ 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8, 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef, 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; #else - static unsigned char close_bits[]={ + static const unsigned char close_bits[]={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9, 0x9f, 0xfc, 0x3f, 0xfe, 0x3f, 0xfe, 0x9f, 0xfc, 0xcf, 0xf9, 0xe7, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; #endif -static unsigned char left_bits[] = { +static const unsigned char left_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0xfe, 0x1f, 0xfe, 0x0f, 0xfe, 0x1f, 0xfe, 0x3f, 0xfe, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -static unsigned char right_bits[] = { +static const unsigned char right_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9f, 0xff, 0x1f, 0xff, 0x1f, 0xfe, 0x1f, 0xfc, 0x1f, 0xfe, 0x1f, 0xff, 0x9f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; -static unsigned char list_bits[] = { +static const unsigned char list_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x0f, 0xf8, 0x1f, 0xfc, 0x3f, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; @@ -207,11 +203,11 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt() (255-base_colour.Green()) + (255-base_colour.Blue()) < 60) { - base_colour = wxAuiStepColour(base_colour, 92); + base_colour = base_colour.ChangeLightness(92); } m_base_colour = base_colour; - wxColor border_colour = wxAuiStepColour(base_colour, 75); + wxColor border_colour = base_colour.ChangeLightness(75); m_border_pen = wxPen(border_colour); m_base_colour_pen = wxPen(m_base_colour); @@ -238,12 +234,7 @@ wxAuiDefaultTabArt::~wxAuiDefaultTabArt() wxAuiTabArt* wxAuiDefaultTabArt::Clone() { - wxAuiDefaultTabArt* art = new wxAuiDefaultTabArt; - art->SetNormalFont(m_normal_font); - art->SetSelectedFont(m_selected_font); - art->SetMeasuringFont(m_measuring_font); - - return art; + return new wxAuiDefaultTabArt(*this); } void wxAuiDefaultTabArt::SetFlags(unsigned int flags) @@ -288,8 +279,8 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, { // draw background - wxColor top_color = wxAuiStepColour(m_base_colour, 90); - wxColor bottom_color = wxAuiStepColour(m_base_colour, 170); + wxColor top_color = m_base_colour.ChangeLightness(90); + wxColor bottom_color = m_base_colour.ChangeLightness(170); wxRect r; if (m_flags &wxAUI_NB_BOTTOM) @@ -490,7 +481,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // -- draw top gradient fill for glossy look wxColor top_color = m_base_colour; - wxColor bottom_color = wxAuiStepColour(top_color, 160); + wxColor bottom_color = top_color.ChangeLightness(160); dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); r.y += r.height; @@ -512,7 +503,7 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, if (page.active) { if (m_flags &wxAUI_NB_BOTTOM) - dc.SetPen(wxPen(wxColour(wxAuiStepColour(m_base_colour, 170)))); + dc.SetPen(wxPen(m_base_colour.ChangeLightness(170))); // TODO: else if (m_flags &wxAUI_NB_LEFT) {} // TODO: else if (m_flags &wxAUI_NB_RIGHT) {} else //for wxAUI_NB_TOP @@ -597,10 +588,15 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, bmp = m_active_close_bmp; } + int offsetY = tab_y-1; + if (m_flags & wxAUI_NB_BOTTOM) + offsetY = 1; + wxRect rect(tab_x + tab_width - close_button_width - 1, - tab_y + (tab_height/2) - (bmp.GetHeight()/2), + offsetY + (tab_height/2) - (bmp.GetHeight()/2), close_button_width, tab_height); + IndentPressedBitmap(&rect, close_button_state); dc.DrawBitmap(bmp, rect.x, rect.y, true); @@ -730,7 +726,7 @@ void wxAuiDefaultTabArt::DrawButton(wxDC& dc, int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, const wxAuiNotebookPageArray& pages, - int active_idx) + int /*active_idx*/) { wxMenu menuPopup; @@ -745,12 +741,10 @@ int wxAuiDefaultTabArt::ShowDropDown(wxWindow* wnd, if (caption.IsEmpty()) caption = wxT(" "); - menuPopup.AppendCheckItem(1000+i, caption); - } - - if (active_idx != -1) - { - menuPopup.Check(1000+active_idx, true); + wxMenuItem* item = new wxMenuItem(NULL, 1000+i, caption); + if (page.bitmap.IsOk()) + item->SetBitmap(page.bitmap); + menuPopup.Append(item); } // find out where to put the popup menu of window items @@ -2055,7 +2049,7 @@ bool wxAuiTabContainer::TabHitTest(int x, int y, wxWindow** hit) const return false; wxAuiTabContainerButton* btn = NULL; - if (ButtonHitTest(x, y, &btn)) + if (ButtonHitTest(x, y, &btn) && !(btn->cur_state & wxAUI_BUTTON_STATE_DISABLED)) { if (m_buttons.Index(*btn) != wxNOT_FOUND) return false; @@ -2093,8 +2087,7 @@ bool wxAuiTabContainer::ButtonHitTest(int x, int y, { wxAuiTabContainerButton& button = m_buttons.Item(i); if (button.rect.Contains(x,y) && - !(button.cur_state & (wxAUI_BUTTON_STATE_HIDDEN | - wxAUI_BUTTON_STATE_DISABLED))) + !(button.cur_state & wxAUI_BUTTON_STATE_HIDDEN )) { if (hit) *hit = &button; @@ -2302,7 +2295,8 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) { // make sure we're still clicking the button wxAuiTabContainerButton* button = NULL; - if (!ButtonHitTest(evt.m_x, evt.m_y, &button)) + if (!ButtonHitTest(evt.m_x, evt.m_y, &button) || + button->cur_state & wxAUI_BUTTON_STATE_DISABLED) return; if (button != m_pressed_button) @@ -2397,7 +2391,7 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) // check if the mouse is hovering above a button wxAuiTabContainerButton* button; - if (ButtonHitTest(pos.x, pos.y, &button)) + if (ButtonHitTest(pos.x, pos.y, &button) && !(button->cur_state & wxAUI_BUTTON_STATE_DISABLED)) { if (m_hover_button && button != m_hover_button) { @@ -2695,6 +2689,9 @@ public: if (!m_tabs) return; + if (m_tabs->IsFrozen() || m_tabs->GetParent()->IsFrozen()) + return; + m_tab_rect = wxRect(m_rect.x, m_rect.y, m_rect.width, m_tab_ctrl_height); if (m_tabs->GetFlags() & wxAUI_NB_BOTTOM) { @@ -2910,7 +2907,23 @@ void wxAuiNotebook::SetArtProvider(wxAuiTabArt* art) { m_tabs.SetArtProvider(art); - UpdateTabCtrlHeight(); + // Update the height and do nothing else if it did something but otherwise + // (i.e. if the new art provider uses the same height as the old one) we + // need to manually set the art provider for all tabs ourselves. + if ( !UpdateTabCtrlHeight() ) + { + wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes(); + const size_t pane_count = all_panes.GetCount(); + for (size_t i = 0; i < pane_count; ++i) + { + wxAuiPaneInfo& pane = all_panes.Item(i); + if (pane.name == wxT("dummy")) + continue; + wxTabFrame* tab_frame = (wxTabFrame*)pane.window; + wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; + tabctrl->SetArtProvider(art->Clone()); + } + } } // SetTabCtrlHeight() is the highest-level override of the @@ -2951,34 +2964,36 @@ void wxAuiNotebook::SetUniformBitmapSize(const wxSize& size) } // UpdateTabCtrlHeight() does the actual tab resizing. It's meant -// to be used interally -void wxAuiNotebook::UpdateTabCtrlHeight() +// to be used internally +bool 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) - { - wxAuiTabArt* art = m_tabs.GetArtProvider(); + if (m_tab_ctrl_height == height) + return false; - m_tab_ctrl_height = height; + wxAuiTabArt* art = m_tabs.GetArtProvider(); - 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; - wxTabFrame* tab_frame = (wxTabFrame*)pane.window; - wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; - tab_frame->SetTabCtrlHeight(m_tab_ctrl_height); - tabctrl->SetArtProvider(art->Clone()); - tab_frame->DoSizing(); - } + m_tab_ctrl_height = height; + + 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; + wxTabFrame* tab_frame = (wxTabFrame*)pane.window; + wxAuiTabCtrl* tabctrl = tab_frame->m_tabs; + tab_frame->SetTabCtrlHeight(m_tab_ctrl_height); + tabctrl->SetArtProvider(art->Clone()); + tab_frame->DoSizing(); } + + return true; } void wxAuiNotebook::UpdateHintWindowSize() @@ -3263,12 +3278,11 @@ bool wxAuiNotebook::RemovePage(size_t page_idx) RemoveEmptyTabFrames(); - // set new active pane + m_curpage = wxNOT_FOUND; + + // set new active pane unless we're being destroyed anyhow if (new_active && !m_isBeingDeleted) - { - m_curpage = -1; SetSelectionToWindow(new_active); - } return true; } @@ -4160,6 +4174,8 @@ void wxAuiNotebook::RemoveEmptyTabFrames() void wxAuiNotebook::OnChildFocusNotebook(wxChildFocusEvent& evt) { + evt.Skip(); + // if we're dragging a tab, don't change the current selection. // This code prevents a bug that used to happen when the hint window // was hidden. In the bug, the focus would return to the notebook @@ -4484,4 +4500,11 @@ bool wxAuiNotebook::ShowWindowMenu() return false; } +void wxAuiNotebook::Thaw() +{ + DoSizing(); + + wxControl::Thaw(); +} + #endif // wxUSE_AUI