root/src/editor/editmenu.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. create_file_menu
  2. create_edit_menu
  3. create_search_replace_menu
  4. create_command_menu
  5. create_format_menu
  6. create_window_menu
  7. create_options_menu
  8. edit_drop_menu_cmd
  9. edit_init_menu
  10. edit_menu_cmd
  11. edit_drop_hotkey_menu

   1 /*
   2    Editor menu definitions and initialisation
   3 
   4    Copyright (C) 1996-2025
   5    Free Software Foundation, Inc.
   6 
   7    Written by:
   8    Paul Sheer, 1996, 1997
   9    Andrew Borodin <aborodin@vmail.ru> 2012
  10 
  11    This file is part of the Midnight Commander.
  12 
  13    The Midnight Commander is free software: you can redistribute it
  14    and/or modify it under the terms of the GNU General Public License as
  15    published by the Free Software Foundation, either version 3 of the License,
  16    or (at your option) any later version.
  17 
  18    The Midnight Commander is distributed in the hope that it will be useful,
  19    but WITHOUT ANY WARRANTY; without even the implied warranty of
  20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21    GNU General Public License for more details.
  22 
  23    You should have received a copy of the GNU General Public License
  24    along with this program.  If not, see <https://www.gnu.org/licenses/>.
  25  */
  26 
  27 /** \file
  28  *  \brief Source: editor menu definitions and initialisation
  29  *  \author Paul Sheer
  30  *  \date 1996, 1997
  31  */
  32 
  33 #include <config.h>
  34 
  35 #include <stdio.h>
  36 #include <stdarg.h>
  37 #include <sys/types.h>
  38 #include <unistd.h>
  39 #include <string.h>
  40 #include <ctype.h>
  41 #include <sys/stat.h>
  42 #include <stdlib.h>
  43 
  44 #include "lib/global.h"
  45 
  46 #include "lib/tty/key.h"  // ALT
  47 #include "lib/widget.h"
  48 
  49 #include "src/setup.h"  // drop_menus
  50 
  51 #include "edit-impl.h"
  52 #include "editwidget.h"
  53 
  54 /*** global variables ****************************************************************************/
  55 
  56 /*** file scope macro definitions ****************************************************************/
  57 
  58 /*** file scope type declarations ****************************************************************/
  59 
  60 /*** forward declarations (file scope functions) *************************************************/
  61 
  62 /*** file scope variables ************************************************************************/
  63 
  64 /* --------------------------------------------------------------------------------------------- */
  65 /*** file scope functions ************************************************************************/
  66 /* --------------------------------------------------------------------------------------------- */
  67 
  68 static GList *
  69 create_file_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  70 {
  71     GList *entries = NULL;
  72 
  73     entries = g_list_prepend (entries, menu_entry_new (_ ("&Open file..."), CK_EditFile));
  74     entries = g_list_prepend (entries, menu_entry_new (_ ("&New"), CK_EditNew));
  75     entries = g_list_prepend (entries, menu_entry_new (_ ("&Close"), CK_Close));
  76     entries = g_list_prepend (entries, menu_entry_new (_ ("&History..."), CK_History));
  77     entries = g_list_prepend (entries, menu_separator_new ());
  78     entries = g_list_prepend (entries, menu_entry_new (_ ("&Save"), CK_Save));
  79     entries = g_list_prepend (entries, menu_entry_new (_ ("Save &as..."), CK_SaveAs));
  80     entries = g_list_prepend (entries, menu_separator_new ());
  81     entries = g_list_prepend (entries, menu_entry_new (_ ("&Insert file..."), CK_InsertFile));
  82     entries = g_list_prepend (entries, menu_entry_new (_ ("Cop&y to file..."), CK_BlockSave));
  83     entries = g_list_prepend (entries, menu_separator_new ());
  84     entries = g_list_prepend (entries, menu_entry_new (_ ("&User menu..."), CK_UserMenu));
  85     entries = g_list_prepend (entries, menu_separator_new ());
  86     entries = g_list_prepend (entries, menu_entry_new (_ ("A&bout..."), CK_About));
  87     entries = g_list_prepend (entries, menu_separator_new ());
  88     entries = g_list_prepend (entries, menu_entry_new (_ ("&Quit"), CK_Quit));
  89 
  90     return g_list_reverse (entries);
  91 }
  92 
  93 /* --------------------------------------------------------------------------------------------- */
  94 
  95 static GList *
  96 create_edit_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
  97 {
  98     GList *entries = NULL;
  99 
 100     entries = g_list_prepend (entries, menu_entry_new (_ ("&Undo"), CK_Undo));
 101     entries = g_list_prepend (entries, menu_entry_new (_ ("&Redo"), CK_Redo));
 102     entries = g_list_prepend (entries, menu_separator_new ());
 103     entries =
 104         g_list_prepend (entries, menu_entry_new (_ ("&Toggle ins/overw"), CK_InsertOverwrite));
 105     entries = g_list_prepend (entries, menu_separator_new ());
 106     entries = g_list_prepend (entries, menu_entry_new (_ ("To&ggle mark"), CK_Mark));
 107     entries = g_list_prepend (entries, menu_entry_new (_ ("&Mark columns"), CK_MarkColumn));
 108     entries = g_list_prepend (entries, menu_entry_new (_ ("Mark &all"), CK_MarkAll));
 109     entries = g_list_prepend (entries, menu_entry_new (_ ("Unmar&k"), CK_Unmark));
 110     entries = g_list_prepend (entries, menu_separator_new ());
 111     entries = g_list_prepend (entries, menu_entry_new (_ ("Cop&y"), CK_Copy));
 112     entries = g_list_prepend (entries, menu_entry_new (_ ("Mo&ve"), CK_Move));
 113     entries = g_list_prepend (entries, menu_entry_new (_ ("&Delete"), CK_Remove));
 114     entries = g_list_prepend (entries, menu_separator_new ());
 115     entries = g_list_prepend (entries, menu_entry_new (_ ("Co&py to clipfile"), CK_Store));
 116     entries = g_list_prepend (entries, menu_entry_new (_ ("&Cut to clipfile"), CK_Cut));
 117     entries = g_list_prepend (entries, menu_entry_new (_ ("Pa&ste from clipfile"), CK_Paste));
 118     entries = g_list_prepend (entries, menu_separator_new ());
 119     entries = g_list_prepend (entries, menu_entry_new (_ ("&Beginning"), CK_Top));
 120     entries = g_list_prepend (entries, menu_entry_new (_ ("&End"), CK_Bottom));
 121 
 122     return g_list_reverse (entries);
 123 }
 124 
 125 /* --------------------------------------------------------------------------------------------- */
 126 
 127 static GList *
 128 create_search_replace_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 129 {
 130     GList *entries = NULL;
 131 
 132     entries = g_list_prepend (entries, menu_entry_new (_ ("&Search..."), CK_Search));
 133     entries = g_list_prepend (entries, menu_entry_new (_ ("Search &again"), CK_SearchContinue));
 134     entries = g_list_prepend (entries, menu_entry_new (_ ("&Replace..."), CK_Replace));
 135     entries = g_list_prepend (entries, menu_separator_new ());
 136     entries = g_list_prepend (entries, menu_entry_new (_ ("&Toggle bookmark"), CK_Bookmark));
 137     entries = g_list_prepend (entries, menu_entry_new (_ ("&Next bookmark"), CK_BookmarkNext));
 138     entries = g_list_prepend (entries, menu_entry_new (_ ("&Prev bookmark"), CK_BookmarkPrev));
 139     entries = g_list_prepend (entries, menu_entry_new (_ ("&Flush bookmarks"), CK_BookmarkFlush));
 140 
 141     return g_list_reverse (entries);
 142 }
 143 
 144 /* --------------------------------------------------------------------------------------------- */
 145 
 146 static GList *
 147 create_command_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 148 {
 149     GList *entries = NULL;
 150 
 151     entries = g_list_prepend (entries, menu_entry_new (_ ("&Go to line..."), CK_Goto));
 152     entries = g_list_prepend (entries, menu_entry_new (_ ("&Toggle line state"), CK_ShowNumbers));
 153     entries =
 154         g_list_prepend (entries, menu_entry_new (_ ("Go to matching &bracket"), CK_MatchBracket));
 155     entries = g_list_prepend (entries,
 156                               menu_entry_new (_ ("Toggle s&yntax highlighting"), CK_SyntaxOnOff));
 157     entries = g_list_prepend (entries, menu_separator_new ());
 158     entries = g_list_prepend (entries, menu_entry_new (_ ("&Find declaration"), CK_Find));
 159     entries = g_list_prepend (entries, menu_entry_new (_ ("Back from &declaration"), CK_FilePrev));
 160     entries = g_list_prepend (entries, menu_entry_new (_ ("For&ward to declaration"), CK_FileNext));
 161 #ifdef HAVE_CHARSET
 162     entries = g_list_prepend (entries, menu_separator_new ());
 163     entries = g_list_prepend (entries, menu_entry_new (_ ("Encod&ing..."), CK_SelectCodepage));
 164 #endif
 165     entries = g_list_prepend (entries, menu_separator_new ());
 166     entries = g_list_prepend (entries, menu_entry_new (_ ("&Refresh screen"), CK_Refresh));
 167     entries = g_list_prepend (entries, menu_separator_new ());
 168     entries = g_list_prepend (
 169         entries, menu_entry_new (_ ("&Start/Stop record macro"), CK_MacroStartStopRecord));
 170     entries = g_list_prepend (entries, menu_entry_new (_ ("Delete macr&o..."), CK_MacroDelete));
 171     entries = g_list_prepend (
 172         entries, menu_entry_new (_ ("Record/Repeat &actions"), CK_RepeatStartStopRecord));
 173     entries = g_list_prepend (entries, menu_separator_new ());
 174 #ifdef HAVE_ASPELL
 175     if (strcmp (spell_language, "NONE") != 0)
 176     {
 177         entries = g_list_prepend (entries, menu_entry_new (_ ("S&pell check"), CK_SpellCheck));
 178         entries =
 179             g_list_prepend (entries, menu_entry_new (_ ("C&heck word"), CK_SpellCheckCurrentWord));
 180         entries = g_list_prepend (
 181             entries, menu_entry_new (_ ("Change spelling &language..."), CK_SpellCheckSelectLang));
 182         entries = g_list_prepend (entries, menu_separator_new ());
 183     }
 184 #endif
 185     entries = g_list_prepend (entries, menu_entry_new (_ ("&Mail..."), CK_EditMail));
 186 
 187     return g_list_reverse (entries);
 188 }
 189 
 190 /* --------------------------------------------------------------------------------------------- */
 191 
 192 static GList *
 193 create_format_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 194 {
 195     GList *entries = NULL;
 196 
 197     entries = g_list_prepend (entries, menu_entry_new (_ ("Insert &literal..."), CK_InsertLiteral));
 198     entries = g_list_prepend (entries, menu_entry_new (_ ("Insert &date/time"), CK_Date));
 199     entries = g_list_prepend (entries, menu_separator_new ());
 200     entries =
 201         g_list_prepend (entries, menu_entry_new (_ ("&Format paragraph"), CK_ParagraphFormat));
 202     entries = g_list_prepend (entries, menu_entry_new (_ ("&Sort..."), CK_Sort));
 203     entries =
 204         g_list_prepend (entries, menu_entry_new (_ ("&Paste output of..."), CK_ExternalCommand));
 205     entries =
 206         g_list_prepend (entries, menu_entry_new (_ ("&External formatter"), CK_PipeBlock (0)));
 207 
 208     return g_list_reverse (entries);
 209 }
 210 
 211 /* --------------------------------------------------------------------------------------------- */
 212 /**
 213  * Create the 'window' popup menu
 214  */
 215 
 216 static GList *
 217 create_window_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 218 {
 219     GList *entries = NULL;
 220 
 221     entries = g_list_prepend (entries, menu_entry_new (_ ("&Move"), CK_WindowMove));
 222     entries = g_list_prepend (entries, menu_entry_new (_ ("&Resize"), CK_WindowResize));
 223     entries =
 224         g_list_prepend (entries, menu_entry_new (_ ("&Toggle fullscreen"), CK_WindowFullscreen));
 225     entries = g_list_prepend (entries, menu_separator_new ());
 226     entries = g_list_prepend (entries, menu_entry_new (_ ("&Next"), CK_WindowNext));
 227     entries = g_list_prepend (entries, menu_entry_new (_ ("&Previous"), CK_WindowPrev));
 228     entries = g_list_prepend (entries, menu_entry_new (_ ("&List..."), CK_WindowList));
 229 
 230     return g_list_reverse (entries);
 231 }
 232 
 233 /* --------------------------------------------------------------------------------------------- */
 234 
 235 static GList *
 236 create_options_menu (void)
     /* [previous][next][first][last][top][bottom][index][help]  */
 237 {
 238     GList *entries = NULL;
 239 
 240     entries = g_list_prepend (entries, menu_entry_new (_ ("&General..."), CK_Options));
 241     entries = g_list_prepend (entries, menu_entry_new (_ ("Save &mode..."), CK_OptionsSaveMode));
 242     entries = g_list_prepend (entries, menu_entry_new (_ ("Learn &keys..."), CK_LearnKeys));
 243     entries =
 244         g_list_prepend (entries, menu_entry_new (_ ("Syntax &highlighting..."), CK_SyntaxChoose));
 245     entries = g_list_prepend (entries, menu_separator_new ());
 246     entries = g_list_prepend (entries, menu_entry_new (_ ("S&yntax file"), CK_EditSyntaxFile));
 247     entries = g_list_prepend (entries, menu_entry_new (_ ("&Menu file"), CK_EditUserMenu));
 248     entries = g_list_prepend (entries, menu_separator_new ());
 249     entries = g_list_prepend (entries, menu_entry_new (_ ("&Save setup"), CK_SaveSetup));
 250 
 251     return g_list_reverse (entries);
 252 }
 253 
 254 /* --------------------------------------------------------------------------------------------- */
 255 
 256 static void
 257 edit_drop_menu_cmd (WDialog *h, int which)
     /* [previous][next][first][last][top][bottom][index][help]  */
 258 {
 259     WMenuBar *menubar;
 260 
 261     menubar = menubar_find (h);
 262     menubar_activate (menubar, drop_menus, which);
 263 }
 264 
 265 /* --------------------------------------------------------------------------------------------- */
 266 /*** public functions ****************************************************************************/
 267 /* --------------------------------------------------------------------------------------------- */
 268 
 269 void
 270 edit_init_menu (WMenuBar *menubar)
     /* [previous][next][first][last][top][bottom][index][help]  */
 271 {
 272     menubar_add_menu (menubar,
 273                       menu_new (_ ("&File"), create_file_menu (), "[Internal File Editor]"));
 274     menubar_add_menu (menubar,
 275                       menu_new (_ ("&Edit"), create_edit_menu (), "[Internal File Editor]"));
 276     menubar_add_menu (
 277         menubar, menu_new (_ ("&Search"), create_search_replace_menu (), "[Internal File Editor]"));
 278     menubar_add_menu (menubar,
 279                       menu_new (_ ("&Command"), create_command_menu (), "[Internal File Editor]"));
 280     menubar_add_menu (menubar,
 281                       menu_new (_ ("For&mat"), create_format_menu (), "[Internal File Editor]"));
 282     menubar_add_menu (menubar,
 283                       menu_new (_ ("&Window"), create_window_menu (), "[Internal File Editor]"));
 284     menubar_add_menu (menubar,
 285                       menu_new (_ ("&Options"), create_options_menu (), "[Internal File Editor]"));
 286 }
 287 
 288 /* --------------------------------------------------------------------------------------------- */
 289 
 290 void
 291 edit_menu_cmd (WDialog *h)
     /* [previous][next][first][last][top][bottom][index][help]  */
 292 {
 293     edit_drop_menu_cmd (h, -1);
 294 }
 295 
 296 /* --------------------------------------------------------------------------------------------- */
 297 
 298 gboolean
 299 edit_drop_hotkey_menu (WDialog *h, int key)
     /* [previous][next][first][last][top][bottom][index][help]  */
 300 {
 301     int m = 0;
 302     switch (key)
 303     {
 304     case ALT ('f'):
 305         m = 0;
 306         break;
 307     case ALT ('e'):
 308         m = 1;
 309         break;
 310     case ALT ('s'):
 311         m = 2;
 312         break;
 313     case ALT ('c'):
 314         m = 3;
 315         break;
 316     case ALT ('m'):
 317         m = 4;
 318         break;
 319     case ALT ('w'):
 320         m = 5;
 321         break;
 322     case ALT ('o'):
 323         m = 6;
 324         break;
 325     default:
 326         return FALSE;
 327     }
 328 
 329     edit_drop_menu_cmd (h, m);
 330     return TRUE;
 331 }
 332 
 333 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */