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