X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c21febdbf45bb5ab5cdf3b08307d32fe8a439636..3c8cbc12caeab51f2b483cf7d419417801679670:/src/aui/auibar.cpp diff --git a/src/aui/auibar.cpp b/src/aui/auibar.cpp index da42c3bc42..773ccf41df 100644 --- a/src/aui/auibar.cpp +++ b/src/aui/auibar.cpp @@ -5,7 +5,7 @@ // Author: Benjamin I. Williams // Modified by: // Created: 2005-05-17 -// RCS-ID: $Id: dockart.cpp 48848 2007-09-21 10:19:53Z SC $ +// RCS-ID: $Id$ // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved // Licence: wxWindows Library Licence, Version 3.1 /////////////////////////////////////////////////////////////////////////////// @@ -38,19 +38,17 @@ #ifdef __WXMAC__ #include "wx/osx/private.h" -// for themeing support -#include #endif #include "wx/arrimpl.cpp" WX_DEFINE_OBJARRAY(wxAuiToolBarItemArray) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG) +wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, wxAuiToolBarEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEvent ); IMPLEMENT_CLASS(wxAuiToolBar, wxControl) @@ -187,8 +185,8 @@ wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt() m_gripper_pen2 = wxPen(darker3_colour); m_gripper_pen3 = *wxWHITE_PEN; - static unsigned char button_dropdown_bits[] = { 0xe0, 0xf1, 0xfb }; - static unsigned char overflow_bits[] = { 0x80, 0xff, 0x80, 0xc1, 0xe3, 0xf7 }; + static const unsigned char button_dropdown_bits[] = { 0xe0, 0xf1, 0xfb }; + static const unsigned char overflow_bits[] = { 0x80, 0xff, 0x80, 0xc1, 0xe3, 0xf7 }; m_button_dropdown_bmp = wxAuiBitmapFromBits(button_dropdown_bits, 5, 3, *wxBLACK); @@ -227,6 +225,21 @@ void wxAuiDefaultToolBarArt::SetTextOrientation(int orientation) m_text_orientation = orientation; } +unsigned int wxAuiDefaultToolBarArt::GetFlags() +{ + return m_flags; +} + +wxFont wxAuiDefaultToolBarArt::GetFont() +{ + return m_font; +} + +int wxAuiDefaultToolBarArt::GetTextOrientation() +{ + return m_text_orientation; +} + void wxAuiDefaultToolBarArt::DrawBackground( wxDC& dc, wxWindow* WXUNUSED(wnd), @@ -540,6 +553,12 @@ wxSize wxAuiDefaultToolBarArt::GetLabelSize( // get item's width width = item.GetMinSize().GetWidth(); + if (width == -1) + { + // no width specified, measure the text ourselves + width = dc.GetTextExtent(item.GetLabel()).GetX(); + } + return wxSize(width, height); } @@ -713,9 +732,9 @@ void wxAuiDefaultToolBarArt::SetElementSize(int element_id, int size) { switch (element_id) { - case wxAUI_TBART_SEPARATOR_SIZE: m_separator_size = size; - case wxAUI_TBART_GRIPPER_SIZE: m_gripper_size = size; - case wxAUI_TBART_OVERFLOW_SIZE: m_overflow_size = size; + case wxAUI_TBART_SEPARATOR_SIZE: m_separator_size = size; break; + case wxAUI_TBART_GRIPPER_SIZE: m_gripper_size = size; break; + case wxAUI_TBART_OVERFLOW_SIZE: m_overflow_size = size; break; } } @@ -818,7 +837,7 @@ wxAuiToolBar::wxAuiToolBar(wxWindow* parent, m_gripper_sizer_item = NULL; m_overflow_sizer_item = NULL; m_dragging = false; - m_style = style; + m_style = style | wxBORDER_NONE; m_gripper_visible = (m_style & wxAUI_TB_GRIPPER) ? true : false; m_overflow_visible = (m_style & wxAUI_TB_OVERFLOW) ? true : false; m_overflow_state = 0; @@ -828,6 +847,7 @@ wxAuiToolBar::wxAuiToolBar(wxWindow* parent, SetExtraStyle(wxWS_EX_PROCESS_IDLE); if (style & wxAUI_TB_HORZ_LAYOUT) SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT); + SetBackgroundStyle(wxBG_STYLE_CUSTOM); } @@ -865,6 +885,10 @@ void wxAuiToolBar::SetWindowStyleFlag(long style) SetToolTextOrientation(wxAUI_TBTOOL_TEXT_BOTTOM); } +long wxAuiToolBar::GetWindowStyleFlag() const +{ + return m_style; +} void wxAuiToolBar::SetArtProvider(wxAuiToolBarArt* art) { @@ -887,13 +911,13 @@ wxAuiToolBarArt* wxAuiToolBar::GetArtProvider() const -void wxAuiToolBar::AddTool(int tool_id, +wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, const wxString& label, const wxBitmap& bitmap, const wxString& short_help_string, wxItemKind kind) { - AddTool(tool_id, + return AddTool(tool_id, label, bitmap, wxNullBitmap, @@ -904,7 +928,7 @@ void wxAuiToolBar::AddTool(int tool_id, } -void wxAuiToolBar::AddTool(int tool_id, +wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, const wxString& label, const wxBitmap& bitmap, const wxBitmap& disabled_bitmap, @@ -932,6 +956,9 @@ void wxAuiToolBar::AddTool(int tool_id, item.user_data = 0; item.sticky = false; + if (item.id == wxID_ANY) + item.id = wxNewId(); + if (!item.disabled_bitmap.IsOk()) { // no disabled bitmap specified, we need to make one @@ -943,11 +970,11 @@ void wxAuiToolBar::AddTool(int tool_id, item.disabled_bitmap = MakeDisabledBitmap(item.bitmap); } } - m_items.Add(item); + return &m_items.Last(); } -void wxAuiToolBar::AddControl(wxControl* control, +wxAuiToolBarItem* wxAuiToolBar::AddControl(wxControl* control, const wxString& label) { wxAuiToolBarItem item; @@ -968,9 +995,10 @@ void wxAuiToolBar::AddControl(wxControl* control, item.sticky = false; m_items.Add(item); + return &m_items.Last(); } -void wxAuiToolBar::AddLabel(int tool_id, +wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id, const wxString& label, const int width) { @@ -995,10 +1023,14 @@ void wxAuiToolBar::AddLabel(int tool_id, item.user_data = 0; item.sticky = false; + if (item.id == wxID_ANY) + item.id = wxNewId(); + m_items.Add(item); + return &m_items.Last(); } -void wxAuiToolBar::AddSeparator() +wxAuiToolBarItem* wxAuiToolBar::AddSeparator() { wxAuiToolBarItem item; item.window = NULL; @@ -1017,9 +1049,10 @@ void wxAuiToolBar::AddSeparator() item.sticky = false; m_items.Add(item); + return &m_items.Last(); } -void wxAuiToolBar::AddSpacer(int pixels) +wxAuiToolBarItem* wxAuiToolBar::AddSpacer(int pixels) { wxAuiToolBarItem item; item.window = NULL; @@ -1039,9 +1072,10 @@ void wxAuiToolBar::AddSpacer(int pixels) item.sticky = false; m_items.Add(item); + return &m_items.Last(); } -void wxAuiToolBar::AddStretchSpacer(int proportion) +wxAuiToolBarItem* wxAuiToolBar::AddStretchSpacer(int proportion) { wxAuiToolBarItem item; item.window = NULL; @@ -1061,6 +1095,7 @@ void wxAuiToolBar::AddStretchSpacer(int proportion) item.sticky = false; m_items.Add(item); + return &m_items.Last(); } void wxAuiToolBar::Clear() @@ -1333,6 +1368,8 @@ void wxAuiToolBar::SetGripperVisible(bool visible) m_gripper_visible = visible; if (visible) m_style |= wxAUI_TB_GRIPPER; + else + m_style &= ~wxAUI_TB_GRIPPER; Realize(); Refresh(false); } @@ -1348,6 +1385,8 @@ void wxAuiToolBar::SetOverflowVisible(bool visible) m_overflow_visible = visible; if (visible) m_style |= wxAUI_TB_OVERFLOW; + else + m_style &= ~wxAUI_TB_OVERFLOW; Refresh(false); } @@ -1435,7 +1474,7 @@ void wxAuiToolBar::RefreshOverflowState() // find out if the mouse cursor is inside the dropdown rectangle if (overflow_rect.Contains(pt.x, pt.y)) { - if (::wxGetMouseState().LeftDown()) + if (::wxGetMouseState().LeftIsDown()) overflow_state = wxAUI_BUTTON_STATE_PRESSED; else overflow_state = wxAUI_BUTTON_STATE_HOVER; @@ -1455,15 +1494,39 @@ void wxAuiToolBar::ToggleTool(int tool_id, bool state) { wxAuiToolBarItem* tool = FindTool(tool_id); - if (tool) + if (tool && (tool->kind == wxITEM_CHECK || tool->kind == wxITEM_RADIO)) { - if (tool->kind != wxITEM_CHECK) - return; + if (tool->kind == wxITEM_RADIO) + { + int i, idx, count; + idx = GetToolIndex(tool_id); + count = (int)m_items.GetCount(); + + if (idx >= 0 && idx < count) + { + for (i = idx; i < count; ++i) + { + if (m_items[i].kind != wxITEM_RADIO) + break; + m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED; + } + for (i = idx; i > 0; i--) + { + if (m_items[i].kind != wxITEM_RADIO) + break; + m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED; + } + } - if (state == true) tool->state |= wxAUI_BUTTON_STATE_CHECKED; - else - tool->state &= ~wxAUI_BUTTON_STATE_CHECKED; + } + else if (tool->kind == wxITEM_CHECK) + { + if (state == true) + tool->state |= wxAUI_BUTTON_STATE_CHECKED; + else + tool->state &= ~wxAUI_BUTTON_STATE_CHECKED; + } } } @@ -1473,7 +1536,7 @@ bool wxAuiToolBar::GetToolToggled(int tool_id) const if (tool) { - if (tool->kind != wxITEM_CHECK) + if ( (tool->kind != wxITEM_CHECK) && (tool->kind != wxITEM_RADIO) ) return false; return (tool->state & wxAUI_BUTTON_STATE_CHECKED) ? true : false; @@ -1728,7 +1791,7 @@ bool wxAuiToolBar::Realize() sizer_item = sizer->Add(size.x + (m_tool_border_padding*2), size.y + (m_tool_border_padding*2), item.proportion, - wxALIGN_CENTER); + item.alignment); if (i+1 < count) { sizer->AddSpacer(m_tool_packing); @@ -1739,12 +1802,13 @@ bool wxAuiToolBar::Realize() case wxITEM_CHECK: case wxITEM_NORMAL: + case wxITEM_RADIO: { wxSize size = m_art->GetToolSize(dc, this, item); sizer_item = sizer->Add(size.x + (m_tool_border_padding*2), size.y + (m_tool_border_padding*2), 0, - wxALIGN_CENTER); + item.alignment); // add tool packing if (i+1 < count) { @@ -2122,7 +2186,7 @@ void wxAuiToolBar::OnIdle(wxIdleEvent& evt) void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) { - wxBufferedPaintDC dc(this); + wxAutoBufferedPaintDC dc(this); wxRect cli_rect(wxPoint(0,0), GetClientSize()); @@ -2197,6 +2261,11 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) // draw a toggle button m_art->DrawButton(dc, this, item, item_rect); } + else if (item.kind == wxITEM_RADIO) + { + // draw a toggle button + m_art->DrawButton(dc, this, item, item_rect); + } else if (item.kind == wxITEM_CONTROL) { // draw the control's label @@ -2255,7 +2324,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) e.SetEventObject(this); e.SetToolId(-1); e.SetClickPoint(wxPoint(evt.GetX(), evt.GetY())); - bool processed = ProcessEvent(e); + bool processed = GetEventHandler()->ProcessEvent(e); if (processed) { @@ -2292,7 +2361,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) { wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, res); e.SetEventObject(this); - GetParent()->ProcessEvent(e); + GetParent()->GetEventHandler()->ProcessEvent(e); } } @@ -2333,7 +2402,7 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) e.SetClickPoint(evt.GetPosition()); e.SetItemRect(rect); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } } @@ -2366,7 +2435,7 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) { UnsetToolTip(); - if (hit_item->kind == wxITEM_CHECK) + if (hit_item->kind == wxITEM_CHECK || hit_item->kind == wxITEM_RADIO) { bool toggle = false; @@ -2377,16 +2446,21 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) ToggleTool(m_action_item->id, toggle); + // repaint immediately + Refresh(false); + Update(); + wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id); e.SetEventObject(this); - ProcessEvent(e); + e.SetInt (toggle); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } else { wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id); e.SetEventObject(this); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } } @@ -2449,7 +2523,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) e.SetEventObject(this); e.SetToolId(m_action_item->id); e.SetClickPoint(m_action_pos); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } } @@ -2460,7 +2534,7 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) e.SetEventObject(this); e.SetToolId(-1); e.SetClickPoint(m_action_pos); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } @@ -2520,7 +2594,7 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) e.SetEventObject(this); e.SetToolId(m_action_item->id); e.SetClickPoint(m_action_pos); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); } } @@ -2545,7 +2619,7 @@ void wxAuiToolBar::OnMotion(wxMouseEvent& evt) wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, GetId()); e.SetEventObject(this); e.SetToolId(m_action_item->id); - ProcessEvent(e); + GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); return; }