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 @ 38

History | View | Annotate | Download (13 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.event.MouseEvent;
13
import java.awt.geom.Point2D;
14
import java.awt.image.BufferedImage;
15
import java.util.HashMap;
16
import java.util.Map;
17

    
18
import org.cresques.cts.IProjection;
19
import org.gvsig.andami.PluginServices;
20
import org.gvsig.andami.ui.mdiFrame.MainFrame;
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.geom.primitive.Point;
25
import org.gvsig.fmap.mapcontext.MapContext;
26
import org.gvsig.fmap.mapcontext.ViewPort;
27
import org.gvsig.fmap.mapcontext.layers.CancelationException;
28
import org.gvsig.fmap.mapcontext.layers.FLayer;
29
import org.gvsig.fmap.mapcontext.layers.FLayers;
30
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
31
import org.gvsig.fmap.mapcontext.layers.LayerCollectionListener;
32
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
33
import org.gvsig.fmap.mapcontext.layers.LayerListener;
34
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
35
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
36
import org.gvsig.fmap.mapcontrol.MapControl;
37
import org.gvsig.fmap.mapcontrol.MapControlDrawer;
38
import org.gvsig.fmap.mapcontrol.MapControlLocator;
39
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
40
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
41
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
42
import org.gvsig.utils.console.JConsole;
43
import org.gvsig.utils.console.ResponseListener;
44
import org.gvsig.utils.console.jedit.JEditTextArea;
45
import org.gvsig.vectorediting.lib.api.EditingBehavior;
46
import org.gvsig.vectorediting.lib.api.EditingLocator;
47
import org.gvsig.vectorediting.lib.api.EditingManager;
48
import org.gvsig.vectorediting.lib.api.EditingService;
49
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
50

    
51
public class DefaultEditingBehavior extends Behavior implements EditingBehavior {
52

    
53
  private Map<FLyrVect, EditingService> serviceRegistration;
54

    
55
  private MapControl mapControl;
56

    
57
  private FLyrVect currentLayer;
58

    
59
  private EditingService activeService;
60

    
61
  private EditingServiceParameter currentParam;
62

    
63
  private Point adjustedPoint;
64

    
65
  private StatusBarListener sbl = null;
66

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

    
81
  private LayerListener layerListener = new LayerListener() {
82

    
83
    public void activationChanged(LayerEvent e) {
84
      DefaultViewPanel view = getActiveView();
85
      FLayer layer = e.getSource();
86
      if (layer instanceof FLyrVect) {
87

    
88
        if (layer.isActive() && layer.isEditing()) {
89
          view.showConsole();
90
          getMapControl().setTool("VectorEditing");
91
          // cleanBehavior();
92
        }
93
        else if (!layer.isEditing() && layer.isActive()) {
94
          changeCurrentLayer((FLyrVect) layer);
95
          view.hideConsole();
96
          getMapControl().setTool("zoomIn");
97
          PluginServices.getMainFrame().setSelectedTool("ZOOM_IN");
98
        }
99
        changeCurrentLayer((FLyrVect) layer);
100

    
101
      }
102

    
103
    }
104

    
105
    public void drawValueChanged(LayerEvent e) {}
106

    
107
    public void editionChanged(LayerEvent e) {}
108

    
109
    public void nameChanged(LayerEvent e) {}
110

    
111
    public void visibilityChanged(LayerEvent e) {}
112
  };
113

    
114
  public void cleanBehavior() {
115
    // activeService = null;
116
    // currentParam = null;
117

    
118
    DefaultViewPanel view = getActiveView();
119
    view.getConsolePanel().addText("\nSeleccione un herramienta\n",
120
        JConsole.MESSAGE);
121
//    MainFrame main = PluginServices.getMainFrame();
122
//    main.setSelectedTool("");  We can define a default tool. I.E Zoom in.
123
  }
124

    
125
  public DefaultEditingBehavior(MapControl mapControl) {
126
    // TODO Auto-generated constructor stub
127
    if (mapControl != null) {
128
      this.mapControl = mapControl;
129
      serviceRegistration = new HashMap<FLyrVect, EditingService>();
130
      sbl = new StatusBarListener(mapControl);
131
      initMapControlListeners(mapControl);
132
      FLayers layers = mapControl.getMapContext().getLayers();
133
      for (int i = 0; i < layers.getLayersCount(); i++) {
134
        if (layers.getLayer(i) instanceof FLyrVect
135
            && layers.getLayer(i).isActive())
136
          changeCurrentLayer((FLyrVect) layers.getLayer(i));
137
      }
138

    
139
    }
140
  }
141

    
142
  public void activateTool(String name) {
143

    
144
    EditingManager manager = EditingLocator.getManager();
145

    
146
    if (currentLayer != null) {
147
      EditingService service = serviceRegistration.get(currentLayer);
148
      if (service == null) {
149
        service = (EditingService) manager
150
            .getEditingService(name, currentLayer);
151
        serviceRegistration.put(currentLayer, service);
152
      }
153
      if (service != null) {
154
        this.activeService = service;
155
        service.start();
156
        getNextParameter();
157
      }
158
    }
159
  }
160

    
161
  private void askQuestion(EditingServiceParameter param) {
162
    DefaultViewPanel viewActive = getActiveView();
163
    if (viewActive != null) {
164
      viewActive.getConsolePanel().addText(
165
          "\n" + "#" + param.getConsoleMessage() + " > ", JConsole.MESSAGE);
166
    }
167
  }
168

    
169
  private DefaultViewPanel getActiveView() {
170
    org.gvsig.andami.ui.mdiManager.IWindow activeWindow = PluginServices
171
        .getMDIManager().getActiveWindow();
172

    
173
    if (activeWindow instanceof DefaultViewPanel) {
174
      return (DefaultViewPanel) activeWindow;
175
    }
176
    return null;
177
  }
178

    
179
  @Override
180
  public ToolListener getListener() {
181
    return new ToolListener() {
182

    
183
      /**
184
       * 
185
       */
186
      public boolean cancelDrawing() {
187
        return false;
188
      }
189

    
190
      /**
191
       * 
192
       */
193
      public Image getImageCursor() {
194
        return imageCursor;
195
      }
196
    };
197
  }
198

    
199
  private void getNextParameter() {
200
    currentParam = activeService.next();
201
    if (currentParam == null) {
202
      activeService.finish();
203
      mapControl.rePaintDirtyLayers();
204
      activeService.start();
205
      getNextParameter();
206
    }
207
    else {
208
      askQuestion(currentParam);
209
      setCaretPosition(getActiveView());
210
    }
211

    
212
  }
213

    
214
  private void initMapControlListeners(MapControl mapControl) {
215
    DefaultViewPanel view = getActiveView();
216

    
217
    view.addConsoleListener("VectorEditingConsole", new ResponseListener() {
218

    
219
      public void acceptResponse(String response) {
220
        try {
221
          textEntered(response);
222
        }
223
        catch (RuntimeException e) {
224
          showErrorConsole(e);
225
          getNextParameter();
226
        }
227
      }
228

    
229
      private void showErrorConsole(RuntimeException e) {
230
        DefaultViewPanel view = getActiveView();
231
        view.getConsolePanel().addText(e.getMessage(), JConsole.ERROR);
232

    
233
      }
234
    });
235

    
236
    MapContext context = mapControl.getMapContext();
237
    FLayers layers = context.getLayers();
238
    layers.addLayerListener(layerListener);
239

    
240
    layers.addLayerCollectionListener(new LayerCollectionListener() {
241

    
242
      public void layerAdded(LayerCollectionEvent e) {
243
        FLayers layers2 = e.getLayers();
244
        for (int i = 0; i < layers2.getLayersCount(); i++) {
245
          FLayer layer = layers2.getLayer(i);
246
          if (layer instanceof FLyrVect) {
247
            ((FLyrVect) layer).addLayerListener(layerListener);
248
          }
249
        }
250
      }
251

    
252
      public void layerAdding(LayerCollectionEvent e)
253
          throws CancelationException {}
254

    
255
      public void layerMoved(LayerPositionEvent e) {}
256

    
257
      public void layerMoving(LayerPositionEvent e) throws CancelationException {}
258

    
259
      public void layerRemoved(LayerCollectionEvent e) {
260
        FLayers layers2 = e.getLayers();
261
        for (int i = 0; i < layers2.getLayersCount(); i++) {
262
          FLayer layer = layers2.getLayer(i);
263
          if (layer instanceof FLyrVect) {
264
            ((FLyrVect) layer).removeLayerListener(layerListener);
265
          }
266
        }
267
      }
268

    
269
      public void layerRemoving(LayerCollectionEvent e)
270
          throws CancelationException {}
271

    
272
      public void visibilityChanged(LayerCollectionEvent e)
273
          throws CancelationException {}
274
    });
275
  }
276

    
277
  public void mouseClicked(MouseEvent e) throws BehaviorException {
278
    // TODO Auto-generated method stub
279
    if (activeService != null) {
280
      if (currentParam != null) {
281
        switch (currentParam.getType()) {
282
          case EditingServiceParameter.TYPE_POINT:
283
            ViewPort vp = mapControl.getViewPort();
284
            Point point;
285
            point = vp.convertToMapPoint(e.getX(), e.getY());
286
            this.activeService.value(point);
287

    
288
          case EditingServiceParameter.TYPE_LIST_POINTS:
289
          case EditingServiceParameter.TYPE_OPTION:
290
          case EditingServiceParameter.TYPE_SELECTION:
291
          case EditingServiceParameter.TYPE_GEOMETRY:
292
          case EditingServiceParameter.TYPE_VALUE:
293
        }
294
        getNextParameter();
295
      }
296

    
297
    }
298
  }
299

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

    
304
  public void mouseMoved(MouseEvent e) throws BehaviorException {
305
    ViewPort vp = mapControl.getViewPort();
306
    adjustedPoint = vp.convertToMapPoint(e.getX(),e.getY());
307
    showCoords(e.getPoint());
308

    
309
    getMapControl().repaint();
310
  }
311

    
312
  public void mousePressed(MouseEvent e) throws BehaviorException {
313
    // TODO Auto-generated method stub
314
  }
315

    
316
  public void mouseReleased(MouseEvent e) throws BehaviorException {
317
    // TODO Auto-generated method stub
318
  }
319

    
320
  public void paintComponent(MapControlDrawer mapControlDrawer) {
321
    super.paintComponent(mapControlDrawer);
322
    if (activeService == null || adjustedPoint == null) {
323
      return;
324
    }
325

    
326
    Geometry helperGeo = activeService.draw(adjustedPoint);
327
    if (helperGeo != null) {
328
      mapControl.getMapControlDrawer().draw(helperGeo,
329
          MapControlLocator.getMapControlManager().getAxisReferenceSymbol());
330
    }
331
  }
332

    
333
  private void setCaretPosition(DefaultViewPanel view) {
334

    
335
    JEditTextArea jeta = view.getConsolePanel().getTxt();
336
    jeta.requestFocusInWindow();
337
    jeta.setCaretPosition(jeta.getText().length());
338

    
339
  }
340

    
341
  private void changeCurrentLayer(FLyrVect layer) {
342
    this.currentLayer = layer;
343
    this.activeService = serviceRegistration.get(layer);
344
    if (activeService != null) {
345
      getNextParameter();
346
      MainFrame main = PluginServices.getMainFrame();
347
      main.setSelectedTool(activeService.getName());
348
    }
349
  }
350

    
351
  private void showCoords(Point2D point) {
352
    String[] axisText = new String[2];
353
    axisText[0] = "X = ";
354
    axisText[1] = "Y = ";
355

    
356
    ViewPort vp = mapControl.getMapContext().getViewPort();
357
    IProjection iProj = vp.getProjection();
358
    Point p = vp.convertToMapPoint(point);
359
    Point2D p2D = new Point2D.Double(p.getX(), p.getY());
360

    
361
    sbl.setFractionDigits(p2D);
362
    axisText = sbl.setCoorDisplayText(axisText);
363
    MainFrame mF = PluginServices.getMainFrame();
364

    
365
    if (mF != null) {
366
      mF.getStatusBar().setMessage(
367
          "units",
368
          PluginServices.getText(this,
369
              MapContext.getDistanceNames()[vp.getDistanceUnits()]));
370
      mF.getStatusBar().setControlValue("scale",
371
          String.valueOf(mapControl.getMapContext().getScaleView()));
372
      mF.getStatusBar().setMessage("projection", iProj.getAbrev());
373

    
374
      String[] coords = sbl.getCoords(p2D);
375
      mF.getStatusBar().setMessage("x", axisText[0] + coords[0]);
376
      mF.getStatusBar().setMessage("y", axisText[1] + coords[1]);
377
    }
378

    
379
  }
380

    
381
  private void textEntered(String response) {
382
    if (response == null) {
383
      cleanBehavior();
384
    }
385
    else {
386
      int type = currentParam.getType();
387
      try {
388
        switch (type) {
389
          case EditingServiceParameter.TYPE_POINT:
390
            String[] numbers = new String[1];
391
            numbers[0] = response;
392
            numbers = response.split(",");
393
            if (numbers.length == 2) {
394
              if (numbers[0].startsWith("(") && numbers[1].endsWith(")\n")) { // CCS
395
                numbers[0] = numbers[0].replace("(", "");
396
                numbers[1] = numbers[1].replace(")\n", "");
397
              }
398
              double[] values = new double[] { Double.parseDouble(numbers[0]),
399
                  Double.parseDouble(numbers[1]) };
400
              Point2D point = new Point2D.Double(values[0], values[1]);
401
              this.activeService.value(point);
402

    
403
            }
404
            else {
405
              throw new RuntimeException("Datos inv?lidos: " + response);
406
            }
407
          case EditingServiceParameter.TYPE_LIST_POINTS:
408
          case EditingServiceParameter.TYPE_OPTION:
409
          case EditingServiceParameter.TYPE_SELECTION:
410
          case EditingServiceParameter.TYPE_GEOMETRY:
411
          case EditingServiceParameter.TYPE_VALUE:
412
        }
413
        getNextParameter();
414
      }
415
      catch (Exception e) {
416
        throw new RuntimeException("Datos inv?lidos: " + response);
417
      }
418
    }
419
  }
420
}