001: /* uDig - User Friendly Desktop Internet GIS client
002: * http://udig.refractions.net
003: * (C) 2004, Refractions Research Inc.
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation;
008: * version 2.1 of the License.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: */
015: package net.refractions.udig.tools.edit.impl;
016:
017: import java.util.List;
018: import java.util.Set;
019:
020: import net.refractions.udig.core.StaticProvider;
021: import net.refractions.udig.tool.edit.internal.Messages;
022: import net.refractions.udig.tools.edit.AbstractEditTool;
023: import net.refractions.udig.tools.edit.Activator;
024: import net.refractions.udig.tools.edit.Behaviour;
025: import net.refractions.udig.tools.edit.EditToolConfigurationHelper;
026: import net.refractions.udig.tools.edit.EditToolHandler;
027: import net.refractions.udig.tools.edit.EnablementBehaviour;
028: import net.refractions.udig.tools.edit.MutualExclusiveBehavior;
029: import net.refractions.udig.tools.edit.activator.AdvancedBehaviourCommandHandlerActivator;
030: import net.refractions.udig.tools.edit.activator.DeleteGlobalActionSetterActivator;
031: import net.refractions.udig.tools.edit.activator.DrawCurrentGeomVerticesActivator;
032: import net.refractions.udig.tools.edit.activator.DrawGeomsActivator;
033: import net.refractions.udig.tools.edit.activator.EditStateListenerActivator;
034: import net.refractions.udig.tools.edit.activator.GridActivator;
035: import net.refractions.udig.tools.edit.activator.SetRenderingFilter;
036: import net.refractions.udig.tools.edit.activator.SetSnapBehaviourCommandHandlerActivator;
037: import net.refractions.udig.tools.edit.behaviour.AddVertexOnEdgeBehaviour;
038: import net.refractions.udig.tools.edit.behaviour.CursorControlBehaviour;
039: import net.refractions.udig.tools.edit.behaviour.DefaultCancelBehaviour;
040: import net.refractions.udig.tools.edit.behaviour.DoubleClickRunAcceptBehaviour;
041: import net.refractions.udig.tools.edit.behaviour.DrawCreateVertexSnapAreaBehaviour;
042: import net.refractions.udig.tools.edit.behaviour.MouseDownVertexSelectorBehaviour;
043: import net.refractions.udig.tools.edit.behaviour.MoveGeometryBehaviour;
044: import net.refractions.udig.tools.edit.behaviour.MoveVertexBehaviour;
045: import net.refractions.udig.tools.edit.behaviour.SelectGeometryBehaviour;
046: import net.refractions.udig.tools.edit.behaviour.SelectionBoxBehaviour;
047: import net.refractions.udig.tools.edit.behaviour.SetSnapSizeBehaviour;
048: import net.refractions.udig.tools.edit.behaviour.VertexSelectorBehaviour;
049: import net.refractions.udig.tools.edit.behaviour.WriteChangesBehaviour;
050: import net.refractions.udig.tools.edit.enablement.ValidToolDetectionActivator;
051: import net.refractions.udig.tools.edit.enablement.WithinLegalLayerBoundsBehaviour;
052:
053: import org.eclipse.swt.SWT;
054: import org.geotools.feature.Feature;
055: import org.geotools.filter.FilterType;
056:
057: import com.vividsolutions.jts.geom.Geometry;
058: import com.vividsolutions.jts.geom.LineString;
059: import com.vividsolutions.jts.geom.MultiLineString;
060: import com.vividsolutions.jts.geom.MultiPoint;
061: import com.vividsolutions.jts.geom.MultiPolygon;
062: import com.vividsolutions.jts.geom.Point;
063: import com.vividsolutions.jts.geom.Polygon;
064:
065: /**
066: * Selects and modifies features.
067: *
068: * @author jones
069: * @since 1.1.0
070: */
071: public class SelectionTool extends AbstractEditTool {
072: @Override
073: protected void initEnablementBehaviours(
074: List<EnablementBehaviour> helper) {
075: helper.add(new WithinLegalLayerBoundsBehaviour());
076: helper.add(new ValidToolDetectionActivator(new Class[] {
077: Geometry.class, LineString.class,
078: MultiLineString.class, Polygon.class,
079: MultiPolygon.class, Point.class, MultiPoint.class }));
080: }
081:
082: @Override
083: protected void initActivators(Set<Activator> activators) {
084: activators.add(new EditStateListenerActivator());
085: activators.add(new DeleteGlobalActionSetterActivator());
086: activators.add(new DrawGeomsActivator(
087: DrawGeomsActivator.DrawType.POLYGON));
088: activators.add(new DrawCurrentGeomVerticesActivator());
089: activators.add(new SetSnapBehaviourCommandHandlerActivator());
090: activators.add(new AdvancedBehaviourCommandHandlerActivator());
091: activators.add(new SetRenderingFilter());
092: activators.add(new GridActivator());
093: }
094:
095: @Override
096: protected void initAcceptBehaviours(List<Behaviour> acceptBehaviours) {
097: MutualExclusiveBehavior mutualExclusive = new MutualExclusiveBehavior();
098: acceptBehaviours.add(mutualExclusive);
099: mutualExclusive.getBehaviours().add(
100: new WriteChangesBehaviour(Polygon.class) {
101: @Override
102: public boolean isValid(EditToolHandler handler) {
103: Feature feature = handler.getContext()
104: .getEditManager().getEditFeature();
105: if (feature == null)
106: return false;
107: Class<? extends Geometry> class1 = feature
108: .getDefaultGeometry().getClass();
109: return super .isValid(handler)
110: && feature != null
111: && (class1 == Polygon.class || class1 == MultiPolygon.class);
112: }
113: });
114: mutualExclusive.getBehaviours().add(
115: new WriteChangesBehaviour(LineString.class) {
116: @Override
117: public boolean isValid(EditToolHandler handler) {
118: Feature feature = handler.getContext()
119: .getEditManager().getEditFeature();
120: if (feature == null)
121: return false;
122: Class<? extends Geometry> class1 = feature
123: .getDefaultGeometry().getClass();
124: return super .isValid(handler)
125: && feature != null
126: && (class1 == LineString.class || class1 == MultiLineString.class);
127: }
128: });
129: mutualExclusive.getBehaviours().add(
130: new WriteChangesBehaviour(Point.class) {
131: @Override
132: public boolean isValid(EditToolHandler handler) {
133: Feature feature = handler.getContext()
134: .getEditManager().getEditFeature();
135: if (feature == null)
136: return false;
137: Class<? extends Geometry> class1 = feature
138: .getDefaultGeometry().getClass();
139: return super .isValid(handler)
140: && feature != null
141: && (class1 == Point.class || class1 == MultiPoint.class);
142: }
143: });
144: }
145:
146: @Override
147: protected void initCancelBehaviours(List<Behaviour> cancelBehaviours) {
148: cancelBehaviours.add(new DefaultCancelBehaviour());
149: }
150:
151: @Override
152: protected void initEventBehaviours(
153: EditToolConfigurationHelper helper) {
154: helper.add(new DrawCreateVertexSnapAreaBehaviour());
155: helper.add(new CursorControlBehaviour(handler,
156: new StaticProvider<String>(
157: Messages.SelectionTool_select),
158: new CursorControlBehaviour.SystemCursorProvider(
159: SWT.CURSOR_SIZEALL),
160: new StaticProvider<String>(
161: Messages.SelectionTool_move_vertex),
162: new CursorControlBehaviour.SystemCursorProvider(
163: SWT.CURSOR_CROSS), new StaticProvider<String>(
164: Messages.SelectionTool_add_vertex)));
165:
166: // vertex selection OR geometry selection should not both happen so make them a mutual exclusion behaviour
167: helper.startMutualExclusiveList();
168: helper.add(new MouseDownVertexSelectorBehaviour());
169: helper.add(new VertexSelectorBehaviour());
170: helper.add(new SelectGeometryBehaviour(
171: new Class[] { Geometry.class },
172: FilterType.GEOMETRY_INTERSECTS));
173:
174: helper.startAdvancedFeatures();
175: helper.add(new AddVertexOnEdgeBehaviour());
176: helper.stopAdvancedFeatures();
177:
178: helper.stopMutualExclusiveList();
179:
180: helper.startMutualExclusiveList();
181: helper.add(new MoveVertexBehaviour());
182: helper.add(new MoveGeometryBehaviour());
183: helper.stopMutualExclusiveList();
184:
185: helper.add(new SelectionBoxBehaviour());
186: helper.add(new DoubleClickRunAcceptBehaviour());
187: helper.add(new SetSnapSizeBehaviour());
188: helper.done();
189: }
190:
191: @Override
192: protected String getExtensionID() {
193: return "net.refractions.udig.tools.selectionTool"; //$NON-NLS-1$
194: }
195:
196: }
|