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 }