1 /*
2  *  Leafpad - GTK+ based simple text editor
3  *  Copyright (C) 2004-2005 Tarot Osuji
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 #include "leafpad.h"
21 #include <gdk/gdkkeysyms.h>
22 
23 static GtkWidget *menu_item_save;
24 static GtkWidget *menu_item_cut;
25 static GtkWidget *menu_item_copy;
26 static GtkWidget *menu_item_paste;
27 static GtkWidget *menu_item_delete;
28 
29 static GtkItemFactoryEntry menu_items[] =
30 {
31 	{ N_("/_File"), NULL,
32 		NULL, 0, "<Branch>" },
33 	{ N_("/File/_New"), "<control>N",
34 		G_CALLBACK(on_file_new), 0, "<StockItem>", GTK_STOCK_NEW },
35 	{ N_("/File/_Open..."), "<control>O",
36 		G_CALLBACK(on_file_open), 0, "<StockItem>", GTK_STOCK_OPEN },
37 	{ N_("/File/_Save"), "<control>S",
38 		G_CALLBACK(on_file_save), 0, "<StockItem>", GTK_STOCK_SAVE },
39 	{ N_("/File/Save _As..."), "<shift><control>S",
40 		G_CALLBACK(on_file_save_as), 0, "<StockItem>", GTK_STOCK_SAVE_AS },
41 	{ "/File/---", NULL,
42 		NULL, 0, "<Separator>" },
43 #ifdef ENABLE_PRINT
44 #	if GTK_CHECK_VERSION(2, 10, 0)
45 	{ N_("/File/Print Pre_view"), "<shift><control>P",
46 		G_CALLBACK(on_file_print_preview), 0, "<StockItem>", GTK_STOCK_PRINT_PREVIEW },
47 #	endif
48 	{ N_("/File/_Print..."), "<control>P",
49 		G_CALLBACK(on_file_print), 0, "<StockItem>", GTK_STOCK_PRINT },
50 #	if GTK_CHECK_VERSION(2, 10, 0)
51 	{ "/File/---", NULL,
52 		NULL, 0, "<Separator>" },
53 #	endif
54 #endif
55 	{ N_("/File/_Quit"), "<control>Q",
56 		G_CALLBACK(on_file_quit), 0, "<StockItem>", GTK_STOCK_QUIT },
57 	{ N_("/_Edit"),	 NULL,
58 		NULL, 0, "<Branch>" },
59 	{ N_("/Edit/_Undo"), "<control>Z",
60 		G_CALLBACK(on_edit_undo), 0, "<StockItem>", GTK_STOCK_UNDO },
61 	{ N_("/Edit/_Redo"), "<shift><control>Z",
62 		G_CALLBACK(on_edit_redo), 0, "<StockItem>", GTK_STOCK_REDO },
63 	{ "/Edit/---", NULL,
64 		NULL, 0, "<Separator>" },
65 	{ N_("/Edit/Cu_t"), "<control>X",
66 		G_CALLBACK(on_edit_cut), 0, "<StockItem>", GTK_STOCK_CUT },
67 	{ N_("/Edit/_Copy"), "<control>C",
68 		G_CALLBACK(on_edit_copy), 0, "<StockItem>", GTK_STOCK_COPY },
69 	{ N_("/Edit/_Paste"), "<control>V",
70 		G_CALLBACK(on_edit_paste), 0, "<StockItem>", GTK_STOCK_PASTE },
71 	{ N_("/Edit/_Delete"), NULL,
72 		G_CALLBACK(on_edit_delete), 0, "<StockItem>", GTK_STOCK_DELETE },
73 	{ "/Edit/---", NULL,
74 		NULL, 0, "<Separator>" },
75 	{ N_("/Edit/Select _All"), "<control>A",
76 		G_CALLBACK(on_edit_select_all), 0 },
77 	{ N_("/_Search"),	 NULL,
78 		NULL, 0, "<Branch>" },
79 	{ N_("/Search/_Find..."), "<control>F",
80 		G_CALLBACK(on_search_find), 0, "<StockItem>", GTK_STOCK_FIND },
81 	{ N_("/Search/Find _Next"), "<control>G",
82 		G_CALLBACK(on_search_find_next), 0 },
83 	{ N_("/Search/Find _Previous"), "<shift><control>G",
84 		G_CALLBACK(on_search_find_previous), 0 },
85 	{ N_("/Search/_Replace..."), "<control>H",
86 		G_CALLBACK(on_search_replace), 0, "<StockItem>", GTK_STOCK_FIND_AND_REPLACE },
87 	{ "/Search/---", NULL,
88 		NULL, 0, "<Separator>" },
89 	{ N_("/Search/_Jump To..."), "<control>J",
90 		G_CALLBACK(on_search_jump_to), 0, "<StockItem>", GTK_STOCK_JUMP_TO },
91 	{ N_("/_Options"), NULL,
92 		NULL, 0, "<Branch>" },
93 	{ N_("/Options/_Font..."), NULL,
94 		G_CALLBACK(on_option_font), 0, "<StockItem>", GTK_STOCK_SELECT_FONT },
95 	{ N_("/Options/_Word Wrap"), NULL,
96 		G_CALLBACK(on_option_word_wrap), 0, "<CheckItem>" },
97 	{ N_("/Options/_Line Numbers"), NULL,
98 		G_CALLBACK(on_option_line_numbers), 0, "<CheckItem>" },
99 	{ "/Options/---", NULL,
100 		NULL, 0, "<Separator>" },
101 	{ N_("/Options/_Auto Indent"), NULL,
102 		G_CALLBACK(on_option_auto_indent), 0, "<CheckItem>" },
103 	{ N_("/_Help"), NULL,
104 		NULL, 0, "<Branch>" },
105 	{ N_("/Help/_About"), NULL,
106 #if GTK_CHECK_VERSION(2, 6, 0)
107 		G_CALLBACK(on_help_about), 0, "<StockItem>", GTK_STOCK_ABOUT },
108 #else
109 		G_CALLBACK(on_help_about), 0, "<StockItem>", "my-gtk-about" },
110 #endif
111 };
112 
113 static gint nmenu_items = sizeof(menu_items) / sizeof(GtkItemFactoryEntry);
114 
menu_translate(const gchar * path,gpointer data)115 static gchar *menu_translate(const gchar *path, gpointer data)
116 {
117 	gchar *str;
118 
119 	str = (gchar *)_(path);
120 
121 	return str;
122 }
123 
menu_sensitivity_from_modified_flag(gboolean is_text_modified)124 void menu_sensitivity_from_modified_flag(gboolean is_text_modified)
125 {
126 	gtk_widget_set_sensitive(menu_item_save,   is_text_modified);
127 }
128 
menu_sensitivity_from_selection_bound(gboolean is_bound_exist)129 void menu_sensitivity_from_selection_bound(gboolean is_bound_exist)
130 {
131 	gtk_widget_set_sensitive(menu_item_cut,    is_bound_exist);
132 	gtk_widget_set_sensitive(menu_item_copy,   is_bound_exist);
133 	gtk_widget_set_sensitive(menu_item_delete, is_bound_exist);
134 }
135 
136 //void menu_sensitivity_from_clipboard(gboolean is_clipboard_exist)
menu_sensitivity_from_clipboard(void)137 void menu_sensitivity_from_clipboard(void)
138 {
139 //g_print("clip board checked.\n");
140 	gtk_widget_set_sensitive(menu_item_paste,
141 		gtk_clipboard_wait_is_text_available(
142 			gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));
143 }
144 
create_menu_bar(GtkWidget * window)145 GtkWidget *create_menu_bar(GtkWidget *window)
146 {
147 	GtkAccelGroup *accel_group;
148 	GtkItemFactory *ifactory;
149 	gboolean flag_emacs = FALSE;
150 
151 	gchar *key_theme = NULL;
152 	GtkSettings *settings = gtk_settings_get_default();
153 	if (settings) {
154 		g_object_get(settings, "gtk-key-theme-name", &key_theme, NULL);
155 		if (key_theme) {
156 			if (!g_ascii_strcasecmp(key_theme, "Emacs"))
157 				flag_emacs = TRUE;
158 			g_free(key_theme);
159 		}
160 	}
161 
162 	accel_group = gtk_accel_group_new();
163 	ifactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
164 	gtk_item_factory_set_translate_func(ifactory, menu_translate, NULL, NULL);
165 	gtk_item_factory_create_items(ifactory, nmenu_items, menu_items, NULL);
166 	gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
167 
168 	/* hidden keybinds */
169 	gtk_accel_group_connect(
170 		accel_group, GDK_W, GDK_CONTROL_MASK, 0,
171 		g_cclosure_new_swap(G_CALLBACK(on_file_close), NULL, NULL));
172 	gtk_accel_group_connect(
173 		accel_group, GDK_T, GDK_CONTROL_MASK, 0,
174 		g_cclosure_new_swap(G_CALLBACK(on_option_always_on_top), NULL, NULL));
175 	gtk_widget_add_accelerator(
176 		gtk_item_factory_get_widget(ifactory, "/Edit/Redo"),
177 		"activate", accel_group, GDK_Y, GDK_CONTROL_MASK, 0);
178 	gtk_widget_add_accelerator(
179 		gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
180 		"activate", accel_group, GDK_F3, 0, 0);
181 	gtk_widget_add_accelerator(
182 		gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
183 		"activate", accel_group, GDK_F3, GDK_SHIFT_MASK, 0);
184 	gtk_widget_add_accelerator(
185 		gtk_item_factory_get_widget(ifactory, "/Search/Replace..."),
186 		"activate", accel_group, GDK_R, GDK_CONTROL_MASK, 0);
187 
188 	/* initialize sensitivities */
189 	gtk_widget_set_sensitive(
190 		gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
191 		FALSE);
192 	gtk_widget_set_sensitive(
193 		gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
194 		FALSE);
195 
196 	menu_item_save   = gtk_item_factory_get_widget(ifactory, "/File/Save");
197 	menu_item_cut    = gtk_item_factory_get_widget(ifactory, "/Edit/Cut");
198 	menu_item_copy   = gtk_item_factory_get_widget(ifactory, "/Edit/Copy");
199 	menu_item_paste  = gtk_item_factory_get_widget(ifactory, "/Edit/Paste");
200 	menu_item_delete = gtk_item_factory_get_widget(ifactory, "/Edit/Delete");
201 	menu_sensitivity_from_selection_bound(FALSE);
202 
203 	return gtk_item_factory_get_widget(ifactory, "<main>");
204 }
205