package org.netbeans.modules.desktopsampler.ui; import java.awt.AWTException; import java.awt.Color; import java.awt.Cursor; import java.awt.Image; import java.awt.Insets; import java.awt.Point; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.util.ResourceBundle; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; import org.openide.windows.WindowManager; /** * A simple desktop color sampler. Drag mouse from the color sample * label and release mouse anywhere on desktop to sample color at that * point. * * Note: Uses java.awt.Robot. * * @author Sandip V. Chitale * @version 1.0 */ public class ColorSampler extends JToolBar { static ImageIcon COLOR_SAMPLER_ICON = new ImageIcon(ColorSampler.class.getResource("ColorSampler.gif")); // NOI18N static ImageIcon FORMAT_ICON = new ImageIcon(ColorSampler.class.getResource("Format.gif")); // NOI18N private static final Image DROPPER_IMAGE = new ImageIcon(ColorSampler.class.getResource("Dropper.gif")).getImage(); // NOI18N private static final Cursor DROPPER_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor(DROPPER_IMAGE, new Point(9, 22), "Dropper"); // NOI18N private JLabel sampleColorLabel; private JLabel colorPreviewLabel; private JTextField colorValueField; private JButton formatButton; private Robot robot; private static int index = 0; private static final int POUND_XXXXXX = index++; private static final int RGB_PAREN_RGB = index++; private static final int NEW_COLOR_RGB = index++; private static final int XXXXXX = index++; private static final int SQUARE_BRACKET_RGB = index++; private static final int RGB = index++; private static final int[] COLOR_FORMAT_INDICES = { POUND_XXXXXX , RGB_PAREN_RGB , NEW_COLOR_RGB , XXXXXX , SQUARE_BRACKET_RGB , RGB , }; private static String[] COLOR_FORMATS = new String[COLOR_FORMAT_INDICES.length]; static { COLOR_FORMATS[POUND_XXXXXX ] = "#XXXXXX"; // NOI18N e.g. #FFFFFF COLOR_FORMATS[RGB_PAREN_RGB ] = "rgb(r, g, b)"; // NOI18N e.g. rgb(r, g, b) COLOR_FORMATS[NEW_COLOR_RGB ] = "new Color(r, g, b)"; // NOI18N e.g. new Color(255, 255, 255) COLOR_FORMATS[XXXXXX ] = "XXXXXX"; // NOI18N e.g. FFFFFF COLOR_FORMATS[SQUARE_BRACKET_RGB ] = "[r, g, b]"; // NOI18N e.g. [r, g, b] COLOR_FORMATS[RGB ] = "r, g, b"; // NOI18N e.g. r,g,b }; private String colorFormat = COLOR_FORMATS[0]; /** * Creates a new ColorSampler instance. * */ public ColorSampler() { try { robot = new Robot(); } catch (AWTException e) { System.err.println(e); System.exit(1); } setFloatable(false); sampleColorLabel = new JLabel(COLOR_SAMPLER_ICON, JLabel.CENTER) { public Point getToolTipLocation(MouseEvent mouseEvent) { Point point = mouseEvent.getPoint(); point.y += 20; return point; } }; sampleColorLabel.setBorder(BorderFactory.createEmptyBorder(1,2,1,2)); sampleColorLabel.setToolTipText(ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("TOOLTIP_ColorSampler")); // NOI18N add(sampleColorLabel); colorPreviewLabel = new JLabel(" "); // NOI18N colorPreviewLabel.setOpaque(true); colorPreviewLabel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.gray), BorderFactory.createEmptyBorder(3,3,3,3))); add(colorPreviewLabel); colorValueField = new JTextField(16); colorValueField.setDragEnabled(true); colorValueField.setEditable(false); add(colorValueField); formatButton = new JButton(FORMAT_ICON); formatButton.setMargin(new Insets(1,1,1,1)); formatButton.setBorderPainted(false); formatButton.setFocusPainted(false); formatButton.setRolloverEnabled(true); formatButton.setToolTipText(ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("TOOLTIP_SelectColorFormat")); // NOI18N add(formatButton); formatButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String newColorFormat = (String) JOptionPane.showInputDialog( WindowManager.getDefault().getMainWindow(), ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("Select_color_format"), // NOI18N ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("Color_format"), // NOI18N JOptionPane.PLAIN_MESSAGE, FORMAT_ICON, COLOR_FORMATS, colorFormat); if (newColorFormat != null) { colorFormat = newColorFormat; showColor(colorPreviewLabel.getBackground(), false); } } }); showColor(colorPreviewLabel.getBackground(), false); sampleColorLabel.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent me) { SwingUtilities.getWindowAncestor(ColorSampler.this).setCursor(DROPPER_CURSOR); } public void mouseReleased(MouseEvent me) { Point p = me.getPoint(); SwingUtilities.convertPointToScreen(p, me.getComponent()); sampleColorAtPoint(p, false); SwingUtilities.getWindowAncestor(ColorSampler.this).setCursor(Cursor.getDefaultCursor()); } }); sampleColorLabel.addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent me) { Point p = me.getPoint(); SwingUtilities.convertPointToScreen(p, me.getComponent()); sampleColorAtPoint(p, true); SwingUtilities.getWindowAncestor(ColorSampler.this).setCursor(DROPPER_CURSOR); } }); } public JLabel getColorPreviewLabel() { return colorPreviewLabel; } public Color getSelectedColor() { return colorPreviewLabel.getBackground(); } public void setSelectedColor(Color color) { if (color.equals(getSelectedColor())) { return; } showColor(color, false); } public String getSelectedColorString() { return format(getSelectedColor()); } public void sampleColorAtPoint(Point p, boolean temporary) { showColor(robot.getPixelColor(p.x, p.y), temporary); } void showColor(Color color, boolean temporary) { colorPreviewLabel.setBackground(color); colorValueField.setText(format(color)); SwingUtilities.invokeLater( new Runnable() { public void run() { colorValueField.selectAll(); colorValueField.getCaret().setSelectionVisible(true); } } ); //if (!temporary) { fireStateChanged(); //} } public String format(Color color) { if (colorFormat.equals(COLOR_FORMATS[POUND_XXXXXX])) { return "#" + hex(color.getRed()) + hex(color.getGreen()) + hex(color.getBlue()); // NOI18N } else if (colorFormat.equals(COLOR_FORMATS[RGB_PAREN_RGB])) { return "rgb(" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + ")"; // NOI18N } else if (colorFormat.equals(COLOR_FORMATS[NEW_COLOR_RGB])) { return "new Color(" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + ")"; // NOI18N } else if (colorFormat.equals(COLOR_FORMATS[XXXXXX])) { return hex(color.getRed()) + hex(color.getGreen()) + hex(color.getBlue()); } else if (colorFormat.equals(COLOR_FORMATS[SQUARE_BRACKET_RGB])) { return "[" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + "]"; // NOI18N } else if (colorFormat.equals(COLOR_FORMATS[RGB])) { return "" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + ""; // NOI18N } return "new Color(" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + ")"; // NOI18N } private String hex(int i) { String h = Integer.toHexString(i); if (i < 10) { h = "0" + h; // NOI18N } return h.toUpperCase(); } /** * Only one ChangeEvent is needed per model instance * since the event's only (read-only) state is the source property. * The source of events generated here is always "this". */ protected transient ChangeEvent changeEvent = null; protected EventListenerList listenerList = new EventListenerList(); /** * Adds a ChangeListener to the model. * * @param l the ChangeListener to be added */ public void addChangeListener(ChangeListener l) { listenerList.add(ChangeListener.class, l); } /** * Removes a ChangeListener from the model. * @param l the ChangeListener to be removed */ public void removeChangeListener(ChangeListener l) { listenerList.remove(ChangeListener.class, l); } /** * Returns an array of all the ChangeListeners added * to this DefaultColorSelectionModel with * addChangeListener. * * @return all of the ChangeListeners added, or an empty * array if no listeners have been added * @since 1.4 */ public ChangeListener[] getChangeListeners() { return (ChangeListener[])listenerList.getListeners( ChangeListener.class); } /** * Runs each ChangeListener's * stateChanged method. * * * @see EventListenerList */ protected void fireStateChanged() { Object[] listeners = listenerList.getListenerList(); for (int i = listeners.length - 2; i >= 0; i -=2 ) { if (listeners[i] == ChangeListener.class) { if (changeEvent == null) { changeEvent = new ChangeEvent(this); } ((ChangeListener)listeners[i+1]).stateChanged(changeEvent); } } } /** * ColorSampler test. * * @param args a String[] value */ public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { System.err.println(e); } JFrame frame = new JFrame(ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("Desktop_Color_Sampler")); // NOI18N frame.setContentPane(new ColorSampler()); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }