X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTButton.java;h=d1d7b390cca0170e0c33f9cde044e968c64fc947;hb=HEAD;hp=c05a4b1025be40ec9bf7e76c858a9c0bba404c78;hpb=daa4106c096cd4d2b92c3cbae6491edccd25fcc4;p=fanfix.git diff --git a/src/jexer/TButton.java b/src/jexer/TButton.java index c05a4b1..d1d7b39 100644 --- a/src/jexer/TButton.java +++ b/src/jexer/TButton.java @@ -1,29 +1,27 @@ /* * Jexer - Java Text User Interface * - * License: LGPLv3 or later + * The MIT License (MIT) * - * 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. + * Copyright (C) 2019 Kevin Lamonte * - * Copyright (C) 2015 Kevin Lamonte + * 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 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. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * 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. - * - * 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 @@ -34,9 +32,11 @@ import jexer.bits.CellAttributes; import jexer.bits.Color; import jexer.bits.GraphicsChars; import jexer.bits.MnemonicString; +import jexer.bits.StringUtils; import jexer.event.TKeypressEvent; import jexer.event.TMouseEvent; -import static jexer.TKeypress.*; +import static jexer.TKeypress.kbEnter; +import static jexer.TKeypress.kbSpace; /** * TButton implements a simple button. To make the button do something, pass @@ -44,22 +44,17 @@ import static jexer.TKeypress.*; * * @see TAction#DO() */ -public final class TButton extends TWidget { +public class TButton extends TWidget { + + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ /** * The shortcut and button text. */ private MnemonicString mnemonic; - /** - * Get the mnemonic string for this button. - * - * @return mnemonic string - */ - public final MnemonicString getMnemonic() { - return mnemonic; - } - /** * Remember mouse state. */ @@ -75,6 +70,16 @@ public final class TButton extends TWidget { */ private TAction action; + /** + * The background color used for the button "shadow", or null for "no + * shadow". + */ + private CellAttributes shadowColor; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * Private constructor. * @@ -93,8 +98,20 @@ public final class TButton extends TWidget { setX(x); setY(y); - setHeight(2); - setWidth(mnemonic.getRawLabel().length() + 3); + super.setHeight(2); + super.setWidth(StringUtils.width(mnemonic.getRawLabel()) + 3); + + shadowColor = new CellAttributes(); + shadowColor.setTo(getWindow().getBackground()); + shadowColor.setForeColor(Color.BLACK); + shadowColor.setBold(false); + + // Since we set dimensions after TWidget's constructor, we need to + // update the layout manager. + if (getParent().getLayoutManager() != null) { + getParent().getLayoutManager().remove(this); + getParent().getLayoutManager().add(this); + } } /** @@ -112,6 +129,24 @@ public final class TButton extends TWidget { this(parent, text, x, y); this.action = action; } + + /** + * The action to call when the button is pressed. + **/ + public TAction getAction() { + return action; + } + + /** + * The action to call when the button is pressed. + **/ + public void setAction(TAction action) { + this.action = action; + } + + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Returns true if the mouse is currently on the button. @@ -133,55 +168,6 @@ public final class TButton extends TWidget { return false; } - /** - * Draw a button with a shadow. - */ - @Override - public void draw() { - CellAttributes buttonColor; - CellAttributes menuMnemonicColor; - CellAttributes shadowColor = new CellAttributes(); - shadowColor.setTo(getWindow().getBackground()); - shadowColor.setForeColor(Color.BLACK); - shadowColor.setBold(false); - - if (!isEnabled()) { - buttonColor = getTheme().getColor("tbutton.disabled"); - menuMnemonicColor = getTheme().getColor("tbutton.disabled"); - } else if (isAbsoluteActive()) { - buttonColor = getTheme().getColor("tbutton.active"); - menuMnemonicColor = getTheme().getColor("tbutton.mnemonic.highlighted"); - } else { - buttonColor = getTheme().getColor("tbutton.inactive"); - menuMnemonicColor = getTheme().getColor("tbutton.mnemonic"); - } - - if (inButtonPress) { - getScreen().putCharXY(1, 0, ' ', buttonColor); - getScreen().putStringXY(2, 0, mnemonic.getRawLabel(), buttonColor); - getScreen().putCharXY(getWidth() - 1, 0, ' ', buttonColor); - } else { - getScreen().putCharXY(0, 0, ' ', buttonColor); - getScreen().putStringXY(1, 0, mnemonic.getRawLabel(), buttonColor); - getScreen().putCharXY(getWidth() - 2, 0, ' ', buttonColor); - - getScreen().putCharXY(getWidth() - 1, 0, - GraphicsChars.CP437[0xDC], shadowColor); - getScreen().hLineXY(1, 1, getWidth() - 1, - GraphicsChars.CP437[0xDF], shadowColor); - } - if (mnemonic.getShortcutIdx() >= 0) { - if (inButtonPress) { - getScreen().putCharXY(2 + mnemonic.getShortcutIdx(), 0, - mnemonic.getShortcut(), menuMnemonicColor); - } else { - getScreen().putCharXY(1 + mnemonic.getShortcutIdx(), 0, - mnemonic.getShortcut(), menuMnemonicColor); - } - - } - } - /** * Handle mouse button presses. * @@ -207,11 +193,8 @@ public final class TButton extends TWidget { this.mouse = mouse; if (inButtonPress && mouse.isMouse1()) { - inButtonPress = false; // Dispatch the event - if (action != null) { - action.DO(); - } + dispatch(); } } @@ -241,9 +224,7 @@ public final class TButton extends TWidget { || keypress.equals(kbSpace) ) { // Dispatch - if (action != null) { - action.DO(); - } + dispatch(); return; } @@ -251,4 +232,116 @@ public final class TButton extends TWidget { 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 button with a shadow. + */ + @Override + public void draw() { + CellAttributes buttonColor; + CellAttributes menuMnemonicColor; + + if (!isEnabled()) { + buttonColor = getTheme().getColor("tbutton.disabled"); + menuMnemonicColor = getTheme().getColor("tbutton.disabled"); + } else if (isAbsoluteActive()) { + buttonColor = getTheme().getColor("tbutton.active"); + menuMnemonicColor = getTheme().getColor("tbutton.mnemonic.highlighted"); + } else { + buttonColor = getTheme().getColor("tbutton.inactive"); + menuMnemonicColor = getTheme().getColor("tbutton.mnemonic"); + } + + if (inButtonPress) { + putCharXY(1, 0, ' ', buttonColor); + putStringXY(2, 0, mnemonic.getRawLabel(), buttonColor); + putCharXY(getWidth() - 1, 0, ' ', buttonColor); + } else { + putCharXY(0, 0, ' ', buttonColor); + putStringXY(1, 0, mnemonic.getRawLabel(), buttonColor); + putCharXY(getWidth() - 2, 0, ' ', buttonColor); + + if (shadowColor != null) { + putCharXY(getWidth() - 1, 0, + GraphicsChars.CP437[0xDC], shadowColor); + hLineXY(1, 1, getWidth() - 1, + GraphicsChars.CP437[0xDF], shadowColor); + } + } + if (mnemonic.getScreenShortcutIdx() >= 0) { + if (inButtonPress) { + putCharXY(2 + mnemonic.getScreenShortcutIdx(), 0, + mnemonic.getShortcut(), menuMnemonicColor); + } else { + putCharXY(1 + mnemonic.getScreenShortcutIdx(), 0, + mnemonic.getShortcut(), menuMnemonicColor); + } + } + } + + // ------------------------------------------------------------------------ + // TButton ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Get the mnemonic string for this button. + * + * @return mnemonic string + */ + public MnemonicString getMnemonic() { + return mnemonic; + } + + /** + * Act as though the button was pressed. This is useful for other UI + * elements to get the same action as if the user clicked the button. + */ + public void dispatch() { + if (action != null) { + action.DO(this); + inButtonPress = false; + } + } + + /** + * Set the background color used for the button "shadow". If null, no + * shadow will be drawn. + * + * @param color the new background color, or null for no shadow + */ + public void setShadowColor(final CellAttributes color) { + if (color != null) { + shadowColor = new CellAttributes(); + shadowColor.setTo(color); + shadowColor.setForeColor(Color.BLACK); + shadowColor.setBold(false); + } else { + shadowColor = null; + } + } + }