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

History | View | Annotate | Download (10.6 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.project.documents.view.gui.DefaultViewPanel;
21
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
22
import org.gvsig.fmap.mapcontext.MapContext;
23
import org.gvsig.fmap.mapcontext.ViewPort;
24
import org.gvsig.fmap.mapcontext.layers.CancelationException;
25
import org.gvsig.fmap.mapcontext.layers.FLayer;
26
import org.gvsig.fmap.mapcontext.layers.FLayers;
27
import org.gvsig.fmap.mapcontext.layers.LayerCollectionEvent;
28
import org.gvsig.fmap.mapcontext.layers.LayerCollectionListener;
29
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
30
import org.gvsig.fmap.mapcontext.layers.LayerListener;
31
import org.gvsig.fmap.mapcontext.layers.LayerPositionEvent;
32
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
33
import org.gvsig.fmap.mapcontrol.MapControl;
34
import org.gvsig.fmap.mapcontrol.tools.BehaviorException;
35
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
36
import org.gvsig.fmap.mapcontrol.tools.Listeners.ToolListener;
37
import org.gvsig.utils.console.JConsole;
38
import org.gvsig.utils.console.ResponseListener;
39
import org.gvsig.vectorediting.lib.api.EditingBehavior;
40
import org.gvsig.vectorediting.lib.api.EditingLocator;
41
import org.gvsig.vectorediting.lib.api.EditingManager;
42
import org.gvsig.vectorediting.lib.api.EditingService;
43
import org.gvsig.vectorediting.lib.api.EditingServiceParameter;
44

    
45
public class DefaultEditingBehavior extends Behavior implements EditingBehavior {
46

    
47
  private MapControl mapControl;
48

    
49
  private FLyrVect currentLayer;
50

    
51
  private EditingService activatedTool;
52

    
53
  private EditingServiceParameter currentParam;
54

    
55
  private StatusBarListener sbl = null;
56

    
57
  private static final Image imageCursor = new BufferedImage(32, 32,
58
      BufferedImage.TYPE_INT_ARGB);
59
  static {
60
    Graphics g = imageCursor.getGraphics();
61
    int size1 = 15;
62
    int x = 16;
63
    int y = 16;
64
    g.setColor(Color.MAGENTA);
65
    g.drawLine((x - size1), (y), (x + size1), (y));
66
    g.drawLine((x), (y - size1), (x), (y + size1));
67
    g.drawRect((x - 6), (y - 6), 12, 12);
68
    g.drawRect((x - 3), (y - 3), 6, 6);
69
  }
70

    
71
  public DefaultEditingBehavior(MapControl mapControl) {
72
    // TODO Auto-generated constructor stub
73
    if (mapControl != null) {
74
      this.mapControl = mapControl;
75
      sbl = new StatusBarListener(mapControl);
76
      initMapControlListeners(mapControl);
77
      FLayers layers = mapControl.getMapContext().getLayers();
78
      for (int i = 0; i < layers.getLayersCount(); i++) {
79
        if (layers.getLayer(i) instanceof FLyrVect)
80
          setCurrentLayer((FLyrVect) layers.getLayer(i));
81
      }
82

    
83
    }
84
  }
85

    
86
  private LayerListener layerListener = new LayerListener() {
87

    
88
    public void visibilityChanged(LayerEvent e) {}
89

    
90
    public void nameChanged(LayerEvent e) {}
91

    
92
    public void editionChanged(LayerEvent e) {}
93

    
94
    public void drawValueChanged(LayerEvent e) {}
95

    
96
    public void activationChanged(LayerEvent e) {
97
      FLayer layer = e.getSource();
98
      if (layer.isEditing() && layer instanceof FLyrVect) {
99
        setCurrentLayer((FLyrVect) layer);
100
      }
101
    }
102
  };
103

    
104
  private void initMapControlListeners(MapControl mapControl) {
105
    DefaultViewPanel view = getActiveView();
106

    
107
    view.addConsoleListener("VectorEditingConsole", new ResponseListener() {
108

    
109
      public void acceptResponse(String response) {
110
        try {
111
          textEntered(response);
112
        }
113
        catch (RuntimeException e) {
114
          showErrorConsole(e);
115
          getNextParameter();
116
        }
117
      }
118

    
119
      private void showErrorConsole(RuntimeException e) {
120
        DefaultViewPanel view = getActiveView();
121
        view.getConsolePanel().addText(e.getMessage(), JConsole.ERROR);
122

    
123
      }
124
    });
125

    
126
    MapContext context = mapControl.getMapContext();
127
    FLayers layers = context.getLayers();
128
    layers.addLayerListener(layerListener);
129

    
130
    layers.addLayerCollectionListener(new LayerCollectionListener() {
131

    
132
      public void visibilityChanged(LayerCollectionEvent e)
133
          throws CancelationException {}
134

    
135
      public void layerRemoving(LayerCollectionEvent e)
136
          throws CancelationException {}
137

    
138
      public void layerRemoved(LayerCollectionEvent e) {
139
        FLayers layers2 = e.getLayers();
140
        for (int i = 0; i < layers2.getLayersCount(); i++) {
141
          FLayer layer = layers2.getLayer(i);
142
          if (layer instanceof FLyrVect) {
143
            ((FLyrVect) layer).removeLayerListener(layerListener);
144
          }
145
        }
146
      }
147

    
148
      public void layerMoving(LayerPositionEvent e) throws CancelationException {}
149

    
150
      public void layerMoved(LayerPositionEvent e) {}
151

    
152
      public void layerAdding(LayerCollectionEvent e)
153
          throws CancelationException {}
154

    
155
      public void layerAdded(LayerCollectionEvent e) {
156
        FLayers layers2 = e.getLayers();
157
        for (int i = 0; i < layers2.getLayersCount(); i++) {
158
          FLayer layer = layers2.getLayer(i);
159
          if (layer instanceof FLyrVect) {
160
            ((FLyrVect) layer).addLayerListener(layerListener);
161
          }
162
        }
163
      }
164
    });
165
  }
166

    
167
  private void textEntered(String response) {
168
    int type = currentParam.getType();
169
    try {
170
      switch (type) {
171
        case EditingServiceParameter.TYPE_POINT:
172
          String[] numbers = new String[1];
173
          numbers[0] = response;
174
          numbers = response.split(",");
175
          if (numbers.length == 2) {
176
            if (numbers[0].startsWith("(") && numbers[1].endsWith(")\n")) { // CCS
177
              numbers[0] = numbers[0].replace("(", "");
178
              numbers[1] = numbers[1].replace(")\n", "");
179
            }
180
            double[] values = new double[] { Double.parseDouble(numbers[0]),
181
                Double.parseDouble(numbers[1]) };
182
            Point2D point = new Point2D.Double(values[0], values[1]);
183
            this.activatedTool.setValueParameter(currentParam, point);
184

    
185
          }
186
          else {
187
            throw new RuntimeException("Datos inv?lidos: " + response);
188
          }
189
        case EditingServiceParameter.TYPE_LIST_POINTS:
190
        case EditingServiceParameter.TYPE_OPTION:
191
        case EditingServiceParameter.TYPE_SELECTION:
192
        case EditingServiceParameter.TYPE_GEOMETRY:
193
        case EditingServiceParameter.TYPE_VALUE:
194
      }
195
      getNextParameter();
196
    }
197
    catch (Exception e) {
198
      throw new RuntimeException("Datos inv?lidos: " + response);
199
    }
200
  }
201

    
202
  public void setCurrentLayer(FLyrVect layer) {
203
    this.currentLayer = layer;
204
  }
205

    
206
  public void activateTool(String name) {
207

    
208
    EditingManager manager = EditingLocator.getManager();
209

    
210
    if (currentLayer != null) {
211
      EditingService tool = (EditingService) manager.getEditingService(name,
212
          currentLayer);
213
      if (tool != null) {
214
        this.activatedTool = tool;
215
        tool.start();
216
        getNextParameter();
217
      }
218
    }
219
  }
220

    
221
  private void getNextParameter() {
222
    currentParam = activatedTool.getNextParameter();
223
    if (currentParam == null) {
224
      activatedTool.finishOperation();
225
      mapControl.rePaintDirtyLayers();
226
      activatedTool.start();
227
      getNextParameter();
228
    }
229
    else {
230
      askQuestion(currentParam);
231

    
232
    }
233

    
234
  }
235

    
236
  private void askQuestion(EditingServiceParameter param) {
237
    DefaultViewPanel viewActive = getActiveView();
238
    if (viewActive != null) {
239
      viewActive.getConsolePanel().addText(
240
          "\n" + "#" + param.getConsoleMessage() + " > ", JConsole.MESSAGE);
241
    }
242
  }
243

    
244
  private DefaultViewPanel getActiveView() {
245
    org.gvsig.andami.ui.mdiManager.IWindow activeWindow = PluginServices
246
        .getMDIManager().getActiveWindow();
247

    
248
    if (activeWindow instanceof DefaultViewPanel) {
249
      return (DefaultViewPanel) activeWindow;
250
    }
251
    return null;
252
  }
253

    
254
  @Override
255
  public ToolListener getListener() {
256
    return new ToolListener() {
257

    
258
      /**
259
       * 
260
       */
261
      public Image getImageCursor() {
262
        return imageCursor;
263
      }
264

    
265
      /**
266
       * 
267
       */
268
      public boolean cancelDrawing() {
269
        return false;
270
      }
271
    };
272
  }
273

    
274
  public void mouseClicked(MouseEvent e) throws BehaviorException {
275
    // TODO Auto-generated method stub
276
    if (activatedTool != null) {
277
      if (currentParam != null) {
278
        switch (currentParam.getType()) {
279
          case EditingServiceParameter.TYPE_POINT:
280
            ViewPort vp = mapControl.getViewPort();
281
            Point2D point;
282
            point = vp.toMapPoint(e.getX(), e.getY());
283
            this.activatedTool.setValueParameter(currentParam, point);
284

    
285
          case EditingServiceParameter.TYPE_LIST_POINTS:
286
          case EditingServiceParameter.TYPE_OPTION:
287
          case EditingServiceParameter.TYPE_SELECTION:
288
          case EditingServiceParameter.TYPE_GEOMETRY:
289
          case EditingServiceParameter.TYPE_VALUE:
290
        }
291
        getNextParameter();
292
      }
293

    
294
    }
295
  }
296

    
297
  public void mouseEntered(MouseEvent e) throws BehaviorException {
298
    // TODO Auto-generated method stub
299
  }
300

    
301
  public void mouseMoved(MouseEvent e) throws BehaviorException {
302
    showCoords(e.getPoint());
303

    
304
    getMapControl().repaint();
305
  }
306

    
307
  private void showCoords(Point point) {
308
    String[] axisText = new String[2];
309
    axisText[0] = "X = ";
310
    axisText[1] = "Y = ";
311

    
312
    ViewPort vp = mapControl.getMapContext().getViewPort();
313
    IProjection iProj = vp.getProjection();
314
    Point2D p = vp.toMapPoint((int) point.getX(), (int) point.getY());
315
    ;
316
    // if (mapAdjustedPoint == null) {
317
    // p = vp.toMapPoint(point);
318
    // } else {
319
    // p = mapAdjustedPoint;
320
    // }
321
    sbl.setFractionDigits(p);
322
    axisText = sbl.setCoorDisplayText(axisText);
323
    MainFrame mF = PluginServices.getMainFrame();
324

    
325
    if (mF != null) {
326
      mF.getStatusBar().setMessage(
327
          "units",
328
          PluginServices.getText(this,
329
              MapContext.getDistanceNames()[vp.getDistanceUnits()]));
330
      mF.getStatusBar().setControlValue("scale",
331
          String.valueOf(mapControl.getMapContext().getScaleView()));
332
      mF.getStatusBar().setMessage("projection", iProj.getAbrev());
333

    
334
      String[] coords = sbl.getCoords(p);
335
      mF.getStatusBar().setMessage("x", axisText[0] + coords[0]);
336
      mF.getStatusBar().setMessage("y", axisText[1] + coords[1]);
337
    }
338

    
339
  }
340

    
341
  public void mousePressed(MouseEvent e) throws BehaviorException {
342
    // TODO Auto-generated method stub
343
  }
344

    
345
  public void mouseReleased(MouseEvent e) throws BehaviorException {
346
    // TODO Auto-generated method stub
347
  }
348

    
349
}