package com.kreative.paint.tool.ui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.event.*;
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.tool.Tool;
import com.kreative.paint.tool.ToolUtilities;
import com.kreative.paint.util.SwingUtils;
import com.kreative.paint.util.UpdateLock;
public class SprinklesUI extends JPanel implements ToolContextListener {
private static final long serialVersionUID = 1L;
private UpdateLock u = new UpdateLock();
private ToolContext tc;
private JList l;
private JCheckBox bmcb;
public SprinklesUI(ToolContext tc, boolean mini) {
this.tc = tc;
l = new JList(tc.getSprinkleSets().toArray());
l.setCellRenderer(new SprinkleSetCellRenderer());
l.setVisibleRowCount(mini ? 4 : 8);
l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
l.setSelectedIndex(tc.getSprinkleSetIndex());
l.ensureIndexIsVisible(tc.getSprinkleSetIndex());
l.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (u.lock()) {
SprinklesUI.this.tc.setSprinkleSetIndex(l.getSelectedIndex());
u.unlock();
}
}
});
JScrollPane lp = new JScrollPane(l, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
if (mini) SwingUtils.shrink(lp);
bmcb = new JCheckBox(ToolUtilities.messages.getString("options.Sprinkles.BrushMode"));
bmcb.setSelected(tc.sprinkleBrushMode());
bmcb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (u.lock()) {
SprinklesUI.this.tc.setSprinkleBrushMode(bmcb.isSelected());
u.unlock();
}
}
});
if (mini) SwingUtils.shrink(bmcb);
JPanel bmp = new JPanel(new FlowLayout());
bmp.add(bmcb);
setLayout(new BorderLayout());
add(lp, BorderLayout.CENTER);
add(bmp, BorderLayout.PAGE_END);
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_SPRINKLE_SET) != 0L) {
if (u.lock()) {
l.setSelectedIndex(src.getSprinkleSetIndex());
l.ensureIndexIsVisible(src.getSprinkleSetIndex());
u.unlock();
}
}
if ((delta & ToolContextConstants.CHANGED_SPRINKLE_BRUSH_MODE) != 0L) {
if (u.lock()) {
bmcb.setSelected(src.sprinkleBrushMode());
u.unlock();
}
}
}
private class SprinkleSetCellRenderer implements ListCellRenderer {
private static final int BORDER = 4;
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus
) {
JLabel l = new JLabel();
Sprite ss = tc.getSprinkleSets().get(index);
int n = ss.getChildCount();
int w = -1;
int h = 0;
for (int i = 0; i < n; i++) {
Sprite s = ss.getChild(i);
w += s.getWidth() + 1;
if (s.getHeight() > h) h = s.getHeight();
}
if (w > 400) w = 400;
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.setColor(new Color((isSelected ? SystemColor.textHighlightText : SystemColor.textText).getRGB()));
for (int i = 0, x = 0; i < n && x < w; i++) {
Sprite s = ss.getChild(i);
s.paint(g, x + s.getHotspotX(), ((h - s.getHeight()) / 2) + s.getHotspotY());
x += s.getWidth() + 1;
}
g.dispose();
l.setIcon(new ImageIcon(img));
l.setText(ss.getName());
l.setFont(l.getFont().deriveFont(9.0f));
l.setVerticalAlignment(JLabel.CENTER);
l.setHorizontalAlignment(JLabel.CENTER);
l.setVerticalTextPosition(JLabel.BOTTOM);
l.setHorizontalTextPosition(JLabel.CENTER);
l.setOpaque(true);
l.setBackground(isSelected ? SystemColor.textHighlight : SystemColor.text);
l.setForeground(isSelected ? SystemColor.textHighlightText : SystemColor.textText);
l.setBorder(BorderFactory.createEmptyBorder(BORDER, BORDER, BORDER, BORDER));
return l;
}
}
}