Salome HOME
PN : pour afficher correctement les arguments de la formule nouvelle.
[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 # import du chargeur de composants
29 from comploader import gettreeitem,make_objecttreeitem
30 import treewidget
31
32 myrepr = Repr()
33 myrepr.maxstring = 100
34 myrepr.maxother = 100
35
36 class TreeItem:
37
38     """Abstract class representing tree items.
39
40     Methods should typically be overridden, otherwise a default action
41     is used.
42
43     """
44     # itemNode est une factory qui doit retourner un objet de la classe Node
45     # ou dérivé de cette classe.
46     # Le widget arbre utilisera cet objet comme noeud associé au tree item.
47     # Par defaut, utilise la classe Node de base
48     # La signature de la factory est la suivante :
49     # itemNode(treeOrNode,item,command,rmenu)
50     # ou treeOrNode est le noeud parent, item est l'item associé
51     # command est une fonction python appelée sur sélection graphique
52     # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
53     itemNode=treewidget.Node
54
55     def __init__(self):
56         """Constructor.  Do whatever you need to do."""
57
58     def GetText(self):
59         """Return text string to display."""
60
61     def GetLabelText(self):
62         """Return label text string to display in front of text (if any)."""
63
64     expandable = None
65
66     def _IsExpandable(self):
67         """Do not override!  Called by TreeNode."""
68         if self.expandable is None:
69             self.expandable = self.IsExpandable()
70         return self.expandable
71
72     def IsExpandable(self):
73         """Return whether there are subitems."""
74         return 1
75
76     def _GetSubList(self):
77         """Do not override!  Called by TreeNode."""
78         if not self.IsExpandable():
79             return []
80         sublist = self.GetSubList()
81         if not sublist:
82             self.expandable = 0
83         return sublist
84
85     def IsEditable(self):
86         """Return whether the item's text may be edited."""
87
88     def SetText(self, text):
89         """Change the item's text (if it is editable)."""
90
91     def GetIconName(self):
92         """Return name of icon to be displayed normally."""
93
94     def GetSelectedIconName(self):
95         """Return name of icon to be displayed when selected."""
96
97     def GetSubList(self):
98         """Return list of items forming sublist."""
99
100     def OnDoubleClick(self):
101         """Called on a double-click on the item."""
102
103 class Delegate:
104     def __init__(self, delegate=None):
105         self.object = delegate
106         self.__cache = {}
107
108     def setdelegate(self, delegate):
109         self.resetcache()
110         self.object = delegate
111
112     def getdelegate(self):
113         return self.object
114
115     def __getattr__(self, name):
116         attr = getattr(self.object, name) # May raise AttributeError
117         setattr(self, name, attr)
118         self.__cache[name] = attr
119         return attr
120
121     def resetcache(self):
122         for key in self.__cache.keys():
123             try:
124                 delattr(self, key)
125             except AttributeError:
126                 pass
127         self.__cache.clear()
128
129     def cachereport(self):
130         keys = self.__cache.keys()
131         keys.sort()
132         print keys
133
134
135 class ObjectTreeItem(TreeItem,Delegate):
136     def __init__(self, appli, labeltext, object, setfunction=None):
137         self.labeltext = labeltext
138         self.appli = appli
139         Delegate.__init__(self,object)
140         # On cache l'objet initial (pour destruction eventuelle
141         # ultérieure)
142         self._object = object
143         self.setfunction = setfunction
144         self.expandable = 1
145         self.init()
146
147     def init(self):
148         return
149
150     def getObject(self):
151         return self._object
152
153     def copy(self):
154         """
155         Crée un item copie de self
156         """
157         object = self._object.copy()
158         appli = copy(self.appli)
159         labeltext = copy(self.labeltext)
160         fonction = deepcopy(self.setfunction)
161         item = make_objecttreeitem(appli,labeltext,object,fonction)
162         return item
163     
164     def isactif(self):
165         if hasattr(self.object,'actif'):
166             return self.object.actif
167         else:
168             return 1
169     
170     def GetLabelText(self):
171         """ Retourne 3 valeurs :
172         - le texte à afficher dans le noeud représentant l'item
173         - la fonte dans laquelle afficher ce texte
174         - la couleur du texte
175         """
176         # None --> fonte et couleur par défaut
177         return self.labeltext,None,None
178
179     def get_nature(self) :
180         """ 
181             Retourne la nature de l'item et de l'objet
182         """ 
183         return self.object.nature
184
185     def get_regles(self):
186         """ retourne les règles de l'objet pointé par self """
187         return self.object.get_regles()
188     
189     def get_liste_mc_presents(self):
190         """ Retourne la liste des mots-clés fils de l'objet pointé par self """
191         return self.object.liste_mc_presents()
192     
193     def get_val(self):
194         """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
195             où celle-ci est un objet (ASSD) """
196         return self.object.getval()
197     
198     def get_definition(self):
199         """ 
200            Retourne l'objet definition de l'objet pointé par self 
201         """
202         return self.object.definition
203
204     def get_liste_mc_ordonnee(self,liste,dico):
205         """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
206             d'une entité composée dont le chemin complet est donné sous forme
207             d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
208             il faut encore réarranger cette liste (certains mots-clés déjà
209             présents ne doivent plus être proposés, règles ...)"""
210         return self.object.get_liste_mc_ordonnee(liste,dico)
211
212     def get_liste_mc_ordonnee_brute(self,liste,dico):
213         """
214         retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
215         d'une entité composée dont le chemin complet est donné sous forme
216         d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
217         """
218         return self.object.get_liste_mc_ordonnee_brute(liste,dico)
219    
220     def get_genealogie(self):
221         """
222         Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
223         de l'objet pointé par self
224         """
225         return self.object.get_genealogie()
226
227     def get_index_child(self,nom_fils):
228         """
229         Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
230         Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
231         le nouveau mot-clé
232         """
233         liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
234         liste_noms_mc_presents = self.object.liste_mc_presents()
235         l=[]
236         for nom in liste_noms_mc_ordonnee:
237             if nom in liste_noms_mc_presents or nom == nom_fils:
238                 l.append(nom)
239         # l contient les anciens mots-clés + le nouveau dans l'ordre
240         return l.index(nom_fils)
241         
242     def get_nom_etape(self):
243         """Retourne le nom de self """
244         return self.object.get_nom_etape()
245
246     def get_copie_objet(self):
247         """ Retourne une copie de l'objet pointé par self """
248         return self.object.copy()
249     
250     def get_position(self):
251         """ Retourne la valeur de l'attribut position de l'objet pointé par self """
252         definition = self.get_definition()
253         try:
254             return getattr(definition,'position')
255         except AttributeError:
256             return 'local'
257         
258     def get_nom(self):
259         """ Retourne le nom de l'objet pointé par self """
260         return self.object.nom
261
262     def get_jdc(self):
263         """ Retourne le jdc auquel appartient l'objet pointé par self """
264         return self.object.jdc
265     
266     def get_valeur(self):
267         """ Retourne la valeur de l'objet pointé par self """
268         return self.object.valeur
269
270     def get_cr(self):
271         """ Retourne le compte-rendu CR de self """
272         return self.object.report()
273
274     def get_objet_commentarise(self):
275         """
276         Cette méthode retourne un objet commentarisé
277         représentatif de self.object
278         --> à surcharger par les différents items
279         """
280         raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
281         pass
282         
283     def isvalid(self):
284         """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
285         return self.object.isvalid()
286
287     def iscopiable(self):
288         """
289         Retourne 1 si l'objet est copiable, 0 sinon
290         Par défaut retourne 0
291         """
292         return 0
293     
294     def get_mc_presents(self):
295         """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
296         return self.object.dict_mc_presents()
297
298     def verif_condition_regles(self,l_mc_presents):
299         return self.object.verif_condition_regles(l_mc_presents)
300
301     def get_fr(self):
302         """ Retourne le fr de l'objet pointé par self """
303         return self.object.get_fr()
304
305     def get_docu(self):
306         """ Retourne la clé de doc de l'objet pointé par self """
307         return self.object.get_docu()
308
309     def set_valeur(self,new_valeur):
310         """ Remplace la valeur de l'objet pointé par self par new_valeur """
311         return self.object.set_valeur(new_valeur)
312         
313     def GetText(self):
314         return myrepr.repr(self.object)
315     
316     def GetIconName(self):
317         if not self.IsExpandable():
318             return "python"
319
320     def IsEditable(self):
321         return self.setfunction is not None
322
323     def SetText(self, text):
324         try:
325             value = eval(text)
326             self.setfunction(value)
327         except:
328             pass
329 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
330 # ca parait meme incorrect
331       #  else:
332       #      self.object = value
333
334     def IsExpandable(self):
335         return 1
336         
337     def GetSubList(self):
338         keys = dir(self.object)
339         sublist = []
340         for key in keys:
341             try:
342                 value = getattr(self.object, key)
343             except AttributeError:
344                 continue
345             item = make_objecttreeitem(
346                 self.appli,
347                 str(key) + " =",
348                 value,
349                 lambda value, key=key, object=self.object:
350                     setattr(object, key, value))
351             sublist.append(item)
352         return sublist
353
354     def wait_fichier_init(self):
355         """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
356         (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
357         return self.object.definition.fichier_ini
358
359     def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
360         """
361            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
362            de type item associé à l'object passé en argument.
363         """
364         c = gettreeitem(object)
365         return c(appli,labeltext, object, setfunction)
366
367 class AtomicObjectTreeItem(ObjectTreeItem):
368     def IsExpandable(self):
369         return 0
370
371 class SequenceTreeItem(ObjectTreeItem):
372     def IsExpandable(self):
373         return len(self._object) > 0
374
375     def __len__(self) :
376         return len(self._object)
377    
378     def keys(self):
379         return range(len(self._object))
380
381     def GetIconName(self):
382         if self._object.isvalid():
383           return "ast-green-los"
384         elif self._object.isoblig():
385           return "ast-red-los"
386         else:
387           return "ast-yel-los"
388
389     def ajout_possible(self):
390         return self._object.ajout_possible()
391
392     def get_index(self,child):
393         """ Retourne le numéro de child dans la liste des enfants de self """
394         return self._object.get_index(child.getObject())
395
396     def GetText(self):
397       return  "    "
398
399     def additem(self,obj,pos):
400         self._object.insert(pos,obj)
401         item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
402         return item
403
404     def suppitem(self,item):
405         try :
406             self._object.remove(item.getObject())
407             # la liste peut être retournée vide !
408             message = "Mot-clé " + item.getObject().nom + " supprimé"
409             self.appli.affiche_infos(message)
410             return 1
411         except:
412             return 0
413
414     def GetSubList(self):
415         sublist = []
416         for obj in self._object.data:
417             def setfunction(value, object=obj):
418                 object = value
419             item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
420             sublist.append(item)
421         return sublist