From 7247e6e28e0169cb07f588396bc8e010184027a5 Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr>
Date: Mon, 21 Jun 2010 13:16:46 +0000
Subject: [PATCH] Update on AVATAR Data Types

---
 src/avatartranslator/AvatarBlock.java         |  11 +-
 .../touppaal/AVATAR2UPPAAL.java               |   3 +
 src/ui/AvatarDesignPanelTranslator.java       | 199 +++++++++++++++---
 src/ui/AvatarMethod.java                      |   3 +-
 src/ui/ColorManager.java                      |   1 +
 src/ui/GTURTLEModeling.java                   |   4 +-
 src/ui/MainGUI.java                           |  28 +--
 src/ui/TDiagramPanel.java                     |  40 ++++
 src/ui/TGComponentManager.java                |   6 +
 src/ui/TGUIAction.java                        |   4 +-
 src/ui/avatarbd/AvatarBDBlock.java            |  14 +-
 src/ui/avatarbd/AvatarBDPanel.java            |  44 +++-
 src/ui/avatarbd/AvatarBDToolBar.java          |   6 +
 src/ui/window/JDialogAvatarBlock.java         |  30 ++-
 14 files changed, 329 insertions(+), 64 deletions(-)

diff --git a/src/avatartranslator/AvatarBlock.java b/src/avatartranslator/AvatarBlock.java
index 9a6f048e5e..4739c5f3ae 100644
--- a/src/avatartranslator/AvatarBlock.java
+++ b/src/avatartranslator/AvatarBlock.java
@@ -189,6 +189,8 @@ public class AvatarBlock extends AvatarElement {
 	}
 	
 	public boolean isAValidMethodCall(String _s) {
+		TraceManager.addDev("****** method=" + _s);
+		
 		int index0 = _s.indexOf("(");
 		int index1 = _s.indexOf(")");
 		if ((index0 == -1) || (index1 == -1) || (index1 < index0)) {
@@ -196,7 +198,7 @@ public class AvatarBlock extends AvatarElement {
 		}
 		
 		String method = _s.substring(0, index0);
-		TraceManager.addDev("method=" + method);
+		
 		AvatarMethod am = getAvatarMethodWithName(method);
 		if (am == null) {
 			return false;
@@ -219,13 +221,16 @@ public class AvatarBlock extends AvatarElement {
 		
 		AvatarAttribute aa;
 		for(int i=0; i<actions.length; i++) {
-			TraceManager.addDev("params=" + params +  "actions=" + actions[i]);
-			aa = getAvatarAttributeWithName(actions[i]);
+			TraceManager.addDev("params=" + params +  " actions=" + actions[i]);
+			aa = getAvatarAttributeWithName(actions[i].trim());
 			if (aa == null) {
+				TraceManager.addDev("Failed for attribute " + actions[i]);
 				return false;
 			}
 		}
 		
+		TraceManager.addDev("Ok for method " + _s);
+		
 		return true;
 		
 	}
diff --git a/src/avatartranslator/touppaal/AVATAR2UPPAAL.java b/src/avatartranslator/touppaal/AVATAR2UPPAAL.java
index 17aea97e68..675dca2316 100755
--- a/src/avatartranslator/touppaal/AVATAR2UPPAAL.java
+++ b/src/avatartranslator/touppaal/AVATAR2UPPAAL.java
@@ -613,6 +613,9 @@ public class AVATAR2UPPAAL {
 			TraceManager.addDev("Attribute #j: " + tmps);
 			aa = _block.getAvatarAttributeWithName(tmps);
 			if (aa != null) {
+				if ((nbOfInt > 0) || (nbOfBool > 0)) {
+					result = result + ",\n";
+				}
 				if (aa.isInt() || aa.isNat()) {
 					result = result + ACTION_INT + nbOfInt + " =" + aa.getName();
 					nbOfInt ++;
diff --git a/src/ui/AvatarDesignPanelTranslator.java b/src/ui/AvatarDesignPanelTranslator.java
index 080d708152..89f87f2d62 100644
--- a/src/ui/AvatarDesignPanelTranslator.java
+++ b/src/ui/AvatarDesignPanelTranslator.java
@@ -97,6 +97,20 @@ public class AvatarDesignPanelTranslator {
 		return as;
 	}
 	
+	public void addRegularAttribute(AvatarBlock _ab, TAttribute _a, String _preName) {
+		int type = 0;
+		if (_a.getType() == TAttribute.INTEGER){
+			type = AvatarType.INTEGER;
+		} else if (_a.getType() == TAttribute.NATURAL){
+			type = AvatarType.NATURAL;
+		} else if (_a.getType() == TAttribute.BOOLEAN) {
+			type = AvatarType.BOOLEAN;
+		}
+		AvatarAttribute aa = new AvatarAttribute(_preName + _a.getId(), type, _a);
+		aa.setInitialValue(_a.getInitialValue());
+		_ab.addAttribute(aa);
+	}
+	
 	public void createBlocks(AvatarSpecification _as, LinkedList<AvatarBDBlock> _blocks) {
 		AvatarBlock ab;
 		Vector v;
@@ -108,6 +122,7 @@ public class AvatarDesignPanelTranslator {
 		avatartranslator.AvatarMethod atam;
 		avatartranslator.AvatarSignal atas;
 		TGComponent tgc1, tgc2;
+		Vector types;
 		
 		for(AvatarBDBlock block: _blocks) {
 			ab = new AvatarBlock(block.getBlockName(), block);
@@ -119,19 +134,27 @@ public class AvatarDesignPanelTranslator {
 			for(i=0; i<v.size(); i++) {
 				a = (TAttribute)(v.elementAt(i));
 				if (a.getType() == TAttribute.INTEGER){
-					aa = new AvatarAttribute(a.getId(), AvatarType.INTEGER, a);
-					aa.setInitialValue(a.getInitialValue());
-					ab.addAttribute(aa);
-				}
-				if (a.getType() == TAttribute.NATURAL){
-					aa = new AvatarAttribute(a.getId(), AvatarType.NATURAL, a);
-					aa.setInitialValue(a.getInitialValue());
-					ab.addAttribute(aa);
-				}
-				if (a.getType() == TAttribute.BOOLEAN) {
-					aa = new AvatarAttribute(a.getId(), AvatarType.BOOLEAN, a);
-					aa.setInitialValue(a.getInitialValue());
-					ab.addAttribute(aa);
+					addRegularAttribute(ab, a, "");
+				} else if (a.getType() == TAttribute.NATURAL){
+					addRegularAttribute(ab, a, "");
+				} else if (a.getType() == TAttribute.BOOLEAN) {
+					addRegularAttribute(ab, a, "");
+				} else {
+					// other
+					//TraceManager.addDev(" -> Other type found: " + a.getTypeOther());
+					types = adp.getAvatarBDPanel().getAttributesOfDataType(a.getTypeOther());
+					if (types == null) {
+						CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "Unknown data type:  " + a.getTypeOther() + " used in " + ab.getName());
+						ce.setAvatarBlock(ab);
+						ce.setTDiagramPanel(adp.getAvatarBDPanel());
+						addCheckingError(ce);
+						return;
+					} else {
+						for(int j=0; j<types.size(); j++) {
+							addRegularAttribute(ab, (TAttribute)(types.elementAt(j)), a.getId() + "__");
+						}
+					}
+					
 				}
 			}
 			
@@ -182,13 +205,77 @@ public class AvatarDesignPanelTranslator {
 		String typeIds[] = _uiam.getTypeIds();
 		String types[] = _uiam.getTypes();
 		AvatarAttribute aa;
+		TAttribute ta;
+		Vector v;
+		int type = 0;
 		
 		for(int i=0; i<types.length; i++) {
-			aa = new AvatarAttribute(typeIds[i], AvatarType.getType(types[i]), _uiam);
-			_atam.addParameter(aa);
+			v = adp.getAvatarBDPanel().getAttributesOfDataType(types[i]);
+			if (v == null) {
+				aa = new AvatarAttribute(typeIds[i], AvatarType.getType(types[i]), _uiam);
+				_atam.addParameter(aa);
+			} else {
+				for(int j=0; j<v.size(); j++) {
+					ta = (TAttribute)(v.get(j));
+					if (ta.getType() == TAttribute.INTEGER){
+						type = AvatarType.INTEGER;
+					} else if (ta.getType() == TAttribute.NATURAL){
+						type = AvatarType.NATURAL;
+					} else if (ta.getType() == TAttribute.BOOLEAN) {
+						type = AvatarType.BOOLEAN;
+					}
+					aa = new AvatarAttribute(typeIds[i] + "__" + ta.getId(), type, _uiam);
+					_atam.addParameter(aa);
+				}
+			}
 		}
 	}
 	
+	public void manageAttribute(String _name, AvatarBlock _ab, AvatarActionOnSignal _aaos, TDiagramPanel _tdp, TGComponent _tgc, String _idOperator) {
+		TAttribute ta =  adp.getAvatarBDPanel().getAttribute(_name, _ab.getName());
+		if (ta == null) {
+			CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + _name + " in signal expression: " + _idOperator);
+			ce.setAvatarBlock(_ab);
+			ce.setTDiagramPanel(_tdp);
+			ce.setTGComponent(_tgc);
+			addCheckingError(ce);
+			TraceManager.addDev("not found");
+			return ;
+		}
+		
+		TraceManager.addDev("Found: " + ta.getId());
+		
+		AvatarAttribute aa;
+		Vector v = new Vector();
+		int i;
+		TAttribute tatmp;
+		
+		if (ta.getType() == TAttribute.OTHER) {
+			Vector v0 = adp.getAvatarBDPanel().getAttributesOfDataType(ta.getTypeOther());
+			for(i=0; i<v0.size(); i++) {
+				tatmp = (TAttribute)(v0.get(i));
+				v.add(_name + "__" + tatmp.getId());
+			}
+		} else {
+			v.add(_name);
+		}
+		for(i=0; i<v.size(); i++) {
+			aa = _ab.getAvatarAttributeWithName((String)(v.get(i)));
+			if (aa == null) {
+				CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + _name + " in signal expression: " + _idOperator);
+				ce.setAvatarBlock(_ab);
+				ce.setTDiagramPanel(_tdp);
+				ce.setTGComponent(_tgc);
+				addCheckingError(ce);
+				return ;
+			} else {
+				_aaos.addValue(_name);
+			}
+		}
+		
+		
+	}
+	
 	public void makeStateMachine(AvatarSpecification _as, AvatarBlock _ab) {
 		AvatarBDBlock block = (AvatarBDBlock)(listE.getTG(_ab));
 		if (block == null) {
@@ -266,6 +353,7 @@ public class AvatarDesignPanelTranslator {
 		AvatarState astate;
 		int i;
 		String tmp;
+		TAttribute ta;
 		
 		while(iterator.hasNext()) {
 			tgc = (TGComponent)(iterator.next());
@@ -280,6 +368,7 @@ public class AvatarDesignPanelTranslator {
 					ce.setTDiagramPanel(tdp);
 					ce.setTGComponent(tgc);
 					addCheckingError(ce);
+					
 				} else {
 					aaos = new AvatarActionOnSignal("action_on_signal", atas, tgc);
 					if (aaos.isSending()) {
@@ -305,7 +394,11 @@ public class AvatarDesignPanelTranslator {
 								ce.setTGComponent(tgc);
 								addCheckingError(ce);
 							} else {
+								manageAttribute(tmp, _ab, aaos, tdp, tgc, asmdrs.getValue());
 								// Check that tmp is the identifier of an attribute
+								// Find the TAttribute
+								/*ta = getTAttribute(tmp);
+								
 								aa = _ab.getAvatarAttributeWithName(tmp);
 								if (aa == null) {
 									CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + tmp + " in signal expression: " + asmdrs.getValue());
@@ -315,7 +408,7 @@ public class AvatarDesignPanelTranslator {
 									addCheckingError(ce);
 								} else {
 									aaos.addValue(tmp);
-								}
+								}*/
 							}
 						}
 						//adag.setActionValue(makeTIFAction(asmdrs.getValue(), "?"));
@@ -323,6 +416,8 @@ public class AvatarDesignPanelTranslator {
 						asm.addElement(aaos);
 					}
 				}
+				
+			// Send signals
 			} else if (tgc instanceof AvatarSMDSendSignal) {
 				asmdss = (AvatarSMDSendSignal)tgc;
 				atas = _ab.getAvatarSignalWithName(asmdss.getSignalName());
@@ -357,8 +452,9 @@ public class AvatarDesignPanelTranslator {
 								ce.setTGComponent(tgc);
 								addCheckingError(ce);
 							} else {
+								manageAttribute(tmp, _ab, aaos, tdp, tgc, asmdss.getValue());
 								// Check that tmp is the identifier of an attribute
-								aa = _ab.getAvatarAttributeWithName(tmp);
+								/*aa = _ab.getAvatarAttributeWithName(tmp);
 								if (aa == null) {
 									CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + tmp + " in signal expression: " + asmdss.getValue());
 									ce.setAvatarBlock(_ab);
@@ -367,7 +463,7 @@ public class AvatarDesignPanelTranslator {
 									addCheckingError(ce);
 								} else {
 									aaos.addValue(tmp);
-								}
+								}*/
 							}
 						}
 						//adag.setActionValue(makeTIFAction(asmdrs.getValue(), "?"));
@@ -447,7 +543,7 @@ public class AvatarDesignPanelTranslator {
 						at = new AvatarTransition("avatar transition", tgc);
 						
 						// Guard
-						tmp = asmdco.getGuard();
+						tmp = modifyString(asmdco.getGuard());
 						error = AvatarSyntaxChecker.isAValidGuard(_as, _ab, tmp);
 						if (error < 0) {
 							makeError(error, tdp, _ab, tgc, "transition guard", tmp); 
@@ -456,13 +552,13 @@ public class AvatarDesignPanelTranslator {
 						}
 						
 						// Delays
-						tmp1 = asmdco.getAfterMinDelay();
+						tmp1 = modifyString(asmdco.getAfterMinDelay());
 						error = AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, tmp1);
 						if (error < 0) {
 							makeError(error, tdp, _ab, tgc, "after min delay", tmp1);
 							tmp1 = null;
 						} 
-						tmp2 = asmdco.getAfterMaxDelay();
+						tmp2 = modifyString(asmdco.getAfterMaxDelay());
 						error = AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, tmp2);
 						if (error < 0) {
 							makeError(error, tdp, _ab, tgc, "after max delay", tmp2);
@@ -474,13 +570,13 @@ public class AvatarDesignPanelTranslator {
 						}
 						
 						// Compute min and max
-						tmp1 = asmdco.getComputeMinDelay();
+						tmp1 = modifyString(asmdco.getComputeMinDelay());
 						error = AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, tmp1);
 						if (error < 0) {
 							makeError(error, tdp, _ab, tgc, "compute min ", tmp1);
 							tmp1 = null;
 						} 
-						tmp2 = asmdco.getComputeMaxDelay();
+						tmp2 = modifyString(asmdco.getComputeMaxDelay());
 						error = AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, tmp2);
 						if (error < 0) {
 							makeError(error, tdp, _ab, tgc, "compute max ", tmp2);
@@ -495,11 +591,12 @@ public class AvatarDesignPanelTranslator {
 						vs = asmdco.getActions();
 						for(String s: vs) {
 							if (s.trim().length() > 0) {
-								s = s.trim();
+								s = modifyString(s.trim());
 								// Variable assignation or method call?
 								error = s.indexOf("=");
 								if (error == -1) {
 									// Method call
+									s = modifyStringMethodCall(s, _ab.getName());
 									if(!_ab.isAValidMethodCall(s)) {
 										CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed transition method call: " + s);
 										ce.setAvatarBlock(_ab);
@@ -624,6 +721,60 @@ public class AvatarDesignPanelTranslator {
 		warnings.addElement(ce);
 	}
 	
+	private String modifyString(String _input) {
+		return Conversion.replaceAllChar(_input, '.', "__");
+	}
+	
+	private String modifyStringMethodCall(String _input, String _blockName) {
+		int index0 = _input.indexOf('(');
+		int index1 = _input.indexOf(')');
+		
+		if ((index0 == -1) || (index1 == -1) || (index1 < index0)) {
+			return _input;
+		}
+		
+		String s = _input.substring(index0+1, index1).trim();
+		String output = "";
+		
+		if (s.length() == 0) {
+			return _input;
+		}
+		
+		//TraceManager.addDev("Analyzing method call " + s);
+		TAttribute ta, tatmp; 
+		
+		String [] actions = s.split(",");
+		s = "";
+		for(int i=0; i<actions.length; i++) {
+			ta = adp.getAvatarBDPanel().getAttribute(actions[i].trim(), _blockName);
+			if (ta == null) {
+				s = s + actions[i].trim();
+			} else {
+				if (ta.getType() == TAttribute.OTHER) {
+					Vector v0 = adp.getAvatarBDPanel().getAttributesOfDataType(ta.getTypeOther());
+					for(int j=0; j<v0.size(); j++) {
+						tatmp = (TAttribute)(v0.get(j));
+						s += actions[i].trim() + "__" + tatmp.getId();
+						if (j != v0.size()-1) {
+							s = s + ", ";
+						}
+					}
+				} else {
+					s = s + actions[i].trim();
+				}
+			}
+			if (i != actions.length-1) {
+					s = s + ", ";
+			}
+		}
+		
+		s  = _input.substring(0, index0) + "(" + s + ")";
+		
+		//TraceManager.addDev("Returning method call " + s);
+		
+		return s;
+	}
+	
 	/*public TURTLEModeling generateTURTLEModeling() {
 		LinkedList<AvatarBDBlock> blocks = adp.getAvatarBDPanel().getFullBlockList();
 		return generateTURTLEModeling(blocks, "");
diff --git a/src/ui/AvatarMethod.java b/src/ui/AvatarMethod.java
index 48b90a3fa2..4af5c49282 100644
--- a/src/ui/AvatarMethod.java
+++ b/src/ui/AvatarMethod.java
@@ -59,6 +59,7 @@ public class AvatarMethod {
     public final static int NATURAL = 0;
     public final static int BOOLEAN = 1;
 	public final static int INTEGER = 2;
+	public final static int OTHER = 3;
 	
     protected String id;
 	protected String typeIds[];
@@ -267,7 +268,7 @@ public class AvatarMethod {
         } else if (s.equals("int")) {
             return 	INTEGER;
         }
-        return -1;
+        return OTHER;
     }
     
     public static String getStringType(int type) {
diff --git a/src/ui/ColorManager.java b/src/ui/ColorManager.java
index bf8060d61e..9fdc389b38 100755
--- a/src/ui/ColorManager.java
+++ b/src/ui/ColorManager.java
@@ -133,6 +133,7 @@ public class ColorManager {
 	//public static final Color AVATAR_BLOCK = new Color(128, 180, 205);
 	//public static final Color AVATAR_BLOCK = new Color(158, 218, 227);
 	public static final Color AVATAR_BLOCK = new Color(149, 193, 210);
+	public static final Color AVATAR_DATATYPE = new Color(109, 193, 210);
 	public static final Color AVATAR_SEND_SIGNAL = new Color(128, 180, 205);
 	public static final Color AVATAR_RECEIVE_SIGNAL = new Color(128, 180, 205);
 	public static final Color AVATAR_GUARD = new Color(128, 180, 205);
diff --git a/src/ui/GTURTLEModeling.java b/src/ui/GTURTLEModeling.java
index 5a1d77a4d1..e211c37741 100755
--- a/src/ui/GTURTLEModeling.java
+++ b/src/ui/GTURTLEModeling.java
@@ -4367,7 +4367,7 @@ public class GTURTLEModeling {
 				throw new MalformedModelingException();
 			}
 
-			TraceManager.addDev("Making TGComponent of type " + myType + " and of name " + myName);
+			//TraceManager.addDev("Making TGComponent of type " + myType + " and of name " + myName);
 			//TGComponent is ready to be built
 			if(fatherId != -1) {
 				fatherId += decId;
@@ -4409,7 +4409,7 @@ public class GTURTLEModeling {
 			} else {
 				tgc = TGComponentManager.addComponent(myX, myY, myType, tdp);
 			}
-			TraceManager.addDev("TGComponent built " + myType);
+			//TraceManager.addDev("TGComponent built " + myType);
 
 			if (tgc == null) {
 				throw new MalformedModelingException();
diff --git a/src/ui/MainGUI.java b/src/ui/MainGUI.java
index ae74a8941f..771530e8ff 100755
--- a/src/ui/MainGUI.java
+++ b/src/ui/MainGUI.java
@@ -4508,22 +4508,10 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
         return getUseCaseDiagramPanel(tp, indexTab, s);
     }
     
-    /*public UseCaseDiagramPanel getUseCaseDiagramPanel(int index, int indexTab, String s) {
-        System.out.println("Searching for " + s + " at index =" + indexTab);
-        TURTLEPanel tp = (TURTLEPanel)(tabs.elementAt(index));
-        return getUseCaseDiagramPanel(tp, indexTab, s);
-    }*/
-    
     public UseCaseDiagramPanel getUseCaseDiagramPanel(TURTLEPanel tp, int indexTab, String s) {
         if(tp.tabbedPane.getTitleAt(indexTab).equals(s)) {
             return (UseCaseDiagramPanel)(tp.panelAt(indexTab));
         }
-        /*for(int i=0; i<tp.tabbedPane.getTabCount(); i++) {
-            if (tp.tabbedPane.getTitleAt(i).equals(s)) {
-                if (tp.panelAt(i) instanceof UseCaseDiagramPanel)
-                    return  (UseCaseDiagramPanel)(tp.panelAt(i));
-            }
-        }*/
         return null;
     }
     
@@ -5206,21 +5194,21 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
     }
 	
 	public boolean newAvatarBDBlockName(TURTLEPanel tp, String old, String niou) {
-		TraceManager.addDev("Panel=" + tp + " Old  task name = " + old + " New task name=" + niou);
+		//TraceManager.addDev("Panel=" + tp + " Old  task name = " + old + " New task name=" + niou);
         JTabbedPane jtp = tp.tabbedPane;
 		int i;
         for(i = 0; i<jtp.getTabCount(); i++) {
-			TraceManager.addDev("jtp  = " + jtp.getTitleAt(i));
+			//TraceManager.addDev("jtp  = " + jtp.getTitleAt(i));
             if (jtp.getTitleAt(i).equals(niou)) {
                 return false;
             }
         }
-       TraceManager.addDev("old " + old + " niou " + niou);
-	   TraceManager.addDev("nb Of panels:"+ jtp.getTabCount());
+       //TraceManager.addDev("old " + old + " niou " + niou);
+	   //TraceManager.addDev("nb Of panels:"+ jtp.getTabCount());
         for(i = 0; i<jtp.getTabCount(); i++) {
             //TraceManager.addDev("Tab " + i + " = " + mainTabbedPane.getTitleAt(i));
-			TraceManager.addDev("jtp  = >" + jtp.getTitleAt(i) + "<");
-			TraceManager.addDev("old  = >" + old + "<");
+			//TraceManager.addDev("jtp  = >" + jtp.getTitleAt(i) + "<");
+			//TraceManager.addDev("old  = >" + old + "<");
             if (jtp.getTitleAt(i).compareTo(old) == 0) {
                 jtp.setTitleAt(i, niou);
                 jtp.setToolTipTextAt(i, "Opens the state machine of " + niou);
@@ -5230,7 +5218,7 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
                     tdp = (TDiagramPanel)(tp.panels.elementAt(j));
                     if (tdp.getName().equals(old)) {
                         tdp.setName(niou);
-						TraceManager.addDev("Renamed to " + niou);
+						//TraceManager.addDev("Renamed to " + niou);
                     }
                 }
                 
@@ -6069,6 +6057,8 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
 		// AVATAR BD
 		} else if (command.equals(actions[TGUIAction.ABD_BLOCK].getActionCommand())) {
             actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.AVATARBD_BLOCK);
+		} else if (command.equals(actions[TGUIAction.ABD_DATATYPE].getActionCommand())) {
+            actionOnButton(TGComponentManager.COMPONENT, TGComponentManager.AVATARBD_DATATYPE);
 		} else if (command.equals(actions[TGUIAction.ABD_COMPOSITION_CONNECTOR].getActionCommand())) {
             actionOnButton(TGComponentManager.CONNECTOR, TGComponentManager.AVATARBD_COMPOSITION_CONNECTOR);	
 		} else if (command.equals(actions[TGUIAction.ABD_PORT_CONNECTOR].getActionCommand())) {
diff --git a/src/ui/TDiagramPanel.java b/src/ui/TDiagramPanel.java
index 8b6b0a72fd..d2bce40b2f 100755
--- a/src/ui/TDiagramPanel.java
+++ b/src/ui/TDiagramPanel.java
@@ -2761,6 +2761,30 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         return true;
     }
 	
+	public boolean isAvatarBlockNameUnique(String s) {
+        Object o;
+        AvatarBDBlock block;
+		AvatarBDDataType type; 
+        Iterator iterator = componentList.listIterator();
+        
+        while(iterator.hasNext()) {
+            o = (TGComponent)(iterator.next());
+            if (o instanceof AvatarBDBlock) {
+                block = (AvatarBDBlock)o;
+                if (block.getBlockName().equals(s)) {               
+                    return false;
+                }
+            }
+			if (o instanceof AvatarBDDataType) {
+                type = (AvatarBDDataType)o;
+                if (type.getDataTypeName().equals(s)) {               
+                    return false;
+                }
+            }
+        }   
+        return true;
+    }
+	
 	public boolean isNCNameUnique(String s) {
         Object o;
 		TGComponent tgc;
@@ -2891,6 +2915,22 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         
         return v;
     }
+	
+	public Vector<String> getAllDataTypes() {
+		Vector<String> v = new Vector<String>();
+		TGComponent tgc;
+		Iterator iterator = componentList.listIterator();
+        
+        while(iterator.hasNext()) {
+            tgc = (TGComponent)(iterator.next());
+			
+			if (tgc instanceof AvatarBDDataType) {
+				v.add(((AvatarBDDataType)(tgc)).getDataTypeName());
+			}
+		}
+		
+		return v;
+	}
     
     public void removeSynchronizedGates(Vector v, TClassInterface t, TCDSynchroGateList tcdsgl ) {
         TGComponent tgc;
diff --git a/src/ui/TGComponentManager.java b/src/ui/TGComponentManager.java
index cf37f5c985..5119a505e0 100755
--- a/src/ui/TGComponentManager.java
+++ b/src/ui/TGComponentManager.java
@@ -291,6 +291,7 @@ public class TGComponentManager {
 	public static final int AVATARBD_BLOCK = 5000;
 	public static final int AVATARBD_COMPOSITION_CONNECTOR = 5001;
 	public static final int AVATARBD_PORT_CONNECTOR = 5002;
+	public static final int AVATARBD_DATATYPE = 5003;
 	
 	// AVATAR SMD -> starts at 5100
 	public static final int AVATARSMD_START_STATE = 5100;
@@ -336,6 +337,9 @@ public class TGComponentManager {
 			// AVATAR
 			case AVATARBD_BLOCK:
                 tgc = new AvatarBDBlock(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
+                break;
+			case AVATARBD_DATATYPE:
+                tgc = new AvatarBDDataType(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
                 break;
 			case AVATARSMD_START_STATE:
                 tgc = new AvatarSMDStartState(x, y, tdp.getMinX(), tdp.getMaxX(), tdp.getMinY(), tdp.getMaxY(), false, null, tdp);
@@ -810,6 +814,8 @@ public class TGComponentManager {
 		// AVATAR BD
 		if (tgc instanceof AvatarBDBlock) {
 			return AVATARBD_BLOCK;
+		} else if (tgc instanceof AvatarBDDataType) {
+			return AVATARBD_DATATYPE;	
 		} else if (tgc instanceof AvatarBDCompositionConnector) {
 			return AVATARBD_COMPOSITION_CONNECTOR;	
 		} else if (tgc instanceof AvatarBDPortConnector) {
diff --git a/src/ui/TGUIAction.java b/src/ui/TGUIAction.java
index 4ad5a4ae0e..5c90e2f349 100755
--- a/src/ui/TGUIAction.java
+++ b/src/ui/TGUIAction.java
@@ -297,6 +297,7 @@ public class TGUIAction extends AbstractAction {
 	
 	// AVATAR Block Diagram
 	public static final int ABD_BLOCK = 289;
+	public static final int ABD_DATATYPE = 324;
 	public static final int ABD_COMPOSITION_CONNECTOR = 290;
 	public static final int ABD_PORT_CONNECTOR = 295;
 	
@@ -443,7 +444,7 @@ public class TGUIAction extends AbstractAction {
     //Action for the help button created by Solange
     public static final int PRUEBA_1 = 205;
 
-    public static final int NB_ACTION = 324;
+    public static final int NB_ACTION = 325;
 
     private  static final TAction [] actions = new TAction[NB_ACTION];
     
@@ -826,6 +827,7 @@ public class TGUIAction extends AbstractAction {
 		
 		// AVATAR Block Diagrams
 		actions[ABD_BLOCK] = new TAction("abd-block", "Add a block", IconManager.imgic5000, IconManager.imgic5000, "Block", "Add a SysML Block to the currently opened AVATAR Block Diagram", 0);
+        actions[ABD_DATATYPE] = new TAction("abd-datatype", "Add a data type", IconManager.imgic5000, IconManager.imgic5000, "Data type", "Add a SysML Block representing a Data Type to the currently opened AVATAR Block Diagram", 0);
         actions[ABD_COMPOSITION_CONNECTOR] = new TAction("abd-composition-connector", "Add a composition connector between blocks", IconManager.imgic5002, IconManager.imgic5002, "Composition connector", "Add a composition between blocks of the currently opened AVATAR Block Diagram", 0);
 		actions[ABD_PORT_CONNECTOR] = new TAction("abd-port-connector", "Add a composition connector between blocks", IconManager.imgic5004, IconManager.imgic5004, "Port connector", "Add a port link between blocks of the currently opened AVATAR Block Diagram", 0);
 		
diff --git a/src/ui/avatarbd/AvatarBDBlock.java b/src/ui/avatarbd/AvatarBDBlock.java
index 44ca4e6cec..d983d2ab99 100644
--- a/src/ui/avatarbd/AvatarBDBlock.java
+++ b/src/ui/avatarbd/AvatarBDBlock.java
@@ -434,7 +434,7 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
 					return false;
 				}
 				
-				if (!tdp.isBlockNameUnique(s)) {
+				if (!tdp.isAvatarBlockNameUnique(s)) {
 					JOptionPane.showMessageDialog(frame,
 						"Could not change the name of the Block: the new name is already in use",
 						"Error",
@@ -501,6 +501,12 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
         _jdab.addType(TAttribute.getStringType(TAttribute.NATURAL), true);
         _jdab.addType(TAttribute.getStringType(TAttribute.BOOLEAN), true);
 		_jdab.addType(TAttribute.getStringType(TAttribute.INTEGER), true);
+		
+		for(String s: tdp.getAllDataTypes()) {
+			_jdab.addType(s, false);
+		}
+		
+		
 		_jdab.enableInitialValue(true);
         _jdab.enableRTLOTOSKeyword(false);
         _jdab.enableJavaKeyword(false);
@@ -840,16 +846,16 @@ public class AvatarBDBlock extends TGCScalableWithInternalComponent implements S
 			_id = _id.substring(0, index0);
 		}
 		_id = _id.trim();
-		TraceManager.addDev("Searching for signal with id=" + _id);
+		//TraceManager.addDev("Searching for signal with id=" + _id);
 		AvatarSignal as;
 		for(int i=0; i<mySignals.size(); i++) {
 			as = (AvatarSignal)(mySignals.get(i));
 			if (as.getId().compareTo(_id) == 0) {
-				TraceManager.addDev("found");
+				//TraceManager.addDev("found");
 				return as;
 			}
 		}
-		TraceManager.addDev("Not found");
+		//TraceManager.addDev("Not found");
 		return null;
 	}        
 	
diff --git a/src/ui/avatarbd/AvatarBDPanel.java b/src/ui/avatarbd/AvatarBDPanel.java
index e8e0271aa2..21766bb8c1 100644
--- a/src/ui/avatarbd/AvatarBDPanel.java
+++ b/src/ui/avatarbd/AvatarBDPanel.java
@@ -53,6 +53,8 @@ import ui.*;
 import ui.tmldd.*;
 import java.util.*;
 
+import myutil.*;
+
 public class AvatarBDPanel extends TDiagramPanel {
     
     public  AvatarBDPanel(MainGUI mgui, TToolBar _ttb) {
@@ -68,10 +70,9 @@ public class AvatarBDPanel extends TDiagramPanel {
             AvatarBDBlock b = (AvatarBDBlock)tgc;
 			//System.out.println("oldValue:" + b.oldValue);
             return mgui.newAvatarBDBlockName(tp, b.oldValue, b.getValue());
-        } /*else if (tgc instanceof TMLActivityDiagramBox) {
-            if (tgc.getFather() instanceof TMLTaskOperator) {
-                mgui.selectTab(tp, tgc.getFather().getValue());
-            }*/
+        } else if (tgc instanceof AvatarBDDataType) {
+            return true;
+		}
             //return false; // because no change made on any diagram
         //}
         return false;
@@ -588,5 +589,40 @@ public class AvatarBDPanel extends TDiagramPanel {
 		}
 		return null;
 	}
+	
+	public Vector getAttributesOfDataType(String _name) {
+		TGComponent tgc;
+        Iterator iterator = componentList.listIterator();
+		AvatarBDDataType adt;
+		
+        while(iterator.hasNext()) {
+            tgc = (TGComponent)(iterator.next());
+			if (tgc instanceof AvatarBDDataType) {
+				adt = (AvatarBDDataType)tgc;
+				if (adt.getDataTypeName().compareTo(_name) == 0) {
+					return adt.getAttributeList();
+				}
+			}
+		}
+		
+		return null;
+	}
+	
+	public TAttribute getAttribute(String _name, String _nameOfBlock) {
+		
+		//TraceManager.addDev("Searching for attribute: " + _name  + " of block " + _nameOfBlock);
+	
+		TAttribute ta;
+		Vector v = getAllAttributesOfBlock(_nameOfBlock);
+		
+		for(int i=0; i<v.size(); i++) {
+			ta = (TAttribute)(v.get(i));
+			if (ta.getId().compareTo(_name) ==0) {
+				return ta;
+			}
+		}
+
+		return null;
+	}
     
 }
diff --git a/src/ui/avatarbd/AvatarBDToolBar.java b/src/ui/avatarbd/AvatarBDToolBar.java
index 43196bf0ce..8bfb903d78 100644
--- a/src/ui/avatarbd/AvatarBDToolBar.java
+++ b/src/ui/avatarbd/AvatarBDToolBar.java
@@ -71,6 +71,7 @@ public class AvatarBDToolBar extends TToolBar {
         mgui.actions[TGUIAction.CONNECTOR_COMMENT].setEnabled(b);
 		
 		mgui.actions[TGUIAction.ABD_BLOCK].setEnabled(b);
+		mgui.actions[TGUIAction.ABD_DATATYPE].setEnabled(b);
 		mgui.actions[TGUIAction.ABD_COMPOSITION_CONNECTOR].setEnabled(b);
 		mgui.actions[TGUIAction.ABD_PORT_CONNECTOR].setEnabled(b);
 		
@@ -101,6 +102,11 @@ public class AvatarBDToolBar extends TToolBar {
         this.addSeparator();
         
         button = this.add(mgui.actions[TGUIAction.ABD_BLOCK]);
+        button.addMouseListener(mgui.mouseHandler);
+		
+		this.addSeparator();
+        
+        button = this.add(mgui.actions[TGUIAction.ABD_DATATYPE]);
         button.addMouseListener(mgui.mouseHandler);
 		
 		this.addSeparator();
diff --git a/src/ui/window/JDialogAvatarBlock.java b/src/ui/window/JDialogAvatarBlock.java
index 37d3c27a85..c955b16471 100755
--- a/src/ui/window/JDialogAvatarBlock.java
+++ b/src/ui/window/JDialogAvatarBlock.java
@@ -81,6 +81,7 @@ public class JDialogAvatarBlock extends javax.swing.JDialog implements ActionLis
     private JButton removeButton;
 	
 	// Method
+	private boolean hasMethods = true;
 	private JPanel panel3, panel4;
 	private JTextField methodText;
 	private JButton addMethodButton;
@@ -90,6 +91,7 @@ public class JDialogAvatarBlock extends javax.swing.JDialog implements ActionLis
     private JButton removeMethodButton;
 	
 	// Signals
+	private boolean hasSignals = true;
 	private JPanel panel5, panel6;
 	private JComboBox signalInOutBox;
 	private JTextField signalText;
@@ -110,6 +112,18 @@ public class JDialogAvatarBlock extends javax.swing.JDialog implements ActionLis
         attributesPar = _attributes;
 		methodsPar = _methods;
 		signalsPar = _signals;
+		
+		
+		if (methodsPar == null) {
+			methodsPar = new Vector();
+			hasMethods = false;
+		}
+		
+		if (signalsPar == null) {
+			signalsPar = new Vector();
+			hasSignals = false;
+		}
+		
         forbidden = _forbidden;
         initValues = new Vector();
         this.attrib = attrib;
@@ -457,13 +471,17 @@ public class JDialogAvatarBlock extends javax.swing.JDialog implements ActionLis
 		panelAttr.add(panel2, BorderLayout.EAST);
 		tabbedPane.addTab("Attributes", panelAttr);
 		
-		panelMethod.add(panel3, BorderLayout.WEST);
-		panelMethod.add(panel4, BorderLayout.EAST);
-		tabbedPane.addTab("Methods", panelMethod);
+		if (hasMethods) {
+			panelMethod.add(panel3, BorderLayout.WEST);
+			panelMethod.add(panel4, BorderLayout.EAST);
+			tabbedPane.addTab("Methods", panelMethod);
+		}
 		
-		panelSignal.add(panel5, BorderLayout.WEST);
-		panelSignal.add(panel6, BorderLayout.EAST);
-		tabbedPane.addTab("Signals", panelSignal);
+		if (hasSignals) {
+			panelSignal.add(panel5, BorderLayout.WEST);
+			panelSignal.add(panel6, BorderLayout.EAST);
+			tabbedPane.addTab("Signals", panelSignal);
+		}
 		
 		tabbedPane.setSelectedIndex(tab);
 
-- 
GitLab