: wxToolBarToolBase(tbar, control, label)
{
m_item = NULL;
- // Hold a reference to keep control alive until DoInsertTool() is
- // called, or if RemoveTool() is called (see DoDeleteTool)
- g_object_ref(control->m_widget);
- // release reference when gtk_widget_destroy() is called on control
- g_signal_connect(
- control->m_widget, "destroy", G_CALLBACK(g_object_unref), NULL);
}
void SetImage();
}
}
-//-----------------------------------------------------------------------------
-// InsertChild callback for wxToolBar
-//-----------------------------------------------------------------------------
-
-static void wxInsertChildInToolBar( wxWindow* WXUNUSED(parent),
- wxWindow* /* child */)
+void wxToolBar::AddChildGTK(wxWindowGTK* child)
{
- // Child widget will be inserted into GtkToolbar by DoInsertTool()
+ GtkWidget* align = gtk_alignment_new(0.5, 0.5, 0, 0);
+ gtk_widget_show(align);
+ gtk_container_add(GTK_CONTAINER(align), child->m_widget);
+ GtkToolItem* item = gtk_tool_item_new();
+ gtk_container_add(GTK_CONTAINER(item), align);
+ // position will be corrected in DoInsertTool if necessary
+ gtk_toolbar_insert(GTK_TOOLBAR(GTK_BIN(m_widget)->child), item, -1);
}
// ----------------------------------------------------------------------------
void wxToolBar::Init()
{
- m_toolbar = (GtkToolbar *)NULL;
+ m_toolbar = NULL;
m_tooltips = NULL;
}
long style,
const wxString& name )
{
- m_insertCallback = wxInsertChildInToolBar;
-
if ( !PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
{
m_widget = gtk_event_box_new();
ConnectWidget( m_widget );
}
+ g_object_ref(m_widget);
gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_toolbar));
gtk_widget_show(GTK_WIDGET(m_toolbar));
bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, toolBase);
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(toolBase);
GSList* radioGroup;
switch ( tool->GetStyle() )
if (tool->GetKind() == wxITEM_DROPDOWN)
tool->CreateDropDown();
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
break;
case wxTOOL_STYLE_SEPARATOR:
tool->m_item = gtk_separator_tool_item_new();
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
break;
case wxTOOL_STYLE_CONTROL:
- GtkWidget * const align = gtk_alignment_new(0.5, 0.5, 0, 0);
- gtk_widget_show(align);
wxWindow* control = tool->GetControl();
- gtk_container_add(GTK_CONTAINER(align), control->m_widget);
- tool->m_item = gtk_tool_item_new();
- gtk_container_add(GTK_CONTAINER(tool->m_item), align);
+ if (control->m_widget->parent == NULL)
+ AddChildGTK(control);
+ tool->m_item = GTK_TOOL_ITEM(control->m_widget->parent->parent);
+ if (gtk_toolbar_get_item_index(m_toolbar, tool->m_item) != int(pos))
+ {
+ g_object_ref(tool->m_item);
+ gtk_container_remove(
+ GTK_CONTAINER(m_toolbar), GTK_WIDGET(tool->m_item));
+ gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
+ g_object_unref(tool->m_item);
+ }
// Inserted items "slide" into place using an animated effect that
// causes multiple size events on the item. Must set size request
// to keep item size from getting permanently set too small by the
break;
}
gtk_widget_show(GTK_WIDGET(tool->m_item));
- gtk_toolbar_insert(m_toolbar, tool->m_item, int(pos));
InvalidateBestSize();
bool wxToolBar::DoDeleteTool(size_t /* pos */, wxToolBarToolBase* toolBase)
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, toolBase);
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(toolBase);
if (tool->GetStyle() == wxTOOL_STYLE_CONTROL)
{
void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, toolBase);
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(toolBase);
if (tool->m_item)
gtk_widget_set_sensitive(GTK_WIDGET(tool->m_item), enable);
void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, toolBase);
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(toolBase);
if (tool->m_item)
{
// VZ: GTK+ doesn't seem to have such thing
wxFAIL_MSG( _T("wxToolBar::FindToolForPosition() not implemented") );
- return (wxToolBarToolBase *)NULL;
+ return NULL;
}
void wxToolBar::SetToolShortHelp( int id, const wxString& helpString )
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id));
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(FindById(id));
if ( tool )
{
void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap )
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id));
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(FindById(id));
if ( tool )
{
wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap )
{
- wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id));
+ wxToolBarTool* tool = static_cast<wxToolBarTool*>(FindById(id));
if ( tool )
{
wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
void wxToolBar::OnInternalIdle()
{
// Check if we have to show window now
- if (GtkShowFromOnIdle()) return;
+ if (GTKShowFromOnIdle()) return;
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor;