From eb4b25b9e45e800c4698624f43bd5687419ad6d2 Mon Sep 17 00:00:00 2001 From: drdev Date: Mon, 16 Sep 2013 03:09:54 +0000 Subject: [PATCH] Start FComboBox --- .gitattributes | 1 + src/main/java/forge/gui/ImportDialog.java | 8 +- .../gui/deckeditor/views/VCardCatalog.java | 7 +- .../forge/gui/home/quest/IVQuestStats.java | 6 +- .../gui/home/quest/VSubmenuChallenges.java | 6 +- .../forge/gui/home/quest/VSubmenuDuels.java | 6 +- .../gui/home/quest/VSubmenuQuestData.java | 16 ++-- .../java/forge/gui/toolbox/FComboBox.java | 96 +++++++++++++++++++ src/main/java/forge/gui/toolbox/FSkin.java | 8 +- 9 files changed, 127 insertions(+), 27 deletions(-) create mode 100644 src/main/java/forge/gui/toolbox/FComboBox.java diff --git a/.gitattributes b/.gitattributes index 7d59766fe50..f955ee2c5dd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15017,6 +15017,7 @@ src/main/java/forge/gui/toolbox/CardFaceSymbols.java svneol=native#text/plain src/main/java/forge/gui/toolbox/FAbsolutePositioner.java -text src/main/java/forge/gui/toolbox/FButton.java -text src/main/java/forge/gui/toolbox/FCheckBox.java -text +src/main/java/forge/gui/toolbox/FComboBox.java -text src/main/java/forge/gui/toolbox/FComboBoxPanel.java -text src/main/java/forge/gui/toolbox/FLabel.java -text src/main/java/forge/gui/toolbox/FList.java -text diff --git a/src/main/java/forge/gui/ImportDialog.java b/src/main/java/forge/gui/ImportDialog.java index 26531b4eb1b..f9bd0180840 100644 --- a/src/main/java/forge/gui/ImportDialog.java +++ b/src/main/java/forge/gui/ImportDialog.java @@ -34,7 +34,6 @@ import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentSkipListMap; -import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -61,6 +60,7 @@ import forge.error.BugReporter; import forge.gui.ImportSourceAnalyzer.OpType; import forge.gui.toolbox.FButton; import forge.gui.toolbox.FCheckBox; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FOverlay; import forge.gui.toolbox.FPanel; @@ -307,7 +307,7 @@ public class ImportDialog { private final Runnable _onAnalyzerDone; private final boolean _isMigration; private final FLabel _unknownDeckLabel; - private final JComboBox<_UnknownDeckChoice> _unknownDeckCombo; + private final FComboBox<_UnknownDeckChoice> _unknownDeckCombo; private final FCheckBox _moveCheckbox; private final FCheckBox _overwriteCheckbox; private final JTextArea _operationLog; @@ -340,7 +340,7 @@ public class ImportDialog { _addSelectionWidget(knownDeckPanel, OpType.UNKNOWN_DECK, "Unknown decks"); JPanel unknownDeckPanel = new JPanel(new MigLayout("insets 0, gap 5")); unknownDeckPanel.setOpaque(false); - _unknownDeckCombo = new JComboBox<_UnknownDeckChoice>(); + _unknownDeckCombo = new FComboBox<_UnknownDeckChoice>(); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Constructed", NewConstants.DECK_CONSTRUCTED_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Draft", NewConstants.DECK_DRAFT_DIR)); _unknownDeckCombo.addItem(new _UnknownDeckChoice("Planar", NewConstants.DECK_PLANE_DIR)); @@ -816,7 +816,7 @@ public class ImportDialog { private final boolean _move; private final boolean _overwrite; - public _Importer(String srcDir, Map>> selections, JComboBox<_UnknownDeckChoice> unknownDeckCombo, + public _Importer(String srcDir, Map>> selections, FComboBox<_UnknownDeckChoice> unknownDeckCombo, JTextArea operationLog, JProgressBar progressBar, boolean move, boolean overwrite) { _srcDir = srcDir; _operationLog = operationLog; diff --git a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java index 3e88b1917fd..2e722387c7d 100644 --- a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java +++ b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java @@ -6,11 +6,11 @@ import java.awt.FlowLayout; import java.util.HashMap; import java.util.Map; -import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; + import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.tuple.Pair; @@ -23,6 +23,7 @@ import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSpinner; @@ -81,7 +82,7 @@ public enum VCardCatalog implements IVDoc { .text("Add filter") .tooltip("Click to add custom filters to the card list") .reactOnMouseDown().build(); - private final JComboBox cbSearchMode = new JComboBox(); + private final FComboBox cbSearchMode = new FComboBox(); private final JTextField txfSearch = new FTextField.Builder().ghostText("Search").build(); private final FLabel lblName = new FLabel.Builder().text("Name").hoverable().selectable().selected().build(); private final FLabel lblType = new FLabel.Builder().text("Type").hoverable().selectable().selected().build(); @@ -226,7 +227,7 @@ public enum VCardCatalog implements IVDoc { public FLabel getLblText() { return lblText; } public FLabel getBtnAddRestriction() { return btnAddRestriction; } - public JComboBox getCbSearchMode() { return cbSearchMode; } + public FComboBox getCbSearchMode() { return cbSearchMode; } public JTextField getTxfSearch() { return txfSearch; } public Map getStatLabels() { diff --git a/src/main/java/forge/gui/home/quest/IVQuestStats.java b/src/main/java/forge/gui/home/quest/IVQuestStats.java index 36c94ab1e8a..a5d42457c02 100644 --- a/src/main/java/forge/gui/home/quest/IVQuestStats.java +++ b/src/main/java/forge/gui/home/quest/IVQuestStats.java @@ -1,9 +1,9 @@ package forge.gui.home.quest; import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JLabel; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; /** Dictates methods required for a panel with stats/pet display. */ @@ -45,8 +45,8 @@ public interface IVQuestStats { /** @return {@link javax.swing.JLabel} */ JLabel getLblWinStreak(); - /** @return {@link javax.swing.JComboBox} */ - JComboBox getCbxPet(); + /** @return {@link javax.swing.FComboBox} */ + FComboBox getCbxPet(); /** @return {@link javax.swing.JCheckBox} */ JCheckBox getCbPlant(); diff --git a/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java index 262ea1e4b2c..91870ab606f 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuChallenges.java @@ -4,7 +4,6 @@ import java.awt.Font; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.ScrollPaneConstants; @@ -20,6 +19,7 @@ import forge.gui.home.LblHeader; import forge.gui.home.StartButton; import forge.gui.home.VHomeUI; import forge.gui.toolbox.FCheckBox; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FSkin; @@ -46,7 +46,7 @@ public enum VSubmenuChallenges implements IVSubmenu, IVQuest ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); private final JButton btnStart = new StartButton(); - private final JComboBox cbxPet = new JComboBox(); + private final FComboBox cbxPet = new FComboBox(); private final JCheckBox cbPlant = new FCheckBox("Summon Plant"); private final JLabel lblZep = new FLabel.Builder().text("Launch
Zeppelin") .hoverable(true).icon(FSkin.getIcon(FSkin.QuestIcons.ICO_ZEP)) @@ -248,7 +248,7 @@ public enum VSubmenuChallenges implements IVSubmenu, IVQuest } @Override - public JComboBox getCbxPet() { + public FComboBox getCbxPet() { return cbxPet; } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java index 69447b5bd0c..6a4f9288ab5 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuDuels.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuDuels.java @@ -4,7 +4,6 @@ import java.awt.Font; import javax.swing.JButton; import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.ScrollPaneConstants; @@ -20,6 +19,7 @@ import forge.gui.home.LblHeader; import forge.gui.home.StartButton; import forge.gui.home.VHomeUI; import forge.gui.toolbox.FCheckBox; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FSkin; @@ -45,7 +45,7 @@ public enum VSubmenuDuels implements IVSubmenu, IVQuestStats { ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); private final JButton btnStart = new StartButton(); - private final JComboBox cbxPet = new JComboBox(); + private final FComboBox cbxPet = new FComboBox(); private final JCheckBox cbPlant = new FCheckBox("Summon Plant"); private final JLabel lblZep = new FLabel.Builder().text("Launch Zeppelin").fontSize(14).build(); @@ -241,7 +241,7 @@ public enum VSubmenuDuels implements IVSubmenu, IVQuestStats { } @Override - public JComboBox getCbxPet() { + public FComboBox getCbxPet() { return cbxPet; } diff --git a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java index fea18fcf4f6..016a11cca80 100644 --- a/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java +++ b/src/main/java/forge/gui/home/quest/VSubmenuQuestData.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBox; -import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; @@ -31,6 +30,7 @@ import forge.gui.home.EMenuGroup; import forge.gui.home.IVSubmenu; import forge.gui.home.VHomeUI; import forge.gui.toolbox.FCheckBox; +import forge.gui.toolbox.FComboBox; import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FRadioButton; import forge.gui.toolbox.FScrollPane; @@ -79,33 +79,33 @@ public enum VSubmenuQuestData implements IVSubmenu { private final JCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); private final JLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); - private final JComboBox cbxStartingWorld = new JComboBox(); + private final FComboBox cbxStartingWorld = new FComboBox(); /* Second column */ private final JLabel lblStartingPool = new FLabel.Builder().text("Starting pool:").build(); - private final JComboBox cbxStartingPool = new JComboBox(); + private final FComboBox cbxStartingPool = new FComboBox(); private final JLabel lblUnrestricted = new FLabel.Builder().text("All cards will be available to play.").build(); private final JLabel lblPreconDeck = new FLabel.Builder().text("Starter/Event deck:").build(); - private final JComboBox cbxPreconDeck = new JComboBox(); + private final FComboBox cbxPreconDeck = new FComboBox(); private final JLabel lblFormat = new FLabel.Builder().text("Sanctioned format:").build(); - private final JComboBox cbxFormat = new JComboBox(); + private final FComboBox cbxFormat = new FComboBox(); private final JLabel lblCustomDeck = new FLabel.Builder().text("Custom deck:").build(); - private final JComboBox cbxCustomDeck = new JComboBox(); + private final FComboBox cbxCustomDeck = new FComboBox(); private final FLabel btnDefineCustomFormat = new FLabel.Builder().opaque(true).hoverable(true).text("Define custom format").build(); private final FLabel btnPrizeDefineCustomFormat = new FLabel.Builder().opaque(true).hoverable(true).text("Define custom format").build(); private final JLabel lblPrizedCards = new FLabel.Builder().text("Prized cards:").build(); - private final JComboBox cbxPrizedCards = new JComboBox(); + private final FComboBox cbxPrizedCards = new FComboBox(); private final JLabel lblPrizeFormat = new FLabel.Builder().text("Sanctioned format:").build(); - private final JComboBox cbxPrizeFormat = new JComboBox(); + private final FComboBox cbxPrizeFormat = new FComboBox(); private final JLabel lblPrizeUnrestricted = new FLabel.Builder().text("All cards will be available to win.").build(); private final JLabel lblPrizeSameAsStarting = new FLabel.Builder().text("Only sets found in starting pool will be available.").build(); diff --git a/src/main/java/forge/gui/toolbox/FComboBox.java b/src/main/java/forge/gui/toolbox/FComboBox.java new file mode 100644 index 00000000000..32c957bf28a --- /dev/null +++ b/src/main/java/forge/gui/toolbox/FComboBox.java @@ -0,0 +1,96 @@ +package forge.gui.toolbox; + +import java.awt.event.ActionListener; +import java.util.ArrayList; + +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.ListCellRenderer; + +/** + * Wrapper for combo box with extra logic (should be used instead of JComboBox) + * + */ +@SuppressWarnings("serial") +public class FComboBox extends JComponent { + + private JComboBox innerComboBox; + private static ArrayList> comboBoxes = new ArrayList>(); + + public static void refreshAllSkins() { + for (FComboBox comboBox : comboBoxes) { + comboBox.refreshSkin(); + } + } + + public FComboBox() { + super(); + this.setOpaque(false); + innerComboBox = new JComboBox(); + this.add(innerComboBox); + comboBoxes.add(this); + } + + public void addItem(E item) { + this.innerComboBox.addItem(item); + } + + public void removeItem(E item) { + this.innerComboBox.removeItem(item); + } + + public void removeAllItems() { + this.innerComboBox.removeAllItems(); + } + + public Object getSelectedItem() { + return this.innerComboBox.getSelectedItem(); + } + + public void setSelectedItem(Object item) { + this.innerComboBox.setSelectedItem(item); + } + + public int getSelectedIndex() { + return this.innerComboBox.getSelectedIndex(); + } + + public void setSelectedIndex(int index) { + this.innerComboBox.setSelectedIndex(index); + } + + public int getItemCount() { + return this.innerComboBox.getItemCount(); + } + + public E getItemAt(int index) { + return this.innerComboBox.getItemAt(index); + } + + public void addActionListener(ActionListener l) { + this.innerComboBox.addActionListener(l); + } + + public void setRenderer(ListCellRenderer aRenderer) { + this.innerComboBox.setRenderer(aRenderer); + } + + public void refreshSkin() { + //clone inner combo box + JComboBox newInnerComboBox = new JComboBox(); + for (int i = 0; i < this.getItemCount(); i++) { + newInnerComboBox.addItem(this.getItemAt(i)); + } + newInnerComboBox.setSelectedIndex(this.getSelectedIndex()); + ActionListener[] listeners = this.innerComboBox.getActionListeners(); + for (ActionListener l : listeners) { + newInnerComboBox.addActionListener(l); + } + newInnerComboBox.setRenderer(this.innerComboBox.getRenderer()); + + //replace inner combo box with its clone + this.remove(innerComboBox); + this.innerComboBox = newInnerComboBox; + this.add(innerComboBox); + } +} diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index cc5925adff9..8c9e8f406d0 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -19,6 +19,7 @@ package forge.gui.toolbox; import java.awt.Color; import java.awt.Component; +import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; @@ -2016,6 +2017,9 @@ public enum FSkin { private void refreshComboBoxes(final JFrame appFrame) { ArrayList comboBoxes = TypeUtil.findAllComponents(JComboBox.class, appFrame); for (JComboBox comboBox : comboBoxes) { + Container parent = comboBox.getParent(); + if (parent == null) { continue; } //shouldn't happen + //backup model ComboBoxModel model = comboBox.getModel(); Object selectedItem = model.getSelectedItem(); @@ -2024,10 +2028,8 @@ public enum FSkin { for(int i = 0; i < count; i++) { items.add(model.getElementAt(i)); } - - comboBox.removeAllItems(); - //restore model backup + //restore model backup in new combo box for(int i = 0; i < count; i++) { comboBox.addItem(items.get(i)); }