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