Salome HOME
CCAR: modifications pour :
[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         # L'objet délegué est stocké dans l'attribut object
140         # L'objet associé à l'item est stocké dans l'attribut _object
141         # Il peut etre obtenu par appel à la méthode getObject
142         # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
143         # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
144         # et l'objet délégué est le MCFACT (object = _object.data[0])
145         Delegate.__init__(self,object)
146         # On cache l'objet initial (pour destruction eventuelle
147         # ultérieure)
148         self._object = object
149         self.setfunction = setfunction
150         self.expandable = 1
151         self.sublist=[]
152         self.init()
153
154     def init(self):
155         return
156
157     def getObject(self):
158         return self._object
159
160     def copy(self):
161         """
162         Crée un item copie de self
163         """
164         object = self._object.copy()
165         appli = copy(self.appli)
166         labeltext = copy(self.labeltext)
167         fonction = deepcopy(self.setfunction)
168         item = make_objecttreeitem(appli,labeltext,object,fonction)
169         return item
170     
171     def isactif(self):
172         if hasattr(self.object,'actif'):
173             return self.object.actif
174         else:
175             return 1
176     
177     def update(self,item):
178         """
179           Met a jour l'item courant a partir d'un autre item passe en argument
180           Ne fait rien par defaut
181         """
182         pass
183
184     def GetLabelText(self):
185         """ Retourne 3 valeurs :
186         - le texte à afficher dans le noeud représentant l'item
187         - la fonte dans laquelle afficher ce texte
188         - la couleur du texte
189         """
190         # None --> fonte et couleur par défaut
191         return self.labeltext,None,None
192
193     def get_nature(self) :
194         """ 
195             Retourne la nature de l'item et de l'objet
196         """ 
197         return self.object.nature
198
199     def get_regles(self):
200         """ retourne les règles de l'objet pointé par self """
201         return self.object.get_regles()
202     
203     def get_liste_mc_presents(self):
204         """ Retourne la liste des mots-clés fils de l'objet pointé par self """
205         return self.object.liste_mc_presents()
206     
207     def get_val(self):
208         """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
209             où celle-ci est un objet (ASSD) """
210         return self.object.getval()
211     
212     def get_definition(self):
213         """ 
214            Retourne l'objet definition de l'objet pointé par self 
215         """
216         return self.object.definition
217
218     def get_liste_mc_ordonnee(self,liste,dico):
219         """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
220             d'une entité composée dont le chemin complet est donné sous forme
221             d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
222             il faut encore réarranger cette liste (certains mots-clés déjà
223             présents ne doivent plus être proposés, règles ...)"""
224         return self.object.get_liste_mc_ordonnee(liste,dico)
225
226     def get_liste_mc_ordonnee_brute(self,liste,dico):
227         """
228         retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
229         d'une entité composée dont le chemin complet est donné sous forme
230         d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
231         """
232         return self.object.get_liste_mc_ordonnee_brute(liste,dico)
233    
234     def get_genealogie(self):
235         """
236         Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
237         de l'objet pointé par self
238         """
239         return self.object.get_genealogie()
240
241     def get_index_child(self,nom_fils):
242         """
243         Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
244         Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
245         le nouveau mot-clé
246         """
247         liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
248         liste_noms_mc_presents = self.object.liste_mc_presents()
249         l=[]
250         for nom in liste_noms_mc_ordonnee:
251             if nom in liste_noms_mc_presents or nom == nom_fils:
252                 l.append(nom)
253         # l contient les anciens mots-clés + le nouveau dans l'ordre
254         return l.index(nom_fils)
255         
256     def append_child(self,name,pos=None):
257         """
258           Permet d'ajouter un item fils à self
259         """
260         if pos == 'first':
261             index = 0
262         elif pos == 'last':
263             index = len(self.liste_mc_presents())
264         elif type(pos) == types.IntType :
265             # la position est fixée 
266             index = pos
267         elif type(pos) == types.InstanceType:
268             # pos est un item. Il faut inserer name apres pos
269             index = self.get_index(pos) +1
270         elif type(name) == types.InstanceType:
271             index = self.get_index_child(name.nom)
272         else:
273             index = self.get_index_child(name)
274         return self.addobject(name,index)
275
276     def append_brother(self,name,pos='after'):
277         """
278         Permet d'ajouter un frère à self
279         par défaut on l'ajoute après self
280         """
281         index = self._object.parent.get_index(self.getObject())
282         if pos == 'before':
283             index = index
284         elif pos == 'after':
285             index = index +1
286         else:
287             print str(pos)," n'est pas un index valide pour append_brother"
288             return
289         return self.parent.addobject(name,index)
290
291     def get_nom_etape(self):
292         """Retourne le nom de self """
293         return self.object.get_nom_etape()
294
295     def get_copie_objet(self):
296         """ Retourne une copie de l'objet pointé par self """
297         return self.object.copy()
298     
299     def get_position(self):
300         """ Retourne la valeur de l'attribut position de l'objet pointé par self """
301         definition = self.get_definition()
302         try:
303             return getattr(definition,'position')
304         except AttributeError:
305             return 'local'
306         
307     def get_nom(self):
308         """ Retourne le nom de l'objet pointé par self """
309         return self.object.nom
310
311     def get_jdc(self):
312         """ Retourne le jdc auquel appartient l'objet pointé par self """
313         return self.object.jdc
314     
315     def get_valeur(self):
316         """ Retourne la valeur de l'objet pointé par self """
317         return self.object.valeur
318
319     def get_cr(self):
320         """ Retourne le compte-rendu CR de self """
321         return self.object.report()
322
323     def get_objet_commentarise(self):
324         """
325         Cette méthode retourne un objet commentarisé
326         représentatif de self.object
327         --> à surcharger par les différents items
328         """
329         raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
330         pass
331         
332     def isvalid(self):
333         """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
334         return self.object.isvalid()
335
336     def iscopiable(self):
337         """
338         Retourne 1 si l'objet est copiable, 0 sinon
339         Par défaut retourne 0
340         """
341         return 0
342     
343     def get_mc_presents(self):
344         """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
345         return self.object.dict_mc_presents()
346
347     def verif_condition_regles(self,l_mc_presents):
348         return self.object.verif_condition_regles(l_mc_presents)
349
350     def get_fr(self):
351         """ Retourne le fr de l'objet pointé par self """
352         return self.object.get_fr()
353
354     def get_docu(self):
355         """ Retourne la clé de doc de l'objet pointé par self """
356         return self.object.get_docu()
357
358     def set_valeur(self,new_valeur):
359         """ Remplace la valeur de l'objet pointé par self par new_valeur """
360         return self.object.set_valeur(new_valeur)
361         
362     def GetText(self):
363         return myrepr.repr(self.object)
364     
365     def GetIconName(self):
366         if not self.IsExpandable():
367             return "python"
368
369     def IsEditable(self):
370         return self.setfunction is not None
371
372     def SetText(self, text):
373         try:
374             value = eval(text)
375             self.setfunction(value)
376         except:
377             pass
378 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
379 # ca parait meme incorrect
380       #  else:
381       #      self.object = value
382
383     def IsExpandable(self):
384         return 1
385         
386     def GetSubList(self):
387         keys = dir(self.object)
388         sublist = []
389         for key in keys:
390             try:
391                 value = getattr(self.object, key)
392             except AttributeError:
393                 continue
394             item = make_objecttreeitem(
395                 self.appli,
396                 str(key) + " =",
397                 value,
398                 lambda value, key=key, object=self.object:
399                     setattr(object, key, value))
400             sublist.append(item)
401         return sublist
402
403     def wait_fichier_init(self):
404         """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
405         (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
406         return self.object.definition.fichier_ini
407
408     def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
409         """
410            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
411            de type item associé à l'object passé en argument.
412         """
413         c = gettreeitem(object)
414         return c(appli,labeltext, object, setfunction)
415
416 class AtomicObjectTreeItem(ObjectTreeItem):
417     def IsExpandable(self):
418         return 0
419
420 class SequenceTreeItem(ObjectTreeItem):
421     def IsExpandable(self):
422         return len(self._object) > 0
423
424     def __len__(self) :
425         return len(self._object)
426    
427     def keys(self):
428         return range(len(self._object))
429
430     def GetIconName(self):
431         if self._object.isvalid():
432           return "ast-green-los"
433         elif self._object.isoblig():
434           return "ast-red-los"
435         else:
436           return "ast-yel-los"
437
438     def ajout_possible(self):
439         return self._object.ajout_possible()
440
441     def get_index(self,child):
442         """ Retourne le numéro de child dans la liste des enfants de self """
443         return self._object.get_index(child.getObject())
444
445     def GetText(self):
446       return  "    "
447
448     def additem(self,obj,pos):
449         self._object.insert(pos,obj)
450         item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
451         return item
452
453     def suppitem(self,item):
454         try :
455             self._object.remove(item.getObject())
456             # la liste peut être retournée vide !
457             message = "Mot-clé " + item.getObject().nom + " supprimé"
458             self.appli.affiche_infos(message)
459             return 1
460         except:
461             return 0
462
463     def GetSubList(self):
464         isublist=iter(self.sublist)
465         liste=self._object.data
466         iliste=iter(liste)
467         self.sublist=[]
468
469         while(1):
470            old_obj=obj=None
471            for item in isublist:
472               old_obj=item.getObject()
473               if old_obj in liste:break
474
475            for obj in iliste:
476               if obj is old_obj:break
477               # nouvel objet : on cree un nouvel item
478               def setfunction(value, object=obj):
479                   object=value
480               it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
481               self.sublist.append(it)
482            if old_obj is None and obj is None:break
483            if old_obj is obj: self.sublist.append(item)
484         return self.sublist
485
486     def GetSubList_BAK(self):
487         sublist = []
488         for obj in self._object.data:
489             def setfunction(value, object=obj):
490                 object = value
491             item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
492             sublist.append(item)
493         return sublist