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 EVolve.visualization.*;
012    import EVolve.Scene;
013    import javax.swing.*;
014    import javax.swing.event.InternalFrameAdapter;
015    import javax.swing.event.InternalFrameEvent;
016    import java.awt.*;
017    import java.awt.image.BufferedImage;
018    
019    
020    public class Magnifier {
021        private JInternalFrame window;
022        private JDesktopPane desktop;
023        private AxesPanel magnifiedPanel;
024        private ReferenceDimension xAxis, yAxis;
025    
026        public Magnifier() {
027            window = null;
028            desktop = Scene.getUIManager().getDesktop();
029            xAxis = null;
030            yAxis = null;
031        }
032    
033        public void setAxises(ReferenceDimension xAxis, ReferenceDimension yAxis) {
034            this.xAxis = xAxis;
035            this.yAxis = yAxis;
036        }
037    
038        public void showWindow(AutoImage image, int[][] value,int x, int y) {
039            AutoImage enlargedImage = new AutoImage();
040    
041            Rectangle rect = new Rectangle(x-10,y-10,20,20);
042    
043            enlargedImage = new AutoImage();
044            for (int i = -1*rect.width/2; i<rect.width/2; i++) {
045                for (int j = -1*rect.height/2; j<rect.height/2; j++) {
046                        enlargedImage.setColor(i+rect.width/2,j+rect.height/2,image.getSortedColor(xAxis,yAxis,x+i,y+j));
047                }
048            }
049    
050            if (window == null) {
051                window = new JInternalFrame("Zoomed View");
052                window.addInternalFrameListener(new InternalFrameAdapter() {
053                    public void internalFrameClosing(InternalFrameEvent e) {
054                        window = null;
055                    }
056                });
057                /*window.addInternalFrameListener(new InternalFrameAdapter() {
058                    public void internalFrameDeactivated(InternalFrameEvent e) {
059                        cleanup();
060                    }
061                });*/
062                window.setClosable(true);
063                magnifiedPanel = new AxesPanel(false);
064                magnifiedPanel.drawPointer(true);
065                window.setBounds(desktop.getSize().width - 400, 0, 300, 300);
066                window.setResizable(true);
067                desktop.add(window);
068            }
069            window.moveToFront();
070            window.setVisible(true);
071            window.getContentPane().add(magnifiedPanel);
072            BufferedImage bufferedImage = enlargedImage.getImage();
073            magnifiedPanel.setImage(bufferedImage);
074            // calculate the position for pointer in the magnifier window
075            int w = magnifiedPanel.getWidth();
076            int h = magnifiedPanel.getHeight();
077            int guessedPointerX = (rect.width/2)*w/bufferedImage.getWidth();
078            int guessedPointerY = h-(rect.height/2)*h/bufferedImage.getHeight();
079    
080            for (int i = guessedPointerX-20; i< guessedPointerX+20; i++) {
081                if (magnifiedPanel.getImageX(i) == rect.width/2) {
082                    guessedPointerX = i;
083                    break;
084                }
085            }
086    
087            for (int i = guessedPointerY-20; i< guessedPointerY+20; i++) {
088                if (magnifiedPanel.getImageY(i) == rect.height/2) {
089                    guessedPointerY = i;
090                    break;
091                }
092            }
093            magnifiedPanel.setPointerPosition(guessedPointerX+2, guessedPointerY);
094            magnifiedPanel.repaint();
095            if (!window.isVisible()) {
096                try {
097                    window.show();
098                    window.setVisible(true);
099                } catch (Exception e) {}
100            }
101    
102        }
103    
104        public void cleanup() {
105            try {
106                    window.dispose();
107                    window.setVisible(false);
108                    window = null;
109            } catch (Exception e) {}
110        }
111    }