hack to implement right aligned checkboxes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1955 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-03-22 18:55:24 +00:00
parent a818cceade
commit 2cc0e28f6a
4 changed files with 150 additions and 70 deletions

View File

@ -41,7 +41,7 @@ class wxCheckBox: public wxControl
DECLARE_DYNAMIC_CLASS(wxCheckBox)
public:
wxCheckBox(void);
wxCheckBox();
wxCheckBox( wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
@ -50,11 +50,15 @@ public:
{
Create(parent, id, label, pos, size, style, validator, name);
}
bool Create( wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr );
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr );
void SetValue( bool state );
bool GetValue() const;
@ -62,10 +66,11 @@ public:
void Enable( bool enable );
// implementation
void ApplyWidgetStyle();
bool m_blockFirstEvent;
bool m_blockFirstEvent;
GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel;
};
#endif // __GTKCHECKBOXH__

View File

@ -41,7 +41,7 @@ class wxCheckBox: public wxControl
DECLARE_DYNAMIC_CLASS(wxCheckBox)
public:
wxCheckBox(void);
wxCheckBox();
wxCheckBox( wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
@ -50,11 +50,15 @@ public:
{
Create(parent, id, label, pos, size, style, validator, name);
}
bool Create( wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr );
bool Create(wxWindow *parent,
wxWindowID id,
const wxString& label,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxCheckBoxNameStr );
void SetValue( bool state );
bool GetValue() const;
@ -62,10 +66,11 @@ public:
void Enable( bool enable );
// implementation
void ApplyWidgetStyle();
bool m_blockFirstEvent;
bool m_blockFirstEvent;
GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel;
};
#endif // __GTKCHECKBOXH__

View File

@ -51,32 +51,69 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
IMPLEMENT_DYNAMIC_CLASS(wxCheckBox,wxControl)
wxCheckBox::wxCheckBox(void)
wxCheckBox::wxCheckBox()
{
}
bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label,
const wxPoint &pos, const wxSize &size,
long style, const wxValidator& validator, const wxString &name )
bool wxCheckBox::Create(wxWindow *parent,
wxWindowID id,
const wxString &label,
const wxPoint &pos,
const wxSize &size,
long style,
const wxValidator& validator,
const wxString &name )
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
PreCreation( parent, id, pos, size, style, name );
SetValidator( validator );
m_widget = gtk_check_button_new_with_label( m_label );
m_blockFirstEvent = FALSE;
wxSize newSize = size;
if (newSize.x == -1) newSize.x = 25+gdk_string_measure( m_widget->style->font, label );
if (newSize.y == -1) newSize.y = 26;
SetValidator( validator );
wxControl::SetLabel( label );
if ( style & wxALIGN_RIGHT )
{
// VZ: as I don't know a way to create a right aligned checkbox with
// GTK we will create a checkbox without label and a label at the
// left of it
m_widgetCheckbox = gtk_check_button_new();
m_widgetLabel = gtk_label_new(m_label);
gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5);
m_widget = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(m_widget), m_widgetLabel, FALSE, FALSE, 3);
gtk_box_pack_start(GTK_BOX(m_widget), m_widgetCheckbox, FALSE, FALSE, 3);
// VZ: why do I have to do this to make them appear?
gtk_widget_show( m_widgetLabel );
gtk_widget_show( m_widgetCheckbox );
}
else
{
m_widgetCheckbox = gtk_check_button_new_with_label( m_label );
m_widgetLabel = GTK_BUTTON( m_widgetCheckbox )->child;
m_widget = m_widgetCheckbox;
}
wxSize newSize(size);
if (newSize.x == -1)
{
newSize.x = 25 + gdk_string_measure( m_widgetCheckbox->style->font,
m_label );
}
if (newSize.y == -1)
newSize.y = 26;
SetSize( newSize.x, newSize.y );
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), (gpointer*)this );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_parent->AddChild( this );
@ -84,9 +121,8 @@ bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label
PostCreation();
gtk_widget_realize( GTK_BUTTON( m_widget )->child );
SetLabel( label );
gtk_widget_realize( m_widgetLabel );
gtk_widget_realize( m_widgetCheckbox );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
@ -99,7 +135,7 @@ bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label
void wxCheckBox::SetValue( bool state )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetCheckbox != NULL, "invalid checkbox" );
if ( state == GetValue() )
return;
@ -108,39 +144,38 @@ void wxCheckBox::SetValue( bool state )
// state is changed programmatically
m_blockFirstEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), state );
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
}
bool wxCheckBox::GetValue() const
{
wxCHECK_MSG( m_widget != NULL, FALSE, "invalid checkbox" );
wxCHECK_MSG( m_widgetCheckbox != NULL, FALSE, "invalid checkbox" );
return GTK_TOGGLE_BUTTON(m_widget)->active;
return GTK_TOGGLE_BUTTON(m_widgetCheckbox)->active;
}
void wxCheckBox::SetLabel( const wxString& label )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetLabel != NULL, "invalid checkbox" );
wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL( GTK_BUTTON(m_widget)->child ), GetLabel() );
gtk_label_set( GTK_LABEL(m_widgetLabel), GetLabel() );
}
void wxCheckBox::Enable( bool enable )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetLabel != NULL, "invalid checkbox" );
wxControl::Enable( enable );
gtk_widget_set_sensitive( GTK_BUTTON(m_widget)->child, enable );
gtk_widget_set_sensitive( m_widgetLabel, enable );
}
void wxCheckBox::ApplyWidgetStyle()
{
SetWidgetStyle();
gtk_widget_set_style( m_widget, m_widgetStyle );
gtk_widget_set_style( GTK_BUTTON(m_widget)->child, m_widgetStyle );
gtk_widget_set_style( m_widgetCheckbox, m_widgetStyle );
gtk_widget_set_style( m_widgetLabel, m_widgetStyle );
}

View File

@ -51,32 +51,69 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
IMPLEMENT_DYNAMIC_CLASS(wxCheckBox,wxControl)
wxCheckBox::wxCheckBox(void)
wxCheckBox::wxCheckBox()
{
}
bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label,
const wxPoint &pos, const wxSize &size,
long style, const wxValidator& validator, const wxString &name )
bool wxCheckBox::Create(wxWindow *parent,
wxWindowID id,
const wxString &label,
const wxPoint &pos,
const wxSize &size,
long style,
const wxValidator& validator,
const wxString &name )
{
m_needParent = TRUE;
m_acceptsFocus = TRUE;
PreCreation( parent, id, pos, size, style, name );
SetValidator( validator );
m_widget = gtk_check_button_new_with_label( m_label );
m_blockFirstEvent = FALSE;
wxSize newSize = size;
if (newSize.x == -1) newSize.x = 25+gdk_string_measure( m_widget->style->font, label );
if (newSize.y == -1) newSize.y = 26;
SetValidator( validator );
wxControl::SetLabel( label );
if ( style & wxALIGN_RIGHT )
{
// VZ: as I don't know a way to create a right aligned checkbox with
// GTK we will create a checkbox without label and a label at the
// left of it
m_widgetCheckbox = gtk_check_button_new();
m_widgetLabel = gtk_label_new(m_label);
gtk_misc_set_alignment(GTK_MISC(m_widgetLabel), 0.0, 0.5);
m_widget = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(m_widget), m_widgetLabel, FALSE, FALSE, 3);
gtk_box_pack_start(GTK_BOX(m_widget), m_widgetCheckbox, FALSE, FALSE, 3);
// VZ: why do I have to do this to make them appear?
gtk_widget_show( m_widgetLabel );
gtk_widget_show( m_widgetCheckbox );
}
else
{
m_widgetCheckbox = gtk_check_button_new_with_label( m_label );
m_widgetLabel = GTK_BUTTON( m_widgetCheckbox )->child;
m_widget = m_widgetCheckbox;
}
wxSize newSize(size);
if (newSize.x == -1)
{
newSize.x = 25 + gdk_string_measure( m_widgetCheckbox->style->font,
m_label );
}
if (newSize.y == -1)
newSize.y = 26;
SetSize( newSize.x, newSize.y );
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), (gpointer*)this );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox),
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
m_parent->AddChild( this );
@ -84,9 +121,8 @@ bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label
PostCreation();
gtk_widget_realize( GTK_BUTTON( m_widget )->child );
SetLabel( label );
gtk_widget_realize( m_widgetLabel );
gtk_widget_realize( m_widgetCheckbox );
SetBackgroundColour( parent->GetBackgroundColour() );
SetForegroundColour( parent->GetForegroundColour() );
@ -99,7 +135,7 @@ bool wxCheckBox::Create( wxWindow *parent, wxWindowID id, const wxString &label
void wxCheckBox::SetValue( bool state )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetCheckbox != NULL, "invalid checkbox" );
if ( state == GetValue() )
return;
@ -108,39 +144,38 @@ void wxCheckBox::SetValue( bool state )
// state is changed programmatically
m_blockFirstEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widget), state );
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
}
bool wxCheckBox::GetValue() const
{
wxCHECK_MSG( m_widget != NULL, FALSE, "invalid checkbox" );
wxCHECK_MSG( m_widgetCheckbox != NULL, FALSE, "invalid checkbox" );
return GTK_TOGGLE_BUTTON(m_widget)->active;
return GTK_TOGGLE_BUTTON(m_widgetCheckbox)->active;
}
void wxCheckBox::SetLabel( const wxString& label )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetLabel != NULL, "invalid checkbox" );
wxControl::SetLabel( label );
gtk_label_set( GTK_LABEL( GTK_BUTTON(m_widget)->child ), GetLabel() );
gtk_label_set( GTK_LABEL(m_widgetLabel), GetLabel() );
}
void wxCheckBox::Enable( bool enable )
{
wxCHECK_RET( m_widget != NULL, "invalid checkbox" );
wxCHECK_RET( m_widgetLabel != NULL, "invalid checkbox" );
wxControl::Enable( enable );
gtk_widget_set_sensitive( GTK_BUTTON(m_widget)->child, enable );
gtk_widget_set_sensitive( m_widgetLabel, enable );
}
void wxCheckBox::ApplyWidgetStyle()
{
SetWidgetStyle();
gtk_widget_set_style( m_widget, m_widgetStyle );
gtk_widget_set_style( GTK_BUTTON(m_widget)->child, m_widgetStyle );
gtk_widget_set_style( m_widgetCheckbox, m_widgetStyle );
gtk_widget_set_style( m_widgetLabel, m_widgetStyle );
}