+# CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
"""
Ce module contient la classe JDCDISPLAY qui réalise l'affichage
du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
les informations attachées au noeud de l'arbre sélectionné
"""
# Modules Python
+import types
import Tkinter
import Pmw
self.jdc=jdc
self.nom_jdc=nom_jdc
self.fichier=None
+ self.panel_courant=None
if not appli:
class Appli:
self.modified='n'
self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
- self.pane.add('treebrowser',min=0.5)
- self.pane.add('selected',min=0.5)
+ self.pane.add('treebrowser',min=0.4,size=0.5)
+ self.pane.add('selected',min=0.4)
self.pane.pack(expand=1,fill='both')
self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
- self.appli,self.select_node)
+ self.appli,self.select_node,self.make_rmenu)
+
+ def make_rmenu(self,node,event):
+ if hasattr(node.item,'rmenu_specs'):
+ rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
+ #node.select()
+ self.cree_menu(rmenu,node.item.rmenu_specs,node)
+ rmenu.tk_popup(event.x_root,event.y_root)
+
+ def cree_menu(self,menu,itemlist,node):
+ """
+ Ajoute les items du tuple itemlist
+ dans le menu menu
+ """
+ number_item=0
+ radio=None
+ for item in itemlist:
+ number_item=number_item + 1
+ if not item :
+ menu.add_separator()
+ else:
+ label,method=item
+ if type(method) == types.TupleType:
+ # On a un tuple => on cree une cascade
+ menu_cascade=Tkinter.Menu(menu)
+ menu.add_cascade(label=label,menu=menu_cascade)
+ self.cree_menu(menu_cascade,method,node)
+ elif method[0] == '&':
+ # On a une chaine avec & en tete => on cree un radiobouton
+ try:
+ command=getattr(node.item,method[1:])
+ menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command:c(a))
+ if radio == None:radio=number_item
+ except:pass
+ else:
+ try:
+ command=getattr(node.item,method)
+ menu.add_command(label=label,command=lambda a=self.appli,c=command:c(a))
+ except:pass
+ # Si au moins un radiobouton existe on invoke le premier
+ if radio:menu.invoke(radio)
def select_node(self,node):
"""
Lance la génération du panneau contextuel de l'objet sélectionné
dans l'arbre
"""
+ if self.panel_courant:
+ # On detruit le panneau
+ self.panel_courant.destroy()
+ o=self.panel_courant
+ self.panel_courant=None
+ # Mettre à 1 pour verifier les cycles entre objets
+ # pour les panneaux
+ withCyclops=0
+ if withCyclops:
+ from Misc import Cyclops
+ z = Cyclops.CycleFinder()
+ z.register(o)
+ del o
+ z.find_cycles()
+ z.show_stats()
+ z.show_cycles()
+
+
if node.item.isactif():
if hasattr(node.item,"panel"):
- return node.item.panel(self,self.pane.pane('selected'),node)
+ self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
else:
raise Exception("Le noeud sélectionné n'a pas de panel associé")
else:
- return panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+ self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+ return self.panel_courant
def init_modif(self):
"""
Ne permet que la copie d'objets de type Commande ou MCF
"""
objet_a_copier = self.appli.noeud_a_editer.item.get_copie_objet()
- if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE'):
+ if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE','FORM_ETAPE'):
self.doPaste_Commande(objet_a_copier)
elif objet_a_copier.__class__.__name__ == "MCFACT":
self.doPaste_MCF(objet_a_copier)
def doPaste_Commande(self,objet_a_copier):
"""
- Réalise la copie de l'objet passé en argument qui est nécessairement une commande
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
"""
# il faut vérifier que le noeud sélectionné (noeud courant) est bien
# une commande ou un JDC sinon la copie est impossible ...
if self.node_selected.item.isCommande() :
child = self.node_selected.append_brother(objet_a_copier,retour='oui')
elif self.node_selected.item.isJdc() :
- child = self.node_selected.append_child(objet_a_copier,retour='oui')
+ child = self.node_selected.append_child(objet_a_copier,pos='first',
+ retour='oui')
else:
showinfo("Copie impossible",
"Vous ne pouvez coller la commande copiée à ce niveau de l'arborescence !")
child = self.node_selected.append_child(objet_a_copier,retour='oui')
elif self.node_selected.item.isMCList() :
# le noeud courant est une MCList
- child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
+ child = self.node_selected.parent.append_child(objet_a_copier,pos='first',retour='oui')
elif self.node_selected.item.isMCFact():
# le noeud courant est un MCFACT
- child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
+ if self.node_selected.parent.item.isMCList():
+ # le noeud selectionne est un MCFACT dans une MCList
+ child = self.node_selected.parent.append_child(objet_a_copier,
+ pos=self.node_selected.item,
+ retour='oui')
+ else:
+ # le noeud MCFACT selectionne n'est pas dans une MCList
+ child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
else:
showinfo("Copie impossible",
"Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
# on rend la copie à nouveau possible en libérant le flag edit
self.edit="copier"
+ def update(self):
+ """Cette methode est utilisee par le JDC associe pour
+ signaler des modifications globales du JDC
+ """
+ self.tree.update()
+