package com.kreative.paint.tool.ui; import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; 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 RubberStampsUI extends JPanel implements ToolContextListener { private static final long serialVersionUID = 1L; private UpdateLock u = new UpdateLock(); private ToolContext tc; private JList stampl, ssetl; public RubberStampsUI(ToolContext tc, boolean mini) { this.tc = tc; ssetl = new JList(tc.getRubberStampSets().toNameArray()); ssetl.setCellRenderer(new StampSetCellRenderer()); ssetl.setVisibleRowCount(mini ? 3 : 5); ssetl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); ssetl.setSelectedIndex(tc.getRubberStampSetIndex()); ssetl.ensureIndexIsVisible(tc.getRubberStampSetIndex()); ssetl.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (u.lock()) { RubberStampsUI.this.tc.setRubberStampSetIndex(ssetl.getSelectedIndex()); stampl.setListData(new String[RubberStampsUI.this.tc.getRubberStamps().size()]); stampl.setSelectedIndex(RubberStampsUI.this.tc.getRubberStampIndex()); stampl.ensureIndexIsVisible(RubberStampsUI.this.tc.getRubberStampIndex()); u.unlock(); } } }); JScrollPane ssetlp = new JScrollPane(ssetl, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); if (mini) SwingUtils.shrink(ssetlp); stampl = new JList(new String[tc.getRubberStamps().size()]); stampl.setLayoutOrientation(JList.HORIZONTAL_WRAP); stampl.setVisibleRowCount(0); stampl.setCellRenderer(new StampCellRenderer()); stampl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); stampl.setSelectedIndex(tc.getRubberStampIndex()); stampl.ensureIndexIsVisible(tc.getRubberStampIndex()); stampl.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (u.lock()) { RubberStampsUI.this.tc.setRubberStampIndex(stampl.getSelectedIndex()); u.unlock(); } } }); JScrollPane stamplp = new JScrollPane(stampl, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); if (mini) SwingUtils.shrink(stamplp); stamplp.setMinimumSize(new Dimension(1,1)); stamplp.setPreferredSize(new Dimension(1,1)); setLayout(new GridLayout(2, 1, mini ? 4 : 8, mini ? 4 : 8)); add(ssetlp); add(stamplp); 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_STAMP_SET) != 0L) { if (u.lock()) { ssetl.setSelectedIndex(tc.getRubberStampSetIndex()); ssetl.ensureIndexIsVisible(tc.getRubberStampSetIndex()); stampl.setListData(new String[tc.getRubberStamps().size()]); stampl.setSelectedIndex(tc.getRubberStampIndex()); stampl.ensureIndexIsVisible(tc.getRubberStampIndex()); u.unlock(); } } else if ((delta & ToolContextConstants.CHANGED_STAMP) != 0L) { if (u.lock()) { stampl.setSelectedIndex(tc.getRubberStampIndex()); stampl.ensureIndexIsVisible(tc.getRubberStampIndex()); u.unlock(); } } } private class StampCellRenderer implements ListCellRenderer { private static final int BORDER = 4; public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus ) { Image img = tc.getRubberStamps().get(index).getPreparedImage(); JLabel l = new JLabel(new ImageIcon(img)); 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; } } private class StampSetCellRenderer 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(); SpriteSheet ss = tc.getRubberStampSets().getValue(index); int n = ss.getSpriteCount(); int w = -1; int h = 0; for (int i = 0; i < n; i++) { Sprite s = ss.getSprite(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.getSprite(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(value.toString()); 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; } } }