From c66f99fdbd1d87709e1ff9cd5433206788ca33cb Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr>
Date: Wed, 22 Apr 2015 15:06:33 +0000
Subject: [PATCH] Enable / disable on attacks of attack graphs

---
 src/attacktrees/Attack.java              |  10 +
 src/ui/AttackTreePanelTranslator.java    | 416 +++++++++++++++--------
 src/ui/CanBeDisabled.java                |  53 +++
 src/ui/ColorManager.java                 |   3 +-
 src/ui/GTURTLEModeling.java              |   4 +
 src/ui/TDiagramPanel.java                |  35 +-
 src/ui/TGComponent.java                  |  17 +
 src/ui/atd/ATDAttack.java                |  24 +-
 src/ui/window/JDialogAvatarProperty.java | 246 +++++++-------
 9 files changed, 533 insertions(+), 275 deletions(-)
 create mode 100755 src/ui/CanBeDisabled.java

diff --git a/src/attacktrees/Attack.java b/src/attacktrees/Attack.java
index 586df1a702..73bc2d2591 100755
--- a/src/attacktrees/Attack.java
+++ b/src/attacktrees/Attack.java
@@ -54,6 +54,8 @@ public class Attack {
     private String name;
     private Object referenceObject;
     private boolean isRoot;
+    private boolean isEnabled = true;
+    
     
     public Attack(String _name, Object _referenceObject) {
 	name = _name;
@@ -68,6 +70,14 @@ public class Attack {
     public void setRoot(boolean _root) {
 	isRoot = _root;
     }
+
+    public boolean isEnabled() {
+	return isEnabled;
+    }
+
+    public void setEnabled(boolean _enabled) {
+	isEnabled = _enabled;
+    }
     
     public void setOriginNode(AttackNode _node) {
 	originNode = _node;
diff --git a/src/ui/AttackTreePanelTranslator.java b/src/ui/AttackTreePanelTranslator.java
index 959c96365f..1faa9ad99d 100644
--- a/src/ui/AttackTreePanelTranslator.java
+++ b/src/ui/AttackTreePanelTranslator.java
@@ -125,6 +125,7 @@ public class AttackTreePanelTranslator {
                 }
                 att = new Attack(value, atdatt);
                 att.setRoot(atdatt.isRootAttack());
+                att.setEnabled(atdatt.isEnabled());
                 at.addAttack(att);
                 listE.addCor(att, comp);
             }
@@ -334,16 +335,16 @@ public class AttackTreePanelTranslator {
             ar.addSignals(makeAttack, acceptAttack);
             ar.addSignals(stopMakeAttack, stopAcceptAttack);
 
-	    // If attack is not leaf: add the intermediate action to activate the intermediate leaf
-	    if (!attack.isLeaf()) {
-		avatartranslator.AvatarSignal nodeDone = new avatartranslator.AvatarSignal("nodeDone__" + attack.getName(), AvatarSignal.OUT, (Object)(listE.getTG(attack)));
-		_main.addSignal(nodeDone);
-		avatartranslator.AvatarSignal activateAttack = new avatartranslator.AvatarSignal("activate__" + attack.getName(), AvatarSignal.IN, listE.getTG(attack));
-		_main.addSignal(activateAttack);
-		ar.addSignals(nodeDone, activateAttack);
-		
-	    }
-	    
+            // If attack is not leaf: add the intermediate action to activate the intermediate leaf
+            if (!attack.isLeaf()) {
+                avatartranslator.AvatarSignal nodeDone = new avatartranslator.AvatarSignal("nodeDone__" + attack.getName(), AvatarSignal.OUT, (Object)(listE.getTG(attack)));
+                _main.addSignal(nodeDone);
+                avatartranslator.AvatarSignal activateAttack = new avatartranslator.AvatarSignal("activate__" + attack.getName(), AvatarSignal.IN, listE.getTG(attack));
+                _main.addSignal(activateAttack);
+                ar.addSignals(nodeDone, activateAttack);
+
+            }
+
         }
     }
 
@@ -359,7 +360,7 @@ public class AttackTreePanelTranslator {
                 avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("makeStop__" + attack.getName());
 
                 if ((sigAttack != null) && (stopAttack != null)) {
-                    makeAttackBlockSMD(ab, sigAttack, stopAttack, listE.getTG(attack));
+                    makeAttackBlockSMD(ab, sigAttack, stopAttack, attack.isEnabled(), listE.getTG(attack));
                 }
 
             } else {
@@ -370,141 +371,276 @@ public class AttackTreePanelTranslator {
 
                 avatartranslator.AvatarSignal sigAttack = _main.getAvatarSignalWithName("make__" + attack.getName());
                 avatartranslator.AvatarSignal stopAttack = _main.getAvatarSignalWithName("makeStop__" + attack.getName());
-		avatartranslator.AvatarSignal activateAttack = _main.getAvatarSignalWithName("activate__" + attack.getName());
+                avatartranslator.AvatarSignal activateAttack = _main.getAvatarSignalWithName("activate__" + attack.getName());
 
-                makeIntermediateAttackBlockSMD(ab, sigAttack, stopAttack, activateAttack, listE.getTG(attack));
+                makeIntermediateAttackBlockSMD(ab, sigAttack, stopAttack, activateAttack, attack.isEnabled(), listE.getTG(attack));
 
-		// Intermediate attack
-            } 
+                // Intermediate attack
+            }
         }
     }
 
 
-    private void makeAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, Object _ref) {
+    private void makeAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, boolean isEnabled, Object _ref) {
         Object _ref1 = _ref;
         _ref = null;
         AvatarStateMachine asm = _ab.getStateMachine();
 
-        AvatarStartState start = new AvatarStartState("start", _ref);
-        AvatarState mainState = new AvatarState("main", _ref, false);
-        AvatarState performedState = new AvatarState("main", _ref1, true);
-        AvatarState mainStop = new AvatarState("stop", _ref, false);
-        AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1);
-        AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
+        if (isEnabled) {
 
-        asm.addElement(start);
-        asm.setStartState(start);
-        asm.addElement(mainState);
-        asm.addElement(performedState);
-        asm.addElement(getMake);
-        asm.addElement(getStop);
+            AvatarStartState start = new AvatarStartState("start", _ref);
+            AvatarState mainState = new AvatarState("main", _ref, false);
+            AvatarState performedState = new AvatarState("main", _ref1, true);
+            AvatarState mainStop = new AvatarState("stop", _ref, false);
+            AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1);
+            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
 
+            asm.addElement(start);
+            asm.setStartState(start);
+            asm.addElement(mainState);
+            asm.addElement(performedState);
+            asm.addElement(getMake);
+            asm.addElement(getStop);
 
-        AvatarTransition at = new AvatarTransition("at1", _ref);
-        asm.addElement(at);
-        start.addNext(at);
-        at.addNext(mainState);
 
-        at = new AvatarTransition("at2", _ref);
-        asm.addElement(at);
-        mainState.addNext(at);
-        at.addNext(getMake);
+            AvatarTransition at = new AvatarTransition("at1", _ref);
+            asm.addElement(at);
+            start.addNext(at);
+            at.addNext(mainState);
 
-        at = new AvatarTransition("at3", _ref);
-        asm.addElement(at);
-        getMake.addNext(at);
-        at.addNext(performedState);
+            at = new AvatarTransition("at2", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getMake);
 
-        at = new AvatarTransition("backToMain", _ref);
-        asm.addElement(at);
-        performedState.addNext(at);
-        at.addNext(mainState);
+            at = new AvatarTransition("at3", _ref);
+            asm.addElement(at);
+            getMake.addNext(at);
+            at.addNext(performedState);
 
-        at = new AvatarTransition("at4", _ref);
-        asm.addElement(at);
-        mainState.addNext(at);
-        at.addNext(getStop);
+            at = new AvatarTransition("backToMain", _ref);
+            asm.addElement(at);
+            performedState.addNext(at);
+            at.addNext(mainState);
 
-        at = new AvatarTransition("at5", _ref);
-        asm.addElement(at);
-        getStop.addNext(at);
-        at.addNext(mainStop);
+            at = new AvatarTransition("at4", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getStop);
+
+            at = new AvatarTransition("at5", _ref);
+            asm.addElement(at);
+            getStop.addNext(at);
+            at.addNext(mainStop);
+
+        } else {
+
+            AvatarStartState start = new AvatarStartState("start", _ref);
+            AvatarState mainState = new AvatarState("main", _ref, false);
+            AvatarState mainStop = new AvatarState("stop", _ref, false);
+            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
+
+            asm.addElement(start);
+            asm.setStartState(start);
+            asm.addElement(mainState);
+            asm.addElement(getStop);
+
+
+            AvatarTransition at = new AvatarTransition("at1", _ref);
+            asm.addElement(at);
+            start.addNext(at);
+            at.addNext(mainState);
+
+            at = new AvatarTransition("at4", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getStop);
+
+            at = new AvatarTransition("at5", _ref);
+            asm.addElement(at);
+            getStop.addNext(at);
+            at.addNext(mainStop);
+        }
 
     }
 
-    private void makeIntermediateAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, avatartranslator.AvatarSignal _sigActivate, Object _ref) {
+    private void makeIntermediateAttackBlockSMD(AvatarBlock _ab, avatartranslator.AvatarSignal _sigAttack, avatartranslator.AvatarSignal _sigStop, avatartranslator.AvatarSignal _sigActivate, boolean isEnabled, Object _ref) {
         Object _ref1 = _ref;
         _ref = null;
         AvatarStateMachine asm = _ab.getStateMachine();
 
-        AvatarStartState start = new AvatarStartState("start", _ref);
-	AvatarState activateState = new AvatarState("activate", _ref, false);
-        AvatarState mainState = new AvatarState("main", _ref, false);
-	AvatarState activatedState = new AvatarState("main", _ref1, true);
-        AvatarState performedState = new AvatarState("main", _ref, false);
-        AvatarState mainStop = new AvatarState("stop", _ref, false);
-        AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1);
-        AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
-	AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingStop", _sigActivate, _ref1);
+        if (isEnabled) {
+
+            AvatarStartState start = new AvatarStartState("start", _ref);
+            AvatarState activateState = new AvatarState("activate", _ref, false);
+            AvatarState mainState = new AvatarState("main", _ref, false);
+            AvatarState activatedState = new AvatarState("main", _ref1, true);
+            AvatarState performedState = new AvatarState("main", _ref, false);
+            AvatarState mainStop = new AvatarState("stop", _ref, false);
+            AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false);
+            AvatarActionOnSignal getMake = new AvatarActionOnSignal("GettingAttack", _sigAttack, _ref1);
+            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
+            AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref);
+            AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1);
+            AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1);
+
+            asm.addElement(start);
+            asm.setStartState(start);
+            asm.addElement(activateState);
+            asm.addElement(activatedState);
+            asm.addElement(mainState);
+            asm.addElement(stopBeforeActivate);
+            asm.addElement(performedState);
+            asm.addElement(getMake);
+            asm.addElement(getStop);
+            asm.addElement(getStopInitial);
+            asm.addElement(getActivate);
+            asm.addElement(getActivateAfterStop);
+
+
+            AvatarTransition at = new AvatarTransition("at1", _ref);
+            asm.addElement(at);
+            start.addNext(at);
+            at.addNext(activateState);
 
-        asm.addElement(start);
-        asm.setStartState(start);
-	asm.addElement(activateState);
-	asm.addElement(activatedState);
-        asm.addElement(mainState);
-        asm.addElement(performedState);
-        asm.addElement(getMake);
-        asm.addElement(getStop);
-	asm.addElement(getActivate);
+            at = new AvatarTransition("at1_act", _ref);
+            asm.addElement(at);
+            activateState.addNext(at);
+            at.addNext(getActivate);
 
+            at = new AvatarTransition("at1_performed", _ref);
+            asm.addElement(at);
+            getActivate.addNext(at);
+            at.addNext(activatedState);
 
-        AvatarTransition at = new AvatarTransition("at1", _ref);
-        asm.addElement(at);
-        start.addNext(at);
-        at.addNext(activateState);
+            at = new AvatarTransition("at2_main", _ref);
+            asm.addElement(at);
+            activatedState.addNext(at);
+            at.addNext(mainState);
+            at.setHidden(true);
 
-	at = new AvatarTransition("at1_act", _ref);
-        asm.addElement(at);
-        activateState.addNext(at);
-        at.addNext(getActivate);
 
-	at = new AvatarTransition("at1_performed", _ref);
-        asm.addElement(at);
-        getActivate.addNext(at);
-        at.addNext(activatedState);
+            at = new AvatarTransition("at2", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getMake);
 
-	at = new AvatarTransition("at2_main", _ref);
-        asm.addElement(at);
-        activatedState.addNext(at);
-        at.addNext(mainState);
-	at.setHidden(true);
-	
+            at = new AvatarTransition("at3", _ref);
+            asm.addElement(at);
+            getMake.addNext(at);
+            at.addNext(performedState);
 
-        at = new AvatarTransition("at2", _ref);
-        asm.addElement(at);
-        mainState.addNext(at);
-        at.addNext(getMake);
+            at = new AvatarTransition("backToMain", _ref);
+            asm.addElement(at);
+            performedState.addNext(at);
+            at.addNext(mainState);
 
-        at = new AvatarTransition("at3", _ref);
-        asm.addElement(at);
-        getMake.addNext(at);
-        at.addNext(performedState);
+            at = new AvatarTransition("at4", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getStop);
 
-        at = new AvatarTransition("backToMain", _ref);
-        asm.addElement(at);
-        performedState.addNext(at);
-        at.addNext(mainState);
+            at = new AvatarTransition("at5", _ref);
+            asm.addElement(at);
+            getStop.addNext(at);
+            at.addNext(mainStop);
 
-        at = new AvatarTransition("at4", _ref);
-        asm.addElement(at);
-        mainState.addNext(at);
-        at.addNext(getStop);
+            // Stop before activate
+            at = new AvatarTransition("at6", _ref);
+            asm.addElement(at);
+            activateState.addNext(at);
+            at.addNext(getStopInitial);
 
-        at = new AvatarTransition("at5", _ref);
-        asm.addElement(at);
-        getStop.addNext(at);
-        at.addNext(mainStop);
+            at = new AvatarTransition("at7", _ref);
+            asm.addElement(at);
+            getStopInitial.addNext(at);
+            at.addNext(stopBeforeActivate);
+
+            at = new AvatarTransition("at8", _ref);
+            asm.addElement(at);
+            stopBeforeActivate.addNext(at);
+            at.addNext(getActivateAfterStop);
+
+            at = new AvatarTransition("at9", _ref);
+            asm.addElement(at);
+            getActivateAfterStop.addNext(at);
+            at.addNext(mainStop);
+        } else {
+            AvatarStartState start = new AvatarStartState("start", _ref);
+            AvatarState activateState = new AvatarState("activate", _ref, false);
+            AvatarState mainState = new AvatarState("main", _ref, false);
+            AvatarState activatedState = new AvatarState("main", _ref1, true);
+            AvatarState mainStop = new AvatarState("stop", _ref, false);
+            AvatarState stopBeforeActivate = new AvatarState("stopBeforeActivate", _ref, false);
+            AvatarActionOnSignal getStop = new AvatarActionOnSignal("GettingStop", _sigStop, _ref);
+            AvatarActionOnSignal getStopInitial = new AvatarActionOnSignal("GettingInitialStop", _sigStop, _ref);
+            AvatarActionOnSignal getActivate = new AvatarActionOnSignal("GettingActivate", _sigActivate, _ref1);
+            AvatarActionOnSignal getActivateAfterStop = new AvatarActionOnSignal("GettingActivateAfterStop", _sigActivate, _ref1);
+
+            asm.addElement(start);
+            asm.setStartState(start);
+            asm.addElement(activateState);
+            asm.addElement(activatedState);
+            asm.addElement(mainState);
+            asm.addElement(stopBeforeActivate);
+            asm.addElement(getStop);
+            asm.addElement(getStopInitial);
+            asm.addElement(getActivate);
+            asm.addElement(getActivateAfterStop);
+
+
+            AvatarTransition at = new AvatarTransition("at1", _ref);
+            asm.addElement(at);
+            start.addNext(at);
+            at.addNext(activateState);
 
+            at = new AvatarTransition("at1_act", _ref);
+            asm.addElement(at);
+            activateState.addNext(at);
+            at.addNext(getActivate);
+
+            at = new AvatarTransition("at1_performed", _ref);
+            asm.addElement(at);
+            getActivate.addNext(at);
+            at.addNext(activatedState);
+
+            at = new AvatarTransition("at2_main", _ref);
+            asm.addElement(at);
+            activatedState.addNext(at);
+            at.addNext(mainState);
+            at.setHidden(true);
+
+            at = new AvatarTransition("at4", _ref);
+            asm.addElement(at);
+            mainState.addNext(at);
+            at.addNext(getStop);
+
+            at = new AvatarTransition("at5", _ref);
+            asm.addElement(at);
+            getStop.addNext(at);
+            at.addNext(mainStop);
+
+            // Stop before activate
+            at = new AvatarTransition("at6", _ref);
+            asm.addElement(at);
+            activateState.addNext(at);
+            at.addNext(getStopInitial);
+
+            at = new AvatarTransition("at7", _ref);
+            asm.addElement(at);
+            getStopInitial.addNext(at);
+            at.addNext(stopBeforeActivate);
+
+            at = new AvatarTransition("at8", _ref);
+            asm.addElement(at);
+            stopBeforeActivate.addNext(at);
+            at.addNext(getActivateAfterStop);
+
+            at = new AvatarTransition("at9", _ref);
+            asm.addElement(at);
+            getActivateAfterStop.addNext(at);
+            at.addNext(mainStop);
+        }
     }
 
 
@@ -555,7 +691,7 @@ public class AttackTreePanelTranslator {
         asm.addElement(atF);
         start.addNext(atF);
         atF.addNext(mainState);
-	atF.setHidden(true);
+        atF.setHidden(true);
         String finalGuard = "";
         for(Attack att: _node.getInputAttacks()) {
             AvatarAttribute aa = new AvatarAttribute(att.getName() + "__performed", AvatarType.BOOLEAN, _ref);
@@ -566,7 +702,7 @@ public class AttackTreePanelTranslator {
             }
             _ab.addAttribute(aa);
             atF.addAction(att.getName() + "__performed = false");
-	    
+
 
             avatartranslator.AvatarSignal sigAtt = _main.getAvatarSignalWithName("accept__" + att.getName());
             AvatarActionOnSignal acceptAttack = new AvatarActionOnSignal("AcceptAttack", sigAtt, _ref1);
@@ -581,7 +717,7 @@ public class AttackTreePanelTranslator {
             asm.addElement(at);
             acceptAttack.addNext(at);
             at.addNext(mainState);
-	    at.setHidden(true);
+            at.setHidden(true);
         }
 
         // Adding resulting attack
@@ -727,7 +863,7 @@ public class AttackTreePanelTranslator {
 
 
         AvatarTransition atF = new AvatarTransition("at1", _ref);
-	atF.setHidden(true);
+        atF.setHidden(true);
         asm.addElement(atF);
         start.addNext(atF);
         atF.addNext(mainState);
@@ -756,39 +892,39 @@ public class AttackTreePanelTranslator {
             at.setGuard("[("+att.getName() + "__performed == false) && (oneDone == false)]");
             at = new AvatarTransition("at_fromInputAttack", _ref);
             at.addAction(att.getName() + "__performed = true");
-	    at.setHidden(true);
+            at.setHidden(true);
             at.addAction("oneDone = true");
             asm.addElement(at);
             acceptAttack.addNext(at);
             at.addNext(mainState);
 
             // Link from stoppingAll
-	    //           if (att.isLeaf()) {
-                // Leaf attack -> must make a stop
-                sigAtt = _main.getAvatarSignalWithName("acceptStop__" + att.getName());
-                acceptAttack = new AvatarActionOnSignal("StopAttack", sigAtt, _ref1);
-                asm.addElement(acceptAttack);
-                at = new AvatarTransition("at_toInputAttack_leaf", _ref);
-                asm.addElement(at);
-                stoppingAll.addNext(at);
-                at.addNext(acceptAttack);
-                at.setGuard("["+att.getName() + "__performed == false]");
-                at = new AvatarTransition("at_fromInputAttack", _ref);
-                at.addAction(att.getName() + "__performed = true");
-		at.setHidden(true);
-                asm.addElement(at);
-                acceptAttack.addNext(at);
-                at.addNext(stoppingAll);
-		//           } else {
-                // Generated attack-> must set performed to true.
-		/*		at = new AvatarTransition("at_toInputAttack", _ref);
-		stoppingAll.addNext(at);
-		asm.addElement(at);
-		at.addNext(stoppingAll);
-                at.setGuard("["+att.getName() + "__performed == false]");
-		at.addAction(att.getName() + "__performed = true");
-		at.setHidden(true);*/
-		//          }
+            //           if (att.isLeaf()) {
+            // Leaf attack -> must make a stop
+            sigAtt = _main.getAvatarSignalWithName("acceptStop__" + att.getName());
+            acceptAttack = new AvatarActionOnSignal("StopAttack", sigAtt, _ref1);
+            asm.addElement(acceptAttack);
+            at = new AvatarTransition("at_toInputAttack_leaf", _ref);
+            asm.addElement(at);
+            stoppingAll.addNext(at);
+            at.addNext(acceptAttack);
+            at.setGuard("["+att.getName() + "__performed == false]");
+            at = new AvatarTransition("at_fromInputAttack", _ref);
+            at.addAction(att.getName() + "__performed = true");
+            at.setHidden(true);
+            asm.addElement(at);
+            acceptAttack.addNext(at);
+            at.addNext(stoppingAll);
+            //           } else {
+            // Generated attack-> must set performed to true.
+            /*          at = new AvatarTransition("at_toInputAttack", _ref);
+                        stoppingAll.addNext(at);
+                        asm.addElement(at);
+                        at.addNext(stoppingAll);
+                        at.setGuard("["+att.getName() + "__performed == false]");
+                        at.addAction(att.getName() + "__performed = true");
+                        at.setHidden(true);*/
+            //          }
 
         }
 
diff --git a/src/ui/CanBeDisabled.java b/src/ui/CanBeDisabled.java
new file mode 100755
index 0000000000..1a40e3beeb
--- /dev/null
+++ b/src/ui/CanBeDisabled.java
@@ -0,0 +1,53 @@
+/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
+
+ludovic.apvrille AT enst.fr
+
+This software is a computer program whose purpose is to allow the 
+edition of TURTLE analysis, design and deployment diagrams, to 
+allow the generation of RT-LOTOS or Java code from this diagram, 
+and at last to allow the analysis of formal validation traces 
+obtained from external tools, e.g. RTL from LAAS-CNRS and CADP 
+from INRIA Rhone-Alpes.
+
+This software is governed by the CeCILL  license under French law and
+abiding by the rules of distribution of free software.  You can  use, 
+modify and/ or redistribute the software under the terms of the CeCILL
+license as circulated by CEA, CNRS and INRIA at the following URL
+"http://www.cecill.info". 
+
+As a counterpart to the access to the source code and  rights to copy,
+modify and redistribute granted by the license, users are provided only
+with a limited warranty  and the software's author,  the holder of the
+economic rights,  and the successive licensors  have only  limited
+liability. 
+
+In this respect, the user's attention is drawn to the risks associated
+with loading,  using,  modifying and/or developing or reproducing the
+software by the user in light of its specific status of free software,
+that may mean  that it is complicated to manipulate,  and  that  also
+therefore means  that it is reserved for developers  and  experienced
+professionals having in-depth computer knowledge. Users are therefore
+encouraged to load and test the software's suitability as regards their
+requirements in conditions enabling the security of their systems and/or 
+data to be ensured and,  more generally, to use and operate it in the 
+same conditions as regards security. 
+
+The fact that you are presently reading this means that you have had
+knowledge of the CeCILL license and that you accept its terms.
+
+/**
+ * Class CanBeDisabled
+ * Components that can be enabled/disabled with a mouse click
+ * Creation: 22/04/2015
+ * @version 1.0 22/04/2015
+ * @author Ludovic APVRILLE
+ * @see
+ */
+
+
+package ui;
+
+public interface CanBeDisabled  {
+    public boolean isEnabled();
+    public void setEnabled(boolean _enabled);
+}
diff --git a/src/ui/ColorManager.java b/src/ui/ColorManager.java
index 02ade04bce..f93c7dea52 100755
--- a/src/ui/ColorManager.java
+++ b/src/ui/ColorManager.java
@@ -133,8 +133,9 @@ public class ColorManager {
 
 
     //public static  Color ATD_BLOCK = new Color(196, 232, 195);
-     public static  Color ATD_BLOCK = new Color(218, 218, 218);
+    public static  Color ATD_BLOCK = new Color(218, 218, 218);
     public static  Color ATD_ATTACK = new Color(214, 187, 158);
+    public static  Color ATD_ATTACK_DISABLED = new Color(214, 206, 198);
     public static  Color ATD_ROOT_ATTACK = new Color(243, 131, 10);
     public static  Color ATD_CONSTRAINT = new Color(191, 153, 161);
 
diff --git a/src/ui/GTURTLEModeling.java b/src/ui/GTURTLEModeling.java
index 57358991ad..d6cc9f5143 100755
--- a/src/ui/GTURTLEModeling.java
+++ b/src/ui/GTURTLEModeling.java
@@ -5586,6 +5586,7 @@ public class GTURTLEModeling {
             boolean breakpoint = false;
             boolean hidden = false;
             boolean masterMutex = false;
+	    boolean enable = true;
 
             for(i=0; i<nl.getLength(); i++) {
                 n = nl.item(i);
@@ -5611,6 +5612,8 @@ public class GTURTLEModeling {
                         myValue = elt.getAttribute("value");
                     } else if (elt.getTagName().equals("hidden")) {
                         hidden = elt.getAttribute("value").equals("true");
+		    } else if (elt.getTagName().equals("enabled")) {
+                        enable = elt.getAttribute("value").equals("true");
                     } else if (elt.getTagName().equals("TGConnectingPoint")) {
                         x = Integer.decode(elt.getAttribute("num")).intValue();
                         y = Integer.decode(elt.getAttribute("id")).intValue() + decId;
@@ -5696,6 +5699,7 @@ public class GTURTLEModeling {
             }
 
             tgc.setHidden(hidden);
+	    tgc.setEnabled(enable);
 
             /*if (tgc instanceof TCDTObject) {
               TraceManager.addDev("Loading " + myValue);
diff --git a/src/ui/TDiagramPanel.java b/src/ui/TDiagramPanel.java
index 4aa5682e57..30a52c5686 100755
--- a/src/ui/TDiagramPanel.java
+++ b/src/ui/TDiagramPanel.java
@@ -125,7 +125,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     protected JPopupMenu componentMenu;
     protected JPopupMenu selectedMenu;
     protected int popupX, popupY;
-    protected JMenuItem remove, edit, clone, bringFront, bringBack, makeSquare, setJavaCode, removeJavaCode, setInternalComment, removeInternalComment, attach, detach, hide, unhide,search;
+    protected JMenuItem remove, edit, clone, bringFront, bringBack, makeSquare, setJavaCode, removeJavaCode, setInternalComment, removeInternalComment, attach, detach, hide, unhide,search, enableDisable;
     protected JMenuItem checkAccessibility, checkInvariant, checkMasterMutex;
     protected JMenuItem breakpoint;
     protected JMenuItem paste, insertLibrary, upX, upY, downX, downY;
@@ -134,7 +134,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
     //search dialog
     protected JDialogSearchBox j;
     //--
-    
+
     // Main window
     protected MainGUI mgui;
 
@@ -693,12 +693,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         //boolean b = false;
         boolean hoveredElementFound = false;
         byte info = 0;
-        
-        
+
+
         TGComponent tmp = componentHovered;
         componentHovered = null;
         Iterator iterator = componentList.listIterator();
-        
+
         while(iterator.hasNext()) {
             tgc = (TGComponent)(iterator.next());
             //state = tgc.getState();
@@ -716,11 +716,11 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
                 tgc.setState(TGState.NORMAL);
             }
         }
-        
+
         if (tmp != componentHovered) {
             info ++;
         }
-        
+
         return info;
     }
 
@@ -1420,6 +1420,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         componentMenu.add(clone);
         componentMenu.add(bringFront);
         componentMenu.add(bringBack);
+	componentMenu.add(enableDisable);
         componentMenu.add(makeSquare);
         componentMenu.addSeparator();
         componentMenu.add(attach);
@@ -1489,6 +1490,9 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         clone = new JMenuItem("Clone");
         clone.addActionListener(menuAL);
 
+	enableDisable = new JMenuItem("Enable/Disable");
+        enableDisable.addActionListener(menuAL);
+
         bringFront = new JMenuItem("Bring to front");
         bringFront.addActionListener(menuAL);
 
@@ -1595,6 +1599,13 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
             repaint();
             return;
         }
+	
+	if (e.getSource() == enableDisable) {
+	    componentPopup.setEnabled(!componentPopup.isEnabled());
+	    getGUI().changeMade(this, CHANGE_VALUE_COMPONENT);
+            repaint();
+            return;
+        }
 
         if (e.getSource() == edit) {
             if (componentPopup.doubleClick(mgui.getFrame(), 0, 0)) {
@@ -1861,6 +1872,16 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
             clone.setEnabled(false);
         }
 
+	if (componentPointed instanceof CanBeDisabled) {
+            /*if (componentPointed.hasFather()) {
+              clone.setEnabled(false);
+              } else {*/
+            enableDisable.setEnabled(true);
+            //}
+        } else {
+            enableDisable.setEnabled(false);
+        }
+
         if (componentPointed instanceof SwallowedTGComponent) {
             if (componentPointed.getFather() == null) {
                 attach.setEnabled(true);
diff --git a/src/ui/TGComponent.java b/src/ui/TGComponent.java
index dccd811496..8353bb4cf7 100755
--- a/src/ui/TGComponent.java
+++ b/src/ui/TGComponent.java
@@ -138,6 +138,7 @@ public abstract class TGComponent implements CDElement, GenericTree {
     protected TGComponent selectedInternalComponent;
 
     // characteristics
+    protected boolean enabled = true;
     protected boolean moveable;
     protected boolean removable;
     protected boolean multieditable = false;
@@ -212,6 +213,15 @@ public abstract class TGComponent implements CDElement, GenericTree {
     public abstract TGComponent isOnMe(int _x, int _y);
     public abstract void setState(int s);
 
+
+    public void setEnabled(boolean _enabled) {
+	enabled = _enabled;
+    }
+
+    public boolean isEnabled() {
+	return enabled;
+    }
+
     // Internal component operations
     public void setFather(TGComponent _father) {
         father = _father;
@@ -2703,6 +2713,9 @@ public abstract class TGComponent implements CDElement, GenericTree {
         sb.append(translateCDParam());
         sb.append(translateSizeParam());
         sb.append(translateHidden());
+	if (this instanceof CanBeDisabled) {
+	    sb.append(translateEnabled());
+	}
         sb.append(translateCDRectangleParam());
         sb.append(translateNameValue());
         sb.append(translateConnectingPoints());
@@ -2745,6 +2758,10 @@ public abstract class TGComponent implements CDElement, GenericTree {
         return new String(sb);
     }
 
+    protected String translateEnabled() {
+	return "<enabled value=\"" + enabled + "\" />\n";
+    }
+
     protected String translateHidden() {
         return "<hidden value=\"" + hidden + "\" />\n";
     }
diff --git a/src/ui/atd/ATDAttack.java b/src/ui/atd/ATDAttack.java
index 7550155e68..ac3136c0b1 100755
--- a/src/ui/atd/ATDAttack.java
+++ b/src/ui/atd/ATDAttack.java
@@ -56,7 +56,7 @@ import myutil.*;
 import ui.*;
 import ui.window.*;
 
-public class ATDAttack extends TGCScalableWithInternalComponent implements SwallowedTGComponent, WithAttributes, CheckableAccessibility {
+public class ATDAttack extends TGCScalableWithInternalComponent implements SwallowedTGComponent, WithAttributes, CheckableAccessibility, CanBeDisabled {
     private int textY1 = 3;
     private int textY2 = 3;
 
@@ -183,11 +183,16 @@ public class ATDAttack extends TGCScalableWithInternalComponent implements Swall
         // Core of the attack
         Color c = g.getColor();
         g.draw3DRect(x, y, width, height, true);
-        if (isRootAttack) {
-            g.setColor(ColorManager.ATD_ROOT_ATTACK);
+        if (isEnabled()) {
+            if (isRootAttack) {
+                g.setColor(ColorManager.ATD_ROOT_ATTACK);
+            } else {
+                g.setColor(ColorManager.ATD_ATTACK);
+            }
         } else {
-            g.setColor(ColorManager.ATD_ATTACK);
+            g.setColor(ColorManager.ATD_ATTACK_DISABLED);
         }
+
         g.fill3DRect(x+1, y+1, width-1, height-1, true);
         g.setColor(c);
 
@@ -235,6 +240,17 @@ public class ATDAttack extends TGCScalableWithInternalComponent implements Swall
                     //TraceManager.addDev("w=" + w + " val=" + (2*textX + width) + "h=" + h + " height=" + height + " zoom=" + tdp.getZoom() + " Font=" + f0);
                 }
             }
+
+	    if (!isEnabled()) {
+		String val = "disabled";
+		w = g.getFontMetrics().stringWidth(val);
+		int h =  currentFontSize + (int)(textY1 * tdp.getZoom());
+		g.setFont(f.deriveFont(Font.ITALIC));
+		g.drawString(val, x + (width - w - 5), y + height - 2);
+	    }
+
+	    
+	    
         } else {
             //TraceManager.addDev("-------------------------------------------------- Cannot display text of attack");
         }
diff --git a/src/ui/window/JDialogAvatarProperty.java b/src/ui/window/JDialogAvatarProperty.java
index 5a6ee2d9a3..1a2fafd5e6 100755
--- a/src/ui/window/JDialogAvatarProperty.java
+++ b/src/ui/window/JDialogAvatarProperty.java
@@ -1,48 +1,48 @@
 /**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
 
-ludovic.apvrille AT enst.fr
-
-This software is a computer program whose purpose is to allow the 
-edition of TURTLE analysis, design and deployment diagrams, to 
-allow the generation of RT-LOTOS or Java code from this diagram, 
-and at last to allow the analysis of formal validation traces 
-obtained from external tools, e.g. RTL from LAAS-CNRS and CADP 
-from INRIA Rhone-Alpes.
-
-This software is governed by the CeCILL  license under French law and
-abiding by the rules of distribution of free software.  You can  use, 
-modify and/ or redistribute the software under the terms of the CeCILL
-license as circulated by CEA, CNRS and INRIA at the following URL
-"http://www.cecill.info". 
-
-As a counterpart to the access to the source code and  rights to copy,
-modify and redistribute granted by the license, users are provided only
-with a limited warranty  and the software's author,  the holder of the
-economic rights,  and the successive licensors  have only  limited
-liability. 
-
-In this respect, the user's attention is drawn to the risks associated
-with loading,  using,  modifying and/or developing or reproducing the
-software by the user in light of its specific status of free software,
-that may mean  that it is complicated to manipulate,  and  that  also
-therefore means  that it is reserved for developers  and  experienced
-professionals having in-depth computer knowledge. Users are therefore
-encouraged to load and test the software's suitability as regards their
-requirements in conditions enabling the security of their systems and/or 
-data to be ensured and,  more generally, to use and operate it in the 
-same conditions as regards security. 
-
-The fact that you are presently reading this means that you have had
-knowledge of the CeCILL license and that you accept its terms.
-
-/**
- * Class JDialogAvatarProperty
- * Dialog for managing property attributes
- * Creation: 26/04/2010
- * @version 1.0 26/04/2010
- * @author Ludovic APVRILLE
- * @see
- */
+   ludovic.apvrille AT enst.fr
+
+   This software is a computer program whose purpose is to allow the
+   edition of TURTLE analysis, design and deployment diagrams, to
+   allow the generation of RT-LOTOS or Java code from this diagram,
+   and at last to allow the analysis of formal validation traces
+   obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
+   from INRIA Rhone-Alpes.
+
+   This software is governed by the CeCILL  license under French law and
+   abiding by the rules of distribution of free software.  You can  use,
+   modify and/ or redistribute the software under the terms of the CeCILL
+   license as circulated by CEA, CNRS and INRIA at the following URL
+   "http://www.cecill.info".
+
+   As a counterpart to the access to the source code and  rights to copy,
+   modify and redistribute granted by the license, users are provided only
+   with a limited warranty  and the software's author,  the holder of the
+   economic rights,  and the successive licensors  have only  limited
+   liability.
+
+   In this respect, the user's attention is drawn to the risks associated
+   with loading,  using,  modifying and/or developing or reproducing the
+   software by the user in light of its specific status of free software,
+   that may mean  that it is complicated to manipulate,  and  that  also
+   therefore means  that it is reserved for developers  and  experienced
+   professionals having in-depth computer knowledge. Users are therefore
+   encouraged to load and test the software's suitability as regards their
+   requirements in conditions enabling the security of their systems and/or
+   data to be ensured and,  more generally, to use and operate it in the
+   same conditions as regards security.
+
+   The fact that you are presently reading this means that you have had
+   knowledge of the CeCILL license and that you accept its terms.
+
+   /**
+   * Class JDialogAvatarProperty
+   * Dialog for managing property attributes
+   * Creation: 26/04/2010
+   * @version 1.0 26/04/2010
+   * @author Ludovic APVRILLE
+   * @see
+   */
 
 package ui.window;
 
@@ -54,57 +54,57 @@ import ui.*;
 
 public class JDialogAvatarProperty extends javax.swing.JDialog implements ActionListener  {
     private JPanel panel1;
-    
-	private String name;
-	private int kind;
-	boolean notSelected;
-	private boolean hasBeenCancelled = false;
-	private JTextField myName;
-	private JRadioButton safety, notSafety, reachability, liveness, notReachability, notLiveness;
-    
+
+    private String name;
+    private int kind;
+    boolean notSelected;
+    private boolean hasBeenCancelled = false;
+    private JTextField myName;
+    private JRadioButton safety, notSafety, reachability, liveness, notReachability, notLiveness;
+
     // Main Panel
     private JButton closeButton;
     private JButton cancelButton;
-    
+
     //private String id1, id2;
-    
+
     /** Creates new form  */
     public JDialogAvatarProperty(Frame f, String _name, int _kind, boolean _notSelected) {
-        
+
         super(f, "Setting property attributes", true);
-       
-		name = _name;
+
+        name = _name;
         kind = _kind;
-		notSelected = _notSelected;
+        notSelected = _notSelected;
 
         initComponents();
         myInitComponents();
         pack();
     }
-    
-    
+
+
     private void myInitComponents() {
     }
-    
+
     private void initComponents() {
         Container c = getContentPane();
         GridBagLayout gridbag0 = new GridBagLayout();
         GridBagLayout gridbag1 = new GridBagLayout();
         GridBagConstraints c0 = new GridBagConstraints();
         GridBagConstraints c1 = new GridBagConstraints();
-        
+
         setFont(new Font("Helvetica", Font.PLAIN, 14));
         c.setLayout(gridbag0);
-        
+
         setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-        
+
         panel1 = new JPanel();
         panel1.setLayout(gridbag1);
-           
+
         panel1.setBorder(new javax.swing.border.TitledBorder("Property"));
-    
+
         //panel1.setPreferredSize(new Dimension(200, 150));
-        
+
         // first line panel1
         c1.weighty = 1.0;
         c1.weightx = 1.0;
@@ -112,60 +112,60 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action
         c1.fill = GridBagConstraints.BOTH;
         c1.gridheight = 1;
         panel1.add(new JLabel(" "), c1);
-        
+
         // second line panel1
         c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         myName = new JTextField(name, 30);
-		myName.setEditable(true);
+        myName.setEditable(true);
         panel1.add(myName, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         reachability = new JRadioButton("Reachable");
-		reachability.setSelected((kind == 1) && !notSelected);
+        reachability.setSelected((kind == 1) && !notSelected);
         panel1.add(reachability, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         notReachability = new JRadioButton("Not reachable");
-		notReachability.setSelected((kind == 1) && notSelected);
+        notReachability.setSelected((kind == 1) && notSelected);
         panel1.add(notReachability, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         liveness = new JRadioButton("Liveness");
-		liveness.setSelected((kind == 0) && !notSelected);
+        liveness.setSelected((kind == 0) && !notSelected);
         panel1.add(liveness, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         notLiveness = new JRadioButton("Not Liveness");
-		notLiveness.setSelected((kind == 0) && notSelected);
+        notLiveness.setSelected((kind == 0) && notSelected);
         panel1.add(notLiveness, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         safety = new JRadioButton("Safety");
-		safety.setSelected((kind == 2) && !notSelected);
+        safety.setSelected((kind == 2) && !notSelected);
         panel1.add(safety, c1);
-		
-		c1.gridwidth = GridBagConstraints.REMAINDER; //end row
+
+        c1.gridwidth = GridBagConstraints.REMAINDER; //end row
         notSafety = new JRadioButton("Not Safety");
-		notSafety.setSelected((kind == 2) && notSelected);
+        notSafety.setSelected((kind == 2) && notSelected);
         panel1.add(notSafety, c1);
-		
-		ButtonGroup bg = new ButtonGroup();
-		bg.add(reachability);
-		bg.add(liveness);
-		bg.add(notReachability);
-		bg.add(notLiveness);
-		bg.add(safety);
-		bg.add(notSafety);
-        
+
+        ButtonGroup bg = new ButtonGroup();
+        bg.add(reachability);
+        bg.add(liveness);
+        bg.add(notReachability);
+        bg.add(notLiveness);
+        bg.add(safety);
+        bg.add(notSafety);
+
         // main panel;
         c0.gridwidth = 1;
         c0.gridheight = 10;
         c0.weighty = 1.0;
         c0.weightx = 1.0;
         c0.gridwidth = GridBagConstraints.REMAINDER; //end row
-        
+
         c.add(panel1, c0);
-        
+
         c0.gridwidth = 1;
         c0.gridheight = 1;
         c0.fill = GridBagConstraints.HORIZONTAL;
@@ -178,10 +178,10 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action
         cancelButton.addActionListener(this);
         c.add(cancelButton, c0);
     }
-    
-    public void	actionPerformed(ActionEvent evt)  {
+
+    public void actionPerformed(ActionEvent evt)  {
         String command = evt.getActionCommand();
-        
+
         // Compare the action command to the known actions.
         if (command.equals("Save and Close"))  {
             closeDialog();
@@ -189,46 +189,46 @@ public class JDialogAvatarProperty extends javax.swing.JDialog implements Action
             cancelDialog();
         }
     }
-	
-	public boolean hasBeenCancelled() {
-		return hasBeenCancelled;
-	}
-    
-    
+
+    public boolean hasBeenCancelled() {
+        return hasBeenCancelled;
+    }
+
+
     public void closeDialog() {
         dispose();
     }
-	
-	public boolean isReachabilitySelected() {
+
+    public boolean isReachabilitySelected() {
         return reachability.isSelected();
     }
-	
-	public boolean isNotReachabilitySelected() {
+
+    public boolean isNotReachabilitySelected() {
         return notReachability.isSelected();
     }
-    
+
     public boolean isLivenessSelected() {
         return liveness.isSelected();
     }
-	
-	public boolean isNotLivenessSelected() {
+
+    public boolean isNotLivenessSelected() {
         return notLiveness.isSelected();
     }
-	
-	 public boolean isSafetySelected() {
+
+    public boolean isSafetySelected() {
         return safety.isSelected();
     }
-	
-	public boolean isNotSafetySelected() {
+
+    public boolean isNotSafetySelected() {
         return notSafety.isSelected();
     }
-	
-	public String getName() {
-		return myName.getText();
-	}
-    
+
+    public String getName() {
+        return myName.getText();
+    }
+
     public void cancelDialog() {
-		hasBeenCancelled = true;
+        hasBeenCancelled = true;
         dispose();
     }
 }
-- 
GitLab