Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / Editeur / Objecttreeitem.py
index 3a4d23b3caae94695de8b842536e4b7fa41a2ed1..0882abb5962dab745363280c0bf6c8ff8f11a4fd 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -24,6 +25,10 @@ import types,string,os,glob,imp,sys
 from repr import Repr
 from copy import copy,deepcopy
 
+# import du chargeur de composants
+from comploader import make_objecttreeitem
+from Ihm import CONNECTOR
+
 myrepr = Repr()
 myrepr.maxstring = 100
 myrepr.maxother = 100
@@ -36,6 +41,16 @@ class TreeItem:
     is used.
 
     """
+    # itemNode est une factory qui doit retourner un objet de la classe Node
+    # ou dérivé de cette classe.
+    # Le widget arbre utilisera cet objet comme noeud associé au tree item.
+    # Par defaut, utilise la classe Node de base
+    # La signature de la factory est la suivante :
+    # itemNode(treeOrNode,item,command,rmenu)
+    # ou treeOrNode est le noeud parent, item est l'item associé
+    # command est une fonction python appelée sur sélection graphique
+    # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
+    itemNode=None
 
     def __init__(self):
         """Constructor.  Do whatever you need to do."""
@@ -114,27 +129,46 @@ class Delegate:
     def cachereport(self):
         keys = self.__cache.keys()
         keys.sort()
-        print keys
+        #print keys
 
 
 class ObjectTreeItem(TreeItem,Delegate):
     def __init__(self, appli, labeltext, object, setfunction=None):
         self.labeltext = labeltext
         self.appli = appli
+        # L'objet délegué est stocké dans l'attribut object
+        # L'objet associé à l'item est stocké dans l'attribut _object
+        # Il peut etre obtenu par appel à la méthode getObject
+        # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
+        # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
+        # et l'objet délégué est le MCFACT (object = _object.data[0])
         Delegate.__init__(self,object)
-        #self.object = object
+        # On cache l'objet initial (pour destruction eventuelle
+        # ultérieure)
+        self._object = object
         self.setfunction = setfunction
         self.expandable = 1
+        self.sublist=[]
         self.init()
 
     def init(self):
         return
 
+    def getObject(self):
+        return self._object
+
+    def connect(self,channel,callable,args):
+        """ Connecte la fonction callable (avec arguments args) à l'item self sur le 
+            canal channel
+        """
+        CONNECTOR.Connect(self._object,channel,callable,args)
+        CONNECTOR.Connect(self.object, channel,callable,args)
+
     def copy(self):
         """
         Crée un item copie de self
         """
-        object = self.object.copy()
+        object = self._object.copy()
         appli = copy(self.appli)
         labeltext = copy(self.labeltext)
         fonction = deepcopy(self.setfunction)
@@ -147,6 +181,13 @@ class ObjectTreeItem(TreeItem,Delegate):
         else:
             return 1
     
+    def update(self,item):
+        """
+          Met a jour l'item courant a partir d'un autre item passe en argument
+          Ne fait rien par defaut
+        """
+        pass
+
     def GetLabelText(self):
         """ Retourne 3 valeurs :
         - le texte à afficher dans le noeud représentant l'item
@@ -156,13 +197,6 @@ class ObjectTreeItem(TreeItem,Delegate):
         # None --> fonte et couleur par défaut
         return self.labeltext,None,None
 
-    #def get_attribut(self,nom_attribut) :
-    #    """ 
-    #       Retourne l'attribut de nom nom_attribut de l'objet sur lequel
-    #       pointe self s'il existe, None sinon
-    #    """
-    #    return self.object.get_attribut(nom_attribut)
-
     def get_nature(self) :
         """ 
             Retourne la nature de l'item et de l'objet
@@ -212,6 +246,14 @@ class ObjectTreeItem(TreeItem,Delegate):
         return self.object.get_genealogie()
 
     def get_index_child(self,nom_fils):
+        """
+        Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+        Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+        le nouveau mot-clé
+        """
+        return self.object.get_index_child(nom_fils)
+
+    def get_index_child_old(self,nom_fils):
         """
         Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
         Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
@@ -226,6 +268,41 @@ class ObjectTreeItem(TreeItem,Delegate):
         # l contient les anciens mots-clés + le nouveau dans l'ordre
         return l.index(nom_fils)
         
+    def append_child(self,name,pos=None):
+        """
+          Permet d'ajouter un item fils à self
+        """
+        if pos == 'first':
+            index = 0
+        elif pos == 'last':
+            index = len(self.liste_mc_presents())
+        elif type(pos) == types.IntType :
+            # la position est fixée 
+            index = pos
+        elif type(pos) == types.InstanceType:
+            # pos est un item. Il faut inserer name apres pos
+            index = self.get_index(pos) +1
+        elif type(name) == types.InstanceType:
+            index = self.get_index_child(name.nom)
+        else:
+            index = self.get_index_child(name)
+        return self.addobject(name,index)
+
+    def append_brother(self,name,pos='after'):
+        """
+        Permet d'ajouter un frère à self
+        par défaut on l'ajoute après self
+        """
+        index = self._object.parent.get_index(self.getObject())
+        if pos == 'before':
+            index = index
+        elif pos == 'after':
+            index = index +1
+        else:
+            print str(pos)," n'est pas un index valide pour append_brother"
+            return
+        return self.parent.addobject(name,index)
+
     def get_nom_etape(self):
         """Retourne le nom de self """
         return self.object.get_nom_etape()
@@ -249,7 +326,6 @@ class ObjectTreeItem(TreeItem,Delegate):
     def get_jdc(self):
         """ Retourne le jdc auquel appartient l'objet pointé par self """
         return self.object.jdc
-        #return self.object.get_attribut('jdc')
     
     def get_valeur(self):
         """ Retourne la valeur de l'objet pointé par self """
@@ -265,6 +341,7 @@ class ObjectTreeItem(TreeItem,Delegate):
         représentatif de self.object
         --> à surcharger par les différents items
         """
+        raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
         pass
         
     def isvalid(self):
@@ -278,32 +355,6 @@ class ObjectTreeItem(TreeItem,Delegate):
         """
         return 0
     
-    def isMCList(self):
-        """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
-        #if isinstance(self.object,MCList) :
-        if self.object.__class__.__name__ == 'MCList':
-            return 1
-        else :
-            return 0
-
-    def isCommande(self):
-        """
-        Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
-        """
-        return 0
-
-    def isJdc(self):
-        """
-        Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
-        """
-        return 0
-
-    def isMCFact(self):
-        """
-        Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
-        """
-        return 0
-    
     def get_mc_presents(self):
         """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
         return self.object.dict_mc_presents()
@@ -314,17 +365,17 @@ class ObjectTreeItem(TreeItem,Delegate):
     def get_fr(self):
         """ Retourne le fr de l'objet pointé par self """
         try:
-           return self.object.get_fr()
+            return self.object.get_fr()
         except:
-           return ''
+            return ""
 
     def get_docu(self):
         """ Retourne la clé de doc de l'objet pointé par self """
         return self.object.get_docu()
 
-    def set_valeur(self,new_valeur,evaluation='oui'):
+    def set_valeur(self,new_valeur):
         """ Remplace la valeur de l'objet pointé par self par new_valeur """
-        return self.object.set_valeur(new_valeur,evaluation=evaluation)
+        return self.object.set_valeur(new_valeur)
         
     def GetText(self):
         return myrepr.repr(self.object)
@@ -377,8 +428,10 @@ class ObjectTreeItem(TreeItem,Delegate):
            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
            de type item associé à l'object passé en argument.
         """
-        c = gettreeitem(object)
-        return c(appli,labeltext, object, setfunction)
+        return make_objecttreeitem(appli,labeltext,object,setfunction)
+
+    #def __del__(self):
+    #    print "__del__",self
 
 class AtomicObjectTreeItem(ObjectTreeItem):
     def IsExpandable(self):
@@ -386,99 +439,66 @@ class AtomicObjectTreeItem(ObjectTreeItem):
 
 class SequenceTreeItem(ObjectTreeItem):
     def IsExpandable(self):
-        return len(self.object) > 0
+        return len(self._object) > 0
 
     def __len__(self) :
-        return len(self.object)
+        return len(self._object)
    
     def keys(self):
-        return range(len(self.object))
+        return range(len(self._object))
 
     def GetIconName(self):
-        if self.object.isvalid():
+        if self._object.isvalid():
           return "ast-green-los"
-        elif self.object.isoblig():
+        elif self._object.isoblig():
           return "ast-red-los"
         else:
           return "ast-yel-los"
 
     def ajout_possible(self):
-        return self.object.ajout_possible()
+        return self._object.ajout_possible()
 
     def get_index(self,child):
         """ Retourne le numéro de child dans la liste des enfants de self """
-        return self.object.get_index(child.object)
+        return self._object.get_index(child.getObject())
 
     def GetText(self):
       return  "    "
 
     def additem(self,obj,pos):
-        # XXX Passer par addentite  de MCList ???
-        self.object.insert(pos,obj)
+        self._object.insert(pos,obj)
         item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
         return item
 
     def suppitem(self,item):
-        if not self.object.isMCList():return 1
         try :
-            self.object.remove(item.object)
+            self._object.remove(item.getObject())
             # la liste peut être retournée vide !
-            message = "Mot-clé " + item.object.nom + " supprimé"
+            message = "Mot-clé " + item.getObject().nom + " supprimé"
             self.appli.affiche_infos(message)
             return 1
         except:
             return 0
 
     def GetSubList(self):
-        sublist = []
-        for obj in self.object.data:
-            def setfunction(value, object=obj):
-                object = value
-            item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
-            sublist.append(item)
-        return sublist
-
-def gettreeitem(object):
-    """
-       Cette fonction retourne la classe item associée à l'objet object.
-       Cette classe item dépend bien sûr de la nature de object, d'où
-       l'interrogation du dictionnaire composants
-    """
-    if type(object) == types.InstanceType:
-      # On cherche d abord dans les composants (plugins)
-      try:
-        return composants[object.__class__]
-      except:
-        # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
-        for e in composants.keys():
-          if isinstance(object,e):return composants[e]
-    # On n'a rien trouve dans les composants
-    return ObjectTreeItem
-
-def charger_composants():
-    """
-        Cette fonction a pour but de charger tous les modules composants graphiques
-        (fichiers compo*.py dans le même répertoire que ce module )
-        et de remplir le dictionnaire composants utilisé par make_objecttreeitem
-    """
-    composants={}
-    repertoire=os.path.dirname(__file__)
-    listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
-    for fichier in listfich:
-        m= os.path.basename(fichier)[:-3]
-        module=__import__(m,globals(),locals())
-        composants[module.objet]=module.treeitem
-    return composants
-
-def make_objecttreeitem(appli,labeltext, object, setfunction=None):
-    """
-       Cette fonction permet de construire et de retourner un objet
-       de type item associé à l'object passé en argument.
-    """
-    c = gettreeitem(object)
-    return c(appli,labeltext, object, setfunction)
-
-# Dictionnaire {object : item} permettant d'associer un item à un object
-# Ce dictionnaire est renseigné par la méthode charger_composants 
-composants = charger_composants()
-
+        isublist=iter(self.sublist)
+        liste=self._object.data
+        iliste=iter(liste)
+        self.sublist=[]
+
+        while(1):
+           old_obj=obj=None
+           for item in isublist:
+              old_obj=item.getObject()
+              if old_obj in liste:break
+
+           for obj in iliste:
+              if obj is old_obj:break
+              # nouvel objet : on cree un nouvel item
+              def setfunction(value, object=obj):
+                  object=value
+              it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+              self.sublist.append(it)
+           if old_obj is None and obj is None:break
+           if old_obj is obj: self.sublist.append(item)
+        return self.sublist