diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java b/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java index 4bdfa8c1b6c..e119267e83c 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/EDocID.java @@ -6,11 +6,14 @@ package forge.gui.framework; import com.google.common.collect.ObjectArrays; import forge.screens.deckeditor.views.VAllDecks; +import forge.screens.deckeditor.views.VBrawlDecks; import forge.screens.deckeditor.views.VCardCatalog; +import forge.screens.deckeditor.views.VCommanderDecks; import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.deckeditor.views.VDeckgen; import forge.screens.deckeditor.views.VProbabilities; import forge.screens.deckeditor.views.VStatistics; +import forge.screens.deckeditor.views.VTinyLeadersDecks; import forge.screens.home.gauntlet.VSubmenuGauntletBuild; import forge.screens.home.gauntlet.VSubmenuGauntletContests; import forge.screens.home.gauntlet.VSubmenuGauntletLoad; @@ -54,7 +57,10 @@ public enum EDocID { EDITOR_CATALOG (VCardCatalog.SINGLETON_INSTANCE), EDITOR_CURRENTDECK (VCurrentDeck.SINGLETON_INSTANCE), EDITOR_DECKGEN (VDeckgen.SINGLETON_INSTANCE), - + EDITOR_COMMANDER (VCommanderDecks.SINGLETON_INSTANCE), + EDITOR_BRAWL (VBrawlDecks.SINGLETON_INSTANCE), + EDITOR_TINY_LEADERS (VTinyLeadersDecks.SINGLETON_INSTANCE), + WORKSHOP_CATALOG (VWorkshopCatalog.SINGLETON_INSTANCE), WORKSHOP_CARDDESIGNER (VCardDesigner.SINGLETON_INSTANCE), WORKSHOP_CARDSCRIPT (VCardScript.SINGLETON_INSTANCE), diff --git a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java index ae712b1a908..87c5753bf31 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java +++ b/forge-gui-desktop/src/main/java/forge/gui/framework/SLayoutIO.java @@ -28,6 +28,7 @@ import javax.xml.stream.events.XMLEvent; import forge.FThreads; import forge.Singletons; +import forge.error.BugReporter; import forge.gui.SOverlayUtils; import forge.properties.FileLocation; import forge.properties.ForgeConstants; @@ -36,6 +37,7 @@ import forge.toolbox.SaveOpenDialog; import forge.toolbox.SaveOpenDialog.Filetypes; import forge.util.CollectionSuppliers; import forge.util.ThreadUtil; +import forge.util.gui.SOptionPane; import forge.util.maps.HashMapOfLists; import forge.util.maps.MapOfLists; import forge.view.FFrame; @@ -307,6 +309,8 @@ public final class SLayoutIO { FileOutputStream fos = null; XMLEventWriter writer = null; try { + String layoutSerial = getLayoutSerial(file.defaultLoc); + fos = new FileOutputStream(fWriteTo); writer = out.createXMLEventWriter(fos); final List cells = FView.SINGLETON_INSTANCE.getDragCells(); @@ -314,6 +318,7 @@ public final class SLayoutIO { writer.add(EF.createStartDocument()); writer.add(NEWLINE); writer.add(EF.createStartElement("", "", "layout")); + writer.add(EF.createAttribute("serial", layoutSerial)); writer.add(NEWLINE); for (final DragCell cell : cells) { @@ -356,8 +361,63 @@ public final class SLayoutIO { } } + private static String getLayoutSerial(String layoutFileName) { + final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + FileInputStream fis = null; + XMLEventReader reader = null; + XMLEvent event; + StartElement element; + Iterator attributes; + Attribute attribute; + + try { + fis = new FileInputStream(layoutFileName); + + reader = inputFactory.createXMLEventReader(fis); + while (null != reader && reader.hasNext()) { + event = reader.nextEvent(); + + if (event.isStartElement()) { + element = event.asStartElement(); + + if (element.getName().getLocalPart().equals("layout")) { + attributes = element.getAttributes(); + while (attributes.hasNext()) { + attribute = (Attribute) attributes.next(); + String atrName = attribute.getName().toString(); + if (atrName.equals("serial")) { + return attribute.getValue(); + } + } + } + } + } + } catch (final Exception e) { // I don't care what happened inside, the layout is wrong + e.printStackTrace(); + } + finally { + try { + if (reader != null) { + reader.close(); + } + if (fis != null) { + fis.close(); + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + + return ""; + } + public static void loadLayout(final File f) { final FView view = FView.SINGLETON_INSTANCE; + String defaultLayoutSerial = ""; + String userLayoutSerial = ""; + Boolean resetLayout = false; + FScreen screen = Singletons.getControl().getCurrentScreen(); FAbsolutePositioner.SINGLETON_INSTANCE.hideAll(); view.getPnlInsets().removeAll(); view.getPnlInsets().setLayout(new BorderLayout()); @@ -365,13 +425,13 @@ public final class SLayoutIO { view.getPnlInsets().setBorder(new EmptyBorder(SLayoutConstants.BORDER_T, SLayoutConstants.BORDER_T, 0, 0)); view.removeAllDragCells(); - FileLocation file = Singletons.getControl().getCurrentScreen().getLayoutFile(); + FileLocation file = screen.getLayoutFile(); if (file != null) { // Read a model for new layout MapOfLists model = null; boolean usedCustomPrefsFile = false; FileInputStream fis = null; - + try { if (f != null && f.exists()) { fis = new FileInputStream(f); @@ -379,8 +439,27 @@ public final class SLayoutIO { else { File userSetting = new File(file.userPrefLoc); if (userSetting.exists()) { - usedCustomPrefsFile = true; - fis = new FileInputStream(userSetting); + defaultLayoutSerial = getLayoutSerial(file.defaultLoc); + userLayoutSerial = getLayoutSerial(file.userPrefLoc); + if (defaultLayoutSerial.compareTo(userLayoutSerial) > 0) { + // prompt the user that their saved layout is older + resetLayout = SOptionPane.showConfirmDialog( + String.format("Your %s layout file is from an older template.", + screen.getTabCaption() + ), + "Reset Layout?", + "Reset", + "Keep"); + } + if (resetLayout) { + // delete the old layout file + screen.deleteLayoutFile(); + fis = new FileInputStream(file.defaultLoc); + } else { + fis = new FileInputStream(userSetting); + usedCustomPrefsFile = true; + } + } else { fis = new FileInputStream(file.defaultLoc); @@ -390,7 +469,7 @@ public final class SLayoutIO { final XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLEventReader xer = null; try { - xer = inputFactory.createXMLEventReader(fis); + xer = inputFactory.createXMLEventReader(fis); model = readLayout(xer); } catch (final Exception e) { // I don't care what happened inside, the layout is wrong try { @@ -407,19 +486,19 @@ public final class SLayoutIO { throw new RuntimeException(e); } } - + } catch (FileNotFoundException e) { throw new RuntimeException(e); } finally { - if (fis != null) { - try { + try { + if (fis != null) { fis.close(); } - catch (IOException e) { + } + catch (IOException e) { e.printStackTrace(); - } } } diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index fec8122965f..9843f97c683 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -12,6 +12,8 @@ import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.deck.Deck; +import forge.screens.deckeditor.controllers.CEditorConstructed; import forge.screens.home.quest.DialogChooseFormats; import org.apache.commons.lang3.StringUtils; @@ -267,48 +269,69 @@ public final class DeckManager extends ItemManager implements IHasGam }); } - private void editDeck(final DeckProxy deck) { - if (deck == null) { return; } - + public void editDeck(final DeckProxy deck) { ACEditorBase editorCtrl = null; FScreen screen = null; switch (this.gameType) { - case Quest: - screen = FScreen.DECK_EDITOR_QUEST; - editorCtrl = new CEditorQuest(FModel.getQuest(), getCDetailPicture()); - break; - case Constructed: - screen = FScreen.DECK_EDITOR_CONSTRUCTED; - DeckPreferences.setCurrentDeck(deck.toString()); - //re-use constructed controller - break; - case Sealed: - screen = FScreen.DECK_EDITOR_SEALED; - editorCtrl = new CEditorLimited(FModel.getDecks().getSealed(), screen, getCDetailPicture()); - break; - case Draft: - screen = FScreen.DECK_EDITOR_DRAFT; - editorCtrl = new CEditorLimited(FModel.getDecks().getDraft(), screen, getCDetailPicture()); - break; - case Winston: - screen = FScreen.DECK_EDITOR_DRAFT; - editorCtrl = new CEditorLimited(FModel.getDecks().getWinston(), screen, getCDetailPicture()); - break; + case Quest: + screen = FScreen.DECK_EDITOR_QUEST; + editorCtrl = new CEditorQuest(FModel.getQuest(), getCDetailPicture()); + break; + case Constructed: + screen = FScreen.DECK_EDITOR_CONSTRUCTED; + DeckPreferences.setCurrentDeck((deck != null) ? deck.toString() : ""); + editorCtrl = new CEditorConstructed(getCDetailPicture(), this.gameType); + break; + case Commander: + screen = FScreen.DECK_EDITOR_CONSTRUCTED; // re-use "Deck Editor", rather than creating a new top level tab + DeckPreferences.setCommanderDeck((deck != null) ? deck.toString() : ""); + editorCtrl = new CEditorConstructed(getCDetailPicture(), this.gameType); + break; + case Brawl: + screen = FScreen.DECK_EDITOR_CONSTRUCTED; // re-use "Deck Editor", rather than creating a new top level tab + DeckPreferences.setBrawlDeck((deck != null) ? deck.toString() : ""); + editorCtrl = new CEditorConstructed(getCDetailPicture(), this.gameType); + break; + case TinyLeaders: + screen = FScreen.DECK_EDITOR_CONSTRUCTED; // re-use "Deck Editor", rather than creating a new top level tab + DeckPreferences.setTinyLeadersDeck((deck != null) ? deck.toString() : ""); + editorCtrl = new CEditorConstructed(getCDetailPicture(), this.gameType); + break; + case Sealed: + screen = FScreen.DECK_EDITOR_SEALED; + editorCtrl = new CEditorLimited(FModel.getDecks().getSealed(), screen, getCDetailPicture()); + break; + case Draft: + screen = FScreen.DECK_EDITOR_DRAFT; + editorCtrl = new CEditorLimited(FModel.getDecks().getDraft(), screen, getCDetailPicture()); + break; + case Winston: + screen = FScreen.DECK_EDITOR_DRAFT; + editorCtrl = new CEditorLimited(FModel.getDecks().getWinston(), screen, getCDetailPicture()); + break; - default: - return; + default: + return; } - if (!Singletons.getControl().ensureScreenActive(screen)) { return; } + if (!Singletons.getControl().ensureScreenActive(screen)) { + return; + } if (editorCtrl != null) { CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(editorCtrl); } - if (!SEditorIO.confirmSaveChanges(screen, true)) { return; } //ensure previous deck on screen is saved if needed + if (!SEditorIO.confirmSaveChanges(screen, true)) { + return; + } //ensure previous deck on screen is saved if needed - CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().load(deck.getPath(), deck.getName()); + if (deck != null) { + CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().load(deck.getPath(), deck.getName()); + } else { + CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().loadDeck(new Deck()); + } } public boolean deleteDeck(final DeckProxy deck) { @@ -322,17 +345,20 @@ public final class DeckManager extends ItemManager implements IHasGam // consider using deck proxy's method to delete deck switch(this.gameType) { - case Constructed: - case Draft: - case Sealed: - deck.deleteFromStorage(); - break; - case Quest: - deck.deleteFromStorage(); - FModel.getQuest().save(); - break; - default: - throw new UnsupportedOperationException("Delete not implemented for game type = " + gameType.toString()); + case Brawl: + case Commander: + case TinyLeaders: + case Constructed: + case Draft: + case Sealed: + deck.deleteFromStorage(); + break; + case Quest: + deck.deleteFromStorage(); + FModel.getQuest().save(); + break; + default: + throw new UnsupportedOperationException("Delete not implemented for game type = " + gameType.toString()); } this.removeItem(deck, 1); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index cd1da658c16..c0817e94e1c 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -30,12 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.swing.JMenu; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.KeyStroke; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; +import javax.swing.*; import javax.swing.event.ListSelectionListener; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; @@ -58,6 +53,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.itemmanager.views.ItemView; import forge.screens.match.controllers.CDetailPicture; import forge.toolbox.ContextMenuBuilder; +import forge.toolbox.FComboBox; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.Colors; @@ -115,13 +111,11 @@ public abstract class ItemManager extends JPanel implem .fontSize(12) .build(); - private final FLabel btnCycleSection = new FLabel.Builder() - .text("Change Section") - .tooltip("Toggle between editing the deck and the sideboard/planar/scheme/vanguard parts of this deck") - .icon(FSkin.getIcon(FSkinProp.ICO_EDIT)) - .iconScaleAuto(false).hoverable() + private final FLabel lblEmpty = new FLabel.Builder() + .text("") .fontSize(12) .build(); + private FComboBox cbxSection = new FComboBox(); private static final SkinIcon VIEW_OPTIONS_ICON = FSkin.getIcon(FSkinProp.ICO_SETTINGS).resize(20, 20); private final FLabel btnViewOptions = new FLabel.Builder() @@ -193,8 +187,9 @@ public abstract class ItemManager extends JPanel implem this.add(this.btnFilters); this.add(this.lblCaption); this.add(this.lblRatio); - btnCycleSection.setVisible(false); //hide by default - this.add(btnCycleSection); + this.add(this.lblEmpty); + this.cbxSection.setVisible(false); + this.add(this.cbxSection); for (final ItemView view : this.views) { this.add(view.getButton()); view.getButton().setSelected(view == this.currentView); @@ -381,30 +376,42 @@ public abstract class ItemManager extends JPanel implem helper.newLine(-3); helper.fillLine(this.pnlButtons, showButtonPanel ? buttonPanelHeight : 1); //just show border if no buttons } + // get the width for all components final int viewButtonWidth = FTextField.HEIGHT; - helper.newLine(); - helper.offset(1, 0); //align filters button with expand/collapse all button - helper.include(this.btnFilters, viewButtonWidth, FTextField.HEIGHT); - int captionWidth = this.lblCaption.getAutoSizeWidth(); - int btnCycleSectionWidth = this.btnCycleSection.isVisible() ? this.btnCycleSection.getAutoSizeWidth() : 0; final int ratioWidth = this.lblRatio.getAutoSizeWidth(); - final int viewButtonCount = this.views.size() + 1; - final int availableCaptionWidth = helper.getParentWidth() - viewButtonWidth * viewButtonCount - ratioWidth - btnCycleSectionWidth - 3 * helper.getX() - (viewButtonCount + 2) * helper.getGapX(); + int captionWidth = this.lblCaption.getAutoSizeWidth(); + final int cbxSectionWidth = this.cbxSection.isVisible() ? this.cbxSection.getAutoSizeWidth() : 0; + final int viewButtonCount = this.views.size() + 1; // +1 is for the options button + final int widthViewButtons = viewButtonCount * viewButtonWidth + helper.getGapX() * (viewButtonCount); + + // remove the space needed by all components that will be displayed + int availableCaptionWidth = helper.getParentWidth() + - viewButtonWidth // btnFilters + - cbxSectionWidth + - ratioWidth + - widthViewButtons; + if (captionWidth > availableCaptionWidth) { //truncate caption if not enough room for it this.lblCaption.setToolTipText(this.lblCaption.getText()); captionWidth = availableCaptionWidth; } else { this.lblCaption.setToolTipText(null); } + + helper.newLine(); + helper.offset(1, 0); //align filters button with expand/collapse all button + helper.include(this.btnFilters, viewButtonWidth, FTextField.HEIGHT); helper.include(this.lblCaption, captionWidth, FTextField.HEIGHT); - helper.fillLine(this.lblRatio, FTextField.HEIGHT, (viewButtonWidth + helper.getGapX()) * viewButtonCount - viewButtonCount + btnCycleSectionWidth + 2 * helper.getGapX() + 1); //leave room for view buttons and btnCycleSectionWidth - helper.include(this.btnCycleSection, btnCycleSectionWidth, FTextField.HEIGHT); + helper.include(this.cbxSection, cbxSectionWidth, FTextField.HEIGHT); helper.offset(helper.getGapX(), 0); + helper.include(this.lblRatio, ratioWidth, FTextField.HEIGHT); + helper.fillLine(this.lblEmpty, FTextField.HEIGHT, widthViewButtons); for (final ItemView view : this.views) { helper.include(view.getButton(), viewButtonWidth, FTextField.HEIGHT); helper.offset(-1, 0); } helper.include(this.btnViewOptions, viewButtonWidth, FTextField.HEIGHT); + helper.newLine(-1); if (this.currentView.getPnlOptions().isVisible()) { helper.fillLine(this.currentView.getPnlOptions(), FTextField.HEIGHT + 4); @@ -1092,8 +1099,8 @@ public abstract class ItemManager extends JPanel implem return this.pnlButtons; } - public FLabel getBtnCycleSection() { - return btnCycleSection; + public FComboBox getCbxSection() { + return this.cbxSection; } /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java index 5d2e6db4421..c7ba09ac71e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/CDeckEditorUI.java @@ -38,8 +38,11 @@ import forge.item.InventoryItem; import forge.itemmanager.ItemManager; import forge.screens.deckeditor.controllers.*; import forge.screens.deckeditor.views.VAllDecks; +import forge.screens.deckeditor.views.VBrawlDecks; import forge.screens.deckeditor.views.VCardCatalog; +import forge.screens.deckeditor.views.VCommanderDecks; import forge.screens.deckeditor.views.VCurrentDeck; +import forge.screens.deckeditor.views.VTinyLeadersDecks; import forge.screens.match.controllers.CDetailPicture; import forge.util.ItemPool; @@ -59,12 +62,21 @@ public enum CDeckEditorUI implements ICDoc { private ACEditorBase childController; private final CDetailPicture cDetailPicture; private final VAllDecks vAllDecks; + private final VCommanderDecks vCommanderDecks; + private final VBrawlDecks vBrawlDecks; + private final VTinyLeadersDecks vTinyLeadersDecks; private CDeckEditorUI() { screenChildControllers = new HashMap>(); this.cDetailPicture = new CDetailPicture(); this.vAllDecks = VAllDecks.SINGLETON_INSTANCE; this.vAllDecks.setCDetailPicture(cDetailPicture); + this.vCommanderDecks = VCommanderDecks.SINGLETON_INSTANCE; + this.vCommanderDecks.setCDetailPicture(cDetailPicture); + this.vBrawlDecks = VBrawlDecks.SINGLETON_INSTANCE; + this.vBrawlDecks.setCDetailPicture(cDetailPicture); + this.vTinyLeadersDecks = VTinyLeadersDecks.SINGLETON_INSTANCE; + this.vTinyLeadersDecks.setCDetailPicture(cDetailPicture); } public CDetailPicture getCDetailPicture() { 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 14ea6d1de34..f9287da68da 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 @@ -39,6 +39,7 @@ import forge.screens.deckeditor.views.VCardCatalog; import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.match.controllers.CDetailPicture; import forge.toolbox.ContextMenuBuilder; +import forge.toolbox.FComboBox; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.util.Aggregates; @@ -389,7 +390,7 @@ public abstract class ACEditorBase
(C at beginning of class name denotes a control class.) + * + */ +public enum CBrawlDecks implements ICDoc { + SINGLETON_INSTANCE; + + private final VBrawlDecks view = VBrawlDecks.SINGLETON_INSTANCE; + + //========== Overridden methods + + @Override + public void register() { + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#initialize() + */ + @Override + public void initialize() { + refresh(); + } + + public void refresh() { + view.getLstDecks().setPool(DeckProxy.getAllBrawlDecks()); + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + view.getLstDecks().setup(ItemManagerConfig.CONSTRUCTED_DECKS); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCommanderDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCommanderDecks.java new file mode 100644 index 00000000000..ba77211f111 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCommanderDecks.java @@ -0,0 +1,45 @@ +package forge.screens.deckeditor.controllers; + +import forge.deck.DeckProxy; +import forge.gui.framework.ICDoc; +import forge.itemmanager.ItemManagerConfig; +import forge.screens.deckeditor.views.VAllDecks; +import forge.screens.deckeditor.views.VCommanderDecks; + +/** + * Controls the "Commander Decks" panel in the deck editor UI. + * + *

(C at beginning of class name denotes a control class.) + * + */ +public enum CCommanderDecks implements ICDoc { + SINGLETON_INSTANCE; + + private final VCommanderDecks view = VCommanderDecks.SINGLETON_INSTANCE; + + //========== Overridden methods + + @Override + public void register() { + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#initialize() + */ + @Override + public void initialize() { + refresh(); + } + + public void refresh() { + view.getLstDecks().setPool(DeckProxy.getAllCommanderDecks()); + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + view.getLstDecks().setup(ItemManagerConfig.CONSTRUCTED_DECKS); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java index b769d07efb4..63d1b81b477 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorCommander.java @@ -35,8 +35,11 @@ import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; import forge.screens.deckeditor.views.VDeckgen; import forge.screens.match.controllers.CDetailPicture; +import forge.toolbox.FComboBox; import forge.util.ItemPool; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; @@ -191,15 +194,20 @@ public final class CEditorCommander extends CDeckEditor { this.getBtnRemove4().setVisible(false); this.getBtnAdd4().setVisible(false); - this.getBtnCycleSection().setVisible(true); - this.getBtnCycleSection().setCommand(new UiCommand() { - private static final long serialVersionUID = -9082606944024479599L; + this.getCbxSection().removeAllItems(); + for (DeckSection section : allSections) { + this.getCbxSection().addItem(section); + } + this.getCbxSection().addActionListener(new ActionListener() { @Override - public void run() { - cycleEditorMode(); + public void actionPerformed(ActionEvent actionEvent) { + FComboBox cb = (FComboBox)actionEvent.getSource(); + DeckSection ds = (DeckSection)cb.getSelectedItem(); + setEditorMode(ds); } }); + this.getCbxSection().setVisible(true); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); @@ -232,11 +240,7 @@ public final class CEditorCommander extends CDeckEditor { /** * Switch between the main deck and the sideboard editor. */ - public void cycleEditorMode() { - int curindex = allSections.indexOf(sectionMode); - curindex = (curindex + 1) % allSections.size(); - sectionMode = allSections.get(curindex); - + public void setEditorMode(DeckSection sectionMode) { switch(sectionMode) { case Main: this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); @@ -257,6 +261,7 @@ public final class CEditorCommander extends CDeckEditor { break; } + this.sectionMode = sectionMode; this.controller.updateCaptions(); } } 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 30a840212f1..1d5bdb4938e 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 @@ -17,13 +17,16 @@ */ package forge.screens.deckeditor.controllers; +import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import forge.UiCommand; +import forge.card.CardRules; import forge.card.CardRulesPredicates; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.game.GameType; import forge.gui.framework.FScreen; import forge.item.PaperCard; import forge.itemmanager.CardManager; @@ -33,8 +36,13 @@ import forge.properties.ForgePreferences.FPref; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.match.controllers.CDetailPicture; +import forge.toolbox.FComboBox; import forge.util.ItemPool; +import sun.font.FontConfigManager; +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; @@ -50,9 +58,16 @@ import java.util.Map.Entry; * @version $Id: CEditorConstructed.java 24868 2014-02-17 05:08:05Z drdev $ */ public final class CEditorConstructed extends CDeckEditor { - private final DeckController controller; + private DeckController controller; private final List allSections = new ArrayList(); - private final ItemPool normalPool, avatarPool, planePool, schemePool, conspiracyPool; + private ItemPool normalPool, avatarPool, planePool, schemePool, conspiracyPool, commanderPool; + + private final GameType gameType; + + Predicate commanderFilter; + + CardManager catalogManager; + CardManager deckManager; //=========== Constructor /** @@ -62,23 +77,56 @@ public final class CEditorConstructed extends CDeckEditor { */ @SuppressWarnings("serial") public CEditorConstructed(final CDetailPicture cDetailPicture) { + this(cDetailPicture, GameType.Constructed); + } + + public CEditorConstructed(final CDetailPicture cDetailPicture, final GameType gameType) { super(FScreen.DECK_EDITOR_CONSTRUCTED, cDetailPicture); + this.gameType = gameType; + + boolean wantUnique = false; allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); - allSections.add(DeckSection.Avatar); - allSections.add(DeckSection.Schemes); - allSections.add(DeckSection.Planes); - allSections.add(DeckSection.Conspiracy); - normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); - avatarPool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard.FN_GET_RULES)), PaperCard.class); - planePool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class); - schemePool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard.FN_GET_RULES)), PaperCard.class); - conspiracyPool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_CONSPIRACY, PaperCard.FN_GET_RULES)), PaperCard.class); + switch (this.gameType) { + case Constructed: + allSections.add(DeckSection.Avatar); + allSections.add(DeckSection.Schemes); + allSections.add(DeckSection.Planes); + allSections.add(DeckSection.Conspiracy); - CardManager catalogManager = new CardManager(getCDetailPicture(), false, false); // TODO: restore the functionality of the "want uniques only" toggle - CardManager deckManager = new CardManager(getCDetailPicture(), false, false); // IMPORTANT: must *always* show all cards in the deck, otherwise cards with different art get ignored! + normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); + avatarPool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard.FN_GET_RULES)), PaperCard.class); + planePool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class); + schemePool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard.FN_GET_RULES)), PaperCard.class); + conspiracyPool = ItemPool.createFrom(FModel.getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_CONSPIRACY, PaperCard.FN_GET_RULES)), PaperCard.class); + + break; + case Commander: + case TinyLeaders: + allSections.add(DeckSection.Commander); + + commanderFilter = CardRulesPredicates.Presets.CAN_BE_COMMANDER; + commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES)), PaperCard.class); + normalPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(), PaperCard.class); + + wantUnique = true; + break; + case Brawl: + allSections.add(DeckSection.Commander); + + commanderFilter = CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER; + commanderPool = ItemPool.createFrom(FModel.getMagicDb().getCommonCards().getAllCards(Predicates.and( + FModel.getFormats().get("Brawl").getFilterPrinted(), Predicates.compose(commanderFilter, PaperCard.FN_GET_RULES))), PaperCard.class); + normalPool = ItemPool.createFrom(FModel.getFormats().get("Brawl").getAllCards(), PaperCard.class); + + wantUnique = true; + break; + } + + catalogManager = new CardManager(getCDetailPicture(), wantUnique, false); + deckManager = new CardManager(getCDetailPicture(), wantUnique, false); catalogManager.setCaption("Catalog"); @@ -92,7 +140,20 @@ public final class CEditorConstructed extends CDeckEditor { } }; - this.controller = new DeckController(FModel.getDecks().getConstructed(), this, newCreator); + switch (this.gameType) { + case Constructed: + this.controller = new DeckController(FModel.getDecks().getConstructed(), this, newCreator); + break; + case Commander: + this.controller = new DeckController(FModel.getDecks().getCommander(), this, newCreator); + break; + case Brawl: + this.controller = new DeckController(FModel.getDecks().getBrawl(), this, newCreator); + break; + case TinyLeaders: + this.controller = new DeckController(FModel.getDecks().getTinyLeaders(), this, newCreator); + break; + } getBtnAddBasicLands().setCommand(new UiCommand() { @Override @@ -110,7 +171,14 @@ public final class CEditorConstructed extends CDeckEditor { return CardLimit.Singleton; } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - return CardLimit.Default; + switch (this.gameType) { + case Constructed: + return CardLimit.Default; + case Commander: + case TinyLeaders: + case Brawl: + return CardLimit.Singleton; + } } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit } @@ -296,45 +364,70 @@ public final class CEditorConstructed extends CDeckEditor { /** * Switch between the main deck and the sideboard editor. */ - public void cycleEditorMode() { - int curindex = allSections.indexOf(sectionMode); - curindex = (curindex + 1) % allSections.size(); - sectionMode = allSections.get(curindex); - - switch(sectionMode) { - case Main: - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(normalPool, true); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - break; - case Sideboard: - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(normalPool, true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - break; - case Avatar: - this.getCatalogManager().setup(ItemManagerConfig.AVATAR_POOL); - this.getCatalogManager().setPool(avatarPool, true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Avatar)); - break; - case Planes: - this.getCatalogManager().setup(ItemManagerConfig.PLANAR_POOL); - this.getCatalogManager().setPool(planePool,true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Planes)); - break; - case Schemes: - this.getCatalogManager().setup(ItemManagerConfig.SCHEME_POOL); - this.getCatalogManager().setPool(schemePool,true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Schemes)); - break; - case Commander: - break; //do nothing for Commander here - case Conspiracy: - this.getCatalogManager().setup(ItemManagerConfig.CONSPIRACY_DECKS); - this.getCatalogManager().setPool(conspiracyPool,true); - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Conspiracy)); + public void setEditorMode(DeckSection sectionMode) { + if (sectionMode == null) { + return; + } + switch(this.gameType) { + case Constructed: + switch(sectionMode) { + case Main: + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(normalPool, true); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard: + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(normalPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + break; + case Avatar: + this.getCatalogManager().setup(ItemManagerConfig.AVATAR_POOL); + this.getCatalogManager().setPool(avatarPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Avatar)); + break; + case Planes: + this.getCatalogManager().setup(ItemManagerConfig.PLANAR_POOL); + this.getCatalogManager().setPool(planePool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Planes)); + break; + case Schemes: + this.getCatalogManager().setup(ItemManagerConfig.SCHEME_POOL); + this.getCatalogManager().setPool(schemePool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Schemes)); + break; + case Commander: + break; //do nothing for Commander here + case Conspiracy: + this.getCatalogManager().setup(ItemManagerConfig.CONSPIRACY_DECKS); + this.getCatalogManager().setPool(conspiracyPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Conspiracy)); + } + case Commander: + case TinyLeaders: + case Brawl: + switch(sectionMode) { + case Main: + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(normalPool, true); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard: + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(normalPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + break; + case Commander: + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(commanderPool, true); + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Commander)); + break; + default: + break; + } } + this.sectionMode = sectionMode; this.controller.updateCaptions(); } @@ -360,13 +453,19 @@ public final class CEditorConstructed extends CDeckEditor { resetUI(); - this.getBtnCycleSection().setVisible(true); - this.getBtnCycleSection().setCommand(new UiCommand() { + this.getCbxSection().removeAllItems(); + for (DeckSection section : allSections) { + this.getCbxSection().addItem(section); + } + this.getCbxSection().addActionListener(new ActionListener() { @Override - public void run() { - cycleEditorMode(); + public void actionPerformed(ActionEvent actionEvent) { + FComboBox cb = (FComboBox)actionEvent.getSource(); + DeckSection ds = (DeckSection)cb.getSelectedItem(); + setEditorMode(ds); } }); + this.getCbxSection().setVisible(true); this.controller.refreshModel(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorDraftingProcess.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorDraftingProcess.java index 239079e7595..2738d174d5b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorDraftingProcess.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorDraftingProcess.java @@ -272,7 +272,7 @@ public class CEditorDraftingProcess extends ACEditorBase { this.getBtnRemove().setVisible(false); this.getBtnRemove4().setVisible(false); - this.getBtnCycleSection().setVisible(false); + this.getCbxSection().setVisible(false); VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(false); 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 0628856de52..93288c4cb16 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 @@ -33,14 +33,20 @@ import forge.model.FModel; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; +import forge.screens.deckeditor.views.VBrawlDecks; +import forge.screens.deckeditor.views.VCommanderDecks; import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.deckeditor.views.VDeckgen; +import forge.screens.deckeditor.views.VTinyLeadersDecks; import forge.screens.home.sanctioned.CSubmenuDraft; import forge.screens.home.sanctioned.CSubmenuSealed; import forge.screens.match.controllers.CDetailPicture; +import forge.toolbox.FComboBox; import forge.util.storage.IStorage; import java.util.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.Map.Entry; /** @@ -54,7 +60,10 @@ import java.util.Map.Entry; public final class CEditorLimited extends CDeckEditor { private final DeckController controller; - private DragCell allDecksParent = null; + private DragCell constructedDecksParent = null; + private DragCell commanderDecksParent = null; + private DragCell brawlDecksParent = null; + private DragCell tinyLeadersDecksParent = null; private DragCell deckGenParent = null; private final List allSections = new ArrayList(); @@ -98,10 +107,16 @@ public final class CEditorLimited extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Conspiracy); - this.getBtnCycleSection().setCommand(new UiCommand() { + this.getCbxSection().removeAllItems(); + for (DeckSection section : allSections) { + this.getCbxSection().addItem(section); + } + this.getCbxSection().addActionListener(new ActionListener() { @Override - public void run() { - cycleEditorMode(); + public void actionPerformed(ActionEvent actionEvent) { + FComboBox cb = (FComboBox)actionEvent.getSource(); + DeckSection ds = (DeckSection)cb.getSelectedItem(); + setEditorMode(ds); } }); } @@ -194,10 +209,7 @@ public final class CEditorLimited extends CDeckEditor { } - public void cycleEditorMode() { - int curindex = (allSections.indexOf(sectionMode) + 1) % allSections.size(); - sectionMode = allSections.get(curindex); - + public void setEditorMode(DeckSection sectionMode) { switch(sectionMode) { case Conspiracy: this.getCatalogManager().setup(ItemManagerConfig.DRAFT_CONSPIRACY); @@ -211,6 +223,7 @@ public final class CEditorLimited extends CDeckEditor { break; } + this.sectionMode = sectionMode; this.controller.updateCaptions(); } @@ -226,10 +239,13 @@ public final class CEditorLimited extends CDeckEditor { VCurrentDeck.SINGLETON_INSTANCE.getBtnPrintProxies().setVisible(false); VCurrentDeck.SINGLETON_INSTANCE.getTxfTitle().setEnabled(false); - this.getBtnCycleSection().setVisible(true); + this.getCbxSection().setVisible(true); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); - allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); + constructedDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); + commanderDecksParent = removeTab(VCommanderDecks.SINGLETON_INSTANCE); + brawlDecksParent = removeTab(VBrawlDecks.SINGLETON_INSTANCE); + tinyLeadersDecksParent = removeTab(VTinyLeadersDecks.SINGLETON_INSTANCE); } /* (non-Javadoc) @@ -252,8 +268,17 @@ public final class CEditorLimited extends CDeckEditor { if (deckGenParent != null) { deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE); } - if (allDecksParent != null) { - allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE); + if (constructedDecksParent != null) { + constructedDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE); + } + if (commanderDecksParent != null) { + commanderDecksParent.addDoc(VCommanderDecks.SINGLETON_INSTANCE); + } + if (brawlDecksParent!= null) { + brawlDecksParent.addDoc(VBrawlDecks.SINGLETON_INSTANCE); + } + if (tinyLeadersDecksParent != null) { + tinyLeadersDecksParent.addDoc(VTinyLeadersDecks.SINGLETON_INSTANCE); } } } 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 d54b9de65e9..c33da12cda7 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 @@ -42,9 +42,12 @@ import forge.screens.deckeditor.views.VCurrentDeck; import forge.screens.deckeditor.views.VDeckgen; import forge.screens.home.quest.CSubmenuQuestDecks; import forge.screens.match.controllers.CDetailPicture; +import forge.toolbox.FComboBox; import forge.util.ItemPool; import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -279,11 +282,7 @@ public final class CEditorQuest extends CDeckEditor { /** * Switch between the main deck and the sideboard editor. */ - public void cycleEditorMode() { - int curindex = allSections.indexOf(sectionMode); - curindex = (curindex + 1) % allSections.size(); - sectionMode = allSections.get(curindex); - + public void setEditorMode(DeckSection sectionMode) { if (sectionMode == DeckSection.Sideboard) { this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); } @@ -291,6 +290,7 @@ public final class CEditorQuest extends CDeckEditor { this.getDeckManager().setPool(this.controller.getModel().getMain()); } + this.sectionMode = sectionMode; this.controller.updateCaptions(); } @@ -316,12 +316,19 @@ public final class CEditorQuest extends CDeckEditor { VCurrentDeck.SINGLETON_INSTANCE.getBtnSave().setVisible(true); - this.getBtnCycleSection().setVisible(true); - this.getBtnCycleSection().setCommand(new UiCommand() { - @Override public void run() { - cycleEditorMode(); + this.getCbxSection().removeAllItems(); + for (DeckSection section : allSections) { + this.getCbxSection().addItem(section); + } + this.getCbxSection().addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent actionEvent) { + FComboBox cb = (FComboBox)actionEvent.getSource(); + DeckSection ds = (DeckSection)cb.getSelectedItem(); + setEditorMode(ds); } }); + this.getCbxSection().setVisible(true); deckGenParent = removeTab(VDeckgen.SINGLETON_INSTANCE); allDecksParent = removeTab(VAllDecks.SINGLETON_INSTANCE); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestDraftingProcess.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestDraftingProcess.java index 6d8a3b5010c..64d3a9a9a1b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestDraftingProcess.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuestDraftingProcess.java @@ -270,7 +270,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase
(C at beginning of class name denotes a control class.) + * + */ +public enum CTinyLeadersDecks implements ICDoc { + SINGLETON_INSTANCE; + + private final VTinyLeadersDecks view = VTinyLeadersDecks.SINGLETON_INSTANCE; + + //========== Overridden methods + + @Override + public void register() { + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#initialize() + */ + @Override + public void initialize() { + refresh(); + } + + public void refresh() { + view.getLstDecks().setPool(DeckProxy.getAllTinyLeadersDecks()); + } + + /* (non-Javadoc) + * @see forge.gui.framework.ICDoc#update() + */ + @Override + public void update() { + view.getLstDecks().setup(ItemManagerConfig.CONSTRUCTED_DECKS); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java index af35f26d89a..3b0b40ca894 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/DeckController.java @@ -88,6 +88,10 @@ public class DeckController { */ public void loadDeck(Deck deck) { + if (deck.getName() == "") { + newModel(); + } + if (!view.getCatalogManager().isInfinite()) { CardPool catalogClone = new CardPool(view.getInitialCatalog()); deck = pickFromCatalog(deck, catalogClone); @@ -406,7 +410,7 @@ public class DeckController { tabCaption = "*" + tabCaption; itemManagerCaption = "*" + itemManagerCaption; } - itemManagerCaption += " - " + view.getSectionMode().name(); + itemManagerCaption += " - "; VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText(tabCaption); VCurrentDeck.SINGLETON_INSTANCE.getTxfTitle().setText(title); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java index f5ba77f4ccf..b31b6cb31b4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VAllDecks.java @@ -1,5 +1,6 @@ package forge.screens.deckeditor.views; +import forge.deck.io.DeckPreferences; import forge.game.GameType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; @@ -24,7 +25,7 @@ public enum VAllDecks implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("All Decks"); + private final DragTab tab = new DragTab("Constructed"); private DeckManager lstDecks; @@ -80,6 +81,8 @@ public enum VAllDecks implements IVDoc { JPanel parentBody = parentCell.getBody(); parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3")); parentBody.add(new ItemManagerContainer(lstDecks), "push, grow"); + String preferredDeck = DeckPreferences.getCurrentDeck(); + lstDecks.editDeck(lstDecks.stringToItem(preferredDeck)); } //========== Retrieval methods @@ -90,6 +93,6 @@ public enum VAllDecks implements IVDoc { public void setCDetailPicture(final CDetailPicture cDetailPicture) { this.lstDecks = new DeckManager(GameType.Constructed, cDetailPicture); - this.lstDecks.setCaption("Decks"); + this.lstDecks.setCaption("Constructed Decks"); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java new file mode 100644 index 00000000000..8afcb05a190 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VBrawlDecks.java @@ -0,0 +1,98 @@ +package forge.screens.deckeditor.views; + +import forge.deck.io.DeckPreferences; +import forge.game.GameType; +import forge.gui.framework.DragCell; +import forge.gui.framework.DragTab; +import forge.gui.framework.EDocID; +import forge.gui.framework.IVDoc; +import forge.itemmanager.DeckManager; +import forge.itemmanager.ItemManagerContainer; +import forge.screens.deckeditor.controllers.CBrawlDecks; +import forge.screens.match.controllers.CDetailPicture; +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; + +/** + * Assembles Swing components of all deck viewer in deck editor. + * + *

(V at beginning of class name denotes a view class.) + */ +public enum VBrawlDecks implements IVDoc { + /** */ + SINGLETON_INSTANCE; + + // Fields used with interface IVDoc + private DragCell parentCell; + private final DragTab tab = new DragTab("Brawl"); + + private DeckManager lstDecks; + + //========== Overridden methods + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getDocumentID() + */ + @Override + public EDocID getDocumentID() { + return EDocID.EDITOR_BRAWL; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getTabLabel() + */ + @Override + public DragTab getTabLabel() { + return tab; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getLayoutControl() + */ + @Override + public CBrawlDecks getLayoutControl() { + return CBrawlDecks.SINGLETON_INSTANCE; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) + */ + @Override + public void setParentCell(DragCell cell0) { + this.parentCell = cell0; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getParentCell() + */ + @Override + public DragCell getParentCell() { + return this.parentCell; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#populate() + */ + @Override + public void populate() { + CBrawlDecks.SINGLETON_INSTANCE.refresh(); //ensure decks refreshed in case any deleted or added since last loaded + + JPanel parentBody = parentCell.getBody(); + parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3")); + parentBody.add(new ItemManagerContainer(lstDecks), "push, grow"); + String preferredDeck = DeckPreferences.getBrawlDeck(); + lstDecks.editDeck(lstDecks.stringToItem(preferredDeck)); + } + + //========== Retrieval methods + /** @return {@link JPanel} */ + public DeckManager getLstDecks() { + return lstDecks; + } + + public void setCDetailPicture(final CDetailPicture cDetailPicture) { + this.lstDecks = new DeckManager(GameType.Brawl, cDetailPicture); + this.lstDecks.setCaption("Brawl Decks"); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java new file mode 100644 index 00000000000..fbed9d4271f --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VCommanderDecks.java @@ -0,0 +1,98 @@ +package forge.screens.deckeditor.views; + +import forge.deck.io.DeckPreferences; +import forge.game.GameType; +import forge.gui.framework.DragCell; +import forge.gui.framework.DragTab; +import forge.gui.framework.EDocID; +import forge.gui.framework.IVDoc; +import forge.itemmanager.DeckManager; +import forge.itemmanager.ItemManagerContainer; +import forge.screens.deckeditor.controllers.CCommanderDecks; +import forge.screens.match.controllers.CDetailPicture; +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; + +/** + * Assembles Swing components of all deck viewer in deck editor. + * + *

(V at beginning of class name denotes a view class.) + */ +public enum VCommanderDecks implements IVDoc { + /** */ + SINGLETON_INSTANCE; + + // Fields used with interface IVDoc + private DragCell parentCell; + private final DragTab tab = new DragTab("Commander"); + + private DeckManager lstDecks; + + //========== Overridden methods + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getDocumentID() + */ + @Override + public EDocID getDocumentID() { + return EDocID.EDITOR_COMMANDER; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getTabLabel() + */ + @Override + public DragTab getTabLabel() { + return tab; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getLayoutControl() + */ + @Override + public CCommanderDecks getLayoutControl() { + return CCommanderDecks.SINGLETON_INSTANCE; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) + */ + @Override + public void setParentCell(DragCell cell0) { + this.parentCell = cell0; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getParentCell() + */ + @Override + public DragCell getParentCell() { + return this.parentCell; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#populate() + */ + @Override + public void populate() { + CCommanderDecks.SINGLETON_INSTANCE.refresh(); //ensure decks refreshed in case any deleted or added since last loaded + + JPanel parentBody = parentCell.getBody(); + parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3")); + parentBody.add(new ItemManagerContainer(lstDecks), "push, grow"); + String preferredDeck = DeckPreferences.getCommanderDeck(); + lstDecks.editDeck(lstDecks.stringToItem(preferredDeck)); + } + + //========== Retrieval methods + /** @return {@link JPanel} */ + public DeckManager getLstDecks() { + return lstDecks; + } + + public void setCDetailPicture(final CDetailPicture cDetailPicture) { + this.lstDecks = new DeckManager(GameType.Commander, cDetailPicture); + this.lstDecks.setCaption("Commander Decks"); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java new file mode 100644 index 00000000000..cc824baa017 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/views/VTinyLeadersDecks.java @@ -0,0 +1,98 @@ +package forge.screens.deckeditor.views; + +import forge.deck.io.DeckPreferences; +import forge.game.GameType; +import forge.gui.framework.DragCell; +import forge.gui.framework.DragTab; +import forge.gui.framework.EDocID; +import forge.gui.framework.IVDoc; +import forge.itemmanager.DeckManager; +import forge.itemmanager.ItemManagerContainer; +import forge.screens.deckeditor.controllers.CTinyLeadersDecks; +import forge.screens.match.controllers.CDetailPicture; +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; + +/** + * Assembles Swing components of all deck viewer in deck editor. + * + *

(V at beginning of class name denotes a view class.) + */ +public enum VTinyLeadersDecks implements IVDoc { + /** */ + SINGLETON_INSTANCE; + + // Fields used with interface IVDoc + private DragCell parentCell; + private final DragTab tab = new DragTab("Tiny Leaders"); + + private DeckManager lstDecks; + + //========== Overridden methods + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getDocumentID() + */ + @Override + public EDocID getDocumentID() { + return EDocID.EDITOR_TINY_LEADERS; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getTabLabel() + */ + @Override + public DragTab getTabLabel() { + return tab; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getLayoutControl() + */ + @Override + public CTinyLeadersDecks getLayoutControl() { + return CTinyLeadersDecks.SINGLETON_INSTANCE; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#setParentCell(forge.gui.framework.DragCell) + */ + @Override + public void setParentCell(DragCell cell0) { + this.parentCell = cell0; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#getParentCell() + */ + @Override + public DragCell getParentCell() { + return this.parentCell; + } + + /* (non-Javadoc) + * @see forge.gui.framework.IVDoc#populate() + */ + @Override + public void populate() { + CTinyLeadersDecks.SINGLETON_INSTANCE.refresh(); //ensure decks refreshed in case any deleted or added since last loaded + + JPanel parentBody = parentCell.getBody(); + parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3")); + parentBody.add(new ItemManagerContainer(lstDecks), "push, grow"); + String preferredDeck = DeckPreferences.getTinyLeadersDeck(); + lstDecks.editDeck(lstDecks.stringToItem(preferredDeck)); + } + + //========== Retrieval methods + /** @return {@link JPanel} */ + public DeckManager getLstDecks() { + return lstDecks; + } + + public void setCDetailPicture(final CDetailPicture cDetailPicture) { + this.lstDecks = new DeckManager(GameType.TinyLeaders, cDetailPicture); + this.lstDecks.setCaption("Tiny Leaders Decks"); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index 006487fa53a..8ff11ea0b9a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -88,7 +88,6 @@ public class PlayerPanel extends FPanel { private final FLabel scmLabel; private final FLabel cmdDeckSelectorBtn = new FLabel.ButtonBuilder().text("Select a Commander deck").build(); - private final FLabel cmdDeckEditor = new FLabel.ButtonBuilder().text("Commander Deck Editor").build(); private final FLabel cmdLabel; private final FLabel pchDeckSelectorBtn = new FLabel.ButtonBuilder().text("Select a planar deck").build(); @@ -161,9 +160,8 @@ public class PlayerPanel extends FPanel { addHandlersDeckSelector(); - this.add(cmdLabel, variantBtnConstraints + ", cell 0 3, sx 2, ax right"); - this.add(cmdDeckSelectorBtn, variantBtnConstraints + ", cell 2 3, growx, pushx"); - this.add(cmdDeckEditor, variantBtnConstraints + ", cell 3 3, sx 3, growx, wrap"); + this.add(cmdLabel, variantBtnConstraints + ", cell 0 2, sx 2, ax right"); + this.add(cmdDeckSelectorBtn, variantBtnConstraints + ", cell 2 2, pushx, growx, wmax 100%-153px, h 30px, spanx 4, wrap"); this.add(scmLabel, variantBtnConstraints + ", cell 0 4, sx 2, ax right"); this.add(scmDeckSelectorBtn, variantBtnConstraints + ", cell 2 4, growx, pushx"); @@ -347,9 +345,7 @@ public class PlayerPanel extends FPanel { deckLabel.setVisible(isDeckBuildingAllowed); deckBtn.setVisible(isDeckBuildingAllowed); - cmdDeckSelectorBtn.setVisible(isCommanderApplied); - cmdDeckEditor.setText(isTinyLeaders ? "TL Deck Editor" : isBrawl ? "Brawl Editor" : "Commander Deck Editor"); - cmdDeckEditor.setVisible(isCommanderApplied); + cmdDeckSelectorBtn.setVisible(isCommanderApplied); cmdLabel.setVisible(isCommanderApplied); scmDeckSelectorBtn.setVisible(archenemyVisiblity); @@ -516,25 +512,6 @@ public class PlayerPanel extends FPanel { } }); - cmdDeckEditor.setCommand(new UiCommand() { - @Override - public void run() { - if (lobby.hasVariant(GameType.TinyLeaders)) { - lobby.setCurrentGameMode(GameType.TinyLeaders); - Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_TINY_LEADERS); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), true, false)); - } else if (lobby.hasVariant(GameType.Brawl)) { - lobby.setCurrentGameMode(GameType.Brawl); - Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_BRAWL); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), false, true)); - } else { - lobby.setCurrentGameMode(GameType.Commander); - Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER); - CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander(CDeckEditorUI.SINGLETON_INSTANCE.getCDetailPicture(), false, false)); - } - } - }); - // Planechase buttons pchDeckSelectorBtn.setCommand(new Runnable() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 2c0ebc5daf6..0b5139827d2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -96,9 +96,9 @@ public class VLobby implements ILobbyView { private final VariantCheckBox vntArchenemy = new VariantCheckBox(GameType.Archenemy); private final VariantCheckBox vntArchenemyRumble = new VariantCheckBox(GameType.ArchenemyRumble); private final ImmutableList vntBoxesLocal = - ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntTinyLeaders, vntBrawl, vntPlanechase, vntArchenemy, vntArchenemyRumble); + ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntBrawl, vntTinyLeaders, vntPlanechase, vntArchenemy, vntArchenemyRumble); private final ImmutableList vntBoxesNetwork = - ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntTinyLeaders, vntBrawl /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); + ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntBrawl, vntTinyLeaders /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); // Player frame elements private final JPanel playersFrame = new JPanel(new MigLayout("insets 0, gap 0 5, wrap, hidemode 3")); diff --git a/forge-gui/res/defaults/editor.xml b/forge-gui/res/defaults/editor.xml index ddd23b8ea34..8beb854381d 100644 --- a/forge-gui/res/defaults/editor.xml +++ b/forge-gui/res/defaults/editor.xml @@ -1,5 +1,5 @@ - + CARD_PICTURE @@ -14,6 +14,9 @@ EDITOR_CATALOG EDITOR_ALLDECKS + EDITOR_COMMANDER + EDITOR_BRAWL + EDITOR_TINY_LEADERS EDITOR_DECKGEN diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index beec7180558..3f162073386 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.StringUtils; import forge.interfaces.ICheckBox; @@ -71,22 +72,43 @@ public class DeckImportController { } final Deck result = new Deck(); - boolean isMain = true; + DeckSection deckSection = null; + String section = ""; for (final DeckRecognizer.Token t : tokens) { final DeckRecognizer.TokenType type = t.getType(); - if ((type == DeckRecognizer.TokenType.SectionName) && t.getText().toLowerCase().contains("side")) { - isMain = false; + if (type == DeckRecognizer.TokenType.SectionName) { + section = t.getText().toLowerCase(); + // can't use wildcards in switch/case, so if/else it is + if (section.startsWith("main")) { + deckSection = DeckSection.Main; + } + else if (section.startsWith("side")) { + deckSection = DeckSection.Sideboard; + } + else if (section.startsWith("commander")) { + deckSection = DeckSection.Commander; + } + else if (section.startsWith("avatar")) { + deckSection = DeckSection.Avatar; + } + else if (section.startsWith("planes")) { + deckSection = DeckSection.Planes; + } + else if (section.startsWith("scheme")) { + deckSection = DeckSection.Schemes; + } + else if (section.startsWith("conspiracy")) { + deckSection = DeckSection.Conspiracy; + } + else { + throw new NotImplementedException("Unexpected section: %s", t.getText()); + } } if (type != DeckRecognizer.TokenType.KnownCard) { continue; } final PaperCard crd = t.getCard(); - if (isMain) { - result.getMain().add(crd, t.getNumber()); - } - else { - result.getOrCreate(DeckSection.Sideboard).add(crd, t.getNumber()); - } + result.getOrCreate(deckSection).add(crd, t.getNumber()); } return result; } diff --git a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java index 6835b55fea3..83cf46e770b 100644 --- a/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java +++ b/forge-gui/src/main/java/forge/deck/io/DeckPreferences.java @@ -118,6 +118,7 @@ public class DeckPreferences { draftDeck = root.getAttribute("draftDeck"); sealedDeck = root.getAttribute("sealedDeck"); commanderDeck = root.getAttribute("commanderDeck"); + brawlDeck = root.getAttribute("brawlDeck"); tinyLeadersDeck = root.getAttribute("tinyLeadersDeck"); planarDeck = root.getAttribute("planarDeck"); schemeDeck = root.getAttribute("schemeDeck"); @@ -148,6 +149,7 @@ public class DeckPreferences { root.setAttribute("draftDeck", draftDeck); root.setAttribute("sealedDeck", sealedDeck); root.setAttribute("commanderDeck", commanderDeck); + root.setAttribute("brawlDeck", brawlDeck); root.setAttribute("tinyLeadersDeck", tinyLeadersDeck); root.setAttribute("planarDeck", planarDeck); root.setAttribute("schemeDeck", schemeDeck);