1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 import types,string,os,glob,imp,sys
25 from copy import copy,deepcopy
27 # import du chargeur de composants
28 from comploader import make_objecttreeitem
29 from Ihm import CONNECTOR
30 from Extensions.i18n import tr
31 from Extensions.eficas_exception import EficasException
34 myrepr.maxstring = 100
39 """Abstract class representing tree items.
41 Methods should typically be overridden, otherwise a default action
45 # itemNode est une factory qui doit retourner un objet de la classe Node
46 # ou dérivé de cette classe.
47 # Le widget arbre utilisera cet objet comme noeud associé au tree item.
48 # Par defaut, utilise la classe Node de base
49 # La signature de la factory est la suivante :
50 # itemNode(treeOrNode,item,command,rmenu)
51 # ou treeOrNode est le noeud parent, item est l'item associé
52 # command est une fonction python appelée sur sélection graphique
53 # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
57 """Constructor. Do whatever you need to do."""
60 """Return text string to display."""
62 def GetLabelText(self):
63 """Return label text string to display in front of text (if any)."""
67 def _IsExpandable(self):
68 """Do not override! Called by TreeNode."""
69 if self.expandable is None:
70 self.expandable = self.IsExpandable()
71 return self.expandable
73 def IsExpandable(self):
74 """Return whether there are subitems."""
77 def _GetSubList(self):
78 """Do not override! Called by TreeNode."""
79 if not self.IsExpandable():
81 sublist = self.GetSubList()
87 """Return whether the item's text may be edited."""
89 def SetText(self, text):
90 """Change the item's text (if it is editable)."""
92 def GetIconName(self):
93 """Return name of icon to be displayed normally."""
95 def GetSelectedIconName(self):
96 """Return name of icon to be displayed when selected."""
99 """Return list of items forming sublist."""
101 def OnDoubleClick(self):
102 """Called on a double-click on the item."""
105 def __init__(self, delegate=None):
106 self.object = delegate
109 def setdelegate(self, delegate):
111 self.object = delegate
113 def getdelegate(self):
116 def __getattr__(self, name):
117 attr = getattr(self.object, name) # May raise AttributeError
118 setattr(self, name, attr)
119 self.__cache[name] = attr
122 def resetcache(self):
123 for key in self.__cache.keys():
126 except AttributeError:
130 def cachereport(self):
131 keys = self.__cache.keys()
136 class ObjectTreeItem(TreeItem,Delegate):
137 def __init__(self, appli, labeltext, object, setfunction=None):
138 self.labeltext = labeltext
140 # L'objet délegué est stocké dans l'attribut object
141 # L'objet associé à l'item est stocké dans l'attribut _object
142 # Il peut etre obtenu par appel à la méthode getObject
143 # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
144 # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
145 # et l'objet délégué est le MCFACT (object = _object.data[0])
146 Delegate.__init__(self,object)
147 # On cache l'objet initial (pour destruction eventuelle
149 self._object = object
150 self.setfunction = setfunction
161 def connect(self,channel,callable,args):
162 """ Connecte la fonction callable (avec arguments args) à l'item self sur le
165 #print self,channel,callable,args
166 CONNECTOR.Connect(self._object,channel,callable,args)
167 CONNECTOR.Connect(self.object, channel,callable,args)
171 Crée un item copie de self
173 object = self._object.copy()
174 appli = copy(self.appli)
175 labeltext = copy(self.labeltext)
176 fonction = deepcopy(self.setfunction)
177 item = make_objecttreeitem(appli,labeltext,object,fonction)
181 if hasattr(self.object,'actif'):
182 return self.object.actif
186 def update(self,item):
188 Met a jour l'item courant a partir d'un autre item passe en argument
189 Ne fait rien par defaut
193 def GetLabelText(self):
194 """ Retourne 3 valeurs :
195 - le texte à afficher dans le noeud représentant l'item
196 - la fonte dans laquelle afficher ce texte
197 - la couleur du texte
199 # None --> fonte et couleur par défaut
200 return self.labeltext,None,None
202 def get_nature(self) :
204 Retourne la nature de l'item et de l'objet
206 return self.object.nature
208 def get_regles(self):
209 """ retourne les règles de l'objet pointé par self """
210 return self.object.get_regles()
212 def get_liste_mc_presents(self):
213 """ Retourne la liste des mots-clés fils de l'objet pointé par self """
214 return self.object.liste_mc_presents()
217 """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
218 où celle-ci est un objet (ASSD) """
219 return self.object.getval()
221 def get_definition(self):
223 Retourne l'objet definition de l'objet pointé par self
225 return self.object.definition
227 def get_liste_mc_ordonnee(self,liste,dico):
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 il faut encore réarranger cette liste (certains mots-clés déjà
232 présents ne doivent plus être proposés, règles ...)"""
233 return self.object.get_liste_mc_ordonnee(liste,dico)
235 def get_liste_mc_ordonnee_brute(self,liste,dico):
237 retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
238 d'une entité composée dont le chemin complet est donné sous forme
239 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
241 return self.object.get_liste_mc_ordonnee_brute(liste,dico)
243 def get_genealogie(self):
245 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
246 de l'objet pointé par self
248 return self.object.get_genealogie()
250 def get_index_child(self,nom_fils):
252 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
253 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
256 return self.object.get_index_child(nom_fils)
258 def get_index_child_old(self,nom_fils):
260 Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
261 Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
264 liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
265 liste_noms_mc_presents = self.object.liste_mc_presents()
267 for nom in liste_noms_mc_ordonnee:
268 if nom in liste_noms_mc_presents or nom == nom_fils:
270 # l contient les anciens mots-clés + le nouveau dans l'ordre
271 return l.index(nom_fils)
273 def append_child(self,name,pos=None):
275 Permet d'ajouter un item fils à self
280 index = len(self.liste_mc_presents())
281 elif type(pos) == types.IntType :
282 # la position est fixée
284 elif type(pos) == types.InstanceType:
285 # pos est un item. Il faut inserer name apres pos
286 index = self.get_index(pos) +1
287 elif type(name) == types.InstanceType:
288 index = self.get_index_child(name.nom)
290 index = self.get_index_child(name)
291 return self.addobject(name,index)
293 def append_brother(self,name,pos='after'):
295 Permet d'ajouter un frère à self
296 par défaut on l'ajoute après self
298 index = self._object.parent.get_index(self.getObject())
304 print (tr("%d n'est pas un index valide pour append_brother", pos))
306 return self.parent.addobject(name,index)
308 def get_nom_etape(self):
309 """Retourne le nom de self """
310 return self.object.get_nom_etape()
312 def get_copie_objet(self):
313 """ Retourne une copie de l'objet pointé par self """
314 return self.object.copy()
316 def get_position(self):
317 """ Retourne la valeur de l'attribut position de l'objet pointé par self """
318 definition = self.get_definition()
320 return getattr(definition,'position')
321 except AttributeError:
325 """ Retourne le nom de l'objet pointé par self """
326 return self.object.nom
329 """ Retourne le jdc auquel appartient l'objet pointé par self """
330 return self.object.jdc
332 def get_valeur(self):
333 """ Retourne la valeur de l'objet pointé par self """
334 return self.object.valeur
337 """ Retourne le compte-rendu CR de self """
338 return self.object.report()
340 def get_objet_commentarise(self):
342 Cette méthode retourne un objet commentarisé
343 représentatif de self.object
344 --> à surcharger par les différents items
346 raise EficasException("MESSAGE AU DEVELOPPEUR : il faut \
347 surcharger la methode get_objet_commentarise() \
348 pour la classe %s", self.__class__.__name__)
351 """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
352 return self.object.isvalid()
354 def iscopiable(self):
356 Retourne 1 si l'objet est copiable, 0 sinon
357 Par défaut retourne 0
361 def get_mc_presents(self):
362 """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
363 return self.object.dict_mc_presents()
365 def verif_condition_regles(self,l_mc_presents):
366 return self.object.verif_condition_regles(l_mc_presents)
369 """ Retourne le fr de l'objet pointé par self """
371 return self.object.get_fr()
376 """ Retourne la clé de doc de l'objet pointé par self """
377 return self.object.get_docu()
379 def set_valeur(self,new_valeur):
380 """ Remplace la valeur de l'objet pointé par self par new_valeur """
381 return self.object.set_valeur(new_valeur)
384 return myrepr.repr(self.object)
386 def GetIconName(self):
387 if not self.IsExpandable():
390 def IsEditable(self):
391 return self.setfunction is not None
393 def SetText(self, text):
396 self.setfunction(value)
399 # Modif de ma part CCar : je ne comprend pas a quoi ca sert
400 # ca parait meme incorrect
402 # self.object = value
404 def IsExpandable(self):
407 def GetSubList(self):
408 keys = dir(self.object)
412 value = getattr(self.object, key)
413 except AttributeError:
415 item = make_objecttreeitem(
419 lambda value, key=key, object=self.object:
420 setattr(object, key, value))
424 def wait_fichier_init(self):
425 """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
426 (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
427 return self.object.definition.fichier_ini
429 def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
431 Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
432 de type item associé à l'object passé en argument.
434 return make_objecttreeitem(appli,labeltext,object,setfunction)
437 # print "__del__",self
439 class AtomicObjectTreeItem(ObjectTreeItem):
440 def IsExpandable(self):
443 class SequenceTreeItem(ObjectTreeItem):
444 def IsExpandable(self):
445 return len(self._object) > 0
448 return len(self._object)
451 return range(len(self._object))
453 def GetIconName(self):
454 if self._object.isvalid():
455 return "ast-green-los"
456 elif self._object.isoblig():
461 def ajout_possible(self):
462 return self._object.ajout_possible()
464 def get_index(self,child):
465 """ Retourne le numéro de child dans la liste des enfants de self """
466 return self._object.get_index(child.getObject())
471 def additem(self,obj,pos):
472 self._object.insert(pos,obj)
473 item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
476 def suppitem(self,item):
478 self._object.remove(item.getObject())
479 # la liste peut être retournée vide !
480 message = "Mot-clef " + item.getObject().nom + " supprime"
481 self.appli.affiche_infos(message)
486 def GetSubList(self):
487 isublist=iter(self.sublist)
488 liste=self._object.data
494 for item in isublist:
495 old_obj=item.getObject()
496 if old_obj in liste:break
499 if obj is old_obj:break
500 # nouvel objet : on cree un nouvel item
501 def setfunction(value, object=obj):
503 it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
504 self.sublist.append(it)
505 if old_obj is None and obj is None:break
506 if old_obj is obj: self.sublist.append(item)