1
///////////////////////////////////////////////////////////////////////////////
2
// Name: src/gtk/infobar.cpp
3
// Purpose: wxInfoBar implementation for GTK
4
// Author: Vadim Zeitlin
6
// RCS-ID: $Id: infobar.cpp 71894 2012-06-30 20:39:06Z PC $
7
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
8
// Licence: wxWindows licence
9
///////////////////////////////////////////////////////////////////////////////
11
// ============================================================================
13
// ============================================================================
15
// ----------------------------------------------------------------------------
17
// ----------------------------------------------------------------------------
19
// for compilers that support precompilation, includes "wx.h".
20
#include "wx/wxprec.h"
26
#include "wx/infobar.h"
28
#if wxUSE_INFOBAR && defined(wxHAS_NATIVE_INFOBAR)
33
#include "wx/vector.h"
34
#include "wx/stockitem.h"
36
#include "wx/gtk/private.h"
37
#include "wx/gtk/private/messagetype.h"
39
// ----------------------------------------------------------------------------
41
// ----------------------------------------------------------------------------
43
class wxInfoBarGTKImpl
52
// label for the text shown in the bar
55
// the default close button, NULL if not needed (m_buttons is not empty) or
59
// information about the buttons added using AddButton()
62
Button(GtkWidget *button_, int id_)
71
typedef wxVector<Button> Buttons;
76
// ----------------------------------------------------------------------------
78
// ----------------------------------------------------------------------------
83
inline bool UseNative()
88
// native GtkInfoBar widget is only available in GTK+ 2.18 and later
89
return gtk_check_version(2, 18, 0) == 0;
93
} // anonymous namespace
98
static void wxgtk_infobar_response(GtkInfoBar * WXUNUSED(infobar),
102
win->GTKResponse(btnid);
105
static void wxgtk_infobar_close(GtkInfoBar * WXUNUSED(infobar),
108
win->GTKResponse(wxID_CANCEL);
111
} // extern "C" section with GTK+ callbacks
113
// ============================================================================
114
// wxInfoBar implementation
115
// ============================================================================
117
bool wxInfoBar::Create(wxWindow *parent, wxWindowID winid)
120
return wxInfoBarGeneric::Create(parent, winid);
122
m_impl = new wxInfoBarGTKImpl;
124
// this control is created initially hidden
126
if ( !CreateBase(parent, winid) )
129
// create the info bar widget itself
130
m_widget = gtk_info_bar_new();
131
wxCHECK_MSG( m_widget, false, "failed to create GtkInfoBar" );
132
g_object_ref(m_widget);
134
// also create a label which will be used to show our message
135
m_impl->m_label = gtk_label_new("");
136
gtk_widget_show(m_impl->m_label);
139
contentArea = gtk_info_bar_get_content_area(GTK_INFO_BAR(m_widget));
140
wxCHECK_MSG( contentArea, false, "failed to get GtkInfoBar content area" );
141
gtk_container_add(GTK_CONTAINER(contentArea), m_impl->m_label);
143
// finish creation and connect to all the signals we're interested in
144
m_parent->DoAddChild(this);
146
PostCreation(wxDefaultSize);
148
GTKConnectWidget("response", G_CALLBACK(wxgtk_infobar_response));
149
GTKConnectWidget("close", G_CALLBACK(wxgtk_infobar_close));
154
wxInfoBar::~wxInfoBar()
159
void wxInfoBar::ShowMessage(const wxString& msg, int flags)
163
wxInfoBarGeneric::ShowMessage(msg, flags);
167
// if we don't have any buttons, create a standard close one to give the
168
// user at least some way to close the bar
169
if ( m_impl->m_buttons.empty() && !m_impl->m_close )
171
m_impl->m_close = GTKAddButton(wxID_CLOSE);
175
if ( wxGTKImpl::ConvertMessageTypeFromWX(flags, &type) )
176
gtk_info_bar_set_message_type(GTK_INFO_BAR(m_widget), type);
177
gtk_label_set_text(GTK_LABEL(m_impl->m_label), wxGTK_CONV(msg));
185
void wxInfoBar::Dismiss()
189
wxInfoBarGeneric::Dismiss();
198
void wxInfoBar::GTKResponse(int btnid)
200
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, btnid);
201
event.SetEventObject(this);
203
if ( !HandleWindowEvent(event) )
207
GtkWidget *wxInfoBar::GTKAddButton(wxWindowID btnid, const wxString& label)
209
// as GTK+ lays out the buttons vertically, adding another button changes
210
// our best size (at least in vertical direction)
211
InvalidateBestSize();
213
GtkWidget *button = gtk_info_bar_add_button
215
GTK_INFO_BAR(m_widget),
217
? GTKConvertMnemonics(wxGetStockGtkID(btnid))
222
wxASSERT_MSG( button, "unexpectedly failed to add button to info bar" );
227
void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
231
wxInfoBarGeneric::AddButton(btnid, label);
235
// if we had created the default close button before, remove it now that we
236
// have some user-defined button
237
if ( m_impl->m_close )
239
gtk_widget_destroy(m_impl->m_close);
240
m_impl->m_close = NULL;
243
GtkWidget * const button = GTKAddButton(btnid, label);
245
m_impl->m_buttons.push_back(wxInfoBarGTKImpl::Button(button, btnid));
248
void wxInfoBar::RemoveButton(wxWindowID btnid)
252
wxInfoBarGeneric::RemoveButton(btnid);
256
// as in the generic version, look for the button starting from the end
257
wxInfoBarGTKImpl::Buttons& buttons = m_impl->m_buttons;
258
for ( wxInfoBarGTKImpl::Buttons::reverse_iterator i = buttons.rbegin();
264
gtk_widget_destroy(i->button);
265
buttons.erase(i.base());
267
// see comment in GTKAddButton()
268
InvalidateBestSize();
274
wxFAIL_MSG( wxString::Format("button with id %d not found", btnid) );
277
void wxInfoBar::DoApplyWidgetStyle(GtkRcStyle *style)
279
wxInfoBarGeneric::DoApplyWidgetStyle(style);
282
GTKApplyStyle(m_impl->m_label, style);
285
#endif // wxUSE_INFOBAR