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