//$HeadURL$ /*---------------- FILE HEADER ------------------------------------------ This file is part of deegree. Copyright (C) 2001-2008 by: Department of Geography, University of Bonn http://www.giub.uni-bonn.de/deegree/ lat/lon GmbH http://www.lat-lon.de This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Andreas Poth lat/lon GmbH Aennchenstr. 19 53177 Bonn Germany E-Mail: poth@lat-lon.de Prof. Dr. Klaus Greve Department of Geography University of Bonn Meckenheimer Allee 166 53115 Bonn Germany E-Mail: greve@giub.uni-bonn.de ---------------------------------------------------------------------------*/ package org.deegree.igeo.views.swing; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.net.URL; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JLabel; import org.deegree.framework.util.HttpUtils; import org.deegree.framework.util.ImageUtils; import org.deegree.framework.util.StringTools; import org.deegree.graphics.transformation.GeoTransform; import org.deegree.graphics.transformation.WorldToScreenTransform; import org.deegree.igeo.ApplicationContainer; import org.deegree.igeo.ChangeListener; import org.deegree.igeo.ValueChangedEvent; import org.deegree.igeo.commands.model.ZoomCommand; import org.deegree.igeo.config.ViewFormType; import org.deegree.igeo.i18n.Messages; import org.deegree.igeo.io.FileSystemAccess; import org.deegree.igeo.io.FileSystemAccessFactory; import org.deegree.igeo.mapmodel.MapModel; import org.deegree.igeo.mapmodel.MapModelChangedEvent; import org.deegree.igeo.mapmodel.MapModelChangedEvent.CHANGE_TYPE; import org.deegree.igeo.views.DialogFactory; import org.deegree.igeo.views.swing.util.GenericFileChooser.FILECHOOSERTYPE; import org.deegree.model.Identifier; import org.deegree.model.spatialschema.Envelope; import org.deegree.model.spatialschema.GeometryFactory; /** * Realizes an overview over the map of an assigned map module. * * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> * @author last edited by: $Author$ * * @version. $Revision$, $Date$ */ public class MapOverviewPanel extends DefaultPanel implements ChangeListener { private static final long serialVersionUID = -8874103946271565149L; private MapModel mapModel; private BufferedImage mapImage; private JLabel map; private GeoTransform gt; private ApplicationContainer<Container> appContainer; /* * (non-Javadoc) * * @see org.deegree.igeo.views.IView#init(org.deegree.client.configuration.ViewForm) */ public void init( ViewFormType viewForm ) throws Exception { this.appContainer = this.owner.getApplicationContainer(); this.mapModel = appContainer.getMapModel( null ); // register change listener to be informed about changes of the map model (concrete: extent // of the map model) this.mapModel.addChangeListener( this ); setLayout( null ); String tmp = this.owner.getInitParameter( "mapImage" ); FileSystemAccessFactory fsaf = FileSystemAccessFactory.getInstance( appContainer ); FileSystemAccess fsa = fsaf.getFileSystemAccess( FILECHOOSERTYPE.image ); URL url = fsa.getFileURL( tmp ); try { String s = StringTools.replace( url.toExternalForm(), " ", "%20", true ); HttpUtils.validateURL( s ); mapImage = ImageUtils.loadImage( new URL( s ) ); } catch ( Exception e ) { e.printStackTrace(); String s = DialogFactory.openNewReferenceDialog( appContainer, Messages.get( "$MD11201", url ), url.toString(), true ); if ( s != null ) { url = new URL( s ); mapImage = ImageUtils.loadImage( url ); } else { mapImage = new BufferedImage( 200, 200, BufferedImage.TYPE_INT_ARGB ); } } tmp = this.owner.getInitParameter( "mapEnvelope" ); Envelope mapEnvelope = GeometryFactory.createEnvelope( tmp, null ); Envelope imageEnvelope = GeometryFactory.createEnvelope( 0, 0, mapImage.getWidth() - 1, mapImage.getHeight() - 1, null ); gt = new WorldToScreenTransform( mapEnvelope, imageEnvelope ); map = new JLabel( new ImageIcon( mapImage ) ); map.setBorder( BorderFactory.createEmptyBorder() ); map.setBounds( 10, 10, mapImage.getWidth(), mapImage.getHeight() ); add( map ); setMinimumSize( new Dimension( mapImage.getWidth() + 10, mapImage.getHeight() + 10 ) ); setPreferredSize( new Dimension( mapImage.getWidth() + 10, mapImage.getHeight() + 10 ) ); addMouseListener( new MouseHandler() ); } @Override public void update() { super.update(); String mmId = owner.getInitParameter( "assignedMapModel" ); MapModel tmp = appContainer.getMapModel( new Identifier( mmId ) ); if ( this.mapModel == null || !tmp.equals( this.mapModel ) ) { this.mapModel = tmp; // register change listener to be informed about changes of the map model // (concrete: extent of the map model) this.mapModel.removeChangeListener( this ); this.mapModel.addChangeListener( this ); repaint(); } } @Override public void paint( Graphics g ) { paintComponent( g ); } @Override protected void paintComponent( Graphics g ) { super.paintComponent( g ); map.paint( g ); Envelope env = this.mapModel.getEnvelope(); int x1 = (int) gt.getDestX( env.getMin().getX() ); int y1 = (int) gt.getDestY( env.getMax().getY() ); int x2 = (int) gt.getDestX( env.getMax().getX() ); int y2 = (int) gt.getDestY( env.getMin().getY() ); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); if ( x2 - x1 < 15 ) { g.setColor( Color.WHITE ); g2.setStroke( new BasicStroke( 3 ) ); int cx = ( x2 - x1 ) / 2 + x1; int cy = ( y2 - y1 ) / 2 + y1; g2.drawOval( cx - 10, cy - 10, 21, 21 ); g2.drawLine( cx, cy - 15, cx, cy + 15 ); g2.drawLine( cx - 15, cy, cx + 15, cy ); g.setColor( Color.BLACK ); g2.setStroke( new BasicStroke( 1 ) ); g2.drawOval( cx - 10, cy - 10, 21, 21 ); g2.drawLine( cx, cy - 15, cx, cy + 15 ); g2.drawLine( cx - 15, cy, cx + 15, cy ); } else { g.setColor( Color.BLUE ); g2.setStroke( new BasicStroke( 3 ) ); g2.drawRect( x1, y1, x2 - x1, y2 - y1 ); } } /* * (non-Javadoc) * * @see org.deegree.client.presenter.ChangeListener#valueChanged(org.deegree.client.presenter.ValueChangedEvent) */ public void valueChanged( ValueChangedEvent event ) { MapModelChangedEvent mmce = (MapModelChangedEvent) event; if ( mmce.getChangeType() == CHANGE_TYPE.extentChanged ) { repaint(); } } // //////////////////////////////////////////////////////////////////////// // inner classes // // //////////////////////////////////////////////////////////////////////// class MouseHandler extends MouseAdapter { @Override public void mouseClicked( MouseEvent event ) { double x = gt.getSourceX( event.getX() ); double y = gt.getSourceY( event.getY() ); Envelope env = mapModel.getEnvelope(); double minx = x - env.getWidth() / 2d; double maxx = x + env.getWidth() / 2d; double miny = y - env.getHeight() / 2d; double maxy = y + env.getHeight() / 2d; env = GeometryFactory.createEnvelope( minx, miny, maxx, maxy, env.getCoordinateSystem() ); ZoomCommand zoom = new ZoomCommand( mapModel ); zoom.setZoomBox( env, mapImage.getWidth(), mapImage.getHeight() ); try { appContainer.getCommandProcessor().executeSychronously( zoom, true ); } catch ( Exception e ) { DialogFactory.openErrorDialog( appContainer.getViewPlatform(), MapOverviewPanel.this, Messages.get( "$MD11242" ), Messages.get( "$MD11243", env ), e ); } } } }