menus working
[nikiroo-utils.git] / src / jexer / menu / TSubMenu.java
1 /**
2 * Jexer - Java Text User Interface
3 *
4 * License: LGPLv3 or later
5 *
6 * This module is licensed under the GNU Lesser General Public License
7 * Version 3. Please see the file "COPYING" in this directory for more
8 * information about the GNU Lesser General Public License Version 3.
9 *
10 * Copyright (C) 2015 Kevin Lamonte
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 3 of
15 * the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this program; if not, see
24 * http://www.gnu.org/licenses/, or write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * 02110-1301 USA
27 *
28 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
29 * @version 1
30 */
31 package jexer.menu;
32
33 import jexer.TKeypress;
34 import jexer.TWidget;
35 import jexer.bits.CellAttributes;
36 import jexer.bits.GraphicsChars;
37 import jexer.event.TKeypressEvent;
38 import static jexer.TKeypress.*;
39
40 /**
41 * TSubMenu is a special case menu item that wraps another TMenu.
42 */
43 public class TSubMenu extends TMenuItem {
44
45 /**
46 * The menu window. Note package private access.
47 */
48 TMenu menu;
49
50 /**
51 * Package private constructor.
52 *
53 * @param parent parent widget
54 * @param title menu title. Title must contain a keyboard shortcut,
55 * denoted by prefixing a letter with "&", e.g. "&File"
56 * @param x column relative to parent
57 * @param y row relative to parent
58 */
59 TSubMenu(final TMenu parent, final String title, final int x, final int y) {
60 super(parent, TMenu.MID_UNUSED, x, y, title);
61
62 setActive(false);
63 setEnabled(true);
64
65 this.menu = new TMenu(parent.getApplication(), x, getAbsoluteY() - 1,
66 title);
67 setWidth(menu.getWidth() + 2);
68
69 this.menu.isSubMenu = true;
70 }
71
72 /**
73 * Draw the menu title.
74 */
75 @Override
76 public void draw() {
77 super.draw();
78
79 CellAttributes background = getTheme().getColor("tmenu");
80 CellAttributes menuColor;
81 CellAttributes menuMnemonicColor;
82 if (getAbsoluteActive()) {
83 menuColor = getTheme().getColor("tmenu.highlighted");
84 menuMnemonicColor = getTheme().getColor("tmenu.mnemonic.highlighted");
85 } else {
86 if (getEnabled()) {
87 menuColor = getTheme().getColor("tmenu");
88 menuMnemonicColor = getTheme().getColor("tmenu.mnemonic");
89 } else {
90 menuColor = getTheme().getColor("tmenu.disabled");
91 menuMnemonicColor = getTheme().getColor("tmenu.disabled");
92 }
93 }
94
95 // Add the arrow
96 getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.CP437[0x10],
97 menuColor);
98 }
99
100 /**
101 * Handle keystrokes.
102 *
103 * @param keypress keystroke event
104 */
105 @Override
106 public void onKeypress(final TKeypressEvent keypress) {
107
108 if (menu.getActive()) {
109 menu.onKeypress(keypress);
110 return;
111 }
112
113 if (keypress.equals(kbEnter)) {
114 dispatch();
115 return;
116 }
117
118 if (keypress.equals(kbRight)) {
119 dispatch();
120 return;
121 }
122
123 if (keypress.equals(kbDown)) {
124 getParent().switchWidget(true);
125 return;
126 }
127
128 if (keypress.equals(kbUp)) {
129 getParent().switchWidget(false);
130 return;
131 }
132
133 if (keypress.equals(kbLeft)) {
134 TMenu parentMenu = (TMenu) getParent();
135 if (parentMenu.isSubMenu) {
136 getApplication().closeSubMenu();
137 } else {
138 getApplication().switchMenu(false);
139 }
140 return;
141 }
142
143 if (keypress.equals(kbEsc)) {
144 getApplication().closeMenu();
145 return;
146 }
147 }
148
149 /**
150 * Override dispatch() to do nothing.
151 */
152 @Override
153 public void dispatch() {
154 assert (getEnabled());
155 if (getAbsoluteActive()) {
156 if (!menu.getActive()) {
157 getApplication().addSubMenu(menu);
158 menu.setActive(true);
159 }
160 }
161 }
162
163 /**
164 * Returns my active widget.
165 *
166 * @return widget that is active, or this if no children
167 */
168 @Override
169 public TWidget getActiveChild() {
170 if (menu.getActive()) {
171 return menu;
172 }
173 // Menu not active, return me
174 return this;
175 }
176
177 /**
178 * Convenience function to add a custom menu item.
179 *
180 * @param id menu item ID. Must be greater than 1024.
181 * @param label menu item label
182 * @param key global keyboard accelerator
183 * @return the new menu item
184 */
185 public final TMenuItem addItem(final int id, final String label,
186 final TKeypress key) {
187
188 return menu.addItem(id, label, key);
189 }
190
191 /**
192 * Convenience function to add a menu item.
193 *
194 * @param id menu item ID. Must be greater than 1024.
195 * @param label menu item label
196 * @return the new menu item
197 */
198 public final TMenuItem addItem(final int id, final String label) {
199 return menu.addItem(id, label);
200 }
201
202 /**
203 * Convenience function to add one of the default menu items.
204 *
205 * @param id menu item ID. Must be between 0 (inclusive) and 1023
206 * (inclusive).
207 * @return the new menu item
208 */
209 public final TMenuItem addDefaultItem(final int id) {
210 return menu.addDefaultItem(id);
211 }
212
213 /**
214 * Convenience function to add a menu separator.
215 */
216 public final void addSeparator() {
217 menu.addSeparator();
218 }
219
220 /**
221 * Convenience function to add a sub-menu.
222 *
223 * @param title menu title. Title must contain a keyboard shortcut,
224 * denoted by prefixing a letter with "&", e.g. "&File"
225 * @return the new sub-menu
226 */
227 public final TSubMenu addSubMenu(final String title) {
228 return menu.addSubMenu(title);
229 }
230
231
232 }