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 gettreeitem,make_objecttreeitem
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
53 itemNode=treewidget.Node
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
162 Crée un item copie de self
164 object = self._object.copy()
165 appli = copy(self.appli)
166 labeltext = copy(self.labeltext)
167 fonction = deepcopy(self.setfunction)
168 item = make_objecttreeitem(appli,labeltext,object,fonction)
172 if hasattr(self.object,'actif'):
173 return self.object.actif
177 def update(self,item):
179 Met a jour l'item courant a partir d'un autre item passe en argument
180 Ne fait rien par defaut
184 def GetLabelText(self):
185 """ Retourne 3 valeurs :
186 - le texte à afficher dans le noeud représentant l'item
187 - la fonte dans laquelle afficher ce texte
188 - la couleur du texte
190 # None --> fonte et couleur par défaut
191 return self.labeltext,None,None
193 def get_nature(self) :
195 Retourne la nature de l'item et de l'objet
197 return self.object.nature
199 def get_regles(self):
200 """ retourne les règles de l'objet pointé par self """
201 return self.object.get_regles()
203 def get_liste_mc_presents(self):
204 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
205 return self.object.liste_mc_presents()
208 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
209 où celle-ci est un objet (ASSD) """
210 return self.object.getval()
212 def get_definition(self):
214 Retourne l'objet definition de l'objet pointé par self
216 return self.object.definition
218 def get_liste_mc_ordonnee(self,liste,dico):
219 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
220 d'une entité composée dont le chemin complet est donné sous forme
221 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
222 il faut encore réarranger cette liste (certains mots-clés déjà
223 présents ne doivent plus être proposés, règles ...)"""
224 return self.object.get_liste_mc_ordonnee(liste,dico)
226 def get_liste_mc_ordonnee_brute(self,liste,dico):
228 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
229 d'une entité composée dont le chemin complet est donné sous forme
230 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
232 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
234 def get_genealogie(self):
236 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
237 de l'objet pointé par self
239 return self.object.get_genealogie()
241 def get_index_child(self,nom_fils):
243 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
244 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
247 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
248 liste_noms_mc_presents = self.object.liste_mc_presents()
250 for nom in liste_noms_mc_ordonnee:
251 if nom in liste_noms_mc_presents or nom == nom_fils:
253 # l contient les anciens mots-clés + le nouveau dans l'ordre
254 return l.index(nom_fils)
256 def append_child(self,name,pos=None):
258 Permet d'ajouter un item fils à self
263 index = len(self.liste_mc_presents())
264 elif type(pos) == types.IntType :
265 # la position est fixée
267 elif type(pos) == types.InstanceType:
268 # pos est un item. Il faut inserer name apres pos
269 index = self.get_index(pos) +1
270 elif type(name) == types.InstanceType:
271 index = self.get_index_child(name.nom)
273 index = self.get_index_child(name)
274 return self.addobject(name,index)
276 def append_brother(self,name,pos='after'):
278 Permet d'ajouter un frère à self
279 par défaut on l'ajoute après self
281 index = self._object.parent.get_index(self.getObject())
287 print str(pos)," n'est pas un index valide pour append_brother"
289 return self.parent.addobject(name,index)
291 def get_nom_etape(self):
292 """Retourne le nom de self """
293 return self.object.get_nom_etape()
295 def get_copie_objet(self):
296 """ Retourne une copie de l'objet pointé par self """
297 return self.object.copy()
299 def get_position(self):
300 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
301 definition = self.get_definition()
303 return getattr(definition,'position')
304 except AttributeError:
308 """ Retourne le nom de l'objet pointé par self """
309 return self.object.nom
312 """ Retourne le jdc auquel appartient l'objet pointé par self """
313 return self.object.jdc
315 def get_valeur(self):
316 """ Retourne la valeur de l'objet pointé par self """
317 return self.object.valeur
320 """ Retourne le compte-rendu CR de self """
321 return self.object.report()
323 def get_objet_commentarise(self):
325 Cette méthode retourne un objet commentarisé
326 représentatif de self.object
327 --> à surcharger par les différents items
329 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
333 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
334 return self.object.isvalid()
336 def iscopiable(self):
338 Retourne 1 si l'objet est copiable, 0 sinon
339 Par défaut retourne 0
343 def get_mc_presents(self):
344 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
345 return self.object.dict_mc_presents()
347 def verif_condition_regles(self,l_mc_presents):
348 return self.object.verif_condition_regles(l_mc_presents)
351 """ Retourne le fr de l'objet pointé par self """
352 return self.object.get_fr()
355 """ Retourne la clé de doc de l'objet pointé par self """
356 return self.object.get_docu()
358 def set_valeur(self,new_valeur):
359 """ Remplace la valeur de l'objet pointé par self par new_valeur """
360 return self.object.set_valeur(new_valeur)
363 return myrepr.repr(self.object)
365 def GetIconName(self):
366 if not self.IsExpandable():
369 def IsEditable(self):
370 return self.setfunction is not None
372 def SetText(self, text):
375 self.setfunction(value)
378 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
379 # ca parait meme incorrect
381 # self.object = value
383 def IsExpandable(self):
386 def GetSubList(self):
387 keys = dir(self.object)
391 value = getattr(self.object, key)
392 except AttributeError:
394 item = make_objecttreeitem(
398 lambda value, key=key, object=self.object:
399 setattr(object, key, value))
403 def wait_fichier_init(self):
404 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
405 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
406 return self.object.definition.fichier_ini
408 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
410 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
411 de type item associé à l'object passé en argument.
413 c = gettreeitem(object)
414 return c(appli,labeltext, object, setfunction)
416 class AtomicObjectTreeItem(ObjectTreeItem):
417 def IsExpandable(self):
420 class SequenceTreeItem(ObjectTreeItem):
421 def IsExpandable(self):
422 return len(self._object) > 0
425 return len(self._object)
428 return range(len(self._object))
430 def GetIconName(self):
431 if self._object.isvalid():
432 return "ast-green-los"
433 elif self._object.isoblig():
438 def ajout_possible(self):
439 return self._object.ajout_possible()
441 def get_index(self,child):
442 """ Retourne le numéro de child dans la liste des enfants de self """
443 return self._object.get_index(child.getObject())
448 def additem(self,obj,pos):
449 self._object.insert(pos,obj)
450 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
453 def suppitem(self,item):
455 self._object.remove(item.getObject())
456 # la liste peut être retournée vide !
457 message = "Mot-clé " + item.getObject().nom + " supprimé"
458 self.appli.affiche_infos(message)
463 def GetSubList(self):
464 isublist=iter(self.sublist)
465 liste=self._object.data
471 for item in isublist:
472 old_obj=item.getObject()
473 if old_obj in liste:break
476 if obj is old_obj:break
477 # nouvel objet : on cree un nouvel item
478 def setfunction(value, object=obj):
480 it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
481 self.sublist.append(it)
482 if old_obj is None and obj is None:break
483 if old_obj is obj: self.sublist.append(item)
486 def GetSubList_BAK(self):
489 for obj in self._object.data:
490 def setfunction(value, object=obj):
492 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)