package com.kreative.paint.palette; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import com.kreative.paint.PaintContext; import com.kreative.paint.PaintContextListener; import com.kreative.paint.document.draw.PaintSettings; import com.kreative.paint.swing.JPopupPanel; import com.kreative.paint.util.SwingUtils; public class CompositePanel extends PaintContextPanel { private static final long serialVersionUID = 1L; private static final String[] ruleNames = { "composite.Src", "composite.SrcOver", "composite.SrcIn", "composite.SrcOut", "composite.SrcAtop", "composite.Xor", "composite.Dst", "composite.DstOver", "composite.DstIn", "composite.DstOut", "composite.DstAtop", "composite.Clear", }; private static final int[] rules = { AlphaComposite.SRC, AlphaComposite.SRC_OVER, AlphaComposite.SRC_IN, AlphaComposite.SRC_OUT, AlphaComposite.SRC_ATOP, AlphaComposite.XOR, AlphaComposite.DST, AlphaComposite.DST_OVER, AlphaComposite.DST_IN, AlphaComposite.DST_OUT, AlphaComposite.DST_ATOP, AlphaComposite.CLEAR, }; private DefaultListModel cxList; private JList cxView; private JLabel opLabel; private JSlider opSlider; private JLabel opPcLabel; private JPopupMenu cpop; private JPopupPanel apop; private boolean eventexec = false; public CompositePanel(PaintContext pc) { super(pc, CHANGED_COMPOSITE|CHANGED_EDITING); cxList = new DefaultListModel(); for (String rule : ruleNames) { cxList.addElement(" "+PaletteUtilities.messages.getString(rule)+" "); } cxView = new JList(cxList); cxView.setLayoutOrientation(JList.VERTICAL_WRAP); cxView.setVisibleRowCount((rules.length+3)/4); cxView.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!eventexec) { eventexec = true; if (CompositePanel.this.pc != null) { int rule = rules[cxView.getSelectedIndex()]; float alpha = opSlider.getValue()/100.0f; AlphaComposite cx = AlphaComposite.getInstance(rule, alpha); CompositePanel.this.pc.setEditedComposite(cx); } eventexec = false; } } }); opLabel = SwingUtils.shrink(new JLabel(PaletteUtilities.messages.getString("composite.Opacity"))); opSlider = SwingUtils.shrink(new JSlider(0, 100, 100)); opPcLabel = SwingUtils.shrink(new JLabel("100%")); opSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (!eventexec) { eventexec = true; opPcLabel.setText((opSlider.getValue()+"% ").substring(0,4)); if (CompositePanel.this.pc != null) { int rule = rules[cxView.getSelectedIndex()]; float alpha = opSlider.getValue()/100.0f; AlphaComposite cx = AlphaComposite.getInstance(rule, alpha); CompositePanel.this.pc.setEditedComposite(cx); } eventexec = false; } } }); JPanel sliderPanel = new JPanel(new BorderLayout()); sliderPanel.add(opLabel, BorderLayout.LINE_START); sliderPanel.add(opSlider, BorderLayout.CENTER); sliderPanel.add(opPcLabel, BorderLayout.LINE_END); sliderPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); sliderPanel.setPreferredSize(new Dimension(sliderPanel.getPreferredSize().width, 20)); setLayout(new BorderLayout()); add(cxView, BorderLayout.CENTER); add(sliderPanel, BorderLayout.SOUTH); cpop = new CompositePopup(); apop = new AlphaPopup(); update(); } public void update() { if (!eventexec) { eventexec = true; if (pc != null) { Composite cx = pc.getEditedComposite(); if (cx instanceof AlphaComposite) { int rule = ((AlphaComposite)cx).getRule(); float alpha = ((AlphaComposite)cx).getAlpha(); cxView.clearSelection(); for (int i = 0; i < rules.length; i++) { if (rule == rules[i]) { cxView.setSelectedIndex(i); break; } } opSlider.setValue((int)(alpha*100)); opPcLabel.setText(((int)(alpha*100) + "% ").substring(0,4)); } } eventexec = false; } } public JPopupMenu getCompositePopup() { return cpop; } public JPopupPanel getAlphaPopup() { return apop; } private class ShowCompositeMenuItem extends JMenuItem { private static final long serialVersionUID = 1L; public ShowCompositeMenuItem(final JPopupMenu parent) { super(PaletteUtilities.messages.getString("composite.show")); addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Container c = CompositePanel.this.getParent(); while (true) { if (c == null) { return; } else if (c instanceof Window) { Point p = MouseInfo.getPointerInfo().getLocation(); c.setLocation(p.x-64, p.y-8); c.setVisible(true); return; } else { c = c.getParent(); } } } }); } } private class CompositePopup extends JPopupMenu implements PaintContextListener { private static final long serialVersionUID = 1L; public CompositePopup() { add(new ShowCompositeMenuItem(this)); addSeparator(); Composite cx = CompositePanel.this.pc.getEditedComposite(); AlphaComposite acx = (cx instanceof AlphaComposite) ? (AlphaComposite)cx : null; for (int i = 0; i < rules.length; i++) { JMenuItem mi = new JCheckBoxMenuItem(PaletteUtilities.messages.getString(ruleNames[i])); mi.setSelected(acx != null && acx.getRule() == rules[i]); final int rule = rules[i]; mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Composite cx = CompositePanel.this.pc.getEditedComposite(); AlphaComposite acx = (cx instanceof AlphaComposite) ? (AlphaComposite)cx : null; CompositePanel.this.pc.setEditedComposite(AlphaComposite.getInstance(rule, (acx != null) ? acx.getAlpha() : 1.0f)); } }); add(mi); } CompositePanel.this.pc.addPaintContextListener(CompositePopup.this); } public void editingChanged(PaintContext src, boolean editingStroke, boolean editingBkgnd) {} public void paintSettingsChanged(PaintContext src, PaintSettings ps, int delta) { if ((delta & (PaintContext.CHANGED_COMPOSITE | PaintContext.CHANGED_EDITING)) != 0) { Composite cx = src.getEditedComposite(); AlphaComposite acx = (cx instanceof AlphaComposite) ? (AlphaComposite)cx : null; String sel = ""; for (int i = 0; i < rules.length; i++) { if (acx != null && acx.getRule() == rules[i]) { sel = PaletteUtilities.messages.getString(ruleNames[i]); } } setChecked(CompositePopup.this, sel); } } private void setChecked(MenuElement mi, String sel) { if (mi instanceof JMenuItem) { ((JMenuItem)mi).setSelected(((JMenuItem)mi).getText().equals(sel)); } for (MenuElement smi : mi.getSubElements()) { setChecked(smi, sel); } } } private class AlphaPopup extends JPopupPanel implements PaintContextListener { private static final long serialVersionUID = 1L; private JLabel opLabel; private JSlider opSlider; private JLabel opPcLabel; private boolean eventexec = false; public AlphaPopup() { opLabel = SwingUtils.shrink(new JLabel(PaletteUtilities.messages.getString("composite.Opacity"))); opSlider = SwingUtils.shrink(new JSlider(0, 100, 100)); opPcLabel = SwingUtils.shrink(new JLabel("100%")); opSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (!eventexec) { eventexec = true; opPcLabel.setText((opSlider.getValue()+"% ").substring(0,4)); if (CompositePanel.this.pc != null) { int rule = rules[cxView.getSelectedIndex()]; float alpha = opSlider.getValue()/100.0f; AlphaComposite cx = AlphaComposite.getInstance(rule, alpha); CompositePanel.this.pc.setEditedComposite(cx); } eventexec = false; } } }); JPanel sliderPanel = new JPanel(new BorderLayout()); sliderPanel.add(opLabel, BorderLayout.LINE_START); sliderPanel.add(opSlider, BorderLayout.CENTER); sliderPanel.add(opPcLabel, BorderLayout.LINE_END); sliderPanel.setBorder(BorderFactory.createEmptyBorder(4,8,4,8)); setLayout(new BorderLayout()); add(sliderPanel, BorderLayout.CENTER); hideOnRelease(opSlider); setResizable(false); pack(); CompositePanel.this.pc.addPaintContextListener(AlphaPopup.this); } public void editingChanged(PaintContext src, boolean editingStroke, boolean editingBkgnd) {} public void paintSettingsChanged(PaintContext src, PaintSettings ps, int delta) { if ((delta & (PaintContext.CHANGED_COMPOSITE | PaintContext.CHANGED_EDITING)) != 0) { if (!eventexec) { eventexec = true; if (pc != null) { Composite cx = pc.getEditedComposite(); if (cx instanceof AlphaComposite) { float alpha = ((AlphaComposite)cx).getAlpha(); opSlider.setValue((int)(alpha*100)); opPcLabel.setText(((int)(alpha*100) + "% ").substring(0,4)); } } eventexec = false; } } } } }