/* * @(#)ColorSwatch.java * * $Date: 2012-07-03 01:10:05 -0500 (Tue, 03 Jul 2012) $ * * Copyright (c) 2011 by Jeremy Wood. * 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. * * This software is probably, but not necessarily, discussed here: * http://javagraphics.java.net/ * * That site should also contain the most recent official version * of this software. (See the SVN repository for more details.) */ package ale.util.colors.bric.swing; 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; import ale.util.colors.bric.plaf.PlafPaintUtils; /** * 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.) * */ 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 (ColorSwatch.this.menu == null) { ColorSwatch.this.menu = new JPopupMenu(); ColorSwatch.this.copyItem = new JMenuItem(ColorPicker.strings.getObject("Copy").toString()); ColorSwatch.this.menu.add(ColorSwatch.this.copyItem); ColorSwatch.this.copyItem.addActionListener(ColorSwatch.this.actionListener); } ColorSwatch.this.menu.show(ColorSwatch.this, e.getX(), e.getY()); } } }; ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if (src == ColorSwatch.this.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) { this.w = width; setBackground(new Color(250, 0, 0)); setPreferredSize(new Dimension(width, width)); setMinimumSize(new Dimension(width, width)); addMouseListener(this.mouseListener); } public ColorSwatch(Color color, int width) { this(width); setForeground(color); } 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); // may be necessary for some look-and-feels? Graphics2D g = (Graphics2D) g0; Color c = getForeground(); int w2 = Math.min(getWidth(), this.w); int h2 = Math.min(getHeight(), this.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); PlafPaintUtils.drawBevel(g, r); } }