1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2012 Hiroyuki Yamamoto
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19 
20 #ifndef __MENU_H__
21 #define __MENU_H__
22 
23 #include <glib.h>
24 #include <gtk/gtkwidget.h>
25 #include <gtk/gtkitemfactory.h>
26 #include <gtk/gtkmenu.h>
27 #include <gtk/gtkmenushell.h>
28 #include <gtk/gtkoptionmenu.h>
29 #include <gtk/gtkimagemenuitem.h>
30 #include <gtk/gtkradiomenuitem.h>
31 
32 #define MENU_VAL_ID "Sylpheed::Menu::ValueID"
33 
34 #define MENUITEM_ADD(menu, menuitem, label, data)			\
35 {									\
36 	if (label)							\
37 		menuitem = gtk_menu_item_new_with_label(label);		\
38 	else {								\
39 		menuitem = gtk_menu_item_new();				\
40 		gtk_widget_set_sensitive(menuitem, FALSE);		\
41 	}								\
42 	gtk_widget_show(menuitem);					\
43 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		\
44 	if (data)							\
45 		g_object_set_data(G_OBJECT(menuitem),			\
46 				  MENU_VAL_ID,				\
47 				  GINT_TO_POINTER(data));		\
48 }
49 
50 #define MENUITEM_ADD_WITH_MNEMONIC(menu, menuitem, label, data)		\
51 {									\
52 	if (label)							\
53 		menuitem = gtk_menu_item_new_with_mnemonic(label);	\
54 	else {								\
55 		menuitem = gtk_menu_item_new();				\
56 		gtk_widget_set_sensitive(menuitem, FALSE);		\
57 	}								\
58 	gtk_widget_show(menuitem);					\
59 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		\
60 	if (data)							\
61 		g_object_set_data(G_OBJECT(menuitem),			\
62 				  MENU_VAL_ID,				\
63 				  GINT_TO_POINTER(data));		\
64 }
65 
66 #define MENUITEM_ADD_FROM_STOCK(menu, menuitem, label, data)		\
67 {									\
68 	if (label)							\
69 		menuitem = gtk_image_menu_item_new_from_stock(label, NULL); \
70 	else {								\
71 		menuitem = gtk_menu_item_new();				\
72 		gtk_widget_set_sensitive(menuitem, FALSE);		\
73 	}								\
74 	gtk_widget_show(menuitem);					\
75 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		\
76 	if (data)							\
77 		g_object_set_data(G_OBJECT(menuitem),			\
78 				  MENU_VAL_ID,				\
79 				  GINT_TO_POINTER(data));		\
80 }
81 
82 #define MENUITEM_ADD_RADIO(menu, menuitem, widget, label, data)		\
83 {									\
84 	if (label) {							\
85 		if (widget)						\
86 			menuitem = gtk_radio_menu_item_new_with_mnemonic_from_widget \
87 				(GTK_RADIO_MENU_ITEM(widget), label);	\
88 		else							\
89 			menuitem = gtk_radio_menu_item_new_with_mnemonic \
90 				(NULL, label);				\
91 	} else {							\
92 		menuitem = gtk_menu_item_new();				\
93 		gtk_widget_set_sensitive(menuitem, FALSE);		\
94 	}								\
95 	gtk_widget_show(menuitem);					\
96 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		\
97 	if (data)							\
98 		g_object_set_data(G_OBJECT(menuitem),			\
99 				  MENU_VAL_ID,				\
100 				  GINT_TO_POINTER(data));		\
101 }
102 
103 #define menu_set_insensitive_all(menu_shell) \
104 	menu_set_sensitive_all(menu_shell, FALSE);
105 
106 GtkWidget *menubar_create	(GtkWidget		*window,
107 				 GtkItemFactoryEntry	*entries,
108 				 guint			 n_entries,
109 				 const gchar		*path,
110 				 gpointer		 data);
111 GtkWidget *menu_create_items	(GtkItemFactoryEntry	*entries,
112 				 guint			 n_entries,
113 				 const gchar		*path,
114 				 GtkItemFactory	       **factory,
115 				 gpointer		 data);
116 
117 GString *menu_factory_get_rc	(const gchar		*path);
118 void menu_factory_clear_rc	(const gchar		*rc_str);
119 void menu_factory_copy_rc	(const gchar		*src_path,
120 				 const gchar		*dest_path);
121 
122 void menu_set_sensitive		(GtkItemFactory		*ifactory,
123 				 const gchar		*path,
124 				 gboolean		 sensitive);
125 void menu_set_sensitive_all	(GtkMenuShell		*menu_shell,
126 				 gboolean		 sensitive);
127 
128 void menu_set_active		(GtkItemFactory		*ifactory,
129 				 const gchar		*path,
130 				 gboolean		 is_active);
131 
132 void menu_button_position	(GtkMenu		*menu,
133 				 gint			*x,
134 				 gint			*y,
135 				 gboolean		*push_in,
136 				 gpointer		 user_data);
137 void menu_widget_position	(GtkMenu		*menu,
138 				 gint			*x,
139 				 gint			*y,
140 				 gboolean		*push_in,
141 				 gpointer		 user_data);
142 
143 gint menu_find_option_menu_index(GtkOptionMenu		*optmenu,
144 				 gpointer		 data,
145 				 GCompareFunc		 func);
146 
147 gint menu_get_option_menu_active_index
148 				(GtkOptionMenu		*optmenu);
149 
150 #endif /* __MENU_H__ */
151