Revision 483

View differences:

org.gvsig.vectorediting/trunk/org.gvsig.vectorediting/org.gvsig.vectorediting.app/org.gvsig.vectorediting.app.mainplugin/src/main/java/org/gvsig/vectorediting/app/mainplugin/EditingExtension.java
24 24
package org.gvsig.vectorediting.app.mainplugin;
25 25

  
26 26
import java.io.File;
27
import java.util.ArrayList;
28
import java.util.Iterator;
29
import java.util.List;
27 30

  
28 31
import org.slf4j.Logger;
29 32
import org.slf4j.LoggerFactory;
30 33

  
31 34
import org.gvsig.andami.IconThemeHelper;
32 35
import org.gvsig.andami.PluginServices;
36
import org.gvsig.andami.PluginsLocator;
37
import org.gvsig.andami.actioninfo.ActionInfoManager;
33 38
import org.gvsig.andami.plugins.Extension;
39
import org.gvsig.andami.plugins.IExtension;
40
import org.gvsig.andami.plugins.status.IExtensionStatus;
41
import org.gvsig.andami.plugins.status.IUnsavedData;
42
import org.gvsig.andami.plugins.status.UnsavedData;
43
import org.gvsig.andami.ui.mdiManager.IWindow;
44
import org.gvsig.andami.ui.mdiManager.SingletonWindow;
34 45
import org.gvsig.app.ApplicationLocator;
35 46
import org.gvsig.app.ApplicationManager;
47
import org.gvsig.app.project.DocumentsContainer;
48
import org.gvsig.app.project.documents.Document;
49
import org.gvsig.app.project.documents.gui.IDocumentWindow;
36 50
import org.gvsig.app.project.documents.view.ViewDocument;
37 51
import org.gvsig.app.project.documents.view.gui.DefaultViewPanel;
38 52
import org.gvsig.app.project.documents.view.gui.IView;
39 53
import org.gvsig.app.project.documents.view.toc.actions.EndEditingTocMenuEntry;
40 54
import org.gvsig.app.project.documents.view.toc.actions.StartEditingTocMenuEntry;
41 55
import org.gvsig.app.project.documents.view.toolListeners.StatusBarListener;
56
import org.gvsig.fmap.dal.exception.DataException;
57
import org.gvsig.fmap.dal.feature.FeatureStore;
58
import org.gvsig.fmap.mapcontext.MapContext;
42 59
import org.gvsig.fmap.mapcontext.MapContextLocator;
43 60
import org.gvsig.fmap.mapcontext.layers.FLayer;
61
import org.gvsig.fmap.mapcontext.layers.FLayers;
44 62
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
45 63
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
46 64
import org.gvsig.fmap.mapcontext.rendering.symbols.SymbolException;
......
55 73
import org.gvsig.tools.observer.Notification;
56 74
import org.gvsig.tools.observer.Observable;
57 75
import org.gvsig.tools.observer.Observer;
76
import org.gvsig.utils.swing.threads.IMonitorableTask;
58 77
import org.gvsig.vectorediting.lib.spi.EditingProviderLocator;
59 78
import org.gvsig.vectorediting.lib.spi.EditingProviderManager;
60 79
import org.gvsig.vectorediting.swing.api.EditingContext;
......
259 278
            Notification n = (Notification)notification;
260 279
            if (n.getType().equalsIgnoreCase(EditingContext.CHANGE_SELECTED_TOOL_NOTIFICATION)){
261 280
                String name = (String)n.getValue();
281
                logger.info("Changed selected tool to '{}'", name);
262 282
                PluginServices.getMainFrame().setSelectedTool(name);
263 283
                appManager.refreshMenusAndToolBars();
264 284

  
......
267 287
            }
268 288
        }
269 289
    }
290

  
291
    private List<FLyrVect> getEditedLayers(){
292
        List<FLyrVect> editedLayers = new ArrayList<FLyrVect>();
293

  
294
        ApplicationManager application = ApplicationLocator.getManager();
295
        IWindow[] windows = application.getUIManager().getOrderedWindows();
296
        for (int i = 0; i < windows.length; i++) {
297
            IWindow window = windows[i];
298
            if (window instanceof SingletonWindow && window instanceof IDocumentWindow) {
299
                // Recorremos las ventanas.
300
                // Cogemos el model de aquellas que sea de tipo Document.
301
                // Si el model es de tipo View,
302
                // comprobamos que adem?s sean de tipo View.
303
                // Le pedimos al mapContext de la View las layers
304
                // y a?adimos a editedLayers aquellas layers vectoriales que est?n en edici?n.
305
                Document document;
306
                try {
307
                    document = (Document) ((SingletonWindow) window).getWindowModel();
308
                } catch (ClassCastException e) {
309
                    // Do nothing, skip this window
310
                    continue;
311
                }
312
                if (ViewDocument.class.isAssignableFrom(document.getClass())) {
313
                    ViewDocument view = (ViewDocument) document;
314
                    MapContext mapContext = view.getMapContext();
315
                    if (mapContext != null) {
316
                        FLayers layers = mapContext.getLayers();
317
                        for (int j = 0; j < layers.getLayersCount(); j++) {
318
                            FLayer lyr = layers.getLayer(j);
319
                            if (lyr instanceof FLyrVect) {
320
                                FLyrVect layerVect = (FLyrVect) lyr;
321
                                if (layerVect.isEditing()) {
322
                                    editedLayers.add(layerVect);
323
                                }
324
                            }
325
                        }
326
                    }
327
                }
328
            }
329
        }
330
        return editedLayers;
331
    }
332

  
333
    private List<IUnsavedData> getUnsavedData(List<FLyrVect> editedLayers){
334
        List<IUnsavedData> unsavedData = new ArrayList<IUnsavedData>();
335
        for (Iterator iterator = editedLayers.iterator(); iterator.hasNext();) {
336
            FLyrVect editedLayer = (FLyrVect) iterator.next();
337
            IUnsavedData unsavedDataLayer = new UnsavedLayer(this, editedLayer);
338
            unsavedData.add(unsavedDataLayer);
339
        }
340
        return unsavedData;
341

  
342
    }
343

  
344
    private static class UnsavedLayer extends UnsavedData {
345
        private FLyrVect layer;
346

  
347
        public UnsavedLayer(IExtension extension, FLyrVect layer) {
348
            super(extension);
349
            this.layer = layer;
350
        }
351

  
352
        @Override
353
        public String getDescription() {
354
            return layer.getName();
355
        }
356

  
357
        @Override
358
        public String getResourceName() {
359
            return layer.getFeatureStore().getFullName();
360
        }
361

  
362
        @Override
363
        public boolean saveData() {
364
            FeatureStore featureStore = layer.getFeatureStore();
365
            if(featureStore.isEditing()){
366
                try {
367
                    featureStore.finishEditing();
368
                    return true;
369
                } catch (DataException e) {
370
                    throw new RuntimeException(e);
371
                }
372
            }
373
            return true;
374
        }
375
    }
376

  
377
    @Override
378
    public IExtensionStatus getStatus() {
379
        List<FLyrVect> editedLayers = getEditedLayers();
380
        final List<IUnsavedData> unsavedData = getUnsavedData(editedLayers);
381

  
382
        return new IExtensionStatus() {
383

  
384
            public boolean hasUnsavedData() {
385
                if(unsavedData == null){
386
                    return false;
387
                }
388
                return !unsavedData.isEmpty();
389
            }
390

  
391
            public boolean hasRunningProcesses() {
392
                return false;
393
            }
394

  
395
            public IUnsavedData[] getUnsavedData() {
396
                if(unsavedData == null){
397
                    return null;
398
                }
399
                return unsavedData.toArray(new IUnsavedData[0]);
400
            }
401

  
402
            public IMonitorableTask[] getRunningProcesses() {
403
                return null;
404
            }
405
        };
406
    }
270 407
}

Also available in: Unified diff