3
* This file is part of gedit
5
* Copyright (C) 2005 - Paolo Maggi
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330,
20
* Boston, MA 02111-1307, USA.
24
* Modified by the gedit Team, 2005. See the AUTHORS file for a
25
* list of people on the gedit Team.
26
* See the ChangeLog files for a list of changes.
28
* $Id: gedit-message-area.c 5887 2007-09-07 07:20:19Z pborelli $
31
/* TODO: Style properties */
34
#include <glib/gi18n.h>
37
#include <gdk/gdkkeysyms.h>
39
#include "gedit-message-area.h"
41
#define GEDIT_MESSAGE_AREA_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
42
GEDIT_TYPE_MESSAGE_AREA, \
43
GeditMessageAreaPrivate))
45
struct _GeditMessageAreaPrivate
50
GtkWidget *action_area;
52
gboolean changing_style;
55
typedef struct _ResponseData ResponseData;
68
static guint signals[LAST_SIGNAL];
70
G_DEFINE_TYPE(GeditMessageArea, gedit_message_area, GTK_TYPE_HBOX)
74
gedit_message_area_finalize (GObject *object)
77
GeditMessageArea *message_area = GEDIT_MESSAGE_AREA (object);
80
G_OBJECT_CLASS (gedit_message_area_parent_class)->finalize (object);
84
get_response_data (GtkWidget *widget,
87
ResponseData *ad = g_object_get_data (G_OBJECT (widget),
88
"gedit-message-area-response-data");
90
if (ad == NULL && create)
92
ad = g_new (ResponseData, 1);
94
g_object_set_data_full (G_OBJECT (widget),
95
"gedit-message-area-response-data",
104
find_button (GeditMessageArea *message_area,
107
GList *children, *tmp_list;
108
GtkWidget *child = NULL;
110
children = gtk_container_get_children (
111
GTK_CONTAINER (message_area->priv->action_area));
113
for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
115
ResponseData *rd = get_response_data (tmp_list->data, FALSE);
117
if (rd && rd->response_id == response_id)
119
child = tmp_list->data;
124
g_list_free (children);
130
gedit_message_area_close (GeditMessageArea *message_area)
132
if (!find_button (message_area, GTK_RESPONSE_CANCEL))
135
/* emit response signal */
136
gedit_message_area_response (GEDIT_MESSAGE_AREA (message_area),
137
GTK_RESPONSE_CANCEL);
141
paint_message_area (GtkWidget *widget,
142
GdkEventExpose *event,
145
gtk_paint_flat_box (widget->style,
152
widget->allocation.x + 1,
153
widget->allocation.y + 1,
154
widget->allocation.width - 2,
155
widget->allocation.height - 2);
161
gedit_message_area_class_init (GeditMessageAreaClass *klass)
163
GObjectClass *object_class;
164
GtkBindingSet *binding_set;
166
object_class = G_OBJECT_CLASS (klass);
167
object_class->finalize = gedit_message_area_finalize;
169
klass->close = gedit_message_area_close;
171
g_type_class_add_private (object_class, sizeof(GeditMessageAreaPrivate));
173
signals[RESPONSE] = g_signal_new ("response",
174
G_OBJECT_CLASS_TYPE (klass),
176
G_STRUCT_OFFSET (GeditMessageAreaClass, response),
178
g_cclosure_marshal_VOID__INT,
182
signals[CLOSE] = g_signal_new ("close",
183
G_OBJECT_CLASS_TYPE (klass),
184
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
185
G_STRUCT_OFFSET (GeditMessageAreaClass, close),
187
g_cclosure_marshal_VOID__VOID,
190
binding_set = gtk_binding_set_by_class (klass);
192
gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0);
196
style_set (GtkWidget *widget,
197
GtkStyle *prev_style,
198
GeditMessageArea *message_area)
203
if (message_area->priv->changing_style)
206
/* This is a hack needed to use the tooltip background color */
207
window = gtk_window_new (GTK_WINDOW_POPUP);
208
gtk_widget_set_name (window, "gtk-tooltip");
209
gtk_widget_ensure_style (window);
210
style = gtk_widget_get_style (window);
212
message_area->priv->changing_style = TRUE;
213
gtk_widget_set_style (GTK_WIDGET (message_area), style);
214
message_area->priv->changing_style = FALSE;
216
gtk_widget_destroy (window);
218
gtk_widget_queue_draw (GTK_WIDGET (message_area));
222
gedit_message_area_init (GeditMessageArea *message_area)
224
message_area->priv = GEDIT_MESSAGE_AREA_GET_PRIVATE (message_area);
226
message_area->priv->main_hbox = gtk_hbox_new (FALSE, 16); /* FIXME: use style properties */
227
gtk_widget_show (message_area->priv->main_hbox);
228
gtk_container_set_border_width (GTK_CONTAINER (message_area->priv->main_hbox),
229
8); /* FIXME: use style properties */
231
message_area->priv->action_area = gtk_vbox_new (TRUE, 10); /* FIXME: use style properties */
232
gtk_widget_show (message_area->priv->action_area);
233
gtk_box_pack_end (GTK_BOX (message_area->priv->main_hbox),
234
message_area->priv->action_area,
239
gtk_box_pack_start (GTK_BOX (message_area),
240
message_area->priv->main_hbox,
245
gtk_widget_set_app_paintable (GTK_WIDGET (message_area), TRUE);
247
g_signal_connect (message_area,
249
G_CALLBACK (paint_message_area),
252
/* Note that we connect to style-set on one of the internal
253
* widgets, not on the message area itself, since gtk does
254
* not deliver any further style-set signals for a widget on
255
* which the style has been forced with gtk_widget_set_style() */
256
g_signal_connect (message_area->priv->main_hbox,
258
G_CALLBACK (style_set),
263
get_response_for_widget (GeditMessageArea *message_area,
268
rd = get_response_data (widget, FALSE);
270
return GTK_RESPONSE_NONE;
272
return rd->response_id;
276
action_widget_activated (GtkWidget *widget, GeditMessageArea *message_area)
280
response_id = get_response_for_widget (message_area, widget);
282
gedit_message_area_response (message_area, response_id);
286
gedit_message_area_add_action_widget (GeditMessageArea *message_area,
293
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
294
g_return_if_fail (GTK_IS_WIDGET (child));
296
ad = get_response_data (child, TRUE);
298
ad->response_id = response_id;
300
if (GTK_IS_BUTTON (child))
301
signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);
303
signal_id = GTK_WIDGET_GET_CLASS (child)->activate_signal;
309
closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated),
310
G_OBJECT (message_area));
312
g_signal_connect_closure_by_id (child,
319
g_warning ("Only 'activatable' widgets can be packed into the action area of a GeditMessageArea");
321
if (response_id != GTK_RESPONSE_HELP)
322
gtk_box_pack_start (GTK_BOX (message_area->priv->action_area),
328
gtk_box_pack_end (GTK_BOX (message_area->priv->action_area),
336
gedit_message_area_set_contents (GeditMessageArea *message_area,
339
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
340
g_return_if_fail (GTK_IS_WIDGET (contents));
342
message_area->priv->contents = contents;
343
gtk_box_pack_start (GTK_BOX (message_area->priv->main_hbox),
344
message_area->priv->contents,
351
gedit_message_area_add_button (GeditMessageArea *message_area,
352
const gchar *button_text,
357
g_return_val_if_fail (GEDIT_IS_MESSAGE_AREA (message_area), NULL);
358
g_return_val_if_fail (button_text != NULL, NULL);
360
button = gtk_button_new_from_stock (button_text);
362
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
364
gtk_widget_show (button);
366
gedit_message_area_add_action_widget (message_area,
374
add_buttons_valist (GeditMessageArea *message_area,
375
const gchar *first_button_text,
381
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
383
if (first_button_text == NULL)
386
text = first_button_text;
387
response_id = va_arg (args, gint);
391
gedit_message_area_add_button (message_area,
395
text = va_arg (args, gchar*);
399
response_id = va_arg (args, int);
404
gedit_message_area_add_buttons (GeditMessageArea *message_area,
405
const gchar *first_button_text,
410
va_start (args, first_button_text);
412
add_buttons_valist (message_area,
420
gedit_message_area_new (void)
422
return g_object_new (GEDIT_TYPE_MESSAGE_AREA, NULL);
426
gedit_message_area_new_with_buttons (const gchar *first_button_text,
429
GeditMessageArea *message_area;
432
message_area = GEDIT_MESSAGE_AREA (gedit_message_area_new ());
434
va_start (args, first_button_text);
436
add_buttons_valist (message_area,
442
return GTK_WIDGET (message_area);
446
gedit_message_area_set_response_sensitive (GeditMessageArea *message_area,
453
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
455
children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
458
while (tmp_list != NULL)
460
GtkWidget *widget = tmp_list->data;
461
ResponseData *rd = get_response_data (widget, FALSE);
463
if (rd && rd->response_id == response_id)
464
gtk_widget_set_sensitive (widget, setting);
466
tmp_list = g_list_next (tmp_list);
469
g_list_free (children);
473
gedit_message_area_set_default_response (GeditMessageArea *message_area,
479
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
481
children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
484
while (tmp_list != NULL)
486
GtkWidget *widget = tmp_list->data;
487
ResponseData *rd = get_response_data (widget, FALSE);
489
if (rd && rd->response_id == response_id)
490
gtk_widget_grab_default (widget);
492
tmp_list = g_list_next (tmp_list);
495
g_list_free (children);
499
gedit_message_area_response (GeditMessageArea *message_area,
502
g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
504
g_signal_emit (message_area,
511
gedit_message_area_add_stock_button_with_text (GeditMessageArea *message_area,
513
const gchar *stock_id,
518
g_return_val_if_fail (GEDIT_IS_MESSAGE_AREA (message_area), NULL);
519
g_return_val_if_fail (text != NULL, NULL);
520
g_return_val_if_fail (stock_id != NULL, NULL);
522
button = gtk_button_new_with_mnemonic (text);
523
gtk_button_set_image (GTK_BUTTON (button),
524
gtk_image_new_from_stock (stock_id,
525
GTK_ICON_SIZE_BUTTON));
527
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
529
gtk_widget_show (button);
531
gedit_message_area_add_action_widget (message_area,