package com.kreative.paint.tool.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashSet; import java.util.Set; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.border.Border; import com.kreative.paint.ToolContext; import com.kreative.paint.ToolContextConstants; import com.kreative.paint.ToolContextListener; 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 CalligraphyBrushesUI extends JPanel implements ToolContextListener { private static final long serialVersionUID = 1L; private UpdateLock u = new UpdateLock(); private ToolContext tc; private Set<BrushLabel> labels; private JRadioButton crb, drb; public CalligraphyBrushesUI(ToolContext tc, boolean mini) { this.tc = tc; labels = new HashSet<BrushLabel>(); JPanel lp = new JPanel(new GridLayout(1,0)); for (int i = 0; i < tc.getCalligraphyBrushes().size(); i++) { BrushLabel l = new BrushLabel(i); labels.add(l); lp.add(l); } crb = new JRadioButton(ToolUtilities.messages.getString("options.Calligraphy.Continuous")); drb = new JRadioButton(ToolUtilities.messages.getString("options.Calligraphy.Discontinuous")); crb.setSelected(tc.calligraphyContinuous()); drb.setSelected(!tc.calligraphyContinuous()); crb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (u.lock()) { CalligraphyBrushesUI.this.tc.setCalligraphyContinuous(true); u.unlock(); } } }); drb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (u.lock()) { CalligraphyBrushesUI.this.tc.setCalligraphyContinuous(false); u.unlock(); } } }); if (mini) { SwingUtils.shrink(crb); SwingUtils.shrink(drb); } ButtonGroup rbg = new ButtonGroup(); JPanel rbp = new JPanel(new GridLayout(2,1)); rbg.add(crb); rbg.add(drb); rbp.add(crb); rbp.add(drb); JPanel rbp2 = new JPanel(new FlowLayout()); rbp2.add(rbp); setLayout(new BorderLayout()); add(lp, BorderLayout.PAGE_START); add(rbp2, 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_CALLIGRAPHY_BRUSH) != 0L) { for (BrushLabel l : labels) l.updateSelection(); } if ((delta & ToolContextConstants.CHANGED_CALLIGRAPHY_CONTINUOUS) != 0L) { if (u.lock()) { crb.setSelected(src.calligraphyContinuous()); drb.setSelected(!src.calligraphyContinuous()); u.unlock(); } } } private class BrushLabel extends JLabel { private static final long serialVersionUID = 1L; private int i; public BrushLabel(int i) { super(new ImageIcon(tc.getCalligraphyBrushes().get(i).getPreparedImage())); this.i = i; updateSelection(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { tc.setCalligraphyBrushIndex(BrushLabel.this.i); } }); } public void updateSelection() { if (tc.getCalligraphyBrushIndex() == 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)); } } } }