Add 'src/jexer/' from commit 'cf01c92f5809a0732409e280fb0f32f27393618d'
[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 int 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 StringBuilder newLabel = new StringBuilder();
78 boolean foundAmp = false;
79 boolean foundShortcut = false;
80 int scanShortcutIdx = 0;
81 int scanScreenShortcutIdx = 0;
82 for (int i = 0; i < label.length();) {
83 int c = label.codePointAt(i);
84 i += Character.charCount(c);
85
86 if (c == '&') {
87 if (foundAmp) {
88 newLabel.append('&');
89 scanShortcutIdx++;
90 scanScreenShortcutIdx++;
91 } else {
92 foundAmp = true;
93 }
94 } else {
95 newLabel.append(Character.toChars(c));
96 if (foundAmp) {
97 if (!foundShortcut) {
98 shortcut = c;
99 foundAmp = false;
100 foundShortcut = true;
101 shortcutIdx = scanShortcutIdx;
102 screenShortcutIdx = scanScreenShortcutIdx;
103 }
104 } else {
105 scanShortcutIdx++;
106 scanScreenShortcutIdx += StringUtils.width(c);
107 }
108 }
109 }
110 this.rawLabel = newLabel.toString();
111 }
112
113 // ------------------------------------------------------------------------
114 // MnemonicString ---------------------------------------------------------
115 // ------------------------------------------------------------------------
116
117 /**
118 * Get the keyboard shortcut character.
119 *
120 * @return the highlighted character
121 */
122 public int getShortcut() {
123 return shortcut;
124 }
125
126 /**
127 * Get location of the highlighted character.
128 *
129 * @return location of the highlighted character
130 */
131 public int getShortcutIdx() {
132 return shortcutIdx;
133 }
134
135 /**
136 * Get the screen location of the highlighted character.
137 *
138 * @return the number of text cells required to display from the
139 * beginning of the label to shortcutIdx
140 */
141 public int getScreenShortcutIdx() {
142 return screenShortcutIdx;
143 }
144
145 /**
146 * Get the raw (uncolored) string.
147 *
148 * @return the raw (uncolored) string
149 */
150 public String getRawLabel() {
151 return rawLabel;
152 }
153
154 }