package com.swingsane.gui.dialog; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import com.swingsane.business.image.transform.BinarizeTransform; import com.swingsane.business.image.transform.CropTransform; import com.swingsane.business.image.transform.DeskewTransform; import com.swingsane.business.image.transform.IImageTransform; import com.swingsane.business.image.transform.ImageTransformType; import com.swingsane.business.image.transform.RotateTransform; import com.swingsane.gui.panel.ITransformSettingsPanel; import com.swingsane.i18n.Localizer; /** * @author Roland Quast (roland@formreturn.com) * */ @SuppressWarnings("serial") public class ImageTransformDialog extends JDialog { private final JPanel contentPanel = new JPanel(); private int dialogResult = JOptionPane.CANCEL_OPTION; private static final int BOUNDS_WIDTH = 600; private static final int BOUNDS_HEIGHT = 500; private final Dimension bounds = new Dimension(BOUNDS_WIDTH, BOUNDS_HEIGHT); private JList<IImageTransform> transformTypeList; private DefaultListModel<IImageTransform> transformTypeListModel = new DefaultListModel<IImageTransform>(); private JComboBox<ImageTransformType> transformTypeComboBox; private JPanel transformSettingsContainerPanel; public ImageTransformDialog(Component parent) { initComponents(); pack(); setLocationRelativeTo(parent); } private void addTransformActionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { ImageTransformType transform = (ImageTransformType) transformTypeComboBox.getSelectedItem(); switch (transform) { case DESKEW: DeskewTransform deskewTransform = new DeskewTransform(); transformTypeListModel.addElement(deskewTransform); break; case ROTATE: RotateTransform rotateTransform = new RotateTransform(); transformTypeListModel.addElement(rotateTransform); break; case BINARIZE: BinarizeTransform binarizeTransform = new BinarizeTransform(); transformTypeListModel.addElement(binarizeTransform); break; case CROP: CropTransform cropTransform = new CropTransform(); transformTypeListModel.addElement(cropTransform); break; default: break; } transformTypeList.revalidate(); transformTypeList.repaint(); } }); } public final int getDialogResult() { return dialogResult; } public final ArrayList<IImageTransform> getTransforms() { ArrayList<IImageTransform> transforms = new ArrayList<IImageTransform>(); for (int i = 0; i < transformTypeListModel.getSize(); i++) { transforms.add(transformTypeListModel.getElementAt(i)); } return transforms; } private ITransformSettingsPanel getTransformSettingsPanel() { if (transformTypeList.getSelectedIndex() < 0) { return null; } return transformTypeList.getSelectedValue().getTransformSettingsPanel(); } private void initComponents() { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setTitle(Localizer.localize("ImageTransformDialogTitle")); setResizable(false); setBounds(0, 0, bounds.width, bounds.height); setSize(bounds); setPreferredSize(bounds); setMinimumSize(bounds); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(12, 12, 12, 12)); getContentPane().add(contentPanel, BorderLayout.CENTER); GridBagLayout gbl_contentPanel = new GridBagLayout(); gbl_contentPanel.columnWidths = new int[] { 0, 0 }; gbl_contentPanel.rowHeights = new int[] { 100, 0, 0 }; gbl_contentPanel.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; gbl_contentPanel.rowWeights = new double[] { 1.0, 0.0, Double.MIN_VALUE }; contentPanel.setLayout(gbl_contentPanel); { JPanel transformTypePanel = new JPanel(); transformTypePanel.setBorder(new CompoundBorder(new TitledBorder(Localizer .localize("TransformationsBorderTitle")), new EmptyBorder(5, 5, 5, 5))); GridBagConstraints gbc_transformTypePanel = new GridBagConstraints(); gbc_transformTypePanel.insets = new Insets(0, 0, 5, 0); gbc_transformTypePanel.fill = GridBagConstraints.BOTH; gbc_transformTypePanel.gridx = 0; gbc_transformTypePanel.gridy = 0; contentPanel.add(transformTypePanel, gbc_transformTypePanel); GridBagLayout gbl_transformTypePanel = new GridBagLayout(); gbl_transformTypePanel.columnWidths = new int[] { 0, 0 }; gbl_transformTypePanel.rowHeights = new int[] { 0, 0, 0 }; gbl_transformTypePanel.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; gbl_transformTypePanel.rowWeights = new double[] { 1.0, 0.0, Double.MIN_VALUE }; transformTypePanel.setLayout(gbl_transformTypePanel); { JScrollPane transformTypeScrollPane = new JScrollPane(); GridBagConstraints gbc_transformTypeScrollPane = new GridBagConstraints(); gbc_transformTypeScrollPane.insets = new Insets(0, 0, 5, 0); gbc_transformTypeScrollPane.fill = GridBagConstraints.BOTH; gbc_transformTypeScrollPane.gridx = 0; gbc_transformTypeScrollPane.gridy = 0; transformTypePanel.add(transformTypeScrollPane, gbc_transformTypeScrollPane); { transformTypeList = new JList<IImageTransform>(); transformTypeList.setFont(UIManager.getFont("List.font")); transformTypeList.setModel(transformTypeListModel); transformTypeList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { transformListSelectionChanged(e); } }); transformTypeScrollPane.setViewportView(transformTypeList); } } { JPanel transformActionsPanel = new JPanel(); GridBagConstraints gbc_transformActionsPanel = new GridBagConstraints(); gbc_transformActionsPanel.fill = GridBagConstraints.HORIZONTAL; gbc_transformActionsPanel.gridx = 0; gbc_transformActionsPanel.gridy = 1; transformTypePanel.add(transformActionsPanel, gbc_transformActionsPanel); GridBagLayout gbl_transformActionsPanel = new GridBagLayout(); gbl_transformActionsPanel.columnWidths = new int[] { 0, 32, 0, 0 }; gbl_transformActionsPanel.rowHeights = new int[] { 24, 0 }; gbl_transformActionsPanel.columnWeights = new double[] { 1.0, 0.0, 0.0, Double.MIN_VALUE }; gbl_transformActionsPanel.rowWeights = new double[] { 0.0, Double.MIN_VALUE }; transformActionsPanel.setLayout(gbl_transformActionsPanel); { JButton removeTransformButton = new JButton( Localizer.localize("RemoveTransformButtonText")); GridBagConstraints gbc_removeTransformButton = new GridBagConstraints(); gbc_removeTransformButton.insets = new Insets(0, 0, 0, 5); gbc_removeTransformButton.anchor = GridBagConstraints.WEST; gbc_removeTransformButton.gridx = 0; gbc_removeTransformButton.gridy = 0; transformActionsPanel.add(removeTransformButton, gbc_removeTransformButton); removeTransformButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { removeTransformActionPerformed(e); } }); removeTransformButton.setFont(UIManager.getFont("Button.font")); removeTransformButton.setMargin(new Insets(1, 5, 1, 5)); removeTransformButton.setIcon(new ImageIcon(ImageTransformDialog.class .getResource("/com/famfamfam/silk/delete.png"))); } { transformTypeComboBox = new JComboBox<ImageTransformType>(); transformTypeComboBox.setFont(UIManager.getFont("ComboBox.font")); transformTypeComboBox.setModel(new DefaultComboBoxModel<ImageTransformType>( new ImageTransformType[] { ImageTransformType.DESKEW, ImageTransformType.BINARIZE, ImageTransformType.ROTATE, ImageTransformType.CROP })); GridBagConstraints gbc_transformTypeComboBox = new GridBagConstraints(); gbc_transformTypeComboBox.insets = new Insets(0, 0, 0, 5); gbc_transformTypeComboBox.anchor = GridBagConstraints.WEST; gbc_transformTypeComboBox.gridx = 1; gbc_transformTypeComboBox.gridy = 0; transformActionsPanel.add(transformTypeComboBox, gbc_transformTypeComboBox); } { JButton addTransformButton = new JButton(Localizer.localize("AddTransformButtonText")); GridBagConstraints gbc_addTransformButton = new GridBagConstraints(); gbc_addTransformButton.gridx = 2; gbc_addTransformButton.gridy = 0; transformActionsPanel.add(addTransformButton, gbc_addTransformButton); addTransformButton.setFont(UIManager.getFont("Button.font")); addTransformButton.setMargin(new Insets(1, 5, 1, 5)); addTransformButton.setIcon(new ImageIcon(ImageTransformDialog.class .getResource("/com/famfamfam/silk/add.png"))); { transformSettingsContainerPanel = new JPanel(); GridBagConstraints gbc_transformSettingsContainerPanel = new GridBagConstraints(); gbc_transformSettingsContainerPanel.fill = GridBagConstraints.BOTH; gbc_transformSettingsContainerPanel.gridx = 0; gbc_transformSettingsContainerPanel.gridy = 1; contentPanel.add(transformSettingsContainerPanel, gbc_transformSettingsContainerPanel); GridBagLayout gbl_transformSettingsContainerPanel = new GridBagLayout(); gbl_transformSettingsContainerPanel.columnWidths = new int[] { 0, 0 }; gbl_transformSettingsContainerPanel.rowHeights = new int[] { 0, 0 }; gbl_transformSettingsContainerPanel.columnWeights = new double[] { 1.0, Double.MIN_VALUE }; gbl_transformSettingsContainerPanel.rowWeights = new double[] { 1.0, Double.MIN_VALUE }; transformSettingsContainerPanel.setLayout(gbl_transformSettingsContainerPanel); } addTransformButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addTransformActionPerformed(e); } }); } } } { updateTransformSettingsPanel(getTransformSettingsPanel()); } { JPanel buttonPane = new JPanel(); buttonPane.setBorder(new EmptyBorder(0, 12, 12, 12)); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { JButton transformButton = new JButton(Localizer.localize("DoTransformButtonText")); transformButton.setIcon(new ImageIcon(ImageTransformDialog.class .getResource("/com/famfamfam/silk/accept.png"))); transformButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dialogResult = JOptionPane.OK_OPTION; dispose(); } }); transformButton.setFont(UIManager.getFont("Button.font")); transformButton.setMargin(new Insets(1, 5, 1, 5)); buttonPane.add(transformButton); getRootPane().setDefaultButton(transformButton); } { JButton cancelButton = new JButton(Localizer.localize("Cancel")); cancelButton.setIcon(new ImageIcon(ImageTransformDialog.class .getResource("/com/famfamfam/silk/cross.png"))); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); cancelButton.setFont(UIManager.getFont("Button.font")); cancelButton.setMargin(new Insets(1, 5, 1, 5)); buttonPane.add(cancelButton); } } } private void removeTransformActionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (transformTypeList.getSelectedIndex() < 0) { return; } int[] indicies = transformTypeList.getSelectedIndices(); ArrayList<IImageTransform> removeList = new ArrayList<IImageTransform>(); for (int index : indicies) { removeList.add(transformTypeListModel.get(index)); } for (IImageTransform transform : removeList) { transformTypeListModel.removeElement(transform); } transformTypeList.clearSelection(); transformTypeList.revalidate(); transformTypeList.repaint(); updateTransformSettingsPanel(getTransformSettingsPanel()); } }); } private void transformListSelectionChanged(ListSelectionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { updateTransformSettingsPanel(getTransformSettingsPanel()); } }); } private void updateTransformSettingsPanel(ITransformSettingsPanel transformSettingsPanel) { transformSettingsContainerPanel.removeAll(); if (transformSettingsPanel != null) { GridBagConstraints gbc_transformSettingsPanel = new GridBagConstraints(); gbc_transformSettingsPanel.fill = GridBagConstraints.BOTH; gbc_transformSettingsPanel.gridx = 0; gbc_transformSettingsPanel.gridy = 0; transformSettingsContainerPanel.add((JPanel) transformSettingsPanel, gbc_transformSettingsPanel); } transformSettingsContainerPanel.revalidate(); transformSettingsContainerPanel.repaint(); } }