package org.csdgn.cddatse; import java.awt.BorderLayout; import java.awt.Color; 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.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.image.BufferedImage; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ScrollPaneConstants; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.csdgn.cddatse.data.GFX; import org.csdgn.cddatse.data.TileInfo; import org.csdgn.maru.swing.ArrayListModel; public class TileChooser extends JDialog { public class IconListRenderer extends DefaultListCellRenderer { private static final long serialVersionUID = -6530533873699384730L; public ImageIcon icon = new ImageIcon(); @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); label.setText(""); icon.setImage((BufferedImage) value); label.setIcon(icon); return label; } } public static final int OPTION_CANCEL = 0; public static final int OPTION_OK = 2; public static final int OPTION_REMOVE = 1; private static final long serialVersionUID = -7024147904031885972L; private BufferedImage image = null; private ArrayListModel<BufferedImage> listModel; private boolean loadedImage = false; private ImageIcon preview = new ImageIcon(); private int retVal = OPTION_CANCEL; private JList<BufferedImage> tileList; /** * Create the dialog. */ public TileChooser(Window owner) { super(owner); setModal(true); setTitle("Tile Chooser"); setBounds(100, 100, 450, 300); JPanel contentPanel = new JPanel(); contentPanel.setBorder(new EmptyBorder(0, 5, 0, 5)); setContentPane(contentPanel); contentPanel.setLayout(new BorderLayout(0, 0)); // just wrap the root image list listModel = new ArrayListModel<BufferedImage>(GFX.instance.images); contentPanel.add(createButtonPanel(), BorderLayout.SOUTH); JPanel newTilePanel = new JPanel(); contentPanel.add(newTilePanel, BorderLayout.NORTH); JPanel newTileCenterPanel = new JPanel(); newTileCenterPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); GridBagLayout gbl_newTilePanel = new GridBagLayout(); gbl_newTilePanel.columnWidths = new int[] { 0, 0, 0 }; gbl_newTilePanel.rowHeights = new int[] { 0, 0 }; gbl_newTilePanel.columnWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE }; gbl_newTilePanel.rowWeights = new double[] { 0.0, 0.0 }; newTileCenterPanel.setLayout(gbl_newTilePanel); // add(btnFore, gbc_btnA); newTilePanel.setName("New Tile"); newTilePanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); newTilePanel.add(newTileCenterPanel); final JLabel btnPreview = new JLabel(preview = new ImageIcon()); btnPreview.setMinimumSize(new Dimension(64, 64)); btnPreview.setPreferredSize(new Dimension(64, 64)); btnPreview.setBorder(new LineBorder(new Color(0, 0, 0))); btnPreview.setAlignmentX(Component.CENTER_ALIGNMENT); GridBagConstraints gbc_btnPreview = new GridBagConstraints(); gbc_btnPreview.gridheight = 2; gbc_btnPreview.fill = GridBagConstraints.BOTH; gbc_btnPreview.insets = new Insets(0, 0, 0, 5); gbc_btnPreview.gridx = 0; gbc_btnPreview.gridy = 0; newTileCenterPanel.add(btnPreview, gbc_btnPreview); JButton btnBrowse = new JButton("Browse for Image"); btnBrowse.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openSingleTile(); } }); GridBagConstraints gbc_btnBrowse = new GridBagConstraints(); gbc_btnBrowse.fill = GridBagConstraints.HORIZONTAL; gbc_btnBrowse.insets = new Insets(0, 0, 5, 0); gbc_btnBrowse.gridx = 1; gbc_btnBrowse.gridy = 0; newTileCenterPanel.add(btnBrowse, gbc_btnBrowse); JLabel lblWarningTheImage = new JLabel("Warning: The image will be cropped if larger."); GridBagConstraints gbc_lblWarningTheImage = new GridBagConstraints(); gbc_lblWarningTheImage.gridx = 1; gbc_lblWarningTheImage.gridy = 1; newTileCenterPanel.add(lblWarningTheImage, gbc_lblWarningTheImage); BorderLayout bl_existingTilePanel = new BorderLayout(); bl_existingTilePanel.setVgap(5); bl_existingTilePanel.setHgap(5); JPanel existingTilePanel = new JPanel(bl_existingTilePanel); contentPanel.add(existingTilePanel, BorderLayout.CENTER); existingTilePanel.setName("Existing Tile"); JScrollPane scrollPane = new JScrollPane(); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); existingTilePanel.add(scrollPane, BorderLayout.CENTER); tileList = new JList<BufferedImage>(listModel); tileList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { setSelectedImage(listModel.get(tileList.getSelectedIndex())); } }); tileList.setVisibleRowCount(0); tileList.setCellRenderer(new IconListRenderer()); tileList.setLayoutOrientation(JList.HORIZONTAL_WRAP); scrollPane.setViewportView(tileList); JPanel panel = new JPanel(); existingTilePanel.add(panel, BorderLayout.SOUTH); panel.setLayout(new BorderLayout(0, 0)); JCheckBox chckbxHideUsedTiles = new JCheckBox("Hide used tiles"); panel.add(chckbxHideUsedTiles, BorderLayout.WEST); chckbxHideUsedTiles.setEnabled(false); JButton btnImportTileset = new JButton("Import Tiles"); btnImportTileset.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openTileset(); } }); panel.add(btnImportTileset, BorderLayout.EAST); } private JPanel createButtonPanel() { JPanel buttonPane = new JPanel(); buttonPane.setBorder(new EmptyBorder(5, 5, 5, 5)); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.X_AXIS)); JButton btnRemove = new JButton("Remove"); btnRemove.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { retVal = OPTION_REMOVE; setVisible(false); } }); buttonPane.add(btnRemove); Component horizontalGlue = Box.createHorizontalGlue(); buttonPane.add(horizontalGlue); JButton okButton = new JButton("OK"); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { retVal = OPTION_OK; if (loadedImage) { // add image to gfx master image list GFX.instance.images.add(image); } setVisible(false); } }); okButton.setActionCommand("OK"); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); JButton cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { retVal = OPTION_CANCEL; setVisible(false); } }); cancelButton.setActionCommand("Cancel"); buttonPane.add(cancelButton); return buttonPane; } private void openTileset() { BufferedImage img = AppToolkit.browseForImage(this,"Select Tileset"); // cut up image if (img != null) { TileInfo info = GFX.instance.getTileInfo(); int w = img.getWidth(); int h = img.getHeight(); if (w % info.width != 0) { AppToolkit.showError(this, "Image width must be a multiple of " + info.width + "."); return; } if (h % info.height != 0) { AppToolkit.showError(this, "Image height must be a multiple of " + info.height + "."); return; } // cut it up GFX.instance.images.addAll(GFX.cutImageIntoTiles(img, info.width, info.height)); // reload listModel listModel.fireUpdate(); } else { AppToolkit.showError(this, "Invalid Image!"); } } private void setSelectedImage(BufferedImage img) { if(loadedImage) { image.flush(); loadedImage = false; } image = img; preview.setImage(img); //tileList.ensureIndexIsVisible(index); } public void setExternalSelectedImage(BufferedImage img) { setSelectedImage(img); final int index = listModel.getList().indexOf(img); if(index != -1) { //should never be -1, but better safe... tileList.setSelectedIndex(index); addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { tileList.ensureIndexIsVisible(index); removeComponentListener(this); } }); } } private void openSingleTile() { BufferedImage img = AppToolkit.browseForImage(this,"Select Tile"); if (img != null) { tileList.clearSelection(); setSelectedImage(img); //this must be set AFTER setSelectedImage loadedImage = true; } else { AppToolkit.showError(this, "Invalid Image!"); } } public BufferedImage getSelectedImage() { return image; } public int showDialog() { setVisible(true); return retVal; } }