Salome HOME
*** empty log message ***
[tools/eficas.git] / Editeur / compomclist.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 import types
22 from Tkinter import *
23 import Pmw
24 import Objecttreeitem
25 import panels
26 import traceback
27
28 class MCLISTPanel(panels.Panel):
29     def init(self):
30         test_ajout = self.node.item.ajout_possible()
31         nom_mcfact = self.node.item.get_nom()
32         if test_ajout:
33             texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
34         else:
35             texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
36         self.label = Label(self,text = texte)
37         self.label.place(relx=0.5,rely=0.4,anchor='center')
38         if test_ajout:
39             self.but=Button(self,text="AJOUTER",command=self.ajout_occurrence)
40             self.but.place(relx=0.5,rely=0.6,anchor='center')
41             #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
42
43     def ajout_occurrence(self,event=None):
44         self.node.parent.append_child(self.node.item.get_nom())
45
46 import compofact
47 import treewidget
48 class Node(treewidget.Node):
49     def doPaste(self,node_selected):
50         objet_a_copier = self.item.get_copie_objet()
51         child=node_selected.doPaste_MCF(objet_a_copier)
52         #print "doPaste",child
53         return child
54
55     def doPaste_MCF(self,objet_a_copier):
56         if self.item.isMCList() :
57           # le noeud courant est une MCList
58           child = self.append_child(objet_a_copier,pos='first',retour='oui')
59           #child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
60         elif self.item.isMCFact() :
61           # le noeud courant est un MCFACT
62           if self.parent.item.isMCList():
63              # le noeud selectionne est un MCFACT dans une MCList
64              child = self.parent.append_child(objet_a_copier,
65                                               pos=self.item,
66                                               retour='oui')
67           else:
68              # le noeud MCFACT selectionne n'est pas dans une MCList
69              child = self.parent.append_child(objet_a_copier,retour='oui')
70         else:
71           showinfo("Copie impossible",
72                    "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
73           self.appli.affiche_infos("Copie refusée")
74           child=None
75         #print "doPaste_MCF",child
76         return child
77
78     def replace_enfant(self,item):
79         """ Retourne le noeud fils à éventuellement remplacer """
80         raise "OBSOLETE"
81         if self.item.isMCList():return None
82         return self.get_node_fils(item.get_nom())
83
84     def verif_condition(self):
85         raise "OBSOLETE"
86         if self.item.isMCList():
87            self.children[-1].verif_condition()
88         else:
89            treewidget.Node.verif_condition(self)
90
91     def after_delete(self):
92         """ Dans le cas d'une MCList il faut vérifier qu'elle n'est pas vide
93             ou réduite à un seul élément suite à une destruction
94         """
95         raise "OBSOLETE"
96         # self représente une MCList
97         if len(self.item) == 0 :
98             # la liste est vide : il faut la supprimer
99             self.delete()
100         elif len(self.item) == 1:
101             # il ne reste plus qu'un élément dans la liste
102             noeud = self.children[0]
103             # maintenant l'item mclist gere tout seul ce
104             # changement
105             self.delete_node_child(noeud)
106             self.children=noeud.children or []
107             self.state=noeud.state
108         else :
109             return
110
111     def delete_child(self,child):
112         """
113             Supprime child des enfants de self, tous les id associés
114             ET l'objet associé
115         """
116         raise "OBSOLETE"
117         if self.item.isMCList():
118            if self.item.suppitem(child.item):
119               self.delete_node_child(child)
120               self.after_delete()
121               return 1
122            else :
123               return 0
124         else:
125            if self.item.suppitem(child.item):
126               self.delete_node_child(child)
127               return 1
128            else :
129               return 0
130
131
132 class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
133     """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
134         du noyau Accas instances de la classe MCLIST.
135         Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
136         noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
137         Cette classe délègue les appels de méthode et les accès
138         aux attributs à l'objet du noyau soit manuellement soit 
139         automatiquement (voir classe Delegate et attribut object).
140     """
141     itemNode=Node
142
143     def init(self):
144         # Si l'objet Accas (MCList) a moins d'un mot cle facteur
145         # on utilise directement ce mot cle facteur comme delegue
146         self.updateDelegate()
147
148     def updateDelegate(self):
149         if len(self._object) > 1:
150            self.setdelegate(self._object)
151         else:
152            self.setdelegate(self._object.data[0])
153
154     def panel(self,jdcdisplay,pane,node):
155         """ Retourne une instance de l'objet panneau associe a l'item (self)
156             Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
157             FACTPanel.
158             Si la liste est plus longue on utilise le panneau MCLISTPanel.
159         """
160         if len(self._object) > 1:
161            return MCLISTPanel(jdcdisplay,pane,node)
162         else:
163            return compofact.FACTPanel(jdcdisplay,pane,node)
164
165     def IsExpandable(self):
166         if len(self._object) > 1:
167            return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
168         else:
169            return compofact.FACTTreeItem.IsExpandable(self)
170
171     def GetSubList(self):
172         self.updateDelegate()
173         if len(self._object) <= 1:
174            self._object.data[0].alt_parent=self._object
175            return compofact.FACTTreeItem.GetSubList(self)
176
177         liste=self._object.data
178         sublist=[None]*len(liste)
179         # suppression des items lies aux objets disparus
180         for item in self.sublist:
181            old_obj=item.getObject()
182            if old_obj in liste:
183               pos=liste.index(old_obj)
184               sublist[pos]=item
185            else:
186               pass # objets supprimes ignores
187         # ajout des items lies aux nouveaux objets
188         pos=0
189         for obj in liste:
190            if sublist[pos] is None:
191               # nouvel objet : on cree un nouvel item
192               def setfunction(value, object=obj):
193                   object=value
194               item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
195               sublist[pos]=item
196               #Attention : on ajoute une information supplementaire pour l'actualisation de 
197               # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
198               # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
199               # informations de validite. alt_parent permet de remedier a ce defaut.
200               obj.alt_parent=self._object
201            pos=pos+1
202
203         self.sublist=sublist
204         return self.sublist
205
206     def GetIconName(self):
207         if self._object.isvalid():
208             return "ast-green-los"
209         elif self._object.isoblig():
210             return "ast-red-los"
211         else:
212             return "ast-yel-los"
213
214     def get_docu(self):
215         """ Retourne la clé de doc de l'objet pointé par self """
216         return self.object.get_docu()    
217
218     def iscopiable(self):
219         if len(self._object) > 1:
220            return Objecttreeitem.SequenceTreeItem.iscopiable(self)
221         else:
222            return compofact.FACTTreeItem.iscopiable(self)
223
224     def isMCFact(self):
225         """
226         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
227         """
228         return len(self._object) <= 1
229
230     def isMCList(self):
231         """
232         Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
233         """
234         return len(self._object) > 1
235         
236     def get_copie_objet(self):
237         return self._object.data[0].copy()
238
239     def additem(self,obj,pos):
240         #print "compomclist.additem",obj,pos
241         if len(self._object) <= 1:
242            return compofact.FACTTreeItem.additem(self,obj,pos)
243
244         o= self.object.addentite(obj,pos)
245         return o
246
247     def suppitem(self,item):
248         """
249         Retire un objet MCFACT de la MCList (self.object) 
250         """
251         #print "compomclist.suppitem",item
252         obj=item.getObject()
253         if len(self._object) <= 1:
254            return compofact.FACTTreeItem.suppitem(self,item)
255
256         if self.object.suppentite(obj):
257            if len(self._object) == 1: self.updateDelegate()
258            message = "Mot-clé " + obj.nom + " supprimé"
259            self.appli.affiche_infos(message)
260            return 1
261         else:
262            self.appli.affiche_infos('Impossible de supprimer ce mot-clé')
263            return 0
264
265             
266 import Accas
267 objet = Accas.MCList    
268
269 def treeitem(appli,labeltext,object,setfunction):
270   """ Factory qui produit un objet treeitem adapte a un objet 
271       Accas.MCList (attribut objet de ce module)
272   """
273   return MCListTreeItem(appli,labeltext,object,setfunction)