/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.gui.piccolo.eventlistener;
import com.vividsolutions.jts.geom.Coordinate;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.event.PPanEventHandler;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.apache.log4j.Logger;
import java.awt.Point;
import java.awt.geom.Point2D;
import javax.swing.SwingUtilities;
import de.cismet.cismap.commons.WorldToScreenTransform;
import de.cismet.cismap.commons.gui.MappingComponent;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.rasterservice.georeferencing.RasterGeoReferencingHandler;
import de.cismet.cismap.commons.rasterservice.georeferencing.RasterGeoReferencingWizard;
import de.cismet.cismap.commons.rasterservice.georeferencing.RasterGeoReferencingWizardListener;
/**
* DOCUMENT ME!
*
* @author jruiz
* @version $Revision$, $Date$
*/
public class RasterGeoReferencingInputListener extends PPanEventHandler implements RasterGeoReferencingWizardListener {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(RasterGeoReferencingInputListener.class);
public static final String NAME = "RasterGeoRefInputListener";
//~ Instance fields --------------------------------------------------------
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
private boolean ignoreTransformationChanged = false;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new RasterGeoReferencingInputListener object.
*/
private RasterGeoReferencingInputListener() {
getWizard().addListener(this);
}
//~ Methods ----------------------------------------------------------------
@Override
public void mouseMoved(final PInputEvent pie) {
super.mouseMoved(pie);
if (getHandler() != null) {
final Point2D mouseScreenPoint = pie.getPosition();
final WorldToScreenTransform wtst = getMainMap().getWtst();
final Coordinate mouseCoordinate = new Coordinate(wtst.getWorldX(mouseScreenPoint.getX()),
wtst.getWorldY(mouseScreenPoint.getY()));
final int position = getWizard().getPosition();
final Coordinate pointCoordinate = getHandler().getPointCoordinate(position);
if (!getWizard().isCoordinateSelected() || (pointCoordinate != null)) {
final Coordinate coordinate = (!getWizard().isCoordinateSelected()) ? mouseCoordinate : pointCoordinate;
getWizard().setPointZoom(coordinate);
}
final Coordinate coordinate = getWizard().isCoordinateSelected() ? mouseCoordinate
: getWizard().getSelectedCoordinate();
if (getWizard().isCoordinateSelected() || (coordinate != null)) {
getWizard().setCoordinateZoom(coordinate);
}
}
}
@Override
public void mouseDragged(final PInputEvent pie) {
super.mouseDragged(pie);
getPanAndMousewheelZoomListener().mouseDragged(pie);
}
@Override
protected void dragActivityFirstStep(final PInputEvent pie) {
super.dragActivityFirstStep(pie);
getPanAndMousewheelZoomListener().dragActivityFirstStep(pie);
}
@Override
protected void dragActivityFinalStep(final PInputEvent pie) {
super.dragActivityFinalStep(pie);
getPanAndMousewheelZoomListener().dragActivityFinalStep(pie);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private PanAndMousewheelZoomListener getPanAndMousewheelZoomListener() {
return (PanAndMousewheelZoomListener)getMainMap().getInputListener(MappingComponent.PAN);
}
@Override
public void mouseWheelRotated(final PInputEvent pie) {
getPanAndMousewheelZoomListener().mouseWheelRotated(pie);
}
@Override
public void mouseClicked(final PInputEvent pie) {
super.mouseClicked(pie);
if (pie.isLeftMouseButton()) {
if (pie.getClickCount() < 2) {
final Point2D mapPoint = pie.getPosition();
final WorldToScreenTransform wtst = getMainMap().getWtst();
final Coordinate coordinate = new Coordinate(wtst.getWorldX(mapPoint.getX()),
wtst.getWorldY(mapPoint.getY()));
final int position = getWizard().getPosition();
try {
final Coordinate imageCoordinate = getHandler().getMetaData()
.getTransform()
.getInverse()
.transform(coordinate, new Coordinate());
final Point point = new Point((int)imageCoordinate.x, (int)imageCoordinate.y);
if (getWizard().isPointSelected()) {
getHandler().setPoint(position, point);
} else if (getWizard().isCoordinateSelected()) {
getHandler().setCoordinate(position, coordinate);
} else {
return;
}
} catch (final Exception ex) {
}
if (getWizard().isCoordinateSelectionMode()) {
getHandler().setPositionEnabled(position, true);
}
getWizard().forward();
}
} else if (pie.isRightMouseButton()) {
getWizard().backward();
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static MappingComponent getMainMap() {
return CismapBroker.getInstance().getMappingComponent();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static RasterGeoReferencingWizard getWizard() {
return RasterGeoReferencingWizard.getInstance();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private static RasterGeoReferencingHandler getHandler() {
return getWizard().getHandler();
}
@Override
public void pointSelected(final int position) {
getWizard().updateZoom(position);
}
@Override
public void coordinateSelected(final int position) {
getWizard().updateZoom(position);
}
@Override
public void handlerChanged(final RasterGeoReferencingHandler handler) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getWizard().refreshPointZoomMap();
}
});
}
@Override
public void positionAdded(final int position) {
}
@Override
public void positionRemoved(final int position) {
}
@Override
public void positionChanged(final int position) {
}
@Override
public void transformationChanged() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getWizard().refreshPointZoomMap();
getWizard().updateZoom(getWizard().getPosition());
}
});
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static RasterGeoReferencingInputListener getInstance() {
return LazyInitialiser.INSTANCE;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private static final class LazyInitialiser {
//~ Static fields/initializers -----------------------------------------
private static final RasterGeoReferencingInputListener INSTANCE = new RasterGeoReferencingInputListener();
//~ Constructors -------------------------------------------------------
/**
* Creates a new LazyInitialiser object.
*/
private LazyInitialiser() {
}
}
}