fix javadoc header
[fanfix.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 final 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 menuColor;
80 if (isAbsoluteActive()) {
81 menuColor = getTheme().getColor("tmenu.highlighted");
82 } else {
83 if (isEnabled()) {
84 menuColor = getTheme().getColor("tmenu");
85 } else {
86 menuColor = getTheme().getColor("tmenu.disabled");
87 }
88 }
89
90 // Add the arrow
91 getScreen().putCharXY(getWidth() - 2, 0, GraphicsChars.CP437[0x10],
92 menuColor);
93 }
94
95 /**
96 * Handle keystrokes.
97 *
98 * @param keypress keystroke event
99 */
100 @Override
101 public void onKeypress(final TKeypressEvent keypress) {
102
103 if (menu.isActive()) {
104 menu.onKeypress(keypress);
105 return;
106 }
107
108 if (keypress.equals(kbEnter)) {
109 dispatch();
110 return;
111 }
112
113 if (keypress.equals(kbRight)) {
114 dispatch();
115 return;
116 }
117
118 if (keypress.equals(kbDown)) {
119 getParent().switchWidget(true);
120 return;
121 }
122
123 if (keypress.equals(kbUp)) {
124 getParent().switchWidget(false);
125 return;
126 }
127
128 if (keypress.equals(kbLeft)) {
129 TMenu parentMenu = (TMenu) getParent();
130 if (parentMenu.isSubMenu) {
131 getApplication().closeSubMenu();
132 } else {
133 getApplication().switchMenu(false);
134 }
135 return;
136 }
137
138 if (keypress.equals(kbEsc)) {
139 getApplication().closeMenu();
140 return;
141 }
142 }
143
144 /**
145 * Override dispatch() to do nothing.
146 */
147 @Override
148 public void dispatch() {
149 assert (isEnabled());
150 if (isAbsoluteActive()) {
151 if (!menu.isActive()) {
152 getApplication().addSubMenu(menu);
153 menu.setActive(true);
154 }
155 }
156 }
157
158 /**
159 * Returns my active widget.
160 *
161 * @return widget that is active, or this if no children
162 */
163 @Override
164 public TWidget getActiveChild() {
165 if (menu.isActive()) {
166 return menu;
167 }
168 // Menu not active, return me
169 return this;
170 }
171
172 /**
173 * Convenience function to add a custom menu item.
174 *
175 * @param id menu item ID. Must be greater than 1024.
176 * @param label menu item label
177 * @param key global keyboard accelerator
178 * @return the new menu item
179 */
180 public TMenuItem addItem(final int id, final String label,
181 final TKeypress key) {
182
183 return menu.addItem(id, label, key);
184 }
185
186 /**
187 * Convenience function to add a menu item.
188 *
189 * @param id menu item ID. Must be greater than 1024.
190 * @param label menu item label
191 * @return the new menu item
192 */
193 public TMenuItem addItem(final int id, final String label) {
194 return menu.addItem(id, label);
195 }
196
197 /**
198 * Convenience function to add one of the default menu items.
199 *
200 * @param id menu item ID. Must be between 0 (inclusive) and 1023
201 * (inclusive).
202 * @return the new menu item
203 */
204 public TMenuItem addDefaultItem(final int id) {
205 return menu.addDefaultItem(id);
206 }
207
208 /**
209 * Convenience function to add a menu separator.
210 */
211 public void addSeparator() {
212 menu.addSeparator();
213 }
214
215 /**
216 * Convenience function to add a sub-menu.
217 *
218 * @param title menu title. Title must contain a keyboard shortcut,
219 * denoted by prefixing a letter with "&", e.g. "&File"
220 * @return the new sub-menu
221 */
222 public TSubMenu addSubMenu(final String title) {
223 return menu.addSubMenu(title);
224 }
225
226
227 }