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.
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.
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.
20 # ======================================================================
24 import types,string,os,glob,imp,sys
26 from copy import copy,deepcopy
28 # import du chargeur de composants
29 from comploader import gettreeitem,make_objecttreeitem
33 myrepr.maxstring = 100
38 """Abstract class representing tree items.
40 Methods should typically be overridden, otherwise a default action
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
56 """Constructor. Do whatever you need to do."""
59 """Return text string to display."""
61 def GetLabelText(self):
62 """Return label text string to display in front of text (if any)."""
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
72 def IsExpandable(self):
73 """Return whether there are subitems."""
76 def _GetSubList(self):
77 """Do not override! Called by TreeNode."""
78 if not self.IsExpandable():
80 sublist = self.GetSubList()
86 """Return whether the item's text may be edited."""
88 def SetText(self, text):
89 """Change the item's text (if it is editable)."""
91 def GetIconName(self):
92 """Return name of icon to be displayed normally."""
94 def GetSelectedIconName(self):
95 """Return name of icon to be displayed when selected."""
98 """Return list of items forming sublist."""
100 def OnDoubleClick(self):
101 """Called on a double-click on the item."""
104 def __init__(self, delegate=None):
105 self.object = delegate
108 def setdelegate(self, delegate):
110 self.object = delegate
112 def getdelegate(self):
115 def __getattr__(self, name):
116 attr = getattr(self.object, name) # May raise AttributeError
117 setattr(self, name, attr)
118 self.__cache[name] = attr
121 def resetcache(self):
122 for key in self.__cache.keys():
125 except AttributeError:
129 def cachereport(self):
130 keys = self.__cache.keys()
135 class ObjectTreeItem(TreeItem,Delegate):
136 def __init__(self, appli, labeltext, object, setfunction=None):
137 self.labeltext = labeltext
139 Delegate.__init__(self,object)
140 # On cache l'objet initial (pour destruction eventuelle
142 self._object = object
143 self.setfunction = setfunction
155 Crée un item copie de self
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)
165 if hasattr(self.object,'actif'):
166 return self.object.actif
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
176 # None --> fonte et couleur par défaut
177 return self.labeltext,None,None
179 def get_nature(self) :
181 Retourne la nature de l'item et de l'objet
183 return self.object.nature
185 def get_regles(self):
186 """ retourne les règles de l'objet pointé par self """
187 return self.object.get_regles()
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()
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()
198 def get_definition(self):
200 Retourne l'objet definition de l'objet pointé par self
202 return self.object.definition
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)
212 def get_liste_mc_ordonnee_brute(self,liste,dico):
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 + ...
218 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
220 def get_genealogie(self):
222 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
223 de l'objet pointé par self
225 return self.object.get_genealogie()
227 def get_index_child(self,nom_fils):
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
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()
236 for nom in liste_noms_mc_ordonnee:
237 if nom in liste_noms_mc_presents or nom == nom_fils:
239 # l contient les anciens mots-clés + le nouveau dans l'ordre
240 return l.index(nom_fils)
242 def get_nom_etape(self):
243 """Retourne le nom de self """
244 return self.object.get_nom_etape()
246 def get_copie_objet(self):
247 """ Retourne une copie de l'objet pointé par self """
248 return self.object.copy()
250 def get_position(self):
251 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
252 definition = self.get_definition()
254 return getattr(definition,'position')
255 except AttributeError:
259 """ Retourne le nom de l'objet pointé par self """
260 return self.object.nom
263 """ Retourne le jdc auquel appartient l'objet pointé par self """
264 return self.object.jdc
266 def get_valeur(self):
267 """ Retourne la valeur de l'objet pointé par self """
268 return self.object.valeur
271 """ Retourne le compte-rendu CR de self """
272 return self.object.report()
274 def get_objet_commentarise(self):
276 Cette méthode retourne un objet commentarisé
277 représentatif de self.object
278 --> à surcharger par les différents items
280 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
284 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
285 return self.object.isvalid()
287 def iscopiable(self):
289 Retourne 1 si l'objet est copiable, 0 sinon
290 Par défaut retourne 0
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()
298 def verif_condition_regles(self,l_mc_presents):
299 return self.object.verif_condition_regles(l_mc_presents)
302 """ Retourne le fr de l'objet pointé par self """
303 return self.object.get_fr()
306 """ Retourne la clé de doc de l'objet pointé par self """
307 return self.object.get_docu()
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)
314 return myrepr.repr(self.object)
316 def GetIconName(self):
317 if not self.IsExpandable():
320 def IsEditable(self):
321 return self.setfunction is not None
323 def SetText(self, text):
326 self.setfunction(value)
329 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
330 # ca parait meme incorrect
332 # self.object = value
334 def IsExpandable(self):
337 def GetSubList(self):
338 keys = dir(self.object)
342 value = getattr(self.object, key)
343 except AttributeError:
345 item = make_objecttreeitem(
349 lambda value, key=key, object=self.object:
350 setattr(object, key, value))
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
359 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
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.
364 c = gettreeitem(object)
365 return c(appli,labeltext, object, setfunction)
367 class AtomicObjectTreeItem(ObjectTreeItem):
368 def IsExpandable(self):
371 class SequenceTreeItem(ObjectTreeItem):
372 def IsExpandable(self):
373 return len(self._object) > 0
376 return len(self._object)
379 return range(len(self._object))
381 def GetIconName(self):
382 if self._object.isvalid():
383 return "ast-green-los"
384 elif self._object.isoblig():
389 def ajout_possible(self):
390 return self._object.ajout_possible()
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())
399 def additem(self,obj,pos):
400 self._object.insert(pos,obj)
401 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
404 def suppitem(self,item):
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)
414 def GetSubList(self):
416 for obj in self._object.data:
417 def setfunction(value, object=obj):
419 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)