Salome HOME
sauve du 9 mai
[tools/eficas.git] / InterfaceQT4 / compomclist.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 import types
22 import traceback
23
24 import compofact
25 import browser
26 import typeNode
27 from Extensions.i18n import tr
28
29 from Editeur     import Objecttreeitem
30 from Noyau.N_OBJECT import ErrorObj
31
32
33 class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
34
35     def createPopUpMenu(self):
36         typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
37
38     def getPanelGroupe(self,parentQt,commande):
39         maDefinition=self.item.get_definition()
40         monObjet=self.item.object
41         monNom=self.item.nom
42         maCommande=commande
43         #print "ds getPanelGroupe" , self.item.nom
44         #if hasattr(self,'plie'): print "self.plie", self.plie
45        # if self.item.nom == "BackgroundError" and not(self.plie): print i
46         #print parentQt
47         if hasattr(parentQt,'niveau'): self.niveau=parentQt.niveau+1
48         else : self.niveau=1
49         if not (monObjet.isMCList()) :
50            if  hasattr(self,'plie') and self.plie==True : 
51                from monWidgetFactPlie import MonWidgetFactPlie
52                widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
53            else:
54                from monWidgetFact import MonWidgetFact
55                widget=MonWidgetFact(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
56         else :
57            from monWidgetBloc import MonWidgetBloc
58            widget=MonWidgetBloc(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
59         return widget
60
61
62     #def doPaste(self,node_selected):
63     #    objet_a_copier = self.item.get_copie_objet()
64     #    child=node_selected.doPasteMCF(objet_a_copier)
65         #print "doPaste",child
66     #    return child
67
68     #def doPasteMCF(self,objet_a_copier):
69     #    child=None
70         # le noeud courant est une MCList
71     #    if self.item.isMCList() :
72     #      child = self.append_child(objet_a_copier,pos='first',retour='oui')
73
74         # le noeud courant est un MCFACT
75     #    elif self.item.isMCFact() :
76           # le noeud selectionne est un MCFACT dans une MCList
77     #      if self.parent.item.isMCList():
78     #         child = self.parent.append_child(objet_a_copier, pos=self.item, retour='oui')
79
80           # le noeud MCFACT selectionne n'est pas dans une MCList
81     #      else:
82     #         child = self.parent.append_child(objet_a_copier,retour='oui')
83
84     #    else:
85     #      QMessageBox.information( self, "Copie impossible",
86     #               "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")          
87     #      self.editor.affiche_infos("Copie refusée")
88
89     #    return child
90
91 class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
92     """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
93         du noyau Accas instances de la classe MCLIST.
94         Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
95         noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
96         Cette classe délègue les appels de méthode et les accès
97         aux attributs à l'objet du noyau soit manuellement soit 
98         automatiquement (voir classe Delegate et attribut object).
99     """
100     itemNode=Node
101
102     def init(self):
103         # Si l'objet Accas (MCList) a moins d'un mot cle facteur
104         # on utilise directement ce mot cle facteur comme delegue
105         self.updateDelegate()
106
107     def updateDelegate(self):
108         if len(self._object) > 1:
109            self.setdelegate(self._object)
110         else:
111            self.setdelegate(self._object.data[0])
112
113     def panel(self,jdcdisplay,pane,node):
114         """ Retourne une instance de l'objet panneau associe a l'item (self)
115             Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
116             FACTPanel.
117             Si la liste est plus longue on utilise le panneau MCLISTPanel.
118         """
119         if len(self._object) > 1:
120            return MCLISTPanel(jdcdisplay,pane,node)
121         elif isinstance(self._object.data[0],ErrorObj):
122            return compoerror.ERRORPanel(jdcdisplay,pane,node)
123         else:
124            return compofact.FACTPanel(jdcdisplay,pane,node)
125
126     def IsExpandable(self):
127         if len(self._object) > 1:
128            return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
129         else:
130            return compofact.FACTTreeItem.IsExpandable(self)
131
132     def GetSubList(self):
133         self.updateDelegate()
134         if len(self._object) <= 1:
135            self._object.data[0].alt_parent=self._object
136            return compofact.FACTTreeItem.GetSubList(self)
137
138         liste=self._object.data
139         sublist=[None]*len(liste)
140         # suppression des items lies aux objets disparus
141         for item in self.sublist:
142            old_obj=item.getObject()
143            if old_obj in liste:
144               pos=liste.index(old_obj)
145               sublist[pos]=item
146            else:
147               pass # objets supprimes ignores
148         # ajout des items lies aux nouveaux objets
149         pos=0
150         for obj in liste:
151            if sublist[pos] is None:
152               # nouvel objet : on cree un nouvel item
153               def setfunction(value, object=obj):
154                   object=value
155               item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
156               sublist[pos]=item
157               #Attention : on ajoute une information supplementaire pour l'actualisation de 
158               # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
159               # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
160               # informations de validite. alt_parent permet de remedier a ce defaut.
161               obj.alt_parent=self._object
162            pos=pos+1
163
164         self.sublist=sublist
165         return self.sublist
166
167     def GetIconName(self):
168         if self._object.isvalid():
169             return "ast-green-los"
170         elif self._object.isoblig():
171             return "ast-red-los"
172         else:
173             return "ast-yel-los"
174
175     def get_docu(self):
176         """ Retourne la clef de doc de l'objet pointé par self """
177         return self.object.get_docu()    
178
179     def iscopiable(self):
180         if len(self._object) > 1:
181            return Objecttreeitem.SequenceTreeItem.iscopiable(self)
182         else:
183            return compofact.FACTTreeItem.iscopiable(self)
184
185     def isMCFact(self):
186         """
187         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
188         """
189         return len(self._object) <= 1
190
191     def isMCList(self):
192         """
193         Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
194         """
195         return len(self._object) > 1
196         
197     def get_copie_objet(self):
198         return self._object.data[0].copy()
199
200     def additem(self,obj,pos):
201         #print "compomclist.additem",obj,pos
202         if len(self._object) <= 1:
203            return compofact.FACTTreeItem.additem(self,obj,pos)
204
205         o= self.object.addentite(obj,pos)
206         return o
207
208     def suppitem(self,item):
209         """
210         Retire un objet MCFACT de la MCList (self.object) 
211         """
212         #print "compomclist.suppitem",item
213         obj=item.getObject()
214         if len(self._object) <= 1:
215            return compofact.FACTTreeItem.suppitem(self,item)
216
217         if self.object.suppentite(obj):
218            if len(self._object) == 1: self.updateDelegate()     
219            message = "Mot-clef " + obj.nom + " supprime"
220            #self.editor.affiche_commentaire(message)
221            return (1,message)
222         else:
223            return (0,tr('Impossible de supprimer ce mot-clef'))
224
225             
226 import Accas
227 objet = Accas.MCList    
228
229 def treeitem(appli,labeltext,object,setfunction):
230   """ Factory qui produit un objet treeitem adapte a un objet 
231       Accas.MCList (attribut objet de ce module)
232   """
233   return MCListTreeItem(appli,labeltext,object,setfunction)