package com.kreative.paint.tool.ui; import java.awt.*; import java.awt.event.*; import java.util.HashSet; import java.util.Set; import javax.swing.*; import javax.swing.border.Border; import com.kreative.paint.ToolContext; import com.kreative.paint.ToolContextConstants; import com.kreative.paint.ToolContextListener; import com.kreative.paint.material.sprite.Sprite; import com.kreative.paint.material.sprite.SpriteSheet; import com.kreative.paint.tool.Tool; import com.kreative.paint.util.SwingUtils; import com.kreative.paint.util.UpdateLock; public class BrushesUI extends JPanel implements ToolContextListener { private static final long serialVersionUID = 1L; private UpdateLock u = new UpdateLock(); private ToolContext tc; private JComboBox bpop; private JPanel bpanel; private CardLayout blyt; private Set<BrushPanel> bpanels; public BrushesUI(ToolContext tc, boolean mini) { this.tc = tc; bpop = new JComboBox(tc.getBrushSets().toNameArray()); bpop.setEditable(false); bpop.setMaximumRowCount(48); if (mini) SwingUtils.shrink(bpop); bpop.setSelectedIndex(tc.getBrushSetIndex()); bpop.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (u.lock()) { BrushesUI.this.tc.setBrushSetIndex(bpop.getSelectedIndex()); blyt.show(bpanel, Integer.toString(bpop.getSelectedIndex())); u.unlock(); } } }); bpanel = new JPanel(blyt = new CardLayout()); bpanels = new HashSet<BrushPanel>(); for (int n = 0; n < tc.getBrushSets().size(); n++) { BrushPanel p = new BrushPanel(n); JPanel p2 = new JPanel(new BorderLayout()); p2.add(p, BorderLayout.PAGE_START); bpanel.add(p2, Integer.toString(n)); bpanels.add(p); } setLayout(new BorderLayout(4,4)); add(bpop, BorderLayout.PAGE_START); add(bpanel, BorderLayout.CENTER); tc.addToolContextListener(this); } public void modeChanged(ToolContext src, boolean drawMode) {} public void toolChanged(ToolContext src, Tool previousTool, Tool nextTool) {} public void toolDoubleClicked(ToolContext src, Tool tool) {} public void toolSettingsChanged(ToolContext src, long delta) { if ((delta & ToolContextConstants.CHANGED_BRUSH_SET) != 0L) { if (u.lock()) { bpop.setSelectedIndex(tc.getBrushSetIndex()); blyt.show(bpanel, Integer.toString(tc.getBrushSetIndex())); u.unlock(); } for (BrushPanel b : bpanels) b.updateSelection(); } else if ((delta & ToolContextConstants.CHANGED_BRUSH) != 0L) { for (BrushPanel b : bpanels) b.updateSelection(); } } private class BrushPanel extends JPanel { private static final long serialVersionUID = 1L; private Set<BrushLabel> labels; public BrushPanel(int n) { labels = new HashSet<BrushLabel>(); SpriteSheet ss = tc.getBrushSets().getValue(n); int cells = ss.getSpriteCount(); int rows = ss.rows; int cols = ss.columns; if (rows <= 0) { if (cols <= 0) cols = ((cells < 12) ? cells : 12); rows = ((cells + cols - 1) / cols); } else if (cols <= 0) { cols = ((cells + rows - 1) / rows); } setLayout(new GridLayout(rows, cols)); for (int y = 0; y < rows; y++) { for (int x = 0; x < cols; x++) { int i = ss.order.getIndex(rows, cols, y, x); if (i < cells) { Sprite s = ss.getSprite(i); BrushLabel l = new BrushLabel(s, n, i); add(l); labels.add(l); } else { add(new JPanel()); } } } } public void updateSelection() { for (BrushLabel l : labels) l.updateSelection(); } } private class BrushLabel extends JLabel { private static final long serialVersionUID = 1L; private int n; private int i; public BrushLabel(Sprite s, int n, int i) { super(new ImageIcon(s.getPreparedImage())); this.n = n; this.i = i; updateSelection(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { tc.setBrushSetIndex(BrushLabel.this.n); tc.setBrushIndex(BrushLabel.this.i); } }); } public void updateSelection() { if (tc.getBrushSetIndex() == n && tc.getBrushIndex() == i) { Border inner = BorderFactory.createEmptyBorder(2, 2, 2, 2); Border outer = BorderFactory.createLineBorder(Color.black, 2); setBorder(BorderFactory.createCompoundBorder(outer, inner)); } else { setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); } } } }