X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTButton.java;h=964035fc5a0ee47241aed898cb59c63c5354746d;hb=255967a89dac82295953090d65f58cf224fbbed6;hp=fc93c782b5fda5c66ff01a9297fc23ee53588837;hpb=a325f111c91ec64c0bb0319dedd18d36f4b720c9;p=fanfix.git diff --git a/src/jexer/TButton.java b/src/jexer/TButton.java index fc93c78..964035f 100644 --- a/src/jexer/TButton.java +++ b/src/jexer/TButton.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2017 Kevin Lamonte + * Copyright (C) 2019 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -42,22 +42,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 MnemonicString getMnemonic() { - return mnemonic; - } - /** * Remember mouse state. */ @@ -74,28 +69,13 @@ public final class TButton extends TWidget { private TAction action; /** - * The time at which dispatch() was called. - */ - private long dispatchTime; - - /** - * How long to animate dispatch of the event in millis. + * The background color used for the button "shadow", or NULL for "no shadow". */ - private static final long DISPATCH_TIME = 75; - - /** - * 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) { - long now = System.currentTimeMillis(); - if (now - dispatchTime > DISPATCH_TIME) { - action.DO(); - dispatchTime = now; - } - } - } + private CellAttributes shadowColor; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Private constructor. @@ -117,6 +97,11 @@ public final class TButton extends TWidget { setY(y); setHeight(2); setWidth(mnemonic.getRawLabel().length() + 3); + + shadowColor = new CellAttributes(); + shadowColor.setTo(getWindow().getBackground()); + shadowColor.setForeColor(Color.BLACK); + shadowColor.setBold(false); } /** @@ -135,6 +120,10 @@ public final class TButton extends TWidget { this.action = action; } + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * Returns true if the mouse is currently on the button. * @@ -155,61 +144,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); - - long now = System.currentTimeMillis(); - boolean inDispatch = false; - if (now - dispatchTime < DISPATCH_TIME) { - inDispatch = true; - } - - 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 || inDispatch) { - 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 || inDispatch) { - getScreen().putCharXY(2 + mnemonic.getShortcutIdx(), 0, - mnemonic.getShortcut(), menuMnemonicColor); - } else { - getScreen().putCharXY(1 + mnemonic.getShortcutIdx(), 0, - mnemonic.getShortcut(), menuMnemonicColor); - } - - } - } - /** * Handle mouse button presses. * @@ -235,7 +169,6 @@ public final class TButton extends TWidget { this.mouse = mouse; if (inButtonPress && mouse.isMouse1()) { - inButtonPress = false; // Dispatch the event dispatch(); } @@ -275,4 +208,96 @@ public final class TButton extends TWidget { super.onKeypress(keypress); } + // ------------------------------------------------------------------------ + // TWidget ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * 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.getShortcutIdx() >= 0) { + if (inButtonPress) { + putCharXY(2 + mnemonic.getShortcutIdx(), 0, + mnemonic.getShortcut(), menuMnemonicColor); + } else { + putCharXY(1 + mnemonic.getShortcutIdx(), 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(); + inButtonPress = false; + } + } + + /** + * Set the background color used for the button "shadow". + *

+ * Can be NULL for "no shadow". + * + * @param color the new background color, or NULL if none + */ + 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; + } + } + }