Statistics
| Revision:

svn-gvsig-desktop / branches / v10 / extensions / extCAD / src / com / iver / cit / gvsig / StopEditing.java @ 19154

History | View | Annotate | Download (15.8 KB)

1 4421 fjp
package com.iver.cit.gvsig;
2
3 5807 caballero
import java.awt.Component;
4 5267 fjp
import java.io.IOException;
5 12586 caballero
import java.util.ArrayList;
6 5267 fjp
7 12586 caballero
import javax.swing.ImageIcon;
8 5267 fjp
import javax.swing.JOptionPane;
9
10 6312 caballero
import com.hardcode.gdbms.engine.instruction.FieldNotFoundException;
11 4421 fjp
import com.iver.andami.PluginServices;
12 5267 fjp
import com.iver.andami.messages.NotificationManager;
13 4421 fjp
import com.iver.andami.plugins.Extension;
14 12586 caballero
import com.iver.andami.plugins.IExtension;
15
import com.iver.andami.plugins.status.IExtensionStatus;
16
import com.iver.andami.plugins.status.IUnsavedData;
17
import com.iver.andami.plugins.status.UnsavedData;
18 5558 fjp
import com.iver.cit.gvsig.fmap.DriverException;
19 6878 cesar
import com.iver.cit.gvsig.fmap.MapContext;
20 4421 fjp
import com.iver.cit.gvsig.fmap.MapControl;
21 12549 caballero
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
22 6483 fjp
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
23 5558 fjp
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
24 6472 caballero
import com.iver.cit.gvsig.fmap.drivers.shp.IndexedShpDriver;
25 5184 caballero
import com.iver.cit.gvsig.fmap.edition.EditionEvent;
26 4421 fjp
import com.iver.cit.gvsig.fmap.edition.EditionException;
27 4430 fjp
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
28 4421 fjp
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
29
import com.iver.cit.gvsig.fmap.layers.FLayer;
30
import com.iver.cit.gvsig.fmap.layers.FLayers;
31 9394 caballero
import com.iver.cit.gvsig.fmap.layers.FLyrAnnotation;
32 4421 fjp
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
33 12645 jmvivo
import com.iver.cit.gvsig.fmap.layers.LayersIterator;
34 6312 caballero
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
35 6002 fjp
import com.iver.cit.gvsig.layers.VectorialLayerEdited;
36 8765 jjdelcerro
import com.iver.cit.gvsig.project.documents.table.gui.Table;
37
import com.iver.cit.gvsig.project.documents.view.IProjectView;
38 12600 cesar
import com.iver.cit.gvsig.project.documents.view.ProjectView;
39 12586 caballero
import com.iver.cit.gvsig.project.documents.view.ProjectViewFactory;
40 8765 jjdelcerro
import com.iver.cit.gvsig.project.documents.view.gui.View;
41 12549 caballero
import com.iver.cit.gvsig.project.documents.view.legend.CreateSpatialIndexMonitorableTask;
42 12586 caballero
import com.iver.utiles.swing.threads.IMonitorableTask;
43 4421 fjp
44
/**
45
 * @author Francisco Jos?
46 5482 caballero
 *
47 4430 fjp
 * Cuando un tema se pone en edici?n, puede que su driver implemente
48
 * ISpatialWriter. En ese caso, es capaz de guardarse sobre s? mismo. Si no lo
49
 * implementa, esta opci?n estar? deshabilitada y la ?nica posibilidad de
50
 * guardar este tema ser? "Guardando como..."
51 4421 fjp
 */
52 5005 jorpiell
public class StopEditing extends Extension {
53 4430 fjp
        private View vista;
54
55 4421 fjp
        /**
56 5005 jorpiell
         * @see com.iver.andami.plugins.IExtension#initialize()
57 4430 fjp
         */
58 5005 jorpiell
        public void initialize() {
59 4430 fjp
        }
60 4421 fjp
61 4430 fjp
        /**
62 5005 jorpiell
         * @see com.iver.andami.plugins.IExtension#execute(java.lang.String)
63 4430 fjp
         */
64
        public void execute(String s) {
65 6877 cesar
                com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
66 6880 cesar
                                .getActiveWindow();
67 4421 fjp
68 4430 fjp
                vista = (View) f;
69 5807 caballero
                boolean isStop=false;
70 8765 jjdelcerro
                IProjectView model = vista.getModel();
71 6878 cesar
                MapContext mapa = model.getMapContext();
72 4430 fjp
                FLayers layers = mapa.getLayers();
73 4475 fjp
                EditionManager edMan = CADExtension.getEditionManager();
74 4430 fjp
                if (s.equals("STOPEDITING")) {
75 18452 vcaballero
                        vista.getMapControl().getCanceldraw().setCanceled(true);
76 4430 fjp
                        FLayer[] actives = layers.getActives();
77
                        // TODO: Comprobar que solo hay una activa, o al menos
78
                        // que solo hay una en edici?n que est? activa, etc, etc
79
                        for (int i = 0; i < actives.length; i++) {
80
                                if (actives[i] instanceof FLyrVect && actives[i].isEditing()) {
81
                                        FLyrVect lv = (FLyrVect) actives[i];
82 6604 caballero
                                        MapControl mapControl = vista.getMapControl();
83 6002 fjp
                                        VectorialLayerEdited lyrEd = (VectorialLayerEdited)        edMan.getActiveLayerEdited();
84
                                        lyrEd.clearSelection();
85 5807 caballero
                                        isStop=stopEditing(lv, mapControl);
86 7830 jmvivo
                                        if (isStop){
87 9394 caballero
                                                lv.removeLayerListener(edMan);
88
                                                if (lv instanceof FLyrAnnotation){
89
                                                        FLyrAnnotation lva=(FLyrAnnotation)lv;
90
                                            lva.setMapping(lva.getMapping());
91
                                                }
92 7830 jmvivo
                                        }
93 4430 fjp
                                }
94
                        }
95 5807 caballero
                        if (isStop) {
96
                                vista.getMapControl().setTool("zoomIn");
97
                                vista.hideConsole();
98 6002 fjp
                                vista.repaintMap();
99 7830 jmvivo
                                CADExtension.clearView();
100 9394 caballero
101 5807 caballero
                        }
102 4430 fjp
                }
103
                PluginServices.getMainFrame().enableControls();
104
        }
105 4421 fjp
106 4430 fjp
        /**
107 5005 jorpiell
         * @see com.iver.andami.plugins.IExtension#isEnabled()
108 4430 fjp
         */
109 5267 fjp
        public boolean isEnabled() {
110 4430 fjp
                FLayer[] lyrs = EditionUtilities.getActiveAndEditedLayers();
111 5267 fjp
                if (lyrs == null)
112
                        return false;
113 4430 fjp
                FLyrVect lyrVect = (FLyrVect) lyrs[0];
114 5267 fjp
                if (lyrVect.getSource() instanceof VectorialEditableAdapter) {
115 5807 caballero
                        return true;
116 4950 caballero
                }
117
                return false;
118 5267 fjp
        }
119 4430 fjp
        /**
120
         * DOCUMENT ME!
121
         */
122 5807 caballero
        public boolean stopEditing(FLyrVect layer, MapControl mapControl) {
123 12586 caballero
124 5267 fjp
                VectorialEditableAdapter vea = (VectorialEditableAdapter) layer
125
                                .getSource();
126 5807 caballero
                int resp = JOptionPane.NO_OPTION;
127 4950 caballero
128 4421 fjp
                try {
129 6856 fjp
                        if (layer.isWritable()) {
130 5807 caballero
                                resp = JOptionPane.showConfirmDialog((Component) PluginServices
131
                                                .getMainFrame(), PluginServices.getText(this,
132
                                                "realmente_desea_guardar_la_capa")
133 12159 caballero
                                                + " : " + layer.getName()+"?", PluginServices.getText(this,
134 5807 caballero
                                                "guardar"), JOptionPane.YES_NO_OPTION);
135
                                if (resp != JOptionPane.YES_OPTION) { // CANCEL EDITING
136
                                        cancelEdition(layer);
137
                                } else { // GUARDAMOS EL TEMA
138
                                        saveLayer(layer);
139 5267 fjp
                                }
140 5807 caballero
                                vea.getCommandRecord().removeCommandListener(mapControl);
141
                                layer.setEditing(false);
142 12549 caballero
                                if (layer.isSpatiallyIndexed())
143
                            {
144
                                    if(layer.getISpatialIndex() != null)
145
                                {
146
                                        try {
147
                                                                PluginServices.
148
                                                                        cancelableBackgroundExecution(new CreateSpatialIndexMonitorableTask((FLyrVect)layer));
149
                                                        } catch (DriverIOException e) {
150
                                                                NotificationManager.addError(e);
151
                                                        } catch (DriverException e) {
152
                                                                NotificationManager.addError(e);
153
                                                        }
154
                                }
155
                            }
156 5807 caballero
                                return true;
157 6604 caballero
                        }
158
                        // Si no existe writer para la capa que tenemos en edici?n
159 5807 caballero
                                resp = JOptionPane
160
                                                .showConfirmDialog(
161
                                                                (Component) PluginServices.getMainFrame(),
162
                                                                PluginServices
163
                                                                                .getText(
164
                                                                                                this,
165 6856 fjp
                                                                                                "no_existe_writer_para_este_formato_de_capa_o_no_tiene_permisos_de_escritura_los_datos_no_se_guardaran_desea_continuar")
166 5807 caballero
                                                                                + " : " + layer.getName(),
167 6856 fjp
                                                                PluginServices.getText(this, "cancelar_edicion"),
168 5807 caballero
                                                                JOptionPane.YES_NO_OPTION);
169
                                if (resp == JOptionPane.YES_OPTION) { // CANCEL EDITING
170
                                        cancelEdition(layer);
171
                                        vea.getCommandRecord().removeCommandListener(mapControl);
172 6472 caballero
                                        if (!(layer.getSource().getDriver() instanceof IndexedShpDriver)){
173
                                                VectorialLayerEdited vle=(VectorialLayerEdited)CADExtension.getEditionManager().getLayerEdited(layer);
174
                                                layer.setLegend((VectorialLegend)vle.getLegend());
175
                                        }
176 13417 caballero
                                        layer.setEditing(false);
177 5807 caballero
                                        return true;
178 5571 jmvivo
                                }
179 6604 caballero
180 4421 fjp
                } catch (EditionException e) {
181 5267 fjp
                        NotificationManager.addError(e);
182
                } catch (IOException e) {
183
                        NotificationManager.addError(e);
184 5558 fjp
                } catch (DriverException e) {
185 5807 caballero
                        NotificationManager.addError(e);
186 6312 caballero
                } catch (FieldNotFoundException e) {
187 12549 caballero
                        NotificationManager.addError(e);
188 4421 fjp
                }
189 5807 caballero
                return false;
190 4950 caballero
191 5267 fjp
        }
192
193 5807 caballero
194
        private void saveLayer(FLyrVect layer) throws DriverException,
195
                        EditionException {
196 12642 caballero
                layer.setProperty("stoppingEditing",new Boolean(true));
197 5807 caballero
                VectorialEditableAdapter vea = (VectorialEditableAdapter) layer
198
                                .getSource();
199
200
                ISpatialWriter writer = (ISpatialWriter) vea.getWriter();
201 6877 cesar
                com.iver.andami.ui.mdiManager.IWindow[] views = PluginServices
202 6880 cesar
                                .getMDIManager().getAllWindows();
203 5807 caballero
                for (int j = 0; j < views.length; j++) {
204
                        if (views[j] instanceof Table) {
205
                                Table table = (Table) views[j];
206
                                if (table.getModel().getAssociatedTable() != null
207
                                                && table.getModel().getAssociatedTable().equals(layer)) {
208
                                        table.stopEditingCell();
209
                                }
210
                        }
211
                }
212 6483 fjp
                vea.cleanSelectableDatasource();
213 6604 caballero
                layer.setRecordset(vea.getRecordset()); // Queremos que el recordset del layer
214 6483 fjp
                // refleje los cambios en los campos.
215 5807 caballero
                ILayerDefinition lyrDef = EditionUtilities.createLayerDefinition(layer);
216 6483 fjp
                String aux="FIELDS:";
217 6604 caballero
                FieldDescription[] flds = lyrDef.getFieldsDesc();
218 6483 fjp
                for (int i=0; i < flds.length; i++)
219
                {
220 6604 caballero
                        aux = aux + ", " + flds[i].getFieldAlias();
221 6483 fjp
                }
222 6604 caballero
                System.err.println("Escribiendo la capa " + lyrDef.getName() +
223 6483 fjp
                                " con los campos " + aux);
224 19154 vcaballero
                lyrDef.setShapeType(layer.getShapeType());
225 5807 caballero
                writer.initialize(lyrDef);
226
                vea.stopEdition(writer, EditionEvent.GRAPHIC);
227 12642 caballero
                layer.setProperty("stoppingEditing",new Boolean(false));
228 5807 caballero
        }
229
230
        private void cancelEdition(FLyrVect layer) throws IOException {
231 12642 caballero
                layer.setProperty("stoppingEditing",new Boolean(true));
232 6877 cesar
                com.iver.andami.ui.mdiManager.IWindow[] views = PluginServices
233 6880 cesar
                                .getMDIManager().getAllWindows();
234 11468 caballero
                VectorialEditableAdapter vea = (VectorialEditableAdapter) layer
235
                                .getSource();
236
                vea.cancelEdition(EditionEvent.GRAPHIC);
237 5807 caballero
                for (int j = 0; j < views.length; j++) {
238
                        if (views[j] instanceof Table) {
239
                                Table table = (Table) views[j];
240
                                if (table.getModel().getAssociatedTable() != null
241
                                                && table.getModel().getAssociatedTable().equals(layer)) {
242
                                        table.cancelEditing();
243
                                }
244
                        }
245
                }
246 12642 caballero
                layer.setProperty("stoppingEditing",new Boolean(false));
247 5807 caballero
        }
248 4430 fjp
        /**
249 5005 jorpiell
         * @see com.iver.andami.plugins.IExtension#isVisible()
250 4430 fjp
         */
251
        public boolean isVisible() {
252
                if (EditionUtilities.getEditionStatus() == EditionUtilities.EDITION_STATUS_ONE_VECTORIAL_LAYER_ACTIVE_AND_EDITABLE)
253
                        return true;
254 6604 caballero
                return false;
255 4421 fjp
256 4430 fjp
        }
257 12586 caballero
258
        public IExtensionStatus getStatus() {
259
                return new StopEditingStatus();
260
        }
261 12591 caballero
/**
262
 * Show the dialogs to save the layer without ask if don't like to save.
263
 * @param layer Layer to save.
264
 */
265 12634 caballero
        public boolean executeSaveLayer(FLyrVect layer ) {
266 12586 caballero
                EditionManager edMan = CADExtension.getEditionManager();
267
                VectorialLayerEdited lyrEd = (VectorialLayerEdited)        edMan.getLayerEdited(layer);
268
                lyrEd.clearSelection();
269
                boolean isStop=false;
270
                if (layer.isWritable()) {
271
                        try {
272
                                saveLayer((FLyrVect)layer);
273
                                layer.setEditing(false);
274
                                if (layer.isSpatiallyIndexed())
275
                            {
276
                                    if(layer.getISpatialIndex() != null)
277
                                {
278
                                        try {
279
                                                                PluginServices.
280
                                                                        cancelableBackgroundExecution(new CreateSpatialIndexMonitorableTask((FLyrVect)layer));
281
                                                        } catch (DriverIOException e) {
282 12642 caballero
                                                                PluginServices.getLogger().error(e.getMessage(),e);
283
//                                                                NotificationManager.addError(e.getMessage(),e);
284 12586 caballero
                                                        } catch (DriverException e) {
285 12642 caballero
                                                                PluginServices.getLogger().error(e.getMessage(),e);
286
//                                                                NotificationManager.addError(e.getMessage(),e);
287 12586 caballero
                                                        }
288
                                }
289
                            }
290
291
                        } catch (DriverException e) {
292 12642 caballero
                                PluginServices.getLogger().error(e.getMessage(),e);
293
//                                NotificationManager.addError(e.getMessage(),e);
294 12634 caballero
                                return isStop;
295 12586 caballero
                        } catch (EditionException e) {
296 12642 caballero
                                PluginServices.getLogger().error(e.getMessage(),e);
297
//                                NotificationManager.addError(e.getMessage(),e);
298 12634 caballero
                                return isStop;
299 12586 caballero
                        }
300
                        isStop=true;
301
                }else {
302
//                         Si no existe writer para la capa que tenemos en edici?n
303
                        int resp = JOptionPane
304
                                        .showConfirmDialog(
305
                                                        (Component) PluginServices.getMainFrame(),
306
                                                        PluginServices
307
                                                                        .getText(
308
                                                                                        this,
309
                                                                                        "no_existe_writer_para_este_formato_de_capa_o_no_tiene_permisos_de_escritura_los_datos_no_se_guardaran_desea_continuar")
310
                                                                        + " : " + layer.getName(),
311
                                                        PluginServices.getText(this, "cancelar_edicion"),
312
                                                        JOptionPane.YES_NO_OPTION);
313
                        if (resp == JOptionPane.YES_OPTION) { // CANCEL EDITING
314
                                try {
315
                                        cancelEdition(layer);
316 12683 caballero
                                        layer.setEditing(false);
317 12586 caballero
                                if (!(layer.getSource().getDriver() instanceof IndexedShpDriver)){
318
                                        VectorialLayerEdited vle=(VectorialLayerEdited)CADExtension.getEditionManager().getLayerEdited(layer);
319
                                        layer.setLegend((VectorialLegend)vle.getLegend());
320
                                }
321
                                } catch (IOException e) {
322 12642 caballero
                                        PluginServices.getLogger().error(e.getMessage(),e);
323
//                                        NotificationManager.addError(e.getMessage(),e);
324 12634 caballero
                                        return isStop;
325 12586 caballero
                                } catch (FieldNotFoundException e) {
326 12642 caballero
                                        PluginServices.getLogger().error(e.getMessage(),e);
327
//                                        NotificationManager.addError(e);
328 12634 caballero
                                        return isStop;
329 12586 caballero
                                } catch (DriverException e) {
330 12642 caballero
                                        PluginServices.getLogger().error(e.getMessage(),e);
331
//                                        NotificationManager.addError(e);
332 12634 caballero
                                        return isStop;
333 12683 caballero
                                } catch (EditionException e) {
334
                                        PluginServices.getLogger().error(e.getMessage(),e);
335
//                                        NotificationManager.addError(e);
336
                                        return isStop;
337 12586 caballero
                                }
338
                                isStop=true;
339
                        }
340
341
                }
342
//                boolean isStop=stopEditing((FLyrVect)layer, null);
343
                if (isStop){
344
                        layer.removeLayerListener(edMan);
345
                        if (layer instanceof FLyrAnnotation){
346
                                FLyrAnnotation lva=(FLyrAnnotation)layer;
347
                    lva.setMapping(lva.getMapping());
348
                        }
349
                        com.iver.andami.ui.mdiManager.IWindow f = PluginServices.getMDIManager()
350
                        .getActiveWindow();
351
                        if (f instanceof View) {
352
                                vista = (View) f;
353
                                if (vista.getMapControl().getMapContext().getLayers().getLayer(layer.getName()).equals(layer)) {
354
                                        vista.getMapControl().setTool("zoomIn");
355
                                        vista.hideConsole();
356
                                        vista.repaintMap();
357
                                        CADExtension.clearView();
358
                                }
359
                        }
360
                }
361 12634 caballero
                return isStop;
362 12586 caballero
        }
363
364
        private class UnsavedLayer extends UnsavedData{
365
366
                private FLayer layer;
367
368
                public UnsavedLayer(IExtension extension) {
369
                        super(extension);
370
                }
371
372
                public String getDescription() {
373
                        return PluginServices.getText(this,"editing_layer_unsaved");
374
                }
375
376
                public String getResourceName() {
377
                        return layer.getName();
378
                }
379
380
381
382 12634 caballero
                public boolean saveData() {
383
                        return executeSaveLayer((FLyrVect)layer);
384 12586 caballero
                }
385
386
                public void setLayer(FLayer layer) {
387
                        this.layer=layer;
388
389
                }
390
391
                public ImageIcon getIcon() {
392
                        return layer.getTocImageIcon();
393
                }
394
395
        }
396
397
        /**
398
         * <p>This class provides the status of extensions.
399
         * If this extension has some unsaved editing layer (and save them), and methods
400
         * to check if the extension has some associated background tasks.
401
         *
402
         * @author Vicente Caballero Navarro
403
         *
404
         */
405
        private class StopEditingStatus implements IExtensionStatus {
406
                /**
407
             * This method is used to check if this extension has some unsaved editing layer.
408
             *
409
             * @return true if the extension has some unsaved editing layer, false otherwise.
410
             */
411
                public boolean hasUnsavedData() {
412
                        ProjectExtension pe=(ProjectExtension)PluginServices.getExtension(ProjectExtension.class);
413 12600 cesar
                        ProjectView[] views=(ProjectView[])pe.getProject().getDocumentsByType(ProjectViewFactory.registerName).toArray(new ProjectView[0]);
414 12634 caballero
415 12586 caballero
                        for (int i=0;i<views.length;i++) {
416 12600 cesar
                                FLayers layers=views[i].getMapContext().getLayers();
417 12645 jmvivo
                                LayersIterator iter = getEditingLayer(layers);
418
                                if (iter.hasNext()) {
419 12586 caballero
                                        return true;
420
                                }
421
                        }
422
                        return false;
423
                }
424
                /**
425
             * This method is used to check if the extension has some associated
426
             * background process which is currently running.
427
             *
428
             * @return true if the extension has some associated background process,
429
             * false otherwise.
430
             */
431
                public boolean hasRunningProcesses() {
432
                        return false;
433
                }
434
                 /**
435
             * <p>Gets an array of the traceable background tasks associated with this
436
             * extension. These tasks may be tracked, canceled, etc.</p>
437
             *
438
             * @return An array of the associated background tasks, or null in case there is
439
             * no associated background tasks.
440
             */
441
                public IMonitorableTask[] getRunningProcesses() {
442
                        return null;
443
                }
444
                /**
445
             * <p>Gets an array of the UnsavedData objects, which contain information about
446
             * the unsaved editing layers and allows to save it.</p>
447
             *
448
             * @return An array of the associated unsaved editing layers, or null in case the extension
449
             * has not unsaved editing layers.
450
             */
451
                public IUnsavedData[] getUnsavedData() {
452
                        ProjectExtension pe=(ProjectExtension)PluginServices.getExtension(ProjectExtension.class);
453 12600 cesar
                        ProjectView[] views=(ProjectView[])pe.getProject().getDocumentsByType(ProjectViewFactory.registerName).toArray(new ProjectView[0]);
454 12586 caballero
                        ArrayList unsavedLayers=new ArrayList();
455
                        for (int i=0;i<views.length;i++) {
456 12600 cesar
                                FLayers layers = views[i].getMapContext().getLayers();
457 12645 jmvivo
                                LayersIterator iter = getEditingLayer(layers);
458
                                while (iter.hasNext()){
459 12586 caballero
                                        UnsavedLayer ul=new UnsavedLayer(StopEditing.this);
460 12645 jmvivo
                                        ul.setLayer(iter.nextLayer());
461 12586 caballero
                                        unsavedLayers.add(ul);
462
                                }
463
                        }
464
                        return (IUnsavedData[])unsavedLayers.toArray(new IUnsavedData[0]);
465
                }
466 12645 jmvivo
467
                private LayersIterator getEditingLayer(FLayers layers){
468
                        return new LayersIterator(layers){
469
                                public boolean evaluate(FLayer layer) {
470
                                        return layer.isEditing();
471
                                }
472
                        };
473
                }
474 12586 caballero
        }
475 4421 fjp
}