X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2e3be1c69b9d3382f6245b5c4e7433c6fd79766..36abe9d421ebb33873f012a63fbdb210ff771682:/src/common/tbarbase.cpp diff --git a/src/common/tbarbase.cpp b/src/common/tbarbase.cpp index fd1e4d2bdd..8d07da7930 100644 --- a/src/common/tbarbase.cpp +++ b/src/common/tbarbase.cpp @@ -1,8 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/tbarbase.cpp +// Name: src/common/tbarbase.cpp // Purpose: wxToolBarBase implementation // Author: Julian Smart -// Modified by: VZ at 11.12.99 (wxScrollableToolBar splitted off) +// Modified by: VZ at 11.12.99 (wxScrollableToolBar split off) // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "tbarbase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -30,18 +26,17 @@ #if wxUSE_TOOLBAR +#include "wx/toolbar.h" + #ifndef WX_PRECOMP #include "wx/control.h" -#endif - -#include "wx/frame.h" - -#if wxUSE_IMAGE - #include "wx/image.h" + #include "wx/frame.h" #include "wx/settings.h" -#endif // wxUSE_IMAGE - -#include "wx/toolbar.h" + #if WXWIN_COMPATIBILITY_2_8 + #include "wx/image.h" + #endif // WXWIN_COMPATIBILITY_2_8 + #include "wx/menu.h" +#endif // ---------------------------------------------------------------------------- // wxWidgets macros @@ -52,7 +47,7 @@ END_EVENT_TABLE() #include "wx/listimpl.cpp" -WX_DEFINE_LIST(wxToolBarToolsList); +WX_DEFINE_LIST(wxToolBarToolsList) // ============================================================================ // implementation @@ -64,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 ) @@ -117,29 +120,13 @@ bool wxToolBarToolBase::SetLongHelp(const wxString& help) return true; } -#if WXWIN_COMPATIBILITY_2_2 - -const wxBitmap& wxToolBarToolBase::GetBitmap1() const -{ - return GetNormalBitmap(); -} - -const wxBitmap& wxToolBarToolBase::GetBitmap2() const -{ - return GetDisabledBitmap(); -} - -void wxToolBarToolBase::SetBitmap1(const wxBitmap& bmp) -{ - SetNormalBitmap(bmp); -} -void wxToolBarToolBase::SetBitmap2(const wxBitmap& bmp) +void wxToolBarToolBase::SetDropdownMenu(wxMenu* menu) { - SetDisabledBitmap(bmp); + delete m_dropdownMenu; + m_dropdownMenu = menu; } -#endif // WXWIN_COMPATIBILITY_2_2 // ---------------------------------------------------------------------------- // wxToolBarBase adding/deleting items @@ -155,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, @@ -214,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") ); @@ -234,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) ) { @@ -316,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; } @@ -405,14 +408,14 @@ void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) wxToolBarToolsList::compatibility_iterator nodeNext = node->GetNext(); while ( nodeNext ) { - wxToolBarToolBase *tool = nodeNext->GetData(); + wxToolBarToolBase *toolNext = nodeNext->GetData(); - if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) + if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; - if ( tool->Toggle(false) ) + if ( toolNext->Toggle(false) ) { - DoToggleTool(tool, false); + DoToggleTool(toolNext, false); } nodeNext = nodeNext->GetNext(); @@ -421,14 +424,14 @@ void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); while ( nodePrev ) { - wxToolBarToolBase *tool = nodePrev->GetData(); + wxToolBarToolBase *toolNext = nodePrev->GetData(); - if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) + if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; - if ( tool->Toggle(false) ) + if ( toolNext->Toggle(false) ) { - DoToggleTool(tool, false); + DoToggleTool(toolNext, false); } nodePrev = nodePrev->GetPrevious(); @@ -437,7 +440,10 @@ void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) void wxToolBarBase::ClearTools() { - WX_CLEAR_LIST(wxToolBarToolsList, m_tools); + while ( GetToolsCount() ) + { + DeleteToolByPos(0); + } } bool wxToolBarBase::Realize() @@ -596,6 +602,12 @@ void wxToolBarBase::SetRows(int WXUNUSED(nRows)) // nothing } +bool wxToolBarBase::IsVertical() const +{ + return HasFlag(wxTB_LEFT | wxTB_RIGHT); +} + + // ---------------------------------------------------------------------------- // event processing // ---------------------------------------------------------------------------- @@ -642,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); @@ -663,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 ); @@ -675,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); @@ -694,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); + wxToolBarToolBase * const tool = FindById(toolid); + wxCHECK_MSG( tool, false, _T("invalid tool id") ); - const wxColour colDark = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW); - const wxColour colLight = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT); + wxCHECK_MSG( tool->GetKind() == wxITEM_DROPDOWN, false, + _T("menu can be only associated with drop down tools") ); - // 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; - } - - // 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; - } - - 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