package magic.ui.dialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import magic.translate.MText; import magic.ui.FontsAndBorders; import magic.ui.MagicFrame; import magic.ui.dialog.button.CancelButton; import magic.ui.theme.Theme; import magic.ui.utility.MagicStyle; import magic.ui.widget.firemind.FiremindWorkerPanel; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class FiremindWorkerDialog extends JDialog implements ActionListener, PropertyChangeListener { // translatable strings private static final String _S1 = "Run Firemind Worker"; private static final String _S3 = "Run in background..."; private final JButton cancelButton = new CancelButton(); private final JButton backgroundButton = new JButton(); private final FiremindWorkerPanel firemindWorkerPanel = new FiremindWorkerPanel(); public FiremindWorkerDialog(final MagicFrame frame) { super(frame, true); firemindWorkerPanel.addPropertyChangeListener("isRunning", this); setLookAndFeel(); refreshLayout(); setEscapeKeyAsCancelAction(); this.setLocationRelativeTo(frame); this.setVisible(true); } private JPanel getFieldsPanel() { final JPanel panel = new JPanel(new MigLayout("flowy, insets 8, gapy 10")); panel.add(firemindWorkerPanel, "w 100%"); return panel; } private void setEscapeKeyAsCancelAction() { final KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); getRootPane().registerKeyboardAction(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { if (!backgroundButton.isEnabled()) { doCancelAndClose(); } } }, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); } private void refreshLayout() { setLayout(new MigLayout("flowy, gapy 0, insets 0")); add(getDialogCaptionLabel(), "w 100%, h 26!"); add(getFieldsPanel(), "w 100%"); add(getButtonPanel(), "w 100%, aligny bottom, pushy"); } private JLabel getDialogCaptionLabel() { final JLabel lbl = new JLabel(getTitle()); lbl.setOpaque(true); lbl.setBackground(MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_BACKGROUND)); lbl.setForeground(MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_FOREGROUND)); lbl.setFont(FontsAndBorders.FONT1.deriveFont(14f)); lbl.setHorizontalAlignment(SwingConstants.CENTER); return lbl; } private void setLookAndFeel() { setTitle(MText.get(_S1)); setResizable(false); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setSize(360, 460); setUndecorated(true); ((JComponent)getContentPane()).setBorder(BorderFactory.createMatteBorder(0, 8, 8, 8, MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_BACKGROUND))); backgroundButton.setEnabled(false); } private void updateComponentState() { boolean isBackgroundButtonEnabled = false; final boolean isRunning = firemindWorkerPanel.isRunning(); isBackgroundButtonEnabled = isBackgroundButtonEnabled || isRunning; backgroundButton.setEnabled(isBackgroundButtonEnabled); } private JPanel getButtonPanel() { // cancel button cancelButton.setFocusable(false); cancelButton.addActionListener(this); // background button backgroundButton.setText(MText.get(_S3)); backgroundButton.setFocusable(false); backgroundButton.addActionListener(this); // layout final JPanel panel = new JPanel(new MigLayout()); panel.add(backgroundButton, "w 100%, alignx left"); panel.add(cancelButton, "w 100!, alignx right, pushx"); return panel; } @Override public void actionPerformed(final ActionEvent event) { final Object source=event.getSource(); if (source==cancelButton) { doCancelAndClose(); } else if (source == backgroundButton) { setVisible(false); } } private void doCancelAndClose() { firemindWorkerPanel.doCancel(); dispose(); } @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("isRunning")) { updateComponentState(); } } }