package net.sf.openrocket.startup.providers; import java.awt.SplashScreen; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.Timer; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.database.MotorDatabaseLoader; import net.sf.openrocket.database.motor.ThrustCurveMotorSetDatabase; import net.sf.openrocket.gui.main.Splash; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.Provider; /** * A motor database that waits until the db has loaded in the background before * returning it. If appropriate, it displays a modal dialog while loading. * <p> * This class dual-functions as a MotorDatabase and a Guice Provider for the same. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class BlockingMotorDatabaseProvider implements Provider<ThrustCurveMotorSetDatabase> { private static final Logger log = LoggerFactory.getLogger(BlockingMotorDatabaseProvider.class); @Inject private Translator trans; private final MotorDatabaseLoader loader; public BlockingMotorDatabaseProvider(MotorDatabaseLoader loader) { this.loader = loader; } @Override public ThrustCurveMotorSetDatabase get() { check(); return loader.getDatabase(); } private void check() { if (loader.isLoaded()) { return; } SplashScreen splash = Splash.getSplashScreen(); if (splash == null || !splash.isVisible()) { log.info("Motor database not loaded yet, displaying dialog"); final LoadingDialog dialog = new LoadingDialog(); Timer timer = new Timer(100, new ActionListener() { private int count = 0; @Override public void actionPerformed(ActionEvent e) { count++; if (loader.isLoaded()) { log.debug("Database loaded, closing dialog"); dialog.setVisible(false); } else if (count % 10 == 0) { log.debug("Database not loaded, count=" + count); } } }); loader.cancelStartupDelay(); timer.start(); dialog.setVisible(true); timer.stop(); } else { log.info("Motor database not loaded yet, splash screen still present, delaying until loaded"); loader.blockUntilLoaded(); } log.info("Motor database now loaded"); } private class LoadingDialog extends JDialog { private LoadingDialog() { super(null, trans.get("MotorDbLoadDlg.title"), ModalityType.APPLICATION_MODAL); JPanel panel = new JPanel(new MigLayout("fill")); panel.add(new JLabel(trans.get("MotorDbLoadDlg.Loadingmotors")), "wrap para"); JProgressBar progress = new JProgressBar(); progress.setIndeterminate(true); panel.add(progress, "growx"); this.add(panel); this.pack(); this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); this.setLocationByPlatform(true); GUIUtil.setWindowIcons(this); } } }