Revert second bunch of mhl patches (see 9b9cab58749217101ab16504a77efb301812cfbf)
[midnight-commander.git] / edit / editmenu.c
blob6a3e0da8e8128c5df65a910aaf2b68e166b481c8
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>
36 #include <stdlib.h>
38 #include <mhl/memory.h>
40 #include "../src/global.h"
42 #include "edit.h"
43 #include "../src/cmd.h" /* save_setup_cmd() */
44 #include "../src/wtools.h" /* query_dialog() */
45 #include "../src/menu.h" /* menu_entry */
46 #include "../src/tty.h" /* KEY_F */
47 #include "../src/key.h" /* XCTRL */
48 #include "../src/main.h" /* drop_menus */
49 #include "../src/learn.h" /* learn_keys */
51 #include "edit-widget.h"
52 #include "editcmddef.h"
54 static void
55 menu_cmd (int command)
57 edit_execute_key_command (wedit, command, -1);
58 edit_update_screen (wedit);
61 static void menu_key (int i)
63 send_message ((Widget *) wedit, WIDGET_KEY, i);
66 static void
67 edit_about_cmd (void)
69 query_dialog (_(" About "),
70 _("\n Cooledit v3.11.5\n\n"
71 " Copyright (C) 1996 the Free Software Foundation\n\n"
72 " A user friendly text editor written\n"
73 " for the Midnight Commander.\n"), D_NORMAL,
74 1, _("&OK"));
77 static void
78 menu_mail_cmd (void)
80 menu_cmd (CK_Mail);
83 static void
84 menu_load_cmd (void)
86 menu_cmd (CK_Load);
89 static void
90 menu_new_cmd (void)
92 menu_cmd (CK_New);
95 static void
96 menu_save_cmd (void)
98 menu_cmd (CK_Save);
101 static void
102 menu_save_as_cmd (void)
104 menu_cmd (CK_Save_As);
107 static void
108 menu_insert_file_cmd (void)
110 menu_cmd (CK_Insert_File);
113 static void
114 menu_quit_cmd (void)
116 menu_cmd (CK_Exit);
119 static void
120 menu_mark_cmd (void)
122 menu_cmd (CK_Mark);
125 static void
126 menu_markcol_cmd (void)
128 menu_cmd (CK_Column_Mark);
131 static void
132 menu_ins_cmd (void)
134 menu_cmd (CK_Toggle_Insert);
137 static void
138 menu_copy_cmd (void)
140 menu_cmd (CK_Copy);
143 static void
144 menu_move_cmd (void)
146 menu_cmd (CK_Move);
149 static void
150 menu_delete_cmd (void)
152 menu_cmd (CK_Remove);
155 static void
156 menu_cut_cmd (void)
158 menu_cmd (CK_Save_Block);
161 static void
162 menu_search_cmd (void)
164 menu_cmd (CK_Find);
167 static void
168 menu_search_again_cmd (void)
170 menu_cmd (CK_Find_Again);
173 static void
174 menu_replace_cmd (void)
176 menu_cmd (CK_Replace);
179 static void
180 menu_begin_record_cmd (void)
182 menu_cmd (CK_Begin_Record_Macro);
185 static void
186 menu_end_record_cmd (void)
188 menu_cmd (CK_End_Record_Macro);
191 static void
192 menu_exec_macro_cmd (void)
194 menu_key (XCTRL ('a'));
197 static void
198 menu_exec_macro_delete_cmd (void)
200 menu_cmd (CK_Delete_Macro);
203 static void
204 menu_c_form_cmd (void)
206 menu_key (KEY_F (19));
209 static void
210 menu_ispell_cmd (void)
212 menu_cmd (CK_Pipe_Block (1));
215 static void
216 menu_sort_cmd (void)
218 menu_cmd (CK_Sort);
221 static void
222 menu_ext_cmd (void)
224 menu_cmd (CK_ExtCmd);
227 static void
228 menu_date_cmd (void)
230 menu_cmd (CK_Date);
233 static void
234 menu_undo_cmd (void)
236 menu_cmd (CK_Undo);
239 static void
240 menu_beginning_cmd (void)
242 menu_cmd (CK_Beginning_Of_Text);
245 static void
246 menu_end_cmd (void)
248 menu_cmd (CK_End_Of_Text);
251 static void
252 menu_refresh_cmd (void)
254 menu_cmd (CK_Refresh);
257 static void
258 menu_goto_line (void)
260 menu_cmd (CK_Goto);
263 static void
264 menu_goto_bracket (void)
266 menu_cmd (CK_Match_Bracket);
269 static void
270 menu_lit_cmd (void)
272 menu_key (XCTRL ('q'));
275 static void
276 menu_format_paragraph (void)
278 menu_cmd (CK_Paragraph_Format);
281 static void
282 menu_options (void)
284 edit_options_dialog ();
287 static void
288 menu_syntax (void)
290 edit_syntax_dialog ();
293 static void
294 menu_user_menu_cmd (void)
296 menu_key (KEY_F (11));
299 static menu_entry FileMenu[] =
301 {' ', N_("&Open file..."), 'O', menu_load_cmd},
302 {' ', N_("&New C-n"), 'N', menu_new_cmd},
303 {' ', "", ' ', 0},
304 {' ', N_("&Save F2"), 'S', menu_save_cmd},
305 {' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
306 {' ', "", ' ', 0},
307 {' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
308 {' ', N_("Copy to &file... C-f"), 'F', menu_cut_cmd},
309 {' ', "", ' ', 0},
310 {' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
311 {' ', "", ' ', 0},
312 {' ', N_("A&bout... "), 'B', edit_about_cmd},
313 {' ', "", ' ', 0},
314 {' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
317 static menu_entry FileMenuEmacs[] =
319 {' ', N_("&Open file..."), 'O', menu_load_cmd},
320 {' ', N_("&New C-x k"), 'N', menu_new_cmd},
321 {' ', "", ' ', 0},
322 {' ', N_("&Save F2"), 'S', menu_save_cmd},
323 {' ', N_("Save &as... F12"), 'A', menu_save_as_cmd},
324 {' ', "", ' ', 0},
325 {' ', N_("&Insert file... F15"), 'I', menu_insert_file_cmd},
326 {' ', N_("Copy to &file... "), 'F', menu_cut_cmd},
327 {' ', "", ' ', 0},
328 {' ', N_("&User menu... F11"), 'U', menu_user_menu_cmd},
329 {' ', "", ' ', 0},
330 {' ', N_("A&bout... "), 'B', edit_about_cmd},
331 {' ', "", ' ', 0},
332 {' ', N_("&Quit F10"), 'Q', menu_quit_cmd}
335 static menu_entry EditMenu[] =
337 {' ', N_("&Toggle Mark F3"), 'T', menu_mark_cmd},
338 {' ', N_("&Mark Columns S-F3"), 'T', menu_markcol_cmd},
339 {' ', "", ' ', 0},
340 {' ', N_("Toggle &ins/overw Ins"), 'I', menu_ins_cmd},
341 {' ', "", ' ', 0},
342 {' ', N_("&Copy F5"), 'C', menu_copy_cmd},
343 {' ', N_("&Move F6"), 'M', menu_move_cmd},
344 {' ', N_("&Delete F8"), 'D', menu_delete_cmd},
345 {' ', "", ' ', 0},
346 {' ', N_("&Undo C-u"), 'U', menu_undo_cmd},
347 {' ', "", ' ', 0},
348 {' ', N_("&Beginning C-PgUp"), 'B', menu_beginning_cmd},
349 {' ', N_("&End C-PgDn"), 'E', menu_end_cmd}
352 #define EditMenuEmacs EditMenu
354 static menu_entry SearReplMenu[] =
356 {' ', N_("&Search... F7"), 'S', menu_search_cmd},
357 {' ', N_("Search &again F17"), 'A', menu_search_again_cmd},
358 {' ', N_("&Replace... F4"), 'R', menu_replace_cmd}
361 #define SearReplMenuEmacs SearReplMenu
363 static menu_entry CmdMenu[] =
365 {' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
366 {' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
367 {' ', "", ' ', 0},
368 {' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
369 {' ', "", ' ', 0},
370 {' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
371 {' ', "", ' ', 0},
372 {' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
373 {' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
374 {' ', N_("&Execute macro... C-a, KEY"), 'E', menu_exec_macro_cmd},
375 {' ', N_("Delete macr&o... "), 'O', menu_exec_macro_delete_cmd},
376 {' ', "", ' ', 0},
377 {' ', N_("Insert &date/time "), 'D', menu_date_cmd},
378 {' ', "", ' ', 0},
379 {' ', N_("Format p&aragraph M-p"), 'A', menu_format_paragraph},
380 {' ', N_("'ispell' s&pell check C-p"), 'P', menu_ispell_cmd},
381 {' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
382 {' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
383 {' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
384 {' ', N_("&Mail... "), 'M', menu_mail_cmd}
387 static menu_entry CmdMenuEmacs[] =
389 {' ', N_("&Go to line... M-l"), 'G', menu_goto_line},
390 {' ', N_("Go to matching &bracket M-b"), 'B', menu_goto_bracket},
391 {' ', "", ' ', 0},
392 {' ', N_("Insert &literal... C-q"), 'L', menu_lit_cmd},
393 {' ', "", ' ', 0},
394 {' ', N_("&Refresh screen C-l"), 'R', menu_refresh_cmd},
395 {' ', "", ' ', 0},
396 {' ', N_("&Start record macro C-r"), 'S', menu_begin_record_cmd},
397 {' ', N_("&Finish record macro... C-r"), 'F', menu_end_record_cmd},
398 {' ', N_("&Execute macro... C-x e, KEY"), 'E', menu_exec_macro_cmd},
399 {' ', N_("Delete macr&o... "), 'o', menu_exec_macro_delete_cmd},
400 {' ', "", ' ', 0},
401 {' ', N_("Insert &date/time "), 'D', menu_date_cmd},
402 {' ', "", ' ', 0},
403 {' ', N_("Format p&aragraph M-p"), 'a', menu_format_paragraph},
404 {' ', N_("'ispell' s&pell check M-$"), 'P', menu_ispell_cmd},
405 {' ', N_("Sor&t... M-t"), 'T', menu_sort_cmd},
406 {' ', N_("Paste o&utput of... M-u"), 'U', menu_ext_cmd},
407 {' ', N_("E&xternal Formatter F19"), 'C', menu_c_form_cmd},
408 {' ', N_("&Mail... "), 'M', menu_mail_cmd}
411 static menu_entry OptMenu[] =
413 {' ', N_("&General... "), 'G', menu_options},
414 {' ', N_("&Save mode..."), 'S', menu_save_mode_cmd},
415 {' ', N_("Learn &Keys..."), 'K', learn_keys},
416 {' ', N_("Syntax &Highlighting..."), 'H', menu_syntax},
417 {' ', "", ' ', 0},
418 {' ', N_("Save setu&p..."), 'p', save_setup_cmd}
421 #define OptMenuEmacs OptMenu
423 #define menu_entries(x) sizeof(x)/sizeof(menu_entry)
425 static void
426 edit_init_menu_normal (struct Menu *EditMenuBar[])
428 EditMenuBar[0] = create_menu (_(" File "), FileMenu, menu_entries (FileMenu),
429 "[Internal File Editor]");
430 EditMenuBar[1] = create_menu (_(" Edit "), EditMenu, menu_entries (EditMenu),
431 "[Internal File Editor]");
432 EditMenuBar[2] = create_menu (_(" Sear/Repl "), SearReplMenu, menu_entries (SearReplMenu),
433 "[Internal File Editor]");
434 EditMenuBar[3] = create_menu (_(" Command "), CmdMenu, menu_entries (CmdMenu),
435 "[Internal File Editor]");
436 EditMenuBar[4] = create_menu (_(" Options "), OptMenu, menu_entries (OptMenu),
437 "[Internal File Editor]");
440 static void
441 edit_init_menu_emacs (struct Menu *EditMenuBar[])
443 EditMenuBar[0] = create_menu (_(" File "), FileMenuEmacs, menu_entries (FileMenuEmacs),
444 "[Internal File Editor]");
445 EditMenuBar[1] = create_menu (_(" Edit "), EditMenuEmacs, menu_entries (EditMenuEmacs),
446 "[Internal File Editor]");
447 EditMenuBar[2] = create_menu (_(" Sear/Repl "), SearReplMenuEmacs, menu_entries (SearReplMenuEmacs),
448 "[Internal File Editor]");
449 EditMenuBar[3] = create_menu (_(" Command "), CmdMenuEmacs, menu_entries (CmdMenuEmacs),
450 "[Internal File Editor]");
451 EditMenuBar[4] = create_menu (_(" Options "), OptMenuEmacs, menu_entries (OptMenuEmacs),
452 "[Internal File Editor]");
455 struct WMenu *
456 edit_init_menu (void)
458 struct Menu **EditMenuBar = g_new(struct Menu *, N_menus);
460 switch (edit_key_emulation) {
461 default:
462 case EDIT_KEY_EMULATION_NORMAL:
463 edit_init_menu_normal (EditMenuBar);
464 break;
465 case EDIT_KEY_EMULATION_EMACS:
466 edit_init_menu_emacs (EditMenuBar);
467 break;
469 return menubar_new (0, 0, COLS, EditMenuBar, N_menus);
472 void
473 edit_done_menu (struct WMenu *wmenu)
475 int i;
476 for (i = 0; i < N_menus; i++)
477 destroy_menu (wmenu->menu[i]);
479 mhl_mem_free(wmenu->menu);
483 void
484 edit_reload_menu (void)
486 struct WMenu *new_edit_menubar;
488 new_edit_menubar = edit_init_menu ();
489 dlg_replace_widget (&edit_menubar->widget, &new_edit_menubar->widget);
490 edit_done_menu (edit_menubar);
491 edit_menubar = new_edit_menubar;
495 static void
496 edit_drop_menu_cmd (WEdit *e, int which)
498 if (edit_menubar->active)
499 return;
500 edit_menubar->active = 1;
501 edit_menubar->dropped = drop_menus;
502 if (which >= 0) {
503 edit_menubar->selected = which;
506 edit_menubar->previous_widget = e->widget.parent->current->dlg_id;
507 dlg_select_widget (edit_menubar);
511 void edit_menu_cmd (WEdit * e)
513 edit_drop_menu_cmd (e, -1);
517 int edit_drop_hotkey_menu (WEdit * e, int key)
519 int m = 0;
520 switch (key) {
521 case ALT ('f'):
522 if (edit_key_emulation == EDIT_KEY_EMULATION_EMACS)
523 return 0;
524 m = 0;
525 break;
526 case ALT ('e'):
527 m = 1;
528 break;
529 case ALT ('s'):
530 m = 2;
531 break;
532 case ALT ('c'):
533 m = 3;
534 break;
535 case ALT ('o'):
536 m = 4;
537 break;
538 default:
539 return 0;
542 edit_drop_menu_cmd (e, m);
543 return 1;