*
* @param button magnifier display button
*/
private void initializeMagnifier ( final WebToggleButton button )
{
final WebGlassPane glassPane = GlassPaneManager.getGlassPane ( StyleEditor.this );
final JComponent zoomProvider = SwingUtils.getRootPane ( StyleEditor.this ).getLayeredPane ();
button.addActionListener ( new ActionListener ()
{
private boolean visible = false;
private AWTEventListener listener;
private WebTimer forceUpdater;
@Override
public void actionPerformed ( final ActionEvent e )
{
performAction ();
}
protected void performAction ()
{
if ( !visible )
{
visible = true;
if ( forceUpdater == null || listener == null )
{
forceUpdater = new WebTimer ( 200, new ActionListener ()
{
@Override
public void actionPerformed ( final ActionEvent e )
{
updateMagnifier ();
}
} );
listener = new AWTEventListener ()
{
@Override
public void eventDispatched ( final AWTEvent event )
{
SwingUtilities.invokeLater ( new Runnable ()
{
@Override
public void run ()
{
if ( visible )
{
forceUpdater.restart ();
updateMagnifier ();
}
}
} );
}
};
}
Toolkit.getDefaultToolkit ().addAWTEventListener ( listener, AWTEvent.MOUSE_MOTION_EVENT_MASK );
Toolkit.getDefaultToolkit ().addAWTEventListener ( listener, AWTEvent.MOUSE_WHEEL_EVENT_MASK );
Toolkit.getDefaultToolkit ().addAWTEventListener ( listener, AWTEvent.MOUSE_EVENT_MASK );
updateMagnifier ();
setCursor ( SystemUtils.getTransparentCursor () );
}
else
{
visible = false;
Toolkit.getDefaultToolkit ().removeAWTEventListener ( listener );
forceUpdater.stop ();
hideMagnifier ();
setCursor ( Cursor.getDefaultCursor () );
}
}
protected void updateMagnifier ()
{
final Point mp = MouseInfo.getPointerInfo ().getLocation ();
final Rectangle gb = SwingUtils.getBoundsOnScreen ( glassPane );
if ( gb.contains ( mp ) )
{
final Point gp = gb.getLocation ();
final int mx = mp.x - gp.x - magnifier.getWidth () / 2;
final int my = mp.y - gp.y - magnifier.getHeight () / 2;
final int w = 162 / zoomFactor;
final BufferedImage image = ImageUtils.createCompatibleImage ( w, w, Transparency.TRANSLUCENT );
final Graphics2D g2d = image.createGraphics ();
g2d.translate ( -( mp.x - gp.x - w / 2 ), -( mp.y - gp.y - w / 2 ) );
zoomProvider.paintAll ( g2d );
g2d.dispose ();
final BufferedImage finalImage = ImageUtils.createCompatibleImage ( 220, 220, Transparency.TRANSLUCENT );
final Graphics2D g = finalImage.createGraphics ();
g.setClip ( new Ellipse2D.Double ( 29, 29, 162, 162 ) );
g.drawImage ( image, 29, 29, 162, 162, null );
g.setClip ( null );
g.drawImage ( magnifier, 0, 0, null );
g.dispose ();
glassPane.setPaintedImage ( finalImage, new Point ( mx, my ) );
}
else
{
hideMagnifier ();
}
}
protected void hideMagnifier ()
{
glassPane.setPaintedImage ( null, null );
}
} );
}