#35 fix demo
[nikiroo-utils.git] / src / jexer / bits / MnemonicString.java
CommitLineData
daa4106c 1/*
df8de03f
KL
2 * Jexer - Java Text User Interface
3 *
e16dda65 4 * The MIT License (MIT)
df8de03f 5 *
a69ed767 6 * Copyright (C) 2019 Kevin Lamonte
df8de03f 7 *
e16dda65
KL
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:
df8de03f 14 *
e16dda65
KL
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
df8de03f 17 *
e16dda65
KL
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.
7b5261bc
KL
25 *
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
27 * @version 1
df8de03f
KL
28 */
29package jexer.bits;
30
31/**
43ad7b6c
KL
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.
df8de03f 36 */
051e2913 37public class MnemonicString {
df8de03f 38
d36057df
KL
39 // ------------------------------------------------------------------------
40 // Variables --------------------------------------------------------------
41 // ------------------------------------------------------------------------
42
df8de03f 43 /**
7b5261bc 44 * Keyboard shortcut to activate this item.
df8de03f 45 */
7b5261bc 46 private char shortcut;
df8de03f
KL
47
48 /**
7b5261bc 49 * Location of the highlighted character.
df8de03f 50 */
7b5261bc 51 private int shortcutIdx = -1;
df8de03f 52
9f613a0c
KL
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
df8de03f 59 /**
7b5261bc 60 * The raw (uncolored) string.
df8de03f 61 */
7b5261bc 62 private String rawLabel;
df8de03f 63
d36057df
KL
64 // ------------------------------------------------------------------------
65 // Constructors -----------------------------------------------------------
66 // ------------------------------------------------------------------------
329fd62e 67
df8de03f 68 /**
7b5261bc 69 * Public constructor.
df8de03f
KL
70 *
71 * @param label widget label or title. Label must contain a keyboard
43ad7b6c 72 * shortcut, denoted by prefixing a letter with "&", e.g. "&File"
df8de03f 73 */
7b5261bc 74 public MnemonicString(final String label) {
df8de03f 75
7b5261bc
KL
76 // Setup the menu shortcut
77 String newLabel = "";
78 boolean foundAmp = false;
79 boolean foundShortcut = false;
80 int scanShortcutIdx = 0;
9f613a0c 81 int scanScreenShortcutIdx = 0;
7b5261bc
KL
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++;
9f613a0c 88 scanScreenShortcutIdx++;
7b5261bc
KL
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;
9f613a0c 100 screenShortcutIdx = scanScreenShortcutIdx;
7b5261bc
KL
101 }
102 } else {
103 scanShortcutIdx++;
9f613a0c 104 scanScreenShortcutIdx += StringUtils.width(c);
7b5261bc
KL
105 }
106 }
107 }
108 this.rawLabel = newLabel;
df8de03f 109 }
d36057df
KL
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
9f613a0c
KL
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
d36057df
KL
143 /**
144 * Get the raw (uncolored) string.
145 *
146 * @return the raw (uncolored) string
147 */
148 public String getRawLabel() {
149 return rawLabel;
150 }
151
df8de03f 152}