Added wxToggleBitmapButton (it compiles).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26131 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2004-03-07 16:46:36 +00:00
parent 8471ea9033
commit 4f85606724
4 changed files with 468 additions and 2 deletions

View File

@ -13,11 +13,14 @@
#ifndef _WX_GTK_TOGGLEBUTTON_H_
#define _WX_GTK_TOGGLEBUTTON_H_
#include "wx/bitmap.h"
//-----------------------------------------------------------------------------
// classes
//-----------------------------------------------------------------------------
class wxToggleButton;
class wxToggleBitmapButton;
//-----------------------------------------------------------------------------
// global data
@ -25,6 +28,59 @@ class wxToggleButton;
extern const wxChar *wxCheckBoxNameStr;
//-----------------------------------------------------------------------------
// wxToggleBitmapButton
//-----------------------------------------------------------------------------
class wxToggleBitmapButton: public wxControl
{
public:
// construction/destruction
wxToggleBitmapButton() {}
wxToggleBitmapButton(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr)
{
Create(parent, id, label, pos, size, style, validator, name);
}
// Create the control
bool Create(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr);
// Get/set the value
void SetValue(bool state);
bool GetValue() const;
// Set the label
void SetLabel(const wxBitmap& label);
bool Enable(bool enable = TRUE);
// implementation
bool m_blockEvent;
wxBitmap m_bitmap;
void OnSetBitmap();
void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window);
virtual void OnInternalIdle();
virtual wxSize DoGetBestSize() const;
private:
DECLARE_DYNAMIC_CLASS(wxToggleBitmapButton)
};
//-----------------------------------------------------------------------------
// wxToggleButton
//-----------------------------------------------------------------------------

View File

@ -13,11 +13,14 @@
#ifndef _WX_GTK_TOGGLEBUTTON_H_
#define _WX_GTK_TOGGLEBUTTON_H_
#include "wx/bitmap.h"
//-----------------------------------------------------------------------------
// classes
//-----------------------------------------------------------------------------
class wxToggleButton;
class wxToggleBitmapButton;
//-----------------------------------------------------------------------------
// global data
@ -25,6 +28,59 @@ class wxToggleButton;
extern const wxChar *wxCheckBoxNameStr;
//-----------------------------------------------------------------------------
// wxToggleBitmapButton
//-----------------------------------------------------------------------------
class wxToggleBitmapButton: public wxControl
{
public:
// construction/destruction
wxToggleBitmapButton() {}
wxToggleBitmapButton(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr)
{
Create(parent, id, label, pos, size, style, validator, name);
}
// Create the control
bool Create(wxWindow *parent,
wxWindowID id,
const wxBitmap& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr);
// Get/set the value
void SetValue(bool state);
bool GetValue() const;
// Set the label
void SetLabel(const wxBitmap& label);
bool Enable(bool enable = TRUE);
// implementation
bool m_blockEvent;
wxBitmap m_bitmap;
void OnSetBitmap();
void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window);
virtual void OnInternalIdle();
virtual wxSize DoGetBestSize() const;
private:
DECLARE_DYNAMIC_CLASS(wxToggleBitmapButton)
};
//-----------------------------------------------------------------------------
// wxToggleButton
//-----------------------------------------------------------------------------

View File

@ -43,9 +43,186 @@ static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxTog
cb->GetEventHandler()->ProcessEvent(event);
}
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
// ------------------------------------------------------------------------
// wxToggleBitmapButton
// ------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleBitmapButton, wxControl)
bool wxToggleBitmapButton::Create(wxWindow *parent, wxWindowID id,
const wxBitmap &label, const wxPoint &pos,
const wxSize &size, long style,
const wxValidator& validator,
const wxString &name)
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name ))
{
wxFAIL_MSG(wxT("wxToggleBitmapButton creation failed"));
return FALSE;
}
m_bitmap = label;
// Create the gtk widget.
m_widget = gtk_toggle_button_new();
if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
if (m_bitmap.Ok())
{
wxSize newSize = size;
int border = (style & wxNO_BORDER) ? 4 : 10;
if (newSize.x == -1)
newSize.x = m_bitmap.GetWidth()+border;
if (newSize.y == -1)
newSize.y = m_bitmap.GetHeight()+border;
SetSize( newSize.x, newSize.y );
OnSetBitmap();
}
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_parent->DoAddChild(this);
PostCreation();
InheritAttributes();
Show( TRUE );
return TRUE;
}
// void SetValue(bool state)
// Set the value of the toggle button.
void wxToggleBitmapButton::SetValue(bool state)
{
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
if (state == GetValue())
return;
m_blockEvent = TRUE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
m_blockEvent = FALSE;
}
// bool GetValue() const
// Get the value of the toggle button.
bool wxToggleBitmapButton::GetValue() const
{
wxCHECK_MSG(m_widget != NULL, FALSE, wxT("invalid toggle button"));
return GTK_TOGGLE_BUTTON(m_widget)->active;
}
void wxToggleBitmapButton::SetLabel(const wxBitmap& label)
{
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
m_bitmap = label;
OnSetBitmap();
}
void wxToggleBitmapButton::OnSetBitmap()
{
if (!m_bitmap.Ok()) return;
GdkBitmap *mask = (GdkBitmap *) NULL;
if (m_bitmap.GetMask()) mask = m_bitmap.GetMask()->GetBitmap();
GtkWidget *child = BUTTON_CHILD(m_widget);
if (child == NULL)
{
// initial bitmap
GtkWidget *pixmap = gtk_pixmap_new(m_bitmap.GetPixmap(), mask);
gtk_widget_show(pixmap);
gtk_container_add(GTK_CONTAINER(m_widget), pixmap);
}
else
{ // subsequent bitmaps
GtkPixmap *g_pixmap = GTK_PIXMAP(child);
gtk_pixmap_set(g_pixmap, m_bitmap.GetPixmap(), mask);
}
}
bool wxToggleBitmapButton::Enable(bool enable /*=TRUE*/)
{
if (!wxControl::Enable(enable))
return FALSE;
gtk_widget_set_sensitive(BUTTON_CHILD(m_widget), enable);
return TRUE;
}
void wxToggleBitmapButton::ApplyWidgetStyle()
{
SetWidgetStyle();
gtk_widget_set_style(m_widget, m_widgetStyle);
gtk_widget_set_style(BUTTON_CHILD(m_widget), m_widgetStyle);
}
bool wxToggleBitmapButton::IsOwnGtkWindow(GdkWindow *window)
{
return window == TOGGLE_BUTTON_EVENT_WIN(m_widget);
}
void wxToggleBitmapButton::OnInternalIdle()
{
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok())
cursor = g_globalCursor;
GdkWindow *win = TOGGLE_BUTTON_EVENT_WIN(m_widget);
if ( win && cursor.Ok() )
{
/* I now set the cursor the anew in every OnInternalIdle call
as setting the cursor in a parent window also effects the
windows above so that checking for the current cursor is
not possible. */
gdk_window_set_cursor(win, cursor.GetCursor());
}
if (wxUpdateUIEvent::CanUpdate(this))
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
}
// wxSize DoGetBestSize() const
// Get the "best" size for this control.
wxSize wxToggleBitmapButton::DoGetBestSize() const
{
wxSize ret(wxControl::DoGetBestSize());
if (!HasFlag(wxBU_EXACTFIT))
{
if (ret.x < 80) ret.x = 80;
}
return ret;
}
// ------------------------------------------------------------------------
// wxToggleButton
// ------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
const wxString &label, const wxPoint &pos,
const wxSize &size, long style,

View File

@ -43,9 +43,186 @@ static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxTog
cb->GetEventHandler()->ProcessEvent(event);
}
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED)
// ------------------------------------------------------------------------
// wxToggleBitmapButton
// ------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleBitmapButton, wxControl)
bool wxToggleBitmapButton::Create(wxWindow *parent, wxWindowID id,
const wxBitmap &label, const wxPoint &pos,
const wxSize &size, long style,
const wxValidator& validator,
const wxString &name)
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name ))
{
wxFAIL_MSG(wxT("wxToggleBitmapButton creation failed"));
return FALSE;
}
m_bitmap = label;
// Create the gtk widget.
m_widget = gtk_toggle_button_new();
if (style & wxNO_BORDER)
gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE );
if (m_bitmap.Ok())
{
wxSize newSize = size;
int border = (style & wxNO_BORDER) ? 4 : 10;
if (newSize.x == -1)
newSize.x = m_bitmap.GetWidth()+border;
if (newSize.y == -1)
newSize.y = m_bitmap.GetHeight()+border;
SetSize( newSize.x, newSize.y );
OnSetBitmap();
}
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
m_parent->DoAddChild(this);
PostCreation();
InheritAttributes();
Show( TRUE );
return TRUE;
}
// void SetValue(bool state)
// Set the value of the toggle button.
void wxToggleBitmapButton::SetValue(bool state)
{
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
if (state == GetValue())
return;
m_blockEvent = TRUE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
m_blockEvent = FALSE;
}
// bool GetValue() const
// Get the value of the toggle button.
bool wxToggleBitmapButton::GetValue() const
{
wxCHECK_MSG(m_widget != NULL, FALSE, wxT("invalid toggle button"));
return GTK_TOGGLE_BUTTON(m_widget)->active;
}
void wxToggleBitmapButton::SetLabel(const wxBitmap& label)
{
wxCHECK_RET(m_widget != NULL, wxT("invalid toggle button"));
m_bitmap = label;
OnSetBitmap();
}
void wxToggleBitmapButton::OnSetBitmap()
{
if (!m_bitmap.Ok()) return;
GdkBitmap *mask = (GdkBitmap *) NULL;
if (m_bitmap.GetMask()) mask = m_bitmap.GetMask()->GetBitmap();
GtkWidget *child = BUTTON_CHILD(m_widget);
if (child == NULL)
{
// initial bitmap
GtkWidget *pixmap = gtk_pixmap_new(m_bitmap.GetPixmap(), mask);
gtk_widget_show(pixmap);
gtk_container_add(GTK_CONTAINER(m_widget), pixmap);
}
else
{ // subsequent bitmaps
GtkPixmap *g_pixmap = GTK_PIXMAP(child);
gtk_pixmap_set(g_pixmap, m_bitmap.GetPixmap(), mask);
}
}
bool wxToggleBitmapButton::Enable(bool enable /*=TRUE*/)
{
if (!wxControl::Enable(enable))
return FALSE;
gtk_widget_set_sensitive(BUTTON_CHILD(m_widget), enable);
return TRUE;
}
void wxToggleBitmapButton::ApplyWidgetStyle()
{
SetWidgetStyle();
gtk_widget_set_style(m_widget, m_widgetStyle);
gtk_widget_set_style(BUTTON_CHILD(m_widget), m_widgetStyle);
}
bool wxToggleBitmapButton::IsOwnGtkWindow(GdkWindow *window)
{
return window == TOGGLE_BUTTON_EVENT_WIN(m_widget);
}
void wxToggleBitmapButton::OnInternalIdle()
{
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok())
cursor = g_globalCursor;
GdkWindow *win = TOGGLE_BUTTON_EVENT_WIN(m_widget);
if ( win && cursor.Ok() )
{
/* I now set the cursor the anew in every OnInternalIdle call
as setting the cursor in a parent window also effects the
windows above so that checking for the current cursor is
not possible. */
gdk_window_set_cursor(win, cursor.GetCursor());
}
if (wxUpdateUIEvent::CanUpdate(this))
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
}
// wxSize DoGetBestSize() const
// Get the "best" size for this control.
wxSize wxToggleBitmapButton::DoGetBestSize() const
{
wxSize ret(wxControl::DoGetBestSize());
if (!HasFlag(wxBU_EXACTFIT))
{
if (ret.x < 80) ret.x = 80;
}
return ret;
}
// ------------------------------------------------------------------------
// wxToggleButton
// ------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxToggleButton, wxControl)
bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
const wxString &label, const wxPoint &pos,
const wxSize &size, long style,