/* * Copyright 2011 Uwe Krueger. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mandelsoft.mand.tool.cm; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Window; import java.util.Locale; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.border.BevelBorder; import javax.swing.colorchooser.AbstractColorChooserPanel; import javax.swing.colorchooser.ColorSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.mandelsoft.mand.tool.ColorListModel; import com.mandelsoft.mand.tool.MandelWindowAccess; import com.mandelsoft.swing.GBC; import com.mandelsoft.swing.colorchooser.ColorImageModel; import com.mandelsoft.swing.colorchooser.HSBChooserPanel; import com.mandelsoft.swing.colorchooser.ImageChooserPanel; import com.mandelsoft.swing.colorchooser.RGBChooserPanel; import com.mandelsoft.swing.colorchooser.SwatchChooserPanel; import com.mandelsoft.swing.colorchooser.SwatchChooserPanel.UserColorListener; import com.mandelsoft.swing.colorchooser.SwatchChooserPanel.UserColorSource; /** * * @author Uwe Krueger */ public class ColorChooser extends JDialog { private boolean preview=false; private GBC colorSampleGBC; private SampleComponent colorSample; private ImageChooserPanel imagePanel; private SwatchChooserPanel swatchPanel; private JColorChooser cc; private ColorListModel colors; private ChangeListener changeListener; public ColorChooser(Window c) { super(c); setup(); } public ColorChooser() { setup(); } private void setup() { if (getOwner() instanceof MandelWindowAccess) { colors=((MandelWindowAccess)getOwner()).getEnvironment().getColorsModel(); } cc=new JColorChooser(); if (!preview) { setLayout(new GridBagLayout()); colorSampleGBC = new GBC(0,0).setInsets(10,10,10,10) .setFill(GBC.HORIZONTAL); cc.setPreviewPanel(new JPanel()); } cc.setLocale(Locale.UK); cc.getSelectionModel().addChangeListener(new ColorListener()); AbstractColorChooserPanel[] old=cc.getChooserPanels(); AbstractColorChooserPanel keep=null; for (int i=0; i<old.length; i++) { //System.out.println("CHOOSER: "+old[i]); if (old[i].getClass().getName().equals("javax.swing.colorchooser.DefaultRGBChooserPanel")) { keep=old[i]; } cc.removeChooserPanel(old[i]); } //cc.setChooserPanels(new AbstractColorChooserPanel[]{}); cc.addChooserPanel(new RGBChooserPanel()); cc.addChooserPanel(new HSBChooserPanel()); cc.addChooserPanel(swatchPanel=new SwatchChooserPanel(new UserColorSource() { @Override public Color getUserColor(int i) { if (colors!=null) { if (i<colors.getList().size()) { return colors.getList().get(i); } } return null; } })); cc.addChooserPanel(imagePanel=new ImageChooserPanel()); if (keep!=null) { cc.addChooserPanel(keep); } if (colors!=null) { // for (Color c:colors.getList()) { // swatchPanel.addUserColor(c); // } swatchPanel.addColorListener(new UserColorListener() { public void colorAdded(Color c) { colors.addColor(0,c); } public void colorRemoved(Color c) { colors.removeColor(c); } }); //System.out.println("connect chooser to colors"); colors.addChangeListener(changeListener=new ChangeListener() { public void stateChanged(ChangeEvent e) { ColorListModel.ListEvent l=(ColorListModel.ListEvent)e; if (l.getMode()==ColorListModel.ListEvent.ADD) { swatchPanel.addUserColor(l.getColor()); } else if (l.getMode()==ColorListModel.ListEvent.ADD) { swatchPanel.removeUserColor(l.getColor()); } } }); } if (!preview) add(cc, new GBC(0,1)); else add(cc); setSampleComponent(new ColorSample(200,20)); pack(); } @Override public void dispose() { super.dispose(); if (colors!=null&&changeListener!=null) { //System.out.println("disconnect chooser to colors"); colors.removeChangeListener(changeListener); } } public ColorImageModel getColorImageModel() { return imagePanel.getColorImageModel(); } public void setColorImageModel(ColorImageModel m) { imagePanel.setColorImageModel(m); } public void setSampleComponent(SampleComponent sample) { if (colorSample!=null) { if (!preview) remove(colorSample); } this.colorSample=sample; sample.setColor(getColor()); if (preview) cc.setPreviewPanel(sample); else add(colorSample,colorSampleGBC); } public SampleComponent getSampleComponent(SampleComponent c) { return colorSample; } public void setColor(Color color) { cc.setColor(color); } public ColorSelectionModel getSelectionModel() { return cc.getSelectionModel(); } public Color getColor() { return cc.getColor(); } private class ColorListener implements ChangeListener { public void stateChanged(ChangeEvent e) { ColorSelectionModel m=(ColorSelectionModel)e.getSource(); colorSample.setColor(m.getSelectedColor()); } } ////////////////////////////////////////////////////////////////////// // color sample ////////////////////////////////////////////////////////////////////// public static abstract class SampleComponent extends JComponent { public abstract void setColor(Color c); } public static class ColorSample extends SampleComponent { private Color color; private int width; private int height; public ColorSample(int width, int height) { setBorder(new BevelBorder(BevelBorder.RAISED)); setSize(width, height); setPreferredSize(new Dimension(width, height)); this.width=width; this.height=height; } public void setColor(Color c) { this.color=c; repaint(); } @Override protected void paintComponent(Graphics g) { g.setColor(color); Insets o=getInsets(); g.fillRect(o.left, o.top, getWidth()-o.left-o.right, getHeight()-o.bottom-o.top); } } ////////////////////////////////////////////////////////////////////// // main ////////////////////////////////////////////////////////////////////// public static void main(String[] args) { //Schedule a job for the event dispatch thread: //creating and showing this application's GUI. SwingUtilities.invokeLater(new Runnable() { public void run() { JDialog frame=new ColorChooser(); frame.setVisible(true); } }); } }