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
31 myrepr.maxstring = 100
36 """Abstract class representing tree items.
38 Methods should typically be overridden, otherwise a default action
42 # itemNode est une factory qui doit retourner un objet de la classe Node
43 # ou dérivé de cette classe.
44 # Le widget arbre utilisera cet objet comme noeud associé au tree item.
45 # Par defaut, utilise la classe Node de base
46 # La signature de la factory est la suivante :
47 # itemNode(treeOrNode,item,command,rmenu)
48 # ou treeOrNode est le noeud parent, item est l'item associé
49 # command est une fonction python appelée sur sélection graphique
50 # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
51 itemNode=treewidget.Node
54 """Constructor. Do whatever you need to do."""
57 """Return text string to display."""
59 def GetLabelText(self):
60 """Return label text string to display in front of text (if any)."""
64 def _IsExpandable(self):
65 """Do not override! Called by TreeNode."""
66 if self.expandable is None:
67 self.expandable = self.IsExpandable()
68 return self.expandable
70 def IsExpandable(self):
71 """Return whether there are subitems."""
74 def _GetSubList(self):
75 """Do not override! Called by TreeNode."""
76 if not self.IsExpandable():
78 sublist = self.GetSubList()
84 """Return whether the item's text may be edited."""
86 def SetText(self, text):
87 """Change the item's text (if it is editable)."""
89 def GetIconName(self):
90 """Return name of icon to be displayed normally."""
92 def GetSelectedIconName(self):
93 """Return name of icon to be displayed when selected."""
96 """Return list of items forming sublist."""
98 def OnDoubleClick(self):
99 """Called on a double-click on the item."""
102 def __init__(self, delegate=None):
103 self.object = delegate
106 def setdelegate(self, delegate):
108 self.object = delegate
110 def getdelegate(self):
113 def __getattr__(self, name):
114 attr = getattr(self.object, name) # May raise AttributeError
115 setattr(self, name, attr)
116 self.__cache[name] = attr
119 def resetcache(self):
120 for key in self.__cache.keys():
123 except AttributeError:
127 def cachereport(self):
128 keys = self.__cache.keys()
133 class ObjectTreeItem(TreeItem,Delegate):
134 def __init__(self, appli, labeltext, object, setfunction=None):
135 self.labeltext = labeltext
137 Delegate.__init__(self,object)
138 # On cache l'objet initial (pour destruction eventuelle
140 self._object = object
141 self.setfunction = setfunction
153 Crée un item copie de self
155 object = self._object.copy()
156 appli = copy(self.appli)
157 labeltext = copy(self.labeltext)
158 fonction = deepcopy(self.setfunction)
159 item = make_objecttreeitem(appli,labeltext,object,fonction)
163 if hasattr(self.object,'actif'):
164 return self.object.actif
168 def GetLabelText(self):
169 """ Retourne 3 valeurs :
170 - le texte à afficher dans le noeud représentant l'item
171 - la fonte dans laquelle afficher ce texte
172 - la couleur du texte
174 # None --> fonte et couleur par défaut
175 return self.labeltext,None,None
177 def get_nature(self) :
179 Retourne la nature de l'item et de l'objet
181 return self.object.nature
183 def get_regles(self):
184 """ retourne les règles de l'objet pointé par self """
185 return self.object.get_regles()
187 def get_liste_mc_presents(self):
188 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
189 return self.object.liste_mc_presents()
192 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
193 où celle-ci est un objet (ASSD) """
194 return self.object.getval()
196 def get_definition(self):
198 Retourne l'objet definition de l'objet pointé par self
200 return self.object.definition
202 def get_liste_mc_ordonnee(self,liste,dico):
203 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
204 d'une entité composée dont le chemin complet est donné sous forme
205 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
206 il faut encore réarranger cette liste (certains mots-clés déjà
207 présents ne doivent plus être proposés, règles ...)"""
208 return self.object.get_liste_mc_ordonnee(liste,dico)
210 def get_liste_mc_ordonnee_brute(self,liste,dico):
212 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
213 d'une entité composée dont le chemin complet est donné sous forme
214 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
216 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
218 def get_genealogie(self):
220 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
221 de l'objet pointé par self
223 return self.object.get_genealogie()
225 def get_index_child(self,nom_fils):
227 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
228 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
231 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
232 liste_noms_mc_presents = self.object.liste_mc_presents()
234 for nom in liste_noms_mc_ordonnee:
235 if nom in liste_noms_mc_presents or nom == nom_fils:
237 # l contient les anciens mots-clés + le nouveau dans l'ordre
238 return l.index(nom_fils)
240 def get_nom_etape(self):
241 """Retourne le nom de self """
242 return self.object.get_nom_etape()
244 def get_copie_objet(self):
245 """ Retourne une copie de l'objet pointé par self """
246 return self.object.copy()
248 def get_position(self):
249 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
250 definition = self.get_definition()
252 return getattr(definition,'position')
253 except AttributeError:
257 """ Retourne le nom de l'objet pointé par self """
258 return self.object.nom
261 """ Retourne le jdc auquel appartient l'objet pointé par self """
262 return self.object.jdc
264 def get_valeur(self):
265 """ Retourne la valeur de l'objet pointé par self """
266 return self.object.valeur
269 """ Retourne le compte-rendu CR de self """
270 return self.object.report()
272 def get_objet_commentarise(self):
274 Cette méthode retourne un objet commentarisé
275 représentatif de self.object
276 --> à surcharger par les différents items
278 raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
282 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
283 return self.object.isvalid()
285 def iscopiable(self):
287 Retourne 1 si l'objet est copiable, 0 sinon
288 Par défaut retourne 0
292 def get_mc_presents(self):
293 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
294 return self.object.dict_mc_presents()
296 def verif_condition_regles(self,l_mc_presents):
297 return self.object.verif_condition_regles(l_mc_presents)
300 """ Retourne le fr de l'objet pointé par self """
301 return self.object.get_fr()
304 """ Retourne la clé de doc de l'objet pointé par self """
305 return self.object.get_docu()
307 def set_valeur(self,new_valeur):
308 """ Remplace la valeur de l'objet pointé par self par new_valeur """
309 return self.object.set_valeur(new_valeur)
312 return myrepr.repr(self.object)
314 def GetIconName(self):
315 if not self.IsExpandable():
318 def IsEditable(self):
319 return self.setfunction is not None
321 def SetText(self, text):
324 self.setfunction(value)
327 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
328 # ca parait meme incorrect
330 # self.object = value
332 def IsExpandable(self):
335 def GetSubList(self):
336 keys = dir(self.object)
340 value = getattr(self.object, key)
341 except AttributeError:
343 item = make_objecttreeitem(
347 lambda value, key=key, object=self.object:
348 setattr(object, key, value))
352 def wait_fichier_init(self):
353 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
354 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
355 return self.object.definition.fichier_ini
357 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
359 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
360 de type item associé à l'object passé en argument.
362 c = gettreeitem(object)
363 return c(appli,labeltext, object, setfunction)
365 class AtomicObjectTreeItem(ObjectTreeItem):
366 def IsExpandable(self):
369 class SequenceTreeItem(ObjectTreeItem):
370 def IsExpandable(self):
371 return len(self._object) > 0
374 return len(self._object)
377 return range(len(self._object))
379 def GetIconName(self):
380 if self._object.isvalid():
381 return "ast-green-los"
382 elif self._object.isoblig():
387 def ajout_possible(self):
388 return self._object.ajout_possible()
390 def get_index(self,child):
391 """ Retourne le numéro de child dans la liste des enfants de self """
392 return self._object.get_index(child.getObject())
397 def additem(self,obj,pos):
398 self._object.insert(pos,obj)
399 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
402 def suppitem(self,item):
404 self._object.remove(item.getObject())
405 # la liste peut être retournée vide !
406 message = "Mot-clé " + item.getObject().nom + " supprimé"
407 self.appli.affiche_infos(message)
412 def GetSubList(self):
414 for obj in self._object.data:
415 def setfunction(value, object=obj):
417 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
421 def gettreeitem(object):
423 Cette fonction retourne la classe item associée à l'objet object.
424 Cette classe item dépend bien sûr de la nature de object, d'où
425 l'interrogation du dictionnaire composants
427 if type(object) == types.InstanceType:
428 # On cherche d abord dans les composants (plugins)
430 return composants[object.__class__]
432 # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
433 for e in composants.keys():
434 if isinstance(object,e):return composants[e]
435 # On n'a rien trouve dans les composants
436 return ObjectTreeItem
438 def charger_composants():
440 Cette fonction a pour but de charger tous les modules composants graphiques
441 (fichiers compo*.py dans le même répertoire que ce module )
442 et de remplir le dictionnaire composants utilisé par make_objecttreeitem
445 repertoire=os.path.dirname(__file__)
446 listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
447 for fichier in listfich:
448 m= os.path.basename(fichier)[:-3]
449 module=__import__(m,globals(),locals())
450 composants[module.objet]=module.treeitem
453 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
455 Cette fonction permet de construire et de retourner un objet
456 de type item associé à l'object passé en argument.
458 c = gettreeitem(object)
459 return c(appli,labeltext, object, setfunction)
461 # Dictionnaire {object : item} permettant d'associer un item à un object
462 # Ce dictionnaire est renseigné par la méthode charger_composants
463 composants = charger_composants()