+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2013 EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
"""
"""
# import généraux
from repr import Repr
from copy import copy,deepcopy
+# import du chargeur de composants
+from comploader import make_objecttreeitem
+from Ihm import CONNECTOR
+from Extensions.i18n import tr
+from Extensions.eficas_exception import EficasException
+
myrepr = Repr()
myrepr.maxstring = 100
myrepr.maxother = 100
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."""
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
+ """
+ #print self,channel,callable,args
+ 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)
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
# 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
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
# 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 tr("%d n'est pas un index valide pour append_brother", pos)
+ return
+ return self.parent.addobject(name,index)
+
def get_nom_etape(self):
"""Retourne le nom de self """
return self.object.get_nom_etape()
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 """
représentatif de self.object
--> à surcharger par les différents items
"""
- pass
+ raise EficasException("MESSAGE AU DEVELOPPEUR : il faut \
+ surcharger la methode get_objet_commentarise() \
+ pour la classe %s", self.__class__.__name__)
def isvalid(self):
""" Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
"""
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()
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)
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):
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):
+ 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-clef " + item.getObject().nom + " supprime"
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