Xcos superblock: fix the modified status 61/18961/3
Clément DAVID [Tue, 24 Jan 2017 15:24:42 +0000 (16:24 +0100)]
Change-Id: Iac6658bc6eeb3f2130620f2b01878d5bba607251

scilab/modules/graph/src/java/org/scilab/modules/graph/ScilabGraph.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/Xcos.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/block/actions/BlockParametersAction.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/model/XcosGraphModel.java

index 2690921..bea1be3 100644 (file)
@@ -68,7 +68,6 @@ public class ScilabGraph extends mxGraph {
     private String title = null;
     private File savedFile;
     private boolean modified;
-    private boolean opened;
     private boolean readOnly;
 
     private transient mxRubberband rubberBand;
@@ -211,12 +210,7 @@ public class ScilabGraph extends mxGraph {
      * @category UseEvent
      */
     public void setModified(boolean modified) {
-        boolean oldValue = this.modified;
         this.modified = modified;
-
-        if (getAsComponent() != null) {
-            getAsComponent().firePropertyChange("modified", oldValue, modified);
-        }
     }
 
     /**
index a017e9c..616b8d4 100644 (file)
@@ -74,6 +74,7 @@ import com.mxgraph.model.mxICell;
 import com.mxgraph.util.mxEvent;
 import com.mxgraph.util.mxEventObject;
 import com.mxgraph.view.mxStylesheet;
+import java.util.stream.Collectors;
 import org.scilab.modules.xcos.graph.model.ScicosObjectOwner;
 
 /**
@@ -307,11 +308,8 @@ public final class Xcos {
      * @return the opened diagrams list
      */
     public List<XcosDiagram> openedDiagrams() {
-        final List<XcosDiagram> opened = new ArrayList<>();
-        diagrams.entrySet().forEach((e) -> {
-            opened.addAll(e.getValue());
-        });
-
+        ArrayList<XcosDiagram> opened = new ArrayList<>();
+        diagrams.values().stream().forEach(l -> opened.addAll(l));
         return opened;
     }
 
@@ -323,11 +321,11 @@ public final class Xcos {
      * @return the opened diagrams list
      */
     public List<XcosDiagram> openedDiagrams(ScicosObjectOwner root) {
-        return diagrams.get(root);
+        return diagrams.getOrDefault(root, Collections.emptyList());
     }
 
-    public long openedDiagramUID(File f) {
-        long opened = 0l;
+    public ScicosObjectOwner openedDiagram(File f) {
+        ScicosObjectOwner opened = null;
         if (f == null) {
             return opened;
         }
@@ -336,7 +334,7 @@ public final class Xcos {
             List<XcosDiagram> diags = diagrams.getOrDefault(root, Collections.emptyList());
 
             if (!diags.isEmpty() && f.equals(diags.get(0).getSavedFile())) {
-                opened = root.getUID();
+                opened = root;
                 break;
             }
         }
@@ -362,6 +360,17 @@ public final class Xcos {
     }
 
     /**
+     * Set the full diagram as modified
+     * @param root the root diagram
+     * @param modified the modified status
+     */
+    public void setModified(ScicosObjectOwner root, boolean modified) {
+        for (XcosDiagram d : diagrams.get(root)) {
+            d.setModified(modified);
+        }
+    }
+
+    /**
      * Popup a dialog to ask for a file creation
      *
      * @param f
@@ -430,9 +439,9 @@ public final class Xcos {
         /*
          * looking for an already opened diagram
          */
-        final Long rootUID = openedDiagramUID(f);
-        if (rootUID != 0l) {
-            diag = diagrams.get(rootUID).iterator().next();
+        final ScicosObjectOwner root = openedDiagram(f);
+        if (root != null) {
+            diag = diagrams.get(root).iterator().next();
         }
         // if unsaved and empty, reuse it. Allocate otherwise.
         if (f == null && diag != null && diag.getModel().getChildCount(diag.getDefaultParent()) > 0) {
@@ -503,6 +512,8 @@ public final class Xcos {
                 }
             }
 
+            addDiagram(new ScicosObjectOwner(controller, diag.getUID(), Kind.DIAGRAM), diag);
+
             /*
              * Create a visible window before loading
              */
@@ -514,8 +525,6 @@ public final class Xcos {
              * Load the file
              */
             diag.transformAndLoadFile(controller, file);
-
-            addDiagram(new ScicosObjectOwner(controller, diag.getUID(), Kind.DIAGRAM), diag);
         }
     }
 
@@ -1192,9 +1201,9 @@ public final class Xcos {
             } else if (isViewport) {
                 // get the cached diagram
                 final File f = instance.configuration.getFile(cachedDocumentType);
-                final Long rootUID = getInstance().openedDiagramUID(f);
+                final ScicosObjectOwner root = getInstance().openedDiagram(f);
 
-                Collection<XcosDiagram> diags = instance.diagrams.getOrDefault(rootUID, Collections.emptyList());
+                Collection<XcosDiagram> diags = instance.diagrams.getOrDefault(root, Collections.emptyList());
                 for (XcosDiagram d : diags) {
                     final String id = d.getGraphTab();
                     if (id != null && id.equals(cachedDocumentType.getUuid())) {
index 97f9c77..e0db2aa 100644 (file)
@@ -111,8 +111,10 @@ public class BlockParametersAction extends VertexSelectionDependantAction {
                 // this is a super-block, open it
                 XcosDiagram sub = new XcosDiagram(controller, cell.getUID(), cell.getKind(), cell.getId());
                 XcosCellFactory.insertChildren(controller, sub);
+                sub.setModified(false);
 
-                Xcos.getInstance().addDiagram(sub);
+                ScicosObjectOwner root = Xcos.findRoot(graph);
+                Xcos.getInstance().addDiagram(root, sub);
                 XcosTab.restore(sub, true);
             } else {
                 BasicBlock block = (BasicBlock) cell;
index 7fc1317..f53ada5 100644 (file)
@@ -197,6 +197,15 @@ public class XcosDiagram extends ScilabGraph {
 
         // do not put loop links inside the common block cell but on the defaultParent
         ((mxGraphModel) getModel()).setMaintainEdgeParent(false);
+        getModel().addListener(mxEvent.CHANGE, new mxIEventListener() {
+            @Override
+            public void invoke(Object sender, mxEventObject evt) {
+                if (sender instanceof XcosGraphModel) {
+                    List<XcosDiagram> diagrams = Xcos.getInstance().openedDiagrams(Xcos.findRoot(XcosDiagram.this));
+                    diagrams.stream().forEach(d -> d.updateTabTitle());
+                }
+            }
+        });
     }
 
     /*
@@ -1731,7 +1740,7 @@ public class XcosDiagram extends ScilabGraph {
 
             setTitle(writeFile.getName().substring(0, writeFile.getName().lastIndexOf('.')));
             ConfigurationManager.getInstance().addToRecentFiles(writeFile);
-            setModified(false);
+            Xcos.getInstance().setModified(Xcos.findRoot(this), false);
             isSuccess = true;
         } catch (final Exception e) {
             LOG.severe(e.toString());
@@ -1794,7 +1803,7 @@ public class XcosDiagram extends ScilabGraph {
     public void updateTabTitle() {
         // get the modifier string
         final String modified;
-        if (isModified()) {
+        if (Xcos.getInstance().isModified(Xcos.findRoot(this))) {
             modified = "*";
         } else {
             modified = "";
index 7d05596..3b3e23b 100644 (file)
@@ -25,7 +25,6 @@ import org.scilab.modules.xcos.Kind;
  * Implement a custom model for Xcos
  */
 public class XcosGraphModel extends mxGraphModel {
-
     public XcosGraphModel(JavaController controller, long diagramId, Kind kind, String uid) {
         super(new mxCell());
 
@@ -37,5 +36,4 @@ public class XcosGraphModel extends mxGraphModel {
     public final String createId(Object cell) {
         return new UID().toString();
     }
-
 }