Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.lib / org.gvsig.vectorediting.lib.impl / src / main / java / org / gvsig / vectorediting / lib / impl / DefaultEditingBehavior.java @ 30

History | View | Annotate | Download (12.2 KB)

1
/*
2
 * Copyright 2014 DiSiD Technologies S.L.L. All rights reserved.
3
 * 
4
 * Project  : DiSiD org.gvsig.vectorediting.lib.impl 
5
 * SVN Id   : $Id$
6
 */
7
package org.gvsig.vectorediting.lib.impl;
8

    
9
import java.awt.Color;
10
import java.awt.Graphics;
11
import java.awt.Image;
12
import java.awt.Point;
13
import java.awt.event.MouseEvent;
14
import java.awt.geom.Point2D;
15
import java.awt.image.BufferedImage;
16

    
17
import org.cresques.cts.IProjection;
18
import org.gvsig.andami.PluginServices;
19
import org.gvsig.andami.ui.mdiFrame.MainFrame;
20
import org.gvsig.app.ApplicationLocator;
21
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
22
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
23
import org.gvsig.fmap.geom.Geometry;
24
import org.gvsig.fmap.mapcontext.MapContext;
25
import org.gvsig.fmap.mapcontext.ViewPort;
26
import org.gvsig.fmap.mapcontext.layers.CancelationException;
27
import org.gvsig.fmap.mapcontext.layers.FLayer;
28
import org.gvsig.fmap.mapcontext.layers.FLayers;
29
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
30
import org.gvsig.fmap.mapcontext.layers.LayerCollectionListener;
31
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
32
import org.gvsig.fmap.mapcontext.layers.LayerListener;
33
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
34
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
35
import org.gvsig.fmap.mapcontrol.MapControl;
36
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
37
import org.gvsig.fmap.mapcontrol.MapControlLocator;
38
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
39
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
40
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
41
import org.gvsig.utils.console.JConsole;
42
import org.gvsig.utils.console.ResponseListener;
43
import org.gvsig.vectorediting.lib.api.EditingBehavior;
44
import org.gvsig.vectorediting.lib.api.EditingLocator;
45
import org.gvsig.vectorediting.lib.api.EditingManager;
46
import org.gvsig.vectorediting.lib.api.EditingService;
47
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
48

    
49
public class DefaultEditingBehavior extends Behavior implements EditingBehavior {
50

    
51
  private MapControl mapControl;
52

    
53
  private FLyrVect currentLayer;
54

    
55
  private EditingService activeService;
56

    
57
  private EditingServiceParameter currentParam;
58

    
59
  private Point adjustedPoint;
60

    
61
  private StatusBarListener sbl = null;
62

    
63
  private static final Image imageCursor = new BufferedImage(32, 32,
64
      BufferedImage.TYPE_INT_ARGB);
65
  static {
66
    Graphics g = imageCursor.getGraphics();
67
    int size1 = 15;
68
    int x = 16;
69
    int y = 16;
70
    g.setColor(Color.MAGENTA);
71
    g.drawLine((x - size1), (y), (x + size1), (y));
72
    g.drawLine((x), (y - size1), (x), (y + size1));
73
    g.drawRect((x - 6), (y - 6), 12, 12);
74
    g.drawRect((x - 3), (y - 3), 6, 6);
75
  }
76

    
77
  private LayerListener layerListener = new LayerListener() {
78

    
79
    public void activationChanged(LayerEvent e) {
80
      DefaultViewPanel view = getActiveView();
81
      FLayer layer = e.getSource();
82
      if (layer instanceof FLyrVect) {
83

    
84
        if (layer.isActive() && layer.isEditing()) {
85
          view.showConsole();
86
          getMapControl().setTool("VectorEditing");
87
          cleanBehavior();
88
        }
89
        else if (!layer.isEditing() && layer.isActive()) {
90
          setCurrentLayer((FLyrVect) layer);
91
          view.hideConsole();
92
          getMapControl().setTool("zoomIn");
93
          PluginServices.getMainFrame().setSelectedTool("ZOOM_IN");
94
        }
95
        setCurrentLayer((FLyrVect) layer);
96

    
97
      }
98

    
99
    }
100

    
101
    public void drawValueChanged(LayerEvent e) {}
102

    
103
    public void editionChanged(LayerEvent e) {}
104

    
105
    public void nameChanged(LayerEvent e) {}
106

    
107
    public void visibilityChanged(LayerEvent e) {}
108
  };
109

    
110
  public void cleanBehavior() {
111
    activeService = null;
112
    currentParam = null;
113
    
114
    DefaultViewPanel view = getActiveView();
115
    view.getConsolePanel().addText("\nSeleccione un herramienta\n", JConsole.MESSAGE);
116
    ApplicationLocator.getManager().refreshMenusAndToolBars();
117
  }
118

    
119
  public DefaultEditingBehavior(MapControl mapControl) {
120
    // TODO Auto-generated constructor stub
121
    if (mapControl != null) {
122
      this.mapControl = mapControl;
123
      sbl = new StatusBarListener(mapControl);
124
      initMapControlListeners(mapControl);
125
      FLayers layers = mapControl.getMapContext().getLayers();
126
      for (int i = 0; i < layers.getLayersCount(); i++) {
127
        if (layers.getLayer(i) instanceof FLyrVect
128
            && layers.getLayer(i).isActive())
129
          setCurrentLayer((FLyrVect) layers.getLayer(i));
130
      }
131

    
132
    }
133
  }
134

    
135
  public void activateTool(String name) {
136

    
137
    EditingManager manager = EditingLocator.getManager();
138
    
139
    if (currentLayer != null) {
140
      EditingService service = (EditingService) manager.getEditingService(name,
141
          currentLayer);
142
      if (service != null) {
143
        this.activatedTool = service;
144
        tool.start();
145
        getNextParameter();
146
      }
147
    }
148
  }
149

    
150
  private void askQuestion(EditingServiceParameter param) {
151
    DefaultViewPanel viewActive = getActiveView();
152
    if (viewActive != null) {
153
      viewActive.getConsolePanel().addText(
154
          "\n" + "#" + param.getConsoleMessage() + " > ", JConsole.MESSAGE);
155
    }
156
  }
157

    
158
  private DefaultViewPanel getActiveView() {
159
    org.gvsig.andami.ui.mdiManager.IWindow activeWindow = PluginServices
160
        .getMDIManager().getActiveWindow();
161

    
162
    if (activeWindow instanceof DefaultViewPanel) {
163
      return (DefaultViewPanel) activeWindow;
164
    }
165
    return null;
166
  }
167

    
168
  @Override
169
  public ToolListener getListener() {
170
    return new ToolListener() {
171

    
172
      /**
173
       * 
174
       */
175
      public boolean cancelDrawing() {
176
        return false;
177
      }
178

    
179
      /**
180
       * 
181
       */
182
      public Image getImageCursor() {
183
        return imageCursor;
184
      }
185
    };
186
  }
187

    
188
  private void getNextParameter() {
189
    currentParam = activeService.getNextParameter();
190
    if (currentParam == null) {
191
      activeService.finishOperation();
192
      mapControl.rePaintDirtyLayers();
193
      activeService.start();
194
      getNextParameter();
195
    }
196
    else {
197
      askQuestion(currentParam);
198

    
199
    }
200

    
201
  }
202

    
203
  private void initMapControlListeners(MapControl mapControl) {
204
    DefaultViewPanel view = getActiveView();
205

    
206
    view.addConsoleListener("VectorEditingConsole", new ResponseListener() {
207

    
208
      public void acceptResponse(String response) {
209
        try {
210
          textEntered(response);
211
        }
212
        catch (RuntimeException e) {
213
          showErrorConsole(e);
214
          getNextParameter();
215
        }
216
      }
217

    
218
      private void showErrorConsole(RuntimeException e) {
219
        DefaultViewPanel view = getActiveView();
220
        view.getConsolePanel().addText(e.getMessage(), JConsole.ERROR);
221

    
222
      }
223
    });
224

    
225
    MapContext context = mapControl.getMapContext();
226
    FLayers layers = context.getLayers();
227
    layers.addLayerListener(layerListener);
228

    
229
    layers.addLayerCollectionListener(new LayerCollectionListener() {
230

    
231
      public void layerAdded(LayerCollectionEvent e) {
232
        FLayers layers2 = e.getLayers();
233
        for (int i = 0; i < layers2.getLayersCount(); i++) {
234
          FLayer layer = layers2.getLayer(i);
235
          if (layer instanceof FLyrVect) {
236
            ((FLyrVect) layer).addLayerListener(layerListener);
237
          }
238
        }
239
      }
240

    
241
      public void layerAdding(LayerCollectionEvent e)
242
          throws CancelationException {}
243

    
244
      public void layerMoved(LayerPositionEvent e) {}
245

    
246
      public void layerMoving(LayerPositionEvent e) throws CancelationException {}
247

    
248
      public void layerRemoved(LayerCollectionEvent e) {
249
        FLayers layers2 = e.getLayers();
250
        for (int i = 0; i < layers2.getLayersCount(); i++) {
251
          FLayer layer = layers2.getLayer(i);
252
          if (layer instanceof FLyrVect) {
253
            ((FLyrVect) layer).removeLayerListener(layerListener);
254
          }
255
        }
256
      }
257

    
258
      public void layerRemoving(LayerCollectionEvent e)
259
          throws CancelationException {}
260

    
261
      public void visibilityChanged(LayerCollectionEvent e)
262
          throws CancelationException {}
263
    });
264
  }
265

    
266
  public void mouseClicked(MouseEvent e) throws BehaviorException {
267
    // TODO Auto-generated method stub
268
    if (activeService != null) {
269
      if (currentParam != null) {
270
        switch (currentParam.getType()) {
271
          case EditingServiceParameter.TYPE_POINT:
272
            ViewPort vp = mapControl.getViewPort();
273
            Point2D point;
274
            point = vp.toMapPoint(e.getX(), e.getY());
275
            this.activeService.setValueParameter(currentParam, point);
276

    
277
          case EditingServiceParameter.TYPE_LIST_POINTS:
278
          case EditingServiceParameter.TYPE_OPTION:
279
          case EditingServiceParameter.TYPE_SELECTION:
280
          case EditingServiceParameter.TYPE_GEOMETRY:
281
          case EditingServiceParameter.TYPE_VALUE:
282
        }
283
        getNextParameter();
284
      }
285

    
286
    }
287
  }
288

    
289
  public void mouseEntered(MouseEvent e) throws BehaviorException {
290
    // TODO Auto-generated method stub
291
  }
292

    
293
  public void mouseMoved(MouseEvent e) throws BehaviorException {
294
    adjustedPoint = e.getPoint();
295

    
296
    showCoords(adjustedPoint);
297

    
298
    getMapControl().repaint();
299
  }
300

    
301
  public void mousePressed(MouseEvent e) throws BehaviorException {
302
    // TODO Auto-generated method stub
303
  }
304

    
305
  public void mouseReleased(MouseEvent e) throws BehaviorException {
306
    // TODO Auto-generated method stub
307
  }
308

    
309
  @SuppressWarnings("deprecation")
310
  public void paintComponent(MapControlDrawer mapControlDrawer) {
311
    super.paintComponent(mapControlDrawer);
312
    if (activeService == null || adjustedPoint == null) {
313
      return;
314
    }
315
    Point2D p = null;
316

    
317
    p = getMapControl().getViewPort().toMapPoint(adjustedPoint);
318
    Geometry helperGeo = activeService.drawOperation(p);
319
    if (helperGeo != null) {
320
      mapControl.getMapControlDrawer().draw(helperGeo,
321
          MapControlLocator.getMapControlManager().getAxisReferenceSymbol());
322
    }
323
  }
324

    
325
  public void setCurrentLayer(FLyrVect layer) {
326
    this.currentLayer = layer;
327
  }
328

    
329
  private void showCoords(Point point) {
330
    String[] axisText = new String[2];
331
    axisText[0] = "X = ";
332
    axisText[1] = "Y = ";
333

    
334
    ViewPort vp = mapControl.getMapContext().getViewPort();
335
    IProjection iProj = vp.getProjection();
336
    Point2D p = vp.toMapPoint((int) point.getX(), (int) point.getY());
337
    ;
338
    // if (mapAdjustedPoint == null) {
339
    // p = vp.toMapPoint(point);
340
    // } else {
341
    // p = mapAdjustedPoint;
342
    // }
343
    sbl.setFractionDigits(p);
344
    axisText = sbl.setCoorDisplayText(axisText);
345
    MainFrame mF = PluginServices.getMainFrame();
346

    
347
    if (mF != null) {
348
      mF.getStatusBar().setMessage(
349
          "units",
350
          PluginServices.getText(this,
351
              MapContext.getDistanceNames()[vp.getDistanceUnits()]));
352
      mF.getStatusBar().setControlValue("scale",
353
          String.valueOf(mapControl.getMapContext().getScaleView()));
354
      mF.getStatusBar().setMessage("projection", iProj.getAbrev());
355

    
356
      String[] coords = sbl.getCoords(p);
357
      mF.getStatusBar().setMessage("x", axisText[0] + coords[0]);
358
      mF.getStatusBar().setMessage("y", axisText[1] + coords[1]);
359
    }
360

    
361
  }
362

    
363
  private void textEntered(String response) {
364
    int type = currentParam.getType();
365
    try {
366
      switch (type) {
367
        case EditingServiceParameter.TYPE_POINT:
368
          String[] numbers = new String[1];
369
          numbers[0] = response;
370
          numbers = response.split(",");
371
          if (numbers.length == 2) {
372
            if (numbers[0].startsWith("(") && numbers[1].endsWith(")\n")) { // CCS
373
              numbers[0] = numbers[0].replace("(", "");
374
              numbers[1] = numbers[1].replace(")\n", "");
375
            }
376
            double[] values = new double[] { Double.parseDouble(numbers[0]),
377
                Double.parseDouble(numbers[1]) };
378
            Point2D point = new Point2D.Double(values[0], values[1]);
379
            this.activeService.setValueParameter(currentParam, point);
380

    
381
          }
382
          else {
383
            throw new RuntimeException("Datos inv?lidos: " + response);
384
          }
385
        case EditingServiceParameter.TYPE_LIST_POINTS:
386
        case EditingServiceParameter.TYPE_OPTION:
387
        case EditingServiceParameter.TYPE_SELECTION:
388
        case EditingServiceParameter.TYPE_GEOMETRY:
389
        case EditingServiceParameter.TYPE_VALUE:
390
      }
391
      getNextParameter();
392
    }
393
    catch (Exception e) {
394
      throw new RuntimeException("Datos inv?lidos: " + response);
395
    }
396
  }
397

    
398
}