From a42bbdc0ca9728fb6dcdbdc7fcb66d2519282ef5 Mon Sep 17 00:00:00 2001 From: myk Date: Thu, 14 Feb 2013 21:49:39 +0000 Subject: [PATCH] keep the focus on the ok/cancel buttons during a match restore focus to previous owner when the overlay is hidden properly handle all the various combinations of hover/focus/button presses in FButton --- .../effects/CountersProliferateEffect.java | 2 +- .../cardfactory/CardFactorySorceries.java | 8 +- .../card/spellability/TargetSelection.java | 4 +- .../java/forge/control/input/InputAttack.java | 2 +- .../java/forge/control/input/InputBlock.java | 2 +- .../forge/control/input/InputMulligan.java | 10 +- .../control/input/InputPassPriority.java | 2 +- .../control/input/InputPayDiscardCost.java | 5 +- .../input/InputPayManaCostAbility.java | 2 +- .../forge/control/input/InputPayManaX.java | 2 +- .../control/input/InputPayReturnCost.java | 2 +- .../forge/control/input/InputPaySacCost.java | 2 +- .../forge/control/input/InputSelectMany.java | 4 +- src/main/java/forge/gui/SOverlayUtils.java | 8 + .../deckeditor/controllers/CCardCatalog.java | 6 - .../forge/gui/download/GuiDownloader.java | 7 + .../forge/gui/framework/SDisplayUtil.java | 7 + .../forge/gui/match/controllers/CMessage.java | 2 - .../forge/gui/match/nonsingleton/CHand.java | 2 - .../java/forge/gui/match/views/VStack.java | 2 - src/main/java/forge/gui/toolbox/FButton.java | 155 ++++++++---------- src/main/java/forge/view/ButtonUtil.java | 102 +++--------- 22 files changed, 131 insertions(+), 207 deletions(-) diff --git a/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java b/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java index 90777977df7..f323b93c32d 100644 --- a/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java +++ b/src/main/java/forge/card/ability/effects/CountersProliferateEffect.java @@ -50,7 +50,7 @@ public class CountersProliferateEffect extends SpellEffect { @Override public void showMessage() { - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); CMatchUI.SINGLETON_INSTANCE.showMessage("Proliferate: Choose permanents and/or players"); } diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index db30c3141c3..b21dddcaae6 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -18,12 +18,12 @@ package forge.card.cardfactory; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map.Entry; import java.util.Vector; -import java.util.List; -import java.util.Collections; import javax.swing.JOptionPane; @@ -31,7 +31,6 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import forge.Card; - import forge.CardLists; import forge.CardPredicates; import forge.CardPredicates.Presets; @@ -55,7 +54,6 @@ import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.gui.match.CMatchUI; - import forge.util.Aggregates; import forge.view.ButtonUtil; @@ -802,7 +800,7 @@ public class CardFactorySorceries { sb.append(card.getName()).append(" - Select a target creature to gain Fear (up to "); sb.append(this.stop - this.count).append(" more)"); CMatchUI.SINGLETON_INSTANCE.showMessage(sb.toString()); - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } @Override diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java index 9226c221154..b8fea111c75 100644 --- a/src/main/java/forge/card/spellability/TargetSelection.java +++ b/src/main/java/forge/card/spellability/TargetSelection.java @@ -395,11 +395,11 @@ public class TargetSelection { if (!tgt.isMinTargetsChosen(sa.getSourceCard(), sa) || tgt.isDividedAsYouChoose()) { ButtonUtil.enableOnlyCancel(); } else { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } if (mandatory && tgt.hasCandidates(sa, true)) { - ButtonUtil.disableCancel(); + ButtonUtil.enableOnlyOk(); } } diff --git a/src/main/java/forge/control/input/InputAttack.java b/src/main/java/forge/control/input/InputAttack.java index 0903328083a..ebc322595ea 100644 --- a/src/main/java/forge/control/input/InputAttack.java +++ b/src/main/java/forge/control/input/InputAttack.java @@ -52,7 +52,7 @@ public class InputAttack extends Input { public final void showMessage() { // TODO still seems to have some issues with multiple planeswalkers - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); final Object o = Singletons.getModel().getGame().getCombat().nextDefender(); if (o == null) { diff --git a/src/main/java/forge/control/input/InputBlock.java b/src/main/java/forge/control/input/InputBlock.java index ab35803e56a..108013f8e63 100644 --- a/src/main/java/forge/control/input/InputBlock.java +++ b/src/main/java/forge/control/input/InputBlock.java @@ -75,7 +75,7 @@ public class InputBlock extends Input { @Override public final void showMessage() { // could add "Reset Blockers" button - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); if (this.currentAttacker == null) { diff --git a/src/main/java/forge/control/input/InputMulligan.java b/src/main/java/forge/control/input/InputMulligan.java index 38ad3e57900..d4b5a3ffe85 100644 --- a/src/main/java/forge/control/input/InputMulligan.java +++ b/src/main/java/forge/control/input/InputMulligan.java @@ -23,7 +23,6 @@ import java.util.List; import com.google.common.collect.Iterables; import forge.Card; - import forge.CardLists; import forge.CardPredicates; import forge.Singletons; @@ -61,9 +60,8 @@ public class InputMulligan extends Input { /** {@inheritDoc} */ @Override public final void showMessage() { - ButtonUtil.enableAll(); - VMatchUI.SINGLETON_INSTANCE.getBtnOK().setText("No"); - VMatchUI.SINGLETON_INSTANCE.getBtnCancel().setText("Yes"); + ButtonUtil.setButtonText("No", "Yes"); + ButtonUtil.enableAllFocusOk(); final String str = (Singletons.getModel().getGame().getPhaseHandler().getPlayerTurn().equals(Singletons.getControl().getPlayer()) @@ -77,14 +75,10 @@ public class InputMulligan extends Input { this.end(); } - - /** {@inheritDoc} */ @Override public final void selectButtonCancel() { final Player humanPlayer = Singletons.getControl().getPlayer(); - - final int newHand = humanPlayer.doMulligan(); if (newHand == 0) { diff --git a/src/main/java/forge/control/input/InputPassPriority.java b/src/main/java/forge/control/input/InputPassPriority.java index a54307c934e..382c85401f2 100644 --- a/src/main/java/forge/control/input/InputPassPriority.java +++ b/src/main/java/forge/control/input/InputPassPriority.java @@ -46,7 +46,7 @@ public class InputPassPriority extends Input { @Override public final void showMessage() { GuiDisplayUtil.updateGUI(); - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); final PhaseType phase = Singletons.getModel().getGame().getPhaseHandler().getPhase(); final Player player = Singletons.getModel().getGame().getPhaseHandler().getPriorityPlayer(); diff --git a/src/main/java/forge/control/input/InputPayDiscardCost.java b/src/main/java/forge/control/input/InputPayDiscardCost.java index 8c4eac36cb7..c10d0e80f25 100644 --- a/src/main/java/forge/control/input/InputPayDiscardCost.java +++ b/src/main/java/forge/control/input/InputPayDiscardCost.java @@ -20,10 +20,9 @@ package forge.control.input; import java.util.List; import forge.Card; -import forge.Singletons; - import forge.CardLists; import forge.Command; +import forge.Singletons; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.CostDiscard; import forge.card.spellability.SpellAbility; @@ -108,7 +107,7 @@ public class InputPayDiscardCost extends Input { ButtonUtil.enableOnlyCancel(); } else { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } } diff --git a/src/main/java/forge/control/input/InputPayManaCostAbility.java b/src/main/java/forge/control/input/InputPayManaCostAbility.java index e40727e86fd..043cc1b742f 100644 --- a/src/main/java/forge/control/input/InputPayManaCostAbility.java +++ b/src/main/java/forge/control/input/InputPayManaCostAbility.java @@ -218,7 +218,7 @@ public class InputPayManaCostAbility extends InputPayMana { public final void showMessage() { ButtonUtil.enableOnlyCancel(); if (this.showOnlyOKButton) { - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); } final StringBuilder msg = new StringBuilder(this.message + "Pay Mana Cost: " + this.manaCost); if (this.phyLifeToLose > 0) { diff --git a/src/main/java/forge/control/input/InputPayManaX.java b/src/main/java/forge/control/input/InputPayManaX.java index f55e8765156..40b3dd66c7c 100644 --- a/src/main/java/forge/control/input/InputPayManaX.java +++ b/src/main/java/forge/control/input/InputPayManaX.java @@ -42,7 +42,7 @@ public class InputPayManaX extends InputPayMana { // only cancel if partially paid an X value // or X is 0, and x can't be 0 } else { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } StringBuilder msg = new StringBuilder("Pay X Mana Cost for "); diff --git a/src/main/java/forge/control/input/InputPayReturnCost.java b/src/main/java/forge/control/input/InputPayReturnCost.java index d6ff9cbd4c8..9764a89eccf 100644 --- a/src/main/java/forge/control/input/InputPayReturnCost.java +++ b/src/main/java/forge/control/input/InputPayReturnCost.java @@ -107,7 +107,7 @@ public class InputPayReturnCost extends Input { ButtonUtil.enableOnlyCancel(); } else { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } } diff --git a/src/main/java/forge/control/input/InputPaySacCost.java b/src/main/java/forge/control/input/InputPaySacCost.java index 7651e35864b..2a6100fc79c 100644 --- a/src/main/java/forge/control/input/InputPaySacCost.java +++ b/src/main/java/forge/control/input/InputPaySacCost.java @@ -108,7 +108,7 @@ public class InputPaySacCost extends Input { ButtonUtil.enableOnlyCancel(); } else { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } } diff --git a/src/main/java/forge/control/input/InputSelectMany.java b/src/main/java/forge/control/input/InputSelectMany.java index 3377426d5a0..b4f9f497150 100644 --- a/src/main/java/forge/control/input/InputSelectMany.java +++ b/src/main/java/forge/control/input/InputSelectMany.java @@ -39,13 +39,13 @@ public abstract class InputSelectMany extends Input { boolean canOk = hasEnoughTargets(); if (canOk && canCancel) { - ButtonUtil.enableAll(); + ButtonUtil.enableAllFocusOk(); } if (!canOk && canCancel) { ButtonUtil.enableOnlyCancel(); } if (canOk && !canCancel) { - ButtonUtil.enableOnlyOK(); + ButtonUtil.enableOnlyOk(); } if (!canOk && !canCancel) { ButtonUtil.disableAll(); diff --git a/src/main/java/forge/gui/SOverlayUtils.java b/src/main/java/forge/gui/SOverlayUtils.java index 2b9f79dd46a..bff7798df8d 100644 --- a/src/main/java/forge/gui/SOverlayUtils.java +++ b/src/main/java/forge/gui/SOverlayUtils.java @@ -1,11 +1,13 @@ package forge.gui; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import javax.swing.FocusManager; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; @@ -117,7 +119,9 @@ public final class SOverlayUtils { return overlay; } + private static Component prevFocusOwner; public static void showOverlay() { + prevFocusOwner = FocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); FOverlay.SINGLETON_INSTANCE.getPanel().setVisible(true); // ensure no background element has focus FOverlay.SINGLETON_INSTANCE.getPanel().requestFocusInWindow(); @@ -129,6 +133,10 @@ public final class SOverlayUtils { public static void hideOverlay() { FOverlay.SINGLETON_INSTANCE.getPanel().removeAll(); FOverlay.SINGLETON_INSTANCE.getPanel().setVisible(false); + if (null != prevFocusOwner) { + prevFocusOwner.requestFocusInWindow(); + prevFocusOwner = null; + } } public static void showTargetingOverlay() { diff --git a/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java b/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java index 0b658156114..4bb00f8cec6 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java @@ -1,7 +1,5 @@ package forge.gui.deckeditor.controllers; -import java.awt.Component; -import java.awt.KeyboardFocusManager; import java.awt.Toolkit; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -155,7 +153,6 @@ public enum CCardCatalog implements ICDoc { GuiUtils.addMenuItem(popup, "Sets...", null, new Runnable() { @Override public void run() { - final Component prevFocusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); final DialogChooseSets dialog = new DialogChooseSets(null, null, true); dialog.setOkCallback(new Runnable() { @Override @@ -187,9 +184,6 @@ public enum CCardCatalog implements ICDoc { } addRestriction(buildSetRestriction(label.toString(), setCodes, dialog.getWantReprints()), null, null); - if (null != prevFocusOwner) { - prevFocusOwner.requestFocusInWindow(); - } } }); } diff --git a/src/main/java/forge/gui/download/GuiDownloader.java b/src/main/java/forge/gui/download/GuiDownloader.java index 0b21ebb1f01..4b75291bbfe 100644 --- a/src/main/java/forge/gui/download/GuiDownloader.java +++ b/src/main/java/forge/gui/download/GuiDownloader.java @@ -43,6 +43,7 @@ import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; @@ -190,6 +191,12 @@ public abstract class GuiDownloader extends DefaultBoundedRangeModel implements btnStart.setVisible(true); btnStart.addActionListener(actStartDownload); } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + btnStart.requestFocusInWindow(); + } + }); } private void setCancel(final boolean cancel) { diff --git a/src/main/java/forge/gui/framework/SDisplayUtil.java b/src/main/java/forge/gui/framework/SDisplayUtil.java index 500f465b20a..05fb0b26a63 100644 --- a/src/main/java/forge/gui/framework/SDisplayUtil.java +++ b/src/main/java/forge/gui/framework/SDisplayUtil.java @@ -1,6 +1,8 @@ package forge.gui.framework; import java.awt.Color; +import java.awt.Component; +import java.awt.KeyboardFocusManager; import java.util.Timer; import java.util.TimerTask; @@ -84,6 +86,11 @@ public class SDisplayUtil { /** @param tab0   {@link java.gui.framework.IVDoc} */ public static void showTab(final IVDoc tab0) { + Component c = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); tab0.getParentCell().setSelected(tab0); + // set focus back to previous owner, if any + if (null != c) { + c.requestFocusInWindow(); + } } } diff --git a/src/main/java/forge/gui/match/controllers/CMessage.java b/src/main/java/forge/gui/match/controllers/CMessage.java index adda7e18c8c..29163d185fc 100644 --- a/src/main/java/forge/gui/match/controllers/CMessage.java +++ b/src/main/java/forge/gui/match/controllers/CMessage.java @@ -41,7 +41,6 @@ public enum CMessage implements ICDoc { @Override public void actionPerformed(final ActionEvent evt) { inputControl.selectButtonCancel(); - VMessage.SINGLETON_INSTANCE.getBtnOK().requestFocusInWindow(); } }; @@ -49,7 +48,6 @@ public enum CMessage implements ICDoc { @Override public void actionPerformed(final ActionEvent evt) { inputControl.selectButtonOK(); - VMessage.SINGLETON_INSTANCE.getBtnOK().requestFocusInWindow(); } }; diff --git a/src/main/java/forge/gui/match/nonsingleton/CHand.java b/src/main/java/forge/gui/match/nonsingleton/CHand.java index d64603f6f53..dac5bf7fa91 100644 --- a/src/main/java/forge/gui/match/nonsingleton/CHand.java +++ b/src/main/java/forge/gui/match/nonsingleton/CHand.java @@ -38,7 +38,6 @@ import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.gui.framework.ICDoc; import forge.gui.match.CMatchUI; -import forge.gui.match.VMatchUI; import forge.gui.match.controllers.CMessage; import forge.view.arcane.CardPanel; import forge.view.arcane.HandArea; @@ -186,7 +185,6 @@ public class CHand implements ICDoc { final Card c = view.getHandArea().getCardFromMouseOverPanel(); if (c != null) { CMessage.SINGLETON_INSTANCE.getInputControl().selectCard(c, Singletons.getControl().getPlayer().getZone(ZoneType.Hand)); - VMatchUI.SINGLETON_INSTANCE.getBtnOK().requestFocusInWindow(); } } diff --git a/src/main/java/forge/gui/match/views/VStack.java b/src/main/java/forge/gui/match/views/VStack.java index 0a1fa2fbefa..f652a9f3e9a 100644 --- a/src/main/java/forge/gui/match/views/VStack.java +++ b/src/main/java/forge/gui/match/views/VStack.java @@ -41,7 +41,6 @@ import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.gui.match.CMatchUI; -import forge.gui.match.VMatchUI; import forge.gui.match.controllers.CStack; import forge.gui.toolbox.FSkin; import forge.properties.NewConstants; @@ -203,7 +202,6 @@ public enum VStack implements IVDoc { } } - VMatchUI.SINGLETON_INSTANCE.getBtnOK().requestFocusInWindow(); parentCell.getBody().repaint(); } diff --git a/src/main/java/forge/gui/toolbox/FButton.java b/src/main/java/forge/gui/toolbox/FButton.java index 074d860891c..77c46f61d77 100644 --- a/src/main/java/forge/gui/toolbox/FButton.java +++ b/src/main/java/forge/gui/toolbox/FButton.java @@ -29,6 +29,7 @@ import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import javax.swing.BorderFactory; import javax.swing.JButton; @@ -50,6 +51,7 @@ public class FButton extends JButton implements ILocalRepaint { private int w, h = 0; private boolean allImagesPresent = false; private boolean toggle = false; + private boolean hovered = false; private final AlphaComposite disabledComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.25f); private KeyAdapter klEnter; @@ -60,14 +62,8 @@ public class FButton extends JButton implements ILocalRepaint { this(""); } - /** - * Instantiates a new FButton. - * - * @param msg - * the msg - */ - public FButton(final String msg) { - super(msg); + public FButton(final String label) { + super(label); this.setOpaque(false); this.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); this.setBackground(Color.red); @@ -96,52 +92,35 @@ public class FButton extends JButton implements ILocalRepaint { // Mouse events this.addMouseListener(new java.awt.event.MouseAdapter() { @Override - public void mouseEntered(final java.awt.event.MouseEvent evt) { - if (isToggled()) { return; } - - if (FButton.this.isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_RIGHT).getImage(); - } + public void mouseEntered(MouseEvent evt) { + hovered = true; + if (isToggled() || !isEnabled()) { return; } + resetImg(); + repaintSelf(); } @Override - public void mouseExited(final java.awt.event.MouseEvent evt) { - if (isToggled()) { return; } - - if (FButton.this.isEnabled() && !FButton.this.isFocusOwner()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_RIGHT).getImage(); - } - else if (FButton.this.isEnabled() && FButton.this.isFocusOwner()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_RIGHT).getImage(); - } + public void mouseExited(MouseEvent evt) { + hovered = false; + if (isToggled() || !isEnabled()) { return; } + resetImg(); + repaintSelf(); } @Override - public void mousePressed(final java.awt.event.MouseEvent evt) { - if (isToggled()) { return; } - - if (FButton.this.isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_RIGHT).getImage(); - } + public void mousePressed(MouseEvent evt) { + if (isToggled() || !isEnabled()) { return; } + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_RIGHT).getImage(); + repaintSelf(); } @Override - public void mouseReleased(final java.awt.event.MouseEvent evt) { - if (isToggled()) { return; } - - if (FButton.this.isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DOWN_RIGHT).getImage(); - } + public void mouseReleased(MouseEvent evt) { + if (isToggled() || !isEnabled()) { return; } + resetImg(); + repaintSelf(); } }); @@ -150,45 +129,51 @@ public class FButton extends JButton implements ILocalRepaint { @Override public void focusGained(FocusEvent e) { if (isToggled()) { return; } - - if (FButton.this.isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_RIGHT).getImage(); - } - + resetImg(); addKeyListener(klEnter); + repaintSelf(); } @Override public void focusLost(FocusEvent e) { if (isToggled()) { return; } - - if (FButton.this.isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_RIGHT).getImage(); - } - + resetImg(); removeKeyListener(klEnter); + repaintSelf(); } }); } + private void resetImg() { + if (hovered) { + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_OVER_RIGHT).getImage(); + } + else if (isFocusOwner()) { + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_FOCUS_RIGHT).getImage(); + } else { + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_RIGHT).getImage(); + } + } + @Override public void setEnabled(boolean b0) { if (!b0) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_RIGHT).getImage(); + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_RIGHT).getImage(); } else { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_RIGHT).getImage(); + resetImg(); } super.setEnabled(b0); + repaintSelf(); } /** @@ -203,40 +188,32 @@ public class FButton extends JButton implements ILocalRepaint { /** @param b0   boolean. */ public void setToggled(boolean b0) { if (b0) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_RIGHT).getImage(); + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_TOGGLE_RIGHT).getImage(); } else if (isEnabled()) { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_UP_RIGHT).getImage(); - repaintSelf(); + resetImg(); } else { - FButton.this.imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_LEFT).getImage(); - FButton.this.imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_CENTER).getImage(); - FButton.this.imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_RIGHT).getImage(); - repaintSelf(); + imgL = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_LEFT).getImage(); + imgM = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_CENTER).getImage(); + imgR = FSkin.getIcon(FSkin.ButtonImages.IMG_BTN_DISABLED_RIGHT).getImage(); } this.toggle = b0; + repaintSelf(); } /** Prevent button from repainting the whole screen. */ @Override public void repaintSelf() { - final Dimension d = FButton.this.getSize(); + final Dimension d = getSize(); repaint(0, 0, d.width, d.height); } - /* - * (non-Javadoc) - * - * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) - */ @Override protected void paintComponent(final Graphics g) { - if (!this.allImagesPresent) { + if (!allImagesPresent) { return; } @@ -246,16 +223,16 @@ public class FButton extends JButton implements ILocalRepaint { g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - if (!this.isEnabled()) { + if (!isEnabled()) { g2d.setComposite(this.disabledComposite); } - this.w = this.getWidth(); - this.h = this.getHeight(); + w = getWidth(); + h = getHeight(); - g2d.drawImage(this.imgL, 0, 0, this.h, this.h, null); - g2d.drawImage(this.imgM, this.h, 0, this.w - (2 * this.h), this.h, null); - g2d.drawImage(this.imgR, this.w - this.h, 0, this.h, this.h, null); + g2d.drawImage(imgL, 0, 0, this.h, this.h, null); + g2d.drawImage(imgM, this.h, 0, this.w - (2 * this.h), this.h, null); + g2d.drawImage(imgR, this.w - this.h, 0, this.h, this.h, null); super.paintComponent(g); } diff --git a/src/main/java/forge/view/ButtonUtil.java b/src/main/java/forge/view/ButtonUtil.java index db49126363a..a30175a2547 100644 --- a/src/main/java/forge/view/ButtonUtil.java +++ b/src/main/java/forge/view/ButtonUtil.java @@ -22,103 +22,49 @@ import javax.swing.JButton; import forge.gui.match.VMatchUI; /** - *

- * ButtonUtil class. - *

- * - * @author Forge - * @version $Id$ + * Manages match UI OK/Cancel button enabling and focus */ public class ButtonUtil { - /** - *

- * reset. - *

- */ + public static void setButtonText(String okLabel, String cancelLabel) { + getOk().setText(okLabel); + getCancel().setText(cancelLabel); + } + public static void reset() { - ButtonUtil.getOK().setText("OK"); - ButtonUtil.getCancel().setText("Cancel"); - - ButtonUtil.getOK().setEnabled(false); - ButtonUtil.getCancel().setEnabled(false); + disableAll(); + getOk().setText("OK"); + getCancel().setText("Cancel"); } - /** - *

- * enableOnlyOK. - *

- */ - public static void enableOnlyOK() { - ButtonUtil.getOK().setEnabled(true); - ButtonUtil.getCancel().setEnabled(false); + public static void enableOnlyOk() { + getCancel().setEnabled(false); + enableAndFocus(getOk()); } - /** - *

- * enableOnlyCancel. - *

- */ public static void enableOnlyCancel() { - ButtonUtil.getOK().setEnabled(false); - ButtonUtil.getCancel().setEnabled(true); + getOk().setEnabled(false); + enableAndFocus(getCancel()); } - /** - *

- * disableAll. - *

- */ public static void disableAll() { - ButtonUtil.getOK().setEnabled(false); - ButtonUtil.getCancel().setEnabled(false); + getOk().setEnabled(false); + getCancel().setEnabled(false); } - /** - *

- * enableAll. - *

- */ - public static void enableAll() { - ButtonUtil.getOK().setEnabled(true); - ButtonUtil.getCancel().setEnabled(true); + public static void enableAllFocusOk() { + enableAndFocus(getOk()); + getCancel().setEnabled(true); } - /** - *

- * disableOK. - *

- */ - public static void disableOK() { - ButtonUtil.getOK().setEnabled(false); + private static void enableAndFocus(final JButton button) { + button.setEnabled(true); + button.requestFocusInWindow(); } - - /** - *

- * disableCancel. - *

- */ - public static void disableCancel() { - ButtonUtil.getCancel().setEnabled(false); - } - - /** - *

- * getOK. - *

- * - * @return a {@link forge.MyButton} object. - */ - private static JButton getOK() { + + private static JButton getOk() { return VMatchUI.SINGLETON_INSTANCE.getBtnOK(); } - /** - *

- * getCancel. - *

- * - * @return a {@link forge.MyButton} object. - */ private static JButton getCancel() { return VMatchUI.SINGLETON_INSTANCE.getBtnCancel(); }