From b1bf0d3acacad143e666460872118a0ad500f12c Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Thu, 24 Jan 2013 04:47:36 +0000 Subject: [PATCH] myk's code contributions (vol. 1) - adds tooltips for the filter checkboxes (issue 657) - ensures the filter checkboxes are always in the same order - puts all labels and checkboxes in "official" order from the mtg rules book: color order: WHITE, BLUE, BLACK, RED, GREEN, COLORLESS, MULTICOLOR type order: LAND, ARTIFACT, CREATURE, ENCHANTMENT, PLANESWALKER, INSTANT, SORCERY --- .../forge/gui/deckeditor/SFilterUtil.java | 299 +++++++++--------- .../gui/deckeditor/views/VCardCatalog.java | 38 +-- .../gui/deckeditor/views/VCurrentDeck.java | 37 ++- 3 files changed, 186 insertions(+), 188 deletions(-) diff --git a/src/main/java/forge/gui/deckeditor/SFilterUtil.java b/src/main/java/forge/gui/deckeditor/SFilterUtil.java index 482411985c0..7cd2b6edbf9 100644 --- a/src/main/java/forge/gui/deckeditor/SFilterUtil.java +++ b/src/main/java/forge/gui/deckeditor/SFilterUtil.java @@ -34,36 +34,39 @@ import forge.util.PredicateString.StringOp; * Static factory; holds blocks of form elements and predicates * which are used in various editing environments. *

- * (S at beginning of class name denotes a static factory.) - */ -public class SFilterUtil { - /** An enum to reference checkbox objects in their respective maps. */ - private enum FilterProperty { /** */ - BLACK, /** */ - BLUE, /** */ - COLORLESS, /** */ - GREEN, /** */ - MULTICOLOR, /** */ - RED, /** */ - WHITE, /** */ - - ARTIFACT, /** */ - CREATURE, /** */ - ENCHANTMENT, /** */ - INSTANT, /** */ - LAND, /** */ - PLANESWALKER, /** */ - SORCERY - } - - private static final Map MAP_COLOR_CHECKBOXES = - new HashMap(); - - private static final Map MAP_TYPE_CHECKBOXES = - new HashMap(); - - /** - + * (S at beginning of class name denotes a static factory.) + */ +public class SFilterUtil { + /** An enum to reference checkbox objects in the color filter map. */ + private enum ColorFilterProperty { + WHITE, + BLUE, + BLACK, + RED, + GREEN, + COLORLESS, + MULTICOLOR + } + + /** An enum to reference checkbox objects in the type filter map. */ + private enum TypeFilterProperty { + LAND, + ARTIFACT, + CREATURE, + ENCHANTMENT, + PLANESWALKER, + INSTANT, + SORCERY + } + + private static final Map MAP_COLOR_CHECKBOXES = + new HashMap(); + + private static final Map MAP_TYPE_CHECKBOXES = + new HashMap(); + + /** + */ private static boolean preventFiltering = false; @@ -94,85 +97,81 @@ public class SFilterUtil { * * @return {@link javax.swing.JPanel} */ - public static JPanel populateColorFilters() { - MAP_COLOR_CHECKBOXES.clear(); - - MAP_COLOR_CHECKBOXES.put(FilterProperty.BLACK, - new ChbPnl(SEditorUtil.ICO_BLACK.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.MULTICOLOR, - new ChbPnl(SEditorUtil.ICO_MULTI.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.BLUE, - new ChbPnl(SEditorUtil.ICO_BLUE.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.BLACK, - new ChbPnl(SEditorUtil.ICO_BLACK.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.GREEN, - new ChbPnl(SEditorUtil.ICO_GREEN.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.RED, - new ChbPnl(SEditorUtil.ICO_RED.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.WHITE, - new ChbPnl(SEditorUtil.ICO_WHITE.getImage())); - MAP_COLOR_CHECKBOXES.put(FilterProperty.COLORLESS, - new ChbPnl(SEditorUtil.ICO_COLORLESS.getImage())); - - - final JPanel pnl = new JPanel(new WrapLayout(SwingConstants.CENTER, 10, 5)); - pnl.setOpaque(false); - - for (FilterProperty p : MAP_COLOR_CHECKBOXES.keySet()) { - pnl.add(MAP_COLOR_CHECKBOXES.get(p)); - } - return pnl; - } - - /** - * Fills and returns a JPanel with checkboxes for color filter set. - * - * @return {@link javax.swing.JPanel} - */ - public static JPanel populateTypeFilters() { - MAP_TYPE_CHECKBOXES.clear(); - - MAP_TYPE_CHECKBOXES.put(FilterProperty.ARTIFACT, - new ChbPnl(SEditorUtil.ICO_ARTIFACT.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.CREATURE, - new ChbPnl(SEditorUtil.ICO_CREATURE.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.ENCHANTMENT, - new ChbPnl(SEditorUtil.ICO_ENCHANTMENT.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.INSTANT, - new ChbPnl(SEditorUtil.ICO_INSTANT.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.LAND, - new ChbPnl(SEditorUtil.ICO_LAND.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.PLANESWALKER, - new ChbPnl(SEditorUtil.ICO_PLANESWALKER.getImage())); - MAP_TYPE_CHECKBOXES.put(FilterProperty.SORCERY, - new ChbPnl(SEditorUtil.ICO_SORCERY.getImage())); - - - final JPanel pnl = new JPanel(new WrapLayout(SwingConstants.CENTER, 10, 5)); - pnl.setOpaque(false); - - for (FilterProperty p : MAP_TYPE_CHECKBOXES.keySet()) { - pnl.add(MAP_TYPE_CHECKBOXES.get(p)); - } - return pnl; - } - - /** Turns all type checkboxes off or on. - * @param select0   boolean */ - public static void toggleTypeCheckboxes(final boolean select0) { - for (FilterProperty p : MAP_TYPE_CHECKBOXES.keySet()) { - MAP_TYPE_CHECKBOXES.get(p).getCheckBox().setSelected(select0); - } - } - - /** Turns all type checkboxes off or on. - * @param select0   boolean */ - public static void toggleColorCheckboxes(final boolean select0) { - for (FilterProperty p : MAP_COLOR_CHECKBOXES.keySet()) { - MAP_COLOR_CHECKBOXES.get(p).getCheckBox().setSelected(select0); - } + public static JPanel populateColorFilters() { + MAP_COLOR_CHECKBOXES.clear(); + + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.WHITE, + new ChbPnl(SEditorUtil.ICO_WHITE.getImage(), "White Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.BLUE, + new ChbPnl(SEditorUtil.ICO_BLUE.getImage(), "Blue Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.BLACK, + new ChbPnl(SEditorUtil.ICO_BLACK.getImage(), "Black Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.RED, + new ChbPnl(SEditorUtil.ICO_RED.getImage(), "Red Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.GREEN, + new ChbPnl(SEditorUtil.ICO_GREEN.getImage(), "Green Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.COLORLESS, + new ChbPnl(SEditorUtil.ICO_COLORLESS.getImage(), "Colorless Cards")); + MAP_COLOR_CHECKBOXES.put(ColorFilterProperty.MULTICOLOR, + new ChbPnl(SEditorUtil.ICO_MULTI.getImage(), "Multicolor Cards")); + + final JPanel pnl = new JPanel(new WrapLayout(SwingConstants.CENTER, 10, 5)); + pnl.setOpaque(false); + + for (ColorFilterProperty p : ColorFilterProperty.values()) { + pnl.add(MAP_COLOR_CHECKBOXES.get(p)); + } + return pnl; + } + + /** + * Fills and returns a JPanel with checkboxes for type filter set. + * + * @return {@link javax.swing.JPanel} + */ + public static JPanel populateTypeFilters() { + MAP_TYPE_CHECKBOXES.clear(); + + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.LAND, + new ChbPnl(SEditorUtil.ICO_LAND.getImage(), "Land Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.ARTIFACT, + new ChbPnl(SEditorUtil.ICO_ARTIFACT.getImage(), "Artifact Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.CREATURE, + new ChbPnl(SEditorUtil.ICO_CREATURE.getImage(), "Creature Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.ENCHANTMENT, + new ChbPnl(SEditorUtil.ICO_ENCHANTMENT.getImage(), "Enchantment Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.PLANESWALKER, + new ChbPnl(SEditorUtil.ICO_PLANESWALKER.getImage(), "Planeswalker Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.INSTANT, + new ChbPnl(SEditorUtil.ICO_INSTANT.getImage(), "Instant Cards")); + MAP_TYPE_CHECKBOXES.put(TypeFilterProperty.SORCERY, + new ChbPnl(SEditorUtil.ICO_SORCERY.getImage(), "Sorcery Cards")); + + final JPanel pnl = new JPanel(new WrapLayout(SwingConstants.CENTER, 10, 5)); + pnl.setOpaque(false); + + for (TypeFilterProperty p : TypeFilterProperty.values()) { + pnl.add(MAP_TYPE_CHECKBOXES.get(p)); + } + return pnl; } + /** Turns all type checkboxes off or on. + * @param select0   boolean */ + public static void toggleTypeCheckboxes(final boolean select0) { + for (ChbPnl p : MAP_TYPE_CHECKBOXES.values()) { + p.getCheckBox().setSelected(select0); + } + } + + /** Turns all color checkboxes off or on. + * @param select0   boolean */ + public static void toggleColorCheckboxes(final boolean select0) { + for (ChbPnl p : MAP_COLOR_CHECKBOXES.values()) { + p.getCheckBox().setSelected(select0); + } + } + /** * Assembles checkboxes for color and returns a filter predicate. *

@@ -182,23 +181,22 @@ public class SFilterUtil { */ public static Predicate buildColorFilter() { if (MAP_COLOR_CHECKBOXES.isEmpty()) { return Predicates.alwaysTrue(); } - - final List> colors = new ArrayList>(); - - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.BLACK).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_BLACK); } - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.BLUE).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_BLUE); } - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.GREEN).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_GREEN); } - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.RED).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_RED); } - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.WHITE).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_WHITE); } - if (MAP_COLOR_CHECKBOXES.get(FilterProperty.COLORLESS).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_COLORLESS); } - - final Predicate preColors = colors.size() == 6 ? null : Predicates.or(colors); - - - boolean wantMulticolor = MAP_COLOR_CHECKBOXES.get(FilterProperty.MULTICOLOR).getCheckBox().isSelected(); - final Predicate preExceptMulti = wantMulticolor ? null : Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR); - - Predicate preFinal = colors.isEmpty() && wantMulticolor ? CardRulesPredicates.Presets.IS_MULTICOLOR : optimizedAnd(preExceptMulti, preColors); + + final List> colors = new ArrayList>(); + + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.WHITE).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_WHITE); } + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.BLUE).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_BLUE); } + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.BLACK).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_BLACK); } + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.RED).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_RED); } + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.GREEN).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_GREEN); } + if (MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.COLORLESS).getCheckBox().isSelected()) { colors.add(CardRulesPredicates.Presets.IS_COLORLESS); } + + final Predicate preColors = colors.size() == 6 ? null : Predicates.or(colors); + + boolean wantMulticolor = MAP_COLOR_CHECKBOXES.get(ColorFilterProperty.MULTICOLOR).getCheckBox().isSelected(); + final Predicate preExceptMulti = wantMulticolor ? null : Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR); + + Predicate preFinal = colors.isEmpty() && wantMulticolor ? CardRulesPredicates.Presets.IS_MULTICOLOR : optimizedAnd(preExceptMulti, preColors); if (null == preFinal) { return Predicates.alwaysTrue(); @@ -236,19 +234,19 @@ public class SFilterUtil { * @return Predicate */ public static Predicate buildTypeFilter() { - if (MAP_TYPE_CHECKBOXES.isEmpty()) { return Predicates.alwaysTrue(); } - - final List> ors = new ArrayList>(); - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.ARTIFACT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_ARTIFACT); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.CREATURE).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_CREATURE); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.ENCHANTMENT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_ENCHANTMENT); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.INSTANT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_INSTANT); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.LAND).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_LAND); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.PLANESWALKER).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_PLANESWALKER); } - if (MAP_TYPE_CHECKBOXES.get(FilterProperty.SORCERY).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_SORCERY); } - - if (ors.size() == 7) { - return Predicates.alwaysTrue(); + if (MAP_TYPE_CHECKBOXES.isEmpty()) { return Predicates.alwaysTrue(); } + + final List> ors = new ArrayList>(); + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.LAND).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_LAND); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.ARTIFACT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_ARTIFACT); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.CREATURE).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_CREATURE); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.ENCHANTMENT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_ENCHANTMENT); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.PLANESWALKER).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_PLANESWALKER); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.INSTANT).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_INSTANT); } + if (MAP_TYPE_CHECKBOXES.get(TypeFilterProperty.SORCERY).getCheckBox().isSelected()) { ors.add(CardRulesPredicates.Presets.IS_SORCERY); } + + if (ors.size() == 7) { + return Predicates.alwaysTrue(); } return Predicates.compose(Predicates.or(ors), CardPrinted.FN_GET_RULES); @@ -368,20 +366,21 @@ public class SFilterUtil { */ @SuppressWarnings("serial") private static class ChbPnl extends JPanel implements ItemListener { - private final JCheckBox checkBox = new JCheckBox(); - private final Image img; - - public ChbPnl(final Image img0) { - super(); - this.img = img0; - this.setOpaque(false); + private final JCheckBox checkBox = new JCheckBox(); + private final Image img; + + public ChbPnl(final Image img0, final String tooltip) { + super(); + this.img = img0; + this.setOpaque(false); checkBox.setBorder(new EmptyBorder(0, 20, 0, 0)); - checkBox.setOpaque(false); - checkBox.setSelected(true); - checkBox.addItemListener(this); - add(checkBox); - - this.addMouseListener(new MouseAdapter() { + checkBox.setOpaque(false); + checkBox.setSelected(true); + checkBox.addItemListener(this); + checkBox.setToolTipText(tooltip); + add(checkBox); + + this.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(final MouseEvent me) { checkBox.doClick(); diff --git a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java index fc1308f4842..ff775d0e61e 100644 --- a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java +++ b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java @@ -100,25 +100,25 @@ public enum VCardCatalog implements IVDoc, ITableContainer { pnlStats.setOpaque(false); pnlStats.setLayout(new MigLayout("insets 0, gap 5px, ax center, wrap 7")); - - final String constraints = "w 57px!, h 20px!"; - pnlStats.add(lblTotal, constraints); - pnlStats.add(lblBlack, constraints); - pnlStats.add(lblBlue, constraints); - pnlStats.add(lblGreen, constraints); - pnlStats.add(lblRed, constraints); - pnlStats.add(lblWhite, constraints); - pnlStats.add(lblColorless, constraints); - - pnlStats.add(lblArtifact, constraints); - pnlStats.add(lblCreature, constraints); - pnlStats.add(lblEnchantment, constraints); - pnlStats.add(lblInstant, constraints); - pnlStats.add(lblLand, constraints); - pnlStats.add(lblPlaneswalker, constraints); - pnlStats.add(lblSorcery, constraints); - - pnlAddButtons.setOpaque(false); + + final String constraints = "w 57px!, h 20px!"; + pnlStats.add(lblTotal, constraints); + pnlStats.add(lblWhite, constraints); + pnlStats.add(lblBlue, constraints); + pnlStats.add(lblBlack, constraints); + pnlStats.add(lblRed, constraints); + pnlStats.add(lblGreen, constraints); + pnlStats.add(lblColorless, constraints); + + pnlStats.add(lblLand, constraints); + pnlStats.add(lblArtifact, constraints); + pnlStats.add(lblCreature, constraints); + pnlStats.add(lblEnchantment, constraints); + pnlStats.add(lblPlaneswalker, constraints); + pnlStats.add(lblInstant, constraints); + pnlStats.add(lblSorcery, constraints); + + pnlAddButtons.setOpaque(false); pnlAddButtons.add(btnAdd, "w 30%!, h 30px!, gap 0 0 5px 5px"); pnlAddButtons.add(btnAdd4, "w 30%!, h 30px!, gap 5% 5% 5px 5px"); diff --git a/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java b/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java index 345c4faa3cb..f95e41a96d0 100644 --- a/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java +++ b/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java @@ -184,25 +184,24 @@ public enum VCurrentDeck implements IVDoc, ITableContainer { pnlStats.setOpaque(false); pnlStats.setLayout(new MigLayout("insets 0, gap 5px, ax center, wrap 7")); - - final String constraints = "w 55px!, h 20px!"; - pnlStats.add(lblTotal, constraints); - pnlStats.add(lblBlack, constraints); - pnlStats.add(lblBlue, constraints); - pnlStats.add(lblGreen, constraints); - pnlStats.add(lblRed, constraints); - pnlStats.add(lblWhite, constraints); - pnlStats.add(lblColorless, constraints); - - pnlStats.add(lblArtifact, constraints); - pnlStats.add(lblCreature, constraints); - pnlStats.add(lblEnchantment, constraints); - pnlStats.add(lblInstant, constraints); - pnlStats.add(lblLand, constraints); - pnlStats.add(lblPlaneswalker, constraints); - pnlStats.add(lblSorcery, constraints); - - pnlRemoveButtons.setOpaque(false); + + final String constraints = "w 55px!, h 20px!"; + pnlStats.add(lblTotal, constraints); + pnlStats.add(lblWhite, constraints); + pnlStats.add(lblBlue, constraints); + pnlStats.add(lblBlack, constraints); + pnlStats.add(lblRed, constraints); + pnlStats.add(lblGreen, constraints); + pnlStats.add(lblColorless, constraints); + + pnlStats.add(lblLand, constraints); + pnlStats.add(lblArtifact, constraints); + pnlStats.add(lblCreature, constraints); + pnlStats.add(lblEnchantment, constraints); + pnlStats.add(lblPlaneswalker, constraints); + pnlStats.add(lblInstant, constraints); + pnlStats.add(lblSorcery, constraints); + pnlRemoveButtons.add(btnRemove, "w 30%!, h 30px!, gap 0 0 5px 5px"); pnlRemoveButtons.add(btnRemove4, "w 30%!, h 30px!, gap 0 0 5px 5px"); pnlRemoveButtons.add(btnDoSideboard, "w 30%!, h 30px!, gap 0 0 5px 5px");