Salome HOME
PN : pour afficher correctement les arguments de la formule nouvelle.
[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
27 class MCLISTPanel(panels.Panel):
28     def init(self):
29         test_ajout = self.node.item.ajout_possible()
30         nom_mcfact = self.node.item.get_nom()
31         if test_ajout:
32             texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
33         else:
34             texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
35         self.label = Label(self,text = texte)
36         self.label.place(relx=0.5,rely=0.4,anchor='center')
37         if test_ajout:
38             Button(self,text="AJOUTER",command=self.ajout_occurrence).place(relx=0.5,rely=0.6,anchor='center')
39             #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
40
41     def ajout_occurrence(self,event=None):
42         self.node.parent.append_child(self.node.item.get_nom())
43
44
45 import compofact
46 import treewidget
47 class Node(treewidget.Node):
48     def doPaste(self,node_selected):
49         objet_a_copier = self.item.get_copie_objet()
50         child=node_selected.doPaste_MCF(objet_a_copier)
51         return child
52
53     def doPaste_MCF(self,objet_a_copier):
54         if self.item.isMCList() :
55           # le noeud courant est une MCList
56           child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
57         elif self.item.isMCFact():
58           # le noeud courant est un MCFACT
59           if self.parent.item.isMCList():
60              # le noeud selectionne est un MCFACT dans une MCList
61              child = self.parent.append_child(objet_a_copier,
62                                               pos=self.item,
63                                               retour='oui')
64           else:
65              # le noeud MCFACT selectionne n'est pas dans une MCList
66              child = self.parent.append_child(objet_a_copier,retour='oui')
67         else:
68           showinfo("Copie impossible",
69                    "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
70           self.appli.affiche_infos("Copie refusée")
71           child=None
72         return child
73
74     def replace_enfant(self,item):
75         """ Retourne le noeud fils à éventuellement remplacer """
76         if self.item.isMCList():return None
77         return self.get_node_fils(item.get_nom())
78
79     def verif_condition(self):
80         if self.item.isMCList():
81            self.children[-1].verif_condition()
82         else:
83            treewidget.Node.verif_condition(self)
84
85     def after_delete(self):
86         """ Dans le cas d'une MCList il faut vérifier qu'elle n'est pas vide
87             ou réduite à un seul élément suite à une destruction
88         """
89         # self représente une MCList
90         if len(self.item) == 0 :
91             # la liste est vide : il faut la supprimer
92             self.delete()
93         elif len(self.item) == 1:
94             # il ne reste plus qu'un élément dans la liste
95             noeud = self.children[0]
96             # maintenant l'item mclist gere tout seul ce
97             # changement
98             self.delete_node_child(noeud)
99             self.children=noeud.children or []
100             self.state=noeud.state
101         else :
102             return
103
104     def delete_child(self,child):
105         """
106             Supprime child des enfants de self, tous les id associés
107             ET l'objet associé
108         """
109         if self.item.isMCList():
110            if self.item.suppitem(child.item):
111               self.delete_node_child(child)
112               self.after_delete()
113               return 1
114            else :
115               return 0
116         else:
117            if self.item.suppitem(child.item):
118               self.delete_node_child(child)
119               return 1
120            else :
121               return 0
122
123
124 class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
125     """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
126         du noyau Accas instances de la classe MCLIST.
127         Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
128         noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
129         Cette classe délègue les appels de méthode et les accès
130         aux attributs à l'objet du noyau soit manuellement soit 
131         automatiquement (voir classe Delegate et attribut object).
132     """
133     itemNode=Node
134
135     def init(self):
136         # Si l'objet Accas (MCList) a moins d'un mot cle facteur
137         # on utilise directement ce mot cle facteur comme delegue
138         self.updateDelegate()
139
140     def updateDelegate(self):
141         if len(self._object) > 1:
142            self.setdelegate(self._object)
143         else:
144            self.setdelegate(self._object.data[0])
145
146     def panel(self,jdcdisplay,pane,node):
147         """ Retourne une instance de l'objet panneau associe a l'item (self)
148             Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
149             FACTPanel.
150             Si la liste est plus longue on utilise le panneau MCLISTPanel.
151         """
152         if len(self._object) > 1:
153            return MCLISTPanel(jdcdisplay,pane,node)
154         else:
155            return compofact.FACTPanel(jdcdisplay,pane,node)
156
157     def IsExpandable(self):
158         if len(self._object) > 1:
159            return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
160         else:
161            return compofact.FACTTreeItem.IsExpandable(self)
162
163     def GetSubList(self):
164         self.updateDelegate()
165         if len(self._object) > 1:
166            return Objecttreeitem.SequenceTreeItem.GetSubList(self)
167         else:
168            return compofact.FACTTreeItem.GetSubList(self)
169
170     def GetIconName(self):
171         if self._object.isvalid():
172             return "ast-green-los"
173         elif self._object.isoblig():
174             return "ast-red-los"
175         else:
176             return "ast-yel-los"
177
178     def get_docu(self):
179         """ Retourne la clé de doc de l'objet pointé par self """
180         return self.object.get_docu()    
181
182     def iscopiable(self):
183         if len(self._object) > 1:
184            return Objecttreeitem.SequenceTreeItem.iscopiable(self)
185         else:
186            return compofact.FACTTreeItem.iscopiable(self)
187
188     def isMCFact(self):
189         """
190         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
191         """
192         return len(self._object) <= 1
193
194     def isMCList(self):
195         """
196         Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
197         """
198         return len(self._object) > 1
199         
200     def additem(self,obj,pos):
201         """
202         Ajoute un objet MCFACT à la MCList (self.object) à la position pos
203         """
204         if len(self._object) <= 1:
205            return compofact.FACTTreeItem.additem(self,obj,pos)
206
207         if type(obj)==types.StringType :
208           # on est en mode création d'un motcle
209           raise "traitement non prevu"
210
211         if not self._object.ajout_possible():
212            return None
213
214         if self._object.nom != obj.nom:
215            return None
216
217         self.object.init_modif()
218         obj.verif_existence_sd()
219         obj.reparent(self.object.parent)
220         self.object.insert(pos,obj)
221         self.object.fin_modif()
222
223         item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
224         return item  
225
226     def suppitem(self,item):
227         """
228         Retire un objet MCFACT de la MCList (self.object) 
229         """
230         obj=item.getObject()
231         if len(self._object) <= 1:
232            return compofact.FACTTreeItem.suppitem(self,item)
233
234         self.object.init_modif()
235         self.object.remove(obj)
236         if len(self._object) == 1:
237            self.updateDelegate()
238         message = "Mot-clé " + obj.nom + " supprimé"
239         self.appli.affiche_infos(message)
240         return 1
241             
242 import Accas
243 objet = Accas.MCList    
244
245 def treeitem(appli,labeltext,object,setfunction):
246   """ Factory qui produit un objet treeitem adapte a un objet 
247       Accas.MCList (attribut objet de ce module)
248   """
249   return MCListTreeItem(appli,labeltext,object,setfunction)