package com.clearlyspam23.GLE.basic.layers.tile.gui.tileset; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import com.clearlyspam23.GLE.GUI.util.AspectRatioLayout; import com.clearlyspam23.GLE.GUI.util.StretchIcon; import com.clearlyspam23.GLE.basic.layers.tile.TilesetHandle; public class TilesetViewPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; private JPanel panel; private List<JButton> buttons = new ArrayList<JButton>(); private List<TilesetViewSelectionListener> listeners = new ArrayList<TilesetViewSelectionListener>(); private TilesetHandle currentTileset; private boolean enableSelection = false; private boolean enableBorder = false; /** * Create the panel. */ public TilesetViewPanel() { super(new AspectRatioLayout()); panel = new JPanel(); add(panel); //setMinimumSize(new Dimension(0, 0)); } public void toggleButtonSelection(boolean flag){ for(JButton button : buttons){ button.setFocusPainted(flag); } enableSelection = flag; } public boolean allowsButtonSelection(){ return enableSelection; } public void toggleBorders(boolean flag){ enableBorder = flag; for(JButton button : buttons){ button.setBorderPainted(flag); } // if(flag) // for(JButton button : buttons) // button.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0, false)); // else // for(JButton button : buttons) // button.setBorder(BorderFactory.createEmptyBorder()); } public boolean usesBorders(){ return enableBorder; } public void setToTileset(TilesetHandle handle){ currentTileset = handle; panel.removeAll(); buttons.clear(); if(handle==null){ return; } panel.setLayout(new GridLayout(handle.getHeight(), handle.getWidth())); int width = 0; int height = 0; for(int j = 0; j < handle.getHeight(); j++){ int tempWidth = 0; int tempHeight = 0; for(int i = 0; i < handle.getWidth(); i++){ final int x = i; final int y = j; ImageIcon ico = new StretchIcon(handle.getTileAt(i, j), true); JButton button = new JButton(ico){ private static final long serialVersionUID = 1L; public void setSelected(boolean flag){ super.setSelected(flag); if(flag){ setBorderPainted(true); } else { setBorderPainted(false); } } }; if(enableBorder) button.setBorder(BorderFactory.createLineBorder(Color.black, 0)); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { if(enableSelection) selectTile(x, y, arg0); // selectedX = x; // selectedY = y; } }); button.setLayout(null); button.setFocusPainted(enableSelection); button.setBorder(BorderFactory.createLineBorder(Color.BLACK)); button.setBorderPainted(enableBorder); button.setContentAreaFilled(false); panel.add(button); buttons.add(button); tempWidth+=handle.getTileAt(i, j).getWidth(null); tempHeight = Math.max(tempHeight, handle.getTileAt(i, j).getHeight(null)); } width = Math.max(tempWidth, width); height+=tempHeight; } panel.setPreferredSize(new Dimension(width, height)); } public void selectTile(int x, int y){ selectTile(x, y, null); } public void selectTile(int x, int y, ActionEvent e){ int index = y*currentTileset.getWidth() + x; for(JButton b : buttons) b.setSelected(false); buttons.get(index).setSelected(true); for(TilesetViewSelectionListener l : listeners){ l.onSelection(x, y, e); } } public void addListener(TilesetViewSelectionListener listener){ listeners.add(listener); } public void removeListener(TilesetViewSelectionListener listener){ listeners.remove(listener); } }