From ad3a6055fbd31adac6a19237ccfb303c60bbc7da Mon Sep 17 00:00:00 2001 From: Doublestrike Date: Sun, 28 Aug 2011 12:17:31 +0000 Subject: [PATCH] Separated model/view for splash frame preloader using Braids' progress monitor heirarchy. Possibly deprecated: forge/gui/MultiPhaseProgressMonitorWithETA Possibly deprecated: forge/gui_progressbarwindow --- .gitattributes | 2 + src/main/java/forge/CardReader.java | 23 ++-- src/main/java/forge/view/FView.java | 5 +- .../forge/view/swing/ApplicationView.java | 18 +-- .../java/forge/view/swing/SplashFrame.java | 51 ++++---- .../progress_monitor/BaseProgressMonitor.java | 12 +- .../SplashModelProgressMonitor.java | 36 ++++++ .../SplashViewProgressMonitor.java | 109 ++++++++++++++++++ 8 files changed, 211 insertions(+), 45 deletions(-) create mode 100644 src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashModelProgressMonitor.java create mode 100644 src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashViewProgressMonitor.java diff --git a/.gitattributes b/.gitattributes index 8cb812e296f..e7289f8acc8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9862,6 +9862,8 @@ src/main/java/net/slightlymagic/braids/util/lambda/package-info.java svneol=nati src/main/java/net/slightlymagic/braids/util/package-info.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/progress_monitor/BaseProgressMonitor.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/progress_monitor/BraidsProgressMonitor.java svneol=native#text/plain +src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashModelProgressMonitor.java -text +src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashViewProgressMonitor.java -text src/main/java/net/slightlymagic/braids/util/progress_monitor/StderrProgressMonitor.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/progress_monitor/package-info.java svneol=native#text/plain src/main/java/net/slightlymagic/maxmtg/Predicate.java -text diff --git a/src/main/java/forge/CardReader.java b/src/main/java/forge/CardReader.java index 0f2ee0190c8..5b654cf5992 100644 --- a/src/main/java/forge/CardReader.java +++ b/src/main/java/forge/CardReader.java @@ -19,7 +19,8 @@ import java.util.zip.ZipFile; import net.slightlymagic.braids.util.UtilFunctions; import net.slightlymagic.braids.util.generator.FindNonDirectoriesSkipDotDirectoriesGenerator; import net.slightlymagic.braids.util.generator.GeneratorFunctions; -import forge.view.util.ProgressBar_Base; +import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor; +import net.slightlymagic.braids.util.progress_monitor.StderrProgressMonitor; import com.google.code.jyield.Generator; import com.google.code.jyield.YieldUtils; @@ -167,7 +168,7 @@ public class CardReader /** * Reads the rest of ALL the cards into memory. This is not lazy. */ - public final void run() { + public final void run() { loadCardsUntilYouFind(null); } @@ -184,16 +185,20 @@ public class CardReader protected final Card loadCardsUntilYouFind(final String cardName) { Card result = null; - ProgressBar_Base monitor = null; + // Try to retrieve card loading progress monitor model. + // If no progress monitor present, output results to console. + BaseProgressMonitor monitor = null; final FView view = Singletons.getView(); if (view != null) { monitor = view.getCardLoadingProgressMonitor(); } + + if (monitor == null) { + monitor = new StderrProgressMonitor(1, 0L); + } - //if (monitor == null) { - // monitor = new StderrProgressMonitor(1, 0L); - // } - + // Iterate through txt files or zip archive. + // Report relevant numbers to progress monitor model. if (zip == null) { if (estimatedFilesRemaining == UNKNOWN_NUMBER_OF_FILES_REMAINING) { final Generator findNonDirsGen = new FindNonDirectoriesSkipDotDirectoriesGenerator(cardsfolder); @@ -241,10 +246,6 @@ public class CardReader } //endif - if (monitor != null) { - monitor.dispose(); - } - return result; } //loadCardsUntilYouFind(String) diff --git a/src/main/java/forge/view/FView.java b/src/main/java/forge/view/FView.java index be1a4a40c50..cfa6ea32106 100644 --- a/src/main/java/forge/view/FView.java +++ b/src/main/java/forge/view/FView.java @@ -1,6 +1,6 @@ package forge.view; -import forge.view.util.ProgressBar_Base; +import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor; import forge.model.FModel; /** @@ -21,6 +21,5 @@ public interface FView { * * @return a progress monitor having only one phase; may be null */ - ProgressBar_Base getCardLoadingProgressMonitor(); - + BaseProgressMonitor getCardLoadingProgressMonitor(); } diff --git a/src/main/java/forge/view/swing/ApplicationView.java b/src/main/java/forge/view/swing/ApplicationView.java index c51d6ab9f02..ddc4d0fb89b 100644 --- a/src/main/java/forge/view/swing/ApplicationView.java +++ b/src/main/java/forge/view/swing/ApplicationView.java @@ -1,10 +1,11 @@ package forge.view.swing; +import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.UIManager; import net.slightlymagic.braids.util.UtilFunctions; -import forge.view.util.ProgressBar_Base; +import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor; import com.esotericsoftware.minlog.Log; @@ -23,6 +24,7 @@ import forge.view.swing.OldGuiNewGame.CardStackOffsetAction; /** * The main view for Forge: a java swing application. + * All view class instances should be accessible from here. */ public class ApplicationView implements FView { @@ -48,28 +50,30 @@ public class ApplicationView implements FView { splashFrame.setVisible(true); } }); + } /* (non-Javadoc) * @see forge.view.FView#getCardLoadingProgressMonitor() */ - @Override - public final ProgressBar_Base getCardLoadingProgressMonitor() { - ProgressBar_Base result; + @Override + public final BaseProgressMonitor getCardLoadingProgressMonitor() { + BaseProgressMonitor result; if (splashFrame == null) { result = null; } else { - result = splashFrame.getBar(); + result = splashFrame.getMonitorModel(); } - return result; + return result; } /* (non-Javadoc) * @see forge.view.FView#setModel(forge.model.FModel) */ + @Override public final void setModel(final FModel model) { try { @@ -121,8 +125,6 @@ public class ApplicationView implements FView { public void run() { AllZone.setComputer(new ComputerAI_Input(new ComputerAI_General())); - getCardLoadingProgressMonitor().dispose(); - // Enable only one of the following two lines. The second // is useful for debugging. diff --git a/src/main/java/forge/view/swing/SplashFrame.java b/src/main/java/forge/view/swing/SplashFrame.java index e071f81daf9..2ba3db3e804 100644 --- a/src/main/java/forge/view/swing/SplashFrame.java +++ b/src/main/java/forge/view/swing/SplashFrame.java @@ -11,8 +11,9 @@ import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; -import forge.view.util.ProgressBar_Embedded; - +import net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor; +import net.slightlymagic.braids.util.progress_monitor.SplashModelProgressMonitor; +import net.slightlymagic.braids.util.progress_monitor.SplashViewProgressMonitor; /** * Shows the splash frame as the application starts. @@ -33,7 +34,8 @@ public class SplashFrame extends JFrame { private static final int DISCLAIMER_FONT_SIZE = 9; private static final Color DISCLAIMER_COLOR = Color.white; - private ProgressBar_Embedded bar; + private SplashModelProgressMonitor monitorModel = null; + private SplashViewProgressMonitor monitorView = null; /** *

Create the frame; this must be called from an event @@ -67,7 +69,7 @@ public class SplashFrame extends JFrame { setContentPane(contentPane); contentPane.setLayout(null); - // Add disclaimer and progress bar. + // Add 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(PADDING_X, DISCLAIMER_TOP_PX, @@ -78,15 +80,19 @@ public class SplashFrame extends JFrame { lblDisclaimer.setForeground(DISCLAIMER_COLOR); contentPane.add(lblDisclaimer); - bar = new ProgressBar_Embedded(1, 1); - bar.setBounds(PADDING_X, splashHeightPx - PADDING_Y - BAR_HEIGHT_PX, + // Instantiate model and view and tie together. + monitorModel = new SplashModelProgressMonitor(1); + monitorView = new SplashViewProgressMonitor(); + + monitorModel.setCurrentView(monitorView); + monitorView.setCurrentModel(monitorModel); + + // Add prog bar + message, bg image + monitorView.displayUpdate("Assembling file list..."); + monitorView.setBounds(PADDING_X, splashHeightPx - PADDING_Y - BAR_HEIGHT_PX, splashWidthPx - (2 * PADDING_X), BAR_HEIGHT_PX); - - contentPane.add(bar); + contentPane.add(monitorView); - bar.displayUpdate("Assembling file list..."); - - // Add background image and close button contentPane.setOpaque(false); final JLabel bgLabel = new JLabel(bgIcon); @@ -100,18 +106,19 @@ public class SplashFrame extends JFrame { } /** - * Getter for progress bar. - * @return the ProgressBar_Embedded object used in the splash frame. + * Getter for progress bar view. + * @return the SplashViewProgressMonitor progress bar used in the splash frame. */ - public final ProgressBar_Embedded getBar() { - return bar; + public final SplashViewProgressMonitor getMonitorView() { + return monitorView; + } + + /** + * Getter for progress monitor model. + * @return the BaseProgressMonitor model used in the splash frame. + */ + public final BaseProgressMonitor getMonitorModel() { + return monitorModel; } - /** - * Setter for progress bar. - * @param neoBar the ProgressBar_Embedded used in the splash frame. - */ - protected final void setBar(final ProgressBar_Embedded neoBar) { - this.bar = neoBar; - } } diff --git a/src/main/java/net/slightlymagic/braids/util/progress_monitor/BaseProgressMonitor.java b/src/main/java/net/slightlymagic/braids/util/progress_monitor/BaseProgressMonitor.java index b625dc1858a..9fd913639a4 100644 --- a/src/main/java/net/slightlymagic/braids/util/progress_monitor/BaseProgressMonitor.java +++ b/src/main/java/net/slightlymagic/braids/util/progress_monitor/BaseProgressMonitor.java @@ -29,7 +29,16 @@ public class BaseProgressMonitor implements BraidsProgressMonitor { public final int SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE; public final int SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR; - + /** + * Convenience for + * BaseProgressMonitor(numPhases, 1, 2.0f, null). + * + * @see #BaseProgressMonitor(int,long,float,float[]) + */ + public BaseProgressMonitor(int numPhases) { + this(numPhases, 1L, 2.0f, null); + } + /** * Convenience for * BaseProgressMonitor(numPhases, totalUnitsFirstPhase, 2.0f, null). @@ -285,6 +294,7 @@ public class BaseProgressMonitor implements BraidsProgressMonitor { public void incrementUnitsCompletedThisPhase(long numUnits) { this.unitsCompletedSoFarThisPhase += numUnits; } + /** * Subclasses must call this immediately after updating the UI, to diff --git a/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashModelProgressMonitor.java b/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashModelProgressMonitor.java new file mode 100644 index 00000000000..df3d4c7cbd1 --- /dev/null +++ b/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashModelProgressMonitor.java @@ -0,0 +1,36 @@ +package net.slightlymagic.braids.util.progress_monitor; + +/** + * TODO: Write javadoc for this type. + * + */ +public class SplashModelProgressMonitor extends BaseProgressMonitor { + + private SplashViewProgressMonitor currentView = null; + + /** + * TODO: Write javadoc for Constructor. + * @param numPhases + */ + public SplashModelProgressMonitor(int numPhases) { + super(numPhases); + } + + @Override + /** + * @see net.slightlymagic.braids.util.progress_monitor.BaseProgressMonitor#incrementUnitsCompletedThisPhase(long) + */ + public void incrementUnitsCompletedThisPhase(long numUnits) { + super.incrementUnitsCompletedThisPhase(numUnits); + getCurrentView().incrementProgressBar(); + } + + public void setCurrentView(SplashViewProgressMonitor neoView) { + currentView = neoView; + } + + public SplashViewProgressMonitor getCurrentView() { + return currentView; + } + +} diff --git a/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashViewProgressMonitor.java b/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashViewProgressMonitor.java new file mode 100644 index 00000000000..4f0e6efee4d --- /dev/null +++ b/src/main/java/net/slightlymagic/braids/util/progress_monitor/SplashViewProgressMonitor.java @@ -0,0 +1,109 @@ +package net.slightlymagic.braids.util.progress_monitor; + +import javax.swing.JProgressBar; +import javax.swing.SwingUtilities; + +/** + * Swing component view, to be used with BaseProgressMonitor. + * + */ +@SuppressWarnings("serial") +public class SplashViewProgressMonitor extends JProgressBar { + private BaseProgressMonitor currentModel; + private double completed; + private double total; + + public SplashViewProgressMonitor() { + super(); + setString(""); + setStringPainted(true); + } + + public final void incrementProgressBar() { + // Update bar "stripe" + SwingUtilities.invokeLater(new Runnable() { + public void run() { + stripeUpdate(); + } + }); + + // Update bar message + // Note: shouldUpdateUI() severely retards motion + // of the preloader, so is temporarily disabled. + //if (getCurrentModel().shouldUpdateUI()) { + if ((getCurrentModel().getNumPhases() > 1)) { + displayUpdate( + "Phase " + getCurrentModel().getCurrentPhase() + ". " + //+ getUnitsCompletedSoFarThisPhase() + " units processed. " + //+ "Overall: " + getTotalPercentCompleteAsString() + "% complete, " + + "Overall ETA in " + getCurrentModel().getRelativeETAAsString() + "." + ); + } + else { + displayUpdate( + //"Overall: " + + getCurrentModel().getUnitsCompletedSoFarThisPhase() + " units processed; " + //+ "(" + getTotalPercentCompleteAsString() + "%); " + + "ETA in " + getCurrentModel().getRelativeETAAsString() + "." + ); + } + // getCurrentModel().justUpdatedUI(); + //} + + + if (getCurrentModel().getCurrentPhase() == getCurrentModel().getNumPhases() + && getCurrentModel().getUnitsCompletedSoFarThisPhase() >= getCurrentModel().getTotalUnitsThisPhase()) + { + displayUpdate("Done! Firing up the GUI..."); + } + } + + /** + * Shows the message inside the progress dialog; does not always work on + * all platforms. + * + * @param message the message to display + */ + public final void displayUpdate(final String message) { + final Runnable proc = new Runnable() { + public void run() { + setString(message); + getCurrentModel().justUpdatedUI(); + } + }; + + if (SwingUtilities.isEventDispatchThread()) { + proc.run(); + } + else { + SwingUtilities.invokeLater(proc); + } + } + + /** + * Moves the stripe inside the progress dialog. + * + */ + public final void stripeUpdate() { + completed = getCurrentModel().getUnitsCompletedSoFarThisPhase(); + total = getCurrentModel().getTotalUnitsThisPhase(); + + setValue((int)Math.round((int)completed/total*100)); + } + + /** + * Resets the stripe inside the progress dialog back to zero. + * + */ + public final void stripeReset() { + setValue(0); + } + + public void setCurrentModel(BaseProgressMonitor neoModel) { + currentModel = neoModel; + } + + public BaseProgressMonitor getCurrentModel() { + return currentModel; + } +}