diff options
author | Tzafrir Cohen <tzafrir@cohens.org.il> | 2012-09-07 15:14:04 +0300 |
---|---|---|
committer | Tzafrir Cohen <tzafrir@cohens.org.il> | 2012-09-07 15:14:04 +0300 |
commit | d4d16198c2924b1085258c0b6562b562c7df3c29 (patch) | |
tree | d160aabd972fee403621b84cf1fc7848e98d45b9 /menus.cc |
geresh 0.6.3geresh-0.6.3upstream
Diffstat (limited to 'menus.cc')
-rw-r--r-- | menus.cc | 798 |
1 files changed, 798 insertions, 0 deletions
diff --git a/menus.cc b/menus.cc new file mode 100644 index 0000000..369343c --- /dev/null +++ b/menus.cc @@ -0,0 +1,798 @@ +// Copyright (C) 2003 Mooffie <mooffie@typo.co.il> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + +#include <config.h> + +#if HAVE_DIRENT_H +# include <dirent.h> // for population the 'color scheme' sub menu. +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include <sys/ndir.h> +# endif +# if HAVE_SYS_DIR_H +# include <sys/dir.h> +# endif +# if HAVE_NDIR_H +# include <ndir.h> +# endif +#endif +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <algorithm> // sort + +#include "io.h" // get_cfg_filename +#include "pathnames.h" +#include "menus.h" + +#define STT_AUTOINDENT 1001 +#define STT_AUTOJUSTIFY 1002 +#define STT_ALTKBD 1003 +#define STT_SMRT 1004 +#define STT_ARABICSHAPING 1005 +#define STT_FORMATMARKS 1006 +#define STT_CURSORREPORT 1007 +#define STT_SPELLERLOADED 1008 +#define STT_READONLY 1009 +#define STT_BIGCURSOR 1010 +#define STT_GRAPHBOXES 1011 +#define STT_KEYFORKEYUNDO 1012 +#define STT_BIDI 1013 +#define STT_UNDERLINE 1014 +#define STT_SYNAUTO 1015 + +#define STT_EOPUNIX 5001 +#define STT_EOPDOS 5002 +#define STT_EOPMAC 5003 +#define STT_EOPUNICODE 5004 + +#define STT_RTLNSMASCII 5010 +#define STT_RTLNSMASIS 5011 +#define STT_RTLNSMHIDE 5012 + +#define STT_MQFASCII 5020 +#define STT_MQFHIGHLIGHT 5021 +#define STT_MQFASIS 5022 + +#define STT_WRAPWSPACE 5030 +#define STT_WRAPBREAK 5031 +#define STT_WRAPOFF 5032 + +#define STT_DIRALGOUNICODE 5040 +#define STT_DIRALGOCTXSTRNG 5041 +#define STT_DIRALGOCTXRTL 5042 +#define STT_DIRALGOFLTR 5043 +#define STT_DIRALGOFRTL 5044 + +#define STT_SCRLBRNONE 5060 +#define STT_SCRLBRLEFT 5061 +#define STT_SCRLBRRIGHT 5062 + +#define STT_SYNNONE 5070 +#define STT_SYNHTML 5071 +#define STT_SYNEMAIL 5072 + +#define STT_CRSVIS 5080 +#define STT_CRSLOG 5081 + +#define STT_THEME_START 6000 +#define STT_THEME_END 6999 + +#define CMD_CHR 100 +#define CMD_CRSVIS 101 +#define CMD_CRSLOG 102 +#define CMD_SETTHEME 103 +#define CMD_SETFLAG 104 +#define CMD_ENC 105 +#define CMD_INTERACTIVEENC 106 + +#define CMD_HELP 120 + +#define FLAG_FILE_ENCODING 1 +#define FLAG_DEFAULT_ENCODING 2 + +#define HELP_ITEM N_("Get a detailed explanation for the above") + +#define HELP_TOPIC_ALGO_STR "\xD7\x90\xD7\x9C\xD7\x92\xD7\x95\xD7\xA8\xD7\x99\xD7\xAA\xD7\x9D\x20\xD7\x9C\xD7\xA7\xD7\x91\xD7\x99\xD7\xA2\xD7" +#define HELP_TOPIC_POINTS_STR "\xD7\xA0\xD7\x99\xD7\xA7\xD7\x95\xD7\x93\x20\xD7\xA2\xD7\x91\xD7\xA8\xD7\x99" +#define HELP_TOPIC_MAQAF_STR "\xD7\x9E\xD7\xA7\xD7\xA3" +#define HELP_TOPIC_EOL_STR "\xD7\xA1\xD7\x95\xD7\xA4\xD7\x99\x20\xD7\xA9\xD7\x95\xD7\xA8\xD7\x95\xD7\xAA" +#define HELP_TOPIC_CRSLV_STR "\xD7\xAA\xD7\xA0\xD7\x95\xD7\xA2\xD7\xAA\x20\xD7\xA1\xD7\x9E\xD7\x9F" +#define HELP_TOPIC_SYNHLT_STR "\xD7\xA6\xD7\x91\xD7\x99\xD7\xA2\xD7\x94\x20\xD7\xAA\xD7\x97\xD7\x91\xD7\x99\xD7\xA8\xD7\x99\xD7\xAA" +#define HELP_TOPIC_WRAP_STR "\xD7\xA7\xD7\x99\xD7\xA4\xD7\x95\xD7\x9C\x20\xD7\xA4\xD7\xA1\xD7\xA7\xD7\x90\xD7\x95\xD7\xAA" +#define HELP_TOPIC_COLORS_STR "\xD7\xA2\xD7\xA8\xD7\x9B\xD7\x95\xD7\xAA\x20\xD7\xA6\xD7\x91\xD7\xA2\xD7\x99\xD7\x9D" +#define HELP_TOPIC_ENCODING_STR "\xD7\xA7\xD7\x99\xD7\x93\xD7\x95\xD7\x93\x20\xD7\x94\xD7\xA7\xD7\x91\xD7\xA6\xD7\x99\xD7\x9D" +#define HELP_TOPIC_EXTED_STR "\xD7\x94\xD7\xA4\xD7\xA2\xD7\x9C\xD7\xAA\x20\xD7\xA2\xD7\x95\xD7\xA8\xD7\x9A\x20\xD7\x97\xD7\x99\xD7\xA6\xD7\x95\xD7\xA0\xD7\x99" + +PulldownMenu FileMenu = { + { "load_file", N_("~Open...") }, + { "insert_file", N_("~Insert file...") }, + { "-----------" }, + { "save_file", N_("~Save") }, + { "save_file_as", N_("Save ~As...") }, + { "write_selection_to_file", N_("~Write selection to...") }, + { "-----------" }, + { "external_edit_prompt", N_("Launch external ~editor...") }, + { "external_edit_no_prompt", N_("Launch external editor") }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_EXTED_STR }, + { "-----------" }, + { "change_directory", N_("Ch~dir...") }, + { "quit", N_("~Quit") }, + { NULL } +}; + +PulldownMenu MovementMenu = { + { "move_beginning_of_buffer", N_("Move to the ~beginning of the buffer") }, + { "move_end_of_buffer", N_("Move to the ~end of the buffer") }, + { "go_to_line", N_("Go to a specific ~line") }, + { "move_last_modification", N_("Jump to the last ~modification point") }, + { "-----------" }, + { "key_left", N_("Move a character left") }, + { "key_right", N_("Move a character right") }, + { "move_previous_line", N_("Move to the previous line") }, + { "move_next_line", N_("Move to the next line") }, + { "move_backward_page", N_("Move to the previous page") }, + { "move_forward_page", N_("Move to the next page") }, + { "move_backward_char", N_("Move back a character") }, + { "move_forward_char", N_("Move forward a character") }, + //{ "move_beginning_of_line", N_("Move to the beginning of the current line") }, + { "key_home", N_("Move to the beginning of the current line") }, + { "move_end_of_line", N_("Move to the end of the current line") }, + { NULL } +}; + +PulldownMenu DeletionMenu = { + { "delete_backward_char", N_("Delete the previous character") }, + { "delete_forward_char", N_("Delete the character the cursor is on") }, + { "delete_backward_word", N_("Delete to the start of the current or previous word") }, + { "delete_forward_word", N_("Delete to the end of the current or next word") }, + { "delete_paragraph", N_("Delete the current paragraph") }, + { "cut_end_of_paragraph", N_("Cut [to] end of paragraph") }, + { NULL } +}; + +PulldownMenu EditMenu = { + { "undo", N_("~Undo") }, + { "redo", N_("~Redo") }, + { "toggle_key_for_key_undo", N_("Toggle ~key-for-key undo"), STT_KEYFORKEYUNDO }, + { "-----------" }, + { "copy", N_("~Copy") }, + { "cut", N_("Cu~t") }, + { "paste",N_("~Paste") }, + { "toggle_primary_mark", N_("Start/cancel selection") }, + { "-----------" }, + { "", N_("~Movement"), 0, MovementMenu }, + { "", N_("~Deletion"), 0, DeletionMenu }, + { "toggle_read_only", N_("Toggle read-only status of buffer"), STT_READONLY }, + { "-----------" }, + { "search_forward", N_("~Search...") }, + { "search_forward_next", N_("Search ~next") }, + { "-----------" }, + { "toggle_auto_justify", N_("Toggle auto-~justify"), STT_AUTOJUSTIFY }, + { "justify", N_("Justify the current or next paragraph") }, + { "change_justification_column", N_("Change justify column...") }, + { "-----------" }, + { "toggle_auto_indent", N_("Toggle auto-~indent"), STT_AUTOINDENT }, + { "change_tab_width", N_("Change the TAB character size...") }, + { NULL } +}; + +PulldownMenu EolMenu = { + { "set_eops_unix", N_("~Unix (LF)"), STT_EOPUNIX }, + { "set_eops_dos", N_("~DOS/Windows (CR,LF)"), STT_EOPDOS }, + { "set_eops_mac", N_("~Macintosh (CR)"), STT_EOPMAC }, + { "set_eops_unicode", N_("U~nicode PS (U+2029)"), STT_EOPUNICODE }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_EOL_STR }, + { NULL } +}; + +#define ICONVREQ N_("(requires iconv)") + +PulldownMenu CyrillicEncodingsMenu = { + { "xxx", N_("(Cyrillic) ~Windows-1251"), 0, 0, CMD_ENC, 0, "CP1251", ICONVREQ }, + { "xxx", N_("(Cyrillic) ~ISO-8859-5"), 0, 0, CMD_ENC, 0, "ISO-8859-5", ICONVREQ }, + { "xxx", N_("(Cyrillic) KOI8-~R"), 0, 0, CMD_ENC, 0, "KOI8-R", ICONVREQ }, + { "xxx", N_("(Cyrillic) KOI8-~U"), 0, 0, CMD_ENC, 0, "KOI8-U", ICONVREQ }, + { "xxx", N_("(Cyrillic) IBM-866"), 0, 0, CMD_ENC, 0, "CP866", ICONVREQ }, + { "xxx", N_("(Cyrillic) IBM-855"), 0, 0, CMD_ENC, 0, "CP855", ICONVREQ }, + { "xxx", N_("(Cyrillic) ISO-IR-111"), 0, 0, CMD_ENC, 0, "ISO-IR-111", ICONVREQ }, + { "xxx", N_("(Cyrillic) ~MacCyrillic"), 0, 0, CMD_ENC, 0, "MACCYRILLIC", ICONVREQ }, + { NULL } +}; + +PulldownMenu UnicodeEncodingsMenu = { + { "xxx", N_("UTF-1~6"), 0, 0, CMD_ENC, 0, "UTF-16", ICONVREQ }, + { "xxx", N_("UTF-16 Big Endian"), 0, 0, CMD_ENC, 0, "UTF-16BE", ICONVREQ }, + { "xxx", N_("UTF-16 Little Endian"), 0, 0, CMD_ENC, 0, "UTF-16LE", ICONVREQ }, + { "xxx", N_("UTF-~32"), 0, 0, CMD_ENC, 0, "UTF-32", ICONVREQ }, + { "xxx", N_("UTF-32 Big Endian"), 0, 0, CMD_ENC, 0, "UTF-32BE", ICONVREQ }, + { "xxx", N_("UTF-32 Little Endian"), 0, 0, CMD_ENC, 0, "UTF-32LE", ICONVREQ }, + { "xxx", N_("UTF-~7"), 0, 0, CMD_ENC, 0, "UTF-7", ICONVREQ }, + { "-----------" }, + { "xxx", N_("UCS-2"), 0, 0, CMD_ENC, 0, "UCS-2", ICONVREQ }, + { "xxx", N_("UCS-2 Big Endian"), 0, 0, CMD_ENC, 0, "UCS-2BE", ICONVREQ }, + { "xxx", N_("UCS-2 Little Endian"), 0, 0, CMD_ENC, 0, "UCS-2BE", ICONVREQ }, + { "xxx", N_("UCS-4"), 0, 0, CMD_ENC, 0, "UCS-4", ICONVREQ }, + { "xxx", N_("UCS-4 Big Endian"), 0, 0, CMD_ENC, 0, "UCS-4BE", ICONVREQ }, + { "xxx", N_("UCS-4 Little Endian"), 0, 0, CMD_ENC, 0, "UCS-4LE", ICONVREQ }, + { NULL } +}; + +PulldownMenu EncodingsMenu = { + { "xxx", N_("~UTF-8"), 0, 0, CMD_ENC, 0, "UTF-8" }, + { "-----------" }, + { "xxx", N_("(Hebrew) ~ISO-8859-8"), 0, 0, CMD_ENC, 0, "ISO-8859-8" }, + { "xxx", N_("(Hebrew) ~Windows-1255"), 0, 0, CMD_ENC, 0, "CP1255", ICONVREQ }, + { "xxx", N_("(Hebrew) MacHebrew"), 0, 0, CMD_ENC, 0, "MACHEBREW", ICONVREQ }, + { "xxx", N_("(Hebrew) IBM-862 (~Dos)"), 0, 0, CMD_ENC, 0, "CP862", ICONVREQ }, + { "-----------" }, + { "xxx", N_("(Arabic) ISO-8859-6"), 0, 0, CMD_ENC, 0, "ISO-8859-6", ICONVREQ }, + { "xxx", N_("(~Arabic) Windows-1256"), 0, 0, CMD_ENC, 0, "CP1256", ICONVREQ }, + { "xxx", N_("(Arabic) MacArabic"), 0, 0, CMD_ENC, 0, "MACARABIC", ICONVREQ }, + { "xxx", N_("(Arabic) IBM-864 (Dos)"), 0, 0, CMD_ENC, 0, "CP864", ICONVREQ }, + { "xxx", N_("(Farsi) MacFarsi"), 0, 0, CMD_ENC, 0, "MACFARSI", ICONVREQ }, + { "xxx", N_("~Cyrillic"), 0, CyrillicEncodingsMenu }, + { "xxx", N_("~More Unicodes"), 0, UnicodeEncodingsMenu }, + { "-----------" }, + { "xxx", N_("Other..."), 0, 0, CMD_INTERACTIVEENC }, + { NULL } +}; + +PulldownMenu CantillationsCharMenu = { + { "xxx", N_("ETNAHTA (U+0591)"), 0, 0, CMD_CHR, 0x0591 }, + { "xxx", N_("SEGOL (U+0592)"), 0, 0, CMD_CHR, 0x0592 }, + { "xxx", N_("SHALSHELET (U+0593)"), 0, 0, CMD_CHR, 0x0593 }, + { "xxx", N_("ZAQEF QATAN (U+0594)"), 0, 0, CMD_CHR, 0x0594 }, + { "xxx", N_("ZAQEF GADOL (U+0595)"), 0, 0, CMD_CHR, 0x0595 }, + { "xxx", N_("TIPEHA (U+0596)"), 0, 0, CMD_CHR, 0x0596 }, + { "xxx", N_("REVIA (U+0597)"), 0, 0, CMD_CHR, 0x0597 }, + { "xxx", N_("ZARQA (U+0598)"), 0, 0, CMD_CHR, 0x0598 }, + { "xxx", N_("PASHTA (U+0599)"), 0, 0, CMD_CHR, 0x0599 }, + { "xxx", N_("YETIV (U+059A)"), 0, 0, CMD_CHR, 0x059A }, + { "xxx", N_("TEVIR (U+059B)"), 0, 0, CMD_CHR, 0x059B }, + { "xxx", N_("GERESH (U+059C)"), 0, 0, CMD_CHR, 0x059C }, + { "xxx", N_("GERESH MUQDAM (U+059D)"), 0, 0, CMD_CHR, 0x059D }, + { "xxx", N_("GERSHAYIM (U+059E)"), 0, 0, CMD_CHR, 0x059E }, + { "xxx", N_("QARNEY PARA (U+059F)"), 0, 0, CMD_CHR, 0x059F }, + { "xxx", N_("TELISHA GEDOLA (U+05A0)"), 0, 0, CMD_CHR, 0x05A0 }, + { "xxx", N_("PAZER (U+05A1)"), 0, 0, CMD_CHR, 0x05A1 }, + { "xxx", N_("MUNAH (U+05A3)"), 0, 0, CMD_CHR, 0x05A3 }, + { "xxx", N_("MAHAPAKH (U+05A4)"), 0, 0, CMD_CHR, 0x05A4 }, + { "xxx", N_("MERKHA (U+05A5)"), 0, 0, CMD_CHR, 0x05A5 }, + { "xxx", N_("MERKHA KEFULA (U+05A6)"), 0, 0, CMD_CHR, 0x05A6 }, + { "xxx", N_("DARGA (U+05A7)"), 0, 0, CMD_CHR, 0x05A7 }, + { "xxx", N_("QADMA (U+05A8)"), 0, 0, CMD_CHR, 0x05A8 }, + { "xxx", N_("TELISHA QETANA (U+05A9)"), 0, 0, CMD_CHR, 0x05A9 }, + { "xxx", N_("YERAH BEN YOMO (U+05AA)"), 0, 0, CMD_CHR, 0x05AA }, + { "xxx", N_("OLE (U+05AB)"), 0, 0, CMD_CHR, 0x05AB }, + { "xxx", N_("ILUY (U+05AC)"), 0, 0, CMD_CHR, 0x05AC }, + { "xxx", N_("DEHI (U+05AD)"), 0, 0, CMD_CHR, 0x05AD }, + { "xxx", N_("ZINOR (U+05AE)"), 0, 0, CMD_CHR, 0x05AE }, + { "xxx", N_("MASORA CIRCLE (U+05AF)"), 0, 0, CMD_CHR, 0x05AF }, + { "-----------" }, + { "xxx", N_("METEG (U+05BD)"), 0, 0, CMD_CHR, UNI_HEB_METEG }, + { "xxx", N_("PASEQ (U+05C0)"), 0, 0, CMD_CHR, UNI_HEB_PASEQ }, + { "xxx", N_("SOF PASUQ (U+05C3)"), 0, 0, CMD_CHR, UNI_HEB_SOF_PASUQ }, + { NULL } +}; + +PulldownMenu ArabicCharMenu = { + { "xxx", N_("~FATHATAN (U+064B)"), 0, 0, CMD_CHR, 0x064B }, + { "xxx", N_("DAMMATAN (U+064C)"), 0, 0, CMD_CHR, 0x064C }, + { "xxx", N_("~KASRATAN (U+064D)"), 0, 0, CMD_CHR, 0x064D }, + { "xxx", N_("FATHA (U+064E)"), 0, 0, CMD_CHR, 0x064E }, + { "xxx", N_("~DAMMA (U+064F)"), 0, 0, CMD_CHR, 0x064F }, + { "xxx", N_("KASRA (U+0650)"), 0, 0, CMD_CHR, 0x0650 }, + { "xxx", N_("~SHADDA (U+0651)"), 0, 0, CMD_CHR, 0x0651 }, + { "xxx", N_("SUKUN (U+0652)"), 0, 0, CMD_CHR, 0x0652 }, + { "xxx", N_("SUPERSCRIPT ALEF (U+0670)"), 0, 0, CMD_CHR, 0x0670 }, + { "-----------" }, + { "xxx", N_("ZWJ, ZERO WIDTH JOINER (U+200D)"), 0, 0, CMD_CHR, 0x200D }, + { "xxx", N_("ZWNJ, ZERO WIDTH NON-JOINER (U+200C)"), 0, 0, CMD_CHR, 0x200C }, + { NULL } +}; + +PulldownMenu InsertCharMenu = { + { "insert_maqaf", N_("Hebrew ~maqaf (U+05BE)") }, + { "-----------" }, + { "xxx", N_("~LRM, LEFT-TO-RIGHT MARK (U+200E)"), 0, 0, CMD_CHR, UNI_LRM }, + { "xxx", N_("~RLM, RIGHT-TO-LEFT MARK (U+200F)"), 0, 0, CMD_CHR, UNI_RLM }, + { "xxx", N_("LRE, LEFT-TO-RIGHT EMBEDDING (U+202A)"), 0, 0, CMD_CHR, UNI_LRE }, + { "xxx", N_("RLE, RIGHT-TO-LEFT EMBEDDING (U+202B)"), 0, 0, CMD_CHR, UNI_RLE }, + { "xxx", N_("PDF, POP DIRECTIONAL FORMATTING (U+202C)"), 0, 0, CMD_CHR, UNI_PDF }, + { "xxx", N_("LRO, LEFT-TO-RIGHT OVERRIDE (U+202D)"), 0, 0, CMD_CHR, UNI_LRO }, + { "xxx", N_("RLO, RIGHT-TO-LEFT OVERRIDE (U+202E)"), 0, 0, CMD_CHR, UNI_RLO }, + { "-----------" }, + { "xxx", N_("~SHEVA (U+05B0)"), 0, 0, CMD_CHR, UNI_HEB_SHEVA }, + { "xxx", N_("HATAF SEGOL (U+05B~1)"), 0, 0, CMD_CHR, UNI_HEB_HATAF_SEGOL }, + { "xxx", N_("HATAF PATAH (U+05B~2)"), 0, 0, CMD_CHR, UNI_HEB_HATAF_PATAH }, + { "xxx", N_("HATAF QAMATS (U+05B~3)"), 0, 0, CMD_CHR, UNI_HEB_HATAF_QAMATS }, + { "xxx", N_("~HIRIQ (U+05B4)"), 0, 0, CMD_CHR, UNI_HEB_HIRIQ }, + { "xxx", N_("TS~ERE (U+05B5)"), 0, 0, CMD_CHR, UNI_HEB_TSERE }, + { "xxx", N_("SE~GOL (U+05B6)"), 0, 0, CMD_CHR, UNI_HEB_SEGOL }, + { "xxx", N_("~PATAH (U+05B7)"), 0, 0, CMD_CHR, UNI_HEB_PATAH }, + { "xxx", N_("~QAMATS (U+05B8)"), 0, 0, CMD_CHR, UNI_HEB_QAMATS }, + { "xxx", N_("H~OLAM (U+05B9)"), 0, 0, CMD_CHR, UNI_HEB_HOLAM }, + { "xxx", N_("Q~UBUTS (U+05BB)"), 0, 0, CMD_CHR, UNI_HEB_QUBUTS }, + { "xxx", N_("~DAGESH OR MAPIQ (U+05BC)"), 0, 0, CMD_CHR, UNI_HEB_DAGESH_OR_MAPIQ }, + { "xxx", N_("~RAFE (U+05BF)"), 0, 0, CMD_CHR, UNI_HEB_RAFE }, + { "xxx", N_("SHIN DOT (U+05C1)"), 0, 0, CMD_CHR, UNI_HEB_SHIN_DOT }, + { "xxx", N_("SIN DOT (U+05C2)"), 0, 0, CMD_CHR, UNI_HEB_SIN_DOT }, + { "-----------" }, + { "xxx", N_("GERESH (U+05F3)"), 0, 0, CMD_CHR, UNI_HEB_GERESH }, + { "xxx", N_("GERSHAYIM (U+05F4)"), 0, 0, CMD_CHR, UNI_HEB_GERSHAYIM }, + { "xxx", N_("NO-BREAK SPACE (U+00A0)"), 0, 0, CMD_CHR, 0x00A0 }, + { "xxx", N_("ZERO WIDTH SPACE(U+200B)"), 0, 0, CMD_CHR, 0x200B }, + { "-----------" }, + { "xxx", N_("~Cantillations"), 0, CantillationsCharMenu }, + { "xxx", N_("~Arabic"), 0, ArabicCharMenu }, +}; + +PulldownMenu CharactersUtilsMenu = { + { "show_character_code", N_("Print ~Unicode and UTF-8 value") }, + { "show_character_info", N_("Print the corresponding Unicode~Data.txt line") }, + { "xxx", N_("~Insert a Unicode character from the list"), 0, InsertCharMenu }, + { "insert_unicode_char", N_("Insert a Unicode character using its ~code") }, + { "-----------" }, + { "xxx", N_("Set the ~encoding used for saving this file"), 0, EncodingsMenu, CMD_SETFLAG, FLAG_FILE_ENCODING }, + { "xxx", N_("Set the de~fault encoding"), 0, EncodingsMenu, CMD_SETFLAG, FLAG_DEFAULT_ENCODING, 0, + N_("The \"default encoding\" is used when loading files and when creating new files.") }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_ENCODING_STR }, + { "-----------" }, + { "toggle_alt_kbd", N_("Toogle ~Hebrew keyboard emulation"), STT_ALTKBD }, + { "toggle_smart_typing", N_("Toggle ~smart-typing mode"), STT_SMRT }, + { "set_translate_next_char", N_("~Translate next character") }, + { "-----------" }, + { "toggle_eops", N_("Change end-of-~line type"), 0, EolMenu }, + { NULL } +}; + +PulldownMenu DirAlgoMenu = { + { "set_dir_algo_unicode", N_("~Unicode's TR #9"), STT_DIRALGOUNICODE }, + { "set_dir_algo_context_strong", N_("Contextual-~strong"), STT_DIRALGOCTXSTRNG }, + { "set_dir_algo_context_rtl", N_("~Contextual-rtl"), STT_DIRALGOCTXRTL }, + { "set_dir_algo_force_ltr", N_("Force ~LTR"), STT_DIRALGOFLTR }, + { "set_dir_algo_force_rtl", N_("Force ~RTL"), STT_DIRALGOFRTL }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_ALGO_STR }, + { NULL } +}; + +PulldownMenu CursorMovementMenu = { + { "toggle_visual_cursor_movement", N_("~Logical"), STT_CRSLOG, 0, CMD_CRSLOG, 0, + N_("Logical movement: cursor follows the buffer order") }, + { "toggle_visual_cursor_movement", N_("~Visual"), STT_CRSVIS, 0, CMD_CRSVIS, 0, + N_("Visual movement: cursor follows what you see on screen") }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_CRSLV_STR }, + { NULL } +}; + +PulldownMenu BiDiMenu = { + { "toggle_bidi", N_("Toggle the ~BiDi algorithm"), STT_BIDI }, + { "toggle_dir_algo", N_("Select base-directionality ~algorithm"), 0, DirAlgoMenu }, + { "toggle_visual_cursor_movement", N_("~Cursor movement"), 0, CursorMovementMenu }, + { NULL } +}; + +PulldownMenu SpellerMenu = { + { "spell_check_all", N_("Spell check all ~document") }, + { "spell_check_forward", N_("Spell check ~from cursor onward") }, + { "spell_check_word", N_("Spell check ~word under cursor") }, + { "-----------" }, + { "load_unload_speller", N_("Explicitly ~load/unload the speller process..."), STT_SPELLERLOADED }, + { NULL } +}; + +PulldownMenu WrapMenu = { + { "set_wrap_type_at_white_space", + N_("Wrap lines, do not break ~words"), STT_WRAPWSPACE }, + { "set_wrap_type_anywhere", + N_("Wrap lines, ~break words"), STT_WRAPBREAK }, + { "set_wrap_type_off", + N_("Do ~not wrap lines"), STT_WRAPOFF }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_WRAP_STR }, + { NULL } +}; + +PulldownMenu rtlnsmMenu = { + { "set_rtl_nsm_transliterated", + N_("Display Hebrew/Arabic points as highlighted ~ASCII characters"), STT_RTLNSMASCII }, + { "set_rtl_nsm_asis", + N_("Display Hebrew/Arabic points as-~is (for capable terminals)"), STT_RTLNSMASIS }, + { "set_rtl_nsm_off", + N_("~Hide Hebrew/Arabic points"), STT_RTLNSMHIDE }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_POINTS_STR }, + { NULL } +}; + +PulldownMenu MaqafMenu = { + { "set_maqaf_display_transliterated", + N_("Display the maqaf as ~ASCII dash"), STT_MQFASCII }, + { "set_maqaf_display_asis", + N_("Display the maqaf as-~is (for capable terminals)"), + STT_MQFASIS }, + { "set_maqaf_display_highlighted", + N_("~Highlight the maqaf"), STT_MQFHIGHLIGHT }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_MAQAF_STR }, + { NULL } +}; + +PulldownMenu ScrollbarMenu = { + { "menu_set_scrollbar_none", N_("~Off"), STT_SCRLBRNONE }, + { "menu_set_scrollbar_left", N_("~Left"), STT_SCRLBRLEFT }, + { "menu_set_scrollbar_right", N_("~Right"), STT_SCRLBRRIGHT }, + { NULL } +}; + +PulldownMenu HighlightMenu = { + { "toggle_syntax_auto_detection", N_("Syntax ~Auto-Detection"), STT_SYNAUTO }, + { "-----------" }, + { "menu_set_syn_hlt_none", N_("~None"), STT_SYNNONE }, + { "menu_set_syn_hlt_html", N_("~HTML"), STT_SYNHTML }, + { "menu_set_syn_hlt_email", N_("~Email"), STT_SYNEMAIL }, + { "-----------" }, + { "toggle_underline", N_("Highlight *~text* and _text_"), STT_UNDERLINE }, + { "-----------" }, + { "xxx", HELP_ITEM, 0, 0, CMD_HELP, 0, HELP_TOPIC_SYNHLT_STR }, + { NULL } +}; + +#define MAX_COLOR_SCHEMES 100 +MenuItem ColorScheme[MAX_COLOR_SCHEMES] = { + { "set_default_theme", N_("~Default (transparent)"), STT_THEME_START, 0, 0, 0, "default.thm" }, + { "-----------" }, +}; + +PulldownMenu DisplayMenu = { + { "toggle_formatting_marks", N_("Toggle display of ~formatting marks"), STT_FORMATMARKS }, + { "toggle_arabic_shaping", N_("Toggle ~Arabic shaping"), STT_ARABICSHAPING }, + { "xxx_toggle_rtl_nsm", N_("Change display of Hebrew/Arabic ~points"), 0, rtlnsmMenu }, + { "xxx_toggle_maqaf", N_("Change display of the Hebrew ~maqaf"), 0, MaqafMenu }, + { "-----------" }, + { "toggle_wrap", N_("Change ~wrap style"), 0, WrapMenu }, + { "xxx", N_("~Scrollbar"), 0, ScrollbarMenu }, + { "toggle_cursor_position_report", N_("Toggle display of cursor p~osition"), STT_CURSORREPORT }, + { "change_scroll_step", N_("Change the scroll step...") }, + { "-----------" }, + { "xxx", N_("~Color scheme"), 0, ColorScheme }, + { "-----------" }, + { "xxx", N_("Syntax ~Highlighting"), 0, HighlightMenu }, + { "-----------" }, + { "refresh_and_center", N_("~Repaint the screen and center the line") }, + { "toggle_graphical_boxes", N_("Toggle use of ~graphical characters for frames"), STT_GRAPHBOXES }, + { "toggle_big_cursor", N_("Toggle ~big cursor"), STT_BIGCURSOR }, + { NULL } +}; + +PulldownMenu HelpMenu = { + { "help", N_("User ~Manual") }, + { "describe_key", N_("~Describe key...") }, + { NULL } +}; + +MenubarMenu mainMenu = { + { "File", FileMenu }, + { "Edit", EditMenu }, + { "Characters", CharactersUtilsMenu }, + { "Display", DisplayMenu }, + { "BiDi", BiDiMenu }, + { "Speller", SpellerMenu }, + { "Help", HelpMenu }, + { NULL } +}; + +////////////////////////////// MMPopupMenu ///////////////////////////////// + +class MMPopupMenu : public PopupMenu { + Editor *editor; + EditBox *editbox; +public: + MMPopupMenu(Editor *aEditor, EditBox *aEditbox, + PopupMenu *aParent, PulldownMenu aMnu); +protected: + virtual void show_hint(const char *hint); + virtual void clear_other_popups(); + virtual Dispatcher *get_primary_target(); + virtual Dispatcher *get_secondary_target(); + virtual PopupMenu *create_popupmenu(PopupMenu *aParent, PulldownMenu mnu); + virtual bool get_item_state(int id); + virtual void do_command(unsigned long parameter1, unsigned long parameter2, + const char *parameter3); +}; + +MMPopupMenu::MMPopupMenu(Editor *aEditor, EditBox *aEditbox, + PopupMenu *aParent, PulldownMenu aMnu) + : PopupMenu(aParent, NULL) +{ + editor = aEditor; + editbox = aEditbox; + init(aMnu); +} + +void MMPopupMenu::show_hint(const char *hint) +{ + editor->show_hint(hint); +} + +void MMPopupMenu::clear_other_popups() +{ + editor->refresh(true); +} + +Dispatcher *MMPopupMenu::get_primary_target() +{ + return editor; +} + +Dispatcher *MMPopupMenu::get_secondary_target() +{ + return editbox; +} + +PopupMenu *MMPopupMenu::create_popupmenu(PopupMenu *aParent, PulldownMenu mnu) +{ + return new MMPopupMenu(editor, editbox, aParent, mnu); +} + +bool MMPopupMenu::get_item_state(int id) +{ + switch (id) { + case STT_AUTOINDENT: return editbox->is_auto_indent(); + case STT_AUTOJUSTIFY: return editbox->is_auto_justify(); + case STT_ALTKBD: return editbox->get_alt_kbd(); + case STT_SMRT: return editbox->is_smart_typing(); + case STT_ARABICSHAPING: return terminal::do_arabic_shaping; + case STT_FORMATMARKS: return editbox->has_formatting_marks(); + case STT_CURSORREPORT: return editor->is_cursor_position_report(); + case STT_READONLY: return editbox->is_read_only(); + case STT_BIGCURSOR: return editor->is_big_cursor(); + case STT_GRAPHBOXES: return terminal::graphical_boxes; + case STT_KEYFORKEYUNDO: return editbox->is_key_for_key_undo(); + case STT_BIDI: return editbox->is_bidi_enabled(); + + case STT_EOPUNIX: return editbox->get_dominant_eop() == eopUnix; + case STT_EOPDOS: return editbox->get_dominant_eop() == eopDOS; + case STT_EOPMAC: return editbox->get_dominant_eop() == eopMac; + case STT_EOPUNICODE: return editbox->get_dominant_eop() == eopUnicode; + + case STT_RTLNSMASCII: return editbox->get_rtl_nsm_display() == EditBox::rtlnsmTransliterated; + case STT_RTLNSMASIS: return editbox->get_rtl_nsm_display() == EditBox::rtlnsmAsis; + case STT_RTLNSMHIDE: return editbox->get_rtl_nsm_display() == EditBox::rtlnsmOff; + + case STT_MQFASCII: return editbox->get_maqaf_display() == EditBox::mqfTransliterated; + case STT_MQFHIGHLIGHT: return editbox->get_maqaf_display() == EditBox::mqfHighlighted; + case STT_MQFASIS: return editbox->get_maqaf_display() == EditBox::mqfAsis; + + case STT_WRAPOFF: return editbox->get_wrap_type() == EditBox::wrpOff; + case STT_WRAPBREAK: return editbox->get_wrap_type() == EditBox::wrpAnywhere; + case STT_WRAPWSPACE: return editbox->get_wrap_type() == EditBox::wrpAtWhiteSpace; + + case STT_DIRALGOUNICODE: return editbox->get_dir_algo() == algoUnicode; + case STT_DIRALGOCTXSTRNG: return editbox->get_dir_algo() == algoContextStrong; + case STT_DIRALGOCTXRTL: return editbox->get_dir_algo() == algoContextRTL; + case STT_DIRALGOFLTR: return editbox->get_dir_algo() == algoForceLTR; + case STT_DIRALGOFRTL: return editbox->get_dir_algo() == algoForceRTL; + + case STT_SPELLERLOADED: return editor->is_speller_loaded(); + + case STT_SCRLBRNONE: return editor->get_scrollbar_pos() == Editor::scrlbrNone; + case STT_SCRLBRLEFT: return editor->get_scrollbar_pos() == Editor::scrlbrLeft; + case STT_SCRLBRRIGHT: return editor->get_scrollbar_pos() == Editor::scrlbrRight; + + case STT_SYNNONE: return editbox->get_syn_hlt() == EditBox::synhltOff; + case STT_SYNHTML: return editbox->get_syn_hlt() == EditBox::synhltHTML; + case STT_SYNEMAIL: return editbox->get_syn_hlt() == EditBox::synhltEmail; + + case STT_UNDERLINE: return editbox->get_underline(); + + case STT_SYNAUTO: return editor->get_syntax_auto_detection(); + + case STT_CRSVIS: return editbox->get_visual_cursor_movement(); + case STT_CRSLOG: return !editbox->get_visual_cursor_movement(); + + default: + if (id >= STT_THEME_START && id <= STT_THEME_END) { + int i = 0; + while (ColorScheme[i].action) { + if (ColorScheme[i].state_id == id) + return STREQ(ColorScheme[i].command_parameter3, editor->get_theme_name()); + i++; + } + return false; + } + else { + return false; + } + } +} + +void MMPopupMenu::do_command(unsigned long parameter1, unsigned long parameter2, + const char *parameter3) +{ + static int flag; + switch (parameter1) { + case CMD_SETTHEME: + editor->set_theme(parameter3); + break; + case CMD_CHR: + editbox->insert_char((unichar)parameter2); + break; + case CMD_CRSVIS: + editbox->set_visual_cursor_movement(true); + break; + case CMD_CRSLOG: + editbox->set_visual_cursor_movement(false); + break; + case CMD_HELP: + editor->show_help_topic(parameter3); + break; + case CMD_ENC: + if (flag == FLAG_DEFAULT_ENCODING) + editor->set_default_encoding(parameter3); + else + editor->set_encoding(parameter3); + break; + case CMD_INTERACTIVEENC: + editor->menu_set_encoding(flag == FLAG_DEFAULT_ENCODING); + break; + case CMD_SETFLAG: + flag = parameter2; + break; + } +} + +/////////////////////////////// MMMenubar ////////////////////////////////// + +class MMMenubar : public Menubar { + Editor *editor; + EditBox *editbox; + void populate_color_scheme_menu(); +public: + MMMenubar(Editor *, EditBox *); + virtual void refresh_screen(); + virtual PopupMenu *create_popupmenu(PulldownMenu mnu); +}; + +MMMenubar::MMMenubar(Editor *aEditor, EditBox *aEditbox) + : Menubar() +{ + editor = aEditor; + editbox = aEditbox; + populate_color_scheme_menu(); + init(mainMenu); +} + +void MMMenubar::refresh_screen() +{ + editor->refresh(true); +} + +PopupMenu *MMMenubar::create_popupmenu(PulldownMenu mnu) +{ + return new MMPopupMenu(editor, editbox, NULL, mnu); +} + +//////////////////// Populate the ColorScheme Menu ///////////////////////// + +bool operator<(const MenuItem &a, const MenuItem &b) +{ + u8string as = a.label, bs = b.label; + return strcmp(as.erase_char('~').toupper_ascii().c_str(), + bs.erase_char('~').toupper_ascii().c_str()) < 0; +} + +static u8string get_color_scheme_title(const char *filename) +{ +#define MAX_LINE_LEN 1024 + FILE *fp; + if ((fp = fopen(filename, "r")) != NULL) { + char line[MAX_LINE_LEN]; + int line_no = 0; + while (fgets(line, MAX_LINE_LEN, fp) && line_no++ < 5) { + const char *pos; + if ((pos = strstr(line, "Title:")) != NULL) { + fclose(fp); + return u8string(pos + strlen("Title:")).trim(); + } + } + fclose(fp); + } + return ""; +#undef MAX_LINE_LEN +} + +static bool theme_already_listed(const char *theme_name) +{ + int i = 0; + while (ColorScheme[i].action) { + if (ColorScheme[i].command_parameter3 && + STREQ(ColorScheme[i].command_parameter3, theme_name)) + return true; + i++; + } + return false; +} + +void MMMenubar::populate_color_scheme_menu() +{ + int menu_pos = 0; + while (ColorScheme[menu_pos].action) menu_pos++; + int menu_start = menu_pos; + + for (int i = 0; i < 2; i++) { + DIR *dir; + dirent *ent; + const char *dirstr = get_cfg_filename((i == 0) ? USER_THEMES_DIR : SYSTEM_THEMES_DIR); + if ((dir = opendir(dirstr)) == NULL) + continue; + while ((ent = readdir(dir)) != NULL) { + const char *d_name = ent->d_name; + u8string desc; + desc.cformat("File: %s%s", dirstr, d_name); + + if (STREQ(d_name, "default.thm") && !ColorScheme[0].desc) + ColorScheme[0].desc = strdup(desc.c_str()); + + if (strstr(d_name, ".thm") && !strchr(d_name, '~') + && !theme_already_listed(d_name)) { + ColorScheme[menu_pos].action = "xxx"; + ColorScheme[menu_pos].command_parameter1 = CMD_SETTHEME; + ColorScheme[menu_pos].command_parameter3 = strdup(d_name); + ColorScheme[menu_pos].state_id = STT_THEME_START + menu_pos; + ColorScheme[menu_pos].desc = strdup(desc.c_str()); + + u8string filepath = dirstr; filepath += d_name; + u8string title = get_color_scheme_title(filepath.c_str()); + if (title.empty()) { + char *label = strdup(d_name); + // cut the file extension + if (strchr(label, '.')) + *strchr(label, '.') = '\0'; + ColorScheme[menu_pos].label = label; + } else { + ColorScheme[menu_pos].label = strdup(title.c_str()); + } + + menu_pos++; + } + } + closedir(dir); + } + std::sort(&ColorScheme[menu_start], &ColorScheme[menu_pos]); + + ColorScheme[menu_pos++].action = "---"; + ColorScheme[menu_pos].action = "xxx"; + ColorScheme[menu_pos].label = HELP_ITEM; + ColorScheme[menu_pos].command_parameter1 = CMD_HELP; + ColorScheme[menu_pos].command_parameter3 = HELP_TOPIC_COLORS_STR; +} + +//////////////////////////////////////////////////////////////////////////// + +Menubar *create_main_menubar(Editor *aEdtr, EditBox *aEdtbx) +{ + return new MMMenubar(aEdtr, aEdtbx); +} + |