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