package org.netbeans.modules.desktopsampler.ui; import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; 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.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * A simple desktop magnifier. Drag mouse from the magnifier label and * release mouse anywhere on desktop to sample an area of 16x16 at * that point. The magnification scale of 1:1 to 1:16 is supported. * * Note: Uses java.awt.Robot. * * @author Sandip V. Chitale */ public class Magnifier extends JPanel { static ImageIcon MAGNIFIER_ICON = new ImageIcon(Magnifier.class.getResource("Magnifier.gif")); private JLabel magnifiedLabel; private JSlider zoomer; private Robot robot; private static final int ZOOMED_DIAMETER = 256; private int DEFAULT_DIAMETER = 16; private int diameter; private int radius; private static final Image MAGNIFIER_IMAGE = MAGNIFIER_ICON.getImage(); private static final Cursor MAGNIFIER_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor(MAGNIFIER_IMAGE, new Point(15, 15), "Magnifier"); /** * Creates a new Magnifier instance. * */ public Magnifier() { try { robot = new Robot(); } catch (AWTException e) { System.err.println(e); System.exit(1); } setLayout(new BorderLayout()); magnifiedLabel = new JLabel(); magnifiedLabel.setOpaque(true); magnifiedLabel.setBorder( BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.black, 1), BorderFactory.createEmptyBorder(1,1,1,1))); add(magnifiedLabel, BorderLayout.WEST); magnifiedLabel.setToolTipText(ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("TOOLTIP_Magnifier")); magnifiedLabel.addMouseListener( new MouseAdapter() { public void mousePressed(MouseEvent me) { SwingUtilities.getWindowAncestor(Magnifier.this).setCursor(MAGNIFIER_CURSOR); } public void mouseReleased(MouseEvent me) { Point p = me.getPoint(); SwingUtilities.convertPointToScreen(p, me.getComponent()); magnifierAtPoint(p, false); SwingUtilities.getWindowAncestor(Magnifier.this).setCursor(Cursor.getDefaultCursor()); } }); magnifiedLabel.addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged(MouseEvent me) { Point p = me.getPoint(); SwingUtilities.convertPointToScreen(p, me.getComponent()); magnifierAtPoint(p, true); SwingUtilities.getWindowAncestor(Magnifier.this).setCursor(MAGNIFIER_CURSOR); } }); zoomer = new JSlider(JSlider.VERTICAL, 1, DEFAULT_DIAMETER, DEFAULT_DIAMETER); zoomer.setMajorTickSpacing(1); zoomer.setSnapToTicks(true); zoomer.setSnapToTicks(true); zoomer.setPaintTicks(true); zoomer.setPaintLabels(true); add(zoomer, BorderLayout.EAST); zoomer.addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent ce) { if (zoomer.getValueIsAdjusting()) { return; } computeMagnification(); } }); zoomer.setValue(ZOOMED_DIAMETER/DEFAULT_DIAMETER); zoomer.setToolTipText(ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("TOOLTIP_Scale")); // NOI18N computeMagnification(); showMagnified(MAGNIFIER_ICON.getImage(), false); } public void magnifierAtPoint(Point p, boolean temporary) { Rectangle rect = new Rectangle(p.x-radius, p.y-radius, diameter, diameter); showMagnified(robot.createScreenCapture(rect), temporary); } private void computeMagnification() { diameter = ZOOMED_DIAMETER/zoomer.getValue(); radius = diameter/2; } void showMagnified(Image image, boolean temporary) { if (image == null) { return; } image = image.getScaledInstance(ZOOMED_DIAMETER, ZOOMED_DIAMETER, (temporary ? Image.SCALE_FAST : Image.SCALE_SMOOTH)); ImageIcon icon = new ImageIcon(image); magnifiedLabel.setIcon(icon); } /** * Magnifier 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(java.util.ResourceBundle.getBundle("org/netbeans/modules/desktopsampler/ui/Bundle").getString("Desktop_Color_Sampler")); frame.setContentPane(new Magnifier()); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }