Statistics
| Revision:

gvsig-vectorediting / org.gvsig.vectorediting / trunk / org.gvsig.vectorediting / org.gvsig.vectorediting.main / src / main / java / org / gvsig / vectorediting / main / Main.java @ 89

History | View | Annotate | Download (16.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.vectorediting.main;
25

    
26
import java.awt.BorderLayout;
27
import java.awt.Dimension;
28
import java.awt.GridLayout;
29
import java.awt.event.ActionEvent;
30
import java.io.File;
31

    
32
import javax.swing.AbstractAction;
33
import javax.swing.JButton;
34
import javax.swing.JFrame;
35
import javax.swing.JLabel;
36
import javax.swing.JMenu;
37
import javax.swing.JMenuBar;
38
import javax.swing.JMenuItem;
39
import javax.swing.JTextField;
40
import javax.swing.JToolBar;
41
import javax.swing.SwingUtilities;
42
import javax.swing.WindowConstants;
43

    
44
import org.cresques.cts.IProjection;
45
import org.gvsig.fmap.crs.CRSFactory;
46
import org.gvsig.fmap.dal.DALLocator;
47
import org.gvsig.fmap.dal.DataManager;
48
import org.gvsig.fmap.dal.DataStoreParameters;
49
import org.gvsig.fmap.dal.exception.InitializeException;
50
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
51
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
52
import org.gvsig.fmap.dal.feature.FeatureStore;
53
import org.gvsig.fmap.geom.primitive.Envelope;
54
import org.gvsig.fmap.mapcontext.MapContext;
55
import org.gvsig.fmap.mapcontext.MapContextLocator;
56
import org.gvsig.fmap.mapcontext.MapContextManager;
57
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
58
import org.gvsig.fmap.mapcontext.layers.FLayer;
59
import org.gvsig.fmap.mapcontext.layers.order.impl.TrivialLayerOrderManager;
60
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
61
import org.gvsig.fmap.mapcontrol.MapControl;
62
import org.gvsig.fmap.mapcontrol.MapControlCreationException;
63
import org.gvsig.fmap.mapcontrol.MapControlLocator;
64
import org.gvsig.fmap.mapcontrol.MapControlManager;
65
import org.gvsig.fmap.mapcontrol.tools.PanListenerImpl;
66
import org.gvsig.fmap.mapcontrol.tools.ZoomInListenerImpl;
67
import org.gvsig.fmap.mapcontrol.tools.ZoomOutRightButtonListener;
68
import org.gvsig.fmap.mapcontrol.tools.Behavior.Behavior;
69
import org.gvsig.fmap.mapcontrol.tools.Behavior.MoveBehavior;
70
import org.gvsig.fmap.mapcontrol.tools.Behavior.PointBehavior;
71
import org.gvsig.fmap.mapcontrol.tools.Behavior.RectangleBehavior;
72
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
73
import org.gvsig.vectorediting.lib.api.EditingLocator;
74
import org.gvsig.vectorediting.lib.api.EditingManager;
75
import org.gvsig.vectorediting.lib.prov.circlecr.CircleCREditingProviderFactory;
76
import org.gvsig.vectorediting.lib.prov.circlecr.CircumferenceCREditingProviderFactory;
77
import org.gvsig.vectorediting.lib.prov.insertpoint.InsertPointEditingProviderFactory;
78
import org.gvsig.vectorediting.lib.prov.internalpolygon.InternalPolygonEditingProviderFactory;
79
import org.gvsig.vectorediting.lib.prov.polyline.PolylineEditingProviderFactory;
80
import org.gvsig.vectorediting.lib.prov.symmetry.SymmetryEditingProviderFactory;
81
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
82
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
83
import org.gvsig.vectorediting.swing.api.EditingBehavior;
84
import org.gvsig.vectorediting.swing.api.EditingContext;
85
import org.gvsig.vectorediting.swing.api.EditingSwingLocator;
86
import org.gvsig.vectorediting.swing.api.EditingSwingManager;
87
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
89

    
90
/**
91
 * Main executable class for testing the VectorEditing library.
92
 *
93
 * @author gvSIG Team
94
 * @version $Id$
95
 */
96
public class Main {
97

    
98
  private static final Logger logger = LoggerFactory.getLogger(Main.class);
99

    
100
  final EditingManager manager;
101

    
102
  final EditingSwingManager swingManager;
103

    
104
  final EditingProviderManager providerManager;
105

    
106
  final MapControlManager mapControlManager;
107

    
108
  final DataManager dataManager;
109

    
110
  final MapContextManager mapContextManager;
111

    
112
  EditingBehavior editingBehavior;
113

    
114
  MapControl mapControl;
115
  
116
  EditingContext editingContext;
117

    
118
  FeatureStore store;
119

    
120
  FLyrVect currentLayer;
121

    
122
  final String DEFAULT_CRS_CODE = "EPSG:23030";
123

    
124
  IProjection defaultProjection;
125

    
126
  TrivialLayerOrderManager layerOrderManager;
127

    
128
  JFrame mainFrame;
129

    
130
  JFrame addLayerFrame;
131

    
132
  JFrame paletteTools;
133

    
134
  JTextField shpField;
135

    
136
  // Actions
137
  AbstractAction pan;
138

    
139
  AbstractAction zoom;
140

    
141
  AbstractAction zoomall;
142

    
143
  AbstractAction cleanMap;
144

    
145
  AbstractAction openAddLayerDialog;
146

    
147
  AbstractAction openPaletteTools;
148

    
149
  AbstractAction editingExtensionAction;
150
  
151
  AbstractAction endEditingExtensionAction;
152

    
153
  AbstractAction insertPoint;
154

    
155
  AbstractAction exit;
156

    
157
  AbstractAction addLayer;
158

    
159
  AbstractAction circleCr;
160

    
161
  AbstractAction circunferenceCr;
162

    
163
  AbstractAction polyline;
164

    
165
  AbstractAction symmetry;
166
  
167
  AbstractAction internalPolygon;
168

    
169
  public static void main(String args[]) {
170
    new DefaultLibrariesInitializer().fullInitialize();
171
    Main main = new Main();
172
    main.doMain();
173
  }
174

    
175
  public Main() {
176
    manager = EditingLocator.getManager();
177
    swingManager = EditingSwingLocator.getSwingManager();
178
    providerManager = EditingProviderLocator.getProviderManager();
179
    mapControlManager = MapControlLocator.getMapControlManager();
180
    dataManager = DALLocator.getDataManager();
181
    mapContextManager = MapContextLocator.getMapContextManager();
182
    defaultProjection = CRSFactory.getCRS(DEFAULT_CRS_CODE);
183
    layerOrderManager = new TrivialLayerOrderManager();
184
  }
185

    
186
  public void doMain() {
187

    
188
    try {
189
      mapControl = mapControlManager.createJMapControlPanel();
190
      
191
//      editingBehavior = new DefaultEditingBehavior(editingContext, mapControl);
192
//      EditingCompoundBehavior editingCompoundBehavior = new EditingCompoundBehavior(editingBehavior);
193
//      mapControl.addBehavior("VectorEditing", editingCompoundBehavior);
194

    
195
      mapControl.addBehavior("zoom", new Behavior[] {
196
          new RectangleBehavior(new ZoomInListenerImpl(mapControl)),
197
          new PointBehavior(new ZoomOutRightButtonListener(mapControl)) });
198
      mapControl.addBehavior("pan", new MoveBehavior(new PanListenerImpl(mapControl)));
199

    
200

    
201
      IProjection defaultProjection = CRSFactory.getCRS(DEFAULT_CRS_CODE);
202
      mapControl.getViewPort().setProjection(defaultProjection);
203

    
204
      // Create actions
205
      createActions();
206
    }
207
    catch (MapControlCreationException e) {
208
      logger.error("Can't create mapControl",e);
209
    }
210
    // Create JFrame to show data
211
    mainFrame = new JFrame("Editing test app");
212
    mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
213
    mainFrame.setPreferredSize(new Dimension(800, 680));
214
    mainFrame.add(mapControl, BorderLayout.CENTER);
215

    
216
    // Create JFrame to add layer
217
    createAddLayerJFrame();
218

    
219
    // create JFrame palette tools
220
    createShowPaletteTools();
221

    
222
    // Create menu bar
223
    createMenu();
224

    
225
    // Create tools bar
226
    createToolBar();
227

    
228
    // Display the window.
229
    mainFrame.pack();
230
    mainFrame.setLocation(500, 0);
231
    mainFrame.setVisible(true);
232
  }
233

    
234
  private void createAddLayerJFrame() {
235
    addLayerFrame = new JFrame("Add layer");
236
    addLayerFrame.setLayout(new GridLayout(4, 2, 3, 3));
237
    addLayerFrame.setPreferredSize(new Dimension(400, 150));
238
    addLayerFrame.pack();
239
    addLayerFrame.setLocation(250, 250);
240
    addLayerFrame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
241

    
242
    JLabel shpLabel = new JLabel("Archivo SHP");
243
    shpField = new JTextField();
244

    
245
    addLayerFrame.add(shpLabel);
246
    addLayerFrame.add(shpField);
247
    addLayerFrame.add(new JLabel());
248

    
249
    JButton aceptarButton = new JButton(addLayer);
250
    addLayerFrame.add(aceptarButton, BorderLayout.LINE_END);
251

    
252
  }
253

    
254
  private void createShowPaletteTools() {
255
    paletteTools = new JFrame("Palette tools");
256
    paletteTools.setLayout(new GridLayout(20, 1, 1, 5));
257
    paletteTools.setPreferredSize(new Dimension(200, 600));
258
    paletteTools.pack();
259
    paletteTools.setLocation(0, 0);
260
    paletteTools.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
261

    
262
    JButton insertPointButton = new JButton(insertPoint);
263
    JButton circleCrButton = new JButton(circleCr);
264
    JButton polylineButton = new JButton(polyline);
265
    JButton symmetryButton = new JButton(symmetry);
266
    JButton internalPolygonButton = new JButton(internalPolygon);
267

    
268
    paletteTools.add(new JLabel("Insert tools"));
269
    paletteTools.add(insertPointButton);
270
    paletteTools.add(circleCrButton);
271
    paletteTools.add(polylineButton);
272
    
273
    paletteTools.add(new JLabel("Modify tools"));
274
    paletteTools.add(symmetryButton);
275
    paletteTools.add(internalPolygonButton);
276
  }
277

    
278
  private void createToolBar() {
279
    JToolBar toolBar = new JToolBar();
280

    
281
    toolBar.add(new JButton(openAddLayerDialog));
282
    toolBar.add(new JButton(editingExtensionAction));
283
    toolBar.add(new JButton(endEditingExtensionAction));
284
    toolBar.add(new JButton(pan));
285
    toolBar.add(new JButton(zoom));
286
    toolBar.add(new JButton(zoomall));
287
    toolBar.add(new JButton(cleanMap));
288
    toolBar.add(new JButton(openPaletteTools));
289

    
290
    mainFrame.add(toolBar, BorderLayout.PAGE_START);
291
  }
292

    
293
  private void createMenu() {
294
    // Create the menu bar.
295
    JMenuBar menuBar = new JMenuBar();
296

    
297
    // Build the menu.
298
    JMenu menuFile = new JMenu("File");
299
    menuFile.add(new JMenuItem(exit));
300

    
301
    JMenu menuLayer = new JMenu("Layer");
302
    menuLayer.add(new JMenuItem(openAddLayerDialog));
303
    menuLayer.add(new JMenuItem(pan));
304
    menuLayer.add(new JMenuItem(zoom));
305
    menuLayer.add(new JMenuItem(zoomall));
306
    menuLayer.add(new JMenuItem(cleanMap));
307

    
308
    JMenu menuTool = new JMenu("Tools");
309
    menuTool.add(new JMenuItem(editingExtensionAction));
310
    menuTool.add(new JMenuItem(endEditingExtensionAction));
311
    menuTool.addSeparator();
312
    menuTool.add(new JMenuItem(insertPoint));
313
    menuTool.add(new JMenuItem(circleCr));
314
    menuTool.add(new JMenuItem(polyline));
315
    menuTool.add(new JMenuItem(symmetry));
316

    
317
    menuBar.add(menuFile);
318
    menuBar.add(menuTool);
319

    
320
    mainFrame.setJMenuBar(menuBar);
321
  }
322

    
323
  @SuppressWarnings("serial")
324
  private void createActions() throws MapControlCreationException {
325

    
326
    pan = new AbstractAction("Pan") {
327

    
328
      public void actionPerformed(ActionEvent e) {
329
        mapControl.setTool("pan");
330
      }
331
    };
332

    
333
    zoom = new AbstractAction("Zoom") {
334

    
335
      public void actionPerformed(ActionEvent e) {
336
        mapControl.setTool("zoom");
337
      }
338
    };
339

    
340
    zoomall = new AbstractAction("Zoom all") {
341

    
342
      public void actionPerformed(ActionEvent e) {
343
        zoomAll();
344
      }
345
    };
346

    
347
    cleanMap = new AbstractAction("Clean Map") {
348

    
349
      public void actionPerformed(ActionEvent e) {
350
        MapContext mapContext = mapControl.getMapContext();
351
        mapContext.beginAtomicEvent();
352
        while (mapContext.getLayers().getLayersCount() > 0) {
353
          mapContext.getLayers().removeLayer(0);
354
        }
355
        mapContext.endAtomicEvent();
356
        
357
      }
358
    };
359

    
360
    openAddLayerDialog = new AbstractAction("Add layer") {
361

    
362
      public void actionPerformed(ActionEvent e) {
363
        addLayerFrame.setVisible(true);
364
      }
365
    };
366

    
367
    openPaletteTools = new AbstractAction("Show palette tools") {
368

    
369
      public void actionPerformed(ActionEvent e) {
370
        paletteTools.setVisible(true);
371
      }
372
    };
373

    
374
    addLayer = new AbstractAction("OK") {
375

    
376
      public void actionPerformed(ActionEvent e) {
377
        String shpPath = shpField.getText();
378

    
379
        try {
380
          addLayer(shpPath);
381
        }
382
        catch (Exception e1) {
383
          logger.error("Problems adding layer");
384
          e1.printStackTrace();
385
        }
386
        addLayerFrame.setVisible(false);
387
      }
388
    };
389

    
390
    exit = new AbstractAction("Exit") {
391

    
392
      public void actionPerformed(ActionEvent e) {
393
        System.exit(0);
394
      }
395
    };
396

    
397
    editingExtensionAction = new AbstractAction("EditingExtension") {
398

    
399
      public void actionPerformed(ActionEvent e) {
400
        editingContext = swingManager.getEditingContext(mapControl);
401
        editingContext.beginEdition(currentLayer, null);
402
        
403
        // XXX Forces component repaint.
404
        SwingUtilities.updateComponentTreeUI(mainFrame);
405
      }
406
    };
407
    
408
    endEditingExtensionAction = new AbstractAction("EndEditingExtension") {
409

    
410
      public void actionPerformed(ActionEvent e) {
411
        editingContext = swingManager.getEditingContext(mapControl);
412
        editingContext.endEdition(currentLayer);
413
      }
414
    };
415

    
416
    insertPoint = new AbstractAction("InsertPointAction") {
417

    
418
      public void actionPerformed(ActionEvent e) {
419
        editingContext = swingManager.getEditingContext(mapControl);
420
        editingContext.activateService(
421
            InsertPointEditingProviderFactory.PROVIDER_NAME);
422
      }
423

    
424
    };
425

    
426
    circleCr = new AbstractAction("CircleCrAction") {
427

    
428
      public void actionPerformed(ActionEvent e) {
429
        editingContext = swingManager.getEditingContext(mapControl);
430
        editingContext.activateService(CircleCREditingProviderFactory.PROVIDER_NAME);
431
      }
432
    };
433

    
434
    circunferenceCr = new AbstractAction("CircunferenceCrAction") {
435

    
436
        public void actionPerformed(ActionEvent e) {
437
          editingContext = swingManager.getEditingContext(mapControl);
438
          editingContext.activateService(CircumferenceCREditingProviderFactory.PROVIDER_NAME);
439
        }
440
      };
441

    
442
    
443
    polyline = new AbstractAction("PolylineAction") {
444

    
445
      public void actionPerformed(ActionEvent e) {
446
        editingContext = swingManager.getEditingContext(mapControl);
447
        editingContext.activateService(PolylineEditingProviderFactory.PROVIDER_NAME);
448
      }
449
    };
450
    
451

    
452
    symmetry = new AbstractAction("SymmetryAction") {
453

    
454
        public void actionPerformed(ActionEvent e) {
455
          editingContext = swingManager.getEditingContext(mapControl);
456
          editingContext.activateService(SymmetryEditingProviderFactory.PROVIDER_NAME);
457
        }
458
      };
459
      
460
    internalPolygon = new AbstractAction("InternalPolygonAction") {
461
      
462
      public void actionPerformed(ActionEvent e) {
463
        editingContext = swingManager.getEditingContext(mapControl);
464
        editingContext.activateService(InternalPolygonEditingProviderFactory.PROVIDER_NAME);
465
      }
466
    };
467

    
468
  }
469

    
470
  public void addLayer(String shpPath) throws InitializeException,
471
      ProviderNotRegisteredException, ValidateDataParametersException,
472
      LoadLayerException {
473
    DataStoreParameters params;
474
    params = dataManager.createStoreParameters("Shape");
475
    if (shpPath.isEmpty()){
476
            shpPath = "/home/lmarques/data/cartography/Andalucia/muni_andalucia.shp";
477
    }
478

    
479
    String dbfPath = shpPath.substring(0, shpPath.length() - 3).concat("dbf");
480
    String shxPath = shpPath.substring(0, shpPath.length() - 3).concat("shx");
481

    
482
    File shpFile = new File(shpPath);
483
    File dbFile = new File(dbfPath);
484
    File shxFile = new File(shxPath);
485

    
486
    params.setDynValue("shpFile", shpFile.getPath());
487
    params.setDynValue("dbfFile", dbFile.getPath());
488
    params.setDynValue("shxFile", shxFile.getPath());
489
    params.setDynValue("CRS", defaultProjection);
490

    
491
    store = (FeatureStore) dataManager.openStore("Shape", params);
492

    
493
    FLayer layer = mapContextManager.createLayer("prueba", store);
494
    mapControl.getMapContext().setOrderManager(layerOrderManager);
495
    mapControl.getMapContext().getLayers().addLayer(layer);
496
    mapControl.getMapContext().getLayers().setActive(true);
497
    try {
498
      currentLayer = (FLyrVect) layer;
499
    }
500
    catch (Exception e) {
501
      logger.error("Can't load layer " + e.getMessage());
502
    }
503

    
504
  }
505

    
506
  private void zoomAll() {
507
    MapContext mapContext = mapControl.getMapContext();
508
    Envelope all = mapContext.getLayers().getFullEnvelope();
509
    logger.info("Full extdents " + all.toString());
510
    mapContext.getViewPort().setEnvelope(all);
511
    mapContext.invalidate();
512
  }
513

    
514
  public JFrame getJFrame() {
515
    return this.addLayerFrame;
516
  }
517
}