cjk support wip
[fanfix.git] / src / jexer / bits / MnemonicString.java
1 /*
2 * Jexer - Java Text User Interface
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (C) 2019 Kevin Lamonte
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
25 *
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
27 * @version 1
28 */
29 package jexer.bits;
30
31 /**
32 * MnemonicString is used to render a string like "&File" into a
33 * highlighted 'F' and the rest of 'ile'. To insert a literal '&', use
34 * two '&&' characters, e.g. "&File && Stuff" would be
35 * "File & Stuff" with the first 'F' highlighted.
36 */
37 public class MnemonicString {
38
39 // ------------------------------------------------------------------------
40 // Variables --------------------------------------------------------------
41 // ------------------------------------------------------------------------
42
43 /**
44 * Keyboard shortcut to activate this item.
45 */
46 private char shortcut;
47
48 /**
49 * Location of the highlighted character.
50 */
51 private int shortcutIdx = -1;
52
53 /**
54 * Screen location of the highlighted character (number of text cells
55 * required to display from the beginning to shortcutIdx).
56 */
57 private int screenShortcutIdx = -1;
58
59 /**
60 * The raw (uncolored) string.
61 */
62 private String rawLabel;
63
64 // ------------------------------------------------------------------------
65 // Constructors -----------------------------------------------------------
66 // ------------------------------------------------------------------------
67
68 /**
69 * Public constructor.
70 *
71 * @param label widget label or title. Label must contain a keyboard
72 * shortcut, denoted by prefixing a letter with "&", e.g. "&File"
73 */
74 public MnemonicString(final String label) {
75
76 // Setup the menu shortcut
77 String newLabel = "";
78 boolean foundAmp = false;
79 boolean foundShortcut = false;
80 int scanShortcutIdx = 0;
81 int scanScreenShortcutIdx = 0;
82 for (int i = 0; i < label.length(); i++) {
83 char c = label.charAt(i);
84 if (c == '&') {
85 if (foundAmp) {
86 newLabel += '&';
87 scanShortcutIdx++;
88 scanScreenShortcutIdx++;
89 } else {
90 foundAmp = true;
91 }
92 } else {
93 newLabel += c;
94 if (foundAmp) {
95 if (!foundShortcut) {
96 shortcut = c;
97 foundAmp = false;
98 foundShortcut = true;
99 shortcutIdx = scanShortcutIdx;
100 screenShortcutIdx = scanScreenShortcutIdx;
101 }
102 } else {
103 scanShortcutIdx++;
104 scanScreenShortcutIdx += StringUtils.width(c);
105 }
106 }
107 }
108 this.rawLabel = newLabel;
109 }
110
111 // ------------------------------------------------------------------------
112 // MnemonicString ---------------------------------------------------------
113 // ------------------------------------------------------------------------
114
115 /**
116 * Get the keyboard shortcut character.
117 *
118 * @return the highlighted character
119 */
120 public char getShortcut() {
121 return shortcut;
122 }
123
124 /**
125 * Get location of the highlighted character.
126 *
127 * @return location of the highlighted character
128 */
129 public int getShortcutIdx() {
130 return shortcutIdx;
131 }
132
133 /**
134 * Get the screen location of the highlighted character.
135 *
136 * @return the number of text cells required to display from the
137 * beginning of the label to shortcutIdx
138 */
139 public int getScreenShortcutIdx() {
140 return screenShortcutIdx;
141 }
142
143 /**
144 * Get the raw (uncolored) string.
145 *
146 * @return the raw (uncolored) string
147 */
148 public String getRawLabel() {
149 return rawLabel;
150 }
151
152 }