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
29 myrepr.maxstring = 100
34 """Abstract class representing tree items.
36 Methods should typically be overridden, otherwise a default action
42 """Constructor. Do whatever you need to do."""
45 """Return text string to display."""
47 def GetLabelText(self):
48 """Return label text string to display in front of text (if any)."""
52 def _IsExpandable(self):
53 """Do not override! Called by TreeNode."""
54 if self.expandable is None:
55 self.expandable = self.IsExpandable()
56 return self.expandable
58 def IsExpandable(self):
59 """Return whether there are subitems."""
62 def _GetSubList(self):
63 """Do not override! Called by TreeNode."""
64 if not self.IsExpandable():
66 sublist = self.GetSubList()
72 """Return whether the item's text may be edited."""
74 def SetText(self, text):
75 """Change the item's text (if it is editable)."""
77 def GetIconName(self):
78 """Return name of icon to be displayed normally."""
80 def GetSelectedIconName(self):
81 """Return name of icon to be displayed when selected."""
84 """Return list of items forming sublist."""
86 def OnDoubleClick(self):
87 """Called on a double-click on the item."""
90 def __init__(self, delegate=None):
91 self.object = delegate
94 def setdelegate(self, delegate):
96 self.object = delegate
98 def getdelegate(self):
101 def __getattr__(self, name):
102 attr = getattr(self.object, name) # May raise AttributeError
103 setattr(self, name, attr)
104 self.__cache[name] = attr
107 def resetcache(self):
108 for key in self.__cache.keys():
111 except AttributeError:
115 def cachereport(self):
116 keys = self.__cache.keys()
121 class ObjectTreeItem(TreeItem,Delegate):
122 def __init__(self, appli, labeltext, object, setfunction=None):
123 self.labeltext = labeltext
125 Delegate.__init__(self,object)
126 #self.object = object
127 self.setfunction = setfunction
136 Crée un item copie de self
138 object = self.object.copy()
139 appli = copy(self.appli)
140 labeltext = copy(self.labeltext)
141 fonction = deepcopy(self.setfunction)
142 item = make_objecttreeitem(appli,labeltext,object,fonction)
146 if hasattr(self.object,'actif'):
147 return self.object.actif
151 def GetLabelText(self):
152 """ Retourne 3 valeurs :
153 - le texte à afficher dans le noeud représentant l'item
154 - la fonte dans laquelle afficher ce texte
155 - la couleur du texte
157 # None --> fonte et couleur par défaut
158 return self.labeltext,None,None
160 #def get_attribut(self,nom_attribut) :
162 # Retourne l'attribut de nom nom_attribut de l'objet sur lequel
163 # pointe self s'il existe, None sinon
165 # return self.object.get_attribut(nom_attribut)
167 def get_nature(self) :
169 Retourne la nature de l'item et de l'objet
171 return self.object.nature
173 def get_regles(self):
174 """ retourne les règles de l'objet pointé par self """
175 return self.object.get_regles()
177 def get_liste_mc_presents(self):
178 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
179 return self.object.liste_mc_presents()
182 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
183 où celle-ci est un objet (ASSD) """
184 return self.object.getval()
186 def get_definition(self):
188 Retourne l'objet definition de l'objet pointé par self
190 return self.object.definition
192 def get_liste_mc_ordonnee(self,liste,dico):
193 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
194 d'une entité composée dont le chemin complet est donné sous forme
195 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
196 il faut encore réarranger cette liste (certains mots-clés déjà
197 présents ne doivent plus être proposés, règles ...)"""
198 return self.object.get_liste_mc_ordonnee(liste,dico)
200 def get_liste_mc_ordonnee_brute(self,liste,dico):
202 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
203 d'une entité composée dont le chemin complet est donné sous forme
204 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
206 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
208 def get_genealogie(self):
210 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
211 de l'objet pointé par self
213 return self.object.get_genealogie()
215 def get_index_child(self,nom_fils):
217 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
218 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
221 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
222 liste_noms_mc_presents = self.object.liste_mc_presents()
224 for nom in liste_noms_mc_ordonnee:
225 if nom in liste_noms_mc_presents or nom == nom_fils:
227 # l contient les anciens mots-clés + le nouveau dans l'ordre
228 return l.index(nom_fils)
230 def get_nom_etape(self):
231 """Retourne le nom de self """
232 return self.object.get_nom_etape()
234 def get_copie_objet(self):
235 """ Retourne une copie de l'objet pointé par self """
236 return self.object.copy()
238 def get_position(self):
239 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
240 definition = self.get_definition()
242 return getattr(definition,'position')
243 except AttributeError:
247 """ Retourne le nom de l'objet pointé par self """
248 return self.object.nom
251 """ Retourne le jdc auquel appartient l'objet pointé par self """
252 return self.object.jdc
253 #return self.object.get_attribut('jdc')
255 def get_valeur(self):
256 """ Retourne la valeur de l'objet pointé par self """
257 return self.object.valeur
260 """ Retourne le compte-rendu CR de self """
261 return self.object.report()
263 def get_objet_commentarise(self):
265 Cette méthode retourne un objet commentarisé
266 représentatif de self.object
267 --> à surcharger par les différents items
269 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
273 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
274 return self.object.isvalid()
276 def iscopiable(self):
278 Retourne 1 si l'objet est copiable, 0 sinon
279 Par défaut retourne 0
284 """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
285 #if isinstance(self.object,MCList) :
286 if self.object.__class__.__name__ == 'MCList':
291 def isCommande(self):
293 Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
299 Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
305 Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
309 def get_mc_presents(self):
310 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
311 return self.object.dict_mc_presents()
313 def verif_condition_regles(self,l_mc_presents):
314 return self.object.verif_condition_regles(l_mc_presents)
317 """ Retourne le fr de l'objet pointé par self """
318 return self.object.get_fr()
321 """ Retourne la clé de doc de l'objet pointé par self """
322 return self.object.get_docu()
324 def set_valeur(self,new_valeur):
325 """ Remplace la valeur de l'objet pointé par self par new_valeur """
326 return self.object.set_valeur(new_valeur)
329 return myrepr.repr(self.object)
331 def GetIconName(self):
332 if not self.IsExpandable():
335 def IsEditable(self):
336 return self.setfunction is not None
338 def SetText(self, text):
341 self.setfunction(value)
344 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
345 # ca parait meme incorrect
347 # self.object = value
349 def IsExpandable(self):
352 def GetSubList(self):
353 keys = dir(self.object)
357 value = getattr(self.object, key)
358 except AttributeError:
360 item = make_objecttreeitem(
364 lambda value, key=key, object=self.object:
365 setattr(object, key, value))
369 def wait_fichier_init(self):
370 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
371 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
372 return self.object.definition.fichier_ini
374 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
376 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
377 de type item associé à l'object passé en argument.
379 c = gettreeitem(object)
380 return c(appli,labeltext, object, setfunction)
382 class AtomicObjectTreeItem(ObjectTreeItem):
383 def IsExpandable(self):
386 class SequenceTreeItem(ObjectTreeItem):
387 def IsExpandable(self):
388 return len(self.object) > 0
391 return len(self.object)
394 return range(len(self.object))
396 def GetIconName(self):
397 if self.object.isvalid():
398 return "ast-green-los"
399 elif self.object.isoblig():
404 def ajout_possible(self):
405 return self.object.ajout_possible()
407 def get_index(self,child):
408 """ Retourne le numéro de child dans la liste des enfants de self """
409 return self.object.get_index(child.object)
414 def additem(self,obj,pos):
415 # XXX Passer par addentite de MCList ???
416 self.object.insert(pos,obj)
417 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
420 def suppitem(self,item):
421 if not self.object.isMCList():return 1
423 self.object.remove(item.object)
424 # la liste peut être retournée vide !
425 message = "Mot-clé " + item.object.nom + " supprimé"
426 self.appli.affiche_infos(message)
431 def GetSubList(self):
433 for obj in self.object.data:
434 def setfunction(value, object=obj):
436 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
440 def gettreeitem(object):
442 Cette fonction retourne la classe item associée à l'objet object.
443 Cette classe item dépend bien sûr de la nature de object, d'où
444 l'interrogation du dictionnaire composants
446 if type(object) == types.InstanceType:
447 # On cherche d abord dans les composants (plugins)
449 return composants[object.__class__]
451 # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
452 for e in composants.keys():
453 if isinstance(object,e):return composants[e]
454 # On n'a rien trouve dans les composants
455 return ObjectTreeItem
457 def charger_composants():
459 Cette fonction a pour but de charger tous les modules composants graphiques
460 (fichiers compo*.py dans le même répertoire que ce module )
461 et de remplir le dictionnaire composants utilisé par make_objecttreeitem
464 repertoire=os.path.dirname(__file__)
465 listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
466 for fichier in listfich:
467 m= os.path.basename(fichier)[:-3]
468 module=__import__(m,globals(),locals())
469 composants[module.objet]=module.treeitem
472 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
474 Cette fonction permet de construire et de retourner un objet
475 de type item associé à l'object passé en argument.
477 c = gettreeitem(object)
478 return c(appli,labeltext, object, setfunction)
480 # Dictionnaire {object : item} permettant d'associer un item à un object
481 # Ce dictionnaire est renseigné par la méthode charger_composants
482 composants = charger_composants()