/*
* 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);
}
}