# -*- coding: utf-8 -*-
-# CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
-# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
-# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
-# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
-# (AT YOUR OPTION) ANY LATER VERSION.
+# Copyright (C) 2007-2013 EDF R&D
#
-# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
-# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
-# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
-# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
#
-# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
-# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
-# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-# ======================================================================
"""
"""
# import généraux
from repr import Repr
from copy import copy,deepcopy
+# import du chargeur de composants
+from comploader import make_objecttreeitem
+from Ihm import CONNECTOR
+from Extensions.i18n import tr
+from Extensions.eficas_exception import EficasException
+
myrepr = Repr()
myrepr.maxstring = 100
myrepr.maxother = 100
is used.
"""
+ # itemNode est une factory qui doit retourner un objet de la classe Node
+ # ou dérivé de cette classe.
+ # Le widget arbre utilisera cet objet comme noeud associé au tree item.
+ # Par defaut, utilise la classe Node de base
+ # La signature de la factory est la suivante :
+ # itemNode(treeOrNode,item,command,rmenu)
+ # ou treeOrNode est le noeud parent, item est l'item associé
+ # command est une fonction python appelée sur sélection graphique
+ # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
+ itemNode=None
def __init__(self):
"""Constructor. Do whatever you need to do."""
def cachereport(self):
keys = self.__cache.keys()
keys.sort()
- print keys
+ #print keys
class ObjectTreeItem(TreeItem,Delegate):
def __init__(self, appli, labeltext, object, setfunction=None):
self.labeltext = labeltext
self.appli = appli
+ # L'objet délegué est stocké dans l'attribut object
+ # L'objet associé à l'item est stocké dans l'attribut _object
+ # Il peut etre obtenu par appel à la méthode getObject
+ # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
+ # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
+ # et l'objet délégué est le MCFACT (object = _object.data[0])
Delegate.__init__(self,object)
- #self.object = object
+ # On cache l'objet initial (pour destruction eventuelle
+ # ultérieure)
+ self._object = object
self.setfunction = setfunction
self.expandable = 1
+ self.sublist=[]
self.init()
def init(self):
return
+ def getObject(self):
+ return self._object
+
+ def connect(self,channel,callable,args):
+ """ Connecte la fonction callable (avec arguments args) à l'item self sur le
+ canal channel
+ """
+ #print self,channel,callable,args
+ CONNECTOR.Connect(self._object,channel,callable,args)
+ CONNECTOR.Connect(self.object, channel,callable,args)
+
def copy(self):
"""
Crée un item copie de self
"""
- object = self.object.copy()
+ object = self._object.copy()
appli = copy(self.appli)
labeltext = copy(self.labeltext)
fonction = deepcopy(self.setfunction)
else:
return 1
+ def update(self,item):
+ """
+ Met a jour l'item courant a partir d'un autre item passe en argument
+ Ne fait rien par defaut
+ """
+ pass
+
def GetLabelText(self):
""" Retourne 3 valeurs :
- le texte à afficher dans le noeud représentant l'item
# None --> fonte et couleur par défaut
return self.labeltext,None,None
- #def get_attribut(self,nom_attribut) :
- # """
- # Retourne l'attribut de nom nom_attribut de l'objet sur lequel
- # pointe self s'il existe, None sinon
- # """
- # return self.object.get_attribut(nom_attribut)
-
def get_nature(self) :
"""
Retourne la nature de l'item et de l'objet
return self.object.get_genealogie()
def get_index_child(self,nom_fils):
+ """
+ Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+ Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+ le nouveau mot-clé
+ """
+ return self.object.get_index_child(nom_fils)
+
+ def get_index_child_old(self,nom_fils):
"""
Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
# l contient les anciens mots-clés + le nouveau dans l'ordre
return l.index(nom_fils)
+ def append_child(self,name,pos=None):
+ """
+ Permet d'ajouter un item fils à self
+ """
+ if pos == 'first':
+ index = 0
+ elif pos == 'last':
+ index = len(self.liste_mc_presents())
+ elif type(pos) == types.IntType :
+ # la position est fixée
+ index = pos
+ elif type(pos) == types.InstanceType:
+ # pos est un item. Il faut inserer name apres pos
+ index = self.get_index(pos) +1
+ elif type(name) == types.InstanceType:
+ index = self.get_index_child(name.nom)
+ else:
+ index = self.get_index_child(name)
+ return self.addobject(name,index)
+
+ def append_brother(self,name,pos='after'):
+ """
+ Permet d'ajouter un frère à self
+ par défaut on l'ajoute après self
+ """
+ index = self._object.parent.get_index(self.getObject())
+ if pos == 'before':
+ index = index
+ elif pos == 'after':
+ index = index +1
+ else:
+ print tr("%d n'est pas un index valide pour append_brother", pos)
+ return
+ return self.parent.addobject(name,index)
+
def get_nom_etape(self):
"""Retourne le nom de self """
return self.object.get_nom_etape()
def get_jdc(self):
""" Retourne le jdc auquel appartient l'objet pointé par self """
return self.object.jdc
- #return self.object.get_attribut('jdc')
def get_valeur(self):
""" Retourne la valeur de l'objet pointé par self """
représentatif de self.object
--> à surcharger par les différents items
"""
- raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
- pass
+ raise EficasException("MESSAGE AU DEVELOPPEUR : il faut \
+ surcharger la methode get_objet_commentarise() \
+ pour la classe %s", self.__class__.__name__)
def isvalid(self):
""" Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
"""
return 0
- def isMCList(self):
- """ Retourne 1 si l'objet pointé par self est une MClist, 0 sinon"""
- #if isinstance(self.object,MCList) :
- if self.object.__class__.__name__ == 'MCList':
- return 1
- else :
- return 0
-
- def isCommande(self):
- """
- Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
- """
- return 0
-
- def isJdc(self):
- """
- Retourne 1 si l'objet pointé par self est un JDC, 0 sinon
- """
- return 0
-
- def isMCFact(self):
- """
- Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
- """
- return 0
-
def get_mc_presents(self):
""" Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
return self.object.dict_mc_presents()
def get_fr(self):
""" Retourne le fr de l'objet pointé par self """
- return self.object.get_fr()
+ try:
+ return self.object.get_fr()
+ except:
+ return ""
def get_docu(self):
""" Retourne la clé de doc de l'objet pointé par self """
Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
de type item associé à l'object passé en argument.
"""
- c = gettreeitem(object)
- return c(appli,labeltext, object, setfunction)
+ return make_objecttreeitem(appli,labeltext,object,setfunction)
+
+ #def __del__(self):
+ # print "__del__",self
class AtomicObjectTreeItem(ObjectTreeItem):
def IsExpandable(self):
class SequenceTreeItem(ObjectTreeItem):
def IsExpandable(self):
- return len(self.object) > 0
+ return len(self._object) > 0
def __len__(self) :
- return len(self.object)
+ return len(self._object)
def keys(self):
- return range(len(self.object))
+ return range(len(self._object))
def GetIconName(self):
- if self.object.isvalid():
+ if self._object.isvalid():
return "ast-green-los"
- elif self.object.isoblig():
+ elif self._object.isoblig():
return "ast-red-los"
else:
return "ast-yel-los"
def ajout_possible(self):
- return self.object.ajout_possible()
+ return self._object.ajout_possible()
def get_index(self,child):
""" Retourne le numéro de child dans la liste des enfants de self """
- return self.object.get_index(child.object)
+ return self._object.get_index(child.getObject())
def GetText(self):
return " "
def additem(self,obj,pos):
- # XXX Passer par addentite de MCList ???
- self.object.insert(pos,obj)
+ self._object.insert(pos,obj)
item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
return item
def suppitem(self,item):
- if not self.object.isMCList():return 1
try :
- self.object.remove(item.object)
+ self._object.remove(item.getObject())
# la liste peut être retournée vide !
- message = "Mot-clé " + item.object.nom + " supprimé"
+ message = "Mot-clef " + item.getObject().nom + " supprime"
self.appli.affiche_infos(message)
return 1
except:
return 0
def GetSubList(self):
- sublist = []
- for obj in self.object.data:
- def setfunction(value, object=obj):
- object = value
- item = make_objecttreeitem(self.appli, obj.nom + ":", obj, setfunction)
- sublist.append(item)
- return sublist
-
-def gettreeitem(object):
- """
- Cette fonction retourne la classe item associée à l'objet object.
- Cette classe item dépend bien sûr de la nature de object, d'où
- l'interrogation du dictionnaire composants
- """
- if type(object) == types.InstanceType:
- # On cherche d abord dans les composants (plugins)
- try:
- return composants[object.__class__]
- except:
- # On cherche une eventuelle classe heritee (aleatoire car sans ordre)
- for e in composants.keys():
- if isinstance(object,e):return composants[e]
- # On n'a rien trouve dans les composants
- return ObjectTreeItem
-
-def charger_composants():
- """
- Cette fonction a pour but de charger tous les modules composants graphiques
- (fichiers compo*.py dans le même répertoire que ce module )
- et de remplir le dictionnaire composants utilisé par make_objecttreeitem
- """
- composants={}
- repertoire=os.path.dirname(__file__)
- listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
- for fichier in listfich:
- m= os.path.basename(fichier)[:-3]
- module=__import__(m,globals(),locals())
- composants[module.objet]=module.treeitem
- return composants
-
-def make_objecttreeitem(appli,labeltext, object, setfunction=None):
- """
- Cette fonction permet de construire et de retourner un objet
- de type item associé à l'object passé en argument.
- """
- c = gettreeitem(object)
- return c(appli,labeltext, object, setfunction)
-
-# Dictionnaire {object : item} permettant d'associer un item à un object
-# Ce dictionnaire est renseigné par la méthode charger_composants
-composants = charger_composants()
-
+ isublist=iter(self.sublist)
+ liste=self._object.data
+ iliste=iter(liste)
+ self.sublist=[]
+
+ while(1):
+ old_obj=obj=None
+ for item in isublist:
+ old_obj=item.getObject()
+ if old_obj in liste:break
+
+ for obj in iliste:
+ if obj is old_obj:break
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object=value
+ it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ self.sublist.append(it)
+ if old_obj is None and obj is None:break
+ if old_obj is obj: self.sublist.append(item)
+ return self.sublist