Salome HOME
CCAR: modifications pour :
[tools/eficas.git] / Editeur / macrodisplay.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 """
22    Ce module contient la classe MacroDisplay qui realise l'affichage 
23    des sous commandes d'une macro sous forme d'arbre
24 """
25 # Modules Python
26 import types
27 import Tkinter,Pmw
28
29 # Modules EFICAS
30 import images
31 import tooltip
32 import Objecttreeitem
33 import compojdc
34 import treewidget
35 from widgets import Fenetre
36
37 class MACRO2TreeItem(compojdc.JDCTreeItem):
38       pass
39
40 class MacroDisplay:
41   def __init__(self,appli,macroitem,nom_jdc):
42     self.fenetre = Tkinter.Toplevel()
43     self.fenetre.configure(width = 800,height=500)
44     self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
45     self.fenetre.title("Visualisation Macro_Etape")
46     self.macroitem=macroitem
47     self.jdc=macroitem.object.jdc_aux
48     self.nom_jdc=nom_jdc
49     self.appli=appli
50     self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
51     self.barre.pack(expand=1,fill=Tkinter.X)
52     if self.macroitem.object.fichier_text is not None:
53       b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
54       b.pack(side='left')
55       tp=tooltip.TOOLTIP(b,"View file")
56     self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
57                                      hull_width=600,
58                                      hull_height=500,
59                                      borderframe=1)
60     self.canvas=self.mainPart.component('canvas')
61     Pmw.Color.changecolor(self.canvas,background='gray95')
62     self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
63     self.item=MACRO2TreeItem(self.appli,nom_jdc,self.jdc)
64     import treewidget
65     self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
66     self.tree.draw()
67
68   def visufile(self):
69     Fenetre(self.appli,titre="Source du fichier inclus",texte=self.macroitem.object.fichier_text)
70
71   def make_rmenu(self,node,event):
72       if hasattr(node.item,'rmenu_specs'):
73          rmenu = Tkinter.Menu(self.canvas, tearoff=0)
74          self.cree_menu(rmenu,node.item.rmenu_specs,node)
75          rmenu.tk_popup(event.x_root,event.y_root)
76
77   def cree_menu(self,menu,itemlist,node):
78       """
79             Ajoute les items du tuple itemlist
80             dans le menu menu
81       """
82       number_item=0
83       radio=None
84       for item in itemlist:
85          number_item=number_item + 1
86          if not item :
87             menu.add_separator()
88          else:
89             label,method=item
90             if type(method) == types.TupleType:
91                  # On a un tuple => on cree une cascade
92                  menu_cascade=Tkinter.Menu(menu)
93                  menu.add_cascade(label=label,menu=menu_cascade)
94                  self.cree_menu(menu_cascade,method,node)
95             elif method[0] == '&':
96                  # On a une chaine avec & en tete => on cree un radiobouton
97                  try:
98                     command=getattr(node.item,method[1:])
99                     menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
100                     if radio == None:radio=number_item
101                  except:pass
102             else:
103                  try:
104                     command=getattr(node.item,method)
105                     menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
106                  except:pass
107       # Si au moins un radiobouton existe on invoke le premier
108       if radio:menu.invoke(radio)
109
110   def quit(self):
111     try:
112        self.macroitem.views.remove(self)
113     except:
114        pass
115     self.fenetre.destroy()
116
117 def makeMacroDisplay(appli,macroitem,nom_item):
118   return MacroDisplay(appli,macroitem,nom_item)
119
120 class TREEITEMINCANVAS:
121    def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
122       #print "TREEITEMINCANVAS",object
123       self.object=object
124       self.nom=nom
125       self.appli=appli
126       self.parent=parent
127
128       self.item=MACRO2TreeItem(self.appli,self.nom,self.object)
129       self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
130       self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
131       if not sel:
132          def sel(event=None):
133             return
134       self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
135       self.tree.draw()
136
137    def mainloop(self):
138       self.parent.mainloop()
139
140    def update(self):
141       """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
142       self.tree.update()
143
144 import jdcdisplay
145
146 class MACRODISPLAY(jdcdisplay.JDCDISPLAY):
147    def __init__(self,jdc,nom_jdc,appli=None,parent=None):
148       #print "MACRODISPLAY",jdc
149       self.jdc=jdc
150       self.nom_jdc=nom_jdc
151       self.fichier=None
152       self.panel_courant=None
153       self.appli=appli
154       self.parent=parent
155       self.node_selected = None
156       self.modified='n'
157
158       self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
159       self.pane.add('treebrowser',min=0.4,size=0.5)
160       self.pane.add('selected',min=0.4)
161       self.pane.pack(expand=1,fill='both')
162       self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
163                  self.appli,self.select_node,self.make_rmenu)
164