001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-9-12 005 * Time: 13:58:40 006 * To change template for new class use 007 * Code Style | Class Templates options (Tools | IDE Options). 008 */ 009 package EVolve.util; 010 011 import java.awt.geom.Point2D; 012 import java.awt.image.BufferedImage; 013 014 import javax.swing.JDesktopPane; 015 import javax.swing.JInternalFrame; 016 import javax.swing.event.InternalFrameAdapter; 017 import javax.swing.event.InternalFrameEvent; 018 019 import EVolve.Scene; 020 import EVolve.visualization.AxesPanel; 021 022 023 public class Magnifier implements Cloneable{ 024 private JInternalFrame window; 025 private JDesktopPane desktop; 026 private AxesPanel magnifiedPanel; 027 private Point2D.Double mousePosition; 028 //private Rectangle imageBounds; 029 private boolean flipImage; 030 031 public Magnifier(boolean flipImage) { 032 window = null; 033 desktop = Scene.getUIManager().getDesktop(); 034 mousePosition = new Point2D.Double(-1,-1); 035 this.flipImage = flipImage; 036 } 037 038 private void createWindow() { 039 if (window == null) { 040 window = new JInternalFrame("Zoomed View"); 041 window.addInternalFrameListener(new InternalFrameAdapter() { 042 public void internalFrameClosing(InternalFrameEvent e) { 043 window = null; 044 } 045 }); 046 /*window.addInternalFrameListener(new InternalFrameAdapter() { 047 public void internalFrameDeactivated(InternalFrameEvent e) { 048 cleanup(); 049 } 050 });*/ 051 window.setClosable(true); 052 int flag = AxesPanel.Pointer_Enabled | AxesPanel.Scale_Image; 053 if (flipImage) 054 flag = flag | AxesPanel.Flip_Image; 055 magnifiedPanel = new AxesPanel(flag); 056 window.setBounds(desktop.getSize().width - 400, 0, 300, 300); 057 window.setResizable(true); 058 window.getContentPane().add(magnifiedPanel); 059 desktop.add(window); 060 mousePosition.setLocation(magnifiedPanel.getWidth()/2,magnifiedPanel.getHeight()/2); 061 } 062 window.moveToFront(); 063 window.setVisible(true); 064 } 065 066 public void showWindow(BufferedImage subImage) { 067 createWindow(); 068 069 int w = magnifiedPanel.getWidth(); 070 int h = magnifiedPanel.getHeight(); 071 if (w*h != 0) { 072 //imageBounds = new Rectangle(0,0,subImage.getWidth(),subImage.getHeight()); 073 074 magnifiedPanel.setImage(subImage); 075 magnifiedPanel.setPointerPosition((int)Math.round(mousePosition.x), (int)Math.round(mousePosition.y)); 076 magnifiedPanel.repaint(); 077 if (!window.isVisible()) { 078 try { 079 window.show(); 080 window.setVisible(true); 081 } catch (Exception e) {} 082 } 083 } 084 } 085 086 public void convertMousePosition(AxesPanel zoomed) { 087 if ((magnifiedPanel == null) || (magnifiedPanel.getWidth() == 0)) { 088 return; 089 } 090 int w = magnifiedPanel.getWidth(), h = magnifiedPanel.getHeight(); 091 092 093 Point2D.Double mousePos = zoomed.getMouseMovement(); 094 //double pixel_x_size = (double)zoomed.getWidth()/imageBounds.getWidth(); 095 //double pixel_y_size = (double)zoomed.getHeight()/imageBounds.getHeight(); 096 097 int guessX = 0, guessY = 0; 098 while (guessX<w) { 099 if (magnifiedPanel.getImageX(guessX) == mousePos.x) break; 100 guessX++; 101 } 102 while (guessY<h){ 103 if (magnifiedPanel.getImageY(guessY) == mousePos.y) break; 104 guessY++; 105 } 106 107 mousePosition.setLocation(guessX+3,guessY+3); 108 } 109 110 public void cleanup() { 111 try { 112 window.dispose(); 113 window.setVisible(false); 114 window = null; 115 } catch (Exception e) {} 116 } 117 118 public Object clone() { 119 Magnifier o = null; 120 try { 121 o = (Magnifier)super.clone(); 122 } catch (CloneNotSupportedException e) { 123 e.printStackTrace(); 124 return null; 125 } 126 o.magnifiedPanel = (AxesPanel)magnifiedPanel.clone(); 127 return o; 128 } 129 }