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