diff --git a/.gitattributes b/.gitattributes index 639a1338adb..78ea1ddfb23 100644 --- a/.gitattributes +++ b/.gitattributes @@ -893,6 +893,7 @@ forge-gui-desktop/src/main/java/forge/menus/MenuUtil.java -text forge-gui-desktop/src/main/java/forge/package-info.java -text forge-gui-desktop/src/main/java/forge/screens/bazaar/CBazaarUI.java -text forge-gui-desktop/src/main/java/forge/screens/bazaar/VBazaarUI.java -text +forge-gui-desktop/src/main/java/forge/screens/deckeditor/AddBasicLandsDialog.java -text forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java -text forge-gui-desktop/src/main/java/forge/screens/deckeditor/DeckImport.java -text forge-gui-desktop/src/main/java/forge/screens/deckeditor/SEditorIO.java -text diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java index d91b7cc42f6..02a1a9afaa0 100644 --- a/forge-core/src/main/java/forge/deck/Deck.java +++ b/forge-core/src/main/java/forge/deck/Deck.java @@ -239,5 +239,5 @@ public class Deck extends DeckBase implements Iterable. + */ +package forge.screens.deckeditor; + +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.text.NumberFormat; +import java.util.Map.Entry; + +import javax.swing.JOptionPane; +import javax.swing.SwingConstants; + +import com.google.common.collect.ImmutableList; + +import forge.ImageCache; +import forge.StaticData; +import forge.UiCommand; +import forge.assets.FSkinProp; +import forge.card.CardEdition; +import forge.card.CardRules; +import forge.card.mana.ManaCostShard; +import forge.deck.CardPool; +import forge.deck.Deck; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.toolbox.FComboBox; +import forge.toolbox.FComboBoxPanel; +import forge.toolbox.FHtmlViewer; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; +import forge.toolbox.FSkin; +import forge.toolbox.FTextField; +import forge.toolbox.FSkin.SkinnedPanel; +import forge.util.ItemPool; +import forge.view.arcane.CardPanel; + + +@SuppressWarnings("serial") +public class AddBasicLandsDialog { + private static final int WIDTH = 800; + private static final int HEIGHT = 375; + private static final int ADD_BTN_SIZE = 30; + private static final int LAND_PANEL_PADDING = 3; + + private final FComboBoxPanel cbLandSet = new FComboBoxPanel("Land Set:", FlowLayout.CENTER, StaticData.instance().getEditions()); + + private final MainPanel panel = new MainPanel(); + private final LandPanel pnlPlains = new LandPanel("Plains"); + private final LandPanel pnlIsland = new LandPanel("Island"); + private final LandPanel pnlSwamp = new LandPanel("Swamp"); + private final LandPanel pnlMountain = new LandPanel("Mountain"); + private final LandPanel pnlForest = new LandPanel("Forest"); + + private final FHtmlViewer lblDeckInfo = new FHtmlViewer(); + + private final Deck deck; + + private FOptionPane optionPane; + private int nonLandCount, oldLandCount; + private CardEdition landSet; + + public AddBasicLandsDialog(Deck deck0) { + this(deck0, null, null); + } + public AddBasicLandsDialog(Deck deck0, CardEdition defaultLandSet) { + this(deck0, defaultLandSet, null); + } + public AddBasicLandsDialog(Deck deck0, CardEdition defaultLandSet, ItemPool restrictedCatalog0) { + deck = deck0; + + if (defaultLandSet == null) { + defaultLandSet = StaticData.instance().getEditions().get("ZEN"); + } + + panel.setMinimumSize(new Dimension(WIDTH, HEIGHT)); + panel.add(cbLandSet); + panel.add(pnlPlains); + panel.add(pnlIsland); + panel.add(pnlSwamp); + panel.add(pnlMountain); + panel.add(pnlForest); + panel.add(lblDeckInfo); + + lblDeckInfo.setAlignmentX(0.5f); + lblDeckInfo.setFont(FSkin.getFont(12)); + + cbLandSet.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + landSet = cbLandSet.getSelectedItem(); + pnlPlains.refreshArtChoices(); + pnlIsland.refreshArtChoices(); + pnlSwamp.refreshArtChoices(); + pnlMountain.refreshArtChoices(); + pnlForest.refreshArtChoices(); + } + }); + cbLandSet.setSelectedItem(defaultLandSet); + + //initialize land counts based on current deck contents + int halfCountW = 0; //track half shard count for each color to add to symbol count only if a full symbol is also found + int halfCountU = 0; + int halfCountB = 0; + int halfCountR = 0; + int halfCountG = 0; + for (Entry entry : deck.getMain()) { + CardRules cardRules = entry.getKey().getRules(); + int count = entry.getValue(); + if (cardRules.getType().isLand()) { + oldLandCount += count; + } + else { + nonLandCount += count; + + for (ManaCostShard shard : cardRules.getManaCost()) { + boolean isMonoColor = shard.isMonoColor(); + if (shard.isWhite()) { + if (isMonoColor) { + pnlPlains.symbolCount += count; + continue; + } + halfCountW += count; + } + if (shard.isBlue()) { + if (isMonoColor) { + pnlIsland.symbolCount += count; + continue; + } + halfCountU += count; + } + if (shard.isBlack()) { + if (isMonoColor) { + pnlSwamp.symbolCount += count; + continue; + } + halfCountB += count; + } + if (shard.isRed()) { + if (isMonoColor) { + pnlMountain.symbolCount += count; + continue; + } + halfCountR += count; + } + if (shard.isGreen()) { + if (isMonoColor) { + pnlForest.symbolCount += count; + continue; + } + halfCountG += count; + } + } + } + + //only account for half shards if full shards exist for a given color + if (pnlPlains.symbolCount > 0 && halfCountW > 0) { + pnlPlains.symbolCount += halfCountW * 0.5; + } + if (pnlIsland.symbolCount > 0 && halfCountU > 0) { + pnlIsland.symbolCount += halfCountU * 0.5; + } + if (pnlSwamp.symbolCount > 0 && halfCountB > 0) { + pnlSwamp.symbolCount += halfCountB * 0.5; + } + if (pnlMountain.symbolCount > 0 && halfCountR > 0) { + pnlMountain.symbolCount += halfCountR * 0.5; + } + if (pnlForest.symbolCount > 0 && halfCountG > 0) { + pnlForest.symbolCount += halfCountG * 0.5; + } + } + + updateDeckInfoLabel(); + } + + public CardPool show() { + optionPane = new FOptionPane(null, "Add Basic Lands", null, panel, ImmutableList.of("OK", "Cancel"), 0); + panel.revalidate(); + panel.repaint(); + optionPane.setVisible(true); + + int result = optionPane.getResult(); + + optionPane.dispose(); + + if (result == 0) { + CardPool landsToAdd = new CardPool(); + pnlPlains.addToCardPool(landsToAdd); + pnlIsland.addToCardPool(landsToAdd); + pnlSwamp.addToCardPool(landsToAdd); + pnlMountain.addToCardPool(landsToAdd); + pnlForest.addToCardPool(landsToAdd); + return landsToAdd; + } + return null; + } + + private void updateDeckInfoLabel() { + NumberFormat integer = NumberFormat.getIntegerInstance(); + NumberFormat percent = NumberFormat.getPercentInstance(); + int newLandCount = pnlPlains.count + pnlIsland.count + pnlSwamp.count + pnlMountain.count + pnlForest.count; + double totalSymbolCount = pnlPlains.symbolCount + pnlIsland.symbolCount + pnlSwamp.symbolCount + pnlMountain.symbolCount + pnlForest.symbolCount; + int newTotalCount = nonLandCount + oldLandCount + newLandCount; + lblDeckInfo.setText(FSkin.encodeSymbols( + nonLandCount + " non-lands + " + + oldLandCount + " lands + " + + newLandCount + " added lands = " + + newTotalCount + " cards\n" + + "{W} " + integer.format(pnlPlains.symbolCount) + " (" + percent.format(pnlPlains.symbolCount / totalSymbolCount) + ") | " + + "{U} " + integer.format(pnlIsland.symbolCount) + " (" + percent.format(pnlIsland.symbolCount / totalSymbolCount) + ") | " + + "{B} " + integer.format(pnlSwamp.symbolCount) + " (" + percent.format(pnlSwamp.symbolCount / totalSymbolCount) + ") | " + + "{R} " + integer.format(pnlMountain.symbolCount) + " (" + percent.format(pnlMountain.symbolCount / totalSymbolCount) + ") | " + + "{G} " + integer.format(pnlForest.symbolCount) + " (" + percent.format(pnlForest.symbolCount / totalSymbolCount) + ")", true)); + } + + private class MainPanel extends SkinnedPanel { + private MainPanel() { + super(null); + setOpaque(false); + } + + @Override + public void doLayout() { + int padding = 10; + int x = padding; + int y = padding; + int w = getWidth() - 2 * padding; + + //layout land set combo box + int comboBoxHeight = FTextField.HEIGHT; + cbLandSet.setBounds(x, y, w, comboBoxHeight); + + //layout card panel scroller + y += comboBoxHeight + padding; + int panelExtraHeight = pnlPlains.cbLandArt.getHeight() + ADD_BTN_SIZE + 2 * LAND_PANEL_PADDING; + int panelWidth = (getWidth() - 6 * padding) / 5; + int panelHeight = Math.round((float)panelWidth * CardPanel.ASPECT_RATIO) + panelExtraHeight; + + pnlPlains.setBounds(x, y, panelWidth, panelHeight); + x += panelWidth + padding; + pnlIsland.setBounds(x, y, panelWidth, panelHeight); + x += panelWidth + padding; + pnlSwamp.setBounds(x, y, panelWidth, panelHeight); + x += panelWidth + padding; + pnlMountain.setBounds(x, y, panelWidth, panelHeight); + x += panelWidth + padding; + pnlForest.setBounds(x, y, panelWidth, panelHeight); + + //layout info label + x = padding; + y += panelHeight + padding; + lblDeckInfo.setBounds(x, y, w, getHeight() - y - padding); + } + } + + private class LandPanel extends SkinnedPanel { + private final LandCardPanel cardPanel; + private final FLabel lblCount, btnSubtract, btnAdd; + private final FComboBox cbLandArt; + private final String cardName; + private PaperCard card; + private int count, maxCount; + private double symbolCount; + + private LandPanel(String cardName0) { + super(null); + setOpaque(false); + + cardName = cardName0; + cardPanel = new LandCardPanel(); + cbLandArt = new FComboBox(); + cbLandArt.setFont(cbLandSet.getFont()); + cbLandArt.addActionListener(new ActionListener() { + @Override + public void actionPerformed(final ActionEvent arg0) { + int artIndex = cbLandArt.getSelectedIndex(); + if (artIndex < 0) { return; } + card = generateCard(artIndex); //generate card for display + } + }); + lblCount = new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build(); + btnSubtract = new FLabel.ButtonBuilder().icon(FSkin.getIcon(FSkinProp.ICO_MINUS)).cmdClick(new UiCommand() { + @Override + public void run() { + if (count > 0) { + count--; + lblCount.setText(String.valueOf(count)); + updateDeckInfoLabel(); + } + } + }).build(); + btnAdd = new FLabel.ButtonBuilder().icon(FSkin.getIcon(FSkinProp.ICO_PLUS)).cmdClick(new UiCommand() { + @Override + public void run() { + if (maxCount == 0 || count < maxCount) { + count++; + lblCount.setText(String.valueOf(count)); + updateDeckInfoLabel(); + } + } + }).build(); + + add(cardPanel); + add(cbLandArt); + add(lblCount); + add(btnSubtract); + add(btnAdd); + } + + private void addToCardPool(CardPool pool) { + if (count == 0) { return; } + int artIndex = cbLandArt.getSelectedIndex(); + if (artIndex < 0) { return; } + + if (artIndex > 0 && card != null) { + pool.add(card, count); //simplify things if art index specified + } + else { + for (int i = 0; i < count; i++) { + pool.add(generateCard(artIndex)); + } + } + } + + private PaperCard generateCard(int artIndex) { + PaperCard c = FModel.getMagicDb().getCommonCards().getCard(cardName, landSet.getCode(), artIndex); + if (c == null) { + //if can't find land for this set, fall back to Zendikar lands + c = FModel.getMagicDb().getCommonCards().getCard(cardName, "ZEN"); + } + return c; + } + + private void refreshArtChoices() { + cbLandArt.removeAllItems(); + if (landSet == null) { return; } + + int artChoiceCount = FModel.getMagicDb().getCommonCards().getArtCount(cardName, landSet.getCode()); + cbLandArt.addItem("Assorted Art"); + for (int i = 1; i <= artChoiceCount; i++) { + cbLandArt.addItem("Card Art " + i); + } + } + + @Override + public void doLayout() { + int width = getWidth(); + int height = getHeight(); + int y = height - ADD_BTN_SIZE; + int buttonWidth = ADD_BTN_SIZE; + int labelWidth = width - 2 * ADD_BTN_SIZE; + int minLabelWidth = lblCount.getSkin().getFont().measureTextWidth(JOptionPane.getRootFrame().getGraphics(), "0") + 2 * lblCount.getInsets().left; + if (labelWidth < minLabelWidth) { //ensure count label has enough room for display a single digit count at normal font size + labelWidth = minLabelWidth; + buttonWidth = (width - labelWidth) / 2; + } + btnSubtract.setBounds(0, y, buttonWidth, ADD_BTN_SIZE); + lblCount.setBounds(buttonWidth, y, labelWidth, ADD_BTN_SIZE); + btnAdd.setBounds(width - buttonWidth, y, buttonWidth, ADD_BTN_SIZE); + + y -= FTextField.HEIGHT + LAND_PANEL_PADDING; + cbLandArt.setBounds(0, y, width, FTextField.HEIGHT); + + int cardPanelHeight = y - LAND_PANEL_PADDING; + int cardPanelWidth = Math.round((float)cardPanelHeight / CardPanel.ASPECT_RATIO); + cardPanel.setBounds((width - cardPanelWidth) / 2, 0, cardPanelWidth, cardPanelHeight); + } + + private class LandCardPanel extends SkinnedPanel { + private LandCardPanel() { + super(null); + setOpaque(false); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + if (card == null) { return; } + + final Graphics2D g2d = (Graphics2D) g; + + final BufferedImage img = ImageCache.getImage(card, getWidth(), getHeight()); + if (img != null) { + g2d.drawImage(img, null, 0, 0); + } + } + } + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index 92c0e13e1c2..9b56c017782 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -299,11 +299,6 @@ public abstract class ACEditorBase { * This is the least restrictive mode; * all cards are available. */ + @SuppressWarnings("serial") public CEditorCommander(final CDetailPicture cDetailPicture) { super(FScreen.DECK_EDITOR_COMMANDER, cDetailPicture); allSections.add(DeckSection.Main); @@ -89,6 +90,13 @@ public final class CEditorCommander extends ACEditorBase { } }; this.controller = new DeckController(FModel.getDecks().getCommander(), this, newCreator); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorConstructed.addBasicLands(CEditorCommander.this, null); + } + }); } //=========== Overridden from ACEditorBase diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java index c262760de8c..718a35e04f9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java @@ -22,6 +22,7 @@ import com.google.common.base.Supplier; import forge.UiCommand; import forge.card.CardRulesPredicates; +import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; import forge.gui.framework.FScreen; @@ -30,6 +31,7 @@ import forge.itemmanager.CardManager; import forge.itemmanager.ItemManagerConfig; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; +import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.match.controllers.CDetailPicture; import forge.util.ItemPool; @@ -59,6 +61,7 @@ public final class CEditorConstructed extends ACEditorBase { * This is the least restrictive mode; * all cards are available. */ + @SuppressWarnings("serial") public CEditorConstructed(final CDetailPicture cDetailPicture) { super(FScreen.DECK_EDITOR_CONSTRUCTED, cDetailPicture); @@ -91,6 +94,13 @@ public final class CEditorConstructed extends ACEditorBase { }; this.controller = new DeckController(FModel.getDecks().getConstructed(), this, newCreator); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorConstructed.addBasicLands(CEditorConstructed.this, null); + } + }); } //=========== Overridden from ACEditorBase @@ -321,6 +331,17 @@ public final class CEditorConstructed extends ACEditorBase { this.controller.updateCaptions(); } + public static void addBasicLands(ACEditorBase editor, ItemPool restrictedCatalog) { + Deck deck = editor.getDeckController().getModel(); + if (deck == null) { return; } + + AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, null, restrictedCatalog); + CardPool landsToAdd = dialog.show(); + if (landsToAdd != null) { + editor.onAddItems(landsToAdd, false); + } + } + /* (non-Javadoc) * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java index c6a100a95fe..8549f6bbca5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorLimited.java @@ -19,6 +19,10 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Supplier; +import forge.StaticData; +import forge.UiCommand; +import forge.card.CardEdition; +import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckGroup; import forge.deck.DeckSection; @@ -27,6 +31,7 @@ import forge.gui.framework.FScreen; import forge.item.PaperCard; import forge.itemmanager.CardManager; import forge.itemmanager.ItemManagerConfig; +import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; import forge.screens.deckeditor.views.VCurrentDeck; @@ -34,6 +39,7 @@ import forge.screens.deckeditor.views.VDeckgen; import forge.screens.home.sanctioned.CSubmenuDraft; import forge.screens.home.sanctioned.CSubmenuSealed; import forge.screens.match.controllers.CDetailPicture; +import forge.util.ItemPool; import forge.util.storage.IStorage; import java.util.Map.Entry; @@ -59,6 +65,7 @@ public final class CEditorLimited extends ACEditorBase { * * @param deckMap0   {@link forge.deck.DeckGroup}<{@link forge.util.storage.IStorage}> */ + @SuppressWarnings("serial") public CEditorLimited(final IStorage deckMap0, final FScreen screen0, final CDetailPicture cDetailPicture) { super(screen0, cDetailPicture); @@ -80,6 +87,13 @@ public final class CEditorLimited extends ACEditorBase { } }; this.controller = new DeckController(deckMap0, this, newCreator); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorLimited.addBasicLands(CEditorLimited.this, null); + } + }); } /** @@ -155,6 +169,18 @@ public final class CEditorLimited extends ACEditorBase { return this.controller; } + public static void addBasicLands(ACEditorBase editor, ItemPool restrictedCatalog) { + Deck deck = editor.getDeckController().getModel().getHumanDeck(); + if (deck == null) { return; } + + CardEdition defaultLandSet = StaticData.instance().getEditions().getEarliestEditionWithAllCards(deck.getAllCardsInASinglePool()); + AddBasicLandsDialog dialog = new AddBasicLandsDialog(deck, defaultLandSet, restrictedCatalog); + CardPool landsToAdd = dialog.show(); + if (landsToAdd != null) { + editor.onAddItems(landsToAdd, false); + } + } + /* (non-Javadoc) * @see forge.gui.deckeditor.ACEditorBase#show(forge.Command) */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index 25d7dd41af4..00cc02a224c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -90,6 +90,7 @@ public final class CEditorQuest extends ACEditorBase { * * @param questData0   {@link forge.quest.QuestController} */ + @SuppressWarnings("serial") public CEditorQuest(final QuestController questData0, final CDetailPicture cDetailPicture) { super(FScreen.DECK_EDITOR_QUEST, cDetailPicture); @@ -117,6 +118,13 @@ public final class CEditorQuest extends ACEditorBase { }; this.controller = new DeckController(questData0.getMyDecks(), this, newCreator); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorConstructed.addBasicLands(CEditorQuest.this, questData.getCards().getCardpool()); + } + }); } // fills number of decks using each card @@ -292,5 +300,4 @@ public final class CEditorQuest extends ACEditorBase { allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE); } } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java index 805bce7120e..f2909581c11 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestCardShop.java @@ -235,6 +235,8 @@ public final class CEditorQuestCardShop extends ACEditorBase { * This is the least restrictive mode; * all cards are available. */ + @SuppressWarnings("serial") public CEditorVariant(final IStorage folder, final Predicate poolCondition, final DeckSection deckSection0, final FScreen screen0, final CDetailPicture cDetailPicture) { super(screen0, cDetailPicture); @@ -82,6 +84,13 @@ public final class CEditorVariant extends ACEditorBase { } }; this.controller = new DeckController(folder, this, newCreator); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorConstructed.addBasicLands(CEditorVariant.this, null); + } + }); } //=========== Overridden from ACEditorBase diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorWinstonProcess.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorWinstonProcess.java index 5fb34b29b26..e8656454850 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorWinstonProcess.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorWinstonProcess.java @@ -74,6 +74,7 @@ public class CEditorWinstonProcess extends ACEditorBase { /** * Updates the deck editor UI as necessary draft selection mode. */ + @SuppressWarnings("serial") public CEditorWinstonProcess(final CDetailPicture cDetailPicture) { super(FScreen.DRAFTING_PROCESS, cDetailPicture); @@ -90,6 +91,13 @@ public class CEditorWinstonProcess extends ACEditorBase { this.setCatalogManager(catalogManager); this.setDeckManager(deckManager); + + getBtnAddBasicLands().setCommand(new UiCommand() { + @Override + public void run() { + CEditorLimited.addBasicLands(CEditorWinstonProcess.this, null); + } + }); } /** diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java index 3fddeeb4bc1..a11a6c74066 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FComboBoxPanel.java @@ -1,11 +1,14 @@ package forge.toolbox; import java.awt.FlowLayout; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; +import com.google.common.collect.ImmutableList; + import forge.toolbox.FSkin.SkinnedLabel; /** @@ -25,25 +28,40 @@ public class FComboBoxPanel extends JPanel { private String comboBoxCaption = ""; private FComboBox comboBox = null; + private int flowLayout; - public FComboBoxPanel(final String comboBoxCaption) { + public FComboBoxPanel(final String comboBoxCaption0) { + this(comboBoxCaption0, FlowLayout.LEFT); + } + public FComboBoxPanel(final String comboBoxCaption0, int flowLayout0) { super(); - this.comboBoxCaption = comboBoxCaption; + comboBoxCaption = comboBoxCaption0; + flowLayout = flowLayout0; applyLayoutAndSkin(); allPanels.add(this); } - public void setComboBox(final FComboBox comboBox, final E selectedItem) { + public FComboBoxPanel(final String comboBoxCaption0, Iterable items) { + this(comboBoxCaption0, FlowLayout.LEFT, items); + } + public FComboBoxPanel(final String comboBoxCaption0, int flowLayout0, Iterable items) { + this(comboBoxCaption0, flowLayout0); + + List list = ImmutableList.copyOf(items); + setComboBox(new FComboBox(list), list.get(0)); + } + + public void setComboBox(final FComboBox comboBox0, final E selectedItem) { removeExistingComboBox(); - this.comboBox = comboBox; - this.comboBox.setSelectedItem(selectedItem); + comboBox = comboBox0; + comboBox.setSelectedItem(selectedItem); setComboBoxLayout(); } private void removeExistingComboBox() { - if (this.comboBox != null) { - this.remove(this.comboBox); - this.comboBox = null; + if (comboBox != null) { + remove(comboBox); + comboBox = null; } } @@ -54,42 +72,46 @@ public class FComboBoxPanel extends JPanel { } private void setPanelLayout() { - final FlowLayout panelLayout = new FlowLayout(FlowLayout.LEFT); + final FlowLayout panelLayout = new FlowLayout(flowLayout); panelLayout.setVgap(0); - this.setLayout(panelLayout); - this.setOpaque(false); + setLayout(panelLayout); + setOpaque(false); } private void setLabelLayout() { - if (this.comboBoxCaption != null && !this.comboBoxCaption.isEmpty()) { - final SkinnedLabel comboLabel = new SkinnedLabel(this.comboBoxCaption); + if (comboBoxCaption != null && !comboBoxCaption.isEmpty()) { + final SkinnedLabel comboLabel = new SkinnedLabel(comboBoxCaption); comboLabel.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); comboLabel.setFont(FSkin.getBoldFont(12)); - this.add(comboLabel); + add(comboLabel); } } private void setComboBoxLayout() { - if (this.comboBox != null) { - this.comboBox.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); - this.comboBox.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); - this.comboBox.setFont(FSkin.getFont(12)); - this.comboBox.setEditable(false); - this.comboBox.setFocusable(true); - this.comboBox.setOpaque(true); - this.add(this.comboBox); + if (comboBox != null) { + comboBox.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + comboBox.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); + comboBox.setFont(FSkin.getFont(12)); + comboBox.setEditable(false); + comboBox.setFocusable(true); + comboBox.setOpaque(true); + add(comboBox); } } - public void setSelectedItem(final Object item) { - this.comboBox.setSelectedItem(item); + public void addActionListener(final ActionListener l) { + comboBox.addActionListener(l); } - public Object getSelectedItem() { - return this.comboBox.getSelectedItem(); + public void setSelectedItem(final Object item) { + comboBox.setSelectedItem(item); + } + + public E getSelectedItem() { + return comboBox.getSelectedItem(); } private void refreshSkin() { - this.comboBox = FComboBoxWrapper.refreshComboBoxSkin(this.comboBox); + comboBox = FComboBoxWrapper.refreshComboBoxSkin(comboBox); } }