From ef4f0236950f06abbfeda940695cc950baa16f60 Mon Sep 17 00:00:00 2001
From: Minh Hiep Pham <minh.pham@telecom-paristech.fr>
Date: Wed, 20 Mar 2019 15:05:56 +0100
Subject: [PATCH] clone a part of composite component

---
 src/main/java/ui/GTURTLEModeling.java |  4 +-
 src/main/java/ui/TDiagramPanel.java   | 88 +++++++++++++++++++--------
 src/main/java/ui/TGComponent.java     |  8 +--
 src/main/java/ui/TGConnector.java     |  3 +-
 4 files changed, 70 insertions(+), 33 deletions(-)

diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 447af3532b..a1f2294a07 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -3593,7 +3593,7 @@ public class GTURTLEModeling {
     }
 
 
-    public String makeXMLFromSelectedComponentOfADiagram(TDiagramPanel tdp, int copyMaxId, int _decX, int _decY) {
+    public String makeXMLFromSelectedComponentOfADiagram(TDiagramPanel tdp, int copyMaxId, int _decX, int _decY, boolean cloneEvenIfNonNullFather) {
         StringBuffer sb = new StringBuffer();
         //TraceManager.addDev("Making copy");
 
@@ -3608,7 +3608,7 @@ public class GTURTLEModeling {
         StringBuffer s;
         String str;
 
-        s = tdp.saveSelectedInXML();
+        s = tdp.saveSelectedInXML(cloneEvenIfNonNullFather);
 
         final Vector<TCDTClass> classes = tdp.selectedTclasses();
 
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index 8204b5d618..8a21d0ee28 100644
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -627,8 +627,8 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         mode = NORMAL;
     }
 
-    public StringBuffer saveSelectedInXML() {
-        StringBuffer s = componentsInXML(true);
+    public StringBuffer saveSelectedInXML(boolean cloneEvenIfNonNullFather) {
+        StringBuffer s = componentsInXML(true, cloneEvenIfNonNullFather);
         if (s == null) {
             return null;
         }
@@ -638,7 +638,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         sb.append("\n");
         sb.append(getXMLSelectedTail());
 
-        //TraceManager.addDev("xml of selected components:" + sb);
+        //TraceManager.addDev("XML of selected components:" + sb);
 
         return sb;
     }
@@ -663,28 +663,37 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         sb.append(tgc.saveInXML());
         sb.append("\n");
         sb.append(getXMLCloneTail());
-        //TraceManager.addDev("sb=\n" + sb);
+        TraceManager.addDev("sb=\n" + sb);
         return sb;
     }
 
     private StringBuffer componentsInXML(boolean selected) {
+        return componentsInXML(selected, false);
+    }
+
+    private StringBuffer componentsInXML(boolean selected, boolean cloneEvenIfNonNullFather) {
         StringBuffer sb = new StringBuffer();
         StringBuffer s;
 
         //Added by Solange to see the components in the list
         //    LinkedList<TGComponent> ruteoList = this.componentList;
         //
-        for (TGComponent tgc : this.componentList) {
+
+        for (TGComponent tgc : this.getAllComponent()){
+        //for (TGComponent tgc : this.componentList) {
             if ((selected == false) || (tgc.isSelected())) {
-                s = tgc.saveInXML();
-                if (s == null) {
-                    return null;
-                }
-                sb.append(s);
-                sb.append("\n");
+               if((tgc.getFather() == null) || (cloneEvenIfNonNullFather)) {
+                   //TraceManager.addDev("Cloning:" + tgc);
+                   s = tgc.saveInXML(true, cloneEvenIfNonNullFather);
+                   //TraceManager.addDev("Saving component in xml:" + s);
+                   if (s == null) {
+                       return null;
+                   }
+                   sb.append(s);
+                   sb.append("\n");
+               }
             }
         }
-
         return sb;
     }
 
@@ -1051,6 +1060,24 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         return ll;
     }
 
+    //issue 186
+    // get all list of all primitive components, composite components and connectors
+    public List<TGComponent> getAllComponent() {
+        List<TGComponent> ll = new LinkedList<TGComponent>();
+        ll.addAll(this.componentList);
+        for (TGComponent tgc : this.componentList) {
+            if (tgc instanceof TMLCCompositeComponent) {
+                for(TGComponent tg : ((TMLCCompositeComponent)tgc).getRecursiveAllInternalComponent()) {
+                    if(tg instanceof TMLCCompositeComponent) {
+                        ll.add(tg);
+                    }
+                }
+                ll.addAll(((TMLCCompositeComponent)tgc).getAllPrimitiveComponents());
+            }
+        }
+        return ll;
+    }
+
     // Adding connector
     public void addingTGConnector() {
         listPoint = new Vector<Point>();
@@ -1361,23 +1388,26 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         return v;
     }
 
+
+    //issue 186
     public Vector<TMLCPrimitiveComponent> selectedCPrimitiveComponent() {
         Vector<TMLCPrimitiveComponent> v = null;
 
-        for (TGComponent tgc : this.componentList)
+        for (TGComponent tgc : this.getAllComponent()){
             if (tgc.isSelected()) {
                 if (tgc instanceof TMLCPrimitiveComponent) {
                     if (v == null)
                         v = new Vector<TMLCPrimitiveComponent>();
                     v.addElement((TMLCPrimitiveComponent) tgc);
                 }
+            }
 
-                if (tgc instanceof TMLCCompositeComponent) {
-                    if (v == null)
-                        v = new Vector<TMLCPrimitiveComponent>();
-                    v.addAll(((TMLCCompositeComponent) (tgc)).getAllPrimitiveComponents());
-                }
+            if (tgc instanceof TMLCCompositeComponent) {
+                if (v == null)
+                    v = new Vector<TMLCPrimitiveComponent>();
+                v.addAll(((TMLCCompositeComponent) (tgc)).getAllPrimitiveComponents());
             }
+        }
 
         return v;
     }
@@ -1707,7 +1737,8 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         }
 
         if (e.getSource() == clone) {
-            cloneComponent(componentPopup.getTopFather());
+            //issue 186
+            cloneComponent(componentPopup, true);
             repaint();
             return;
         }
@@ -2191,7 +2222,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     }
 
     public void makeCut() {
-        copyData = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel);
+        copyData = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel, false);
         removeAllSelectedComponents();
         mgui.changeMade(this, REMOVE_COMPONENT);
         mode = NORMAL;
@@ -2200,13 +2231,13 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     }
 
     public void makeCopy() {
-        copyData = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel);
+        copyData = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel, false);
         mgui.setMode(MainGUI.PASTE_OK);
         return;
     }
 
     public void saveAsLibrary() {
-        String data = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel);
+        String data = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), xSel, ySel, false);
         mgui.saveAsLibrary(data);
         return;
     }
@@ -2371,11 +2402,16 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         }
     }
 
+
+    public void cloneComponent(TGComponent _tgc) {
+        cloneComponent(_tgc, false);
+    }
+
     /*
      * #issue 82
      * new cloneComponent added by Minh Hiep
      */
-    public void cloneComponent(TGComponent _tgc) {
+    public void cloneComponent(TGComponent _tgc, boolean cloneEvenIfNonNullFather) {
         String clone;
 
         Vector<TGComponent> connectorList = new Vector<>();
@@ -2398,7 +2434,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
             }
         }
 
-        clone = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), _tgc.getX(), _tgc.getY());
+        clone = mgui.gtm.makeXMLFromSelectedComponentOfADiagram(this, getMaxIdSelected(), _tgc.getX(), _tgc.getY(), cloneEvenIfNonNullFather);
 
         _tgc.select(false);
         for(int i = 0; i < connectorList.size(); i++){
@@ -2536,10 +2572,10 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 
     public int getMaxIdSelected() {
         int ret = 0;
-        for (TGComponent tgc : this.componentList)
+        //issue 186
+        for (TGComponent tgc : this.getAllComponent())
             if (tgc.isSelected())
                 ret = Math.max(ret, tgc.getMaxId());
-
         return ret;
     }
 
diff --git a/src/main/java/ui/TGComponent.java b/src/main/java/ui/TGComponent.java
index 7839e8076d..b075ae7ddb 100644
--- a/src/main/java/ui/TGComponent.java
+++ b/src/main/java/ui/TGComponent.java
@@ -3079,12 +3079,12 @@ public abstract class TGComponent  extends AbstractCDElement implements /*CDElem
 
     // saving
     public StringBuffer saveInXML() {
-        return saveInXML(true);
+        return saveInXML(true, false);
     }
 
-    protected StringBuffer saveInXML(boolean saveSubComponents) {
+    protected StringBuffer saveInXML(boolean saveSubComponents, boolean saveAsComponentEvenIfNonNullFather) {
         StringBuffer sb = null;
-        boolean b = (father == null);
+        boolean b = (father == null) || saveAsComponentEvenIfNonNullFather;
         if (b) {
             sb = new StringBuffer(XML_HEAD);
         } else {
@@ -3362,7 +3362,7 @@ public abstract class TGComponent  extends AbstractCDElement implements /*CDElem
     }
 
     public void searchForText(String text, Vector<Object> elements) {
-        String save = saveInXML(false).toString().toLowerCase();
+        String save = saveInXML(false, false).toString().toLowerCase();
         if (save.indexOf(text) >= 0) {
             //TraceManager.addDev("Found " + this);
             elements.add(this);
diff --git a/src/main/java/ui/TGConnector.java b/src/main/java/ui/TGConnector.java
index 55a43f5a26..7c32074a4a 100644
--- a/src/main/java/ui/TGConnector.java
+++ b/src/main/java/ui/TGConnector.java
@@ -727,8 +727,9 @@ public abstract class TGConnector extends TGCScalableWithInternalComponent {
 
     }
 
+
     @Override
-    public StringBuffer saveInXML() {
+    public StringBuffer saveInXML(boolean saveSubComponents, boolean saveAsComponentEvenIfNonNullFather) {
         StringBuffer sb = new StringBuffer(XML_CONNECTOR_HEAD);
         sb.append(getType());
         sb.append(XML_ID);
-- 
GitLab