1 /*
2  *      gtkcellrendererfile.c
3  *
4  *      Copyright 2012 Alexander Petukhov <devel(at)apetukhov.ru>
5  *
6  *      This program is free software; you can redistribute it and/or modify
7  *      it under the terms of the GNU General Public License as published by
8  *      the Free Software Foundation; either version 2 of the License, or
9  *      (at your option) any later version.
10  *
11  *      This program is distributed in the hope that it will be useful,
12  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *      GNU General Public License for more details.
15  *
16  *      You should have received a copy of the GNU General Public License
17  *      along with this program; if not, write to the Free Software
18  *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  *      MA 02110-1301, USA.
20  */
21 
22 /*
23  * 		cell renderer that inherits from toggle
24  * 		the only difference - checks for a x position in "activate" signal
25  * 		to ensure the "toggled" signal is sent only when clicked on a particulary cell renderer
26  */
27 
28 #include <geanyplugin.h>
29 
30 #include "cellrenderertoggle.h"
31 
32 struct _CellRendererToggle
33 {
34   GtkCellRendererToggle parent;
35 };
36 
37 struct _CellRendererToggleClass
38 {
39   GtkCellRendererToggleClass parent_class;
40 };
41 
42 /*
43  * handles an activation and sends a toggle signal is its cell renderer has been clicked
44  */
45 #if GTK_CHECK_VERSION(3, 0, 0)
cell_renderer_toggle_activate(GtkCellRenderer * cell,GdkEvent * event,GtkWidget * widget,const gchar * path,const GdkRectangle * background_area,const GdkRectangle * cell_area,GtkCellRendererState flags)46 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
47 	const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState  flags)
48 #else
49 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
50 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
51 #endif
52 {
53 	if (!event ||
54 		(
55 			event->button.x >= cell_area->x &&
56 			event->button.x < (cell_area->x + cell_area->width)
57 		)
58 	)
59 	{
60 		g_signal_emit_by_name(cell, "toggled", path);
61 	}
62 	return TRUE;
63 }
64 
65 /*
66  * instance init
67  */
cell_renderer_toggle_init(CellRendererToggle * cell)68 static void cell_renderer_toggle_init (CellRendererToggle *cell)
69 {
70 	GtkCellRenderer *cell_renderer = (GtkCellRenderer*)cell;
71 	g_object_set(cell_renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
72 }
73 
74 /*
75  * class init
76  */
cell_renderer_toggle_class_init(GtkCellRendererToggleClass * class)77 static void cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class)
78 {
79 	GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS(class);
80 	cell_class->activate = cell_renderer_toggle_activate;
81 }
82 
83 /*
84  * registers a type
85  */
cell_renderer_toggle_get_type(void)86 GType cell_renderer_toggle_get_type(void)
87 {
88 	static GType cell_break_toggle_type = 0;
89 
90 	if(0 == cell_break_toggle_type && !(cell_break_toggle_type = g_type_from_name("CellRendererToggle")))
91 	{
92 		static const GTypeInfo cell_file_info =
93 		{
94 			sizeof (CellRendererToggleClass),
95 			NULL,                                                     /* base_init */
96 			NULL,                                                     /* base_finalize */
97 			(GClassInitFunc) cell_renderer_toggle_class_init,
98 			NULL,                                                     /* class_finalize */
99 			NULL,                                                     /* class_data */
100 			sizeof (CellRendererToggle),
101 			0,                                                        /* n_preallocs */
102 			(GInstanceInitFunc) cell_renderer_toggle_init,
103 		};
104 
105 		/* Derive from GtkToggleCellRenderer */
106 		cell_break_toggle_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TOGGLE,
107 			"CellRendererToggle",
108 			&cell_file_info,
109 			0);
110 	}
111 
112 	return cell_break_toggle_type;
113 }
114 
115 /*
116  * creates new renderer
117  */
cell_renderer_toggle_new(void)118 GtkCellRenderer* cell_renderer_toggle_new(void)
119 {
120   return g_object_new(TYPE_CELL_RENDERER_TOGGLE, NULL);
121 }
122