1.12.42
[gnumeric.git] / src / widgets / gnm-cell-renderer-expr-entry.c
bloba6daab073de52405ac00cbcfcaa60e05699fa9e9
1 /* gnm-cell-renderer-expr-entry.c
2 * Copyright (C) 2002 Andreas J. Guelzow <aguelzow@taliesin.ca>
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 2 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 <https://www.gnu.org/licenses/>.
18 #include <gnumeric-config.h>
19 #include <widgets/gnm-cell-renderer-expr-entry.h>
20 #include <widgets/gnm-expr-entry.h>
21 #include <wbc-gtk.h>
22 #include <dead-kittens.h>
24 #define GNUMERIC_CELL_RENDERER_EXPR_ENTRY_PATH "gnumeric-cell-renderer-expr-entry-path"
26 static void gnumeric_cell_renderer_expr_entry_class_init
27 (GnmCellRendererExprEntryClass *cell_expr_entry_class) ;
29 static GnmCellRendererTextClass *parent_class = NULL;
31 static GtkCellEditable *gnumeric_cell_renderer_expr_entry_start_editing
32 (GtkCellRenderer *cell,
33 GdkEvent *event,
34 GtkWidget *widget,
35 const gchar *path,
36 GdkRectangle const *background_area,
37 GdkRectangle const *cell_area,
38 GtkCellRendererState flags);
40 GType
41 gnm_cell_renderer_expr_entry_get_type (void)
43 static GType cell_expr_entry_type = 0;
45 if (!cell_expr_entry_type)
47 static const GTypeInfo cell_expr_entry_info =
49 sizeof (GnmCellRendererExprEntryClass),
50 NULL, /* base_init */
51 NULL, /* base_finalize */
52 (GClassInitFunc)gnumeric_cell_renderer_expr_entry_class_init,
53 NULL, /* class_finalize */
54 NULL, /* class_data */
55 sizeof (GnmCellRendererExprEntry),
56 0, /* n_preallocs */
57 (GInstanceInitFunc) NULL,
60 cell_expr_entry_type = g_type_register_static (GNM_CELL_RENDERER_TEXT_TYPE,
61 "GnmCellRendererExprEntry",
62 &cell_expr_entry_info, 0);
65 return cell_expr_entry_type;
69 static void
70 gnumeric_cell_renderer_expr_entry_class_init (GnmCellRendererExprEntryClass *class)
72 GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class);
73 GObjectClass *object_class = G_OBJECT_CLASS (class);
75 parent_class = g_type_class_peek_parent (object_class);
77 cell_class->start_editing = gnumeric_cell_renderer_expr_entry_start_editing;
81 GtkCellRenderer *
82 gnm_cell_renderer_expr_entry_new (WBCGtk *wbcg)
84 GnmCellRendererExprEntry *this =
85 GNM_CELL_RENDERER_EXPR_ENTRY(g_object_new
86 (GNM_CELL_RENDERER_EXPR_ENTRY_TYPE, NULL));
87 this->wbcg = wbcg;
88 return GTK_CELL_RENDERER (this);
91 void
92 gnm_cell_renderer_expr_entry_editing_done (GtkCellEditable *entry,
93 GnmCellRendererExprEntry *celltext)
95 const gchar *path;
96 const gchar *new_text;
98 celltext->entry = NULL;
99 if (gnm_expr_entry_editing_canceled (GNM_EXPR_ENTRY (entry)))
100 return;
102 wbcg_set_entry (celltext->wbcg, NULL);
103 path = g_object_get_data (G_OBJECT (entry), GNUMERIC_CELL_RENDERER_EXPR_ENTRY_PATH);
104 new_text = gnm_expr_entry_get_text (GNM_EXPR_ENTRY (entry));
106 g_signal_emit_by_name (G_OBJECT (celltext), "edited", path, new_text);
109 static GtkCellEditable *
110 gnumeric_cell_renderer_expr_entry_start_editing (GtkCellRenderer *cell,
111 G_GNUC_UNUSED GdkEvent *event,
112 G_GNUC_UNUSED GtkWidget *widget,
113 const gchar *path,
114 G_GNUC_UNUSED GdkRectangle const *background_area,
115 G_GNUC_UNUSED GdkRectangle const *cell_area,
116 G_GNUC_UNUSED GtkCellRendererState flags)
118 GnmCellRendererExprEntry *celltext;
119 GtkEntry *entry;
120 GnmExprEntry *gentry;
121 char *text;
123 celltext = GNM_CELL_RENDERER_EXPR_ENTRY (cell);
125 /* If the cell isn't editable we return NULL. */
126 if (gtk_cell_renderer_text_get_editable (celltext) == FALSE)
127 return NULL;
129 gentry = gnm_expr_entry_new (celltext->wbcg, FALSE);
130 celltext->entry = gentry;
131 entry = gnm_expr_entry_get_entry (gentry);
133 g_object_get (celltext, "text", &text, NULL);
134 gtk_entry_set_text (entry, text);
135 g_free (text);
137 g_object_set_data_full (G_OBJECT (gentry), GNUMERIC_CELL_RENDERER_EXPR_ENTRY_PATH, g_strdup (path), g_free);
139 gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
141 gtk_widget_show_all (GTK_WIDGET (gentry));
142 g_signal_connect (gentry,
143 "editing_done",
144 G_CALLBACK (gnm_cell_renderer_expr_entry_editing_done),
145 celltext);
147 wbcg_set_entry (celltext->wbcg, gentry);
149 return GTK_CELL_EDITABLE (gentry);