Salome HOME
Fiche ay_comment
[tools/eficas.git] / Editeur / Objecttreeitem.py
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.
8 #
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.
13 #
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.
17 #
18 #
19 # ======================================================================
20 """
21 """
22 # import généraux
23 import types,string,os,glob,imp,sys
24 from repr import Repr
25 from copy import copy,deepcopy
26
27 myrepr = Repr()
28 myrepr.maxstring = 100
29 myrepr.maxother = 100
30
31 class TreeItem:
32
33     """Abstract class representing tree items.
34
35     Methods should typically be overridden, otherwise a default action
36     is used.
37
38     """
39
40     def __init__(self):
41         """Constructor.  Do whatever you need to do."""
42
43     def GetText(self):
44         """Return text string to display."""
45
46     def GetLabelText(self):
47         """Return label text string to display in front of text (if any)."""
48
49     expandable = None
50
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
56
57     def IsExpandable(self):
58         """Return whether there are subitems."""
59         return 1
60
61     def _GetSubList(self):
62         """Do not override!  Called by TreeNode."""
63         if not self.IsExpandable():
64             return []
65         sublist = self.GetSubList()
66         if not sublist:
67             self.expandable = 0
68         return sublist
69
70     def IsEditable(self):
71         """Return whether the item's text may be edited."""
72
73     def SetText(self, text):
74         """Change the item's text (if it is editable)."""
75
76     def GetIconName(self):
77         """Return name of icon to be displayed normally."""
78
79     def GetSelectedIconName(self):
80         """Return name of icon to be displayed when selected."""
81
82     def GetSubList(self):
83         """Return list of items forming sublist."""
84
85     def OnDoubleClick(self):
86         """Called on a double-click on the item."""
87
88 class Delegate:
89     def __init__(self, delegate=None):
90         self.object = delegate
91         self.__cache = {}
92
93     def setdelegate(self, delegate):
94         self.resetcache()
95         self.object = delegate
96
97     def getdelegate(self):
98         return self.object
99
100     def __getattr__(self, name):
101         attr = getattr(self.object, name) # May raise AttributeError
102         setattr(self, name, attr)
103         self.__cache[name] = attr
104         return attr
105
106     def resetcache(self):
107         for key in self.__cache.keys():
108             try:
109                 delattr(self, key)
110             except AttributeError:
111                 pass
112         self.__cache.clear()
113
114     def cachereport(self):
115         keys = self.__cache.keys()
116         keys.sort()
117         print keys
118
119
120 class ObjectTreeItem(TreeItem,Delegate):
121     def __init__(self, appli, labeltext, object, setfunction=None):
122         self.labeltext = labeltext
123         self.appli = appli
124         Delegate.__init__(self,object)
125         #self.object = object
126         self.setfunction = setfunction
127         self.expandable = 1
128         self.init()
129
130     def init(self):
131         return
132
133     def copy(self):
134         """
135         Crée un item copie de self
136         """
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)
142         return item
143     
144     def isactif(self):
145         if hasattr(self.object,'actif'):
146             return self.object.actif
147         else:
148             return 1
149     
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
155         """
156         # None --> fonte et couleur par défaut
157         return self.labeltext,None,None
158
159     #def get_attribut(self,nom_attribut) :
160     #    """ 
161     #       Retourne l'attribut de nom nom_attribut de l'objet sur lequel
162     #       pointe self s'il existe, None sinon
163     #    """
164     #    return self.object.get_attribut(nom_attribut)
165
166     def get_nature(self) :
167         """ 
168             Retourne la nature de l'item et de l'objet
169         """ 
170         return self.object.nature
171
172     def get_regles(self):
173         """ retourne les règles de l'objet pointé par self """
174         return self.object.get_regles()
175     
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()
179     
180     def get_val(self):
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()
184     
185     def get_definition(self):
186         """ 
187            Retourne l'objet definition de l'objet pointé par self 
188         """
189         return self.object.definition
190
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)
198
199     def get_liste_mc_ordonnee_brute(self,liste,dico):
200         """
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 + ...
204         """
205         return self.object.get_liste_mc_ordonnee_brute(liste,dico)
206    
207     def get_genealogie(self):
208         """
209         Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
210         de l'objet pointé par self
211         """
212         return self.object.get_genealogie()
213
214     def get_index_child(self,nom_fils):
215         """
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
218         le nouveau mot-clé
219         """
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()
222         l=[]
223         for nom in liste_noms_mc_ordonnee:
224             if nom in liste_noms_mc_presents or nom == nom_fils:
225                 l.append(nom)
226         # l contient les anciens mots-clés + le nouveau dans l'ordre
227         return l.index(nom_fils)
228         
229     def get_nom_etape(self):
230         """Retourne le nom de self """
231         return self.object.get_nom_etape()
232
233     def get_copie_objet(self):
234         """ Retourne une copie de l'objet pointé par self """
235         return self.object.copy()
236     
237     def get_position(self):
238         """ Retourne la valeur de l'attribut position de l'objet pointé par self """
239         definition = self.get_definition()
240         try:
241             return getattr(definition,'position')
242         except AttributeError:
243             return 'local'
244         
245     def get_nom(self):
246         """ Retourne le nom de l'objet pointé par self """
247         return self.object.nom
248
249     def get_jdc(self):
250         """ Retourne le jdc auquel appartient l'objet pointé par self """
251         return self.object.jdc
252         #return self.object.get_attribut('jdc')
253     
254     def get_valeur(self):
255         """ Retourne la valeur de l'objet pointé par self """
256         return self.object.valeur
257
258     def get_cr(self):
259         """ Retourne le compte-rendu CR de self """
260         return self.object.report()
261
262     def get_objet_commentarise(self):
263         """
264         Cette méthode retourne un objet commentarisé
265         représentatif de self.object
266         --> à surcharger par les différents items
267         """
268         raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
269         pass
270         
271     def isvalid(self):
272         """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
273         return self.object.isvalid()
274
275     def iscopiable(self):
276         """
277         Retourne 1 si l'objet est copiable, 0 sinon
278         Par défaut retourne 0
279         """
280         return 0
281     
282     def isMCList(self):
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':
286             return 1
287         else :
288             return 0
289
290     def isCommande(self):
291         """
292         Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
293         """
294         return 0
295
296     def isJdc(self):
297         """
298         Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
299         """
300         return 0
301
302     def isMCFact(self):
303         """
304         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
305         """
306         return 0
307     
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()
311
312     def verif_condition_regles(self,l_mc_presents):
313         return self.object.verif_condition_regles(l_mc_presents)
314
315     def get_fr(self):
316         """ Retourne le fr de l'objet pointé par self """
317         return self.object.get_fr()
318
319     def get_docu(self):
320         """ Retourne la clé de doc de l'objet pointé par self """
321         return self.object.get_docu()
322
323     def set_valeur(self,new_valeur,evaluation='oui'):
324         """ Remplace la valeur de l'objet pointé par self par new_valeur """
325         return self.object.set_valeur(new_valeur,evaluation=evaluation)
326         
327     def GetText(self):
328         return myrepr.repr(self.object)
329     
330     def GetIconName(self):
331         if not self.IsExpandable():
332             return "python"
333
334     def IsEditable(self):
335         return self.setfunction is not None
336
337     def SetText(self, text):
338         try:
339             value = eval(text)
340             self.setfunction(value)
341         except:
342             pass
343 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
344 # ca parait meme incorrect
345       #  else:
346       #      self.object = value
347
348     def IsExpandable(self):
349         return 1
350         
351     def GetSubList(self):
352         keys = dir(self.object)
353         sublist = []
354         for key in keys:
355             try:
356                 value = getattr(self.object, key)
357             except AttributeError:
358                 continue
359             item = make_objecttreeitem(
360                 self.appli,
361                 str(key) + " =",
362                 value,
363                 lambda value, key=key, object=self.object:
364                     setattr(object, key, value))
365             sublist.append(item)
366         return sublist
367
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
372
373     def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
374         """
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.
377         """
378         c = gettreeitem(object)
379         return c(appli,labeltext, object, setfunction)
380
381 class AtomicObjectTreeItem(ObjectTreeItem):
382     def IsExpandable(self):
383         return 0
384
385 class SequenceTreeItem(ObjectTreeItem):
386     def IsExpandable(self):
387         return len(self.object) > 0
388
389     def __len__(self) :
390         return len(self.object)
391    
392     def keys(self):
393         return range(len(self.object))
394
395     def GetIconName(self):
396         if self.object.isvalid():
397           return "ast-green-los"
398         elif self.object.isoblig():
399           return "ast-red-los"
400         else:
401           return "ast-yel-los"
402
403     def ajout_possible(self):
404         return self.object.ajout_possible()
405
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)
409
410     def GetText(self):
411       return  "    "
412
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)
417         return item
418
419     def suppitem(self,item):
420         if not self.object.isMCList():return 1
421         try :
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)
426             return 1
427         except:
428             return 0
429
430     def GetSubList(self):
431         sublist = []
432         for obj in self.object.data:
433             def setfunction(value, object=obj):
434                 object = value
435             item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
436             sublist.append(item)
437         return sublist
438
439 def gettreeitem(object):
440     """
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
444     """
445     if type(object) == types.InstanceType:
446       # On cherche d abord dans les composants (plugins)
447       try:
448         return composants[object.__class__]
449       except:
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
455
456 def charger_composants():
457     """
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
461     """
462     composants={}
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
469     return composants
470
471 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
472     """
473        Cette fonction permet de construire et de retourner un objet
474        de type item associé à l'object passé en argument.
475     """
476     c = gettreeitem(object)
477     return c(appli,labeltext, object, setfunction)
478
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()
482