package magic.ui.dialog; import java.awt.Color; import java.awt.Dimension; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRootPane; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import magic.ui.utility.MagicStyle; import magic.ui.theme.Theme; import magic.ui.FontsAndBorders; import magic.ui.ScreenController; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public abstract class MagicDialog extends JDialog { protected abstract AbstractAction getCancelAction(); private final MigLayout migLayout = new MigLayout(); private final JPanel contentPanel = new JPanel(); public MagicDialog(String title, Dimension size) { super(ScreenController.getFrame()); setModalityType(ModalityType.APPLICATION_MODAL); setSize(size); setTitle(title); setEscapeKeyAction(); migLayout.setLayoutConstraints("flowy, insets 0"); getContentComponent().setLayout(migLayout); setLookAndFeel(); refreshLayout(); } protected JPanel getDialogContentPanel() { return contentPanel; } private void refreshLayout() { final JComponent content = getContentComponent(); content.removeAll(); content.add(getDialogCaptionLabel(), "w 100%, h 26!"); content.add(contentPanel, "w 100%, h 100%"); } private void setLookAndFeel() { setLocationRelativeTo(getOwner()); setResizable(false); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setUndecorated(true); getContentComponent().setBorder( BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.DARK_GRAY), BorderFactory.createMatteBorder(0, 8, 8, 8, MagicStyle.getTheme().getColor(Theme.COLOR_TITLE_BACKGROUND))) ); } 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 setEscapeKeyAction() { JRootPane root = getRootPane(); root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "closeDialog"); root.getActionMap().put("closeDialog", getCancelAction()); } private JComponent getContentComponent() { return (JComponent)getContentPane(); } }