]> git.sur5r.net Git - glabels/blob - src/ui.c
Imported Upstream version 3.0.0
[glabels] / src / ui.c
1 /*
2  *  ui.c
3  *  Copyright (C) 2001-2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels 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 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels 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 gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "ui.h"
24
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <string.h>
28
29 #include "ui-util.h"
30 #include "ui-commands.h"
31 #include "file.h"
32 #include "prefs.h"
33 #include "window.h"
34 #include "recent.h" 
35
36 #include "debug.h"
37
38
39 /*==========================================================================*/
40 /* Private macros and constants.                                            */
41 /*==========================================================================*/
42
43
44 /*==========================================================================*/
45 /* Private types.                                                           */
46 /*==========================================================================*/
47
48
49 /*==========================================================================*/
50 /* Local function prototypes                                                */
51 /*==========================================================================*/
52
53 static void view_ui_item_toggled_cb        (GtkToggleAction *action,
54                                             GtkUIManager    *ui);
55
56 static void set_app_main_toolbar_style     (GtkUIManager    *ui);
57
58 static void set_app_drawing_toolbar_style  (GtkUIManager    *ui);
59
60 static void set_view_style                 (GtkUIManager    *ui);
61
62 static void descend_menu_set_always_show_image (GtkMenu *menu);
63
64 static void set_additional_properties      (GtkUIManager    *ui);
65
66
67 static void connect_proxy_cb               (GtkUIManager    *ui,
68                                             GtkAction       *action,
69                                             GtkWidget       *proxy,
70                                             glWindow        *window);
71
72 static void disconnect_proxy_cb            (GtkUIManager    *ui,
73                                             GtkAction       *action,
74                                             GtkWidget       *proxy,
75                                             glWindow        *window);
76
77 static void menu_item_select_cb            (GtkMenuItem     *proxy,
78                                             glWindow        *window);
79
80 static void menu_item_deselect_cb          (GtkMenuItem     *proxy,
81                                             glWindow        *window);
82
83
84 /*==========================================================================*/
85 /* Private globals                                                          */
86 /*==========================================================================*/
87
88 static GtkActionEntry entries[] = {
89
90         /* Menu entries. */
91         { "FileMenu",                NULL, N_("_File") },
92         { "FileRecentsMenu",         NULL, N_("Open Recent _Files") },
93         { "EditMenu",                NULL, N_("_Edit") },
94         { "ViewMenu",                NULL, N_("_View") },
95         { "ViewMainToolBarMenu",     NULL, N_("Customize Main Toolbar") },
96         { "ViewDrawingToolBarMenu",  NULL, N_("Customize Drawing Toolbar") },
97         { "ViewPropertyToolBarMenu", NULL, N_("Customize Properties Toolbar") },
98         { "ObjectsMenu",             NULL, N_("_Objects") },
99         { "ObjectsCreateMenu",       NULL, N_("_Create") },
100         { "ObjectsOrderMenu",        NULL, N_("_Order") },
101         { "ObjectsRotateFlipMenu",   NULL, N_("_Rotate/Flip") },
102         { "ObjectsAlignMenu",        NULL, N_("_Alignment") },
103         { "ObjectsCenterMenu",        NULL, N_("C_enter") },
104         { "HelpMenu",                NULL, N_("_Help") },
105
106         /* Popup entries. */
107         { "ContextMenu", NULL, N_("Context Menu") },
108         { "EmptySelectionContextMenu", NULL, N_("Context Menu") },
109
110         /* File action entries. */
111         { "FileNew",
112           GTK_STOCK_NEW,
113           N_("_New"),
114           "<control>N",
115           N_("Create a new file"),
116           G_CALLBACK (gl_ui_cmd_file_new) },
117
118         { "FileOpen",
119           GTK_STOCK_OPEN,
120           N_("_Open..."),
121           "<control>O",
122           N_("Open a file"),
123           G_CALLBACK (gl_ui_cmd_file_open) },
124
125         { "FileSave",
126           GTK_STOCK_SAVE,
127           N_("_Save"),
128           "<control>S",
129           N_("Save current file"),
130           G_CALLBACK (gl_ui_cmd_file_save) },
131
132         { "FileSaveAs",
133           GTK_STOCK_SAVE,
134           N_("Save _As..."),
135           "<shift><control>S",
136           N_("Save the current file to a different name"),
137           G_CALLBACK (gl_ui_cmd_file_save_as) },
138
139         { "FilePrint",
140           GTK_STOCK_PRINT,
141           N_("_Print..."),
142           "<control>P",
143           N_("Print the current file"),
144           G_CALLBACK (gl_ui_cmd_file_print) },
145
146         { "FileProperties",
147           GTK_STOCK_PROPERTIES,
148           N_("Properties..."),
149           NULL,
150           N_("Modify document properties"),
151           G_CALLBACK (gl_ui_cmd_file_properties) },
152
153         { "FileTemplateDesigner",
154           NULL,
155           N_("Template _Designer..."),
156           NULL,
157           N_("Create a custom template"),
158           G_CALLBACK (gl_ui_cmd_file_template_designer) },
159
160         { "FileClose",
161           GTK_STOCK_CLOSE,
162           N_("_Close"),
163           "<alt>F4",
164           N_("Close the current file"),
165           G_CALLBACK (gl_ui_cmd_file_close) },
166
167         { "FileQuit",
168           GTK_STOCK_QUIT,
169           N_("_Quit"),
170           "<control>Q",
171           N_("Quit the program"),
172           G_CALLBACK (gl_ui_cmd_file_quit) },
173
174
175         /* Edit action entries. */
176         { "EditUndo",
177           GTK_STOCK_UNDO,
178           N_("Undo"),
179           "<control>Z",
180           N_("Undo"),
181           G_CALLBACK (gl_ui_cmd_edit_undo) },
182
183         { "EditRedo",
184           GTK_STOCK_REDO,
185           N_("Redo"),
186           "<shift><control>Z",
187           N_("Redo"),
188           G_CALLBACK (gl_ui_cmd_edit_redo) },
189
190         { "EditCut",
191           GTK_STOCK_CUT,
192           N_("Cut"),
193           "<control>X",
194           N_("Cut the selection"),
195           G_CALLBACK (gl_ui_cmd_edit_cut) },
196
197         { "EditCopy",
198           GTK_STOCK_COPY,
199           N_("Copy"),
200           "<control>C",
201           N_("Copy the selection"),
202           G_CALLBACK (gl_ui_cmd_edit_copy) },
203
204         { "EditPaste",
205           GTK_STOCK_PASTE,
206           N_("Paste"),
207           "<control>V",
208           N_("Paste the clipboard"),
209           G_CALLBACK (gl_ui_cmd_edit_paste) },
210
211         { "EditDelete",
212           NULL,
213           N_("Delete"),
214           NULL,
215           N_("Delete the selected objects"),
216           G_CALLBACK (gl_ui_cmd_edit_delete) },
217
218         { "EditSelectAll",
219           NULL,
220           N_("Select All"),
221           "<control>A",
222           N_("Select all objects"),
223           G_CALLBACK (gl_ui_cmd_edit_select_all) },
224
225         { "EditUnSelectAll",
226           NULL,
227           N_("Un-select All"),
228           NULL,
229           N_("Remove all selections"),
230           G_CALLBACK (gl_ui_cmd_edit_unselect_all) },
231
232         { "EditPreferences",
233           GTK_STOCK_PREFERENCES,
234           N_("Preferences"),
235           NULL,
236           N_("Configure the application"),
237           G_CALLBACK (gl_ui_cmd_edit_preferences) },
238
239
240         /* View action entries. */
241         { "ViewZoomIn",
242           GTK_STOCK_ZOOM_IN,
243           N_("Zoom in"),
244           NULL,
245           N_("Increase magnification"),
246           G_CALLBACK (gl_ui_cmd_view_zoomin) },
247
248         { "ViewZoomOut",
249           GTK_STOCK_ZOOM_OUT,
250           N_("Zoom out"),
251           NULL,
252           N_("Decrease magnification"),
253           G_CALLBACK (gl_ui_cmd_view_zoomout) },
254
255         { "ViewZoom1to1",
256           GTK_STOCK_ZOOM_100,
257           N_("Zoom 1 to 1"),
258           NULL,
259           N_("Restore scale to 100%"),
260           G_CALLBACK (gl_ui_cmd_view_zoom1to1) },
261
262         { "ViewZoomToFit",
263           GTK_STOCK_ZOOM_FIT,
264           N_("Zoom to fit"),
265           NULL,
266           N_("Set scale to fit window"),
267           G_CALLBACK (gl_ui_cmd_view_zoom_to_fit) },
268
269
270         /* Objects action entries. */
271         { "ObjectsArrowMode",
272           "glabels-arrow",
273           N_("Select Mode"),
274           NULL,
275           N_("Select, move and modify objects"),
276           G_CALLBACK (gl_ui_cmd_objects_arrow_mode) },
277
278         { "ObjectsCreateText",
279           "glabels-text",
280           N_("Text"),
281           NULL,
282           N_("Create text object"),
283           G_CALLBACK (gl_ui_cmd_objects_create_text) },
284
285         { "ObjectsCreateBox",
286           "glabels-box",
287           N_("Box"),
288           NULL,
289           N_("Create box/rectangle object"),
290           G_CALLBACK (gl_ui_cmd_objects_create_box) },
291
292         { "ObjectsCreateLine",
293           "glabels-line",
294           N_("Line"),
295           NULL,
296           N_("Create line object"),
297           G_CALLBACK (gl_ui_cmd_objects_create_line) },
298
299         { "ObjectsCreateEllipse",
300           "glabels-ellipse",
301           N_("Ellipse"),
302           NULL,
303           N_("Create ellipse/circle object"),
304           G_CALLBACK (gl_ui_cmd_objects_create_ellipse) },
305
306         { "ObjectsCreateImage",
307           "glabels-image",
308           N_("Image"),
309           NULL,
310           N_("Create image object"),
311           G_CALLBACK (gl_ui_cmd_objects_create_image) },
312
313         { "ObjectsCreateBarcode",
314           "glabels-barcode",
315           N_("Barcode"),
316           NULL,
317           N_("Create barcode object"),
318           G_CALLBACK (gl_ui_cmd_objects_create_barcode) },
319         
320         { "ObjectsRaise",
321           "glabels-order-top",
322           N_("Bring to front"),
323           NULL,
324           N_("Raise object to top"),
325           G_CALLBACK (gl_ui_cmd_objects_raise) },
326
327         { "ObjectsLower",
328           "glabels-order-bottom",
329           N_("Send to back"),
330           NULL,
331           N_("Lower object to bottom"),
332           G_CALLBACK (gl_ui_cmd_objects_lower) },
333
334         { "ObjectsRotateLeft",
335           "glabels-rotate-left",
336           N_("Rotate left"),
337           NULL,
338           N_("Rotate object 90 degrees counter-clockwise"),
339           G_CALLBACK (gl_ui_cmd_objects_rotate_left) },
340
341         { "ObjectsRotateRight",
342           "glabels-rotate-right",
343           N_("Rotate right"),
344           NULL,
345           N_("Rotate object 90 degrees clockwise"),
346           G_CALLBACK (gl_ui_cmd_objects_rotate_right) },
347
348         { "ObjectsFlipHorizontal",
349           "glabels-flip-horiz",
350           N_("Flip horizontally"),
351           NULL,
352           N_("Flip object horizontally"),
353           G_CALLBACK (gl_ui_cmd_objects_flip_horiz) },
354
355         { "ObjectsFlipVertical",
356           "glabels-flip-vert",
357           N_("Flip vertically"),
358           NULL,
359           N_("Flip object vertically"),
360           G_CALLBACK (gl_ui_cmd_objects_flip_vert) },
361
362         { "ObjectsAlignLeft",
363           "glabels-align-left",
364           N_("Align left"),
365           NULL,
366           N_("Align objects to left edges"),
367           G_CALLBACK (gl_ui_cmd_objects_align_left) },
368
369         { "ObjectsAlignHCenter",
370           "glabels-align-hcenter",
371           N_("Align center"),
372           NULL,
373           N_("Align objects to horizontal centers"),
374           G_CALLBACK (gl_ui_cmd_objects_align_hcenter) },
375
376         { "ObjectsAlignRight",
377           "glabels-align-right",
378           N_("Align right"),
379           NULL,
380           N_("Align objects to right edges"),
381           G_CALLBACK (gl_ui_cmd_objects_align_right) },
382
383         { "ObjectsAlignTop",
384           "glabels-align-top",
385           N_("Align top"),
386           NULL,
387           N_("Align objects to top edges"),
388           G_CALLBACK (gl_ui_cmd_objects_align_top) },
389
390         { "ObjectsAlignVCenter",
391           "glabels-align-vcenter",
392           N_("Align middle"),
393           NULL,
394           N_("Align objects to vertical centers"),
395           G_CALLBACK (gl_ui_cmd_objects_align_vcenter) },
396
397         { "ObjectsAlignBottom",
398           "glabels-align-bottom",
399           N_("Align bottom"),
400           NULL,
401           N_("Align objects to bottom edges"),
402           G_CALLBACK (gl_ui_cmd_objects_align_bottom) },
403
404         { "ObjectsCenterHorizontal",
405           "glabels-center-horiz",
406           N_("Center horizontally"),
407           NULL,
408           N_("Center objects to horizontal label center"),
409           G_CALLBACK (gl_ui_cmd_objects_center_horiz) },
410
411         { "ObjectsCenterVertical",
412           "glabels-center-vert",
413           N_("Center vertically"),
414           NULL,
415           N_("Center objects to vertical label center"),
416           G_CALLBACK (gl_ui_cmd_objects_center_vert) },
417
418         { "ObjectsMergeProperties",
419           "glabels-merge",
420           N_("Merge properties"),
421           NULL,
422           N_("Edit merge properties"),
423           G_CALLBACK (gl_ui_cmd_objects_merge_properties) },
424
425
426         /* Help actions entries. */
427         { "HelpContents",
428           GTK_STOCK_HELP,
429           N_("Contents"),
430           "F1",
431           N_("Open glabels manual"),
432           G_CALLBACK (gl_ui_cmd_help_contents) },
433
434         { "HelpAbout",
435           GTK_STOCK_ABOUT,
436           N_("About..."),
437           NULL,
438           N_("About glabels"),
439           G_CALLBACK (gl_ui_cmd_help_about) },
440
441 };
442 static guint n_entries = G_N_ELEMENTS (entries);
443
444 static GtkToggleActionEntry toggle_entries[] = {
445
446         { "ViewPropertyToolBar",
447           NULL,
448           N_("Property toolbar"),
449           NULL,
450           N_("Change the visibility of the property toolbar in the current window"),
451           G_CALLBACK (gl_ui_cmd_view_property_bar_toggle),
452           TRUE },
453
454         { "ViewGrid",
455           NULL,
456           N_("Grid"),
457           NULL,
458           N_("Change the visibility of the grid in the current window"),
459           G_CALLBACK (gl_ui_cmd_view_grid_toggle),
460           TRUE },
461
462         { "ViewMarkup",
463           NULL,
464           N_("Markup"),
465           NULL,
466           N_("Change the visibility of markup lines in the current window"),
467           G_CALLBACK (gl_ui_cmd_view_markup_toggle),
468           TRUE },
469
470 };
471 static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
472
473 static GtkToggleActionEntry ui_toggle_entries[] = {
474
475         { "ViewMainToolBar",
476           NULL,
477           N_("Main toolbar"),
478           NULL,
479           N_("Change the visibility of the main toolbar in the current window"),
480           G_CALLBACK (view_ui_item_toggled_cb),
481           TRUE },
482
483         { "ViewDrawingToolBar",
484           NULL,
485           N_("Drawing toolbar"),
486           NULL,
487           N_("Change the visibility of the drawing toolbar in the current window"),
488           G_CALLBACK (view_ui_item_toggled_cb),
489           TRUE },
490
491 };
492 static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
493
494 static const gchar *ui_info = 
495 "<ui>"
496 ""
497 "       <menubar name='MenuBar'>"
498 "               <menu action='FileMenu'>"
499 "                       <menuitem action='FileNew' />"
500 "                       <menuitem action='FileOpen' />"
501 "                       <menuitem action='FileRecentsMenu' />"
502 "                       <separator />"
503 "                       <menuitem action='FileSave' />"
504 "                       <menuitem action='FileSaveAs' />"
505 "                       <separator />"
506 "                       <menuitem action='FilePrint' />"
507 "                       <separator />"
508 "                       <menuitem action='FileProperties' />"
509 "                       <menuitem action='FileTemplateDesigner' />"
510 "                       <separator />"
511 "                       <menuitem action='FileClose' />"
512 "                       <menuitem action='FileQuit' />"
513 "               </menu>"
514 "               <menu action='EditMenu'>"
515 "                       <menuitem action='EditUndo' />"
516 "                       <menuitem action='EditRedo' />"
517 "                       <separator />"
518 "                       <menuitem action='EditCut' />"
519 "                       <menuitem action='EditCopy' />"
520 "                       <menuitem action='EditPaste' />"
521 "                       <menuitem action='EditDelete' />"
522 "                       <separator />"
523 "                       <menuitem action='EditSelectAll' />"
524 "                       <menuitem action='EditUnSelectAll' />"
525 "                       <separator />"
526 "                       <menuitem action='EditPreferences' />"
527 "               </menu>"
528 "               <menu action='ViewMenu'>"
529 "                       <menuitem action='ViewMainToolBar' />"
530 "                       <menuitem action='ViewDrawingToolBar' />"
531 "                       <menuitem action='ViewPropertyToolBar' />"
532 "                       <separator />"
533 "                       <menuitem action='ViewGrid' />"
534 "                       <menuitem action='ViewMarkup' />"
535 "                       <separator />"
536 "                       <menuitem action='ViewZoomIn' />"
537 "                       <menuitem action='ViewZoomOut' />"
538 "                       <menuitem action='ViewZoom1to1' />"
539 "                       <menuitem action='ViewZoomToFit' />"
540 "               </menu>"
541 "               <menu action='ObjectsMenu'>"
542 "                       <menuitem action='ObjectsArrowMode' />"
543 "                       <menu action='ObjectsCreateMenu'>"
544 "                               <menuitem action='ObjectsCreateText' />"
545 "                               <menuitem action='ObjectsCreateBox' />"
546 "                               <menuitem action='ObjectsCreateLine' />"
547 "                               <menuitem action='ObjectsCreateEllipse' />"
548 "                               <menuitem action='ObjectsCreateImage' />"
549 "                               <menuitem action='ObjectsCreateBarcode' />"
550 "                       </menu>"
551 "                       <separator />"
552 "                       <menu action='ObjectsOrderMenu'>"
553 "                               <menuitem action='ObjectsRaise' />"
554 "                               <menuitem action='ObjectsLower' />"
555 "                       </menu>"
556 "                       <menu action='ObjectsRotateFlipMenu'>"
557 "                               <menuitem action='ObjectsRotateLeft' />"
558 "                               <menuitem action='ObjectsRotateRight' />"
559 "                               <menuitem action='ObjectsFlipHorizontal' />"
560 "                               <menuitem action='ObjectsFlipVertical' />"
561 "                       </menu>"
562 "                       <menu action='ObjectsAlignMenu'>"
563 "                               <menuitem action='ObjectsAlignLeft' />"
564 "                               <menuitem action='ObjectsAlignHCenter' />"
565 "                               <menuitem action='ObjectsAlignRight' />"
566 "                               <separator />"
567 "                               <menuitem action='ObjectsAlignTop' />"
568 "                               <menuitem action='ObjectsAlignVCenter' />"
569 "                               <menuitem action='ObjectsAlignBottom' />"
570 "                       </menu>"
571 "                       <menu action='ObjectsCenterMenu'>"
572 "                               <menuitem action='ObjectsCenterHorizontal' />"
573 "                               <menuitem action='ObjectsCenterVertical' />"
574 "                       </menu>"
575 "                       <separator />"
576 "                       <menuitem action='ObjectsMergeProperties' />"
577 "               </menu>"
578 "               <menu action='HelpMenu'>"
579 "                       <menuitem action='HelpContents' />"
580 "                       <menuitem action='HelpAbout' />"
581 "               </menu>"
582 "       </menubar>"
583 ""
584 "       <toolbar name='MainToolBar'>"
585 "               <toolitem action='FileNew' />"
586 "               <toolitem action='FileOpen' />"
587 "               <toolitem action='FileSave' />"
588 "               <separator />"
589 "               <toolitem action='FilePrint' />"
590 "               <separator />"
591 "               <toolitem action='EditCut' />"
592 "               <toolitem action='EditCopy' />"
593 "               <toolitem action='EditPaste' />"
594 "       </toolbar>"
595 ""
596 "       <toolbar name='DrawingToolBar'>"
597 "               <toolitem action='ObjectsArrowMode' />"
598 "               <separator />"
599 "               <toolitem action='ObjectsCreateText' />"
600 "               <toolitem action='ObjectsCreateBox' />"
601 "               <toolitem action='ObjectsCreateLine' />"
602 "               <toolitem action='ObjectsCreateEllipse' />"
603 "               <toolitem action='ObjectsCreateImage' />"
604 "               <toolitem action='ObjectsCreateBarcode' />"
605 "               <separator />"
606 "               <toolitem action='ViewZoomIn' />"
607 "               <toolitem action='ViewZoomOut' />"
608 "               <toolitem action='ViewZoom1to1' />"
609 "               <toolitem action='ViewZoomToFit' />"
610 "               <separator />"
611 "               <toolitem action='ObjectsMergeProperties' />"
612 "       </toolbar>"
613 ""
614 "       <popup action='ContextMenu'>"
615 "               <menu action='ObjectsOrderMenu'>"
616 "                       <menuitem action='ObjectsRaise' />"
617 "                       <menuitem action='ObjectsLower' />"
618 "               </menu>"
619 "               <menu action='ObjectsRotateFlipMenu'>"
620 "                       <menuitem action='ObjectsRotateLeft' />"
621 "                       <menuitem action='ObjectsRotateRight' />"
622 "                       <menuitem action='ObjectsFlipHorizontal' />"
623 "                       <menuitem action='ObjectsFlipVertical' />"
624 "               </menu>"
625 "               <menu action='ObjectsAlignMenu'>"
626 "                       <menuitem action='ObjectsAlignLeft' />"
627 "                       <menuitem action='ObjectsAlignHCenter' />"
628 "                       <menuitem action='ObjectsAlignRight' />"
629 "                       <separator />"
630 "                       <menuitem action='ObjectsAlignTop' />"
631 "                       <menuitem action='ObjectsAlignVCenter' />"
632 "                       <menuitem action='ObjectsAlignBottom' />"
633 "               </menu>"
634 "               <menu action='ObjectsCenterMenu'>"
635 "                       <menuitem action='ObjectsCenterHorizontal' />"
636 "                       <menuitem action='ObjectsCenterVertical' />"
637 "               </menu>"
638 "               <separator />"
639 "               <menuitem action='EditCut' />"
640 "               <menuitem action='EditCopy' />"
641 "               <menuitem action='EditPaste' />"
642 "               <menuitem action='EditDelete' />"
643 "       </popup>"
644 ""
645 "       <popup action='EmptySelectionContextMenu'>"
646 "               <menuitem action='EditPaste' />"
647 "       </popup>"
648 ""
649 "</ui>";
650
651
652 static gchar* doc_verbs [] = {
653         "/ui/MenuBar/FileMenu/FileProperties",
654         "/ui/MenuBar/FileMenu/FileSave",
655         "/ui/MenuBar/FileMenu/FileSaveAs",
656         "/ui/MenuBar/FileMenu/FilePrint",
657         "/ui/MenuBar/FileMenu/FileClose",
658         "/ui/MenuBar/EditMenu/EditUndo",
659         "/ui/MenuBar/EditMenu/EditRedo",
660         "/ui/MenuBar/EditMenu/EditCut",
661         "/ui/MenuBar/EditMenu/EditCopy",
662         "/ui/MenuBar/EditMenu/EditDelete",
663         "/ui/MenuBar/EditMenu/EditSelectAll",
664         "/ui/MenuBar/EditMenu/EditUnSelectAll",
665         "/ui/MenuBar/ViewMenu/ViewZoomIn",
666         "/ui/MenuBar/ViewMenu/ViewZoomOut",
667         "/ui/MenuBar/ViewMenu/ViewZoom1to1",
668         "/ui/MenuBar/ViewMenu/ViewZoomToFit",
669         "/ui/MenuBar/ViewMenu/ViewGrid",
670         "/ui/MenuBar/ViewMenu/ViewMarkup",
671         "/ui/MenuBar/ObjectsMenu/ObjectsArrowMode",
672         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu",
673         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateText",
674         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine",
675         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox",
676         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse",
677         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage",
678         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode",
679         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu",
680         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
681         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
682         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu",
683         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
684         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
685         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
686         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
687         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu",
688         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignLeft",
689         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignRight",
690         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignHCenter",
691         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignTop",
692         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignBottom",
693         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignVCenter",
694         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu",
695         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterHorizontal",
696         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical",
697         "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties",
698
699         NULL
700 };
701
702 static gchar* doc_modified_verbs [] = {
703         "/ui/MenuBar/FileMenu/FileSave",
704
705         NULL
706 };
707
708 static gchar* paste_verbs [] = {
709         "/ui/MenuBar/EditMenu/EditPaste",
710
711         NULL
712 };
713
714 static gchar* selection_verbs [] = {
715         "/ui/MenuBar/EditMenu/EditCut",
716         "/ui/MenuBar/EditMenu/EditCopy",
717         "/ui/MenuBar/EditMenu/EditDelete",
718         "/ui/MenuBar/EditMenu/EditUnSelectAll",
719         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu",
720         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
721         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
722         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu",
723         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
724         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
725         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
726         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
727         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu",
728         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterHorizontal",
729         "/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical",
730
731         NULL
732 };
733
734 static gchar* atomic_selection_verbs [] = {
735
736         NULL
737 };
738
739 static gchar* multi_selection_verbs [] = {
740         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu",
741         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignLeft",
742         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignRight",
743         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignHCenter",
744         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignTop",
745         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignBottom",
746         "/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignVCenter",
747
748         NULL
749 };
750
751
752 /*****************************************************************************/
753 /** Initialize UI component for given window.                                */
754 /*****************************************************************************/
755 GtkUIManager *
756 gl_ui_new (glWindow *window)
757 {
758         GtkUIManager            *ui;
759         GtkActionGroup          *actions;
760         GError                  *error = NULL;
761         GtkWidget               *recent_menu;
762
763         gl_debug (DEBUG_UI, "START");
764
765         g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL);
766
767         gl_debug (DEBUG_UI, "window = %p", window);
768
769         ui = gtk_ui_manager_new ();
770
771         g_signal_connect (ui, "connect_proxy",
772                           G_CALLBACK (connect_proxy_cb), window);
773         g_signal_connect (ui, "disconnect_proxy",
774                           G_CALLBACK (disconnect_proxy_cb), window);
775
776         actions = gtk_action_group_new ("Actions");
777         gtk_action_group_set_translation_domain (actions, NULL);
778         gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window));
779         gtk_action_group_add_toggle_actions (actions, 
780                                              toggle_entries, n_toggle_entries, 
781                                              window);
782         gtk_action_group_add_toggle_actions (actions, 
783                                              ui_toggle_entries, n_ui_toggle_entries, 
784                                              ui);
785
786         gtk_ui_manager_insert_action_group (ui, actions, 0);
787         gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui));
788
789         gl_debug (DEBUG_UI, "Creating ui from string");
790         if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) {
791                 g_message ("building menus failed: %s", error->message);
792                 g_error_free (error);
793         }
794
795         /* Set the toolbar styles according to prefs */
796         set_app_main_toolbar_style (ui);
797         set_app_drawing_toolbar_style (ui);
798                 
799         /* Set view grid and markup visibility according to prefs */
800         set_view_style (ui);
801                 
802         /* add an Open Recents Submenu */
803         recent_menu  = gl_recent_create_menu ();
804         g_signal_connect (G_OBJECT (recent_menu), "item-activated",
805                           G_CALLBACK (gl_ui_cmd_file_open_recent), window);
806         gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")),
807                                    recent_menu);
808
809
810         set_additional_properties (ui);
811
812         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
813         gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, FALSE);
814
815         gl_debug (DEBUG_UI, "END");
816
817         return ui;
818 }
819
820
821 /*****************************************************************************/
822 /** Unref wrapper.                                                           */
823 /*****************************************************************************/
824 void
825 gl_ui_unref (GtkUIManager *ui)
826 {
827         gl_debug (DEBUG_UI, "START");
828
829         g_object_unref(ui);
830
831         gl_debug (DEBUG_UI, "END");
832 }
833
834
835 /*****************************************************************************/
836 /** Update all verbs of given UI component.                                  */
837 /*****************************************************************************/
838 void
839 gl_ui_update_all (GtkUIManager *ui,
840                   glView       *view)
841 {
842         glLabel *label;
843
844         gl_debug (DEBUG_UI, "START");
845
846         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE);
847
848         label = view->label;
849         g_return_if_fail (label != NULL);
850
851         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
852                                        gl_label_can_undo (label));
853         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
854                                        gl_label_can_redo (label));
855
856         gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs,
857                                             gl_label_is_modified (label));
858
859         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
860                                        !gl_view_is_zoom_max (view));
861         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
862                                        !gl_view_is_zoom_min (view));
863
864         gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
865                                             !gl_label_is_selection_empty (label));
866
867         gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
868                                             gl_label_is_selection_atomic (label));
869
870         gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
871                                             !gl_label_is_selection_empty (label)
872                                             && !gl_label_is_selection_atomic (label));
873
874         gl_debug (DEBUG_UI, "END");
875 }
876
877
878 /*****************************************************************************/
879 /** Update label modified verbs of given UI component.                       */
880 /*****************************************************************************/
881 void
882 gl_ui_update_modified_verbs (GtkUIManager *ui,
883                              glLabel      *label)
884 {
885         gl_debug (DEBUG_UI, "START");
886
887         gl_ui_util_set_verb_list_sensitive (ui, 
888                                             doc_modified_verbs,
889                                             gl_label_is_modified (label));
890
891         gl_debug (DEBUG_UI, "END");
892 }
893
894
895 /*****************************************************************************/
896 /** Update verbs associated with selection state of given UI component.      */
897 /*****************************************************************************/
898 void
899 gl_ui_update_selection_verbs (GtkUIManager *ui,
900                               glView       *view,
901                               gboolean      has_focus)
902 {
903         gl_debug (DEBUG_UI, "START");
904
905         if ( has_focus )
906         {
907                 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
908                                                     !gl_label_is_selection_empty (view->label));
909
910                 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
911                                                     gl_label_is_selection_atomic (view->label));
912
913                 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
914                                                     !gl_label_is_selection_empty (view->label)
915                                                     && !gl_label_is_selection_atomic (view->label));
916         }
917         else
918         {
919                 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, FALSE);
920                 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, FALSE);
921                 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, FALSE);
922         }
923
924         gl_debug (DEBUG_UI, "END");
925 }
926
927
928 /*****************************************************************************/
929 /** Update verbs associated with zoom level of given UI component.           */
930 /*****************************************************************************/
931 void
932 gl_ui_update_zoom_verbs (GtkUIManager *ui,
933                          glView       *view)
934 {
935         gl_debug (DEBUG_UI, "START");
936
937         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
938                                        !gl_view_is_zoom_max (view));
939         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
940                                        !gl_view_is_zoom_min (view));
941
942         gl_debug (DEBUG_UI, "END");
943 }
944
945
946 /*****************************************************************************/
947 /** Update paste verbs of given UI component.                                */
948 /*****************************************************************************/
949 void
950 gl_ui_update_paste_verbs (GtkUIManager      *ui,
951                           gboolean           can_paste)
952 {
953         gl_debug (DEBUG_UI, "START");
954
955         gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, can_paste);
956
957         gl_debug (DEBUG_UI, "END");
958 }
959
960
961 /*****************************************************************************/
962 /** Update undo/redo verbs of given UI component.                            */
963 /*****************************************************************************/
964 void
965 gl_ui_update_undo_redo_verbs (GtkUIManager *ui,
966                               glLabel      *label)
967 {
968         GtkWidget  *menu_item;
969         gchar      *description;
970         gchar      *menu_label;
971
972         gl_debug (DEBUG_UI, "START");
973
974         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditUndo");
975         description = gl_label_get_undo_description (label);
976         menu_label = g_strdup_printf ("%s: %s", _("Undo"), description);
977         gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
978         g_free (menu_label);
979         g_free (description);
980
981         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditRedo");
982         description = gl_label_get_redo_description (label);
983         menu_label = g_strdup_printf ("%s: %s", _("Redo"), description);
984         gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
985         g_free (menu_label);
986         g_free (description);
987
988         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
989                                        gl_label_can_undo (label));
990
991         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
992                                        gl_label_can_redo (label));
993
994         gl_debug (DEBUG_UI, "END");
995 }
996
997
998 /*---------------------------------------------------------------------------*/
999 /** PRIVATE.  View menu item toggled callback.                               */
1000 /*---------------------------------------------------------------------------*/
1001 static void
1002 view_ui_item_toggled_cb (GtkToggleAction *action,
1003                          GtkUIManager    *ui)
1004 {
1005         const gchar *name;
1006         gboolean     state;
1007
1008         gl_debug (DEBUG_UI, "START");
1009
1010         g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action));
1011
1012         name  = gtk_action_get_name (GTK_ACTION (action));
1013         state = gtk_toggle_action_get_active (action);
1014
1015         gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state);
1016
1017         if (strcmp (name, "ViewMainToolBar") == 0)
1018         {
1019                 gl_prefs_model_set_main_toolbar_visible (gl_prefs, state);
1020                 set_app_main_toolbar_style (ui);
1021         }
1022
1023         if (strcmp (name, "ViewDrawingToolBar") == 0)
1024         {
1025                 gl_prefs_model_set_drawing_toolbar_visible (gl_prefs, state);
1026                 set_app_drawing_toolbar_style (ui);
1027         }
1028
1029         gl_debug (DEBUG_UI, "");
1030 }
1031
1032
1033 /*---------------------------------------------------------------------------*/
1034 /** PRIVATE.  Set main toolbar style.                                        */
1035 /*---------------------------------------------------------------------------*/
1036 static void
1037 set_app_main_toolbar_style (GtkUIManager *ui)
1038 {
1039         GtkWidget *toolbar;
1040
1041         gl_debug (DEBUG_UI, "START");
1042
1043         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1044                         
1045         /* Updated view menu */
1046         gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar",
1047                                    gl_prefs_model_get_main_toolbar_visible (gl_prefs));
1048
1049         toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar");
1050
1051         if (gl_prefs_model_get_main_toolbar_visible (gl_prefs)) {
1052                 gtk_widget_show_all (toolbar);
1053         } else {
1054                 gtk_widget_hide (toolbar);
1055         }
1056         
1057         gl_debug (DEBUG_UI, "END");
1058 }
1059
1060
1061 /*---------------------------------------------------------------------------*/
1062 /** PRIVATE.  Set drawing toolbar style.                                     */
1063 /*---------------------------------------------------------------------------*/
1064 static void
1065 set_app_drawing_toolbar_style (GtkUIManager *ui)
1066 {
1067         GtkWidget *toolbar;
1068
1069         gl_debug (DEBUG_UI, "START");
1070
1071         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1072                         
1073         /* Updated view menu */
1074         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar",
1075                                    gl_prefs_model_get_drawing_toolbar_visible (gl_prefs));
1076
1077         toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar");
1078
1079         gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1080
1081         if (gl_prefs_model_get_drawing_toolbar_visible (gl_prefs)) {
1082                 gtk_widget_show_all (toolbar);
1083         } else {
1084                 gtk_widget_hide (toolbar);
1085         }
1086         
1087         gl_debug (DEBUG_UI, "END");
1088 }
1089
1090
1091 /*---------------------------------------------------------------------------*/
1092 /** PRIVATE.  Set visibility of grid and markup.                             */
1093 /*---------------------------------------------------------------------------*/
1094 static void
1095 set_view_style (GtkUIManager *ui)
1096 {
1097         gl_debug (DEBUG_UI, "START");
1098
1099         g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui));
1100                         
1101         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid",
1102                                    gl_prefs_model_get_grid_visible (gl_prefs));
1103
1104         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup",
1105                                    gl_prefs_model_get_markup_visible (gl_prefs));
1106
1107         gl_debug (DEBUG_UI, "END");
1108 }
1109
1110
1111 /*---------------------------------------------------------------------------*/
1112 /** PRIVATE.  Descend menu, set "always-show-image" for all image menu items.*/
1113 /*---------------------------------------------------------------------------*/
1114 static void
1115 descend_menu_set_always_show_image (GtkMenu *menu)
1116 {
1117         GList       *children, *p;
1118         GtkWidget   *submenu;
1119         GtkWidget   *menu_item;
1120
1121         children = gtk_container_get_children (GTK_CONTAINER (menu));
1122
1123         for ( p = children; p != NULL; p = p->next )
1124         {
1125                 menu_item = GTK_WIDGET (p->data);
1126
1127                 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1128                 if ( submenu )
1129                 {
1130                         descend_menu_set_always_show_image (GTK_MENU (submenu));
1131                 }
1132                 else if ( GTK_IS_IMAGE_MENU_ITEM (menu_item) )
1133                 {
1134                         g_object_set (menu_item, "always-show-image", TRUE, NULL);
1135                 }
1136         }
1137 }
1138
1139
1140 /*---------------------------------------------------------------------------*/
1141 /** PRIVATE.  Set additional properties.                                     */
1142 /*---------------------------------------------------------------------------*/
1143 static void
1144 set_additional_properties (GtkUIManager *ui)
1145 {
1146         GtkWidget  *menu;
1147         GtkWidget  *menu_item;
1148
1149         /*
1150          * Set "always-show-image" property for all Object menuitems.  This is
1151          * necessary because, as of Gtk-2.18, images are not shown by default
1152          * and you really need these visual cues for these menu items.
1153          */
1154         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/");
1155         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1156         descend_menu_set_always_show_image (GTK_MENU (menu));
1157
1158         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/ObjectsMergeProperties");
1159         g_object_set (menu_item, "always-show-image", FALSE, NULL); /* Leave this one out. */
1160
1161         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsOrderMenu/");
1162         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1163         descend_menu_set_always_show_image (GTK_MENU (menu));
1164
1165         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsRotateFlipMenu/");
1166         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1167         descend_menu_set_always_show_image (GTK_MENU (menu));
1168
1169         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsAlignMenu/");
1170         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1171         descend_menu_set_always_show_image (GTK_MENU (menu));
1172
1173         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsCenterMenu/");
1174         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1175         descend_menu_set_always_show_image (GTK_MENU (menu));
1176 }
1177
1178
1179 /*---------------------------------------------------------------------------*/
1180 /** PRIVATE.  Connect proxy callback.                                        */
1181 /*---------------------------------------------------------------------------*/
1182 static void
1183 connect_proxy_cb (GtkUIManager *ui,
1184                   GtkAction    *action,
1185                   GtkWidget    *proxy,
1186                   glWindow     *window)
1187 {
1188         if (GTK_IS_MENU_ITEM (proxy))
1189         {
1190                 g_signal_connect (proxy, "select",
1191                                   G_CALLBACK (menu_item_select_cb), window);
1192                 g_signal_connect (proxy, "deselect",
1193                                   G_CALLBACK (menu_item_deselect_cb), window);
1194         }
1195 }
1196
1197
1198 /*---------------------------------------------------------------------------*/
1199 /** PRIVATE.  Disconnect proxy callback.                                     */
1200 /*---------------------------------------------------------------------------*/
1201 static void
1202 disconnect_proxy_cb (GtkUIManager *ui,
1203                      GtkAction    *action,
1204                      GtkWidget    *proxy,
1205                      glWindow     *window)
1206 {
1207         if (GTK_IS_MENU_ITEM (proxy))
1208         {
1209                 g_signal_handlers_disconnect_by_func
1210                         (proxy, G_CALLBACK (menu_item_select_cb), window);
1211                 g_signal_handlers_disconnect_by_func
1212                         (proxy, G_CALLBACK (menu_item_deselect_cb), window);
1213         }
1214 }
1215
1216
1217 /*---------------------------------------------------------------------------*/
1218 /** PRIVATE.  Menu item select callback.                                     */
1219 /*---------------------------------------------------------------------------*/
1220 static void
1221 menu_item_select_cb (GtkMenuItem *proxy,
1222                      glWindow    *window)
1223 {
1224         GtkAction *action;
1225         char      *message;
1226
1227         g_return_if_fail (window && GL_IS_WINDOW (window));
1228         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1229
1230         action = g_object_get_data (G_OBJECT (proxy),  "gtk-action");
1231         g_return_if_fail (action != NULL);
1232         
1233         g_object_get (G_OBJECT (action), "tooltip", &message, NULL);
1234         if (message)
1235         {
1236                 gtk_statusbar_push (GTK_STATUSBAR (window->status_bar),
1237                                     window->menu_tips_context_id, message);
1238                 g_free (message);
1239         }
1240 }
1241
1242
1243 /*---------------------------------------------------------------------------*/
1244 /** PRIVATE.  Menu item deselect callback.                                   */
1245 /*---------------------------------------------------------------------------*/
1246 static void
1247 menu_item_deselect_cb (GtkMenuItem *proxy,
1248                        glWindow    *window)
1249 {
1250         g_return_if_fail (window && GL_IS_WINDOW (window));
1251         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1252
1253         gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar),
1254                            window->menu_tips_context_id);
1255 }
1256
1257
1258
1259 /*
1260  * Local Variables:       -- emacs
1261  * mode: C                -- emacs
1262  * c-basic-offset: 8      -- emacs
1263  * tab-width: 8           -- emacs
1264  * indent-tabs-mode: nil  -- emacs
1265  * End:                   -- emacs
1266  */