Added native wxInfoBar implementation for wxGTK.

Straightforward implementation of wxInfoBar using GtkInfoBar widget available
in GTK+ 2.18.

Some side effects of this change:

- Rename wxInfoBar version in wx/generic/infobar.h to wxInfoBarGeneric and
  define wxInfoBar in wx/infobar.h.
- Also change default value of flags argument to ShowMessage() to
  wxICON_INFORMATION from wxICON_NONE as the default colour for wxICON_NONE
  messages is surprisingly ugly in GTK native version.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62276 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2009-10-05 22:55:10 +00:00
parent a0c8bb73f2
commit ed8efd46d9
8 changed files with 307 additions and 56 deletions

View File

@ -3371,7 +3371,8 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_ADVANCED_PLATFORM_NATIVE_HDR = \
wx/gtk/bmpcbox.h \
wx/gtk/calctrl.h \
wx/gtk/dataview.h \
wx/gtk/hyperlink.h
wx/gtk/hyperlink.h \
wx/gtk/infobar.h
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@ADVANCED_PLATFORM_NATIVE_HDR = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_ADVANCED_PLATFORM_NATIVE_HDR)
@COND_TOOLKIT_MSW@ADVANCED_PLATFORM_NATIVE_HDR = \
@COND_TOOLKIT_MSW@ wx/generic/animate.h wx/msw/bmpcbox.h wx/msw/calctrl.h \
@ -5615,7 +5616,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS = \
monodll_gridsel.o \
monodll_helpext.o \
monodll_hyperlinkg.o \
monodll_infobar.o \
monodll_generic_infobar.o \
monodll_laywin.o \
monodll_notifmsgg.o \
monodll_odcombo.o \
@ -5645,7 +5646,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS = \
monodll_gridsel.o \
monodll_helpext.o \
monodll_hyperlinkg.o \
monodll_infobar.o \
monodll_generic_infobar.o \
monodll_laywin.o \
monodll_notifmsgg.o \
monodll_odcombo.o \
@ -5663,7 +5664,8 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS = \
monodll_gtk_bmpcbox.o \
monodll_gtk_calctrl.o \
monodll_gtk_dataview.o \
monodll_hyperlink.o
monodll_hyperlink.o \
monodll_gtk_infobar.o
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS)
COND_TOOLKIT_MSW___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS = \
monodll_animateg.o \
@ -7427,7 +7429,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_1 = \
monolib_gridsel.o \
monolib_helpext.o \
monolib_hyperlinkg.o \
monolib_infobar.o \
monolib_generic_infobar.o \
monolib_laywin.o \
monolib_notifmsgg.o \
monolib_odcombo.o \
@ -7457,7 +7459,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_1 = \
monolib_gridsel.o \
monolib_helpext.o \
monolib_hyperlinkg.o \
monolib_infobar.o \
monolib_generic_infobar.o \
monolib_laywin.o \
monolib_notifmsgg.o \
monolib_odcombo.o \
@ -7475,7 +7477,8 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1 = \
monolib_gtk_bmpcbox.o \
monolib_gtk_calctrl.o \
monolib_gtk_dataview.o \
monolib_hyperlink.o
monolib_hyperlink.o \
monolib_gtk_infobar.o
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1)
COND_TOOLKIT_MSW___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_1 = \
monolib_animateg.o \
@ -10921,7 +10924,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_2 = \
advdll_gridsel.o \
advdll_helpext.o \
advdll_hyperlinkg.o \
advdll_infobar.o \
advdll_generic_infobar.o \
advdll_laywin.o \
advdll_notifmsgg.o \
advdll_odcombo.o \
@ -10951,7 +10954,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_2 = \
advdll_gridsel.o \
advdll_helpext.o \
advdll_hyperlinkg.o \
advdll_infobar.o \
advdll_generic_infobar.o \
advdll_laywin.o \
advdll_notifmsgg.o \
advdll_odcombo.o \
@ -10969,7 +10972,8 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2 = \
advdll_gtk_bmpcbox.o \
advdll_gtk_calctrl.o \
advdll_gtk_dataview.o \
advdll_hyperlink.o
advdll_hyperlink.o \
advdll_gtk_infobar.o
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2)
COND_TOOLKIT_MSW___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_2 = \
advdll_animateg.o \
@ -11017,7 +11021,7 @@ COND_WXUNIV_0___ADVANCED_SRC_OBJECTS_3 = \
advlib_gridsel.o \
advlib_helpext.o \
advlib_hyperlinkg.o \
advlib_infobar.o \
advlib_generic_infobar.o \
advlib_laywin.o \
advlib_notifmsgg.o \
advlib_odcombo.o \
@ -11047,7 +11051,7 @@ COND_WXUNIV_1___ADVANCED_SRC_OBJECTS_3 = \
advlib_gridsel.o \
advlib_helpext.o \
advlib_hyperlinkg.o \
advlib_infobar.o \
advlib_generic_infobar.o \
advlib_laywin.o \
advlib_notifmsgg.o \
advlib_odcombo.o \
@ -11065,7 +11069,8 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3 = \
advlib_gtk_bmpcbox.o \
advlib_gtk_calctrl.o \
advlib_gtk_dataview.o \
advlib_hyperlink.o
advlib_hyperlink.o \
advlib_gtk_infobar.o
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2@__ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3 = $(COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3)
COND_TOOLKIT_MSW___ADVANCED_PLATFORM_NATIVE_SRC_OBJECTS_3 = \
advlib_animateg.o \
@ -15850,6 +15855,9 @@ monodll_gtk_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(MONODLL_ODEP)
monodll_hyperlink.o: $(srcdir)/src/gtk/hyperlink.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/hyperlink.cpp
monodll_gtk_infobar.o: $(srcdir)/src/gtk/infobar.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/infobar.cpp
monodll_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/mediactrlcmn.cpp
@ -18724,7 +18732,7 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@monodll_hyperlinkg.o: $(srcdir)/src/generic/hyperlinkg.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/hyperlinkg.cpp
@COND_USE_GUI_1@monodll_infobar.o: $(srcdir)/src/generic/infobar.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@monodll_generic_infobar.o: $(srcdir)/src/generic/infobar.cpp $(MONODLL_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/generic/infobar.cpp
@COND_USE_GUI_1@monodll_laywin.o: $(srcdir)/src/generic/laywin.cpp $(MONODLL_ODEP)
@ -20623,6 +20631,9 @@ monolib_gtk_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(MONOLIB_ODEP)
monolib_hyperlink.o: $(srcdir)/src/gtk/hyperlink.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/hyperlink.cpp
monolib_gtk_infobar.o: $(srcdir)/src/gtk/infobar.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/infobar.cpp
monolib_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/mediactrlcmn.cpp
@ -23497,7 +23508,7 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@monolib_hyperlinkg.o: $(srcdir)/src/generic/hyperlinkg.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/hyperlinkg.cpp
@COND_USE_GUI_1@monolib_infobar.o: $(srcdir)/src/generic/infobar.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@monolib_generic_infobar.o: $(srcdir)/src/generic/infobar.cpp $(MONOLIB_ODEP)
@COND_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/generic/infobar.cpp
@COND_USE_GUI_1@monolib_laywin.o: $(srcdir)/src/generic/laywin.cpp $(MONOLIB_ODEP)
@ -31933,6 +31944,9 @@ advdll_gtk_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(ADVDLL_ODEP)
advdll_hyperlink.o: $(srcdir)/src/gtk/hyperlink.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/gtk/hyperlink.cpp
advdll_gtk_infobar.o: $(srcdir)/src/gtk/infobar.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/gtk/infobar.cpp
advdll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/unix/sound_sdl.cpp
@ -31987,7 +32001,7 @@ advdll_helpext.o: $(srcdir)/src/generic/helpext.cpp $(ADVDLL_ODEP)
advdll_hyperlinkg.o: $(srcdir)/src/generic/hyperlinkg.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/hyperlinkg.cpp
advdll_infobar.o: $(srcdir)/src/generic/infobar.cpp $(ADVDLL_ODEP)
advdll_generic_infobar.o: $(srcdir)/src/generic/infobar.cpp $(ADVDLL_ODEP)
$(CXXC) -c -o $@ $(ADVDLL_CXXFLAGS) $(srcdir)/src/generic/infobar.cpp
advdll_laywin.o: $(srcdir)/src/generic/laywin.cpp $(ADVDLL_ODEP)
@ -32260,6 +32274,9 @@ advlib_gtk_dataview.o: $(srcdir)/src/gtk/dataview.cpp $(ADVLIB_ODEP)
advlib_hyperlink.o: $(srcdir)/src/gtk/hyperlink.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/gtk/hyperlink.cpp
advlib_gtk_infobar.o: $(srcdir)/src/gtk/infobar.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/gtk/infobar.cpp
advlib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/unix/sound_sdl.cpp
@ -32314,7 +32331,7 @@ advlib_helpext.o: $(srcdir)/src/generic/helpext.cpp $(ADVLIB_ODEP)
advlib_hyperlinkg.o: $(srcdir)/src/generic/hyperlinkg.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/hyperlinkg.cpp
advlib_infobar.o: $(srcdir)/src/generic/infobar.cpp $(ADVLIB_ODEP)
advlib_generic_infobar.o: $(srcdir)/src/generic/infobar.cpp $(ADVLIB_ODEP)
$(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $(srcdir)/src/generic/infobar.cpp
advlib_laywin.o: $(srcdir)/src/generic/laywin.cpp $(ADVLIB_ODEP)

View File

@ -3028,6 +3028,7 @@ src/osx/iphone/window.mm
src/gtk/calctrl.cpp
src/gtk/dataview.cpp
src/gtk/hyperlink.cpp
src/gtk/infobar.cpp
</set>
<set var="ADVANCED_GTK_NATIVE_HDR" hints="files">
wx/gtk/animate.h
@ -3035,6 +3036,7 @@ src/osx/iphone/window.mm
wx/gtk/calctrl.h
wx/gtk/dataview.h
wx/gtk/hyperlink.h
wx/gtk/infobar.h
</set>
<set var="ADVANCED_GTK1_SRC" hints="files">

View File

@ -19,14 +19,14 @@ class WXDLLIMPEXP_FWD_CORE wxStaticText;
// wxInfoBar
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_ADV wxInfoBar : public wxInfoBarBase
class WXDLLIMPEXP_ADV wxInfoBarGeneric : public wxInfoBarBase
{
public:
// the usual ctors and Create() but remember that info bar is created
// hidden
wxInfoBar() { Init(); }
wxInfoBarGeneric() { Init(); }
wxInfoBar(wxWindow *parent, wxWindowID winid = wxID_ANY)
wxInfoBarGeneric(wxWindow *parent, wxWindowID winid = wxID_ANY)
{
Init();
Create(parent, winid);
@ -38,7 +38,8 @@ public:
// implement base class methods
// ----------------------------
virtual void ShowMessage(const wxString& msg, int flags = wxICON_NONE);
virtual void ShowMessage(const wxString& msg,
int flags = wxICON_INFORMATION);
virtual void AddButton(wxWindowID btnid, const wxString& label = wxString());
@ -76,6 +77,11 @@ public:
// (default font is a larger and bold version of the normal one)
virtual bool SetFont(const wxFont& font);
protected:
// update the parent to take our new or changed size into account (notably
// should be called when we're shown or hidden)
void UpdateParent();
private:
// common part of all ctors
void Init();
@ -83,9 +89,6 @@ private:
// handler for the close button
void OnButton(wxCommandEvent& event);
// update the parent after we're shown or hidden
void UpdateParent();
// change the parent background colour to match that of our sibling
void ChangeParentBackground();
@ -110,7 +113,7 @@ private:
// the original parent background colour, before we changed it
wxColour m_origParentBgCol;
wxDECLARE_NO_COPY_CLASS(wxInfoBar);
wxDECLARE_NO_COPY_CLASS(wxInfoBarGeneric);
};
#endif // _WX_GENERIC_INFOBAR_H_

64
include/wx/gtk/infobar.h Normal file
View File

@ -0,0 +1,64 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/gtk/infobar.h
// Purpose: native implementation of wxInfoBar for GTK+ 2.18 and later
// Author: Vadim Zeitlin
// Created: 2009-09-26
// RCS-ID: $Id: wxhead.h,v 1.11 2009-06-29 10:23:04 zeitlin Exp $
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_GTK_INFOBAR_H_
#define _WX_GTK_INFOBAR_H_
#include "wx/generic/infobar.h"
// ----------------------------------------------------------------------------
// wxInfoBar for GTK+
// ----------------------------------------------------------------------------
// notice that the native GTK+ implementation is only available since
// (relatively recent) 2.18 so we inherit from the generic one to be able to
// fall back to it if GTK+ version is determined to be too old during run-time
class WXDLLIMPEXP_ADV wxInfoBar : public wxInfoBarGeneric
{
public:
wxInfoBar() { Init(); }
wxInfoBar(wxWindow *parent, wxWindowID winid = wxID_ANY)
{
Init();
Create(parent, winid);
}
bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY);
virtual ~wxInfoBar();
// implement base class methods
// ----------------------------
virtual void ShowMessage(const wxString& msg,
int flags = wxICON_INFORMATION);
virtual void AddButton(wxWindowID btnid,
const wxString& label = wxString());
// implementation only
// -------------------
void GTKResponse(int btnid);
protected:
virtual bool GTKShouldConnectSizeRequest() const { return false; }
private:
void Init() { m_label = NULL; }
GtkWidget *m_label;
wxDECLARE_NO_COPY_CLASS(wxInfoBar);
};
#endif // _WX_GTK_INFOBAR_H_

View File

@ -21,7 +21,7 @@
// wxInfoBar shows non-critical but important information to the user
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_ADV wxInfoBarBase : public wxWindow
class WXDLLIMPEXP_ADV wxInfoBarBase : public wxControl
{
public:
// real ctors are provided by the derived classes, just notice that unlike
@ -33,7 +33,8 @@ public:
// show the info bar with the given message and optionally an icon
virtual void ShowMessage(const wxString& msg, int flags = wxICON_NONE) = 0;
virtual void ShowMessage(const wxString& msg,
int flags = wxICON_INFORMATION) = 0;
// add an extra button to the bar, near the message
virtual void AddButton(wxWindowID btnid,
@ -43,10 +44,20 @@ private:
wxDECLARE_NO_COPY_CLASS(wxInfoBarBase);
};
// include platform-dependent implementation
//
// TODO-GTK: implement a native version using GtkInfoBar (GTK+ 2.18+)
#include "wx/generic/infobar.h"
// currently only GTK+ has a native implementation
#if defined(__WXGTK20__) && !defined(__WXUNIVERSAL__)
#include <gtk/gtkversion.h>
#if GTK_CHECK_VERSION(2, 18, 0)
#include "wx/gtk/infobar.h"
#define wxHAS_NATIVE_INFOBAR
#endif
#endif // wxGTK2
// if the generic version is the only one we have, use it
#ifndef wxHAS_NATIVE_INFOBAR
#include "wx/generic/infobar.h"
#define wxInfoBar wxInfoBarGeneric
#endif
#endif // wxUSE_INFOBAR

View File

@ -59,10 +59,10 @@
See the dialogs sample for more sophisticated examples.
Only generic implementation of this class exists currently but it is
planned to provide a native GTK+-based version in future wxWidgets releases
so avoid the use of the methods marked "generic only" for maximal
portability.
Currently this class is implemented generically (i.e. in the same
platform-independent way for all ports) and also natively in wxGTK but the
native implementation requires a recent -- as of this writing -- GTK+ 2.18
version.
@library{wxadv}
@category{miscwnd}
@ -140,10 +140,14 @@ public:
@param msg
The text of the message.
@param flags
One of wxICON_NONE (default), wxICON_INFORMATION, wxICON_QUESTION,
One of wxICON_NONE, wxICON_INFORMATION (default), wxICON_QUESTION,
wxICON_WARNING or wxICON_ERROR values. These flags have the same
meaning as in wxMessageDialog, i.e. show the corresponding icon in
the bar.
meaning as in wxMessageDialog for the generic version, i.e. show
(or not, in case of wxICON_NONE) the corresponding icon in the bar
but can be interpreted by the native versions. For example, the
GTK+ native implementation doesn't show icons at all but uses this
parameter to select the appropriate background colour for the
notification.
*/
void ShowMessage(const wxString& msg, int flags = wxICON_NONE);
@ -153,9 +157,9 @@ public:
All these methods exist in the generic version of the class only.
The generic version uses wxWindow::ShowWithEffect() function to
progressively show it on the platforms which support it. The methods
here allow to change the default effect used (or disable it entirely)
and change its duration.
progressively show it on the platforms which support it (currently only
wxMSW). The methods here allow to change the default effect used (or
disable it entirely) and change its duration.
*/
//@{

View File

@ -26,7 +26,6 @@
#if wxUSE_INFOBAR
#ifndef WX_PRECOMP
#include "wx/artprov.h"
#include "wx/bmpbuttn.h"
#include "wx/button.h"
#include "wx/settings.h"
@ -36,6 +35,7 @@
#include "wx/infobar.h"
#include "wx/artprov.h"
#include "wx/scopeguard.h"
#include "wx/sizer.h"
@ -43,7 +43,7 @@
// implementation
// ============================================================================
void wxInfoBar::Init()
void wxInfoBarGeneric::Init()
{
m_icon = NULL;
m_text = NULL;
@ -56,7 +56,7 @@ void wxInfoBar::Init()
m_effectDuration = 0;
}
bool wxInfoBar::Create(wxWindow *parent, wxWindowID winid)
bool wxInfoBarGeneric::Create(wxWindow *parent, wxWindowID winid)
{
// calling Hide() before Create() ensures that we're created initially
// hidden
@ -92,7 +92,7 @@ bool wxInfoBar::Create(wxWindow *parent, wxWindowID winid)
Connect
(
wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxInfoBar::OnButton),
wxCommandEventHandler(wxInfoBarGeneric::OnButton),
NULL,
this
);
@ -113,7 +113,7 @@ bool wxInfoBar::Create(wxWindow *parent, wxWindowID winid)
return true;
}
bool wxInfoBar::SetFont(const wxFont& font)
bool wxInfoBarGeneric::SetFont(const wxFont& font)
{
if ( !wxInfoBarBase::SetFont(font) )
return false;
@ -125,13 +125,13 @@ bool wxInfoBar::SetFont(const wxFont& font)
return true;
}
void wxInfoBar::UpdateParent()
void wxInfoBarGeneric::UpdateParent()
{
wxWindow * const parent = wxGetTopLevelParent(GetParent());
parent->Layout();
}
void wxInfoBar::ChangeParentBackground()
void wxInfoBarGeneric::ChangeParentBackground()
{
wxWindow * const parent = GetParent();
m_origParentBgCol = parent->GetBackgroundColour();
@ -169,21 +169,21 @@ void wxInfoBar::ChangeParentBackground()
parent->SetOwnBackgroundColour(sibling->GetBackgroundColour());
}
void wxInfoBar::RestoreParentBackground()
void wxInfoBarGeneric::RestoreParentBackground()
{
GetParent()->SetOwnBackgroundColour(m_origParentBgCol);
}
void wxInfoBar::DoHide()
void wxInfoBarGeneric::DoHide()
{
ChangeParentBackground();
wxON_BLOCK_EXIT_THIS0( wxInfoBar::RestoreParentBackground );
wxON_BLOCK_EXIT_THIS0( wxInfoBarGeneric::RestoreParentBackground );
HideWithEffect(m_hideEffect, m_effectDuration);
UpdateParent();
}
void wxInfoBar::DoShow()
void wxInfoBarGeneric::DoShow()
{
// re-layout the parent first so that the window expands into an already
// unoccupied by the other controls area: for this we need to change our
@ -199,7 +199,7 @@ void wxInfoBar::DoShow()
// going to expand to look like part of this sibling for a better effect so
// temporarily change the background of our parent to the same colour
ChangeParentBackground();
wxON_BLOCK_EXIT_THIS0( wxInfoBar::RestoreParentBackground );
wxON_BLOCK_EXIT_THIS0( wxInfoBarGeneric::RestoreParentBackground );
// adjust the parent layout to account for us
UpdateParent();
@ -213,7 +213,7 @@ void wxInfoBar::DoShow()
ShowWithEffect(m_showEffect, m_effectDuration);
}
void wxInfoBar::ShowMessage(const wxString& msg, int flags)
void wxInfoBarGeneric::ShowMessage(const wxString& msg, int flags)
{
// first update the controls
const int icon = flags & wxICON_MASK;
@ -244,7 +244,7 @@ void wxInfoBar::ShowMessage(const wxString& msg, int flags)
}
}
void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
void wxInfoBarGeneric::AddButton(wxWindowID btnid, const wxString& label)
{
wxSizer * const sizer = GetSizer();
wxCHECK_RET( sizer, "must be created first" );
@ -254,7 +254,7 @@ void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
wxSizerFlags().Centre().DoubleBorder());
}
void wxInfoBar::OnButton(wxCommandEvent& WXUNUSED(event))
void wxInfoBarGeneric::OnButton(wxCommandEvent& WXUNUSED(event))
{
DoHide();
}

150
src/gtk/infobar.cpp Normal file
View File

@ -0,0 +1,150 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/gtk/infobar.cpp
// Purpose: wxInfoBar implementation for GTK
// Author: Vadim Zeitlin
// Created: 2009-09-27
// RCS-ID: $Id: wxhead.cpp,v 1.10 2009-06-29 10:23:04 zeitlin Exp $
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/infobar.h"
#if wxUSE_INFOBAR && defined(wxHAS_NATIVE_INFOBAR)
#ifndef WX_PRECOMP
#endif // WX_PRECOMP
#include "wx/gtk/private.h"
#include "wx/gtk/private/messagetype.h"
// ----------------------------------------------------------------------------
// local functions
// ----------------------------------------------------------------------------
namespace
{
inline bool UseNative()
{
// native GtkInfoBar widget is only available in GTK+ 2.18 and later
return gtk_check_version(2, 18, 0) == 0;
}
} // anonymous namespace
extern "C"
{
static void wxgtk_infobar_response(GtkInfoBar * WXUNUSED(infobar),
gint btnid,
wxInfoBar *win)
{
win->GTKResponse(btnid);
}
static void wxgtk_infobar_close(GtkInfoBar * WXUNUSED(infobar),
wxInfoBar *win)
{
win->GTKResponse(wxID_CANCEL);
}
} // extern "C" section with GTK+ callbacks
// ============================================================================
// wxInfoBar implementation
// ============================================================================
bool wxInfoBar::Create(wxWindow *parent, wxWindowID winid)
{
if ( !UseNative() )
return wxInfoBarGeneric::Create(parent, winid);
// this control is created initially hidden
Hide();
if ( !CreateBase(parent, winid) )
return false;
// create the info bar widget itself
m_widget = gtk_info_bar_new();
wxCHECK_MSG( m_widget, false, "failed to create GtkInfoBar" );
g_object_ref(m_widget);
// also create a label which will be used to show our message
m_label = gtk_label_new("");
gtk_widget_show(m_label);
GtkWidget * const
contentArea = gtk_info_bar_get_content_area(GTK_INFO_BAR(m_widget));
wxCHECK_MSG( contentArea, false, "failed to get GtkInfoBar content area" );
gtk_container_add(GTK_CONTAINER(contentArea), m_label);
// finish creation and connect to all the signals we're interested in
m_parent->DoAddChild(this);
PostCreation(wxDefaultSize);
GTKConnectWidget("response", G_CALLBACK(wxgtk_infobar_response));
GTKConnectWidget("close", G_CALLBACK(wxgtk_infobar_close));
return false;
}
void wxInfoBar::ShowMessage(const wxString& msg, int flags)
{
if ( !UseNative() )
{
wxInfoBarGeneric::ShowMessage(msg, flags);
return;
}
GtkMessageType type;
if ( wxGTKImpl::ConvertMessageTypeFromWX(flags, &type) )
gtk_info_bar_set_message_type(GTK_INFO_BAR(m_widget), type);
gtk_label_set_text(GTK_LABEL(m_label), wxGTK_CONV(msg));
if ( !IsShown() )
Show();
UpdateParent();
}
void wxInfoBar::GTKResponse(int WXUNUSED(btnid))
{
Hide();
UpdateParent();
}
void wxInfoBar::AddButton(wxWindowID btnid, const wxString& label)
{
if ( !UseNative() )
{
wxInfoBarGeneric::AddButton(btnid, label);
return;
}
gtk_info_bar_add_button
(
GTK_INFO_BAR(m_widget),
label.empty() ? GTKConvertMnemonics(wxGetStockGtkID(btnid)) : label,
btnid
);
}
#endif // wxUSE_INFOBAR