X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTRadioButton.java;h=dcc5c13699f03fefceabbc54bf65bac1b6624745;hb=HEAD;hp=ddeec0911711b6621be41e4854b459826f93537f;hpb=7c870d89433346ccb5505f8f9ba62d3fc18fe996;p=fanfix.git diff --git a/src/jexer/TRadioButton.java b/src/jexer/TRadioButton.java index ddeec09..dcc5c13 100644 --- a/src/jexer/TRadioButton.java +++ b/src/jexer/TRadioButton.java @@ -1,29 +1,27 @@ -/** +/* * Jexer - Java Text User Interface * - * License: LGPLv3 or later - * - * This module is licensed under the GNU Lesser General Public License - * Version 3. Please see the file "COPYING" in this directory for more - * information about the GNU Lesser General Public License Version 3. + * The MIT License (MIT) * - * Copyright (C) 2015 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - * http://www.gnu.org/licenses/, or write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * @author Kevin Lamonte [kevin.lamonte@gmail.com] * @version 1 @@ -32,64 +30,47 @@ package jexer; import jexer.bits.CellAttributes; import jexer.bits.GraphicsChars; +import jexer.bits.MnemonicString; +import jexer.bits.StringUtils; import jexer.event.TKeypressEvent; import jexer.event.TMouseEvent; import static jexer.TKeypress.*; /** * TRadioButton implements a selectable radio button. + * + * If the user clicks or presses space on this button, it is selected. + * + * If the user presses escape on this button, it is unselected. */ -public final class TRadioButton extends TWidget { +public class TRadioButton extends TWidget { - /** - * RadioButton state, true means selected. - */ - private boolean selected = false; - - /** - * Get RadioButton state, true means selected. - * - * @return if true then this is the one button in the group that is - * selected - */ - public boolean isSelected() { - return selected; - } + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ /** - * Set RadioButton state, true means selected. Note package private - * access. - * - * @param selected if true then this is the one button in the group that - * is selected + * RadioButton state, true means selected. Note package private access. */ - void setSelected(final boolean selected) { - this.selected = selected; - } + boolean selected = false; /** - * Label for this radio button. + * The shortcut and radio button label. */ - private String label; + private MnemonicString mnemonic; /** * ID for this radio button. Buttons start counting at 1 in the - * RadioGroup. + * RadioGroup. Note package private access. */ - private int id; + int id; - /** - * Get ID for this radio button. Buttons start counting at 1 in the - * RadioGroup. - * - * @return the ID - */ - public int getId() { - return id; - } + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ /** - * Public constructor. + * Package private constructor. * * @param parent parent widget * @param x column relative to parent @@ -97,19 +78,25 @@ public final class TRadioButton extends TWidget { * @param label label to display next to (right of) the radiobutton * @param id ID for this radio button */ - public TRadioButton(final TRadioGroup parent, final int x, final int y, + TRadioButton(final TRadioGroup parent, final int x, final int y, final String label, final int id) { // Set parent and window - super(parent, x, y, label.length() + 4, 1); + super(parent, x, y, StringUtils.width(label) + 4, 1); - this.label = label; + mnemonic = new MnemonicString(label); this.id = id; setCursorVisible(true); setCursorX(1); + + parent.addRadioButton(this); } + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * Returns true if the mouse is currently on the radio button. * @@ -126,64 +113,145 @@ public final class TRadioButton extends TWidget { return false; } + /** + * Handle mouse button presses. + * + * @param mouse mouse button press event + */ + @Override + public void onMouseDown(final TMouseEvent mouse) { + if ((mouseOnRadioButton(mouse)) && (mouse.isMouse1())) { + // Switch state + ((TRadioGroup) getParent()).setSelected(id); + } + } + + /** + * Handle keystrokes. + * + * @param keypress keystroke event + */ + @Override + public void onKeypress(final TKeypressEvent keypress) { + + if (keypress.equals(kbSpace)) { + ((TRadioGroup) getParent()).setSelected(id); + return; + } + + if (keypress.equals(kbEsc)) { + TRadioGroup parent = (TRadioGroup) getParent(); + if (parent.requiresSelection == false) { + selected = false; + parent.setSelected(0); + } + return; + } + + // Pass to parent for the things we don't care about. + super.onKeypress(keypress); + } + + // ------------------------------------------------------------------------ + // TWidget ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Override TWidget's width: we can only set width at construction time. + * + * @param width new widget width (ignored) + */ + @Override + public void setWidth(final int width) { + // Do nothing + } + + /** + * Override TWidget's height: we can only set height at construction + * time. + * + * @param height new widget height (ignored) + */ + @Override + public void setHeight(final int height) { + // Do nothing + } + /** * Draw a radio button with label. */ @Override public void draw() { CellAttributes radioButtonColor; + CellAttributes mnemonicColor; if (isAbsoluteActive()) { radioButtonColor = getTheme().getColor("tradiobutton.active"); + mnemonicColor = getTheme().getColor("tradiobutton.mnemonic.highlighted"); } else { radioButtonColor = getTheme().getColor("tradiobutton.inactive"); + mnemonicColor = getTheme().getColor("tradiobutton.mnemonic"); } - getScreen().putCharXY(0, 0, '(', radioButtonColor); + putCharXY(0, 0, '(', radioButtonColor); if (selected) { - getScreen().putCharXY(1, 0, GraphicsChars.CP437[0x07], - radioButtonColor); + putCharXY(1, 0, GraphicsChars.CP437[0x07], radioButtonColor); } else { - getScreen().putCharXY(1, 0, ' ', radioButtonColor); + putCharXY(1, 0, ' ', radioButtonColor); + } + putCharXY(2, 0, ')', radioButtonColor); + putStringXY(4, 0, mnemonic.getRawLabel(), radioButtonColor); + if (mnemonic.getScreenShortcutIdx() >= 0) { + putCharXY(4 + mnemonic.getScreenShortcutIdx(), 0, + mnemonic.getShortcut(), mnemonicColor); } - getScreen().putCharXY(2, 0, ')', radioButtonColor); - getScreen().putStrXY(4, 0, label, radioButtonColor); } + // ------------------------------------------------------------------------ + // TRadioButton ----------------------------------------------------------- + // ------------------------------------------------------------------------ + /** - * Handle mouse button presses. + * Get RadioButton state, true means selected. * - * @param mouse mouse button press event + * @return if true then this is the one button in the group that is + * selected */ - @Override - public void onMouseDown(final TMouseEvent mouse) { - if ((mouseOnRadioButton(mouse)) && (mouse.isMouse1())) { - // Switch state - selected = !selected; - if (selected) { - ((TRadioGroup) getParent()).setSelected(this); - } - } + public boolean isSelected() { + return selected; } /** - * Handle keystrokes. + * Set RadioButton state, true means selected. * - * @param keypress keystroke event + * @param selected if true then this is the one button in the group that + * is selected */ - @Override - public void onKeypress(final TKeypressEvent keypress) { - - if (keypress.equals(kbSpace)) { - selected = !selected; - if (selected) { - ((TRadioGroup) getParent()).setSelected(this); - } - return; + public void setSelected(final boolean selected) { + if (selected == true) { + ((TRadioGroup) getParent()).setSelected(id); + } else { + ((TRadioGroup) getParent()).setSelected(0); } + } - // Pass to parent for the things we don't care about. - super.onKeypress(keypress); + /** + * Get ID for this radio button. Buttons start counting at 1 in the + * RadioGroup. + * + * @return the ID + */ + public int getId() { + return id; + } + + /** + * Get the mnemonic string for this button. + * + * @return mnemonic string + */ + public MnemonicString getMnemonic() { + return mnemonic; } }