package games.strategy.engine.framework.startup.launcher; import java.awt.Component; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import games.strategy.engine.data.GameData; import games.strategy.engine.framework.startup.mc.GameSelectorModel; import games.strategy.engine.framework.ui.background.WaitWindow; /** * Abstract class for launching a game. */ public abstract class AbstractLauncher implements ILauncher { protected final GameData m_gameData; protected final GameSelectorModel m_gameSelectorModel; protected final WaitWindow m_gameLoadingWindow; protected final boolean m_headless; protected AbstractLauncher(final GameSelectorModel gameSelectorModel) { this(gameSelectorModel, false); } protected AbstractLauncher(final GameSelectorModel gameSelectorModel, final boolean headless) { m_headless = headless; if (m_headless) { m_gameLoadingWindow = null; } else { m_gameLoadingWindow = new WaitWindow(); } m_gameSelectorModel = gameSelectorModel; m_gameData = gameSelectorModel.getGameData(); } @Override public void launch(final Component parent) { if (!m_headless && !SwingUtilities.isEventDispatchThread()) { throw new IllegalStateException("Wrong thread"); } final Runnable r = () -> launchInNewThread(parent); final Thread t = new Thread(r, "Triplea start thread"); if (!m_headless && m_gameLoadingWindow != null) { m_gameLoadingWindow.setLocationRelativeTo(JOptionPane.getFrameForComponent(parent)); m_gameLoadingWindow.setVisible(true); m_gameLoadingWindow.showWait(); } if (parent != null) { JOptionPane.getFrameForComponent(parent).setVisible(false); } t.start(); } protected abstract void launchInNewThread(Component parent); }