4 import types,string,os,glob,imp,sys
6 from copy import copy,deepcopy
14 """Abstract class representing tree items.
16 Methods should typically be overridden, otherwise a default action
22 """Constructor. Do whatever you need to do."""
25 """Return text string to display."""
27 def GetLabelText(self):
28 """Return label text string to display in front of text (if any)."""
32 def _IsExpandable(self):
33 """Do not override! Called by TreeNode."""
34 if self.expandable is None:
35 self.expandable = self.IsExpandable()
36 return self.expandable
38 def IsExpandable(self):
39 """Return whether there are subitems."""
42 def _GetSubList(self):
43 """Do not override! Called by TreeNode."""
44 if not self.IsExpandable():
46 sublist = self.GetSubList()
52 """Return whether the item's text may be edited."""
54 def SetText(self, text):
55 """Change the item's text (if it is editable)."""
57 def GetIconName(self):
58 """Return name of icon to be displayed normally."""
60 def GetSelectedIconName(self):
61 """Return name of icon to be displayed when selected."""
64 """Return list of items forming sublist."""
66 def OnDoubleClick(self):
67 """Called on a double-click on the item."""
70 def __init__(self, delegate=None):
71 self.object = delegate
74 def setdelegate(self, delegate):
76 self.object = delegate
78 def getdelegate(self):
81 def __getattr__(self, name):
82 attr = getattr(self.object, name) # May raise AttributeError
83 setattr(self, name, attr)
84 self.__cache[name] = attr
88 for key in self.__cache.keys():
91 except AttributeError:
95 def cachereport(self):
96 keys = self.__cache.keys()
101 class ObjectTreeItem(TreeItem,Delegate):
102 def __init__(self, appli, labeltext, object, setfunction=None):
103 self.labeltext = labeltext
105 Delegate.__init__(self,object)
106 #self.object = object
107 self.setfunction = setfunction
116 Crée un item copie de self
118 object = self.object.copy()
119 appli = copy(self.appli)
120 labeltext = copy(self.labeltext)
121 fonction = deepcopy(self.setfunction)
122 item = make_objecttreeitem(appli,labeltext,object,fonction)
126 if hasattr(self.object,'actif'):
127 return self.object.actif
131 def GetLabelText(self):
132 """ Retourne 3 valeurs :
133 - le texte à afficher dans le noeud représentant l'item
134 - la fonte dans laquelle afficher ce texte
135 - la couleur du texte
137 # None --> fonte et couleur par défaut
138 return self.labeltext,None,None
140 #def get_attribut(self,nom_attribut) :
142 # Retourne l'attribut de nom nom_attribut de l'objet sur lequel
143 # pointe self s'il existe, None sinon
145 # return self.object.get_attribut(nom_attribut)
147 def get_nature(self) :
149 Retourne la nature de l'item et de l'objet
151 return self.object.nature
153 def get_regles(self):
154 """ retourne les règles de l'objet pointé par self """
155 return self.object.get_regles()
157 def get_liste_mc_presents(self):
158 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
159 return self.object.liste_mc_presents()
162 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
163 où celle-ci est un objet (ASSD) """
164 return self.object.getval()
166 def get_definition(self):
168 Retourne l'objet definition de l'objet pointé par self
170 return self.object.definition
172 def get_liste_mc_ordonnee(self,liste,dico):
173 """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
174 d'une entité composée dont le chemin complet est donné sous forme
175 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
176 il faut encore réarranger cette liste (certains mots-clés déjà
177 présents ne doivent plus être proposés, règles ...)"""
178 return self.object.get_liste_mc_ordonnee(liste,dico)
180 def get_liste_mc_ordonnee_brute(self,liste,dico):
182 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
183 d'une entité composée dont le chemin complet est donné sous forme
184 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
186 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
188 def get_genealogie(self):
190 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
191 de l'objet pointé par self
193 return self.object.get_genealogie()
195 def get_index_child(self,nom_fils):
197 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
198 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
201 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
202 liste_noms_mc_presents = self.object.liste_mc_presents()
204 for nom in liste_noms_mc_ordonnee:
205 if nom in liste_noms_mc_presents or nom == nom_fils:
207 # l contient les anciens mots-clés + le nouveau dans l'ordre
208 return l.index(nom_fils)
210 def get_nom_etape(self):
211 """Retourne le nom de self """
212 return self.object.get_nom_etape()
214 def get_copie_objet(self):
215 """ Retourne une copie de l'objet pointé par self """
216 return self.object.copy()
218 def get_position(self):
219 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
220 definition = self.get_definition()
222 return getattr(definition,'position')
223 except AttributeError:
227 """ Retourne le nom de l'objet pointé par self """
228 return self.object.nom
231 """ Retourne le jdc auquel appartient l'objet pointé par self """
232 return self.object.jdc
233 #return self.object.get_attribut('jdc')
235 def get_valeur(self):
236 """ Retourne la valeur de l'objet pointé par self """
237 return self.object.valeur
240 """ Retourne le compte-rendu CR de self """
241 return self.object.report()
243 def get_objet_commentarise(self):
245 Cette méthode retourne un objet commentarisé
246 représentatif de self.object
247 --> à surcharger par les différents items
252 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
253 return self.object.isvalid()
255 def iscopiable(self):
257 Retourne 1 si l'objet est copiable, 0 sinon
258 Par défaut retourne 0
263 """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
264 #if isinstance(self.object,MCList) :
265 if self.object.__class__.__name__ == 'MCList':
270 def isCommande(self):
272 Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
278 Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
284 Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
288 def get_mc_presents(self):
289 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
290 return self.object.dict_mc_presents()
292 def verif_condition_regles(self,l_mc_presents):
293 return self.object.verif_condition_regles(l_mc_presents)
296 """ Retourne le fr de l'objet pointé par self """
298 return self.object.get_fr()
303 """ Retourne la clé de doc de l'objet pointé par self """
304 return self.object.get_docu()
306 def set_valeur(self,new_valeur,evaluation='oui'):
307 """ Remplace la valeur de l'objet pointé par self par new_valeur """
308 return self.object.set_valeur(new_valeur,evaluation=evaluation)
311 return myrepr.repr(self.object)
313 def GetIconName(self):
314 if not self.IsExpandable():
317 def IsEditable(self):
318 return self.setfunction is not None
320 def SetText(self, text):
323 self.setfunction(value)
326 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
327 # ca parait meme incorrect
329 # self.object = value
331 def IsExpandable(self):
334 def GetSubList(self):
335 keys = dir(self.object)
339 value = getattr(self.object, key)
340 except AttributeError:
342 item = make_objecttreeitem(
346 lambda value, key=key, object=self.object:
347 setattr(object, key, value))
351 def wait_fichier_init(self):
352 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
353 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
354 return self.object.definition.fichier_ini
356 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
358 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
359 de type item associé à l'object passé en argument.
361 c = gettreeitem(object)
362 return c(appli,labeltext, object, setfunction)
364 class AtomicObjectTreeItem(ObjectTreeItem):
365 def IsExpandable(self):
368 class SequenceTreeItem(ObjectTreeItem):
369 def IsExpandable(self):
370 return len(self.object) > 0
373 return len(self.object)
376 return range(len(self.object))
378 def GetIconName(self):
379 if self.object.isvalid():
380 return "ast-green-los"
381 elif self.object.isoblig():
386 def ajout_possible(self):
387 return self.object.ajout_possible()
389 def get_index(self,child):
390 """ Retourne le numéro de child dans la liste des enfants de self """
391 return self.object.get_index(child.object)
396 def suppitem(self,item):
397 if not self.object.isMCList():return 1
399 self.object.remove(item.object)
400 # la liste peut être retournée vide !
401 message = "Mot-clé " + item.object.nom + " supprimé"
402 self.appli.affiche_infos(message)
407 def GetSubList(self):
409 for obj in self.object.data:
410 def setfunction(value, object=obj):
412 item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
416 def gettreeitem(object):
418 Cette fonction retourne la classe item associée à l'objet object.
419 Cette classe item dépend bien sûr de la nature de object, d'où
420 l'interrogation du dictionnaire composants
422 if type(object) == types.InstanceType:
423 # On cherche d abord dans les composants (plugins)
425 return composants[object.__class__]
427 # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
428 for e in composants.keys():
429 if isinstance(object,e):return composants[e]
430 # On n'a rien trouve dans les composants
431 return ObjectTreeItem
433 def charger_composants():
435 Cette fonction a pour but de charger tous les modules composants graphiques
436 (fichiers compo*.py dans le même répertoire que ce module )
437 et de remplir le dictionnaire composants utilisé par make_objecttreeitem
440 repertoire=os.path.dirname(__file__)
441 listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
442 for fichier in listfich:
443 m= os.path.basename(fichier)[:-3]
444 module=__import__(m,globals(),locals())
445 composants[module.objet]=module.treeitem
448 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
450 Cette fonction permet de construire et de retourner un objet
451 de type item associé à l'object passé en argument.
453 c = gettreeitem(object)
454 return c(appli,labeltext, object, setfunction)
456 # Dictionnaire {object : item} permettant d'associer un item à un object
457 # Ce dictionnaire est renseigné par la méthode charger_composants
458 composants = charger_composants()