package magic.ui.screen.menu.migrate; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import magic.ui.ImportWorker; import magic.ui.MagarenaDirectoryChooser; import magic.ui.ScreenController; import magic.translate.MText; import magic.ui.screen.widget.MenuButton; import magic.ui.screen.widget.MenuPanel; import magic.ui.theme.ThemeFactory; import magic.ui.FontsAndBorders; import magic.ui.WikiPage; import magic.ui.screen.MScreen; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class ImportScreen extends MScreen { // translatable strings private static final String _S1 = "Import Settings?"; private static final String _S2 = "Yes"; private static final String _S3 = "Import settings from a previous version of Magarena."; private static final String _S4 = "No"; private static final String _S5 = "Help [F1]"; private static final String _S6 = "Opens the related wiki page in your internet browser."; private static final String _S7 = "Importing..."; private static final String _S8 = "Cancel"; private final JLabel progressLabel = new JLabel(); private final StringBuffer sb = new StringBuffer(); public ImportScreen() { setMainContent(new ScreenContent()); setWikiPage(WikiPage.IMPORT_SETTINGS); } private class ScreenContent extends JPanel{ private final MigLayout migLayout = new MigLayout(); private MenuPanel menuPanel; public ScreenContent() { setOpaque(false); progressLabel.setForeground(Color.WHITE); progressLabel.setVerticalAlignment(SwingConstants.TOP); progressLabel.setFont(FontsAndBorders.FONT_README); setLayout(migLayout); migLayout.setLayoutConstraints("alignx center, aligny center"); showImportMenu(); } private void refreshLayout() { removeAll(); add(menuPanel); revalidate(); } private void showImportMenu() { menuPanel = new ImportMenuPanel(); refreshLayout(); } private void showImportProgressPanel(File importFolder) { menuPanel = new ImportProgressPanel(importFolder); refreshLayout(); } private void doImport() { final JFileChooser fileChooser = new MagarenaDirectoryChooser(); final int action = fileChooser.showOpenDialog(ScreenController.getFrame()); if (action == JFileChooser.APPROVE_OPTION) { showImportProgressPanel(fileChooser.getSelectedFile()); } } private class ImportMenuPanel extends MenuPanel { ImportMenuPanel() { super(MText.get(MText.get(_S1))); addMenuItem(MText.get(MText.get(_S2)), new AbstractAction() { @Override public void actionPerformed(final ActionEvent ev) { doImport(); } }, MText.get(_S3)); addMenuItem(MText.get(MText.get(_S4)), new AbstractAction() { @Override public void actionPerformed(final ActionEvent ev) { ScreenController.showMainMenuScreen(); } }); addMenuItem(MText.get(MText.get(_S5)), new AbstractAction() { @Override public void actionPerformed(final ActionEvent ev) { showWikiHelpPage(); } }, MText.get(_S6)); refreshLayout(); // final JLabel lbl = new JLabel("<html>Import settings from previous version?</html>"); // lbl.setForeground(Color.WHITE); // lbl.setFont(FontsAndBorders.FONT1.deriveFont(14f)); // menuPanel.add(lbl, "w 100%, gaptop 10, gapbottom 10", 1); } } private class ImportProgressPanel extends MenuPanel implements PropertyChangeListener { private final JPanel panel = new JPanel(new MigLayout("insets 4 0 0 0, flowy")); private final MenuButton cancelButton; private ImportWorker importWorker; private final ProgressPanel progressBar = new ProgressPanel(); public ImportProgressPanel(File aFolder) { super(MText.get(MText.get(_S7))); cancelButton = new MenuButton( MText.get(_S8), new AbstractAction() { @Override public void actionPerformed(final ActionEvent ev) { setVisible(false); if (importWorker != null) { importWorker.cancel(false); } else { ScreenController.showMainMenuScreen(); } } }); cancelButton.setVisible(true); panel.setOpaque(false); refreshPanelLayout(); add(panel, "w 100%, h 100%"); importWorker = new ImportWorker(aFolder); importWorker.addPropertyChangeListener(this); importWorker.execute(); } final void refreshPanelLayout() { panel.removeAll(); panel.add(progressLabel, "w 100%, h 100%"); panel.add(progressBar, "w 100%, h 4!"); panel.add(cancelButton, "w 100%, h 26!, hidemode 3"); panel.revalidate(); } @Override public void propertyChange(PropertyChangeEvent evt) { assert SwingUtilities.isEventDispatchThread(); if (evt.getPropertyName().equalsIgnoreCase("progress")) { progressBar.setValue((int)evt.getNewValue()); } else if (evt.getPropertyName().equalsIgnoreCase("state")) { if (evt.getNewValue().toString().equalsIgnoreCase("done")) { setVisible(false); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ThemeFactory.getInstance().loadThemes(); ScreenController.showMainMenuScreen(); } }); } } else if (evt.getPropertyName().equalsIgnoreCase("progressNote")) { sb.append(evt.getNewValue().toString().replace("\n", "<br>")); progressLabel.setText("<html>" + sb.toString() + "</html>"); progressLabel.revalidate(); progressLabel.repaint(); } } } } private class ProgressPanel extends JPanel { private int percentageComplete = 0; public ProgressPanel() { setOpaque(false); } private void setValue(int progressValue) { percentageComplete = progressValue; repaint(); } private final Color COLOR1 = new Color(255, 255, 255, 0); private final Color COLOR2 = new Color(255, 255, 255, 200); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); final Graphics2D g2d = (Graphics2D) g.create(); if (percentageComplete > 0) { final int w = (int)(getWidth() * (percentageComplete / 100D)); g2d.setPaint(new GradientPaint(0, 0, COLOR1, w, 0, COLOR2)); g2d.fillRect(0, 0, w, getHeight()); } g2d.dispose(); } } }