Fixed editor menu reloading.
[midnight-commander.git] / edit / editmenu.c
blobb7bb97ec1efba45c81c1da221b3e7c9fd2850b14
1 /* editor menu definitions and initialisation
3 Copyright (C) 1996, 1998, 2001, 2002, 2003, 2005, 2007
4 Free Software Foundation, Inc.
6 Authors: 1996, 1997 Paul Sheer
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.
24 #include <config.h>
26 #include <stdio.h>
27 #include <stdarg.h>
28 #include <sys/types.h>
29 #ifdef HAVE_UNISTD_H
30 # include <unistd.h>
31 #endif
32 #include <string.h>
33 #include <ctype.h>
34 #include <errno.h>
35 #include <sys/stat.h>
37 #include <stdlib.h>
39 #include "../src/global.h"
41 #include "edit.h"
42 #include "../src/cmd.h" /* save_setup_cmd() */
43 #include "../src/wtools.h" /* query_dialog() */
44 #include "../src/menu.h" /* menu_entry */
45 #include "../src/tty.h" /* KEY_F */
46 #include "../src/key.h" /* XCTRL */
47 #include "../src/main.h" /* drop_menus */
48 #include "../src/learn.h" /* learn_keys */
50 #include "edit-widget.h"
51 #include "editcmddef.h"
53 static void
54 menu_cmd (int command)
56 edit_execute_key_command (wedit, command, -1);
57 edit_update_screen (wedit);
60 static void menu_key (int i)
62 send_message ((Widget *) wedit, WIDGET_KEY, i);
65 static void
66 edit_about_cmd (void)
68 query_dialog (_(" About "),
69 _("\n Cooledit v3.11.5\n\n"
70 " Copyright (C) 1996 the Free Software Foundation\n\n"
71 " A user friendly text editor written\n"
72 " for the Midnight Commander.\n"), D_NORMAL,
73 1, _("&OK"));
76 static void
77 menu_mail_cmd (void)
79 menu_cmd (CK_Mail);
82 static void
83 menu_load_cmd (void)
85 menu_cmd (CK_Load);
88 static void
89 menu_new_cmd (void)
91 menu_cmd (CK_New);
94 static void
95 menu_save_cmd (void)
97 menu_cmd (CK_Save);
100 static void
101 menu_save_as_cmd (void)
103 menu_cmd (CK_Save_As);
106 static void
107 menu_insert_file_cmd (void)
109 menu_cmd (CK_Insert_File);
112 static void
113 menu_quit_cmd (void)
115 menu_cmd (CK_Exit);
118 static void
119 menu_mark_cmd (void)
121 menu_cmd (CK_Mark);
124 static void
125 menu_markcol_cmd (void)
127 menu_cmd (CK_Column_Mark);
130 static void
131 menu_ins_cmd (void)
133 menu_cmd (CK_Toggle_Insert);
136 static void
137 menu_copy_cmd (void)
139 menu_cmd (CK_Copy);
142 static void
143 menu_move_cmd (void)
145 menu_cmd (CK_Move);
148 static void
149 menu_delete_cmd (void)
151 menu_cmd (CK_Remove);
154 static void
155 menu_cut_cmd (void)
157 menu_cmd (CK_Save_Block);
160 static void
161 menu_search_cmd (void)
163 menu_cmd (CK_Find);
166 static void
167 menu_search_again_cmd (void)
169 menu_cmd (CK_Find_Again);
172 static void
173 menu_replace_cmd (void)
175 menu_cmd (CK_Replace);
178 static void
179 menu_begin_record_cmd (void)
181 menu_cmd (CK_Begin_Record_Macro);
184 static void
185 menu_end_record_cmd (void)
187 menu_cmd (CK_End_Record_Macro);
190 static void
191 menu_exec_macro_cmd (void)
193 menu_key (XCTRL ('a'));
196 static void
197 menu_exec_macro_delete_cmd (void)
199 menu_cmd (CK_Delete_Macro);
202 static void
203 menu_c_form_cmd (void)
205 menu_key (KEY_F (19));
208 static void
209 menu_ispell_cmd (void)
211 menu_cmd (CK_Pipe_Block (1));
214 static void
215 menu_sort_cmd (void)
217 menu_cmd (CK_Sort);
220 static void
221 menu_ext_cmd (void)
223 menu_cmd (CK_ExtCmd);
226 static void
227 menu_date_cmd (void)
229 menu_cmd (CK_Date);
232 static void
233 menu_undo_cmd (void)
235 menu_cmd (CK_Undo);
238 static void
239 menu_beginning_cmd (void)
241 menu_cmd (CK_Beginning_Of_Text);
244 static void
245 menu_end_cmd (void)
247 menu_cmd (CK_End_Of_Text);
250 static void
251 menu_refresh_cmd (void)
253 menu_cmd (CK_Refresh);
256 static void
257 menu_goto_line (void)
259 menu_cmd (CK_Goto);
262 static void
263 menu_goto_bracket (void)
265 menu_cmd (CK_Match_Bracket);
268 static void
269 menu_lit_cmd (void)
271 menu_key (XCTRL ('q'));
274 static void
275 menu_format_paragraph (void)
277 menu_cmd (CK_Paragraph_Format);
280 static void
281 menu_options (void)
283 edit_options_dialog ();
286 static void
287 menu_syntax (void)
289 edit_syntax_dialog ();
292 static void
293 menu_user_menu_cmd (void)
295 menu_key (KEY_F (11));
298 static menu_entry FileMenu[] =
300 {' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
301 {' ', N_("&New C-n"), NULL_HOTKEY, menu_new_cmd},
302 {' ', "", NULL_HOTKEY, 0},
303 {' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
304 {' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
305 {' ', "", NULL_HOTKEY, 0},
306 {' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
307 {' ', N_("Copy to &file... C-f"), NULL_HOTKEY, menu_cut_cmd},
308 {' ', "", NULL_HOTKEY, 0},
309 {' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
310 {' ', "", NULL_HOTKEY, 0},
311 {' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
312 {' ', "", NULL_HOTKEY, 0},
313 {' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
316 static menu_entry FileMenuEmacs[] =
318 {' ', N_("&Open file..."), NULL_HOTKEY, menu_load_cmd},
319 {' ', N_("&New C-x k"), NULL_HOTKEY, menu_new_cmd},
320 {' ', "", NULL_HOTKEY, 0},
321 {' ', N_("&Save F2"), NULL_HOTKEY, menu_save_cmd},
322 {' ', N_("Save &as... F12"), NULL_HOTKEY, menu_save_as_cmd},
323 {' ', "", NULL_HOTKEY, 0},
324 {' ', N_("&Insert file... F15"), NULL_HOTKEY, menu_insert_file_cmd},
325 {' ', N_("Copy to &file... "), NULL_HOTKEY, menu_cut_cmd},
326 {' ', "", NULL_HOTKEY, 0},
327 {' ', N_("&User menu... F11"), NULL_HOTKEY, menu_user_menu_cmd},
328 {' ', "", NULL_HOTKEY, 0},
329 {' ', N_("A&bout... "), NULL_HOTKEY, edit_about_cmd},
330 {' ', "", NULL_HOTKEY, 0},
331 {' ', N_("&Quit F10"), NULL_HOTKEY, menu_quit_cmd}
334 static menu_entry EditMenu[] =
336 {' ', N_("&Toggle Mark F3"), NULL_HOTKEY, menu_mark_cmd},
337 {' ', N_("&Mark Columns S-F3"), NULL_HOTKEY, menu_markcol_cmd},
338 {' ', "", NULL_HOTKEY, 0},
339 {' ', N_("Toggle &ins/overw Ins"), NULL_HOTKEY, menu_ins_cmd},
340 {' ', "", NULL_HOTKEY, 0},
341 {' ', N_("&Copy F5"), NULL_HOTKEY, menu_copy_cmd},
342 {' ', N_("&Move F6"), NULL_HOTKEY, menu_move_cmd},
343 {' ', N_("&Delete F8"), NULL_HOTKEY, menu_delete_cmd},
344 {' ', "", NULL_HOTKEY, 0},
345 {' ', N_("&Undo C-u"), NULL_HOTKEY, menu_undo_cmd},
346 {' ', "", NULL_HOTKEY, 0},
347 {' ', N_("&Beginning C-PgUp"), NULL_HOTKEY, menu_beginning_cmd},
348 {' ', N_("&End C-PgDn"), NULL_HOTKEY, menu_end_cmd}
351 #define EditMenuEmacs EditMenu
353 static menu_entry SearReplMenu[] =
355 {' ', N_("&Search... F7"), NULL_HOTKEY, menu_search_cmd},
356 {' ', N_("Search &again F17"), NULL_HOTKEY, menu_search_again_cmd},
357 {' ', N_("&Replace... F4"), NULL_HOTKEY, menu_replace_cmd}
360 #define SearReplMenuEmacs SearReplMenu
362 static menu_entry CmdMenu[] =
364 {' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
365 {' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
366 {' ', "", NULL_HOTKEY, 0},
367 {' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
368 {' ', "", NULL_HOTKEY, 0},
369 {' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
370 {' ', "", NULL_HOTKEY, 0},
371 {' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
372 {' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
373 {' ', N_("&Execute macro... C-a, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
374 {' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
375 {' ', "", NULL_HOTKEY, 0},
376 {' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
377 {' ', "", NULL_HOTKEY, 0},
378 {' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
379 {' ', N_("'ispell' s&pell check C-p"), NULL_HOTKEY, menu_ispell_cmd},
380 {' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
381 {' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
382 {' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
383 {' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
386 static menu_entry CmdMenuEmacs[] =
388 {' ', N_("&Go to line... M-l"), NULL_HOTKEY, menu_goto_line},
389 {' ', N_("Go to matching &bracket M-b"), NULL_HOTKEY, menu_goto_bracket},
390 {' ', "", NULL_HOTKEY, 0},
391 {' ', N_("Insert &literal... C-q"), NULL_HOTKEY, menu_lit_cmd},
392 {' ', "", NULL_HOTKEY, 0},
393 {' ', N_("&Refresh screen C-l"), NULL_HOTKEY, menu_refresh_cmd},
394 {' ', "", NULL_HOTKEY, 0},
395 {' ', N_("&Start record macro C-r"), NULL_HOTKEY, menu_begin_record_cmd},
396 {' ', N_("&Finish record macro... C-r"), NULL_HOTKEY, menu_end_record_cmd},
397 {' ', N_("&Execute macro... C-x e, KEY"), NULL_HOTKEY, menu_exec_macro_cmd},
398 {' ', N_("Delete macr&o... "), NULL_HOTKEY, menu_exec_macro_delete_cmd},
399 {' ', "", NULL_HOTKEY, 0},
400 {' ', N_("Insert &date/time "), NULL_HOTKEY, menu_date_cmd},
401 {' ', "", NULL_HOTKEY, 0},
402 {' ', N_("Format p&aragraph M-p"), NULL_HOTKEY, menu_format_paragraph},
403 {' ', N_("'ispell' s&pell check M-$"), NULL_HOTKEY, menu_ispell_cmd},
404 {' ', N_("Sor&t... M-t"), NULL_HOTKEY, menu_sort_cmd},
405 {' ', N_("Paste o&utput of... M-u"), NULL_HOTKEY, menu_ext_cmd},
406 {' ', N_("E&xternal Formatter F19"), NULL_HOTKEY, menu_c_form_cmd},
407 {' ', N_("&Mail... "), NULL_HOTKEY, menu_mail_cmd}
410 static menu_entry OptMenu[] =
412 {' ', N_("&General... "), NULL_HOTKEY, menu_options},
413 {' ', N_("&Save mode..."), NULL_HOTKEY, menu_save_mode_cmd},
414 {' ', N_("Learn &Keys..."), NULL_HOTKEY, learn_keys},
415 {' ', N_("Syntax &Highlighting..."), NULL_HOTKEY, menu_syntax},
416 {' ', "", NULL_HOTKEY, 0},
417 {' ', N_("Save setu&p..."), NULL_HOTKEY, save_setup_cmd}
420 #define OptMenuEmacs OptMenu
422 #define menu_entries(x) sizeof(x)/sizeof(menu_entry)
424 #define N_menus 5
426 static Menu *EditMenuBar [N_menus];
428 static void
429 edit_init_menu_normal (void)
431 EditMenuBar[0] = create_menu (_(" File "), FileMenu, menu_entries (FileMenu),
432 "[Internal File Editor]");
433 EditMenuBar[1] = create_menu (_(" Edit "), EditMenu, menu_entries (EditMenu),
434 "[Internal File Editor]");
435 EditMenuBar[2] = create_menu (_(" Sear/Repl "), SearReplMenu, menu_entries (SearReplMenu),
436 "[Internal File Editor]");
437 EditMenuBar[3] = create_menu (_(" Command "), CmdMenu, menu_entries (CmdMenu),
438 "[Internal File Editor]");
439 EditMenuBar[4] = create_menu (_(" Options "), OptMenu, menu_entries (OptMenu),
440 "[Internal File Editor]");
443 static void
444 edit_init_menu_emacs (void)
446 EditMenuBar[0] = create_menu (_(" File "), FileMenuEmacs, menu_entries (FileMenuEmacs),
447 "[Internal File Editor]");
448 EditMenuBar[1] = create_menu (_(" Edit "), EditMenuEmacs, menu_entries (EditMenuEmacs),
449 "[Internal File Editor]");
450 EditMenuBar[2] = create_menu (_(" Sear/Repl "), SearReplMenuEmacs, menu_entries (SearReplMenuEmacs),
451 "[Internal File Editor]");
452 EditMenuBar[3] = create_menu (_(" Command "), CmdMenuEmacs, menu_entries (CmdMenuEmacs),
453 "[Internal File Editor]");
454 EditMenuBar[4] = create_menu (_(" Options "), OptMenuEmacs, menu_entries (OptMenuEmacs),
455 "[Internal File Editor]");
458 static void
459 edit_init_menu (void)
461 switch (edit_key_emulation) {
462 default:
463 case EDIT_KEY_EMULATION_NORMAL:
464 edit_init_menu_normal ();
465 break;
466 case EDIT_KEY_EMULATION_EMACS:
467 edit_init_menu_emacs ();
468 break;
472 struct WMenu *
473 edit_create_menu (void)
475 edit_init_menu ();
476 return menubar_new (0, 0, COLS, EditMenuBar, N_menus);
479 void
480 edit_done_menu (struct WMenu *wmenu)
482 int i;
483 for (i = 0; i < N_menus; i++)
484 destroy_menu (wmenu->menu[i]);
488 void
489 edit_reload_menu (void)
491 edit_done_menu (edit_menubar);
492 edit_init_menu ();
493 menubar_arrange (edit_menubar);
497 static void
498 edit_drop_menu_cmd (WEdit *e, int which)
500 if (edit_menubar->active)
501 return;
502 edit_menubar->active = 1;
503 edit_menubar->dropped = drop_menus;
504 if (which >= 0) {
505 edit_menubar->selected = which;
508 edit_menubar->previous_widget = e->widget.parent->current->dlg_id;
509 dlg_select_widget (edit_menubar);
513 void edit_menu_cmd (WEdit * e)
515 edit_drop_menu_cmd (e, -1);
519 int edit_drop_hotkey_menu (WEdit * e, int key)
521 int m = 0;
522 switch (key) {
523 case ALT ('f'):
524 if (edit_key_emulation == EDIT_KEY_EMULATION_EMACS)
525 return 0;
526 m = 0;
527 break;
528 case ALT ('e'):
529 m = 1;
530 break;
531 case ALT ('s'):
532 m = 2;
533 break;
534 case ALT ('c'):
535 m = 3;
536 break;
537 case ALT ('o'):
538 m = 4;
539 break;
540 default:
541 return 0;
544 edit_drop_menu_cmd (e, m);
545 return 1;