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