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