]> git.sur5r.net Git - glabels/blob - src/ui.c
Fix drawing problems with view.c
[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         { "ObjectsAlignHorizMenu",   NULL, N_("Align _Horizontal") },
103         { "ObjectsAlignVertMenu",    NULL, N_("Align _Vertical") },
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         { "ObjectsAlignRight",
370           "glabels-align-right",
371           N_("Align right"),
372           NULL,
373           N_("Align objects to right edges"),
374           G_CALLBACK (gl_ui_cmd_objects_align_right) },
375
376         { "ObjectsAlignHCenter",
377           "glabels-align-hcenter",
378           N_("Align horizontal center"),
379           NULL,
380           N_("Align objects to horizontal centers"),
381           G_CALLBACK (gl_ui_cmd_objects_align_hcenter) },
382
383         { "ObjectsAlignTop",
384           "glabels-align-top",
385           N_("Align tops"),
386           NULL,
387           N_("Align objects to top edges"),
388           G_CALLBACK (gl_ui_cmd_objects_align_top) },
389
390         { "ObjectsAlignBottom",
391           "glabels-align-bottom",
392           N_("Align bottoms"),
393           NULL,
394           N_("Align objects to bottom edges"),
395           G_CALLBACK (gl_ui_cmd_objects_align_bottom) },
396
397         { "ObjectsAlignVCenter",
398           "glabels-align-vcenter",
399           N_("Align vertical center"),
400           NULL,
401           N_("Align objects to vertical centers"),
402           G_CALLBACK (gl_ui_cmd_objects_align_vcenter) },
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='ObjectsAlignHorizMenu'>"
563 "                               <menuitem action='ObjectsAlignLeft' />"
564 "                               <menuitem action='ObjectsAlignHCenter' />"
565 "                               <menuitem action='ObjectsAlignRight' />"
566 "                               <menuitem action='ObjectsCenterHorizontal' />"
567 "                       </menu>"
568 "                       <menu action='ObjectsAlignVertMenu'>"
569 "                               <menuitem action='ObjectsAlignTop' />"
570 "                               <menuitem action='ObjectsAlignVCenter' />"
571 "                               <menuitem action='ObjectsAlignBottom' />"
572 "                               <menuitem action='ObjectsCenterVertical' />"
573 "                       </menu>"
574 "                       <separator />"
575 "                       <menuitem action='ObjectsMergeProperties' />"
576 "               </menu>"
577 "               <menu action='HelpMenu'>"
578 "                       <menuitem action='HelpContents' />"
579 "                       <menuitem action='HelpAbout' />"
580 "               </menu>"
581 "       </menubar>"
582 ""
583 "       <toolbar name='MainToolBar'>"
584 "               <toolitem action='FileNew' />"
585 "               <toolitem action='FileOpen' />"
586 "               <toolitem action='FileSave' />"
587 "               <separator />"
588 "               <toolitem action='FilePrint' />"
589 "               <separator />"
590 "               <toolitem action='EditCut' />"
591 "               <toolitem action='EditCopy' />"
592 "               <toolitem action='EditPaste' />"
593 "       </toolbar>"
594 ""
595 "       <toolbar name='DrawingToolBar'>"
596 "               <toolitem action='ObjectsArrowMode' />"
597 "               <separator />"
598 "               <toolitem action='ObjectsCreateText' />"
599 "               <toolitem action='ObjectsCreateBox' />"
600 "               <toolitem action='ObjectsCreateLine' />"
601 "               <toolitem action='ObjectsCreateEllipse' />"
602 "               <toolitem action='ObjectsCreateImage' />"
603 "               <toolitem action='ObjectsCreateBarcode' />"
604 "               <separator />"
605 "               <toolitem action='ViewZoomIn' />"
606 "               <toolitem action='ViewZoomOut' />"
607 "               <toolitem action='ViewZoom1to1' />"
608 "               <toolitem action='ViewZoomToFit' />"
609 "               <separator />"
610 "               <toolitem action='ObjectsMergeProperties' />"
611 "       </toolbar>"
612 ""
613 "       <popup action='ContextMenu'>"
614 "               <menu action='ObjectsOrderMenu'>"
615 "                       <menuitem action='ObjectsRaise' />"
616 "                       <menuitem action='ObjectsLower' />"
617 "               </menu>"
618 "               <menu action='ObjectsRotateFlipMenu'>"
619 "                       <menuitem action='ObjectsRotateLeft' />"
620 "                       <menuitem action='ObjectsRotateRight' />"
621 "                       <menuitem action='ObjectsFlipHorizontal' />"
622 "                       <menuitem action='ObjectsFlipVertical' />"
623 "               </menu>"
624 "               <menu action='ObjectsAlignHorizMenu'>"
625 "                       <menuitem action='ObjectsAlignLeft' />"
626 "                       <menuitem action='ObjectsAlignHCenter' />"
627 "                       <menuitem action='ObjectsAlignRight' />"
628 "                       <menuitem action='ObjectsCenterHorizontal' />"
629 "               </menu>"
630 "               <menu action='ObjectsAlignVertMenu'>"
631 "                       <menuitem action='ObjectsAlignTop' />"
632 "                       <menuitem action='ObjectsAlignVCenter' />"
633 "                       <menuitem action='ObjectsAlignBottom' />"
634 "                       <menuitem action='ObjectsCenterVertical' />"
635 "               </menu>"
636 "               <separator />"
637 "               <menuitem action='EditCut' />"
638 "               <menuitem action='EditCopy' />"
639 "               <menuitem action='EditPaste' />"
640 "               <menuitem action='EditDelete' />"
641 "       </popup>"
642 ""
643 "       <popup action='EmptySelectionContextMenu'>"
644 "               <menuitem action='EditPaste' />"
645 "       </popup>"
646 ""
647 "</ui>";
648
649
650 static gchar* doc_verbs [] = {
651         "/ui/MenuBar/FileMenu/FileProperties",
652         "/ui/MenuBar/FileMenu/FileSave",
653         "/ui/MenuBar/FileMenu/FileSaveAs",
654         "/ui/MenuBar/FileMenu/FilePrint",
655         "/ui/MenuBar/FileMenu/FileClose",
656         "/ui/MenuBar/EditMenu/EditUndo",
657         "/ui/MenuBar/EditMenu/EditRedo",
658         "/ui/MenuBar/EditMenu/EditCut",
659         "/ui/MenuBar/EditMenu/EditCopy",
660         "/ui/MenuBar/EditMenu/EditDelete",
661         "/ui/MenuBar/EditMenu/EditSelectAll",
662         "/ui/MenuBar/EditMenu/EditUnSelectAll",
663         "/ui/MenuBar/ViewMenu/ViewZoomIn",
664         "/ui/MenuBar/ViewMenu/ViewZoomOut",
665         "/ui/MenuBar/ViewMenu/ViewZoom1to1",
666         "/ui/MenuBar/ViewMenu/ViewZoomToFit",
667         "/ui/MenuBar/ViewMenu/ViewGrid",
668         "/ui/MenuBar/ViewMenu/ViewMarkup",
669         "/ui/MenuBar/ObjectsMenu/ObjectsArrowMode",
670         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateText",
671         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateLine",
672         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBox",
673         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateEllipse",
674         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateImage",
675         "/ui/MenuBar/ObjectsMenu/ObjectsCreateMenu/ObjectsCreateBarcode",
676         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
677         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
678         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
679         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
680         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
681         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
682         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
683         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
684         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
685         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
686         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
687         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
688         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
689         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
690         "/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties",
691
692         NULL
693 };
694
695 static gchar* doc_modified_verbs [] = {
696         "/ui/MenuBar/FileMenu/FileSave",
697
698         NULL
699 };
700
701 static gchar* paste_verbs [] = {
702         "/ui/MenuBar/EditMenu/EditPaste",
703
704         NULL
705 };
706
707 static gchar* selection_verbs [] = {
708         "/ui/MenuBar/EditMenu/EditCut",
709         "/ui/MenuBar/EditMenu/EditCopy",
710         "/ui/MenuBar/EditMenu/EditDelete",
711         "/ui/MenuBar/EditMenu/EditUnSelectAll",
712         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsRaise",
713         "/ui/MenuBar/ObjectsMenu/ObjectsOrderMenu/ObjectsLower",
714         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateLeft",
715         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsRotateRight",
716         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipHorizontal",
717         "/ui/MenuBar/ObjectsMenu/ObjectsRotateFlipMenu/ObjectsFlipVertical",
718         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsCenterHorizontal",
719         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsCenterVertical",
720
721         NULL
722 };
723
724 static gchar* atomic_selection_verbs [] = {
725
726         NULL
727 };
728
729 static gchar* multi_selection_verbs [] = {
730         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignLeft",
731         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignRight",
732         "/ui/MenuBar/ObjectsMenu/ObjectsAlignHorizMenu/ObjectsAlignHCenter",
733         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignTop",
734         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignBottom",
735         "/ui/MenuBar/ObjectsMenu/ObjectsAlignVertMenu/ObjectsAlignVCenter",
736
737         NULL
738 };
739
740
741 /*****************************************************************************/
742 /** Initialize UI component for given window.                                */
743 /*****************************************************************************/
744 GtkUIManager *
745 gl_ui_new (glWindow *window)
746 {
747         GtkUIManager            *ui;
748         GtkActionGroup          *actions;
749         GError                  *error = NULL;
750         GtkWidget               *recent_menu;
751
752         gl_debug (DEBUG_UI, "START");
753
754         g_return_val_if_fail (window && GL_IS_WINDOW (window), NULL);
755
756         gl_debug (DEBUG_UI, "window = %p", window);
757
758         ui = gtk_ui_manager_new ();
759
760         g_signal_connect (ui, "connect_proxy",
761                           G_CALLBACK (connect_proxy_cb), window);
762         g_signal_connect (ui, "disconnect_proxy",
763                           G_CALLBACK (disconnect_proxy_cb), window);
764
765         actions = gtk_action_group_new ("Actions");
766         gtk_action_group_set_translation_domain (actions, NULL);
767         gtk_action_group_add_actions (actions, entries, n_entries, GTK_WINDOW (window));
768         gtk_action_group_add_toggle_actions (actions, 
769                                              toggle_entries, n_toggle_entries, 
770                                              window);
771         gtk_action_group_add_toggle_actions (actions, 
772                                              ui_toggle_entries, n_ui_toggle_entries, 
773                                              ui);
774
775         gtk_ui_manager_insert_action_group (ui, actions, 0);
776         gtk_window_add_accel_group (GTK_WINDOW (window), gtk_ui_manager_get_accel_group (ui));
777
778         gl_debug (DEBUG_UI, "Creating ui from string");
779         if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, strlen (ui_info), &error)) {
780                 g_message ("building menus failed: %s", error->message);
781                 g_error_free (error);
782         }
783
784         /* Set the toolbar styles according to prefs */
785         set_app_main_toolbar_style (ui);
786         set_app_drawing_toolbar_style (ui);
787                 
788         /* Set view grid and markup visibility according to prefs */
789         set_view_style (ui);
790                 
791         /* add an Open Recents Submenu */
792         recent_menu  = gl_recent_create_menu ();
793         g_signal_connect (G_OBJECT (recent_menu), "item-activated",
794                           G_CALLBACK (gl_ui_cmd_file_open_recent), window);
795         gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget (ui, "/MenuBar/FileMenu/FileRecentsMenu")),
796                                    recent_menu);
797
798
799         set_additional_properties (ui);
800
801         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, FALSE);
802         gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, FALSE);
803
804         gl_debug (DEBUG_UI, "END");
805
806         return ui;
807 }
808
809
810 /*****************************************************************************/
811 /** Unref wrapper.                                                           */
812 /*****************************************************************************/
813 void
814 gl_ui_unref (GtkUIManager *ui)
815 {
816         gl_debug (DEBUG_UI, "START");
817
818         g_object_unref(ui);
819
820         gl_debug (DEBUG_UI, "END");
821 }
822
823
824 /*****************************************************************************/
825 /** Update all verbs of given UI component.                                  */
826 /*****************************************************************************/
827 void
828 gl_ui_update_all (GtkUIManager *ui,
829                   glView       *view)
830 {
831         glLabel *label;
832
833         gl_debug (DEBUG_UI, "START");
834
835         gl_ui_util_set_verb_list_sensitive (ui, doc_verbs, TRUE);
836
837         label = view->label;
838         g_return_if_fail (label != NULL);
839
840         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
841                                        gl_label_can_undo (label));
842         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
843                                        gl_label_can_redo (label));
844
845         gl_ui_util_set_verb_list_sensitive (ui, doc_modified_verbs,
846                                             gl_label_is_modified (label));
847
848         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
849                                        !gl_view_is_zoom_max (view));
850         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
851                                        !gl_view_is_zoom_min (view));
852
853         gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
854                                             !gl_label_is_selection_empty (label));
855
856         gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
857                                             gl_label_is_selection_atomic (label));
858
859         gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
860                                             !gl_label_is_selection_empty (label)
861                                             && !gl_label_is_selection_atomic (label));
862
863         gl_debug (DEBUG_UI, "END");
864 }
865
866
867 /*****************************************************************************/
868 /** Update label modified verbs of given UI component.                       */
869 /*****************************************************************************/
870 void
871 gl_ui_update_modified_verbs (GtkUIManager *ui,
872                              glLabel      *label)
873 {
874         gl_debug (DEBUG_UI, "START");
875
876         gl_ui_util_set_verb_list_sensitive (ui, 
877                                             doc_modified_verbs,
878                                             gl_label_is_modified (label));
879
880         gl_debug (DEBUG_UI, "END");
881 }
882
883
884 /*****************************************************************************/
885 /** Update verbs associated with selection state of given UI component.      */
886 /*****************************************************************************/
887 void
888 gl_ui_update_selection_verbs (GtkUIManager *ui,
889                               glView       *view,
890                               gboolean      has_focus)
891 {
892         gl_debug (DEBUG_UI, "START");
893
894         if ( has_focus )
895         {
896                 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs,
897                                                     !gl_label_is_selection_empty (view->label));
898
899                 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs,
900                                                     gl_label_is_selection_atomic (view->label));
901
902                 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs,
903                                                     !gl_label_is_selection_empty (view->label)
904                                                     && !gl_label_is_selection_atomic (view->label));
905         }
906         else
907         {
908                 gl_ui_util_set_verb_list_sensitive (ui, selection_verbs, FALSE);
909                 gl_ui_util_set_verb_list_sensitive (ui, atomic_selection_verbs, FALSE);
910                 gl_ui_util_set_verb_list_sensitive (ui, multi_selection_verbs, FALSE);
911         }
912
913         gl_debug (DEBUG_UI, "END");
914 }
915
916
917 /*****************************************************************************/
918 /** Update verbs associated with zoom level of given UI component.           */
919 /*****************************************************************************/
920 void
921 gl_ui_update_zoom_verbs (GtkUIManager *ui,
922                          glView       *view)
923 {
924         gl_debug (DEBUG_UI, "START");
925
926         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomIn",
927                                        !gl_view_is_zoom_max (view));
928         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/ViewMenu/ViewZoomOut",
929                                        !gl_view_is_zoom_min (view));
930
931         gl_debug (DEBUG_UI, "END");
932 }
933
934
935 /*****************************************************************************/
936 /** Update paste verbs of given UI component.                                */
937 /*****************************************************************************/
938 void
939 gl_ui_update_paste_verbs (GtkUIManager      *ui,
940                           gboolean           can_paste)
941 {
942         gl_debug (DEBUG_UI, "START");
943
944         gl_ui_util_set_verb_list_sensitive (ui, paste_verbs, can_paste);
945
946         gl_debug (DEBUG_UI, "END");
947 }
948
949
950 /*****************************************************************************/
951 /** Update undo/redo verbs of given UI component.                            */
952 /*****************************************************************************/
953 void
954 gl_ui_update_undo_redo_verbs (GtkUIManager *ui,
955                               glLabel      *label)
956 {
957         GtkWidget  *menu_item;
958         gchar      *description;
959         gchar      *menu_label;
960
961         gl_debug (DEBUG_UI, "START");
962
963         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditUndo");
964         description = gl_label_get_undo_description (label);
965         menu_label = g_strdup_printf ("%s: %s", _("Undo"), description);
966         gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
967         g_free (menu_label);
968         g_free (description);
969
970         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/EditMenu/EditRedo");
971         description = gl_label_get_redo_description (label);
972         menu_label = g_strdup_printf ("%s: %s", _("Redo"), description);
973         gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), menu_label);
974         g_free (menu_label);
975         g_free (description);
976
977         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditUndo",
978                                        gl_label_can_undo (label));
979
980         gl_ui_util_set_verb_sensitive (ui, "/ui/MenuBar/EditMenu/EditRedo",
981                                        gl_label_can_redo (label));
982
983         gl_debug (DEBUG_UI, "END");
984 }
985
986
987 /*---------------------------------------------------------------------------*/
988 /** PRIVATE.  View menu item toggled callback.                               */
989 /*---------------------------------------------------------------------------*/
990 static void
991 view_ui_item_toggled_cb (GtkToggleAction *action,
992                          GtkUIManager    *ui)
993 {
994         const gchar *name;
995         gboolean     state;
996
997         gl_debug (DEBUG_UI, "START");
998
999         g_return_if_fail (action && GTK_IS_TOGGLE_ACTION (action));
1000
1001         name  = gtk_action_get_name (GTK_ACTION (action));
1002         state = gtk_toggle_action_get_active (action);
1003
1004         gl_debug (DEBUG_UI, "Action = %s, State = %d", name, state);
1005
1006         if (strcmp (name, "ViewMainToolBar") == 0)
1007         {
1008                 gl_prefs_model_set_main_toolbar_visible (gl_prefs, state);
1009                 set_app_main_toolbar_style (ui);
1010         }
1011
1012         if (strcmp (name, "ViewDrawingToolBar") == 0)
1013         {
1014                 gl_prefs_model_set_drawing_toolbar_visible (gl_prefs, state);
1015                 set_app_drawing_toolbar_style (ui);
1016         }
1017
1018         gl_debug (DEBUG_UI, "");
1019 }
1020
1021
1022 /*---------------------------------------------------------------------------*/
1023 /** PRIVATE.  Set main toolbar style.                                        */
1024 /*---------------------------------------------------------------------------*/
1025 static void
1026 set_app_main_toolbar_style (GtkUIManager *ui)
1027 {
1028         GtkWidget *toolbar;
1029
1030         gl_debug (DEBUG_UI, "START");
1031
1032         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1033                         
1034         /* Updated view menu */
1035         gl_ui_util_set_verb_state (ui, "/ui/ViewMenu/ViewMainToolBar",
1036                                    gl_prefs_model_get_main_toolbar_visible (gl_prefs));
1037
1038         toolbar = gtk_ui_manager_get_widget (ui, "/MainToolBar");
1039
1040         if (gl_prefs_model_get_main_toolbar_visible (gl_prefs)) {
1041                 gtk_widget_show_all (toolbar);
1042         } else {
1043                 gtk_widget_hide (toolbar);
1044         }
1045         
1046         gl_debug (DEBUG_UI, "END");
1047 }
1048
1049
1050 /*---------------------------------------------------------------------------*/
1051 /** PRIVATE.  Set drawing toolbar style.                                     */
1052 /*---------------------------------------------------------------------------*/
1053 static void
1054 set_app_drawing_toolbar_style (GtkUIManager *ui)
1055 {
1056         GtkWidget *toolbar;
1057
1058         gl_debug (DEBUG_UI, "START");
1059
1060         g_return_if_fail (ui && GTK_IS_UI_MANAGER (ui));
1061                         
1062         /* Updated view menu */
1063         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewDrawingToolBar",
1064                                    gl_prefs_model_get_drawing_toolbar_visible (gl_prefs));
1065
1066         toolbar = gtk_ui_manager_get_widget (ui, "/DrawingToolBar");
1067
1068         gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1069
1070         if (gl_prefs_model_get_drawing_toolbar_visible (gl_prefs)) {
1071                 gtk_widget_show_all (toolbar);
1072         } else {
1073                 gtk_widget_hide (toolbar);
1074         }
1075         
1076         gl_debug (DEBUG_UI, "END");
1077 }
1078
1079
1080 /*---------------------------------------------------------------------------*/
1081 /** PRIVATE.  Set visibility of grid and markup.                             */
1082 /*---------------------------------------------------------------------------*/
1083 static void
1084 set_view_style (GtkUIManager *ui)
1085 {
1086         gl_debug (DEBUG_UI, "START");
1087
1088         g_return_if_fail (ui && GTK_IS_UI_MANAGER(ui));
1089                         
1090         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewGrid",
1091                                    gl_prefs_model_get_grid_visible (gl_prefs));
1092
1093         gl_ui_util_set_verb_state (ui, "/ui/MenuBar/ViewMenu/ViewMarkup",
1094                                    gl_prefs_model_get_markup_visible (gl_prefs));
1095
1096         gl_debug (DEBUG_UI, "END");
1097 }
1098
1099
1100 /*---------------------------------------------------------------------------*/
1101 /** PRIVATE.  Descend menu, set "always-show-image" for all image menu items.*/
1102 /*---------------------------------------------------------------------------*/
1103 static void
1104 descend_menu_set_always_show_image (GtkMenu *menu)
1105 {
1106         GList       *children, *p;
1107         GtkWidget   *submenu;
1108         GtkWidget   *menu_item;
1109
1110         children = gtk_container_get_children (GTK_CONTAINER (menu));
1111
1112         for ( p = children; p != NULL; p = p->next )
1113         {
1114                 menu_item = GTK_WIDGET (p->data);
1115
1116                 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1117                 if ( submenu )
1118                 {
1119                         descend_menu_set_always_show_image (GTK_MENU (submenu));
1120                 }
1121                 else if ( GTK_IS_IMAGE_MENU_ITEM (menu_item) )
1122                 {
1123                         g_object_set (menu_item, "always-show-image", TRUE, NULL);
1124                 }
1125         }
1126 }
1127
1128
1129 /*---------------------------------------------------------------------------*/
1130 /** PRIVATE.  Set additional properties.                                     */
1131 /*---------------------------------------------------------------------------*/
1132 static void
1133 set_additional_properties (GtkUIManager *ui)
1134 {
1135         GtkWidget  *menu;
1136         GtkWidget  *menu_item;
1137
1138         /*
1139          * Set "always-show-image" property for all Object menuitems.  This is
1140          * necessary because, as of Gtk-2.18, images are not shown by default
1141          * and you really need these visual cues for these menu items.
1142          */
1143         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/");
1144         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1145         descend_menu_set_always_show_image (GTK_MENU (menu));
1146
1147         menu_item = gtk_ui_manager_get_widget (ui, "/MenuBar/ObjectsMenu/ObjectsMergeProperties");
1148         g_object_set (menu_item, "always-show-image", FALSE, NULL); /* Leave this one out. */
1149
1150         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsOrderMenu/");
1151         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1152         descend_menu_set_always_show_image (GTK_MENU (menu));
1153
1154         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsRotateFlipMenu/");
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, "/ContextMenu/ObjectsAlignHorizMenu/");
1159         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1160         descend_menu_set_always_show_image (GTK_MENU (menu));
1161
1162         menu_item = gtk_ui_manager_get_widget (ui, "/ContextMenu/ObjectsAlignVertMenu/");
1163         menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
1164         descend_menu_set_always_show_image (GTK_MENU (menu));
1165 }
1166
1167
1168 /*---------------------------------------------------------------------------*/
1169 /** PRIVATE.  Connect proxy callback.                                        */
1170 /*---------------------------------------------------------------------------*/
1171 static void
1172 connect_proxy_cb (GtkUIManager *ui,
1173                   GtkAction    *action,
1174                   GtkWidget    *proxy,
1175                   glWindow     *window)
1176 {
1177         if (GTK_IS_MENU_ITEM (proxy))
1178         {
1179                 g_signal_connect (proxy, "select",
1180                                   G_CALLBACK (menu_item_select_cb), window);
1181                 g_signal_connect (proxy, "deselect",
1182                                   G_CALLBACK (menu_item_deselect_cb), window);
1183         }
1184 }
1185
1186
1187 /*---------------------------------------------------------------------------*/
1188 /** PRIVATE.  Disconnect proxy callback.                                     */
1189 /*---------------------------------------------------------------------------*/
1190 static void
1191 disconnect_proxy_cb (GtkUIManager *ui,
1192                      GtkAction    *action,
1193                      GtkWidget    *proxy,
1194                      glWindow     *window)
1195 {
1196         if (GTK_IS_MENU_ITEM (proxy))
1197         {
1198                 g_signal_handlers_disconnect_by_func
1199                         (proxy, G_CALLBACK (menu_item_select_cb), window);
1200                 g_signal_handlers_disconnect_by_func
1201                         (proxy, G_CALLBACK (menu_item_deselect_cb), window);
1202         }
1203 }
1204
1205
1206 /*---------------------------------------------------------------------------*/
1207 /** PRIVATE.  Menu item select callback.                                     */
1208 /*---------------------------------------------------------------------------*/
1209 static void
1210 menu_item_select_cb (GtkMenuItem *proxy,
1211                      glWindow    *window)
1212 {
1213         GtkAction *action;
1214         char      *message;
1215
1216         g_return_if_fail (window && GL_IS_WINDOW (window));
1217         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1218
1219         action = g_object_get_data (G_OBJECT (proxy),  "gtk-action");
1220         g_return_if_fail (action != NULL);
1221         
1222         g_object_get (G_OBJECT (action), "tooltip", &message, NULL);
1223         if (message)
1224         {
1225                 gtk_statusbar_push (GTK_STATUSBAR (window->status_bar),
1226                                     window->menu_tips_context_id, message);
1227                 g_free (message);
1228         }
1229 }
1230
1231
1232 /*---------------------------------------------------------------------------*/
1233 /** PRIVATE.  Menu item deselect callback.                                   */
1234 /*---------------------------------------------------------------------------*/
1235 static void
1236 menu_item_deselect_cb (GtkMenuItem *proxy,
1237                        glWindow    *window)
1238 {
1239         g_return_if_fail (window && GL_IS_WINDOW (window));
1240         g_return_if_fail (window->status_bar && GTK_IS_STATUSBAR (window->status_bar));
1241
1242         gtk_statusbar_pop (GTK_STATUSBAR (window->status_bar),
1243                            window->menu_tips_context_id);
1244 }
1245
1246
1247
1248 /*
1249  * Local Variables:       -- emacs
1250  * mode: C                -- emacs
1251  * c-basic-offset: 8      -- emacs
1252  * tab-width: 8           -- emacs
1253  * indent-tabs-mode: nil  -- emacs
1254  * End:                   -- emacs
1255  */