// // @(#)ViewControlBar.java 1.00 4/1/2002 // // Copyright 2002 Zachary DelProposto. All rights reserved. // Use is subject to license terms. // // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // Or from http://www.gnu.org/ // package dip.gui.map; import dip.world.Location; import dip.misc.Utils; import dip.gui.order.GUIOrder; import java.awt.geom.*; import javax.swing.JButton; import javax.swing.ActionMap; import javax.swing.*; import org.apache.batik.swing.*; import java.awt.geom.AffineTransform; import java.awt.event.ActionEvent; import java.awt.Dimension; import org.apache.batik.swing.JSVGCanvas; import org.apache.batik.dom.events.DOMKeyEvent; import org.w3c.dom.events.MouseEvent; import org.apache.batik.*; import org.apache.batik.dom.*; import org.apache.batik.util.*; import org.w3c.dom.svg.*; import org.w3c.dom.svg.SVGSVGElement; import org.apache.batik.bridge.ViewBox; import org.apache.batik.gvt.CanvasGraphicsNode; /** * View Control Bar * <p> * This is the control bar that implements basic zooming and revert capability. * <p> * Typically, it is used when not in edit mode, and when no orders can be entered. * */ public class ViewControlBar extends ControlBar { // i18n resources private static final String I18N_ZOOMIN_TIP = "ViewConBar.button.zoomin.tooltip"; private static final String I18N_ZOOMOUT_TIP = "ViewConBar.button.zoomout.tooltip"; private static final String I18N_FIT_TIP = "ViewConBar.button.fit.tooltip"; // key descriptors private static final char KEY_ZOOM_IN = '+'; private static final char KEY_ZOOM_OUT = '-'; private static final char KEY_FIT = '='; // icons private static final String ICON_ZOOM_IN = "resource/common/icons/24x24/stock_zoom_in_24.png"; private static final String ICON_ZOOM_OUT = "resource/common/icons/24x24/stock_zoom_out_24.png"; private static final String ICON_ZOOM_FIT = "resource/common/icons/24x24/stock_zoom_fit_24.png"; // instance variables private JButton fit; private JButton zoomIn; private JButton zoomOut; private final int keyFit; private final int keyZoomIn; private final int keyZoomOut; /** Creates the View control bar. */ public ViewControlBar(MapPanel mp) { super(mp); makeLayout(); // NULL test when we actually do IL8N keyFit = KEY_FIT; keyZoomIn = KEY_ZOOM_IN; keyZoomOut = KEY_ZOOM_OUT; }// ViewControlBar() /** Called when the mouse pointer enters a province */ public void mouseOver(MouseEvent me, Location loc) { if(loc == null) { mapPanel.statusBarUtils.setText( Utils.getLocalString(GUIOrder.NOT_IN_PROVINCE) ); } else { mapPanel.statusBarUtils.displayProvinceInfo(loc); } }// mouseOver() /** Called when the mouse pointer leaves a province */ public void mouseOut(MouseEvent me, Location loc) { mapPanel.statusBarUtils.clearText(); }// mouseOut() /** Handles ZoomIn / ZoomOut / Revert key functionality. */ public void keyPressed(DOMKeyEvent ke, Location loc) { int charCode = ke.getCharCode(); // note: getKeyCode() DOES NOT WORK if(charCode == keyZoomIn) { zoomIn.doClick(); } else if(charCode == keyZoomOut) { zoomOut.doClick(); } else if(charCode == keyFit) { fit.doClick(); } }// keyPressed() /** Add control bar icons */ private void makeLayout() { // set Zoom scale factor -- BEFORE we get the resulting actions. final XJSVGCanvas canvas = mapPanel.getXJSVGCanvas(); canvas.setZoomScaleFactor(mapPanel.getScaleFactor()); // This is the be-all end-all of reset transforms. It accounts // for everything, and will never fail (famous last words) // fit = add(new AbstractAction() { public void actionPerformed(ActionEvent evt) { JSVGCanvas canvas = mapPanel.getJSVGCanvas(); if(canvas != null) // we are being very defensive { AffineTransform iat = canvas.getInitialTransform(); SVGSVGElement elt = canvas.getSVGDocument().getRootElement(); if(iat != null || elt == null) // very very defensive... but iat null check is important { // rescale viewbox transform to reflect viewbox size Dimension vbSize = mapPanel.getScrollerSize(); // size of the canvas' scrolling container (don't include scroll bars) CanvasGraphicsNode cgn = canvas.getCanvasGraphicsNode(); // ViewBox.getViewTransform is essential for calculating the correct transform, // AND accounting for any viewBox attribute of the root SVG element, if present. AffineTransform vt = ViewBox.getViewTransform (canvas.getFragmentIdentifier(), elt, vbSize.width, vbSize.height); cgn.setViewingTransform(vt); // set rendering transform to 'unscaled' AffineTransform t = AffineTransform.getScaleInstance(1,1); mapPanel.getJSVGCanvas().setRenderingTransform(t); } } } }); fit.setIcon(Utils.getIcon(ICON_ZOOM_FIT)); fit.setToolTipText(Utils.getLocalString(I18N_FIT_TIP)); addSeparator(); zoomOut = add(canvas.getActionMap().get(JSVGCanvas.ZOOM_OUT_ACTION)); zoomOut.setIcon(Utils.getIcon(ICON_ZOOM_OUT)); zoomOut.setToolTipText(Utils.getLocalString(I18N_ZOOMOUT_TIP)); zoomIn = add(canvas.getActionMap().get(JSVGCanvas.ZOOM_IN_ACTION)); zoomIn.setIcon(Utils.getIcon(ICON_ZOOM_IN)); zoomIn.setToolTipText(Utils.getLocalString(I18N_ZOOMIN_TIP)); }// makeLayout() }// class ViewControlBar