/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * 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; * version 2.1 of the License. * * 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. */ package org.geotoolkit.gui.swing.navigator; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.logging.Level; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.util.logging.Logging; /** * * @author Johann Sorel (Geomatys) * @module */ public class DoubleNavigatorModel implements NavigatorModel{ /** * Listeners to be notified about any changes in this object properties. */ protected final PropertyChangeSupport propertyListeners; private final AffineTransform dimToGraphic = new AffineTransform(); private CoordinateReferenceSystem axis; public DoubleNavigatorModel(final CoordinateReferenceSystem axis) { this.axis = axis; this.propertyListeners = new PropertyChangeSupport(this); } @Override public CoordinateReferenceSystem getCRS() { return axis; } @Override public void setCRS(final CoordinateReferenceSystem axis) { this.axis = axis; } @Override public double getGraphicValueAt(final double d) { final Point2D pt = dimToGraphic.transform(new Point2D.Double(d, 0), null); return pt.getX(); } @Override public double getDimensionValueAt(final double candidate) { Point2D pt = null; try { pt = dimToGraphic.inverseTransform(new Point2D.Double(candidate, 0), null); } catch (NoninvertibleTransformException ex) { //shoult not happen Logging.getLogger("org.geotoolkit.gui.swing.navigator").log(Level.WARNING, null, ex); } return pt.getX(); } @Override public double getScale() { return dimToGraphic.getScaleX(); } @Override public void scale(final double factor, double position) { position = getDimensionValueAt(position); final AffineTransform newtrs = new AffineTransform(dimToGraphic); newtrs.translate(+position, 0); newtrs.scale(factor, 1); newtrs.translate(-position, 0); setTransform(newtrs); } @Override public void translate(final double tr) { final AffineTransform newtrs = new AffineTransform(dimToGraphic); newtrs.translate(tr, 0); setTransform(newtrs); } protected void setTransform(final AffineTransform trs){ if(!dimToGraphic.equals(trs)){ AffineTransform old = new AffineTransform(dimToGraphic); dimToGraphic.setTransform(trs); fireTransformChange(old,trs); } } protected void fireTransformChange(final AffineTransform oldtrs, final AffineTransform newtrs){ final PropertyChangeEvent event = new PropertyChangeEvent(this, TRANSFORM_PROPERTY, oldtrs, newtrs); for(final PropertyChangeListener lst : propertyListeners.getPropertyChangeListeners()){ lst.propertyChange(event); } } /** * {@inheritDoc } */ @Override public void addPropertyChangeListener(final PropertyChangeListener listener) { propertyListeners.addPropertyChangeListener(listener); } /** * {@inheritDoc } */ @Override public void addPropertyChangeListener(final String propertyName, final PropertyChangeListener listener) { propertyListeners.addPropertyChangeListener(propertyName, listener); } /** * {@inheritDoc } */ @Override public void removePropertyChangeListener(final PropertyChangeListener listener) { propertyListeners.removePropertyChangeListener(listener); } /** * {@inheritDoc } */ @Override public void removePropertyChangeListener(final String propertyName, final PropertyChangeListener listener) { propertyListeners.removePropertyChangeListener(propertyName, listener); } }