/***************************************************
*
* 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.Geometry;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.util.AffineTransformation;
import edu.umd.cs.piccolo.event.PInputEvent;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.PopupMenu;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import de.cismet.cismap.commons.features.DefaultFeatureCollection;
import de.cismet.cismap.commons.features.Feature;
import de.cismet.cismap.commons.gui.MappingComponent;
import de.cismet.cismap.commons.gui.piccolo.PFeature;
import de.cismet.cismap.commons.gui.printing.PrintingToolTip;
import de.cismet.cismap.commons.gui.printing.Resolution;
import de.cismet.cismap.commons.gui.printing.Scale;
import de.cismet.cismap.commons.gui.printing.Template;
import de.cismet.cismap.commons.interaction.CismapBroker;
import de.cismet.cismap.commons.tools.PFeatureTools;
import de.cismet.tools.CismetThreadPool;
import static java.lang.Thread.sleep;
/**
* DOCUMENT ME!
*
* @author thorsten
* @version $Revision$, $Date$
*/
public class PrintingTemplatePreviewListener extends FeatureMoveListener {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(
PrintingTemplatePreviewListener.class);
//
public static final String WIDTH = "WIDTH";
public static final String HEIGHT = "HEIGHT";
public static final Color BORDER_COLOR = new Color(0, 0, 255, 75);
//~ Instance fields --------------------------------------------------------
Thread zoomThread;
long zoomTime;
private final PropertyChangeListener mapInteractionModeListener;
private final MappingComponent mappingComponent;
// private final FeatureMoveListener featureMoveListenerDelegate;
private final List<? extends Feature> backupFeature;
private final List<? extends Feature> backupHoldFeature;
private final PrintingToolTip PRINTING_TOOLTIP = new PrintingToolTip(new Color(255, 255, 222, 200));
private boolean cleared;
private String oldInteractionMode;
private PrintTemplateFeature printTemplateStyledFeature;
private boolean oldOverlappingCheck = true;
// private String bestimmerDimension = WIDTH;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new PrintingTemplatePreviewListener object.
*
* @param mappingComponent DOCUMENT ME!
*/
public PrintingTemplatePreviewListener(final MappingComponent mappingComponent) {
super(mappingComponent);
this.cleared = true;
this.mappingComponent = mappingComponent;
// this.featureMoveListenerDelegate = new FeatureMoveListener(mappingComponent);
this.backupFeature = new ArrayList<Feature>();
this.backupHoldFeature = new ArrayList<Feature>();
this.oldInteractionMode = "PAN";
// listener to remove the template feature and reset the old state if interaction mode is changed by user
this.mapInteractionModeListener = new PropertyChangeListener() {
@Override
public void propertyChange(final PropertyChangeEvent evt) {
if ((evt != null) && MappingComponent.PROPERTY_MAP_INTERACTION_MODE.equals(evt.getPropertyName())) {
if (MappingComponent.PRINTING_AREA_SELECTION.equals(evt.getOldValue())) {
cleanUpAndRestoreFeatures();
}
}
}
};
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getOldInteractionMode() {
return oldInteractionMode;
}
/**
* DOCUMENT ME!
*
* @param oldInteractionMode DOCUMENT ME!
*/
public void setOldInteractionMode(final String oldInteractionMode) {
this.oldInteractionMode = oldInteractionMode;
}
/**
* DOCUMENT ME!
*
* @param scale DOCUMENT ME!
* @param printingTemplate DOCUMENT ME!
*/
private void zoom(final double scale, final PrintTemplateFeature printingTemplate) {
final Point centroid = printingTemplate.getGeometry().getCentroid();
final AffineTransformation at = AffineTransformation.scaleInstance(
scale,
scale,
centroid.getX(),
centroid.getY());
final Geometry g = at.transform(printingTemplate.getGeometry());
printingTemplate.setGeometry(g);
final PFeature printPFeature = mappingComponent.getPFeatureHM().get(printingTemplate);
printPFeature.visualize();
mappingComponent.showHandles(true);
}
/**
* DOCUMENT ME!
*/
public void init() {
mappingComponent.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
mappingComponent.setPointerAnnotation(PRINTING_TOOLTIP);
mappingComponent.setPointerAnnotationVisibility(true);
final String currentInteractionMode = mappingComponent.getInteractionMode();
// do not add listener again if we are already in print mode
if (!MappingComponent.PRINTING_AREA_SELECTION.equals(currentInteractionMode)) {
this.oldInteractionMode = currentInteractionMode;
mappingComponent.addPropertyChangeListener(mapInteractionModeListener);
}
mappingComponent.setInteractionMode(MappingComponent.PRINTING_AREA_SELECTION);
cleared = false;
mappingComponent.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
mappingComponent.setPointerAnnotation(PRINTING_TOOLTIP);
mappingComponent.setPointerAnnotationVisibility(true);
}
/**
* DOCUMENT ME!
*
* @param selectedScale DOCUMENT ME!
* @param selectedResolution DOCUMENT ME!
* @param selectedTemplate DOCUMENT ME!
* @param oldInteractionMode DOCUMENT ME!
*/
public void init(final Scale selectedScale,
final Resolution selectedResolution,
final Template selectedTemplate,
final String oldInteractionMode) {
init();
this.oldInteractionMode = oldInteractionMode;
printTemplateStyledFeature = new PrintTemplateFeature(
selectedTemplate,
selectedResolution,
selectedScale,
mappingComponent);
final DefaultFeatureCollection mapFeatureCol = (DefaultFeatureCollection)
mappingComponent.getFeatureCollection();
oldOverlappingCheck = CismapBroker.getInstance().isCheckForOverlappingGeometriesAfterFeatureRotation();
CismapBroker.getInstance().setCheckForOverlappingGeometriesAfterFeatureRotation(false);
mapFeatureCol.holdFeature(printTemplateStyledFeature);
mapFeatureCol.addFeature(printTemplateStyledFeature);
adjustMap();
mapFeatureCol.select(printTemplateStyledFeature);
mappingComponent.setHandleInteractionMode(MappingComponent.ROTATE_POLYGON);
mappingComponent.showHandles(false);
}
/**
* DOCUMENT ME!
*/
private void ensureVisibilityOfPrintingTemplates() {
if (!mappingComponent.isFixedMapExtent()) {
mappingComponent.zoomToAFeatureCollection(mappingComponent.getSpecialFeatureCollection(
PrintTemplateFeature.class),
false,
mappingComponent.isFixedMapScale());
}
}
@Override
public void mouseReleased(final PInputEvent e) {
super.mouseReleased(e);
ensureVisibilityOfPrintingTemplates();
}
@Override
public void mouseMoved(final PInputEvent event) {
if (event.getPickedNode() instanceof PrintTemplateFeature.DerivedCloneArea) {
mappingComponent.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} else {
mappingComponent.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
}
@Override
public void mouseWheelRotated(final PInputEvent event) {
super.mouseWheelRotatedByBlock(event);
final Object o = PFeatureTools.getFirstValidObjectUnderPointer(event, new Class[] { PFeature.class });
if (!(o instanceof PFeature)) {
return;
}
final PFeature sel = (PFeature)o;
if (!(sel.getFeature() instanceof PrintTemplateFeature)) {
return;
}
final PrintTemplateFeature ptf = (PrintTemplateFeature)sel.getFeature();
if (ptf.getScale().getDenominator() == 0) {
if (log.isDebugEnabled()) {
log.debug((event.getWheelRotation()));
}
if (event.getWheelRotation() < 0) {
zoom(0.9d, ptf);
adjustMap();
} else {
zoom(1.1d, ptf);
adjustMap();
}
}
}
/**
* DOCUMENT ME!
*/
public void cleanUpAndRestoreFeatures() {
// if (!cleared) {
// mappingComponent.removePropertyChangeListener(mapInteractionModeListener);
// if (printTemplateStyledFeature != null) {
// final FeatureCollection mapFeatureCollection = mappingComponent.getFeatureCollection();
// mapFeatureCollection.unholdFeature(printTemplateStyledFeature);
// mapFeatureCollection.removeFeature(printTemplateStyledFeature);
// printTemplateStyledFeature = null;
// }
// if (MappingComponent.PRINTING_AREA_SELECTION.equals(mappingComponent.getInteractionMode())) {
// mappingComponent.setInteractionMode(oldInteractionMode);
// }
// }
// cleared = true;
// CismapBroker.getInstance().setCheckForOverlappingGeometriesAfterFeatureRotation(oldOverlappingCheck);
}
/**
* DOCUMENT ME!
*/
public void adjustMap() {
final int delayTime = 500;
zoomTime = System.currentTimeMillis() + delayTime;
if ((zoomThread == null) || !zoomThread.isAlive()) {
zoomThread = new Thread("PrintFrameListener adjustMap()") {
@Override
public void run() {
while (System.currentTimeMillis() < zoomTime) {
try {
sleep(100);
// log.debug("WAIT");
} catch (InterruptedException iex) {
}
}
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ensureVisibilityOfPrintingTemplates();
}
});
}
};
zoomThread.setPriority(Thread.NORM_PRIORITY);
CismetThreadPool.execute(zoomThread);
}
}
}