Salome HOME
3a4d23b3caae94695de8b842536e4b7fa41a2ed1
[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         pass
269         
270     def isvalid(self):
271         """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
272         return self.object.isvalid()
273
274     def iscopiable(self):
275         """
276         Retourne 1 si l'objet est copiable, 0 sinon
277         Par défaut retourne 0
278         """
279         return 0
280     
281     def isMCList(self):
282         """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
283         #if isinstance(self.object,MCList) :
284         if self.object.__class__.__name__ == 'MCList':
285             return 1
286         else :
287             return 0
288
289     def isCommande(self):
290         """
291         Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
292         """
293         return 0
294
295     def isJdc(self):
296         """
297         Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
298         """
299         return 0
300
301     def isMCFact(self):
302         """
303         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
304         """
305         return 0
306     
307     def get_mc_presents(self):
308         """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
309         return self.object.dict_mc_presents()
310
311     def verif_condition_regles(self,l_mc_presents):
312         return self.object.verif_condition_regles(l_mc_presents)
313
314     def get_fr(self):
315         """ Retourne le fr de l'objet pointé par self """
316         try:
317            return self.object.get_fr()
318         except:
319            return ''
320
321     def get_docu(self):
322         """ Retourne la clé de doc de l'objet pointé par self """
323         return self.object.get_docu()
324
325     def set_valeur(self,new_valeur,evaluation='oui'):
326         """ Remplace la valeur de l'objet pointé par self par new_valeur """
327         return self.object.set_valeur(new_valeur,evaluation=evaluation)
328         
329     def GetText(self):
330         return myrepr.repr(self.object)
331     
332     def GetIconName(self):
333         if not self.IsExpandable():
334             return "python"
335
336     def IsEditable(self):
337         return self.setfunction is not None
338
339     def SetText(self, text):
340         try:
341             value = eval(text)
342             self.setfunction(value)
343         except:
344             pass
345 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
346 # ca parait meme incorrect
347       #  else:
348       #      self.object = value
349
350     def IsExpandable(self):
351         return 1
352         
353     def GetSubList(self):
354         keys = dir(self.object)
355         sublist = []
356         for key in keys:
357             try:
358                 value = getattr(self.object, key)
359             except AttributeError:
360                 continue
361             item = make_objecttreeitem(
362                 self.appli,
363                 str(key) + " =",
364                 value,
365                 lambda value, key=key, object=self.object:
366                     setattr(object, key, value))
367             sublist.append(item)
368         return sublist
369
370     def wait_fichier_init(self):
371         """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
372         (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
373         return self.object.definition.fichier_ini
374
375     def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
376         """
377            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
378            de type item associé à l'object passé en argument.
379         """
380         c = gettreeitem(object)
381         return c(appli,labeltext, object, setfunction)
382
383 class AtomicObjectTreeItem(ObjectTreeItem):
384     def IsExpandable(self):
385         return 0
386
387 class SequenceTreeItem(ObjectTreeItem):
388     def IsExpandable(self):
389         return len(self.object) > 0
390
391     def __len__(self) :
392         return len(self.object)
393    
394     def keys(self):
395         return range(len(self.object))
396
397     def GetIconName(self):
398         if self.object.isvalid():
399           return "ast-green-los"
400         elif self.object.isoblig():
401           return "ast-red-los"
402         else:
403           return "ast-yel-los"
404
405     def ajout_possible(self):
406         return self.object.ajout_possible()
407
408     def get_index(self,child):
409         """ Retourne le numéro de child dans la liste des enfants de self """
410         return self.object.get_index(child.object)
411
412     def GetText(self):
413       return  "    "
414
415     def additem(self,obj,pos):
416         # XXX Passer par addentite  de MCList ???
417         self.object.insert(pos,obj)
418         item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
419         return item
420
421     def suppitem(self,item):
422         if not self.object.isMCList():return 1
423         try :
424             self.object.remove(item.object)
425             # la liste peut être retournée vide !
426             message = "Mot-clé " + item.object.nom + " supprimé"
427             self.appli.affiche_infos(message)
428             return 1
429         except:
430             return 0
431
432     def GetSubList(self):
433         sublist = []
434         for obj in self.object.data:
435             def setfunction(value, object=obj):
436                 object = value
437             item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
438             sublist.append(item)
439         return sublist
440
441 def gettreeitem(object):
442     """
443        Cette fonction retourne la classe item associée à l'objet object.
444        Cette classe item dépend bien sûr de la nature de object, d'où
445        l'interrogation du dictionnaire composants
446     """
447     if type(object) == types.InstanceType:
448       # On cherche d abord dans les composants (plugins)
449       try:
450         return composants[object.__class__]
451       except:
452         # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
453         for e in composants.keys():
454           if isinstance(object,e):return composants[e]
455     # On n'a rien trouve dans les composants
456     return ObjectTreeItem
457
458 def charger_composants():
459     """
460         Cette fonction a pour but de charger tous les modules composants graphiques
461         (fichiers compo*.py dans le même répertoire que ce module )
462         et de remplir le dictionnaire composants utilisé par make_objecttreeitem
463     """
464     composants={}
465     repertoire=os.path.dirname(__file__)
466     listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
467     for fichier in listfich:
468         m= os.path.basename(fichier)[:-3]
469         module=__import__(m,globals(),locals())
470         composants[module.objet]=module.treeitem
471     return composants
472
473 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
474     """
475        Cette fonction permet de construire et de retourner un objet
476        de type item associé à l'object passé en argument.
477     """
478     c = gettreeitem(object)
479     return c(appli,labeltext, object, setfunction)
480
481 # Dictionnaire {object : item} permettant d'associer un item à un object
482 # Ce dictionnaire est renseigné par la méthode charger_composants 
483 composants = charger_composants()
484