X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e0dc13d470f31c31f38927a2565b94cd126ddf9a..e83a2e04900ec19e809d32d985669e1c664dd5a8:/src/aui/auibook.cpp diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index 99276ef5eb..84ed97b2b2 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -31,6 +31,10 @@ #include "wx/dcbuffer.h" #include "wx/menu.h" +#ifdef __WXMAC__ +#include "wx/mac/carbon/private.h" +#endif + #include "wx/arrimpl.cpp" WX_DEFINE_OBJARRAY(wxAuiNotebookPageArray) WX_DEFINE_OBJARRAY(wxAuiTabContainerButtonArray) @@ -223,18 +227,20 @@ wxAuiDefaultTabArt::wxAuiDefaultTabArt() m_fixed_tab_width = 100; m_tab_ctrl_height = 0; - wxColour base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - - wxColour background_colour = base_colour; - wxColour normaltab_colour = base_colour; - wxColour selectedtab_colour = base_colour; +#ifdef __WXMAC__ + wxBrush toolbarbrush; + toolbarbrush.MacSetTheme( kThemeBrushToolbarBackground ); + wxColor base_colour = toolbarbrush.GetColour(); +#else + wxColor base_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); +#endif - m_bkbrush = wxBrush(background_colour); - m_normal_bkbrush = wxBrush(normaltab_colour); - m_normal_bkpen = wxPen(normaltab_colour); - m_selected_bkbrush = wxBrush(selectedtab_colour); - m_selected_bkpen = wxPen(selectedtab_colour); + m_base_colour = base_colour; + wxColor darker2_colour = StepColour(base_colour, 70); + m_border_pen = wxPen(darker2_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)); @@ -295,14 +301,20 @@ void wxAuiDefaultTabArt::DrawBackground(wxDC& dc, const wxRect& rect) { // draw background - dc.SetBrush(m_bkbrush); - dc.SetPen(*wxTRANSPARENT_PEN); - dc.DrawRectangle(-1, -1, rect.GetWidth()+2, rect.GetHeight()+2); - + wxRect r(rect.x, rect.y, rect.width+2, rect.height-3); + wxColor start_colour = StepColour(m_base_colour, 90); + wxColor end_colour = StepColour(m_base_colour, 110); + dc.GradientFillLinear(r, start_colour, end_colour, wxSOUTH); + // draw base lines - dc.SetPen(*wxGREY_PEN); - dc.DrawLine(0, rect.GetHeight()-4, rect.GetWidth(), rect.GetHeight()-4); - dc.DrawLine(0, rect.GetHeight()-1, rect.GetWidth(), rect.GetHeight()-1); + int y = rect.GetHeight(); + int w = rect.GetWidth(); + dc.SetPen(m_border_pen); + dc.DrawLine(0, y-4, w, y-4); + dc.DrawLine(0, y-1, w, y-1); + dc.SetPen(wxPen(start_colour)); + dc.DrawLine(0, y-3, w, y-3); + dc.DrawLine(0, y-2, w, y-2); } @@ -358,24 +370,17 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, caption = caption_text; - dc.SetClippingRegion(in_rect); - - // select pen, brush and font for the tab to be drawn if (active) { - dc.SetPen(m_selected_bkpen); - dc.SetBrush(m_selected_bkbrush); dc.SetFont(m_selected_font); textx = selected_textx; texty = selected_texty; } else { - dc.SetPen(m_normal_bkpen); - dc.SetBrush(m_normal_bkbrush); dc.SetFont(m_normal_font); textx = normal_textx; texty = normal_texty; @@ -384,56 +389,101 @@ void wxAuiDefaultTabArt::DrawTab(wxDC& dc, // create points that will make the tab outline - wxPoint points[6]; - points[0].x = tab_x; - points[0].y = tab_y + tab_height - 4; - points[1].x = tab_x; - points[1].y = tab_y + 2; - points[2].x = tab_x + 2; - points[2].y = tab_y; - points[3].x = tab_x + tab_width - 2; - points[3].y = tab_y; - points[4].x = tab_x + tab_width; - points[4].y = tab_y + 2; - points[5].x = tab_x + tab_width; - points[5].y = tab_y + tab_height - 4; + wxPoint clip_points[6]; + clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3); + clip_points[1] = wxPoint(tab_x, tab_y+2); + clip_points[2] = wxPoint(tab_x+2, tab_y); + clip_points[3] = wxPoint(tab_x+tab_width-1, tab_y); + clip_points[4] = wxPoint(tab_x+tab_width+1, tab_y+2); + clip_points[5] = wxPoint(tab_x+tab_width+1, tab_y+tab_height-3); + + // set the clipping region for the tab -- + wxRegion clipping_region(6, clip_points); + dc.SetClippingRegion(clipping_region); - int drawn_tab_yoff = points[1].y; - int drawn_tab_height = points[0].y - points[1].y; + wxPoint border_points[6]; + border_points[0] = wxPoint(tab_x, tab_y+tab_height-4); + border_points[1] = wxPoint(tab_x, tab_y+2); + border_points[2] = wxPoint(tab_x+2, tab_y); + border_points[3] = wxPoint(tab_x+tab_width-2, tab_y); + border_points[4] = wxPoint(tab_x+tab_width, tab_y+2); + border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4); + + + int drawn_tab_yoff = border_points[1].y; + int drawn_tab_height = border_points[0].y - border_points[1].y; - // draw gradient background if (active) - { - wxColour c = m_bkbrush.GetColour(); - dc.SetPen(wxPen(c)); + { + // draw active tab - int y, last_y = -1; - for (y = points[0].y; y > points[2].y; --y) - { - if (y < tab_y+(tab_height*3/5) && y != last_y) - { - last_y = y; - c = StepColour(c, 102); - dc.SetPen(wxPen(c)); - } - - dc.DrawLine(points[0].x+1, y, points[5].x, y); - } + // 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.DrawRectangle(r.x, r.y, r.width, r.height); + + // 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+2, r.width-3, r.height); + + // these two points help the rounded corners appear more antialiased + dc.SetPen(m_base_colour_pen); + dc.DrawPoint(r.x+2, r.y+2); + dc.DrawPoint(r.x+r.width-2, r.y+2); + + // set rectangle down a bit for gradient drawing + r.SetHeight(r.GetHeight()/2); + r.x += 2; + r.width -= 2; + r.y += r.height; + + // draw gradient background + wxColor start_color = StepColour(m_base_colour, 95); + wxColor end_color = *wxWHITE; + dc.GradientFillLinear(r, start_color, end_color, wxNORTH); } - + else + { + // draw inactive tab + + wxRect r(tab_x, tab_y+1, tab_width, tab_height-3); + + // draw base background color for inactive tabs + dc.SetPen(m_base_colour_pen); + dc.SetBrush(m_base_colour_brush); + dc.DrawRectangle(r.x, r.y, r.width, r.height); + + // start the gradent up a bit and leave the inside border inset + // by a pixel for a 3D look. Only the top half of the inactive + // tab will have a slight gradient + r.x += 2; + r.width -= 2; + r.height /= 2; + + // -- draw bottom gradient fill for glossy look + wxColor top_color = m_base_colour; + wxColor bottom_color = StepColour(top_color, 106); + dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH); + } + // draw tab outline - dc.SetPen(*wxGREY_PEN); + dc.SetPen(m_border_pen); dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.DrawPolygon(6, points); + dc.DrawPolygon(6, border_points); // 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) { - wxColour c = m_bkbrush.GetColour(); - dc.SetPen(wxPen(c)); - dc.DrawLine(points[0].x, points[0].y, points[5].x+1, points[5].y); + wxColor start_color = StepColour(m_base_colour, 93); + dc.SetPen(wxPen(start_color)); + dc.DrawLine(border_points[0].x, + border_points[0].y, + border_points[5].x+1, + border_points[5].y); } @@ -1650,10 +1700,13 @@ void wxAuiTabContainer::Render(wxDC* raw_dc, wxWindow* wnd) if (offset == 0) offset += m_art->GetIndentSize(); + // prepare the tab-close-button array - while (m_tab_close_buttons.GetCount() > page_count) - m_tab_close_buttons.RemoveAt(m_tab_close_buttons.GetCount()-1); + // make sure tab button entries which aren't used are marked as hidden + for (i = page_count; i < m_tab_close_buttons.GetCount(); ++i) + m_tab_close_buttons.Item(i).cur_state = wxAUI_BUTTON_STATE_HIDDEN; + // make sure there are enough tab button entries to accommodate all tabs while (m_tab_close_buttons.GetCount() < page_count) { wxAuiTabContainerButton tempbtn; @@ -1963,11 +2016,16 @@ void wxAuiTabCtrl::OnLeftDown(wxMouseEvent& evt) wxWindow* wnd; if (TabHitTest(evt.m_x, evt.m_y, &wnd)) { - wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); - e.SetSelection(GetIdxFromWindow(wnd)); - e.SetOldSelection(GetActivePage()); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + int new_selection = GetIdxFromWindow(wnd); + + if (new_selection != GetActivePage()) + { + wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId); + e.SetSelection(new_selection); + e.SetOldSelection(GetActivePage()); + e.SetEventObject(this); + GetEventHandler()->ProcessEvent(e); + } m_click_pt.x = evt.m_x; m_click_pt.y = evt.m_y; @@ -2471,7 +2529,6 @@ bool wxAuiNotebook::DeletePage(size_t page_idx) if (!RemovePage(page_idx)) return false; - // actually destroy the window now if (wnd->IsKindOf(CLASSINFO(wxAuiMDIChildFrame))) { @@ -2628,12 +2685,14 @@ size_t wxAuiNotebook::SetSelection(size_t new_page) 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)) @@ -2644,8 +2703,6 @@ size_t wxAuiNotebook::SetSelection(size_t new_page) DoSizing(); ctrl->DoShowHide(); - int old_curpage = m_curpage; - m_curpage = new_page; // set fonts