1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2011, 2012 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "ui/gui/psppire-button-editable.h"
22 #define _(msgid) gettext (msgid)
23 #define N_(msgid) msgid
25 /* GtkCellEditable interface. */
26 static void gtk_cell_editable_interface_init (GtkCellEditableIface *iface);
27 static void button_editable_editing_done (GtkCellEditable *cell_editable);
28 static void button_editable_remove_widget (GtkCellEditable *cell_editable);
29 static void button_editable_start_editing (GtkCellEditable *cell_editable,
32 G_DEFINE_TYPE_EXTENDED (PsppireButtonEditable,
33 psppire_button_editable,
36 G_IMPLEMENT_INTERFACE (
37 GTK_TYPE_CELL_EDITABLE,
38 gtk_cell_editable_interface_init));
49 psppire_button_editable_set_property (GObject *object,
54 PsppireButtonEditable *obj = PSPPIRE_BUTTON_EDITABLE (object);
60 obj->path = g_value_dup_string (value);
64 psppire_button_editable_set_slash (obj, g_value_get_boolean (value));
67 case PROP_EDITING_CANCELED:
71 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
77 psppire_button_editable_get_property (GObject *object,
82 PsppireButtonEditable *obj = PSPPIRE_BUTTON_EDITABLE (object);
87 g_value_set_string (value, obj->path);
91 g_value_set_boolean (value, psppire_button_editable_get_slash (obj));
94 case PROP_EDITING_CANCELED:
95 g_value_set_boolean (value, FALSE);
99 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
105 psppire_button_editable_finalize (GObject *gobject)
107 PsppireButtonEditable *obj = PSPPIRE_BUTTON_EDITABLE (gobject);
111 G_OBJECT_CLASS (psppire_button_editable_parent_class)->finalize (gobject);
115 psppire_button_editable_button_release (GtkWidget *widget,
116 GdkEventButton *event)
120 if (event->button == 1)
122 button = GTK_BUTTON (widget);
123 gtk_button_released (button);
130 psppire_button_editable_expose_event (GtkWidget *widget,
131 GdkEventExpose *event)
133 GtkWidgetClass *widget_class;
134 GtkStyle *style = gtk_widget_get_style (widget);
135 GtkAllocation allocation;
138 widget_class = GTK_WIDGET_CLASS (psppire_button_editable_parent_class);
139 retval = widget_class->expose_event (widget, event);
141 gtk_widget_get_allocation (widget, &allocation);
142 if (PSPPIRE_BUTTON_EDITABLE (widget)->slash)
143 gdk_draw_line (gtk_widget_get_window (widget), style->black_gc,
145 allocation.y + allocation.height,
146 allocation.x + allocation.width,
152 psppire_button_editable_class_init (PsppireButtonEditableClass *class)
154 GObjectClass *gobject_class;
155 GtkWidgetClass *widget_class;
157 gobject_class = G_OBJECT_CLASS (class);
158 widget_class = GTK_WIDGET_CLASS (class);
160 gobject_class->set_property = psppire_button_editable_set_property;
161 gobject_class->get_property = psppire_button_editable_get_property;
162 gobject_class->finalize = psppire_button_editable_finalize;
164 widget_class->button_release_event = psppire_button_editable_button_release;
165 widget_class->expose_event = psppire_button_editable_expose_event;
167 g_object_class_install_property (gobject_class,
169 g_param_spec_string ("path",
171 _("The path to the row in the GtkTreeView, as a string"),
175 g_object_class_install_property (gobject_class,
177 g_param_spec_boolean ("slash",
179 _("Whether to draw a diagonal slash across the button."),
183 g_object_class_override_property (gobject_class,
184 PROP_EDITING_CANCELED,
189 psppire_button_editable_init (PsppireButtonEditable *obj)
191 obj->path = g_strdup ("");
195 PsppireButtonEditable *
196 psppire_button_editable_new (void)
198 return PSPPIRE_BUTTON_EDITABLE (g_object_new (PSPPIRE_TYPE_BUTTON_EDITABLE, NULL));
202 psppire_button_editable_set_slash (PsppireButtonEditable *button,
205 g_return_if_fail (button != NULL);
206 if ((button->slash != 0) != (slash != 0))
208 button->slash = slash;
209 gtk_widget_queue_draw (GTK_WIDGET (button));
214 psppire_button_editable_get_slash (const PsppireButtonEditable *button)
216 g_return_val_if_fail (button != NULL, FALSE);
217 return button->slash;
220 /* GtkCellEditable interface. */
223 gtk_cell_editable_interface_init (GtkCellEditableIface *iface)
225 g_return_if_fail (iface != NULL);
227 iface->editing_done = button_editable_editing_done;
228 iface->remove_widget = button_editable_remove_widget;
229 iface->start_editing = button_editable_start_editing;
233 button_editable_editing_done (GtkCellEditable *cell_editable)
240 button_editable_remove_widget (GtkCellEditable *cell_editable)
247 button_editable_start_editing (GtkCellEditable *cell_editable,