/*
* Get Organized - Organize your schedule, course assignments, and grades
* Copyright © 2012 Alex Laird
* getorganized@alexlaird.com
* alexlaird.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* @(#)ColorPicker.java 1.0 2008-03-01
*
* Copyright (c) 2008 Jeremy Wood
* E-mail: mickleness@gmail.com
* All rights reserved.
*
* The copyright of this software is owned by Jeremy Wood.
* You may not use, copy or modify this software, except in
* accordance with the license agreement you entered into with
* Jeremy Wood. For details see accompanying license terms.
*/
package adl.go.gui.colorpicker;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.Toolkit;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
/**
* This is a square, opaque panel used to indicate a certain color. <P>The color
* is assigned with the
* <code>setForeground()</code> method. <P>Also the user can right-click this
* panel and select 'Copy' to send a 100x100 image of this color to the
* clipboard. (This feature was added at the request of a friend who paints; she
* wanted to select a color and then quickly print it off, and then mix her
* paints to match that shade.)
*
* @version 1.0
* @author Jeremy Wood
*/
public class ColorSwatch extends JPanel
{
private static final long serialVersionUID = 1L;
JPopupMenu menu;
JMenuItem copyItem;
MouseListener mouseListener = new MouseAdapter ()
{
@Override
public void mousePressed(MouseEvent e)
{
if (e.isPopupTrigger ())
{
if (menu == null)
{
menu = new JPopupMenu ();
copyItem = new JMenuItem ("Copy");
menu.add (copyItem);
copyItem.addActionListener (actionListener);
}
menu.show (ColorSwatch.this, e.getX (), e.getY ());
}
}
};
ActionListener actionListener = new ActionListener ()
{
@Override
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource ();
if (src == copyItem)
{
BufferedImage image = new BufferedImage (100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics ();
g.setColor (getBackground ());
g.fillRect (0, 0, image.getWidth (), image.getHeight ());
g.dispose ();
Transferable contents = new ImageTransferable (image);
Toolkit.getDefaultToolkit ().getSystemClipboard ().setContents (contents, null);
}
}
};
int w;
public ColorSwatch(int width)
{
w = width;
setPreferredSize (new Dimension (width, width));
setMinimumSize (new Dimension (width, width));
addMouseListener (mouseListener);
}
private static TexturePaint checkerPaint = null;
private static TexturePaint getCheckerPaint()
{
if (checkerPaint == null)
{
int t = 8;
BufferedImage bi = new BufferedImage (t * 2, t * 2, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics ();
g.setColor (Color.white);
g.fillRect (0, 0, 2 * t, 2 * t);
g.setColor (Color.lightGray);
g.fillRect (0, 0, t, t);
g.fillRect (t, t, t, t);
checkerPaint = new TexturePaint (bi, new Rectangle (0, 0, bi.getWidth (), bi.getHeight ()));
}
return checkerPaint;
}
@Override
public void paint(Graphics g0)
{
super.paint (g0);
Graphics2D g = (Graphics2D) g0;
Color c = getForeground ();
int w2 = Math.min (getWidth (), w);
int h2 = Math.min (getHeight (), w);
Rectangle r = new Rectangle (getWidth () / 2 - w2 / 2, getHeight () / 2 - h2 / 2, w2, h2);
if (c.getAlpha () < 255)
{
TexturePaint checkers = getCheckerPaint ();
g.setPaint (checkers);
g.fillRect (r.x, r.y, r.width, r.height);
}
g.setColor (c);
g.fillRect (r.x, r.y, r.width, r.height);
PaintUtils.drawBevel (g, r);
}
}