Revision 483 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
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