/* * @(#)VCL.java 2.x.x 17 September 2006 * * Copyright 2006 * College of Computer and Information Science * Northeastern University * Boston, MA 02115 * * The Java Power Tools software may be used for educational * purposes as long as this copyright notice is retained intact * at the top of all source files. * * To discuss possible commercial use of this software, * contact Richard Rasala at Northeastern University, * College of Computer and Information Science, * 617-373-2462 or rasala@ccs.neu.edu. * * The Java Power Tools software has been designed and built * in collaboration with Viera Proulx and Jeff Raab. * * Should this software be modified, the words "Modified from * Original" must be included as a comment below this notice. * * All publication rights are retained. This software or its * documentation may not be published in any media either * in whole or in part without explicit permission. * * This software was created with support from Northeastern * University and from NSF grant DUE-9950829. */ // package edu.neu.ccs.gui; import edu.neu.ccs.*; import edu.neu.ccs.gui.*; import edu.neu.ccs.util.*; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; /** *

Class VCL displays the named colors as defined * in class Colors using a square color swatch and 3 * labels with the name, the RGBA value, and the hex color value.

* *

The class also provides a ColorView so one can * experiment with colors defined by RGBA or hex.

* *

The programmer has some control of the swatch size and pane * height.

* *

Although this panel is intended primarily for user * information, it is possible to use this panel as a control * by querying the ColorView state or * by attaching listeners to the ColorView * that is returned by getColorView().

* *

This class is an elaboration of the class * VisualColorList in JPT and is likely * to replace that class in the next release of JPT.

* * @author Richard Rasala */ public class VCL extends DisplayPanel { /** The minimum swatch size. */ private static final int MIN_SWATCH = 20; /** The default swatch size. */ private static final int DEF_SWATCH = 25; /** The maximum swatch size. */ private static final int MAX_SWATCH = 50; /** The standard border size. */ private static final int BORDER_SIZE = PaintSwatch.BORDER_SIZE; /** The standard swatch border. */ private static final Border BORDER = PaintSwatch.BLACK_BORDER; /** The internal table panel horizontal gap. */ private static final int HGAP = 12; /** The internal table panel vertical gap. */ private static final int VGAP = 6; /** The maximum width of the viewport of the list scroll pane. */ private static final int MAX_WIDTH = 720; /** The minimum height of the viewport of the list scroll pane. */ private static final int MIN_HEIGHT = 120; /** The default height of the viewport of the list scroll pane. */ private static final int DEF_HEIGHT = 525; /** The maximum height of the viewport of the list scroll pane. */ private static final int MAX_HEIGHT = 800; /** * The swatch size that must be between * MIN_SWATCH and MAX_SWATCH. */ private int swatchSize = DEF_SWATCH; /** * The pane height that must be between * MIN_HEIGHT and MAX_HEIGHT. */ private int paneHeight = DEF_HEIGHT; /** The array of color names. */ private String[] nameArray = null; /** The array of color rgba values. */ private String[] rgbaArray = null; /** The array of color rgba values in hex. */ private String[] hexArray = null; /** The color scroll pane. */ private JPTScrollPane colorPane = null; /** The color view for experiments. */ private ColorView colorView = null; /** *

The constructor that creates a VCL * using a swatch size of 25 and a scroll pane height * of 525.

* *

Additional height is used for the color view.

*/ public VCL() { this(DEF_SWATCH, DEF_HEIGHT); } /** *

The constructor that creates a VCL * using the given swatch size and a scroll pane height * of 525.

* *

The swatch size will be forced to the range 20-50 * before usage.

* *

Additional height is used for the color view.

* * @param swatchSize the desired swatch size */ public VCL(int swatchSize) { this(swatchSize, DEF_HEIGHT); } /** *

The constructor that creates a VCL * using a the given swatch size and the given scroll * pane height.

* *

The swatch size will be forced to the range 20-50 * before usage.

* *

The pane height will be forced to the range 120-800 * before usage.

* *

Additional height is used for the color view.

* * @param swatchSize the desired swatch size * @param paneHeight the desired pane height */ public VCL(int swatchSize, int paneHeight) { adjustGeometricParameters(swatchSize, paneHeight); fillStringArrays(); colorPane = makeColorPane(); colorView = makeColorView(); Object[] mainStuff = { colorPane, colorView }; VTable mainTable = new VTable(mainStuff, HGAP, VGAP, CENTER); add(mainTable); /** // Debugging code to test the size of the main table Dimension d = table.getPreferredSize(); String message = "Width = " + d.width + " Height = " + d.height; GeneralDialog.showOKDialog(message, ""); */ } /** *

Returns a reference to the ColorView object * used within this panel.

* *

Although this panel is intended primarily for user * information, it is possible to use this panel as a control * by querying the ColorView state or * by attaching listeners to the ColorView * that is returned by this method.

*/ public ColorView getColorView() { return colorView; } /** * Adjust the geometric parameters. * * @param swatchSize the desired swatch size * @param paneHeight the desired pane height */ private void adjustGeometricParameters (int swatchSize, int paneHeight) { swatchSize = (swatchSize >= MIN_SWATCH) ? swatchSize : MIN_SWATCH; swatchSize = (swatchSize <= MAX_SWATCH) ? swatchSize : MAX_SWATCH; this.swatchSize = swatchSize; paneHeight = (paneHeight >= MIN_HEIGHT) ? paneHeight : MIN_HEIGHT; paneHeight = (paneHeight <= MAX_HEIGHT) ? paneHeight : MAX_HEIGHT; int itemHeight = swatchSize + (2 * BORDER_SIZE) + VGAP; paneHeight = itemHeight * (paneHeight / itemHeight); while (paneHeight < MIN_HEIGHT) paneHeight += itemHeight; this.paneHeight = paneHeight; } /** * Fill the string arrays of color names, rgba values, * and rgba values in hex. * * This information produced by this method * is used by makeTableGenerator. */ private void fillStringArrays() { nameArray = Colors.getColorNamesAsArray(); int length = nameArray.length; rgbaArray = new String[length]; hexArray = new String[length]; for (int i = 0; i < length; i++) { Color color = XColor.getColor(nameArray[i]); int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); int a = color.getAlpha(); String rh = Hex.byteToHex((byte)r); String gh = Hex.byteToHex((byte)g); String bh = Hex.byteToHex((byte)b); rgbaArray[i] = r + "," + g + "," + b; hexArray[i] = "#" + rh + gh + bh; if (a < 255) { rgbaArray[i] += "," + a; String ah = Hex.byteToHex((byte)a); hexArray[i] += ah; } } } /** Make the scroll pane with named colors. */ private JPTScrollPane makeColorPane() { // use the string arrays to define the table generator TableGenerator generator = makeTableGenerator(nameArray, rgbaArray, hexArray); // make the scroll pane color table panel int length = nameArray.length; TablePanel colorPanel = new TablePanel(generator, length, 4, HGAP, VGAP, CENTER); // make the enclosing scroll pane JPTScrollPane colorPane = new JPTScrollPane(colorPanel); colorPane.boundViewportPreferredSize(MAX_WIDTH, paneHeight); // add border to scroll pane Border border = Borders.sandwich (Borders.title(" The Standard Named Colors "), Borders.empty(4)); colorPane.setBorder(border); return colorPane; } /** Make the color view pane for experiments. */ private ColorView makeColorView() { int size = this.MAX_SWATCH; Dimension dimension = new Dimension(size, size); ColorView colorView = new ColorView(Color.black, true, dimension); // add border to color view Border border = Borders.sandwich (Borders.title(" Color View for Experiments "), Borders.empty(4)); colorView.setBorder(border); return colorView; } /** * The method to create a swatch based on the given color name * and the encapsulated swatch size. * * This method is used by makeTableGenerator. * * @param name a color name in the table in class Colors */ private PaintSwatch makeSwatch(String name) { return new PaintSwatch (Colors.getColorFromName(name), swatchSize, swatchSize, BORDER); } /** * The method to construct the table generator for the color table. * * @param nameArray the array of color names * @param rgbaArray the array of color rgba values * @param hexArray the array of color rgba values in hex * @return */ private TableGenerator makeTableGenerator (final String[] nameArray, final String[] rgbaArray, final String[] hexArray) { return new TableGenerator() { public Object makeContents(int row, int col) { int length = nameArray.length; if ((row < 0) || (row >= length)) return null; switch (col) { case 0: return makeSwatch(nameArray[row]); case 1: return new JLabel(nameArray[row]); case 2: return new JLabel(rgbaArray[row]); case 3: return new JLabel(hexArray[row]); default: return null; } } }; } public static void main(String[] args) { new VCL().frame("Visual Color List"); } }