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 }