~ubuntu-branches/debian/sid/cheese/sid

« back to all changes in this revision

Viewing changes to src/gedit-message-area.c

  • Committer: Bazaar Package Importer
  • Author(s): Andrea Veri, Andrea Veri, Loïc Minier
  • Date: 2009-09-23 20:25:41 UTC
  • mfrom: (1.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20090923202541-q9lr8b7ykic314xy
Tags: 2.28.0.1-1
[ Andrea Veri ]
* New upstream release.
* debian/control:
  - Bumped Standards-version to 3.8.3. No changes needed.
  - libgtk2.0-dev bumped to >= 2.17.4 as per configure.ac
    requirements.
  - libgnome-desktop-dev bumped to >= 2.26.0 as per configure.ac
    requirements.
  - added a B-D on x11proto-core-dev needed from multimedia keys
    to work properly.
* debian/copyright:
  - added missing copyright holders.
* debian/patches:
  - removed as long as it has no patches in it.
* debian/rules:
  - simple-patchsys include removed, there are no patches to be
    applied.

[ Loïc Minier ]
* Bdep on rarian-compat instead of scrollkeeper.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * gedit-message-area.c
3
 
 * This file is part of gedit
4
 
 *
5
 
 * Copyright (C) 2005 - Paolo Maggi
6
 
 *
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.
11
 
 *
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.
16
 
 *
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.
21
 
 */
22
 
 
23
 
/*
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.
27
 
 *
28
 
 * $Id: gedit-message-area.c 5887 2007-09-07 07:20:19Z pborelli $
29
 
 */
30
 
 
31
 
/* TODO: Style properties */
32
 
 
33
 
 
34
 
#include <glib/gi18n.h>
35
 
#include <gtk/gtk.h>
36
 
#include <gdk/gdk.h>
37
 
#include <gdk/gdkkeysyms.h>
38
 
 
39
 
#include "gedit-message-area.h"
40
 
 
41
 
#define GEDIT_MESSAGE_AREA_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
42
 
                                                                            GEDIT_TYPE_MESSAGE_AREA, \
43
 
                                                                            GeditMessageAreaPrivate))
44
 
 
45
 
struct _GeditMessageAreaPrivate
46
 
{
47
 
  GtkWidget *main_hbox;
48
 
 
49
 
  GtkWidget *contents;
50
 
  GtkWidget *action_area;
51
 
 
52
 
  gboolean changing_style;
53
 
};
54
 
 
55
 
typedef struct _ResponseData ResponseData;
56
 
 
57
 
struct _ResponseData
58
 
{
59
 
  gint response_id;
60
 
};
61
 
 
62
 
enum {
63
 
  RESPONSE,
64
 
  CLOSE,
65
 
  LAST_SIGNAL
66
 
};
67
 
 
68
 
static guint signals[LAST_SIGNAL];
69
 
 
70
 
G_DEFINE_TYPE(GeditMessageArea, gedit_message_area, GTK_TYPE_HBOX)
71
 
 
72
 
 
73
 
static void
74
 
gedit_message_area_finalize (GObject *object)
75
 
{
76
 
  /*
77
 
     GeditMessageArea *message_area = GEDIT_MESSAGE_AREA (object);
78
 
     */
79
 
 
80
 
  G_OBJECT_CLASS (gedit_message_area_parent_class)->finalize (object);
81
 
}
82
 
 
83
 
static ResponseData *
84
 
get_response_data (GtkWidget *widget,
85
 
                   gboolean   create)
86
 
{
87
 
  ResponseData *ad = g_object_get_data (G_OBJECT (widget),
88
 
                                        "gedit-message-area-response-data");
89
 
 
90
 
  if (ad == NULL && create)
91
 
  {
92
 
    ad = g_new (ResponseData, 1);
93
 
 
94
 
    g_object_set_data_full (G_OBJECT (widget),
95
 
                            "gedit-message-area-response-data",
96
 
                            ad,
97
 
                            g_free);
98
 
  }
99
 
 
100
 
  return ad;
101
 
}
102
 
 
103
 
static GtkWidget *
104
 
find_button (GeditMessageArea *message_area,
105
 
             gint              response_id)
106
 
{
107
 
  GList *children, *tmp_list;
108
 
  GtkWidget *child = NULL;
109
 
 
110
 
  children = gtk_container_get_children (
111
 
                                         GTK_CONTAINER (message_area->priv->action_area));
112
 
 
113
 
  for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
114
 
  {
115
 
    ResponseData *rd = get_response_data (tmp_list->data, FALSE);
116
 
 
117
 
    if (rd && rd->response_id == response_id)
118
 
    {
119
 
      child = tmp_list->data;
120
 
      break;
121
 
    }
122
 
  }
123
 
 
124
 
  g_list_free (children);
125
 
 
126
 
  return child;
127
 
}
128
 
 
129
 
static void
130
 
gedit_message_area_close (GeditMessageArea *message_area)
131
 
{
132
 
  if (!find_button (message_area, GTK_RESPONSE_CANCEL))
133
 
    return;
134
 
 
135
 
  /* emit response signal */
136
 
  gedit_message_area_response (GEDIT_MESSAGE_AREA (message_area),
137
 
                               GTK_RESPONSE_CANCEL);
138
 
}
139
 
 
140
 
static gboolean
141
 
paint_message_area (GtkWidget      *widget,
142
 
                    GdkEventExpose *event,
143
 
                    gpointer        user_data)
144
 
{
145
 
  gtk_paint_flat_box (widget->style,
146
 
                      widget->window,
147
 
                      GTK_STATE_NORMAL,
148
 
                      GTK_SHADOW_OUT,
149
 
                      NULL,
150
 
                      widget,
151
 
                      "tooltip",
152
 
                      widget->allocation.x + 1,
153
 
                      widget->allocation.y + 1,
154
 
                      widget->allocation.width - 2,
155
 
                      widget->allocation.height - 2);
156
 
 
157
 
  return FALSE;
158
 
}
159
 
 
160
 
static void
161
 
gedit_message_area_class_init (GeditMessageAreaClass *klass)
162
 
{
163
 
  GObjectClass *object_class;
164
 
  GtkBindingSet *binding_set;
165
 
 
166
 
  object_class = G_OBJECT_CLASS (klass);
167
 
  object_class->finalize = gedit_message_area_finalize;
168
 
 
169
 
  klass->close = gedit_message_area_close;
170
 
 
171
 
  g_type_class_add_private (object_class, sizeof(GeditMessageAreaPrivate));
172
 
 
173
 
  signals[RESPONSE] = g_signal_new ("response",
174
 
                                    G_OBJECT_CLASS_TYPE (klass),
175
 
                                    G_SIGNAL_RUN_LAST,
176
 
                                    G_STRUCT_OFFSET (GeditMessageAreaClass, response),
177
 
                                    NULL, NULL,
178
 
                                    g_cclosure_marshal_VOID__INT,
179
 
                                    G_TYPE_NONE, 1,
180
 
                                    G_TYPE_INT);
181
 
 
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),
186
 
                                  NULL, NULL,
187
 
                                  g_cclosure_marshal_VOID__VOID,
188
 
                                  G_TYPE_NONE, 0);
189
 
 
190
 
  binding_set = gtk_binding_set_by_class (klass);
191
 
 
192
 
  gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0);
193
 
}
194
 
 
195
 
static void
196
 
style_set (GtkWidget        *widget,
197
 
           GtkStyle         *prev_style,
198
 
           GeditMessageArea *message_area)
199
 
{
200
 
  GtkWidget *window;
201
 
  GtkStyle *style;
202
 
 
203
 
  if (message_area->priv->changing_style)
204
 
    return;
205
 
 
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);
211
 
 
212
 
  message_area->priv->changing_style = TRUE;
213
 
  gtk_widget_set_style (GTK_WIDGET (message_area), style);
214
 
  message_area->priv->changing_style = FALSE;
215
 
 
216
 
  gtk_widget_destroy (window);
217
 
 
218
 
  gtk_widget_queue_draw (GTK_WIDGET (message_area));
219
 
}
220
 
 
221
 
static void
222
 
gedit_message_area_init (GeditMessageArea *message_area)
223
 
{
224
 
  message_area->priv = GEDIT_MESSAGE_AREA_GET_PRIVATE (message_area);
225
 
 
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 */
230
 
 
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,
235
 
                    FALSE,
236
 
                    TRUE,
237
 
                    0);
238
 
 
239
 
  gtk_box_pack_start (GTK_BOX (message_area),
240
 
                      message_area->priv->main_hbox,
241
 
                      TRUE,
242
 
                      TRUE,
243
 
                      0);
244
 
 
245
 
  gtk_widget_set_app_paintable (GTK_WIDGET (message_area), TRUE);
246
 
 
247
 
  g_signal_connect (message_area,
248
 
                    "expose-event",
249
 
                    G_CALLBACK (paint_message_area),
250
 
                    NULL);
251
 
 
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,
257
 
                    "style-set",
258
 
                    G_CALLBACK (style_set),
259
 
                    message_area);
260
 
}
261
 
 
262
 
static gint
263
 
get_response_for_widget (GeditMessageArea *message_area,
264
 
                         GtkWidget        *widget)
265
 
{
266
 
  ResponseData *rd;
267
 
 
268
 
  rd = get_response_data (widget, FALSE);
269
 
  if (!rd)
270
 
    return GTK_RESPONSE_NONE;
271
 
  else
272
 
    return rd->response_id;
273
 
}
274
 
 
275
 
static void
276
 
action_widget_activated (GtkWidget *widget, GeditMessageArea *message_area)
277
 
{
278
 
  gint response_id;
279
 
 
280
 
  response_id = get_response_for_widget (message_area, widget);
281
 
 
282
 
  gedit_message_area_response (message_area, response_id);
283
 
}
284
 
 
285
 
void
286
 
gedit_message_area_add_action_widget (GeditMessageArea *message_area,
287
 
                                      GtkWidget        *child,
288
 
                                      gint              response_id)
289
 
{
290
 
  ResponseData *ad;
291
 
  guint signal_id;
292
 
 
293
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
294
 
  g_return_if_fail (GTK_IS_WIDGET (child));
295
 
 
296
 
  ad = get_response_data (child, TRUE);
297
 
 
298
 
  ad->response_id = response_id;
299
 
 
300
 
  if (GTK_IS_BUTTON (child))
301
 
    signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);
302
 
  else
303
 
    signal_id = GTK_WIDGET_GET_CLASS (child)->activate_signal;
304
 
 
305
 
  if (signal_id)
306
 
  {
307
 
    GClosure *closure;
308
 
 
309
 
    closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated),
310
 
                                     G_OBJECT (message_area));
311
 
 
312
 
    g_signal_connect_closure_by_id (child,
313
 
                                    signal_id,
314
 
                                    0,
315
 
                                    closure,
316
 
                                    FALSE);
317
 
  }
318
 
  else
319
 
    g_warning ("Only 'activatable' widgets can be packed into the action area of a GeditMessageArea");
320
 
 
321
 
  if (response_id != GTK_RESPONSE_HELP)
322
 
    gtk_box_pack_start (GTK_BOX (message_area->priv->action_area),
323
 
                        child,
324
 
                        FALSE,
325
 
                        FALSE,
326
 
                        0);
327
 
  else
328
 
    gtk_box_pack_end (GTK_BOX (message_area->priv->action_area),
329
 
                      child,
330
 
                      FALSE,
331
 
                      FALSE,
332
 
                      0);
333
 
}
334
 
 
335
 
void
336
 
gedit_message_area_set_contents (GeditMessageArea *message_area,
337
 
                                 GtkWidget        *contents)
338
 
{
339
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
340
 
  g_return_if_fail (GTK_IS_WIDGET (contents));
341
 
 
342
 
  message_area->priv->contents = contents;
343
 
  gtk_box_pack_start (GTK_BOX (message_area->priv->main_hbox),
344
 
                      message_area->priv->contents,
345
 
                      TRUE,
346
 
                      TRUE,
347
 
                      0);
348
 
}
349
 
 
350
 
GtkWidget*
351
 
gedit_message_area_add_button (GeditMessageArea *message_area,
352
 
                               const gchar      *button_text,
353
 
                               gint              response_id)
354
 
{
355
 
  GtkWidget *button;
356
 
 
357
 
  g_return_val_if_fail (GEDIT_IS_MESSAGE_AREA (message_area), NULL);
358
 
  g_return_val_if_fail (button_text != NULL, NULL);
359
 
 
360
 
  button = gtk_button_new_from_stock (button_text);
361
 
 
362
 
  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
363
 
 
364
 
  gtk_widget_show (button);
365
 
 
366
 
  gedit_message_area_add_action_widget (message_area,
367
 
                                        button,
368
 
                                        response_id);
369
 
 
370
 
  return button;
371
 
}
372
 
 
373
 
static void
374
 
add_buttons_valist (GeditMessageArea *message_area,
375
 
                    const gchar      *first_button_text,
376
 
                    va_list           args)
377
 
{
378
 
  const gchar* text;
379
 
  gint response_id;
380
 
 
381
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
382
 
 
383
 
  if (first_button_text == NULL)
384
 
    return;
385
 
 
386
 
  text = first_button_text;
387
 
  response_id = va_arg (args, gint);
388
 
 
389
 
  while (text != NULL)
390
 
  {
391
 
    gedit_message_area_add_button (message_area,
392
 
                                   text,
393
 
                                   response_id);
394
 
 
395
 
    text = va_arg (args, gchar*);
396
 
    if (text == NULL)
397
 
      break;
398
 
 
399
 
    response_id = va_arg (args, int);
400
 
  }
401
 
}
402
 
 
403
 
void
404
 
gedit_message_area_add_buttons (GeditMessageArea *message_area,
405
 
                                const gchar      *first_button_text,
406
 
                                ...)
407
 
{
408
 
  va_list args;
409
 
 
410
 
  va_start (args, first_button_text);
411
 
 
412
 
  add_buttons_valist (message_area,
413
 
                      first_button_text,
414
 
                      args);
415
 
 
416
 
  va_end (args);
417
 
}
418
 
 
419
 
GtkWidget *
420
 
gedit_message_area_new (void)
421
 
{
422
 
  return g_object_new (GEDIT_TYPE_MESSAGE_AREA, NULL);
423
 
}
424
 
 
425
 
GtkWidget *
426
 
gedit_message_area_new_with_buttons (const gchar *first_button_text,
427
 
                                     ...)
428
 
{
429
 
  GeditMessageArea *message_area;
430
 
  va_list args;
431
 
 
432
 
  message_area = GEDIT_MESSAGE_AREA (gedit_message_area_new ());
433
 
 
434
 
  va_start (args, first_button_text);
435
 
 
436
 
  add_buttons_valist (message_area,
437
 
                      first_button_text,
438
 
                      args);
439
 
 
440
 
  va_end (args);
441
 
 
442
 
  return GTK_WIDGET (message_area);
443
 
}
444
 
 
445
 
void
446
 
gedit_message_area_set_response_sensitive (GeditMessageArea *message_area,
447
 
                                           gint              response_id,
448
 
                                           gboolean          setting)
449
 
{
450
 
  GList *children;
451
 
  GList *tmp_list;
452
 
 
453
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
454
 
 
455
 
  children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
456
 
 
457
 
  tmp_list = children;
458
 
  while (tmp_list != NULL)
459
 
  {
460
 
    GtkWidget *widget = tmp_list->data;
461
 
    ResponseData *rd = get_response_data (widget, FALSE);
462
 
 
463
 
    if (rd && rd->response_id == response_id)
464
 
      gtk_widget_set_sensitive (widget, setting);
465
 
 
466
 
    tmp_list = g_list_next (tmp_list);
467
 
  }
468
 
 
469
 
  g_list_free (children);
470
 
}
471
 
 
472
 
void
473
 
gedit_message_area_set_default_response (GeditMessageArea *message_area,
474
 
                                         gint              response_id)
475
 
{
476
 
  GList *children;
477
 
  GList *tmp_list;
478
 
 
479
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
480
 
 
481
 
  children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
482
 
 
483
 
  tmp_list = children;
484
 
  while (tmp_list != NULL)
485
 
  {
486
 
    GtkWidget *widget = tmp_list->data;
487
 
    ResponseData *rd = get_response_data (widget, FALSE);
488
 
 
489
 
    if (rd && rd->response_id == response_id)
490
 
      gtk_widget_grab_default (widget);
491
 
 
492
 
    tmp_list = g_list_next (tmp_list);
493
 
  }
494
 
 
495
 
  g_list_free (children);
496
 
}
497
 
 
498
 
void
499
 
gedit_message_area_response (GeditMessageArea *message_area,
500
 
                             gint              response_id)
501
 
{
502
 
  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
503
 
 
504
 
  g_signal_emit (message_area,
505
 
                 signals[RESPONSE],
506
 
                 0,
507
 
                 response_id);
508
 
}
509
 
 
510
 
GtkWidget *
511
 
gedit_message_area_add_stock_button_with_text (GeditMessageArea *message_area,
512
 
                                               const gchar      *text,
513
 
                                               const gchar      *stock_id,
514
 
                                               gint              response_id)
515
 
{
516
 
  GtkWidget *button;
517
 
 
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);
521
 
 
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));
526
 
 
527
 
  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
528
 
 
529
 
  gtk_widget_show (button);
530
 
 
531
 
  gedit_message_area_add_action_widget (message_area,
532
 
                                        button,
533
 
                                        response_id);
534
 
 
535
 
  return button;
536
 
}
537