Statistics
| Revision:

gvsig-projects-pool / org.gvsig.simpleimageviewer / trunk / org.gvsig.simpleimageviewer / org.gvsig.simpleimageviewer.app.mainplugin / src / main / java / org / gvsig / simpleimageviewer / app / mainplugin / ImageViewerControler.java @ 840

History | View | Annotate | Download (7.35 KB)

1

    
2
package org.gvsig.simpleimageviewer.app.mainplugin;
3

    
4
import java.awt.BorderLayout;
5
import java.awt.Graphics2D;
6
import java.awt.Image;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.awt.geom.AffineTransform;
10
import java.awt.image.AffineTransformOp;
11
import java.awt.image.BufferedImage;
12
import java.awt.image.BufferedImageOp;
13
import java.beans.PropertyChangeEvent;
14
import java.beans.PropertyChangeListener;
15
import java.io.File;
16
import java.io.IOException;
17
import java.net.URL;
18
import java.text.NumberFormat;
19
import javax.swing.ImageIcon;
20
import javax.swing.JComponent;
21
import javax.swing.SwingUtilities;
22
import org.apache.commons.io.FilenameUtils;
23
import org.gvsig.imageviewer.ImageViewer;
24
import org.gvsig.tools.ToolsLocator;
25
import org.gvsig.tools.i18n.I18nManager;
26
import org.gvsig.tools.swing.api.ToolsSwingLocator;
27
import org.gvsig.tools.swing.api.ToolsSwingManager;
28
import org.gvsig.tools.swing.icontheme.IconTheme;
29
import org.gvsig.tools.swing.icontheme.IconThemeManager;
30
import org.jdesktop.swingx.JXImageView;
31

    
32

    
33
public class ImageViewerControler extends ImageViewerView implements ImageViewer {
34

    
35
    private static final int ROTATE_RIGHT = 0;
36
    private static final int ROTATE_LEFT = 1;
37
    
38
    private JXImageView imageView;
39
    
40
    public ImageViewerControler() {
41
        this.initComponents();
42
    }
43
    
44
    private void initComponents() {
45
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
46
        
47
        this.imageView = new JXImageView();
48
        this.ImageContainer.setLayout(new BorderLayout());
49
        this.ImageContainer.add(this.imageView,BorderLayout.CENTER);
50
        
51
        toolsSwingManager.translate(this.btnZoomIn);
52
        toolsSwingManager.translate(this.btnZoomOut);
53
        toolsSwingManager.translate(this.btnRotateLeft);
54
        toolsSwingManager.translate(this.btnRotateRight);
55
        toolsSwingManager.translate(this.btnFit);
56
        toolsSwingManager.translate(this.btnZoom1_1);
57
        
58
        this.btnRotateLeft.addActionListener(new ActionListener() {
59
            @Override
60
            public void actionPerformed(ActionEvent e) {
61
                rotate(ROTATE_LEFT);
62
            }
63
        });
64
        
65
        this.btnRotateRight.addActionListener(new ActionListener() {
66
            @Override
67
            public void actionPerformed(ActionEvent e) {
68
                rotate(ROTATE_RIGHT);
69
            }
70
        });
71
        
72
        this.btnFit.addActionListener(new ActionListener() {
73
            @Override
74
            public void actionPerformed(ActionEvent e) {
75
                adjustScale();
76
            }
77
        });
78
        
79
        this.btnZoom1_1.addActionListener(new ActionListener() {
80
            @Override
81
            public void actionPerformed(ActionEvent e) {
82
                imageView.setScale(1.0);
83
            }
84
        });
85
        
86
        this.btnZoomIn.addActionListener(new ActionListener() {
87
            @Override
88
            public void actionPerformed(ActionEvent e) {
89
                imageView.setScale(imageView.getScale()*2);
90
            }
91
        });
92
        
93
        this.btnZoomOut.addActionListener(new ActionListener() {
94
            @Override
95
            public void actionPerformed(ActionEvent e) {
96
                imageView.setScale(imageView.getScale()*0.5);
97
            }
98
        });
99
        
100
        this.imageView.addPropertyChangeListener("scale", new PropertyChangeListener() {
101
            @Override
102
            public void propertyChange(PropertyChangeEvent evt) {
103
                onChangeScale();
104
            }
105
        });
106
    }
107

    
108
    @Override
109
    public ImageIcon loadImage(String imageName) {
110
        String iconName = FilenameUtils.getBaseName(imageName);
111
        IconThemeManager iconThemeManager = ToolsSwingLocator.getIconThemeManager();
112
        IconTheme theme = iconThemeManager.getCurrent();
113
        if( theme.exists(iconName) ) {
114
            return theme.get(iconName);
115
        }
116
        return super.loadImage(imageName); 
117
    }
118

    
119
    
120
    private void rotate(int mode) {
121
        double scale = imageView.getScale();
122
        Image img = imageView.getImage();
123
        BufferedImage src = new BufferedImage(
124
                    img.getWidth(null),
125
                    img.getHeight(null), 
126
                    BufferedImage.TYPE_INT_ARGB);
127
        BufferedImage dst = new BufferedImage(
128
                    img.getHeight(null), 
129
                    img.getWidth(null),
130
                    BufferedImage.TYPE_INT_ARGB);
131
        Graphics2D g = (Graphics2D)src.getGraphics();
132

    
133
        try {
134
            // smooth scaling
135
            g.drawImage(img, 0, 0, null);
136
        } finally {
137
            g.dispose();
138
        }
139

    
140
        AffineTransform trans;
141
        switch(mode) {
142
        case ROTATE_RIGHT:
143
            trans = AffineTransform.getRotateInstance(Math.PI/2,0,0);
144
            trans.translate(0,-src.getHeight());
145
            break;
146
        default:
147
        case ROTATE_LEFT:
148
            trans = AffineTransform.getRotateInstance(-Math.PI/2,0,0);
149
            trans.translate(-src.getWidth(),0);
150
            break;
151
        }
152
        BufferedImageOp op = new AffineTransformOp(trans, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
153
        op.filter(src,dst);
154
        imageView.setImage(dst);            
155
        imageView.setScale(scale);
156
    }
157
    
158
    private void onChangeScale() {
159
        I18nManager i18n = ToolsLocator.getI18nManager();
160
        NumberFormat nf = NumberFormat.getNumberInstance();
161
        nf.setMaximumFractionDigits(3);
162
        nf.setMinimumFractionDigits(3);
163
        String scale = nf.format(this.imageView.getScale());
164
        this.lblMessages.setText(i18n.getTranslation("_Scale_{0}", new String[] {scale}));
165
    }
166
    
167
    private void adjustScale() {
168
        try {
169
            double sx;
170
            double sy;
171
            sx = (double)this.getWidth() / this.imageView.getImage().getWidth(null);
172
            sy = (double)this.getHeight() / this.imageView.getImage().getHeight(null);
173
            if( sx > sy ) {
174
                this.imageView.setScale(sy);
175
            } else {
176
                this.imageView.setScale(sx);
177
            }
178
        } catch(Exception ex) {
179
            // Ignore exception, don't crash
180
        }
181
    }
182
    
183
    @Override
184
    public void clean() {
185
        this.imageView.setImage((Image)null);
186
    }
187
    
188
    @Override
189
    public void setImage(final Image image) {
190
        imageView.setImage(image);
191
        onChangeScale();
192
        adjustScale();
193
        SwingUtilities.invokeLater(new Runnable() {
194
            @Override
195
            public void run() {
196
                adjustScale();
197
            }
198
        });
199
    }
200
    
201
    @Override
202
    public void setImage(URL url) {
203
        try {
204
            this.imageView.setImage(url);
205
        } catch (IOException ex) {
206
            throw new IllegalArgumentException(ex);
207
        }
208
        onChangeScale();
209
        SwingUtilities.invokeLater(new Runnable() {
210
            @Override
211
            public void run() {
212
                adjustScale();
213
            }
214
        });
215
    }
216

    
217
    @Override
218
    public void setImage(File file) {
219
        try {
220
            this.imageView.setImage(file);
221
        } catch (IOException ex) {
222
            throw new IllegalArgumentException(ex);
223
        }
224
        onChangeScale();
225
        SwingUtilities.invokeLater(new Runnable() {
226
            @Override
227
            public void run() {
228
                adjustScale();
229
            }
230
        });
231
    }
232

    
233
    @Override
234
    public JComponent asJComponent() {
235
        return this;
236
    }
237
}