1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
23 import types,string,os,glob,imp,sys
25 from copy import copy,deepcopy
28 myrepr.maxstring = 100
33 """Abstract class representing tree items.
35 Methods should typically be overridden, otherwise a default action
41 """Constructor. Do whatever you need to do."""
44 """Return text string to display."""
46 def GetLabelText(self):
47 """Return label text string to display in front of text (if any)."""
51 def _IsExpandable(self):
52 """Do not override! Called by TreeNode."""
53 if self.expandable is None:
54 self.expandable = self.IsExpandable()
55 return self.expandable
57 def IsExpandable(self):
58 """Return whether there are subitems."""
61 def _GetSubList(self):
62 """Do not override! Called by TreeNode."""
63 if not self.IsExpandable():
65 sublist = self.GetSubList()
71 """Return whether the item's text may be edited."""
73 def SetText(self, text):
74 """Change the item's text (if it is editable)."""
76 def GetIconName(self):
77 """Return name of icon to be displayed normally."""
79 def GetSelectedIconName(self):
80 """Return name of icon to be displayed when selected."""
83 """Return list of items forming sublist."""
85 def OnDoubleClick(self):
86 """Called on a double-click on the item."""
89 def __init__(self, delegate=None):
90 self.object = delegate
93 def setdelegate(self, delegate):
95 self.object = delegate
97 def getdelegate(self):
100 def __getattr__(self, name):
101 attr = getattr(self.object, name) # May raise AttributeError
102 setattr(self, name, attr)
103 self.__cache[name] = attr
106 def resetcache(self):
107 for key in self.__cache.keys():
110 except AttributeError:
114 def cachereport(self):
115 keys = self.__cache.keys()
120 class ObjectTreeItem(TreeItem,Delegate):
121 def __init__(self, appli, labeltext, object, setfunction=None):
122 self.labeltext = labeltext
124 Delegate.__init__(self,object)
125 #self.object = object
126 self.setfunction = setfunction
135 Crée un item copie de self
137 object = self.object.copy()
138 appli = copy(self.appli)
139 labeltext = copy(self.labeltext)
140 fonction = deepcopy(self.setfunction)
141 item = make_objecttreeitem(appli,labeltext,object,fonction)
145 if hasattr(self.object,'actif'):
146 return self.object.actif
150 def GetLabelText(self):
151 """ Retourne 3 valeurs :
152 - le texte à afficher dans le noeud représentant l'item
153 - la fonte dans laquelle afficher ce texte
154 - la couleur du texte
156 # None --> fonte et couleur par défaut
157 return self.labeltext,None,None
159 #def get_attribut(self,nom_attribut) :
161 # Retourne l'attribut de nom nom_attribut de l'objet sur lequel
162 # pointe self s'il existe, None sinon
164 # return self.object.get_attribut(nom_attribut)
166 def get_nature(self) :
168 Retourne la nature de l'item et de l'objet
170 return self.object.nature
172 def get_regles(self):
173 """ retourne les règles de l'objet pointé par self """
174 return self.object.get_regles()
176 def get_liste_mc_presents(self):
177 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
178 return self.object.liste_mc_presents()
181 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
182 où celle-ci est un objet (ASSD) """
183 return self.object.getval()
185 def get_definition(self):
187 Retourne l'objet definition de l'objet pointé par self
189 return self.object.definition
191 def get_liste_mc_ordonnee(self,liste,dico):
192 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
193 d'une entité composée dont le chemin complet est donné sous forme
194 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
195 il faut encore réarranger cette liste (certains mots-clés déjà
196 présents ne doivent plus être proposés, règles ...)"""
197 return self.object.get_liste_mc_ordonnee(liste,dico)
199 def get_liste_mc_ordonnee_brute(self,liste,dico):
201 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
202 d'une entité composée dont le chemin complet est donné sous forme
203 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
205 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
207 def get_genealogie(self):
209 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
210 de l'objet pointé par self
212 return self.object.get_genealogie()
214 def get_index_child(self,nom_fils):
216 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
217 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
220 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
221 liste_noms_mc_presents = self.object.liste_mc_presents()
223 for nom in liste_noms_mc_ordonnee:
224 if nom in liste_noms_mc_presents or nom == nom_fils:
226 # l contient les anciens mots-clés + le nouveau dans l'ordre
227 return l.index(nom_fils)
229 def get_nom_etape(self):
230 """Retourne le nom de self """
231 return self.object.get_nom_etape()
233 def get_copie_objet(self):
234 """ Retourne une copie de l'objet pointé par self """
235 return self.object.copy()
237 def get_position(self):
238 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
239 definition = self.get_definition()
241 return getattr(definition,'position')
242 except AttributeError:
246 """ Retourne le nom de l'objet pointé par self """
247 return self.object.nom
250 """ Retourne le jdc auquel appartient l'objet pointé par self """
251 return self.object.jdc
252 #return self.object.get_attribut('jdc')
254 def get_valeur(self):
255 """ Retourne la valeur de l'objet pointé par self """
256 return self.object.valeur
259 """ Retourne le compte-rendu CR de self """
260 return self.object.report()
262 def get_objet_commentarise(self):
264 Cette méthode retourne un objet commentarisé
265 représentatif de self.object
266 --> à surcharger par les différents items
268 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
272 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
273 return self.object.isvalid()
275 def iscopiable(self):
277 Retourne 1 si l'objet est copiable, 0 sinon
278 Par défaut retourne 0
283 """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
284 #if isinstance(self.object,MCList) :
285 if self.object.__class__.__name__ == 'MCList':
290 def isCommande(self):
292 Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
298 Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
304 Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
308 def get_mc_presents(self):
309 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
310 return self.object.dict_mc_presents()
312 def verif_condition_regles(self,l_mc_presents):
313 return self.object.verif_condition_regles(l_mc_presents)
316 """ Retourne le fr de l'objet pointé par self """
317 return self.object.get_fr()
320 """ Retourne la clé de doc de l'objet pointé par self """
321 return self.object.get_docu()
323 def set_valeur(self,new_valeur):
324 """ Remplace la valeur de l'objet pointé par self par new_valeur """
325 return self.object.set_valeur(new_valeur)
328 return myrepr.repr(self.object)
330 def GetIconName(self):
331 if not self.IsExpandable():
334 def IsEditable(self):
335 return self.setfunction is not None
337 def SetText(self, text):
340 self.setfunction(value)
343 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
344 # ca parait meme incorrect
346 # self.object = value
348 def IsExpandable(self):
351 def GetSubList(self):
352 keys = dir(self.object)
356 value = getattr(self.object, key)
357 except AttributeError:
359 item = make_objecttreeitem(
363 lambda value, key=key, object=self.object:
364 setattr(object, key, value))
368 def wait_fichier_init(self):
369 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
370 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
371 return self.object.definition.fichier_ini
373 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
375 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
376 de type item associé à l'object passé en argument.
378 c = gettreeitem(object)
379 return c(appli,labeltext, object, setfunction)
381 class AtomicObjectTreeItem(ObjectTreeItem):
382 def IsExpandable(self):
385 class SequenceTreeItem(ObjectTreeItem):
386 def IsExpandable(self):
387 return len(self.object) > 0
390 return len(self.object)
393 return range(len(self.object))
395 def GetIconName(self):
396 if self.object.isvalid():
397 return "ast-green-los"
398 elif self.object.isoblig():
403 def ajout_possible(self):
404 return self.object.ajout_possible()
406 def get_index(self,child):
407 """ Retourne le numéro de child dans la liste des enfants de self """
408 return self.object.get_index(child.object)
413 def additem(self,obj,pos):
414 # XXX Passer par addentite de MCList ???
415 self.object.insert(pos,obj)
416 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
419 def suppitem(self,item):
420 if not self.object.isMCList():return 1
422 self.object.remove(item.object)
423 # la liste peut être retournée vide !
424 message = "Mot-clé " + item.object.nom + " supprimé"
425 self.appli.affiche_infos(message)
430 def GetSubList(self):
432 for obj in self.object.data:
433 def setfunction(value, object=obj):
435 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
439 def gettreeitem(object):
441 Cette fonction retourne la classe item associée à l'objet object.
442 Cette classe item dépend bien sûr de la nature de object, d'où
443 l'interrogation du dictionnaire composants
445 if type(object) == types.InstanceType:
446 # On cherche d abord dans les composants (plugins)
448 return composants[object.__class__]
450 # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
451 for e in composants.keys():
452 if isinstance(object,e):return composants[e]
453 # On n'a rien trouve dans les composants
454 return ObjectTreeItem
456 def charger_composants():
458 Cette fonction a pour but de charger tous les modules composants graphiques
459 (fichiers compo*.py dans le même répertoire que ce module )
460 et de remplir le dictionnaire composants utilisé par make_objecttreeitem
463 repertoire=os.path.dirname(__file__)
464 listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
465 for fichier in listfich:
466 m= os.path.basename(fichier)[:-3]
467 module=__import__(m,globals(),locals())
468 composants[module.objet]=module.treeitem
471 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
473 Cette fonction permet de construire et de retourner un objet
474 de type item associé à l'object passé en argument.
476 c = gettreeitem(object)
477 return c(appli,labeltext, object, setfunction)
479 # Dictionnaire {object : item} permettant d'associer un item à un object
480 # Ce dictionnaire est renseigné par la méthode charger_composants
481 composants = charger_composants()