X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76b49cf49ba9ee9f3eeec9730cb4bc4569ab17f1..29efc6e4a478652d6f59fb3f5ca7990d78a8ead4:/src/common/tbarbase.cpp diff --git a/src/common/tbarbase.cpp b/src/common/tbarbase.cpp index b67f6544a5..8d07da7930 100644 --- a/src/common/tbarbase.cpp +++ b/src/common/tbarbase.cpp @@ -31,12 +31,12 @@ #ifndef WX_PRECOMP #include "wx/control.h" #include "wx/frame.h" -#endif - -#if wxUSE_IMAGE - #include "wx/image.h" #include "wx/settings.h" -#endif // wxUSE_IMAGE + #if WXWIN_COMPATIBILITY_2_8 + #include "wx/image.h" + #endif // WXWIN_COMPATIBILITY_2_8 + #include "wx/menu.h" +#endif // ---------------------------------------------------------------------------- // wxWidgets macros @@ -59,6 +59,14 @@ WX_DEFINE_LIST(wxToolBarToolsList) IMPLEMENT_DYNAMIC_CLASS(wxToolBarToolBase, wxObject) +wxToolBarToolBase::~wxToolBarToolBase() +{ + delete m_dropdownMenu; + if ( IsControl() ) + GetControl()->Destroy(); +} + + bool wxToolBarToolBase::Enable(bool enable) { if ( m_enabled == enable ) @@ -112,6 +120,14 @@ bool wxToolBarToolBase::SetLongHelp(const wxString& help) return true; } + +void wxToolBarToolBase::SetDropdownMenu(wxMenu* menu) +{ + delete m_dropdownMenu; + m_dropdownMenu = menu; +} + + // ---------------------------------------------------------------------------- // wxToolBarBase adding/deleting items // ---------------------------------------------------------------------------- @@ -126,6 +142,15 @@ wxToolBarBase::wxToolBarBase() m_defaultHeight = 15; } +void wxToolBarBase::FixupStyle() +{ + if ( !HasFlag(wxTB_TOP | wxTB_LEFT | wxTB_RIGHT | wxTB_BOTTOM) ) + { + // this is the default + m_windowStyle |= wxTB_TOP; + } +} + wxToolBarToolBase *wxToolBarBase::DoAddTool(int id, const wxString& label, const wxBitmap& bitmap, @@ -185,16 +210,21 @@ wxToolBarBase::InsertTool(size_t pos, wxToolBarToolBase *tool) } m_tools.Insert(pos, tool); + tool->Attach(this); return tool; } -wxToolBarToolBase *wxToolBarBase::AddControl(wxControl *control) +wxToolBarToolBase * +wxToolBarBase::AddControl(wxControl *control, const wxString& label) { - return InsertControl(GetToolsCount(), control); + return InsertControl(GetToolsCount(), control, label); } -wxToolBarToolBase *wxToolBarBase::InsertControl(size_t pos, wxControl *control) +wxToolBarToolBase * +wxToolBarBase::InsertControl(size_t pos, + wxControl *control, + const wxString& label) { wxCHECK_MSG( control, (wxToolBarToolBase *)NULL, _T("toolbar: can't insert NULL control") ); @@ -205,7 +235,7 @@ wxToolBarToolBase *wxToolBarBase::InsertControl(size_t pos, wxControl *control) wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL, _T("invalid position in wxToolBar::InsertControl()") ); - wxToolBarToolBase *tool = CreateTool(control); + wxToolBarToolBase *tool = CreateTool(control, label); if ( !InsertTool(pos, tool) ) { @@ -287,17 +317,19 @@ wxToolBarToolBase *wxToolBarBase::RemoveTool(int id) { // don't give any error messages - sometimes we might call RemoveTool() // without knowing whether the tool is or not in the toolbar - return (wxToolBarToolBase *)NULL; + return NULL; } wxToolBarToolBase *tool = node->GetData(); + wxCHECK_MSG( tool, NULL, "NULL tool in the tools list?" ); + if ( !DoDeleteTool(pos, tool) ) - { - return (wxToolBarToolBase *)NULL; - } + return NULL; m_tools.Erase(node); + tool->Detach(); + return tool; } @@ -570,6 +602,12 @@ void wxToolBarBase::SetRows(int WXUNUSED(nRows)) // nothing } +bool wxToolBarBase::IsVertical() const +{ + return HasFlag(wxTB_LEFT | wxTB_RIGHT); +} + + // ---------------------------------------------------------------------------- // event processing // ---------------------------------------------------------------------------- @@ -616,13 +654,19 @@ void wxToolBarBase::OnMouseEnter(int id) event.SetInt(id); wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); - if( frame ) + if ( frame ) { wxString help; - wxToolBarToolBase* tool = id == wxID_ANY ? (wxToolBarToolBase*)NULL : FindById(id); - if(tool) - help = tool->GetLongHelp(); - frame->DoGiveHelp( help, id != wxID_ANY ); + if ( id != wxID_ANY ) + { + const wxToolBarToolBase * const tool = FindById(id); + if ( tool ) + help = tool->GetLongHelp(); + } + + // call DoGiveHelp() even if help string is empty to avoid showing the + // help for the previously selected tool when another one is selected + frame->DoGiveHelp(help, id != wxID_ANY); } (void)GetEventHandler()->ProcessEvent(event); @@ -637,6 +681,10 @@ void wxToolBarBase::UpdateWindowUI(long flags) { wxWindowBase::UpdateWindowUI(flags); + // don't waste time updating state of tools in a hidden toolbar + if ( !IsShown() ) + return; + // There is no sense in updating the toolbar UI // if the parent window is about to get destroyed wxWindow *tlw = wxGetTopLevelParent( this ); @@ -649,7 +697,11 @@ void wxToolBarBase::UpdateWindowUI(long flags) node; node = node->GetNext() ) { - int id = node->GetData()->GetId(); + wxToolBarToolBase * const tool = node->GetData(); + if ( tool->IsSeparator() ) + continue; + + int id = tool->GetId(); wxUpdateUIEvent event(id); event.SetEventObject(this); @@ -668,73 +720,31 @@ void wxToolBarBase::UpdateWindowUI(long flags) } } -#if wxUSE_IMAGE - -/* - * Make a greyed-out image suitable for disabled buttons. - * This code is adapted from wxNewBitmapButton in FL. - */ - -bool wxCreateGreyedImage(const wxImage& src, wxImage& dst) +bool wxToolBarBase::SetDropdownMenu(int toolid, wxMenu* menu) { - dst = src.Copy(); - - unsigned char rBg, gBg, bBg; - if ( src.HasMask() ) - { - src.GetOrFindMaskColour(&rBg, &gBg, &bBg); - dst.SetMaskColour(rBg, gBg, bBg); - } - else // assuming the pixels along the edges are of the background color - { - rBg = src.GetRed(0, 0); - gBg = src.GetGreen(0, 0); - bBg = src.GetBlue(0, 0); - } - - const wxColour colBg(rBg, gBg, bBg); - - const wxColour colDark = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); - const wxColour colLight = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT); - - // Second attempt, just making things monochrome - const int width = src.GetWidth(); - const int height = src.GetHeight(); - - for ( int x = 0; x < width; x++ ) - { - for ( int y = 0; y < height; y++ ) - { - const int r = src.GetRed(x, y); - const int g = src.GetGreen(x, y); - const int b = src.GetBlue(x, y); - - if ( r == rBg && g == gBg && b == bBg ) - { - // Leave the background colour as-is - continue; - } + wxToolBarToolBase * const tool = FindById(toolid); + wxCHECK_MSG( tool, false, _T("invalid tool id") ); - // Change light things to the background colour - wxColour col; - if ( r >= (colLight.Red() - 50) && - g >= (colLight.Green() - 50) && - b >= (colLight.Blue() - 50) ) - { - col = colBg; - } - else // Change dark things to really dark - { - col = colDark; - } + wxCHECK_MSG( tool->GetKind() == wxITEM_DROPDOWN, false, + _T("menu can be only associated with drop down tools") ); - dst.SetRGB(x, y, col.Red(), col.Green(), col.Blue()); - } - } + tool->SetDropdownMenu(menu); return true; } +#if WXWIN_COMPATIBILITY_2_8 + +bool wxCreateGreyedImage(const wxImage& in, wxImage& out) +{ +#if wxUSE_IMAGE + out = in.ConvertToGreyscale(); + if ( out.Ok() ) + return true; #endif // wxUSE_IMAGE + return false; +} + +#endif // WXWIN_COMPATIBILITY_2_8 #endif // wxUSE_TOOLBAR