1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
24 import types,string,os,glob,imp,sys
26 from copy import copy,deepcopy
28 # import du chargeur de composants
29 from comploader import make_objecttreeitem
30 from Ihm import CONNECTOR
33 myrepr.maxstring = 100
38 """Abstract class representing tree items.
40 Methods should typically be overridden, otherwise a default action
44 # itemNode est une factory qui doit retourner un objet de la classe Node
45 # ou dérivé de cette classe.
46 # Le widget arbre utilisera cet objet comme noeud associé au tree item.
47 # Par defaut, utilise la classe Node de base
48 # La signature de la factory est la suivante :
49 # itemNode(treeOrNode,item,command,rmenu)
50 # ou treeOrNode est le noeud parent, item est l'item associé
51 # command est une fonction python appelée sur sélection graphique
52 # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
56 """Constructor. Do whatever you need to do."""
59 """Return text string to display."""
61 def GetLabelText(self):
62 """Return label text string to display in front of text (if any)."""
66 def _IsExpandable(self):
67 """Do not override! Called by TreeNode."""
68 if self.expandable is None:
69 self.expandable = self.IsExpandable()
70 return self.expandable
72 def IsExpandable(self):
73 """Return whether there are subitems."""
76 def _GetSubList(self):
77 """Do not override! Called by TreeNode."""
78 if not self.IsExpandable():
80 sublist = self.GetSubList()
86 """Return whether the item's text may be edited."""
88 def SetText(self, text):
89 """Change the item's text (if it is editable)."""
91 def GetIconName(self):
92 """Return name of icon to be displayed normally."""
94 def GetSelectedIconName(self):
95 """Return name of icon to be displayed when selected."""
98 """Return list of items forming sublist."""
100 def OnDoubleClick(self):
101 """Called on a double-click on the item."""
104 def __init__(self, delegate=None):
105 self.object = delegate
108 def setdelegate(self, delegate):
110 self.object = delegate
112 def getdelegate(self):
115 def __getattr__(self, name):
116 attr = getattr(self.object, name) # May raise AttributeError
117 setattr(self, name, attr)
118 self.__cache[name] = attr
121 def resetcache(self):
122 for key in self.__cache.keys():
125 except AttributeError:
129 def cachereport(self):
130 keys = self.__cache.keys()
135 class ObjectTreeItem(TreeItem,Delegate):
136 def __init__(self, appli, labeltext, object, setfunction=None):
137 self.labeltext = labeltext
139 # L'objet délegué est stocké dans l'attribut object
140 # L'objet associé à l'item est stocké dans l'attribut _object
141 # Il peut etre obtenu par appel à la méthode getObject
142 # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
143 # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
144 # et l'objet délégué est le MCFACT (object = _object.data[0])
145 Delegate.__init__(self,object)
146 # On cache l'objet initial (pour destruction eventuelle
148 self._object = object
149 self.setfunction = setfunction
160 def connect(self,channel,callable,args):
161 """ Connecte la fonction callable (avec arguments args) à l'item self sur le
164 CONNECTOR.Connect(self._object,channel,callable,args)
165 CONNECTOR.Connect(self.object, channel,callable,args)
169 Crée un item copie de self
171 object = self._object.copy()
172 appli = copy(self.appli)
173 labeltext = copy(self.labeltext)
174 fonction = deepcopy(self.setfunction)
175 item = make_objecttreeitem(appli,labeltext,object,fonction)
179 if hasattr(self.object,'actif'):
180 return self.object.actif
184 def update(self,item):
186 Met a jour l'item courant a partir d'un autre item passe en argument
187 Ne fait rien par defaut
191 def GetLabelText(self):
192 """ Retourne 3 valeurs :
193 - le texte à afficher dans le noeud représentant l'item
194 - la fonte dans laquelle afficher ce texte
195 - la couleur du texte
197 # None --> fonte et couleur par défaut
198 return self.labeltext,None,None
200 def get_nature(self) :
202 Retourne la nature de l'item et de l'objet
204 return self.object.nature
206 def get_regles(self):
207 """ retourne les règles de l'objet pointé par self """
208 return self.object.get_regles()
210 def get_liste_mc_presents(self):
211 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
212 return self.object.liste_mc_presents()
215 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
216 où celle-ci est un objet (ASSD) """
217 return self.object.getval()
219 def get_definition(self):
221 Retourne l'objet definition de l'objet pointé par self
223 return self.object.definition
225 def get_liste_mc_ordonnee(self,liste,dico):
226 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
227 d'une entité composée dont le chemin complet est donné sous forme
228 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
229 il faut encore réarranger cette liste (certains mots-clés déjà
230 présents ne doivent plus être proposés, règles ...)"""
231 return self.object.get_liste_mc_ordonnee(liste,dico)
233 def get_liste_mc_ordonnee_brute(self,liste,dico):
235 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
236 d'une entité composée dont le chemin complet est donné sous forme
237 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
239 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
241 def get_genealogie(self):
243 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
244 de l'objet pointé par self
246 return self.object.get_genealogie()
248 def get_index_child(self,nom_fils):
250 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
251 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
254 return self.object.get_index_child(nom_fils)
256 def get_index_child_old(self,nom_fils):
258 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
259 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
262 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
263 liste_noms_mc_presents = self.object.liste_mc_presents()
265 for nom in liste_noms_mc_ordonnee:
266 if nom in liste_noms_mc_presents or nom == nom_fils:
268 # l contient les anciens mots-clés + le nouveau dans l'ordre
269 return l.index(nom_fils)
271 def append_child(self,name,pos=None):
273 Permet d'ajouter un item fils à self
278 index = len(self.liste_mc_presents())
279 elif type(pos) == types.IntType :
280 # la position est fixée
282 elif type(pos) == types.InstanceType:
283 # pos est un item. Il faut inserer name apres pos
284 index = self.get_index(pos) +1
285 elif type(name) == types.InstanceType:
286 index = self.get_index_child(name.nom)
288 index = self.get_index_child(name)
289 return self.addobject(name,index)
291 def append_brother(self,name,pos='after'):
293 Permet d'ajouter un frère à self
294 par défaut on l'ajoute après self
296 index = self._object.parent.get_index(self.getObject())
302 print str(pos)," n'est pas un index valide pour append_brother"
304 return self.parent.addobject(name,index)
306 def get_nom_etape(self):
307 """Retourne le nom de self """
308 return self.object.get_nom_etape()
310 def get_copie_objet(self):
311 """ Retourne une copie de l'objet pointé par self """
312 return self.object.copy()
314 def get_position(self):
315 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
316 definition = self.get_definition()
318 return getattr(definition,'position')
319 except AttributeError:
323 """ Retourne le nom de l'objet pointé par self """
324 return self.object.nom
327 """ Retourne le jdc auquel appartient l'objet pointé par self """
328 return self.object.jdc
330 def get_valeur(self):
331 """ Retourne la valeur de l'objet pointé par self """
332 return self.object.valeur
335 """ Retourne le compte-rendu CR de self """
336 return self.object.report()
338 def get_objet_commentarise(self):
340 Cette méthode retourne un objet commentarisé
341 représentatif de self.object
342 --> à surcharger par les différents items
344 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
348 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
349 return self.object.isvalid()
351 def iscopiable(self):
353 Retourne 1 si l'objet est copiable, 0 sinon
354 Par défaut retourne 0
358 def get_mc_presents(self):
359 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
360 return self.object.dict_mc_presents()
362 def verif_condition_regles(self,l_mc_presents):
363 return self.object.verif_condition_regles(l_mc_presents)
366 """ Retourne le fr de l'objet pointé par self """
368 return self.object.get_fr()
373 """ Retourne la clé de doc de l'objet pointé par self """
374 return self.object.get_docu()
376 def set_valeur(self,new_valeur):
377 """ Remplace la valeur de l'objet pointé par self par new_valeur """
378 return self.object.set_valeur(new_valeur)
381 return myrepr.repr(self.object)
383 def GetIconName(self):
384 if not self.IsExpandable():
387 def IsEditable(self):
388 return self.setfunction is not None
390 def SetText(self, text):
393 self.setfunction(value)
396 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
397 # ca parait meme incorrect
399 # self.object = value
401 def IsExpandable(self):
404 def GetSubList(self):
405 keys = dir(self.object)
409 value = getattr(self.object, key)
410 except AttributeError:
412 item = make_objecttreeitem(
416 lambda value, key=key, object=self.object:
417 setattr(object, key, value))
421 def wait_fichier_init(self):
422 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
423 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
424 return self.object.definition.fichier_ini
426 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
428 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
429 de type item associé à l'object passé en argument.
431 return make_objecttreeitem(appli,labeltext,object,setfunction)
434 # print "__del__",self
436 class AtomicObjectTreeItem(ObjectTreeItem):
437 def IsExpandable(self):
440 class SequenceTreeItem(ObjectTreeItem):
441 def IsExpandable(self):
442 return len(self._object) > 0
445 return len(self._object)
448 return range(len(self._object))
450 def GetIconName(self):
451 if self._object.isvalid():
452 return "ast-green-los"
453 elif self._object.isoblig():
458 def ajout_possible(self):
459 return self._object.ajout_possible()
461 def get_index(self,child):
462 """ Retourne le numéro de child dans la liste des enfants de self """
463 return self._object.get_index(child.getObject())
468 def additem(self,obj,pos):
469 self._object.insert(pos,obj)
470 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
473 def suppitem(self,item):
475 self._object.remove(item.getObject())
476 # la liste peut être retournée vide !
477 message = "Mot-clé " + item.getObject().nom + " supprimé"
478 self.appli.affiche_infos(message)
483 def GetSubList(self):
484 isublist=iter(self.sublist)
485 liste=self._object.data
491 for item in isublist:
492 old_obj=item.getObject()
493 if old_obj in liste:break
496 if obj is old_obj:break
497 # nouvel objet : on cree un nouvel item
498 def setfunction(value, object=obj):
500 it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
501 self.sublist.append(it)
502 if old_obj is None and obj is None:break
503 if old_obj is obj: self.sublist.append(item)