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    }