Salome HOME
CCAR: correction edition include avec fichier inexistant
[tools/eficas.git] / Editeur / jdcdisplay.py
index 0dba7773a5d3fd38d60c7584ee7bbac309ddf1e1..863c5b61024944fa1f38712ddb27693b706ecdb2 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
    les informations attachées au noeud de l'arbre sélectionné
 """
 # Modules Python
+import types
+import traceback
 import Tkinter
 import Pmw
 
 # Modules Eficas
 import panels
 from treeitemincanvas import TREEITEMINCANVAS
-from tkMessageBox import showinfo,showerror
+from widgets import showinfo,showerror
 
 class CONFIG:
    isdeveloppeur='NON'
@@ -72,11 +75,51 @@ class JDCDISPLAY:
       self.modified='n'
 
       self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
-      self.pane.add('treebrowser',min=0.4)
+      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,n=node:c(a,n))
+                    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,n=node:c(a,n))
+                 except:pass
+      # Si au moins un radiobouton existe on invoke le premier
+      if radio:menu.invoke(radio)
 
    def select_node(self,node):
       """
@@ -86,12 +129,13 @@ class JDCDISPLAY:
       """
       if node is not self.node_selected :
          self.create_panel(node)
-      # on conserve la trace du noeud sélectionné et de celui d'avant
-      if self.node_selected :
-          self.ancien_node = self.node_selected
-          self.node_selected = node
-      else:
-          self.ancien_node = self.node_selected = node
+      self.node_selected = node
+      ## on conserve la trace du noeud sélectionné et de celui d'avant
+      #if self.node_selected :
+          #self.ancien_node = self.node_selected
+          #self.node_selected = node
+      #else:
+          #self.ancien_node = self.node_selected = node
 
    def create_panel(self,node):
       """
@@ -115,6 +159,9 @@ class JDCDISPLAY:
              z.show_stats()
              z.show_cycles()
 
+      if node is None:
+          self.panel_courant=None
+          return self.panel_courant
 
       if node.item.isactif():
           if hasattr(node.item,"panel"):
@@ -155,9 +202,10 @@ class JDCDISPLAY:
       else:
           self.init_modif()
           node.delete()
-          if nom_sd:
-              child.item.nomme_sd(nom_sd)
-          child.update()
+          #if nom_sd:
+              #child.item.nomme_sd(nom_sd)
+          child.select()
+          #child.update()
 
    def doCut(self):
       """
@@ -186,82 +234,38 @@ class JDCDISPLAY:
       Lance la copie de l'objet placé dans self.appli.noeud_a_editer
       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','FORM_ETAPE'):
-          self.doPaste_Commande(objet_a_copier)
-      elif objet_a_copier.__class__.__name__ == "MCFACT":
-          self.doPaste_MCF(objet_a_copier)
-      else:
-          showinfo("Copie impossible",
-                   "Vous ne pouvez copier que des commandes ou des mots-clés facteurs !")
-          return
+      try:
+         child=self.appli.noeud_a_editer.doPaste(self.node_selected)
+      except:
+         traceback.print_exc()
+         showinfo("Action de coller impossible",
+                  "L'action de coller apres un tel objet n'est pas permise")
+         return
 
-   def doPaste_Commande(self,objet_a_copier):
-      """
-          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,pos='first',
-                                                     retour='oui')
-      else:
-          showinfo("Copie impossible",
-                   "Vous ne pouvez coller la commande copiée à ce niveau de l'arborescence !")
-          self.appli.affiche_infos("Copie refusée")
-          return
-      # il faut déclarer le JDCDisplay_courant modifié
-      self.init_modif()
-      # suppression éventuelle du noeud sélectionné
-      if self.edit == "couper":
-          self.appli.noeud_a_editer.delete()
       if child == 0:
-          # la copie est impossible
           if self.appli.message != '':
-              showerror("Copie refusée",self.appli.message)
-              self.appli.message = ''
-          self.appli.affiche_infos("Copie refusée")
-      # on rend la copie à nouveau possible en libérant le flag edit
-      self.edit="copier"
-
-   def doPaste_MCF(self,objet_a_copier):
-      """
-      Réalise la copie de l'objet passé en argument qui est nécessairement un MCF
-      """
-      if self.node_selected.item.isCommande() :
-          # le noeud courant est une ETAPE
-          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,pos='first',retour='oui')
-      elif self.node_selected.item.isMCFact():
-          # le noeud courant est un MCFACT
-          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 !")
+             showerror("Copie refusée",self.appli.message)
+             self.appli.message = ''
           self.appli.affiche_infos("Copie refusée")
           return
+
       # il faut déclarer le JDCDisplay_courant modifié
       self.init_modif()
       # suppression éventuelle du noeud sélectionné
+      # si possible on renomme l objet comme le noeud couper
       if self.edit == "couper":
-          self.appli.noeud_a_editer.delete()
-      if child == 0:
-          if self.appli.message != '':
-              showerror("Copie refusée",self.appli.message)
-              self.appli.message = ''
-          self.appli.affiche_infos("Copie refusée")
+         #nom = self.appli.noeud_a_editer.item.object.sd.nom
+         item=self.appli.noeud_a_editer.item
+         self.appli.noeud_a_editer.delete()
+         child.item.update(item)
+        #test,mess = child.item.nomme_sd(nom)
+         child.select()
       # 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()
+