Index: views/controls/button/native_button_gtk.cc |
=================================================================== |
--- views/controls/button/native_button_gtk.cc (revision 25662) |
+++ views/controls/button/native_button_gtk.cc (working copy) |
@@ -57,7 +57,9 @@ |
void NativeButtonGtk::UpdateDefault() { |
if (!native_view()) |
return; |
- if (!IsCheckbox()) |
+ if (IsCheckbox()) |
+ UpdateChecked(); |
+ else |
NOTIMPLEMENTED(); |
} |
@@ -115,16 +117,55 @@ |
native_button_->ButtonPressed(); |
} |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeCheckboxGtk |
NativeCheckboxGtk::NativeCheckboxGtk(Checkbox* checkbox) |
- : NativeButtonGtk(checkbox) { |
+ : NativeButtonGtk(checkbox), |
+ checkbox_(checkbox), |
+ deliver_click_event_(true) { |
} |
void NativeCheckboxGtk::CreateNativeControl() { |
GtkWidget* widget = gtk_check_button_new(); |
+ g_signal_connect(G_OBJECT(widget), "clicked", |
+ G_CALLBACK(CallClicked), this); |
NativeControlCreated(widget); |
} |
+void NativeCheckboxGtk::OnClicked() { |
+ // ignore event if the event is generated by |
+ // gtk_toggle_button_set_active below. |
+ if (deliver_click_event_) { |
+ checkbox_->SetChecked(!checkbox_->checked()); |
+ NativeButtonGtk::OnClicked(); |
+ } |
+} |
+ |
+void NativeCheckboxGtk::UpdateChecked() { |
+ if (!native_view()) |
+ return; |
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(native_view())) |
+ != checkbox_->checked()) { |
+ // gtk_toggle_button_set_active emites "clicked" signal, which |
+ // invokes OnClicked method above. deliver_click_event_ flag is used |
+ // to prevent such signal to invoke OnClicked callback. |
+ deliver_click_event_ = false; |
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(native_view()), |
+ checkbox_->checked()); |
+ deliver_click_event_ = true; |
+ } |
+} |
+ |
// static |
+void NativeCheckboxGtk::CallClicked(GtkButton* widget, |
+ NativeCheckboxGtk* button) { |
+ button->OnClicked(); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// NativeButtonWrapper |
+ |
+// static |
int NativeButtonWrapper::GetFixedWidth() { |
// TODO(brettw) implement this properly. |
return 10; |