Salome HOME
PN : print enleve
[tools/eficas.git] / Editeur / macrodisplay.py
1 #            CONFIGURATION MANAGEMENT OF EDF VERSION
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 """
21    Ce module contient la classe MacroDisplay qui realise l'affichage 
22    des sous commandes d'une macro sous forme d'arbre
23 """
24 # Modules Python
25 import types
26 import Tkinter,Pmw
27
28 # Modules EFICAS
29 import images
30 import tooltip
31 import Objecttreeitem
32 from widgets import Fenetre
33
34 class MACRO2TreeItem(Objecttreeitem.ObjectTreeItem):
35   def IsExpandable(self):
36     return 1
37
38   def GetText(self):
39       return  "    "
40
41   def GetIconName(self):
42     if self.object.isvalid():
43       return "ast-green-square"
44     else:
45       return "ast-red-square"
46
47   def keys(self):
48     return range(len(self.object.etapes))
49
50   def GetSubList(self):
51     sublist=[]
52     for key in self.keys():
53       liste = self.object.etapes
54       try:
55         value = liste[key]
56       except KeyError:
57         continue
58       def setfunction(value, key=key, object=liste):
59         object[key] = value
60       item = self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
61       sublist.append(item)
62     return sublist
63
64   def verif_condition_bloc(self):
65       # retourne la liste des sous-items dont la condition est valide
66       # sans objet pour le JDC
67       return [],[]
68
69   def get_l_noms_etapes(self):
70       """ Retourne la liste des noms des étapes de self.object"""
71       return self.object.get_l_noms_etapes()
72
73 class MacroDisplay:
74   def __init__(self,appli,jdc,nom_jdc):
75     self.fenetre = Tkinter.Toplevel()
76     self.fenetre.configure(width = 800,height=500)
77     self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
78     self.fenetre.title("Visualisation Macro_Etape")
79     self.jdc=jdc
80     self.nom_jdc=nom_jdc
81     self.appli=appli
82     self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
83     self.barre.pack(expand=1,fill=Tkinter.X)
84     if self.jdc.fichier_text is not None:
85       b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
86       b.pack(side='left')
87       tp=tooltip.TOOLTIP(b,"View file")
88     self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
89                                      hull_width=600,
90                                      hull_height=500,
91                                      borderframe=1)
92     self.canvas=self.mainPart.component('canvas')
93     Pmw.Color.changecolor(self.canvas,background='gray95')
94     self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
95     self.item=MACRO2TreeItem(self.appli,nom_jdc,jdc)
96     import treewidget
97     self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
98     self.tree.draw()
99
100   def visufile(self):
101     Fenetre(self.appli,titre="Source du fichier inclus",texte=self.jdc.fichier_text)
102
103   def make_rmenu(self,node,event):
104       if hasattr(node.item,'rmenu_specs'):
105          rmenu = Tkinter.Menu(self.canvas, tearoff=0)
106          self.cree_menu(rmenu,node.item.rmenu_specs,node)
107          rmenu.tk_popup(event.x_root,event.y_root)
108
109   def cree_menu(self,menu,itemlist,node):
110       """
111             Ajoute les items du tuple itemlist
112             dans le menu menu
113       """
114       number_item=0
115       radio=None
116       for item in itemlist:
117          number_item=number_item + 1
118          if not item :
119             menu.add_separator()
120          else:
121             label,method=item
122             if type(method) == types.TupleType:
123                  # On a un tuple => on cree une cascade
124                  menu_cascade=Tkinter.Menu(menu)
125                  menu.add_cascade(label=label,menu=menu_cascade)
126                  self.cree_menu(menu_cascade,method,node)
127             elif method[0] == '&':
128                  # On a une chaine avec & en tete => on cree un radiobouton
129                  try:
130                     command=getattr(node.item,method[1:])
131                     menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command:c(a))
132                     if radio == None:radio=number_item
133                  except:pass
134             else:
135                  try:
136                     command=getattr(node.item,method)
137                     menu.add_command(label=label,command=lambda a=self.appli,c=command:c(a))
138                  except:pass
139       # Si au moins un radiobouton existe on invoke le premier
140       if radio:menu.invoke(radio)
141
142   def quit(self):
143     self.fenetre.destroy()
144
145 def makeMacroDisplay(appli,jdc,nom_jdc):
146   return MacroDisplay(appli,jdc,nom_jdc)
147