001 // License: GPL. Copyright 2007 by Immanuel Scholz and others 002 package org.openstreetmap.josm.actions.mapmode; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.Rectangle; 007 import java.awt.event.KeyEvent; 008 import java.awt.event.MouseEvent; 009 010 import org.openstreetmap.josm.Main; 011 import org.openstreetmap.josm.gui.MapFrame; 012 import org.openstreetmap.josm.gui.MapView; 013 import org.openstreetmap.josm.gui.SelectionManager; 014 import org.openstreetmap.josm.gui.SelectionManager.SelectionEnded; 015 import org.openstreetmap.josm.tools.ImageProvider; 016 import org.openstreetmap.josm.tools.Shortcut; 017 018 /** 019 * Enable the zoom mode within the MapFrame. 020 * 021 * Holding down the left mouse button select a rectangle with the same aspect 022 * ratio than the current map view. 023 * Holding down left and right let the user move the former selected rectangle. 024 * Releasing the left button zoom to the selection. 025 * 026 * Rectangle selections with either height or width smaller than 3 pixels 027 * are ignored. 028 * 029 * @author imi 030 */ 031 public class ZoomAction extends MapMode implements SelectionEnded { 032 033 /** 034 * Manager that manages the selection rectangle with the aspect ratio of the 035 * MapView. 036 */ 037 private final SelectionManager selectionManager; 038 039 /** 040 * Construct a ZoomAction without a label. 041 * @param mapFrame The MapFrame, whose zoom mode should be enabled. 042 */ 043 public ZoomAction(MapFrame mapFrame) { 044 super(tr("Zoom"), "zoom", tr("Zoom and move map"), 045 Shortcut.registerShortcut("mapmode:zoom", tr("Mode: {0}", tr("Zoom")), KeyEvent.VK_Z, Shortcut.DIRECT), 046 mapFrame, ImageProvider.getCursor("normal", "zoom")); 047 selectionManager = new SelectionManager(this, true, mapFrame.mapView); 048 } 049 050 /** 051 * Zoom to the rectangle on the map. 052 */ 053 public void selectionEnded(Rectangle r, MouseEvent e) { 054 if (r.width >= 3 && r.height >= 3 && Main.isDisplayingMapView()) { 055 MapView mv = Main.map.mapView; 056 mv.zoomToFactor(mv.getEastNorth(r.x+r.width/2, r.y+r.height/2), r.getWidth()/mv.getWidth()); 057 } 058 } 059 060 @Override public void enterMode() { 061 super.enterMode(); 062 selectionManager.register(Main.map.mapView, false); 063 } 064 065 @Override public void exitMode() { 066 super.exitMode(); 067 selectionManager.unregister(Main.map.mapView); 068 } 069 070 @Override public String getModeHelpText() { 071 return tr("Zoom by dragging or Ctrl+. or Ctrl+,; move with Ctrl+up, left, down, right; move zoom with right button"); 072 } 073 }