X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..62795f413a7222863b4aee76c08764071f94bd87:/src/common/tbarbase.cpp diff --git a/src/common/tbarbase.cpp b/src/common/tbarbase.cpp index abc7670961..e36d96eccf 100644 --- a/src/common/tbarbase.cpp +++ b/src/common/tbarbase.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: VZ at 11.12.99 (wxScrollableToolBar split off) // Created: 04/01/98 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -38,6 +37,8 @@ #include "wx/menu.h" #endif +extern WXDLLEXPORT_DATA(const char) wxToolBarNameStr[] = "toolbar"; + // ---------------------------------------------------------------------------- // wxWidgets macros // ---------------------------------------------------------------------------- @@ -61,7 +62,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBarToolBase, wxObject) wxToolBarToolBase::~wxToolBarToolBase() { +#if wxUSE_MENUS delete m_dropdownMenu; +#endif + if ( IsControl() ) GetControl()->Destroy(); } @@ -121,11 +125,13 @@ bool wxToolBarToolBase::SetLongHelp(const wxString& help) } +#if wxUSE_MENUS void wxToolBarToolBase::SetDropdownMenu(wxMenu* menu) { delete m_dropdownMenu; m_dropdownMenu = menu; } +#endif // ---------------------------------------------------------------------------- @@ -151,7 +157,7 @@ void wxToolBarBase::FixupStyle() } } -wxToolBarToolBase *wxToolBarBase::DoAddTool(int id, +wxToolBarToolBase *wxToolBarBase::DoAddTool(int toolid, const wxString& label, const wxBitmap& bitmap, const wxBitmap& bmpDisabled, @@ -163,12 +169,12 @@ wxToolBarToolBase *wxToolBarBase::DoAddTool(int id, wxCoord WXUNUSED(yPos)) { InvalidateBestSize(); - return InsertTool(GetToolsCount(), id, label, bitmap, bmpDisabled, + return InsertTool(GetToolsCount(), toolid, label, bitmap, bmpDisabled, kind, shortHelp, longHelp, clientData); } wxToolBarToolBase *wxToolBarBase::InsertTool(size_t pos, - int id, + int toolid, const wxString& label, const wxBitmap& bitmap, const wxBitmap& bmpDisabled, @@ -180,17 +186,8 @@ wxToolBarToolBase *wxToolBarBase::InsertTool(size_t pos, wxCHECK_MSG( pos <= GetToolsCount(), NULL, wxT("invalid position in wxToolBar::InsertTool()") ); - wxToolBarToolBase *tool = CreateTool(id, label, bitmap, bmpDisabled, kind, - clientData, shortHelp, longHelp); - - if ( !InsertTool(pos, tool) ) - { - delete tool; - - return NULL; - } - - return tool; + return DoInsertNewTool(pos, CreateTool(toolid, label, bitmap, bmpDisabled, kind, + clientData, shortHelp, longHelp)); } wxToolBarToolBase *wxToolBarBase::AddTool(wxToolBarToolBase *tool) @@ -232,22 +229,10 @@ wxToolBarBase::InsertControl(size_t pos, wxCHECK_MSG( control->GetParent() == this, NULL, wxT("control must have toolbar as parent") ); - wxCHECK_MSG( pos <= GetToolsCount(), NULL, - wxT("invalid position in wxToolBar::InsertControl()") ); - - wxToolBarToolBase *tool = CreateTool(control, label); - - if ( !InsertTool(pos, tool) ) - { - delete tool; - - return NULL; - } - - return tool; + return DoInsertNewTool(pos, CreateTool(control, label)); } -wxControl *wxToolBarBase::FindControl( int id ) +wxControl *wxToolBarBase::FindControl( int toolid ) { for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); node; @@ -262,7 +247,7 @@ wxControl *wxToolBarBase::FindControl( int id ) { wxFAIL_MSG( wxT("NULL control in toolbar?") ); } - else if ( control->GetId() == id ) + else if ( control->GetId() == toolid ) { // found return control; @@ -280,34 +265,38 @@ wxToolBarToolBase *wxToolBarBase::AddSeparator() wxToolBarToolBase *wxToolBarBase::InsertSeparator(size_t pos) { - wxCHECK_MSG( pos <= GetToolsCount(), NULL, - wxT("invalid position in wxToolBar::InsertSeparator()") ); + return DoInsertNewTool(pos, CreateSeparator()); +} - wxToolBarToolBase *tool = CreateTool(wxID_SEPARATOR, - wxEmptyString, - wxNullBitmap, wxNullBitmap, - wxITEM_SEPARATOR, NULL, - wxEmptyString, wxEmptyString); +wxToolBarToolBase *wxToolBarBase::AddStretchableSpace() +{ + return InsertStretchableSpace(GetToolsCount()); +} - if ( !tool || !DoInsertTool(pos, tool) ) +wxToolBarToolBase *wxToolBarBase::InsertStretchableSpace(size_t pos) +{ + wxToolBarToolBase * const tool = CreateSeparator(); + if ( tool ) { - delete tool; - - return NULL; + // this is a hack but we know that all the current implementations + // don't really use the tool when it's created, they will do it + // InsertTool() at earliest and maybe even in Realize() much later + // + // so we can create the tool as a plain separator and mark it as being + // a stretchable space later + tool->MakeStretchable(); } - m_tools.Insert(pos, tool); - - return tool; + return DoInsertNewTool(pos, tool); } -wxToolBarToolBase *wxToolBarBase::RemoveTool(int id) +wxToolBarToolBase *wxToolBarBase::RemoveTool(int toolid) { size_t pos = 0; wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { - if ( node->GetData()->GetId() == id ) + if ( node->GetData()->GetId() == toolid ) break; pos++; @@ -351,13 +340,13 @@ bool wxToolBarBase::DeleteToolByPos(size_t pos) return true; } -bool wxToolBarBase::DeleteTool(int id) +bool wxToolBarBase::DeleteTool(int toolid) { size_t pos = 0; wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { - if ( node->GetData()->GetId() == id ) + if ( node->GetData()->GetId() == toolid ) break; pos++; @@ -374,7 +363,7 @@ bool wxToolBarBase::DeleteTool(int id) return true; } -wxToolBarToolBase *wxToolBarBase::FindById(int id) const +wxToolBarToolBase *wxToolBarBase::FindById(int toolid) const { wxToolBarToolBase *tool = NULL; @@ -383,7 +372,7 @@ wxToolBarToolBase *wxToolBarBase::FindById(int id) const node = node->GetNext() ) { tool = node->GetData(); - if ( tool->GetId() == id ) + if ( tool->GetId() == toolid ) { // found break; @@ -471,8 +460,7 @@ bool wxToolBarBase::Realize() if ( m_tools.empty() ) return false; - // make sure tool size is larger enough for all all bitmaps to fit in - // (this is consistent with what other ports do): + // make sure tool size is large enough for all bitmaps to fit in AdjustToolBitmapSize(); return true; @@ -495,9 +483,9 @@ wxToolBarBase::~wxToolBarBase() // wxToolBarBase tools state // ---------------------------------------------------------------------------- -void wxToolBarBase::EnableTool(int id, bool enable) +void wxToolBarBase::EnableTool(int toolid, bool enable) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); if ( tool ) { if ( tool->Enable(enable) ) @@ -507,9 +495,9 @@ void wxToolBarBase::EnableTool(int id, bool enable) } } -void wxToolBarBase::ToggleTool(int id, bool toggle) +void wxToolBarBase::ToggleTool(int toolid, bool toggle) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); if ( tool && tool->CanBeToggled() ) { if ( tool->Toggle(toggle) ) @@ -520,9 +508,9 @@ void wxToolBarBase::ToggleTool(int id, bool toggle) } } -void wxToolBarBase::SetToggle(int id, bool toggle) +void wxToolBarBase::SetToggle(int toolid, bool toggle) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); if ( tool ) { if ( tool->SetToggle(toggle) ) @@ -532,48 +520,48 @@ void wxToolBarBase::SetToggle(int id, bool toggle) } } -void wxToolBarBase::SetToolShortHelp(int id, const wxString& help) +void wxToolBarBase::SetToolShortHelp(int toolid, const wxString& help) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); if ( tool ) { (void)tool->SetShortHelp(help); } } -void wxToolBarBase::SetToolLongHelp(int id, const wxString& help) +void wxToolBarBase::SetToolLongHelp(int toolid, const wxString& help) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); if ( tool ) { (void)tool->SetLongHelp(help); } } -wxObject *wxToolBarBase::GetToolClientData(int id) const +wxObject *wxToolBarBase::GetToolClientData(int toolid) const { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); return tool ? tool->GetClientData() : NULL; } -void wxToolBarBase::SetToolClientData(int id, wxObject *clientData) +void wxToolBarBase::SetToolClientData(int toolid, wxObject *clientData) { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); wxCHECK_RET( tool, wxT("no such tool in wxToolBar::SetToolClientData") ); tool->SetClientData(clientData); } -int wxToolBarBase::GetToolPos(int id) const +int wxToolBarBase::GetToolPos(int toolid) const { size_t pos = 0; wxToolBarToolsList::compatibility_iterator node; for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { - if ( node->GetData()->GetId() == id ) + if ( node->GetData()->GetId() == toolid ) return pos; pos++; @@ -582,33 +570,33 @@ int wxToolBarBase::GetToolPos(int id) const return wxNOT_FOUND; } -bool wxToolBarBase::GetToolState(int id) const +bool wxToolBarBase::GetToolState(int toolid) const { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); wxCHECK_MSG( tool, false, wxT("no such tool") ); return tool->IsToggled(); } -bool wxToolBarBase::GetToolEnabled(int id) const +bool wxToolBarBase::GetToolEnabled(int toolid) const { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); wxCHECK_MSG( tool, false, wxT("no such tool") ); return tool->IsEnabled(); } -wxString wxToolBarBase::GetToolShortHelp(int id) const +wxString wxToolBarBase::GetToolShortHelp(int toolid) const { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); wxCHECK_MSG( tool, wxEmptyString, wxT("no such tool") ); return tool->GetShortHelp(); } -wxString wxToolBarBase::GetToolLongHelp(int id) const +wxString wxToolBarBase::GetToolLongHelp(int toolid) const { - wxToolBarToolBase *tool = FindById(id); + wxToolBarToolBase *tool = FindById(toolid); wxCHECK_MSG( tool, wxEmptyString, wxT("no such tool") ); return tool->GetLongHelp(); @@ -640,9 +628,9 @@ bool wxToolBarBase::IsVertical() const // ---------------------------------------------------------------------------- // Only allow toggle if returns true -bool wxToolBarBase::OnLeftClick(int id, bool toggleDown) +bool wxToolBarBase::OnLeftClick(int toolid, bool toggleDown) { - wxCommandEvent event(wxEVT_COMMAND_TOOL_CLICKED, id); + wxCommandEvent event(wxEVT_TOOL, toolid); event.SetEventObject(this); // we use SetInt() to make wxCommandEvent::IsChecked() return toggleDown @@ -658,42 +646,42 @@ bool wxToolBarBase::OnLeftClick(int id, bool toggleDown) } // Call when right button down. -void wxToolBarBase::OnRightClick(int id, +void wxToolBarBase::OnRightClick(int toolid, long WXUNUSED(x), long WXUNUSED(y)) { - wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED, id); + wxCommandEvent event(wxEVT_TOOL_RCLICKED, toolid); event.SetEventObject(this); - event.SetInt(id); + event.SetInt(toolid); GetEventHandler()->ProcessEvent(event); } // Called when the mouse cursor enters a tool bitmap (no button pressed). // Argument is wxID_ANY if mouse is exiting the toolbar. -// Note that for this event, the id of the window is used, +// Note that for this event, the toolid of the window is used, // and the integer parameter of wxCommandEvent is used to retrieve -// the tool id. -void wxToolBarBase::OnMouseEnter(int id) +// the tool toolid. +void wxToolBarBase::OnMouseEnter(int toolid) { - wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, GetId()); + wxCommandEvent event(wxEVT_TOOL_ENTER, GetId()); event.SetEventObject(this); - event.SetInt(id); + event.SetInt(toolid); wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); if ( frame ) { wxString help; - if ( id != wxID_ANY ) + if ( toolid != wxID_ANY ) { - const wxToolBarToolBase * const tool = FindById(id); + const wxToolBarToolBase * const tool = FindById(toolid); 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); + frame->DoGiveHelp(help, toolid != wxID_ANY); } (void)GetEventHandler()->ProcessEvent(event); @@ -712,12 +700,6 @@ void wxToolBarBase::UpdateWindowUI(long flags) 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 ); - if (tlw && wxPendingDelete.Member( tlw )) - return; - wxEvtHandler* evtHandler = GetEventHandler() ; for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); @@ -728,17 +710,17 @@ void wxToolBarBase::UpdateWindowUI(long flags) if ( tool->IsSeparator() ) continue; - int id = tool->GetId(); + int toolid = tool->GetId(); - wxUpdateUIEvent event(id); + wxUpdateUIEvent event(toolid); event.SetEventObject(this); if ( evtHandler->ProcessEvent(event) ) { if ( event.GetSetEnabled() ) - EnableTool(id, event.GetEnabled()); + EnableTool(toolid, event.GetEnabled()); if ( event.GetSetChecked() ) - ToggleTool(id, event.GetChecked()); + ToggleTool(toolid, event.GetChecked()); #if 0 if ( event.GetSetText() ) // Set tooltip? @@ -747,10 +729,11 @@ void wxToolBarBase::UpdateWindowUI(long flags) } } +#if wxUSE_MENUS bool wxToolBarBase::SetDropdownMenu(int toolid, wxMenu* menu) { wxToolBarToolBase * const tool = FindById(toolid); - wxCHECK_MSG( tool, false, wxT("invalid tool id") ); + wxCHECK_MSG( tool, false, wxT("invalid tool toolid") ); wxCHECK_MSG( tool->GetKind() == wxITEM_DROPDOWN, false, wxT("menu can be only associated with drop down tools") ); @@ -759,6 +742,7 @@ bool wxToolBarBase::SetDropdownMenu(int toolid, wxMenu* menu) return true; } +#endif #if WXWIN_COMPATIBILITY_2_8 @@ -766,7 +750,7 @@ bool wxCreateGreyedImage(const wxImage& in, wxImage& out) { #if wxUSE_IMAGE out = in.ConvertToGreyscale(); - if ( out.Ok() ) + if ( out.IsOk() ) return true; #endif // wxUSE_IMAGE return false;