Salome HOME
PN : pour prendre en compte le nouveau panneau : UNIQUE_ASSD_Panel_Reel
[tools/eficas.git] / Editeur / uniqueassdpanel.py
1 # -*- coding: utf-8 -*-
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
8 #
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 #
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
17 #
18 #
19 # ======================================================================
20 # Modules Python
21 import string,types,os
22 from Tkinter import *
23 import Pmw
24 from copy import copy,deepcopy
25 import traceback
26
27 # Modules Eficas
28 import Objecttreeitem
29 import prefs
30 import panels
31 import images
32 from widgets import ListeChoix
33 from widgets import FenetreDeSelection
34
35 from Noyau.N_CR import justify_text
36 from utils import substract_list
37
38 # Import des panels
39 from uniquepanel import UNIQUE_Panel
40
41
42 class UNIQUE_ASSD_Panel(UNIQUE_Panel):
43   """
44   Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
45   d'un type dérivé d'ASSD
46   """
47   def valid_valeur_automatique(self):
48       """
49          Réalise la validation d'un concept sans remonter dans le
50          node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
51          Identique à valid_valeur moins appel de self.node.parent.select()
52          On pourrait supposer que le seul concept présent est valide et donc ne pas
53          réaliser tous les tests de vérification.
54       """
55       if self.parent.modified == 'n' : self.parent.init_modif()
56       valeur = self.get_valeur()
57       self.erase_valeur()
58       anc_val = self.node.item.get_valeur()
59       valeur,validite=self.node.item.eval_valeur_item(valeur)
60       test = self.node.item.set_valeur(valeur)
61       if not test :
62           mess = "impossible d'évaluer : %s " %`valeur`
63           self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
64       elif self.node.item.isvalid() :
65           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
66           if self.node.item.get_position()=='global':
67               self.node.etape.verif_all()
68           elif self.node.item.get_position()=='global_jdc':
69               self.node.racine.verif_all()
70           else :
71               self.node.parent.verif()
72           self.node.update()
73       else :
74           cr = self.node.item.get_cr()
75           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
76           self.reset_old_valeur(anc_val,mess=mess)
77
78   def makeValeurPage(self,page,reel="non"):
79       """
80           Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
81           SD de type dérivé d'ASSD
82       """
83       # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
84       # et de la liste des SD du bon type (constituant la liste des choix)
85       bulle_aide=self.get_bulle_aide()
86       aide=self.get_aide()
87       aide= justify_text(texte=aide)
88       liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
89       # Remplissage du panneau
90       self.valeur_choisie = StringVar()
91       self.valeur_choisie.set('')
92       min,max =  self.node.item.GetMinMax()
93       if (min == 1 and min == max and len(liste_noms_sd)==1 ):
94           if self.valeur_choisie.get() != liste_noms_sd[0]:
95             if ('R' not in self.node.item.get_type()) :
96                 self.valeur_choisie.set(liste_noms_sd[0])
97                 self.valid_valeur_automatique()
98          
99       self.frame_valeur = Frame(page)
100       self.frame_valeur.pack(fill='both',expand=1)
101       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
102       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
103       self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
104                                          items=liste_noms_sd,
105                                          labelpos='n',
106                                          label_text="Structures de données du type\n requis par l'objet courant :",
107                                          listbox_height = 6,
108                                          selectioncommand=self.select_valeur_from_list,
109                                          dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
110       self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
111       Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
112       #self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
113       Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
114       # affichage de la valeur courante
115       self.display_valeur()
116       if self.__class__.__name__ == 'UNIQUE_ASSD_Panel_Reel' :
117         Label(self.frame_valeur,text='Valeur Réelle').place(relx=0.1,rely=0.9)
118         self.entry = Entry(self.frame_valeur,relief='sunken')
119         self.entry.place(relx=0.28,rely=0.9,relwidth=0.6)
120         self.entry.bind("<Return>",lambda e,c=self.valid_valeur_reel:c())
121
122
123
124   def get_bulle_aide(self):
125       """
126       Retourne l'aide associée au panneau
127       """
128       return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
129
130   def get_aide(self):
131       """
132       Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
133       """
134       mc = self.node.item.get_definition()
135       try :
136         type = mc.type[0].__name__  
137       except :
138         type = str(mc.type[0])
139       if len(mc.type)>1 :
140           for typ in mc.type[1:] :
141               try :
142                 l=typ.__name__
143               except:
144                 l=str(typ)
145               type = type + ' ou '+l
146       commentaire="Un objet de type "+type+" est attendu"
147       aideval=self.node.item.aide()
148       commentaire=commentaire +"\n"+ aideval
149       return commentaire
150
151     
152   def select_valeur_from_list(self):
153       """
154       Affecte à valeur choisie la sélection courante dans la liste des choix proposée
155       """
156       if len(self.listbox.get()) == 0 : return
157       choix = self.listbox.getcurselection()[0]
158       self.valeur_choisie.set(choix)
159
160   def choose_valeur_from_list(self,command):
161       """
162       Affecte à valeur choisie la sélection courante dans la liste des choix proposée
163       Exécute command
164       """
165       if len(self.listbox.get()) == 0 : return
166       choix = self.listbox.getcurselection()[0]
167       self.valeur_choisie.set(choix)
168       apply(command,(),{})
169
170   def get_valeur(self):
171       """
172       Retourne la valeur donnée par l'utilisateur au MCS
173       """
174       return self.valeur_choisie.get()
175     
176   def display_valeur(self):
177       """
178       Affiche la valeur de l'objet pointé par self
179       """
180       valeur = self.node.item.get_valeur()
181       if valeur == None or valeur == '' : return # pas de valeur à afficher ...
182       self.valeur_choisie.set(valeur.nom)
183
184   def erase_valeur(self):
185       pass
186
187   def appel_make(self,page):
188       self.makeValeurPage(page,reel="oui")
189       
190 class UNIQUE_ASSD_Panel_Reel(UNIQUE_ASSD_Panel):
191  
192   def valid_valeur_reel(self):
193       if self.parent.modified == 'n' : self.parent.init_modif()
194       anc_val = self.node.item.get_valeur()
195       valeurentree = self.entry.get()
196       self.valeur_choisie.set(valeurentree)
197       self.valid_valeur()
198
199   def display_valeur(self):
200       valeur = self.node.item.get_valeur()
201       if valeur == None or valeur == '' : return # pas de valeur à afficher ...
202       if type(valeur) == types.FloatType :
203          self.valeur_choisie.set(valeur)
204       else :
205          self.valeur_choisie.set(valeur.nom)
206
207        
208