001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.gui.layer.markerlayer;
003    
004    import java.awt.BorderLayout;
005    import java.awt.Cursor;
006    import java.awt.Image;
007    import java.awt.event.ActionEvent;
008    import java.awt.event.ActionListener;
009    import java.net.URL;
010    
011    import javax.swing.Icon;
012    import javax.swing.ImageIcon;
013    import javax.swing.JDialog;
014    import javax.swing.JLabel;
015    import javax.swing.JOptionPane;
016    import javax.swing.JPanel;
017    import javax.swing.JScrollPane;
018    import javax.swing.JToggleButton;
019    import javax.swing.JViewport;
020    
021    import org.openstreetmap.josm.Main;
022    import org.openstreetmap.josm.data.coor.LatLon;
023    import org.openstreetmap.josm.tools.ImageProvider;
024    
025    /**
026     * Marker representing an image. Uses a special icon, and when clicked,
027     * displays an image view dialog. Re-uses some code from GeoImageLayer.
028     *
029     * @author Frederik Ramm <frederik@remote.org>
030     *
031     */
032    public class ImageMarker extends ButtonMarker {
033    
034        public URL imageUrl;
035    
036        public ImageMarker(LatLon ll, URL imageUrl, MarkerLayer parentLayer, double time, double offset) {
037            super(ll, "photo.png", parentLayer, time, offset);
038            this.imageUrl = imageUrl;
039        }
040    
041        @Override public void actionPerformed(ActionEvent ev) {
042            final JPanel p = new JPanel(new BorderLayout());
043            final JScrollPane scroll = new JScrollPane(new JLabel(loadScaledImage(imageUrl, 580)));
044            final JViewport vp = scroll.getViewport();
045            p.add(scroll, BorderLayout.CENTER);
046    
047            final JToggleButton scale = new JToggleButton(ImageProvider.get("misc", "rectangle"));
048    
049            JPanel p2 = new JPanel();
050            p2.add(scale);
051            p.add(p2, BorderLayout.SOUTH);
052            scale.addActionListener(new ActionListener(){
053                public void actionPerformed(ActionEvent ev) {
054                    p.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
055                    if (scale.getModel().isSelected()) {
056                        ((JLabel)vp.getView()).setIcon(loadScaledImage(imageUrl, Math.max(vp.getWidth(), vp.getHeight())));
057                    } else {
058                        ((JLabel)vp.getView()).setIcon(new ImageIcon(imageUrl));
059                    }
060                    p.setCursor(Cursor.getDefaultCursor());
061                }
062            });
063            scale.setSelected(true);
064            JOptionPane pane = new JOptionPane(p, JOptionPane.PLAIN_MESSAGE);
065            JDialog dlg = pane.createDialog(Main.parent, imageUrl.toString());
066            dlg.setModal(false);
067            dlg.toFront();
068            dlg.setVisible(true);
069        }
070    
071        private static Icon loadScaledImage(URL u, int maxSize) {
072            Image img = new ImageIcon(u).getImage();
073            int w = img.getWidth(null);
074            int h = img.getHeight(null);
075            if (w>h) {
076                h = Math.round(maxSize*((float)h/w));
077                w = maxSize;
078            } else {
079                w = Math.round(maxSize*((float)w/h));
080                h = maxSize;
081            }
082            return new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH));
083        }
084    
085    }