/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.gui.piccolo.eventlistener;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.linearref.LengthIndexedLine;
import edu.umd.cs.piccolo.PLayer;
import edu.umd.cs.piccolo.PNode;
import edu.umd.cs.piccolo.event.PBasicInputEventHandler;
import edu.umd.cs.piccolo.event.PInputEvent;
import edu.umd.cs.piccolo.nodes.PPath;
import edu.umd.cs.piccolox.util.PLocator;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Point2D;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import de.cismet.cismap.commons.features.*;
import de.cismet.cismap.commons.gui.MappingComponent;
import de.cismet.cismap.commons.gui.piccolo.LinearReferencedPointMarkPHandle;
import de.cismet.cismap.commons.gui.piccolo.PFeature;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class CreateLinearReferencedMarksListener extends PBasicInputEventHandler {
//~ Static fields/initializers ---------------------------------------------
// private static final Color COLOR_SUBLINE = new Color(255, 91, 0);
private static final double IDENTICAL_POSITION_DELTA = 1d;
private static final float CURSOR_PANEL_TRANSPARENCY = 0.7f;
private static final double INVISIBLE_CURSOR_DISTANCE = 0.015;
//~ Enums ------------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public static enum Modus {
//~ Enum constants -----------------------------------------------------
MARK_SELECTION, MARK_ADD, MEASUREMENT
}
//~ Instance fields --------------------------------------------------------
protected MappingComponent mc;
protected String mcModus = MappingComponent.LINEAR_REFERENCING;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
// public static enum SelectionType {
//
// //~ Enum constants -----------------------------------------------------
//
// NONE, MARK, SUBLINE
// }
private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
// private double cursorPosition = -1;
private float cursorX = Float.MIN_VALUE;
private float cursorY = Float.MIN_VALUE;
private final LinearReferencedPointMarkPHandle cursorPHandle;
private final Collection<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>();
// private double lineStartPosition = -1;
// private float lineStartX = Float.MIN_VALUE;
// private float lineStartY = Float.MIN_VALUE;
// private final MeasurementPHandle lineStartPHandle;
private HashMap<PFeature, Collection<PointMark>> featurePointMarks = new HashMap<PFeature, Collection<PointMark>>();
// private HashMap<PFeature, Collection<LineMark>> featureLineMarks = new HashMap<PFeature, Collection<LineMark>>();
private PointMark selectedPointMark;
// private LineMark selectedLineMark;
// private PFeature currentLineMarkPFeature = null;
private Modus modus = Modus.MARK_ADD;
private JPopupMenu menu;
// private SelectionType selectionType = SelectionType.NONE;
private JMenuItem cmdRemoveMark;
private JMenuItem cmdRemoveAllMarks;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new instance of SimpleMoveListener.
*
* @param mc DOCUMENT ME!
*/
public CreateLinearReferencedMarksListener(final MappingComponent mc) {
super();
this.mc = mc;
final PLocator l = new PLocator() {
@Override
public double locateX() {
return cursorX;
}
@Override
public double locateY() {
return cursorY;
}
};
cursorPHandle = new LinearReferencedPointMarkPHandle(l, this, mc);
cursorPHandle.setInfoPanelTransparency(CURSOR_PANEL_TRANSPARENCY);
cursorPHandle.setPaint(null);
if (mc != null) {
mc.getFeatureCollection().addFeatureCollectionListener(new FeatureCollectionAdapter() {
@Override
public void featureSelectionChanged(final FeatureCollectionEvent fce) {
final Collection<Feature> sel = fce.getEventFeatures();
// wenn genau 1 Objekt selektiert ist
if ((sel != null) && (sel.size() == 1)) {
// selektiertes feature holen
final Feature[] sels = sel.toArray(new Feature[0]);
final Geometry geom = sels[0].getGeometry();
if ((geom != null) || (geom instanceof MultiLineString) || (geom instanceof LineString)) {
// zugehöriges pfeature holen
// final PFeature pf = mc.getPFeatureHM().get(sels[0]);
// zugehörige geometrie holen
// TODO sauberes event
firePropertyChange(null);
}
}
}
});
}
// final PLocator lsl = new PLocator() {
//
// @Override
// public double locateX() {
// return lineStartX;
// }
//
// @Override
// public double locateY() {
// return lineStartY;
// }
// };
// lineStartPHandle = new MeasurementPHandle(lsl, mc);
initContextMenu();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param listener event DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// public SelectionType getSelectionType() {
// return selectionType;
// }
/**
* DOCUMENT ME!
*
* @param listener event selectionType DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private void setSelectionType(final SelectionType selectionType) {
// this.selectionType = selectionType;
// }
/**
* DOCUMENT ME!
*
* @param listener event DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private Feature createSublineFeature() {
// final Feature feature = new Feature() {
//
// private Geometry geom;
//
// @Override
// public Geometry getGeometry() {
// return geom;
// }
//
// @Override
// public void setGeometry(final Geometry geom) {
// this.geom = geom;
// }
//
// @Override
// public boolean canBeSelected() {
// return false;
// }
//
// @Override
// public void setCanBeSelected(final boolean canBeSelected) {
// throw new UnsupportedOperationException("Not supported yet.");
// }
//
// @Override
// public boolean isEditable() {
// return false;
// }
//
// @Override
// public void setEditable(final boolean editable) {
// throw new UnsupportedOperationException("Not supported yet.");
// }
//
// @Override
// public boolean isHidden() {
// return false;
// }
//
// @Override
// public void hide(final boolean hiding) {
// throw new UnsupportedOperationException("Not supported yet.");
// }
// };
// return feature;
// }
/**
* DOCUMENT ME!
*
* @param listener event DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private void startLineMark() {
// // addMarkHandle(handleX, handleY);
// lineStartPosition = getCurrentPosition();
// lineStartX = cursorX;
// lineStartY = cursorY;
//// setModus(Modus.DRAWING_SUBLINE);
//
// currentLineMarkPFeature = new PFeature(createSublineFeature(), mc);
// currentLineMarkPFeature.setStroke(new CustomFixedWidthStroke(5));
//// currentLineMarkPFeature.setStrokePaint(COLOR_SUBLINE);
//
// currentLineMarkPFeature.addChild(lineStartPHandle);
// currentLineMarkPFeature.addChild(cursorPHandle);
//
// final PFeature pf = getSelectedLinePFeature();
// pf.addChild(currentLineMarkPFeature);
// pf.repaint();
// }
/**
* DOCUMENT ME!
*
* @param listener event DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private void updateLineMark() {
// final LengthIndexedLine lil = new LengthIndexedLine(getSelectedLinePFeature().getFeature().getGeometry());
// final LineString subline = (LineString)lil.extractLine(lineStartPosition, cursorPosition);
//
// currentLineMarkPFeature.getFeature().setGeometry(subline);
// currentLineMarkPFeature.syncGeometry();
// currentLineMarkPFeature.visualize();
// }
/**
* DOCUMENT ME!
*
* @param listener event DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private void finishLineMark() {
// // addMarkHandle(handleX, handleY);
// addSublinePHandle(lineStartPosition, cursorPosition);
// setModus(Modus.MARK_ADD);
// currentLineMarkPFeature = null;
// }
public boolean addPropertyChangeListener(final PropertyChangeListener listener) {
return listeners.add(listener);
}
/**
* DOCUMENT ME!
*
* @param listener DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean removePropertyChangeListener(final PropertyChangeListener listener) {
return listeners.remove(listener);
}
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
protected void firePropertyChange(final PropertyChangeEvent evt) {
for (final PropertyChangeListener listener : listeners) {
listener.propertyChange(evt);
}
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
@Override
public void mouseDragged(final PInputEvent event) {
// if (!isDragging() && event.isShiftDown()) {
// startLineMark();
// }
// updateCursor(event.getPosition());
// cursorPHandle.setMarkPosition(getCurrentPosition());
// if (isDragging()) {
// updateLineMark();
// }
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
@Override
public void mouseReleased(final PInputEvent event) {
// log.fatal("mouse released");
// if (isDragging()) {
// finishLineMark();
// }
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Double[] getMarkPositionsOfSelectedFeature() {
final Collection<PointMark> marks = getPointMarks(getSelectedLinePFeature());
final Collection<Double> positions = new ArrayList<Double>();
for (final PointMark mark : marks) {
positions.add(mark.getPosition());
}
final Double[] result = positions.toArray(new Double[0]);
Arrays.sort(result);
return result;
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
// private boolean isDragging() {
// log.fatal("isDragging: " + currentLineMarkPFeature + " = " + currentLineMarkPFeature != null);
// return currentLineMarkPFeature != null;
// }
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
@Override
public void mouseClicked(final PInputEvent event) {
if (event.isLeftMouseButton()) {
switch (modus) {
case MARK_ADD: {
final PFeature selPFeature = getSelectedLinePFeature();
if (selPFeature != null) {
addMarkPHandle(new Coordinate(cursorX, cursorY));
}
break;
}
}
}
}
/**
* DOCUMENT ME!
*
* @param position DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Coordinate getCoordinateOfPosition(final double position) {
final LengthIndexedLine lil = new LengthIndexedLine(getSelectedLinePFeature().getFeature().getGeometry());
return lil.extractPoint(position);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Coordinate getSelectedMarkCoordinate() {
return getCoordinateOfPosition(getSelectedMarkPosition());
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// public double getSelectedSublineStart() {
// if (selectedLineMark != null) {
// return selectedLineMark.getPositionStart();
// } else {
// return 0;
// }
// }
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// public double getSelectedSublineEnd() {
// if (selectedLineMark != null) {
// return selectedLineMark.getPositionEnd();
// } else {
// return 0;
// }
// }
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public double getSelectedMarkPosition() {
if (selectedPointMark != null) {
return selectedPointMark.getPosition();
} else {
return 0;
}
}
/**
* DOCUMENT ME!
*
* @param markPHandle DOCUMENT ME!
*/
public void setSelectedMark(final LinearReferencedPointMarkPHandle markPHandle) {
if (markPHandle == null) {
this.selectedPointMark = null;
} else {
for (final PointMark mark : getPointMarks(getSelectedLinePFeature())) {
if ((mark != null) && mark.getPHandle().equals(markPHandle)) {
this.selectedPointMark = mark;
// setSelectionType(SelectionType.MARK);
break;
}
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// public void setSelectedSubline(final MarkLinePHandle sublinePHandle) {
// if (sublinePHandle == null) {
// this.selectedLineMark = null;
// } else {
// for (final LineMark subline : getLineMarks(getSelectedLinePFeature())) {
// if ((subline != null) && subline.getPHandle().equals(sublinePHandle)) {
// this.selectedLineMark = subline;
// setSelectionType(SelectionType.SUBLINE);
// break;
// }
// }
// }
// }
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public JPopupMenu getContextMenu() {
return menu;
}
/**
* DOCUMENT ME!
*
* @param item DOCUMENT ME!
*/
public void removeContextMenuItem(final JMenuItem item) {
menu.remove(item);
}
/**
* DOCUMENT ME!
*
* @param item DOCUMENT ME!
*/
public void addContextMenuItem(final JMenuItem item) {
menu.remove(cmdRemoveMark);
menu.remove(cmdRemoveAllMarks);
menu.add(item);
menu.add(cmdRemoveMark);
menu.add(cmdRemoveAllMarks);
}
/**
* DOCUMENT ME!
*/
private void initContextMenu() {
menu = new JPopupMenu();
cmdRemoveMark = new JMenuItem("Markierung entfernen"); // NOI18N
cmdRemoveAllMarks = new JMenuItem("alle Markierungen entfernen"); // NOI18N
cmdRemoveMark.setIcon(new ImageIcon(
getClass().getResource("/de/cismet/cismap/commons/gui/res/marker--minus.png")));
cmdRemoveAllMarks.setIcon(new ImageIcon(
getClass().getResource("/de/cismet/cismap/commons/gui/res/marker--minus.png")));
cmdRemoveMark.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
// switch (selectionType) {
// case MARK: {
removeMark(selectedPointMark);
// break;
// }
// case SUBLINE: {
// // removeLineMark(selectedLineMark);
// break;
// }
// }
}
});
cmdRemoveAllMarks.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent ae) {
removeAllMarks();
// removeAllLineMarks();
}
});
if (menu.getComponentCount() > 0) {
menu.addSeparator();
}
menu.add(cmdRemoveMark);
menu.add(cmdRemoveAllMarks);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PLayer getPLayer() {
return mc.getHandleLayer();
}
/**
* DOCUMENT ME!
*
* @param mark DOCUMENT ME!
*/
private void removeMark(final PointMark mark) {
if (getSelectedLinePFeature() != null) {
getPointMarks(getSelectedLinePFeature()).remove(mark);
getPLayer().removeChild(mark.getPHandle());
// TODO sauberes event implementieren
firePropertyChange(null);
}
}
/**
* DOCUMENT ME!
*/
public void removeAllMarks() {
final Collection<PointMark> pointMarks = getPointMarks(getSelectedLinePFeature());
for (final PointMark mark : pointMarks) {
getPLayer().removeChild(mark.getPHandle());
}
pointMarks.clear();
// TODO sauberes event implementieren
firePropertyChange(null);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// private void removeLineMark(final LineMark subline) {
// getLineMarks(getSelectedLinePFeature()).remove(subline);
// getSelectedLinePFeature().removeChild(subline.getPFeature());
// getPLayer().removeChild(subline.getPHandle());
// }
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
// public void removeAllLineMarks() {
// final Collection<LineMark> lineMarks = getLineMarks(getSelectedLinePFeature());
// for (final LineMark subline : lineMarks) {
// getPLayer().removeChild(subline.getPHandle());
// getSelectedLinePFeature().removeChild(subline.getPFeature());
// }
// lineMarks.clear();
// }
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected double getCurrentPosition() {
if (getSelectedLinePFeature() != null) {
return LinearReferencedPointFeature.getPositionOnLine(new Coordinate(
mc.getWtst().getSourceX(cursorX),
mc.getWtst().getSourceY(cursorY)),
getSelectedLinePFeature().getFeature().getGeometry());
} else {
return 0d;
}
}
/**
* DOCUMENT ME!
*
* @param show DOCUMENT ME!
*/
private void showPointMarks(final boolean show) {
for (final PointMark mark : getPointMarks(getSelectedLinePFeature())) {
showOnFather(getPLayer(), mark.getPHandle(), show);
}
}
/**
* DOCUMENT ME!
*
* @param pFeature DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Collection<PointMark> getPointMarks(final PFeature pFeature) {
Collection<PointMark> pointMarks = featurePointMarks.get(getSelectedLinePFeature());
if (pointMarks == null) {
pointMarks = new ArrayList<PointMark>();
featurePointMarks.put(pFeature, new ArrayList<PointMark>());
}
return pointMarks;
}
/**
* DOCUMENT ME!
*
* @param coordinate pFeature DOCUMENT ME!
*/
// private Collection<LineMark> getLineMarks(final PFeature pFeature) {
// Collection<LineMark> lineMarks = featureLineMarks.get(getSelectedLinePFeature());
// if (lineMarks == null) {
// lineMarks = new ArrayList<LineMark>();
// featureLineMarks.put(pFeature, new ArrayList<LineMark>());
// }
// return lineMarks;
// }
/**
* DOCUMENT ME!
*
* @param coordinate x DOCUMENT ME!
*/
protected void addMarkPHandle(final Coordinate coordinate) {
if (log.isDebugEnabled()) {
log.debug("create newPointHandle and Locator"); // NOI18N
}
final PLocator l = new PLocator() {
@Override
public double locateX() {
return coordinate.x;
}
@Override
public double locateY() {
return coordinate.y;
}
};
final LinearReferencedPointMarkPHandle markHandle = new LinearReferencedPointMarkPHandle(l, this, mc);
final double currentPosition = getCurrentPosition();
markHandle.setMarkPosition(currentPosition);
final Collection<PointMark> pointMarks = getPointMarks(getSelectedLinePFeature());
boolean pointMarkStillExists = false;
for (final PointMark pointMark : pointMarks) {
if (Math.abs(pointMark.getPosition() - currentPosition) < IDENTICAL_POSITION_DELTA) {
pointMarkStillExists = true;
break;
}
}
if (!pointMarkStillExists) {
final PointMark pointMark = new PointMark(currentPosition, markHandle);
pointMarks.add(pointMark);
getPLayer().addChild(markHandle);
setSelectedMark(markHandle);
// measurementPHandle wieder nach oben holen
getPLayer().removeChild(cursorPHandle);
getPLayer().addChild(cursorPHandle);
// TODO sauberes event implementieren
firePropertyChange(null);
} else {
if (log.isDebugEnabled()) {
log.debug(
"Markierung mit (fast) der selben Position existiert bereits, neue Markierung wird also ignoriert.");
}
}
}
/**
* DOCUMENT ME!
*
* @param show DOCUMENT ME!
*/
private void showCursor(final boolean show) {
showOnFather(getPLayer(), cursorPHandle, show);
}
/**
* DOCUMENT ME!
*
* @param father DOCUMENT ME!
* @param child DOCUMENT ME!
* @param show DOCUMENT ME!
*/
private void showOnFather(final PNode father, final PPath child, final boolean show) {
boolean found = false;
for (final Object o : father.getChildrenReference()) {
if ((o != null) && o.equals(child)) {
found = true;
break;
}
}
if (!found && show) {
father.addChild(child);
}
if (found && !show) {
father.removeChild(child);
}
}
/**
* DOCUMENT ME!
*
* @param modus startPosition DOCUMENT ME!
*/
// private void addSublinePHandle(final double startPosition, final double endPosition) {
// final double mid = startPosition + ((endPosition - startPosition) / 2);
// final double length = Math.abs(endPosition - startPosition);
//
// final Coordinate midCoord = getCoordinateOfPosition(mid);
// if (log.isDebugEnabled()) {
// log.debug("midCoord: " + midCoord);
// }
//
// final double xTest = cursorX;
// final double yTest = cursorY;
//
// final PLocator l = new PLocator() {
//
// @Override
// public double locateX() {
// return xTest;
// }
//
// @Override
// public double locateY() {
// return yTest;
// }
// };
//
// final MarkLinePHandle pHandle = new MarkLinePHandle(l, this, mc);
// pHandle.setPositions(startPosition, endPosition);
//
// final LineMark lineMark = new LineMark(startPosition, endPosition, pHandle, currentLineMarkPFeature);
//
// getLineMarks(getSelectedLinePFeature()).add(lineMark);
// getPLayer().addChild(pHandle);
//
// setSelectedSubline(pHandle);
//
// // measurementPHandle wieder nach oben holen
// getPLayer().removeChild(cursorPHandle);
// getPLayer().addChild(cursorPHandle);
// }
/**
* DOCUMENT ME!
*
* @param modus show DOCUMENT ME!
*/
// private void showSublines(final boolean show) {
// for (final LineMark subline : getLineMarks(getSelectedLinePFeature())) {
// if (log.isDebugEnabled()) {
// log.debug(subline.getPHandle() + " -- " + subline.getPFeature());
// }
// showOnFather(getPLayer(), subline.getPHandle(), show);
// showOnFather(getSelectedLinePFeature(), subline.getPFeature(), show);
// }
// }
/**
* DOCUMENT ME!
*
* @param modus DOCUMENT ME!
*/
private void setModus(final Modus modus) {
this.modus = modus;
refreshHandles();
}
/**
* DOCUMENT ME!
*/
private void refreshHandles() {
if (getSelectedLinePFeature() != null) {
switch (modus) {
case MARK_SELECTION: {
showCursor(false);
showPointMarks(true);
// showSublines(true);
break;
}
case MARK_ADD: {
showCursor(true);
showPointMarks(true);
// showSublines(true);
break;
}
// case DRAWING_SUBLINE: {
// showCursor(true);
// showMarks(false);
// showSublines(true);
// break;
// }
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Modus getModus() {
return modus;
}
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
@Override
public void mouseMoved(final PInputEvent event) {
if (mc.getInteractionMode().equals(mcModus)) {
final PFeature selPFeature = getSelectedLinePFeature();
if (selPFeature != null) {
updateCursor(event.getPosition());
cursorPHandle.setMarkPosition(getCurrentPosition());
if (event.isControlDown()) {
setModus(Modus.MARK_SELECTION);
} else {
setModus(Modus.MARK_ADD);
}
}
}
}
/**
* DOCUMENT ME!
*
* @param trigger DOCUMENT ME!
*/
private void updateCursor(final Point2D trigger) {
final PFeature selPFeature = getSelectedLinePFeature();
if (selPFeature != null) {
final Geometry geom = selPFeature.getFeature().getGeometry();
if (selPFeature != null) {
final Coordinate triggerCoordinate = new Coordinate(
mc.getWtst().getSourceX(trigger.getX()),
mc.getWtst().getSourceY(trigger.getY()));
final Geometry lineGeometry = LinearReferencedPointFeature.getReducedLineGeometry(
geom,
new Coordinate(cursorX, cursorY),
triggerCoordinate);
final Coordinate erg = LinearReferencedPointFeature.getNearestCoordninateOnLine(
triggerCoordinate,
lineGeometry);
final double dist = LinearReferencedPointFeature.getDistanceOfCoordToLine(
triggerCoordinate,
lineGeometry);
final boolean cursorIsVisible = (dist / mc.getScaleDenominator()) < INVISIBLE_CURSOR_DISTANCE;
cursorPHandle.setVisible(cursorIsVisible);
cursorX = (float)mc.getWtst().getDestX(erg.x);
cursorY = (float)mc.getWtst().getDestY(erg.y);
// cursorPosition = getCurrentPosition();
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public PFeature getSelectedLinePFeature() {
// Collection holen
final FeatureCollection fc = mc.getFeatureCollection();
// Selektierte Features holen
final Collection<Feature> sel = fc.getSelectedFeatures();
// wenn genau 1 Objekt selektiert ist
if ((fc instanceof DefaultFeatureCollection) && (sel.size() == 1)) {
// selektiertes feature holen
final Feature[] sels = sel.toArray(new Feature[0]);
final Geometry geom = sels[0].getGeometry();
if ((geom != null) || (geom instanceof MultiLineString) || (geom instanceof LineString)) {
// zugehöriges pfeature holen
PFeature pf = mc.getPFeatureHM().get(sels[0]);
if (pf == null) {
final SelectionListener sl = (SelectionListener)mc.getInputEventListener()
.get(MappingComponent.SELECT);
final List<PFeature> fl = sl.getAllSelectedPFeatures();
if ((fl != null) && (fl.size() == 1)) {
pf = fl.get(0);
}
}
// zugehörige geometrie holen
return pf;
} else {
if (log.isDebugEnabled()) {
if (geom == null) {
if (log.isDebugEnabled()) {
log.debug("geom is null");
}
} else {
if (log.isDebugEnabled()) {
log.debug("Wrong geometry type: " + geom.getGeometryType());
}
}
}
return null;
}
} else {
return null;
}
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class PointMark {
//~ Instance fields ----------------------------------------------------
private double position;
private LinearReferencedPointMarkPHandle pHandle;
//~ Constructors -------------------------------------------------------
/**
* Creates a new PointMark object.
*
* @param position DOCUMENT ME!
* @param handle DOCUMENT ME!
*/
PointMark(final double position, final LinearReferencedPointMarkPHandle handle) {
this.pHandle = handle;
this.position = position;
}
//~ Methods ------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public double getPosition() {
return position;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public LinearReferencedPointMarkPHandle getPHandle() {
return pHandle;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
// class LineMark {
//
// //~ Instance fields ----------------------------------------------------
//
// private double positionStart;
// private double positionEnd;
// private MarkLinePHandle pHandle;
// private PFeature pFeature;
//
// //~ Constructors -------------------------------------------------------
//
// /**
// * Creates a new LineMark object.
// *
// * @param positionStart DOCUMENT ME!
// * @param positionEnd DOCUMENT ME!
// * @param pHandle DOCUMENT ME!
// * @param pFeature DOCUMENT ME!
// */
// LineMark(final double positionStart,
// final double positionEnd,
// final MarkLinePHandle pHandle,
// final PFeature pFeature) {
// this.pHandle = pHandle;
// this.pFeature = pFeature;
// this.positionStart = positionStart;
// this.positionEnd = positionEnd;
// }
//
// //~ Methods ------------------------------------------------------------
//
// /**
// * DOCUMENT ME!
// *
// * @return DOCUMENT ME!
// */
// public double getPositionStart() {
// return positionStart;
// }
//
// /**
// * DOCUMENT ME!
// *
// * @return DOCUMENT ME!
// */
// public double getPositionEnd() {
// return positionEnd;
// }
//
// /**
// * DOCUMENT ME!
// *
// * @return DOCUMENT ME!
// */
// public MarkLinePHandle getPHandle() {
// return pHandle;
// }
//
// /**
// * DOCUMENT ME!
// *
// * @return DOCUMENT ME!
// */
// public PFeature getPFeature() {
// return pFeature;
// }
// }
}