1 /*
2 * fbmenu.cc
3 *
4 * Copyright (C) 1998 Jiann-Ching Liu
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include "qe_config.h"
11 #include "filebuffer.h"
12 #include "colors.h"
13 #include "messages.h"
14 #include "menu.h"
15
16
17 menu e_menubar;
18 menu c_menubar;
19
init_menu(void)20 void filebuffer::init_menu(void) {
21 e_menubar.add_menu("File"); // c_menubar.add_menu("F)�ɮ�");
22 e_menubar.add_menu("Edit"); // c_menubar.add_menu("E)�s��");
23 e_menubar.add_menu("Mark"); // c_menubar.add_menu("M)�аO");
24 e_menubar.add_menu("Search"); // c_menubar.add_menu("S)�j�M");
25 e_menubar.add_menu("Goto"); // c_menubar.add_menu("G)����");
26 // e_menubar.add_menu("Option"); // c_menubar.add_menu("G)�ﶵ");
27 e_menubar.add_menu("Window"); // c_menubar.add_menu("W)����");
28 e_menubar.add_menu("Help"); // c_menubar.add_menu("H)���U");
29
30 e_menubar.add_item("File", "&Dir (Load file)", &filebuffer::cmd_dir);
31 e_menubar.add_item("File", "", (int (filebuffer::*)(void)) NULL);
32 e_menubar.add_item("File", "&New file", &filebuffer::cmd_new);
33 e_menubar.add_item("File", "&Save file", &filebuffer::cmd_save);
34 e_menubar.add_item("File", "&Quit file (Close file)", &filebuffer::cmd_quit);
35 e_menubar.add_item("File", "", (int (filebuffer::*)(void)) NULL);
36 e_menubar.add_item("File", "&Blankcompress:", &filebuffer::cmd_toggle_blankcompress, &filebuffer::menu_blankcompress);
37 e_menubar.add_item("File", "Dir so&rt by: ", &filebuffer::cmd_toggle_dirsort, &filebuffer::menu_dirsort);
38 e_menubar.add_item("File", "", (int (filebuffer::*)(void)) NULL);
39 e_menubar.add_item("File", "S&hell ...", &filebuffer::cmd_shell);
40 e_menubar.add_item("File", "", (int (filebuffer::*)(void)) NULL);
41 e_menubar.add_item("File", "&Exit QE (save all and quit)", &filebuffer::cmd_save_all_quit);
42 e_menubar.add_item("File", "E&xit QE (quit all without save)", &filebuffer::cmd_quit_all);
43
44 int i = c_menubar.add_menu("F)�ɮ�");
45 c_menubar.add_item(i, "&D)�ؿ��BŪ��", &filebuffer::cmd_dir);
46 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
47 c_menubar.add_item(i, "&N)�s��", &filebuffer::cmd_new);
48 c_menubar.add_item(i, "&S)�s��", &filebuffer::cmd_save);
49 c_menubar.add_item(i, "&Q)����", &filebuffer::cmd_quit);
50 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
51 c_menubar.add_item(i, "&B)�s�ɮɪť����� TAB:", &filebuffer::cmd_toggle_blankcompress, &filebuffer::menu_blankcompress);
52 c_menubar.add_item(i, "&R)DIR �ɱƧǤ覡: ", &filebuffer::cmd_toggle_dirsort, &filebuffer::menu_dirsort);
53 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
54 c_menubar.add_item(i, "&H)���� Shell ...", &filebuffer::cmd_shell);
55 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
56 c_menubar.add_item(i, "&E)���X QE (�����s��)", &filebuffer::cmd_save_all_quit);
57 c_menubar.add_item(i, "&X)���X QE (���s��)", &filebuffer::cmd_quit_all);
58
59
60 e_menubar.add_item("Edit", "&Edit", &filebuffer::cmd_cursor_data);
61 e_menubar.add_item("Edit", "", (int (filebuffer::*)(void)) NULL);
62 e_menubar.add_item("Edit", "Insert Line", &filebuffer::cmd_insertline);
63 e_menubar.add_item("Edit", "Delete Line", &filebuffer::cmd_deleteline);
64 e_menubar.add_item("Edit", "", (int (filebuffer::*)(void)) NULL);
65 e_menubar.add_item("Edit", "Erase Begin Line", &filebuffer::cmd_erase_begin);
66 e_menubar.add_item("Edit", "Erase End Line", &filebuffer::cmd_erase_end);
67 e_menubar.add_item("Edit", "Delete Character", &filebuffer::cmd_delchar);
68 e_menubar.add_item("Edit", "Rubout Character", &filebuffer::cmd_rubout);
69 e_menubar.add_item("Edit", "", (int (filebuffer::*)(void)) NULL);
70 e_menubar.add_item("Edit", "Split", &filebuffer::cmd_split);
71 e_menubar.add_item("Edit", "Join", &filebuffer::cmd_join);
72
73 i = c_menubar.add_menu("E)�s��");
74
75 c_menubar.add_item(i, "&E)�s��", &filebuffer::cmd_cursor_data);
76 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
77 c_menubar.add_item(i, "?)���J�@��", &filebuffer::cmd_insertline);
78 c_menubar.add_item(i, "?)�R������", &filebuffer::cmd_deleteline);
79 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
80 c_menubar.add_item(i, "?)�R����Х��䪺�r", &filebuffer::cmd_erase_begin);
81 c_menubar.add_item(i, "?)�R����Хk�䪺�r", &filebuffer::cmd_erase_end);
82 c_menubar.add_item(i, "?)�R���@�Ӧr��", &filebuffer::cmd_delchar);
83 c_menubar.add_item(i, "?)�˰h�@�Ӥl��", &filebuffer::cmd_rubout);
84 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
85 c_menubar.add_item(i, "?)����", &filebuffer::cmd_split);
86 c_menubar.add_item(i, "?)����U�@��", &filebuffer::cmd_join);
87
88 e_menubar.add_item("Mark", "Mark &Line", &filebuffer::cmd_markline);
89 e_menubar.add_item("Mark", "Mark &Block", &filebuffer::cmd_markblock);
90 e_menubar.add_item("Mark", "&Un mark", &filebuffer::cmd_unmark);
91 e_menubar.add_item("Mark", "", (int (filebuffer::*)(void)) NULL);
92 e_menubar.add_item("Mark", "&Copy Mark", &filebuffer::cmd_copymark);
93 e_menubar.add_item("Mark", "O&verlay Block", &filebuffer::cmd_overlayblock);
94 e_menubar.add_item("Mark", "&Move Mark", &filebuffer::cmd_movemark);
95 e_menubar.add_item("Mark", "&Delete Mark", &filebuffer::cmd_deletemark);
96 e_menubar.add_item("Mark", "&Push mark", &filebuffer::cmd_pushmark);
97 e_menubar.add_item("Mark", "P&op mark", &filebuffer::cmd_popmark);
98 e_menubar.add_item("Mark", "Clear mar&k", &filebuffer::cmd_clear_marks);
99 e_menubar.add_item("Mark", "", (int (filebuffer::*)(void)) NULL);
100 e_menubar.add_item("Mark", "&Shift Left", &filebuffer::cmd_shiftleft);
101 e_menubar.add_item("Mark", "Shift &Right", &filebuffer::cmd_shiftright);
102 e_menubar.add_item("Mark", "&Fill mark", &filebuffer::cmd_fillmark);
103 e_menubar.add_item("Mark", "Uppercase", &filebuffer::cmd_uppercase);
104 e_menubar.add_item("Mark", "Lowercase", &filebuffer::cmd_lowercase);
105
106 i = c_menubar.add_menu("M)�аO");
107 c_menubar.add_item(i, "&L)�榡�аO", &filebuffer::cmd_markline);
108 c_menubar.add_item(i, "&B)�϶����аO", &filebuffer::cmd_markblock);
109 c_menubar.add_item(i, "&U)�����аO", &filebuffer::cmd_unmark);
110 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
111 c_menubar.add_item(i, "&C)�ƻs�аO��", &filebuffer::cmd_copymark);
112 c_menubar.add_item(i, "&V)�ƻ\\�аO��", &filebuffer::cmd_overlayblock);
113 c_menubar.add_item(i, "&M)�h���аO��", &filebuffer::cmd_movemark);
114 c_menubar.add_item(i, "&D)�R���аO��", &filebuffer::cmd_deletemark);
115 c_menubar.add_item(i, "&P)��i���|", &filebuffer::cmd_pushmark);
116 c_menubar.add_item(i, "&O)�q���|�����X", &filebuffer::cmd_popmark);
117 c_menubar.add_item(i, "&K)�M�����|", &filebuffer::cmd_clear_marks);
118 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
119 c_menubar.add_item(i, "&S)�V�� Shift", &filebuffer::cmd_shiftleft);
120 c_menubar.add_item(i, "&R)�V�k Shift", &filebuffer::cmd_shiftright);
121 c_menubar.add_item(i, "&F)��J�аO��", &filebuffer::cmd_fillmark);
122 c_menubar.add_item(i, "?)�ন�j�g", &filebuffer::cmd_uppercase);
123 c_menubar.add_item(i, "?)�ন�p�g", &filebuffer::cmd_lowercase);
124
125 e_menubar.add_item("Search", "&Find ...", &filebuffer::cmd_search);
126 e_menubar.add_item("Search", "", (int (filebuffer::*)(void)) NULL);
127 e_menubar.add_item("Search", "&Search case: ", &filebuffer::cmd_toggle_searchcase, &filebuffer::menu_searchcase);
128
129 i = c_menubar.add_menu("S)�j�M");
130 c_menubar.add_item(i, "&F)�M�� ...", &filebuffer::cmd_search);
131 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
132 c_menubar.add_item(i, "&S)�j�M�ɤj�p�g: ", &filebuffer::cmd_toggle_searchcase, &filebuffer::menu_searchcase);
133
134 e_menubar.add_item("Goto", "Cursor &Command", &filebuffer::cmd_cursor_cmd);
135 e_menubar.add_item("Goto", "Cursor &Data", &filebuffer::cmd_cursor_data);
136 e_menubar.add_item("Goto", "", (int (filebuffer::*)(void)) NULL);
137 e_menubar.add_item("Goto", "&Goto ....", &filebuffer::cmd_gotoline);
138 e_menubar.add_item("Goto", "", (int (filebuffer::*)(void)) NULL);
139 e_menubar.add_item("Goto", "&Begin of file", &filebuffer::cmd_top);
140 e_menubar.add_item("Goto", "&End of file", &filebuffer::cmd_bottom);
141 e_menubar.add_item("Goto", "", (int (filebuffer::*)(void)) NULL);
142 e_menubar.add_item("Goto", "&Top of screen", &filebuffer::cmd_top_edge);
143 e_menubar.add_item("Goto", "B&ottom of screen", &filebuffer::cmd_bottom_edge);
144 e_menubar.add_item("Goto", "", (int (filebuffer::*)(void)) NULL);
145 e_menubar.add_item("Goto", "Be&gin of mark", &filebuffer::cmd_beginmark);
146 e_menubar.add_item("Goto", "End of &mark", &filebuffer::cmd_endmark);
147 e_menubar.add_item("Goto", "", (int (filebuffer::*)(void)) NULL);
148 e_menubar.add_item("Goto", "Begin of line", &filebuffer::cmd_beginline);
149 e_menubar.add_item("Goto", "End of line", &filebuffer::cmd_endline);
150
151 i = c_menubar.add_menu("G)����");
152 c_menubar.add_item(i, "&C)��и��ܩR�O�C", &filebuffer::cmd_cursor_cmd);
153 c_menubar.add_item(i, "&D)��и��ܸ�ư�", &filebuffer::cmd_cursor_data);
154 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
155 c_menubar.add_item(i, "&B)�ɮ}�Y", &filebuffer::cmd_top);
156 c_menubar.add_item(i, "&E)�ɮ���", &filebuffer::cmd_bottom);
157 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
158 c_menubar.add_item(i, "&T)�ù��Ĥ@��", &filebuffer::cmd_top_edge);
159 c_menubar.add_item(i, "&O)�ù�����", &filebuffer::cmd_bottom_edge);
160 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
161 c_menubar.add_item(i, "&G)�аO�ҩl", &filebuffer::cmd_beginmark);
162 c_menubar.add_item(i, "&M)�аO����", &filebuffer::cmd_endmark);
163 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
164 c_menubar.add_item(i, "?)�檺�}�l", &filebuffer::cmd_beginline);
165 c_menubar.add_item(i, "?)���", &filebuffer::cmd_endline);
166
167
168 e_menubar.add_item("Window", "&Next file", &filebuffer::cmd_edit);
169 e_menubar.add_item("Window", "", (int (filebuffer::*)(void)) NULL);
170 // e_menubar.add_item("Window", "&English Mode", &filebuffer::cmd_lang_english);
171 // e_menubar.add_item("Window", "&Chinese Mode", &filebuffer::cmd_lang_big5);
172 e_menubar.add_item("Window", "&Language: ", &filebuffer::cmd_lang_big5, &filebuffer::menu_language);
173 e_menubar.add_item("Window", "", (int (filebuffer::*)(void)) NULL);
174 // e_menubar.add_item("Window", "&Insert Mode", &filebuffer::cmd_insert_mode);
175 // e_menubar.add_item("Window", "&Replace Mode", &filebuffer::cmd_replace_mode);
176 e_menubar.add_item("Window", "&Input Mode: ", &filebuffer::cmd_insert_toggle, &filebuffer::menu_inputmode);
177 e_menubar.add_item("Window", "", (int (filebuffer::*)(void)) NULL);
178 e_menubar.add_item("Window", "Command &History", &filebuffer::cmd_history);
179 e_menubar.add_item("Window", "History &Key: ", &filebuffer::cmd_toggle_historykey, &filebuffer::menu_historykey);
180
181 i = c_menubar.add_menu("W)����");
182 c_menubar.add_item(i, "&N)�U���ɮ�", &filebuffer::cmd_edit);
183 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
184 // c_menubar.add_item(i, "&E)nglish �^��Ҧ�", &filebuffer::cmd_lang_english);
185 // c_menubar.add_item(i, "&C)hinese ����Ҧ�", &filebuffer::cmd_lang_big5);
186 c_menubar.add_item(i, "&L)anguage: ", &filebuffer::cmd_lang_english, &filebuffer::menu_language);
187 c_menubar.add_item(i, "&I)��J�Ҧ�: ", &filebuffer::cmd_insert_toggle, &filebuffer::menu_inputmode);
188 // c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
189 // c_menubar.add_item(i, "&I)���J�Ҧ�", &filebuffer::cmd_insert_mode);
190 // c_menubar.add_item(i, "&R)���N�Ҧ�", &filebuffer::cmd_replace_mode);
191 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
192 c_menubar.add_item(i, "&H)�R�O�C�����v�O��", &filebuffer::cmd_history);
193 c_menubar.add_item(i, "&K)�s�X���v�O������: ", &filebuffer::cmd_toggle_historykey, &filebuffer::menu_historykey);
194
195 e_menubar.add_item("Help", "&About ...", &filebuffer::cmd_about);
196 e_menubar.add_item("Help", "", (int (filebuffer::*)(void)) NULL);
197 e_menubar.add_item("Help", "&Help ...", &filebuffer::cmd_help);
198
199 i = c_menubar.add_menu("H)���U");
200 c_menubar.add_item(i, "&A)���� ...", &filebuffer::cmd_about);
201 c_menubar.add_item(i, "", (int (filebuffer::*)(void)) NULL);
202 c_menubar.add_item(i, "&H)�D�U ...", &filebuffer::cmd_help);
203 }
204
cmd_menu(void)205 int filebuffer::cmd_menu(void) {
206 int rtnval = 0;
207
208 write_workbuffer(QE_IF_NECESSARY);
209
210 do {
211 display_messages(MSG_MENU_USAGE);
212
213 keep_in_menu = MENU_IN_MENU;
214
215 if (big5msg_flag == 1) {
216 rtnval = c_menubar.active(win, screen_y, screen_x, this);
217 } else {
218 rtnval = e_menubar.active(win, screen_y, screen_x, this);
219 }
220 } while (keep_in_menu == MENU_KEEP_IN_MENU);
221
222 if (keep_in_menu == MENU_IN_MENU) keep_in_menu = MENU_NOT_IN_MENU;
223
224 // display_messages();
225
226 return rtnval;
227 }
228
229 static char mbuf[50];
230
menu_inputmode(const char * str)231 char *filebuffer::menu_inputmode(const char *str) {
232 if (input_mode == 1) {
233 sprintf(mbuf, "%s %s", str, (big5msg_flag == 1) ? "���J" : "Insert");
234 } else {
235 sprintf(mbuf, "%s %s", str, (big5msg_flag == 1) ? "�л\\" : "Replace");
236 }
237 return mbuf;
238 }
239
menu_blankcompress(const char * str)240 char *filebuffer::menu_blankcompress(const char *str) {
241 if (blank_compress == 1) {
242 sprintf(mbuf, "%s %s", str, "on");
243 } else {
244 sprintf(mbuf, "%s %s", str, "off");
245 }
246 return mbuf;
247 }
248
menu_historykey(const char * str)249 char *filebuffer::menu_historykey(const char *str) {
250 if (history_key == HISTORY_KEY_NONE) {
251 sprintf(mbuf, "%s%s", str, "NONE");
252 } else if (history_key == HISTORY_KEY_UP) {
253 sprintf(mbuf, "%s%s", str, "UP");
254 } else if (history_key == HISTORY_KEY_DOWN) {
255 sprintf(mbuf, "%s%s", str, "DOWN");
256 } else if (history_key == HISTORY_KEY_BOTH) {
257 sprintf(mbuf, "%s%s", str, "BOTH");
258 }
259 return mbuf;
260 }
261
menu_dirsort(const char * str)262 char *filebuffer::menu_dirsort(const char *str) {
263 if (dir_sort == DIR_SORT_BY_NAME) {
264 sprintf(mbuf, "%s%s", str, big5msg_flag ? "�ɮצW��" : "NAME");
265 } else if (dir_sort == DIR_SORT_BY_TIME) {
266 sprintf(mbuf, "%s%s", str, big5msg_flag ? "�ɮɶ�" : "TIME");
267 } else if (dir_sort == DIR_SORT_BY_SIZE) {
268 sprintf(mbuf, "%s%s", str, big5msg_flag ? "�ɮפj�p" : "SIZE");
269 }
270 return mbuf;
271 }
272
menu_searchcase(const char * str)273 char *filebuffer::menu_searchcase(const char *str) {
274 if (search_case == 1) {
275 sprintf(mbuf, "%s%s", str, big5msg_flag ? "�Ϥ�" : "EXACT");
276 } else {
277 sprintf(mbuf, "%s%s", str, big5msg_flag ? "���Ϥ�" : "ANY");
278 }
279 return mbuf;
280 }
281
menu_language(const char * str)282 char *filebuffer::menu_language(const char *str) {
283 if (big5msg_flag == 1) {
284 sprintf(mbuf, "%s%s", str, "ENGLISH");
285 } else {
286 sprintf(mbuf, "%s%s", str, "CHINESE");
287 }
288 return mbuf;
289 }
290