From 005a087b537bed6d8dc7bf56aa472e4b4c777176 Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Fri, 28 Sep 2012 05:56:12 +0000 Subject: [PATCH] Code cleanup - main, FControl, FView, FModel core. Should fix occasional "long wait before splash" bug. --- .../forge/card/cardfactory/CardReader.java | 14 +-- src/main/java/forge/control/FControl.java | 11 +- .../forge/gui/match/TargetingOverlay.java | 17 +-- src/main/java/forge/gui/toolbox/FSkin.java | 4 +- src/main/java/forge/model/FModel.java | 115 ++---------------- .../forge/properties/ForgePreferences.java | 96 +++++++++++++++ src/main/java/forge/view/FView.java | 22 +++- src/main/java/forge/view/Main.java | 28 +---- src/main/java/forge/view/SplashFrame.java | 105 ++++++++-------- 9 files changed, 196 insertions(+), 216 deletions(-) diff --git a/src/main/java/forge/card/cardfactory/CardReader.java b/src/main/java/forge/card/cardfactory/CardReader.java index cd27770a993..3cec1408871 100644 --- a/src/main/java/forge/card/cardfactory/CardReader.java +++ b/src/main/java/forge/card/cardfactory/CardReader.java @@ -35,7 +35,6 @@ import java.util.zip.ZipFile; import javax.swing.SwingUtilities; - import forge.Card; import forge.CardCharacteristicName; import forge.CardColor; @@ -50,7 +49,7 @@ import forge.card.trigger.TriggerHandler; import forge.error.ErrorViewer; import forge.gui.toolbox.FProgressBar; import forge.util.FileUtil; -import forge.view.SplashFrame; +import forge.view.FView; /** *

@@ -127,12 +126,6 @@ public class CardReader { * * @param theCardsFolder * indicates location of the cardsFolder - * - * @param theMapToFill - * maps card names to Card instances; this is where we place the - * cards once read - * @param listRules2Fill - * List * @param useZip * if true, attempts to load cards from a zip file, if one * exists. @@ -186,15 +179,12 @@ public class CardReader { * After that, we save our place in the list of cards (on disk) in case we * need to load more. * - * @param cardName - * the name to find; if null, load all cards. - * * @return the Card or null if it was not found. */ public final List loadCards() { List result = new ArrayList(); - final FProgressBar barProgress = SplashFrame.PROGRESS_BAR; + final FProgressBar barProgress = FView.SINGLETON_INSTANCE.getSplash().getProgressBar(); // Iterate through txt files or zip archive. // Report relevant numbers to progress monitor model. diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 113b5a03237..efadf608dc7 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -28,6 +28,7 @@ import java.util.List; import javax.swing.ImageIcon; import javax.swing.JLayeredPane; +import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import forge.AllZone; @@ -136,9 +137,6 @@ public enum FControl { } } }; - - FView.SINGLETON_INSTANCE.getLpnDocument().addMouseListener(SOverflowUtil.getHideOverflowListener()); - FView.SINGLETON_INSTANCE.getLpnDocument().addComponentListener(SResizingUtil.getWindowResizeListener()); } /** After view and model have been initialized, control can start. */ @@ -152,6 +150,7 @@ public enum FControl { // Does not use progress bar, due to be deprecated with battlefield refactoring. CardFaceSymbols.loadImages(); + this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts(); this.display = FView.SINGLETON_INSTANCE.getLpnDocument(); @@ -170,6 +169,12 @@ public enum FControl { sizeChildren(); } }); + + FView.SINGLETON_INSTANCE.getLpnDocument().addMouseListener(SOverflowUtil.getHideOverflowListener()); + FView.SINGLETON_INSTANCE.getLpnDocument().addComponentListener(SResizingUtil.getWindowResizeListener()); + + SwingUtilities.invokeLater(new Runnable() { @Override + public void run() { Singletons.getView().initialize(); } }); } /** diff --git a/src/main/java/forge/gui/match/TargetingOverlay.java b/src/main/java/forge/gui/match/TargetingOverlay.java index 2df29d7e77e..36f2f35cac6 100644 --- a/src/main/java/forge/gui/match/TargetingOverlay.java +++ b/src/main/java/forge/gui/match/TargetingOverlay.java @@ -37,7 +37,6 @@ import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.view.FView; import forge.view.arcane.CardPanel; -import forge.view.arcane.PlayArea; /** * Semi-transparent overlay panel. Should be used with layered panes. @@ -50,21 +49,13 @@ public enum TargetingOverlay { SINGLETON_INSTANCE; private final JPanel pnl = new OverlayPanel(); - private final List playAreas; - private List cardPanels; + private final List cardPanels = new ArrayList(); private final List arcs = new ArrayList(); /** * Semi-transparent overlay panel. Should be used with layered panes. */ private TargetingOverlay() { - playAreas = new ArrayList(); - cardPanels = new ArrayList(); - - for (CField f : CMatchUI.SINGLETON_INSTANCE.getFieldControls()) { - playAreas.add(f.getView().getTabletop()); - } - pnl.setOpaque(false); pnl.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); } @@ -80,8 +71,10 @@ public enum TargetingOverlay { private void assembleArcs() { arcs.clear(); cardPanels.clear(); - cardPanels.addAll(playAreas.get(0).getCardPanels()); - cardPanels.addAll(playAreas.get(1).getCardPanels()); + + for (CField f : CMatchUI.SINGLETON_INSTANCE.getFieldControls()) { + cardPanels.addAll(f.getView().getTabletop().getCardPanels()); + } final Point docOffsets = FView.SINGLETON_INSTANCE.getLpnDocument().getLocationOnScreen(); // Locations of arc endpoint, per card, with ID as primary key. diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index e350c86f08a..654c65718f6 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -38,7 +38,7 @@ import javax.swing.UIManager; import javax.swing.border.LineBorder; import forge.gui.GuiUtils; -import forge.view.SplashFrame; +import forge.view.FView; /** * Assembles settings from selected or default theme as appropriate. Saves in a @@ -483,7 +483,7 @@ public enum FSkin { if (FSkin.preferredName.isEmpty()) { FSkin.loadLight("default"); } // Everything OK? - final FProgressBar barProgress = SplashFrame.PROGRESS_BAR; + final FProgressBar barProgress = FView.SINGLETON_INSTANCE.getSplash().getProgressBar(); SwingUtilities.invokeLater(new Runnable() { @Override diff --git a/src/main/java/forge/model/FModel.java b/src/main/java/forge/model/FModel.java index 735925fc30f..28132cb5f04 100644 --- a/src/main/java/forge/model/FModel.java +++ b/src/main/java/forge/model/FModel.java @@ -36,14 +36,11 @@ import forge.card.FatPackData; import forge.card.FormatCollection; import forge.control.input.InputControl; import forge.deck.CardCollections; +import forge.error.ExceptionHandler; import forge.game.GameState; import forge.game.GameSummary; import forge.game.player.ComputerAIGeneral; import forge.game.player.ComputerAIInput; -import forge.gui.match.VMatchUI; -import forge.gui.match.nonsingleton.VField; -import forge.gui.match.views.VDev; -import forge.gui.toolbox.FSkin; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.properties.ForgeProps; @@ -93,7 +90,6 @@ public enum FModel { // CardDb is not ready yet. private CardCollections decks; - /** * Constructor. * @@ -101,7 +97,9 @@ public enum FModel { * if we could not find or write to the log file. */ private FModel() { - // Fire up log file + // Fire up log file and exception handling + ExceptionHandler.registerErrorHandling(); + final File logFile = new File("forge.log"); final boolean deleteSucceeded = logFile.delete(); @@ -140,21 +138,8 @@ public enum FModel { this.blocks = new StorageView(new CardBlock.Reader("res/blockdata/blocks.txt", editions)); this.fantasyBlocks = new StorageView(new CardBlock.Reader("res/blockdata/fantasyblocks.txt", editions)); - // TODO this single setting from preferences should not be here, or, - // it should be here with all the other settings at the same time. - // Unfortunately, they're tied up in legacy code in the Display - // interface, - // currently in GuiTopLevel. When that code is updated, this TODO should - // be resolved. - // Doublestrike 24-01-12 - // == - // It's looking like all the settings at the same time, here only. - // Doublestrike 06-02-12 + // TODO - there's got to be a better place for this...oblivion? Constant.Runtime.DEV_MODE[0] = this.preferences.getPrefBoolean(FPref.DEV_MODE_ENABLED); - Constant.Runtime.setSkinName(this.preferences.getPref(FPref.UI_SKIN)); - - // Load splash image and preloader swatches for skin - FSkin.loadLight(Constant.Runtime.getSkinName()); // Instantiate AI AllZone.setInputControl(new InputControl(FModel.this)); @@ -380,103 +365,23 @@ public enum FModel { } /** - * TODO: Needs to be reworked for efficiency with rest of prefs saves in - * codebase. - * + * TODO: Remove this method completely. * @return true, if successful */ public final boolean savePrefs() { - final ForgePreferences fp = this.preferences; - final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); - - // AI field is at index [0] - fp.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fieldViews.get(0).getLblUpkeep().getEnabled())); - fp.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fieldViews.get(0).getLblDraw().getEnabled())); - fp.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fieldViews.get(0).getLblMain1().getEnabled())); - fp.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fieldViews.get(0).getLblBeginCombat().getEnabled())); - fp.setPref(FPref.PHASE_AI_DECLAREATTACKERS, - String.valueOf(fieldViews.get(0).getLblDeclareAttackers().getEnabled())); - fp.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, - String.valueOf(fieldViews.get(0).getLblDeclareBlockers().getEnabled())); - fp.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fieldViews.get(0).getLblFirstStrike().getEnabled())); - fp.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fieldViews.get(0).getLblCombatDamage().getEnabled())); - fp.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fieldViews.get(0).getLblEndCombat().getEnabled())); - fp.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fieldViews.get(0).getLblMain2().getEnabled())); - fp.setPref(FPref.PHASE_AI_EOT, String.valueOf(fieldViews.get(0).getLblEndTurn().getEnabled())); - fp.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fieldViews.get(0).getLblCleanup().getEnabled())); - - // Human field is at index [1] - fp.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fieldViews.get(1).getLblUpkeep().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fieldViews.get(1).getLblDraw().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fieldViews.get(1).getLblMain1().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fieldViews.get(1).getLblBeginCombat().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, - String.valueOf(fieldViews.get(1).getLblDeclareAttackers().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, - String.valueOf(fieldViews.get(1).getLblDeclareBlockers().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fieldViews.get(1).getLblFirstStrike().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fieldViews.get(1).getLblCombatDamage().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fieldViews.get(1).getLblEndCombat().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fieldViews.get(1).getLblMain2().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_EOT, String.valueOf(fieldViews.get(1).getLblEndTurn().getEnabled())); - fp.setPref(FPref.PHASE_HUMAN_CLEANUP, String.valueOf(fieldViews.get(1).getLblCleanup().getEnabled())); - - final VDev v = VDev.SINGLETON_INSTANCE; - Constant.Runtime.MILL[0] = v.getLblMilling().getEnabled(); - - fp.setPref(FPref.DEV_MILLING_LOSS, String.valueOf(Constant.Runtime.MILL[0])); - fp.setPref(FPref.DEV_UNLIMITED_LAND, String.valueOf(v.getLblUnlimitedLands().getEnabled())); - - fp.save(); + this.preferences.writeMatchPreferences(); + this.preferences.save(); return true; } /** - * TODO: Needs to be reworked for efficiency with rest of prefs loads in - * codebase. + * TODO: Remove this method completely. * * @return true, if successful */ public final boolean loadPrefs() { final ForgePreferences fp = Singletons.getModel().getPreferences(); - final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); - - Constant.Runtime.MILL[0] = fp.getPrefBoolean(FPref.DEV_MILLING_LOSS); - Constant.Runtime.DEV_MODE[0] = fp.getPrefBoolean(FPref.DEV_MODE_ENABLED); - Constant.Runtime.UPLOAD_DRAFT[0] = fp.getPrefBoolean(FPref.UI_UPLOAD_DRAFT); - Constant.Runtime.RANDOM_FOIL[0] = fp.getPrefBoolean(FPref.UI_RANDOM_FOIL); - Constant.Runtime.UPLOAD_DRAFT[0] = (Constant.Runtime.NET_CONN[0] ? fp.getPrefBoolean(FPref.UI_UPLOAD_DRAFT) - : false); - - // AI field is at index [0] - fieldViews.get(0).getLblUpkeep().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); - fieldViews.get(0).getLblDraw().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_DRAW)); - fieldViews.get(0).getLblMain1().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_MAIN1)); - fieldViews.get(0).getLblBeginCombat().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); - fieldViews.get(0).getLblDeclareAttackers().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); - fieldViews.get(0).getLblDeclareBlockers().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); - fieldViews.get(0).getLblFirstStrike().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); - fieldViews.get(0).getLblCombatDamage().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); - fieldViews.get(0).getLblEndCombat().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); - fieldViews.get(0).getLblMain2().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_MAIN2)); - fieldViews.get(0).getLblEndTurn().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_EOT)); - fieldViews.get(0).getLblCleanup().setEnabled(fp.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); - - // Human field is at index [1] - fieldViews.get(1).getLblUpkeep().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); - fieldViews.get(1).getLblDraw().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); - fieldViews.get(1).getLblMain1().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); - fieldViews.get(1).getLblBeginCombat().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); - fieldViews.get(1).getLblDeclareAttackers().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); - fieldViews.get(1).getLblDeclareBlockers().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); - fieldViews.get(1).getLblFirstStrike().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); - fieldViews.get(1).getLblCombatDamage().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); - fieldViews.get(1).getLblEndCombat().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); - fieldViews.get(1).getLblMain2().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); - fieldViews.get(1).getLblEndTurn().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); - fieldViews.get(1).getLblCleanup().setEnabled(fp.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); - - //Singletons.getView().getViewMatch().setLayoutParams(fp.getPref(FPref.UI_LAYOUT_PARAMS)); + fp.actuateMatchPreferences(); return true; } diff --git a/src/main/java/forge/properties/ForgePreferences.java b/src/main/java/forge/properties/ForgePreferences.java index 03a868d8400..a6243da04a7 100644 --- a/src/main/java/forge/properties/ForgePreferences.java +++ b/src/main/java/forge/properties/ForgePreferences.java @@ -29,9 +29,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; +import java.util.List; import java.util.Map; +import forge.Constant; import forge.gui.home.EMenuItem; +import forge.gui.match.VMatchUI; +import forge.gui.match.nonsingleton.VField; +import forge.gui.match.views.VDev; /** * Holds default preference values in an enum. @@ -192,6 +197,97 @@ public class ForgePreferences { } } + /** + * TODO: Needs to be reworked for efficiency with rest of prefs saves in + * codebase. + */ + public void writeMatchPreferences() { + final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); + + // AI field is at index [0] + this.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fieldViews.get(0).getLblUpkeep().getEnabled())); + this.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fieldViews.get(0).getLblDraw().getEnabled())); + this.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fieldViews.get(0).getLblMain1().getEnabled())); + this.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fieldViews.get(0).getLblBeginCombat().getEnabled())); + this.setPref(FPref.PHASE_AI_DECLAREATTACKERS, + String.valueOf(fieldViews.get(0).getLblDeclareAttackers().getEnabled())); + this.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, + String.valueOf(fieldViews.get(0).getLblDeclareBlockers().getEnabled())); + this.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fieldViews.get(0).getLblFirstStrike().getEnabled())); + this.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fieldViews.get(0).getLblCombatDamage().getEnabled())); + this.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fieldViews.get(0).getLblEndCombat().getEnabled())); + this.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fieldViews.get(0).getLblMain2().getEnabled())); + this.setPref(FPref.PHASE_AI_EOT, String.valueOf(fieldViews.get(0).getLblEndTurn().getEnabled())); + this.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fieldViews.get(0).getLblCleanup().getEnabled())); + + // Human field is at index [1] + this.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fieldViews.get(1).getLblUpkeep().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fieldViews.get(1).getLblDraw().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fieldViews.get(1).getLblMain1().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fieldViews.get(1).getLblBeginCombat().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, + String.valueOf(fieldViews.get(1).getLblDeclareAttackers().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, + String.valueOf(fieldViews.get(1).getLblDeclareBlockers().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fieldViews.get(1).getLblFirstStrike().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fieldViews.get(1).getLblCombatDamage().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fieldViews.get(1).getLblEndCombat().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fieldViews.get(1).getLblMain2().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_EOT, String.valueOf(fieldViews.get(1).getLblEndTurn().getEnabled())); + this.setPref(FPref.PHASE_HUMAN_CLEANUP, String.valueOf(fieldViews.get(1).getLblCleanup().getEnabled())); + + final VDev v = VDev.SINGLETON_INSTANCE; + Constant.Runtime.MILL[0] = v.getLblMilling().getEnabled(); + + this.setPref(FPref.DEV_MILLING_LOSS, String.valueOf(Constant.Runtime.MILL[0])); + this.setPref(FPref.DEV_UNLIMITED_LAND, String.valueOf(v.getLblUnlimitedLands().getEnabled())); + } + + /** + * TODO: Needs to be reworked for efficiency with rest of prefs saves in + * codebase. + */ + public void actuateMatchPreferences() { + final List fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews(); + + Constant.Runtime.MILL[0] = this.getPrefBoolean(FPref.DEV_MILLING_LOSS); + Constant.Runtime.DEV_MODE[0] = this.getPrefBoolean(FPref.DEV_MODE_ENABLED); + Constant.Runtime.UPLOAD_DRAFT[0] = this.getPrefBoolean(FPref.UI_UPLOAD_DRAFT); + Constant.Runtime.RANDOM_FOIL[0] = this.getPrefBoolean(FPref.UI_RANDOM_FOIL); + Constant.Runtime.UPLOAD_DRAFT[0] = (Constant.Runtime.NET_CONN[0] ? this.getPrefBoolean(FPref.UI_UPLOAD_DRAFT) + : false); + + // AI field is at index [0] + fieldViews.get(0).getLblUpkeep().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_UPKEEP)); + fieldViews.get(0).getLblDraw().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_DRAW)); + fieldViews.get(0).getLblMain1().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_MAIN1)); + fieldViews.get(0).getLblBeginCombat().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT)); + fieldViews.get(0).getLblDeclareAttackers().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS)); + fieldViews.get(0).getLblDeclareBlockers().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS)); + fieldViews.get(0).getLblFirstStrike().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE)); + fieldViews.get(0).getLblCombatDamage().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE)); + fieldViews.get(0).getLblEndCombat().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT)); + fieldViews.get(0).getLblMain2().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_MAIN2)); + fieldViews.get(0).getLblEndTurn().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_EOT)); + fieldViews.get(0).getLblCleanup().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_CLEANUP)); + + // Human field is at index [1] + fieldViews.get(1).getLblUpkeep().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP)); + fieldViews.get(1).getLblDraw().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_DRAW)); + fieldViews.get(1).getLblMain1().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1)); + fieldViews.get(1).getLblBeginCombat().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT)); + fieldViews.get(1).getLblDeclareAttackers().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS)); + fieldViews.get(1).getLblDeclareBlockers().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS)); + fieldViews.get(1).getLblFirstStrike().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE)); + fieldViews.get(1).getLblCombatDamage().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE)); + fieldViews.get(1).getLblEndCombat().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT)); + fieldViews.get(1).getLblMain2().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2)); + fieldViews.get(1).getLblEndTurn().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); + fieldViews.get(1).getLblCleanup().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); + + //Singletons.getView().getViewMatch().setLayoutParams(this.getPref(FPref.UI_LAYOUT_PARAMS)); + } + /** Saves prefs map to file. */ public void save() { BufferedWriter writer = null; diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index 987e4c2c1ed..92a0e24f7fb 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -15,6 +15,7 @@ import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import net.miginfocom.swing.MigLayout; + import forge.AllZone; import forge.Singletons; import forge.control.FControl; @@ -38,7 +39,7 @@ public enum FView { /** */ public static final Integer TARGETING_LAYER = JLayeredPane.MODAL_LAYER - 1; private final List allCells = new ArrayList(); - private SplashFrame splash; + private SplashFrame frmSplash; // Non-singleton instances (deprecated, but not updated yet) private ViewBazaarUI bazaar = null; @@ -51,14 +52,18 @@ public enum FView { private final JPanel pnlContent = new JPanel(); // An insets panel neatly maintains a space from the edges of the window and // whatever layout is happening, without having to explicitly define a margin each time. - private final FPanel pnlInsets = new FPanel(new BorderLayout()); + private FPanel pnlInsets; // Preview panel is what is shown when a drag cell is being moved around private final JPanel pnlPreview = new PreviewPanel(); // Tab overflow is for the +X display for extra tabs. private final JPanel pnlTabOverflow = new JPanel(new MigLayout("insets 0, gap 0, wrap")); private FView() { - splash = new SplashFrame(); + frmSplash = new SplashFrame(); + + // Insets panel has background image / texture, which + // must be instantiated after the skin is loaded. + pnlInsets = new FPanel(new BorderLayout()); } /** */ @@ -78,7 +83,7 @@ public enum FView { lpnDocument.add(pnlTabOverflow, (Integer) 3); lpnDocument.add(FOverlay.SINGLETON_INSTANCE.getPanel(), JLayeredPane.MODAL_LAYER); // Note: when adding new panels here, keep in mind that the layered pane - // has a null layout, so new components will be (0,0) - gotcha! + // has a null layout, so new components will be W0 x H0 pixels - gotcha! // FControl has a method called "sizeComponents" which will fix this. lpnDocument.add(TargetingOverlay.SINGLETON_INSTANCE.getPanel(), TARGETING_LAYER); @@ -106,12 +111,17 @@ public enum FView { Singletons.getControl().changeState(FControl.HOME_SCREEN); CMainMenu.SINGLETON_INSTANCE.selectPrevious(); - FView.this.splash.dispose(); - FView.this.splash = null; + FView.this.frmSplash.dispose(); + FView.this.frmSplash = null; frmDocument.setVisible(true); } + /** @return {@link forge.view.SplashFrame} */ + public SplashFrame getSplash() { + return frmSplash; + } + /** @return {@link javax.swing.JFrame} */ public JFrame getFrame() { return frmDocument; diff --git a/src/main/java/forge/view/Main.java b/src/main/java/forge/view/Main.java index 860f73be532..afc01838272 100644 --- a/src/main/java/forge/view/Main.java +++ b/src/main/java/forge/view/Main.java @@ -17,11 +17,8 @@ */ package forge.view; -import javax.swing.SwingUtilities; - import forge.Singletons; import forge.control.FControl; -import forge.error.ExceptionHandler; import forge.model.FModel; /** @@ -33,7 +30,7 @@ public final class Main { * Do not instantiate. */ private Main() { - // intentionally blank + // Intentionally blank. } /** @@ -43,31 +40,16 @@ public final class Main { * an array of {@link java.lang.String} objects. */ public static void main(final String[] args) { - //Possible solution to "Comparison method violates it's general contract!" crash + // HACK - temporary solution to "Comparison method violates it's general contract!" crash System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); - ExceptionHandler.registerErrorHandling(); - + // Start splash screen first, then data models, then controller. + Singletons.setView(FView.SINGLETON_INSTANCE); Singletons.setModel(FModel.SINGLETON_INSTANCE); - - try { - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - Singletons.setView(FView.SINGLETON_INSTANCE); - } - }); - } catch (Exception e) { - e.printStackTrace(); - } - Singletons.setControl(FControl.SINGLETON_INSTANCE); - // Use splash frame to initialize everything, then transition to core UI. + // Controller can now step in and take over. Singletons.getControl().initialize(); - - SwingUtilities.invokeLater(new Runnable() { @Override - public void run() { Singletons.getView().initialize(); } }); } /** @throws Throwable */ diff --git a/src/main/java/forge/view/SplashFrame.java b/src/main/java/forge/view/SplashFrame.java index 7be6fa640d4..3ab1f219f42 100644 --- a/src/main/java/forge/view/SplashFrame.java +++ b/src/main/java/forge/view/SplashFrame.java @@ -38,26 +38,36 @@ import javax.swing.UIManager; import forge.gui.toolbox.FProgressBar; import forge.gui.toolbox.FSkin; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; /** * Shows the splash frame as the application starts. */ @SuppressWarnings("serial") public class SplashFrame extends JFrame { - private static final int BAR_PADDING_X = 20; - private static final int BAR_PADDING_Y = 20; - private static final int BAR_HEIGHT = 57; + private FProgressBar barProgress; - private static final int DISCLAIMER_HEIGHT = 20; - private static final int DISCLAIMER_TOP = 300; - private static final int DISCLAIMER_FONT_SIZE = 9; + private final MouseAdapter madClose = new MouseAdapter() { + @Override + public void mouseEntered(final java.awt.event.MouseEvent evt) { + ((JButton) evt.getSource()).setBorder(BorderFactory.createLineBorder(Color.white)); + ((JButton) evt.getSource()).setForeground(Color.white); + } - private static final int CLOSEBTN_PADDING_Y = 15; - private static final int CLOSEBTN_SIDELENGTH = 15; - private static final Color CLOSEBTN_COLOR = new Color(215, 208, 188); + @Override + public void mouseExited(final java.awt.event.MouseEvent evt) { + ((JButton) evt.getSource()).setBorder(BorderFactory.createLineBorder(new Color(215, 208, 188))); + ((JButton) evt.getSource()).setForeground(new Color(215, 208, 188)); + } + }; - /** Preload bar, static accessible. */ - public static final FProgressBar PROGRESS_BAR = new FProgressBar(); + private final Action actClose = new AbstractAction() { + @Override + public void actionPerformed(final ActionEvent e) { + System.exit(0); + } + }; /** * Create the frame; this must be called from an event @@ -66,18 +76,27 @@ public class SplashFrame extends JFrame { */ public SplashFrame() { super(); + final ForgePreferences prefs = new ForgePreferences(); + FSkin.loadLight(prefs.getPref(FPref.UI_SKIN)); - if (!SwingUtilities.isEventDispatchThread()) { - throw new IllegalStateException( - "SplashFrame() must be called from an event dispatch thread."); + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + SplashFrame.this.init(); + } + }); } + catch (Exception e) { + } + } + private void init() { final ImageIcon bgIcon = FSkin.getIcon(FSkin.Backgrounds.BG_SPLASH); - final int splashWidthPx = bgIcon.getIconWidth(); - final int splashHeightPx = bgIcon.getIconHeight(); + barProgress = new FProgressBar(); this.setUndecorated(true); - this.setMinimumSize(new Dimension(splashWidthPx, splashHeightPx)); + this.setMinimumSize(new Dimension(450, 450)); this.setLocationRelativeTo(null); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -88,67 +107,47 @@ public class SplashFrame extends JFrame { this.setContentPane(pnlContent); pnlContent.setLayout(null); - // Add disclaimer + // Disclaimer final JLabel lblDisclaimer = new JLabel("

" + "Forge is not affiliated in any way with Wizards of the Coast." + "
Forge is open source software, released under " + "the GNU Public License.
"); - lblDisclaimer.setBounds(0, SplashFrame.DISCLAIMER_TOP, splashWidthPx, SplashFrame.DISCLAIMER_HEIGHT); - - lblDisclaimer.setFont(new Font("Tahoma", Font.PLAIN, SplashFrame.DISCLAIMER_FONT_SIZE)); + lblDisclaimer.setBounds(0, 300, 450, 20); + lblDisclaimer.setFont(new Font("Tahoma", Font.PLAIN, 9)); lblDisclaimer.setHorizontalAlignment(SwingConstants.CENTER); lblDisclaimer.setForeground(UIManager.getColor("ProgressBar.selectionForeground")); pnlContent.add(lblDisclaimer); - // Add close button + // Close button final JButton btnClose = new JButton("X"); - btnClose.setBounds(splashWidthPx - (2 * SplashFrame.CLOSEBTN_PADDING_Y), SplashFrame.CLOSEBTN_PADDING_Y, - SplashFrame.CLOSEBTN_SIDELENGTH, SplashFrame.CLOSEBTN_SIDELENGTH); - btnClose.setForeground(SplashFrame.CLOSEBTN_COLOR); - btnClose.setBorder(BorderFactory.createLineBorder(SplashFrame.CLOSEBTN_COLOR)); + btnClose.setBounds(420, 15, 15, 15); + btnClose.setForeground(new Color(215, 208, 188)); + btnClose.setBorder(BorderFactory.createLineBorder(new Color(215, 208, 188))); btnClose.setOpaque(false); btnClose.setBackground(new Color(0, 0, 0)); btnClose.setFocusPainted(false); pnlContent.add(btnClose); - // Actions and listeners for close button (also mapped to ESC) - final MouseAdapter madClose = new MouseAdapter() { - @Override - public void mouseEntered(final java.awt.event.MouseEvent evt) { - btnClose.setBorder(BorderFactory.createLineBorder(Color.white)); - btnClose.setForeground(Color.white); - } - - @Override - public void mouseExited(final java.awt.event.MouseEvent evt) { - btnClose.setBorder(BorderFactory.createLineBorder(SplashFrame.CLOSEBTN_COLOR)); - btnClose.setForeground(SplashFrame.CLOSEBTN_COLOR); - } - }; - - final Action actClose = new AbstractAction() { - @Override - public void actionPerformed(final ActionEvent e) { - System.exit(0); - } - }; - btnClose.addMouseListener(madClose); btnClose.addActionListener(actClose); pnlContent.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), "escAction"); pnlContent.getActionMap().put("escAction", actClose); - PROGRESS_BAR.setString("Welcome to Forge."); - PROGRESS_BAR.setBounds(SplashFrame.BAR_PADDING_X, splashHeightPx - SplashFrame.BAR_PADDING_Y - - SplashFrame.BAR_HEIGHT, splashWidthPx - (2 * SplashFrame.BAR_PADDING_X), SplashFrame.BAR_HEIGHT); - pnlContent.add(PROGRESS_BAR); + barProgress.setString("Welcome to Forge."); + barProgress.setBounds(20, 373, 410, 57); + pnlContent.add(barProgress); final JLabel bgLabel = new JLabel(bgIcon); - bgLabel.setBounds(0, 0, splashWidthPx, splashHeightPx); + bgLabel.setBounds(0, 0, 450, 450); pnlContent.add(bgLabel); this.pack(); this.setVisible(true); } + + /** @return {@link forge.gui.toolbox.FProgressBar} */ + public FProgressBar getProgressBar() { + return this.barProgress; + } }