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