IDEFrame.py
branch1.1 Korean release
changeset 1280 72a826dfcfbb
parent 1243 e77c95c4c7fc
child 1296 5f8e02717560
equal deleted inserted replaced
977:c8e008b8cefe 1280:72a826dfcfbb
    20 from editors.Viewer import Viewer, ZOOM_FACTORS
    20 from editors.Viewer import Viewer, ZOOM_FACTORS
    21 from editors.GraphicViewer import GraphicViewer
    21 from editors.GraphicViewer import GraphicViewer
    22 from editors.ResourceEditor import ConfigurationEditor, ResourceEditor
    22 from editors.ResourceEditor import ConfigurationEditor, ResourceEditor
    23 from editors.DataTypeEditor import DataTypeEditor
    23 from editors.DataTypeEditor import DataTypeEditor
    24 from PLCControler import *
    24 from PLCControler import *
    25 from controls import CustomTree, LibraryPanel, PouInstanceVariablesPanel, DebugVariablePanel, SearchResultPanel
    25 from controls import CustomTree, LibraryPanel, PouInstanceVariablesPanel, SearchResultPanel
       
    26 from controls.DebugVariablePanel import DebugVariablePanel
    26 from dialogs import ProjectDialog, PouDialog, PouTransitionDialog, PouActionDialog, FindInPouDialog, SearchInProjectDialog
    27 from dialogs import ProjectDialog, PouDialog, PouTransitionDialog, PouActionDialog, FindInPouDialog, SearchInProjectDialog
    27 from util.BitmapLibrary import GetBitmap
    28 from util.BitmapLibrary import GetBitmap
    28 
    29 
    29 # Define PLCOpenEditor controls id
    30 # Define PLCOpenEditor controls id
    30 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
    31 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   208     return ShortcutKeyFunction
   209     return ShortcutKeyFunction
   209 
   210 
   210 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   211 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   211     def DeleteElementFunction(self, selected):
   212     def DeleteElementFunction(self, selected):
   212         name = self.ProjectTree.GetItemText(selected)
   213         name = self.ProjectTree.GetItemText(selected)
   213         if check_function is None or not check_function(self.Controler, name):
   214         if check_function is None or check_function(name):
   214             if parent_type is not None:
   215             if parent_type is not None:
   215                 item_infos = self.ProjectTree.GetPyData(selected)
   216                 item_infos = self.ProjectTree.GetPyData(selected)
   216                 parent_name = item_infos["tagname"].split("::")[1]
   217                 parent_name = item_infos["tagname"].split("::")[1]
   217                 remove_function(self.Controler, parent_name, name)
   218                 remove_function(self.Controler, parent_name, name)
   218             else:
   219             else:
   219                 remove_function(self.Controler, name)
   220                 remove_function(self.Controler, name)
   220         else:
       
   221             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
       
   222     return DeleteElementFunction
   221     return DeleteElementFunction
   223 
   222 
   224 if wx.Platform == '__WXMSW__':
   223 if wx.Platform == '__WXMSW__':
   225     TAB_BORDER = 6
   224     TAB_BORDER = 6
   226     NOTEBOOK_BORDER = 6
   225     NOTEBOOK_BORDER = 6
   305 #-------------------------------------------------------------------------------
   304 #-------------------------------------------------------------------------------
   306 
   305 
   307 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   306 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   308 
   307 
   309 class IDEFrame(wx.Frame):
   308 class IDEFrame(wx.Frame):
   310     
       
   311     Starting = False
       
   312     
   309     
   313     # Compatibility function for wx versions < 2.6
   310     # Compatibility function for wx versions < 2.6
   314     if wx.VERSION < (2, 6, 0):
   311     if wx.VERSION < (2, 6, 0):
   315         def Bind(self, event, function, id = None):
   312         def Bind(self, event, function, id = None):
   316             if id is not None:
   313             if id is not None:
   455         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   452         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   456               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   453               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   457               style=wx.DEFAULT_FRAME_STYLE)
   454               style=wx.DEFAULT_FRAME_STYLE)
   458         self.SetClientSize(wx.Size(1000, 600))
   455         self.SetClientSize(wx.Size(1000, 600))
   459         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
   456         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
   460         self.Bind(wx.EVT_SIZE, self.OnResize)
       
   461         
   457         
   462         self.TabsImageList = wx.ImageList(31, 16)
   458         self.TabsImageList = wx.ImageList(31, 16)
   463         self.TabsImageListIndexes = {}
   459         self.TabsImageListIndexes = {}
   464         
   460         
   465         #-----------------------------------------------------------------------
   461         #-----------------------------------------------------------------------
   524                   size=wx.Size(0, 0), style=wx.SP_3D)
   520                   size=wx.Size(0, 0), style=wx.SP_3D)
   525         
   521         
   526         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   522         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   527                   name='ProjectTree', parent=self.ProjectPanel, 
   523                   name='ProjectTree', parent=self.ProjectPanel, 
   528                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   524                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   529                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   525                   style=wx.SUNKEN_BORDER,
       
   526                   agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS)
   530         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   527         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   531                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   528                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   532         add_menu = wx.Menu()
   529         add_menu = wx.Menu()
   533         self._init_coll_AddMenu_Items(add_menu)
   530         self._init_coll_AddMenu_Items(add_menu)
   534         self.ProjectTree.SetAddMenu(add_menu)
   531         self.ProjectTree.SetAddMenu(add_menu)
   535         if wx.Platform == '__WXMSW__':
   532         self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
   536             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
   533               id=ID_PLCOPENEDITORPROJECTTREE)
   537                   id=ID_PLCOPENEDITORPROJECTTREE)
   534         self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
   538             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected,
   535         self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
   539                   id=ID_PLCOPENEDITORPROJECTTREE)
   536               id=ID_PLCOPENEDITORPROJECTTREE)
   540         else:
       
   541             self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
       
   542             self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
       
   543             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
       
   544                   id=ID_PLCOPENEDITORPROJECTTREE)
       
   545         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
   537         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
   546               id=ID_PLCOPENEDITORPROJECTTREE)
   538               id=ID_PLCOPENEDITORPROJECTTREE)
   547         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
   539         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
   548               id=ID_PLCOPENEDITORPROJECTTREE)
   540               id=ID_PLCOPENEDITORPROJECTTREE)
   549         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
   541         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
   550               id=ID_PLCOPENEDITORPROJECTTREE)
   542               id=ID_PLCOPENEDITORPROJECTTREE)
   551         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
   543         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
   552               id=ID_PLCOPENEDITORPROJECTTREE)
   544               id=ID_PLCOPENEDITORPROJECTTREE)
       
   545         self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion)
   553         
   546         
   554         #-----------------------------------------------------------------------
   547         #-----------------------------------------------------------------------
   555         #        Creating PLCopen Project POU Instance Variables Panel
   548         #        Creating PLCopen Project POU Instance Variables Panel
   556         #-----------------------------------------------------------------------
   549         #-----------------------------------------------------------------------
   557         
   550         
   675         self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList)
   668         self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList)
   676         
   669         
   677         self.CurrentEditorToolBar = []
   670         self.CurrentEditorToolBar = []
   678         self.CurrentMenu = None
   671         self.CurrentMenu = None
   679         self.SelectedItem = None
   672         self.SelectedItem = None
       
   673         self.LastToolTipItem = None
   680         self.SearchParams = None
   674         self.SearchParams = None
   681         self.Highlights = {}
   675         self.Highlights = {}
   682         self.DrawingMode = FREEDRAWING_MODE
   676         self.DrawingMode = FREEDRAWING_MODE
   683         #self.DrawingMode = DRIVENDRAWING_MODE
   677         #self.DrawingMode = DRIVENDRAWING_MODE
   684         self.AuiTabCtrl = []
   678         self.AuiTabCtrl = []
   685         self.DefaultPerspective = None
   679         
       
   680         # Save default perspective
       
   681         notebooks = {}
       
   682         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   683                                      (self.BottomNoteBook, "bottomnotebook"),
       
   684                                      (self.RightNoteBook, "rightnotebook")]:
       
   685             notebooks[entry_name] = self.SaveTabLayout(notebook)
       
   686         self.DefaultPerspective = {
       
   687             "perspective": self.AUIManager.SavePerspective(),
       
   688             "notebooks": notebooks,
       
   689         }
       
   690         
   686         
   691         
   687         # Initialize Printing configuring elements
   692         # Initialize Printing configuring elements
   688         self.PrintData = wx.PrintData()
   693         self.PrintData = wx.PrintData()
   689         self.PrintData.SetPaperId(wx.PAPER_A4)
   694         self.PrintData.SetPaperId(wx.PAPER_A4)
   690         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   695         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   691         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   696         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   692         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   697         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   693         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   698         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   694         
   699         
   695         self.SetRefreshFunctions()
   700         self.SetRefreshFunctions()
       
   701         self.SetDeleteFunctions()
   696     
   702     
   697     def __del__(self):
   703     def __del__(self):
   698         self.FindDialog.Destroy()
   704         self.FindDialog.Destroy()
   699     
       
   700     def ResetStarting(self):
       
   701         self.Starting = False
       
   702     
   705     
   703     def Show(self):
   706     def Show(self):
   704         wx.Frame.Show(self)
   707         wx.Frame.Show(self)
   705         wx.CallAfter(self.RestoreLastState)
   708         wx.CallAfter(self.RestoreLastState)
   706     
   709     
   707     def OnActivated(self, event):
   710     def OnActivated(self, event):
   708         if event.GetActive():
   711         if event.GetActive():
   709             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   712             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   710         event.Skip()
   713         event.Skip()
   711 
   714 
       
   715     def SelectTab(self, tab):
       
   716         for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
   717             idx = notebook.GetPageIndex(tab)
       
   718             if idx != wx.NOT_FOUND and idx != notebook.GetSelection():
       
   719                 notebook.SetSelection(idx)
       
   720                 return
       
   721 
   712 #-------------------------------------------------------------------------------
   722 #-------------------------------------------------------------------------------
   713 #                Saving and restoring frame organization functions
   723 #                Saving and restoring frame organization functions
   714 #-------------------------------------------------------------------------------
   724 #-------------------------------------------------------------------------------
   715 
   725 
   716     def OnResize(self, event):
       
   717         if self.Starting:
       
   718             self.RestoreLastLayout()
       
   719         event.Skip()
       
   720     
       
   721     def EnableSaveProjectState(self):
       
   722         return False
       
   723     
       
   724     def GetProjectConfiguration(self):
       
   725         projects = {}
       
   726         try:
       
   727             if self.Config.HasEntry("projects"):
       
   728                 projects = cPickle.loads(str(self.Config.Read("projects")))
       
   729         except:
       
   730             pass
       
   731         
       
   732         return projects.get(
       
   733             EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {})
       
   734     
       
   735     def SavePageState(self, page):
       
   736         state = page.GetState()
       
   737         if state is not None:
       
   738             if self.Config.HasEntry("projects"):
       
   739                 projects = cPickle.loads(str(self.Config.Read("projects")))
       
   740             else:
       
   741                 projects = {}
       
   742             
       
   743             project_infos = projects.setdefault(
       
   744                  EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {})
       
   745             editors_state = project_infos.setdefault("editors_state", {})
       
   746             
       
   747             if page.IsDebugging():
       
   748                 editors_state[page.GetInstancePath()] = state
       
   749             else:
       
   750                 editors_state[page.GetTagName()] = state
       
   751             
       
   752             self.Config.Write("projects", cPickle.dumps(projects))
       
   753             self.Config.Flush()
       
   754     
       
   755     def GetTabInfos(self, tab):
   726     def GetTabInfos(self, tab):
   756         if isinstance(tab, EditorPanel):
   727         for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
   757             if tab.IsDebugging():
   728             if page_ref == tab:
   758                 return ("debug", tab.GetInstancePath())
   729                 return ("main", page_name)
   759             else:
       
   760                 return ("editor", tab.GetTagName())
       
   761         else:
       
   762             for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
       
   763                 if page_ref == tab:
       
   764                     return ("main", page_name)
       
   765         return None
   730         return None
   766     
   731     
   767     def SaveTabLayout(self, notebook):
   732     def SaveTabLayout(self, notebook):
   768         tabs = []
   733         tabs = []
   769         for child in notebook.GetChildren():
   734         for child in notebook.GetChildren():
   852     def RestoreLastState(self):
   817     def RestoreLastState(self):
   853         frame_size = None
   818         frame_size = None
   854         if self.Config.HasEntry("framesize"):
   819         if self.Config.HasEntry("framesize"):
   855             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   820             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   856         
   821         
   857         self.Starting = True
       
   858         if frame_size is None:
   822         if frame_size is None:
   859             self.Maximize()
   823             self.Maximize()
   860         else:
   824         else:
   861             self.SetClientSize(frame_size)
   825             self.SetClientSize(frame_size)
   862             wx.CallAfter(self.RestoreLastLayout)
   826         
   863         
       
   864     def RestoreLastLayout(self):
       
   865         notebooks = {}
       
   866         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   867                                      (self.BottomNoteBook, "bottomnotebook"),
       
   868                                      (self.RightNoteBook, "rightnotebook")]:
       
   869             notebooks[entry_name] = self.SaveTabLayout(notebook)
       
   870         self.DefaultPerspective = {
       
   871             "perspective": self.AUIManager.SavePerspective(),
       
   872             "notebooks": notebooks,
       
   873         }
       
   874         
       
   875         try:
       
   876             if self.Config.HasEntry("perspective"):
       
   877                 self.AUIManager.LoadPerspective(unicode(self.Config.Read("perspective")))
       
   878         
       
   879             if self.Config.HasEntry("notebooks"):
       
   880                 notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
       
   881                 
       
   882                 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
   883                     for idx in xrange(notebook.GetPageCount()):
       
   884                         notebook.RemovePage(0)
       
   885                         
       
   886                 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   887                                              (self.BottomNoteBook, "bottomnotebook"),
       
   888                                              (self.RightNoteBook, "rightnotebook")]:
       
   889                     self.LoadTabLayout(notebook, notebooks.get(entry_name))
       
   890         except:
       
   891             self.ResetPerspective()
       
   892         
       
   893         if self.EnableSaveProjectState():
       
   894             self.LoadProjectLayout()
       
   895         
       
   896         self._Refresh(EDITORTOOLBAR)
       
   897         
       
   898         if wx.Platform == '__WXMSW__':
       
   899             wx.CallAfter(self.ResetStarting)
       
   900         else:
       
   901             self.ResetStarting()
       
   902         wx.CallAfter(self.RefreshEditor)
       
   903     
       
   904     def SaveLastState(self):
   827     def SaveLastState(self):
   905         if not self.IsMaximized():
   828         if not self.IsMaximized():
   906             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   829             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   907         elif self.Config.HasEntry("framesize"):
   830         elif self.Config.HasEntry("framesize"):
   908             self.Config.DeleteEntry("framesize")
   831             self.Config.DeleteEntry("framesize")
   909         
   832         
   910         notebooks = {}
       
   911         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   912                                      (self.BottomNoteBook, "bottomnotebook"),
       
   913                                      (self.RightNoteBook, "rightnotebook")]:
       
   914             notebooks[entry_name] = self.SaveTabLayout(notebook)
       
   915         self.Config.Write("notebooks", cPickle.dumps(notebooks))
       
   916         
       
   917         pane = self.AUIManager.GetPane(self.TabsOpened)
       
   918         if pane.IsMaximized():
       
   919             self.AUIManager.RestorePane(pane)
       
   920         self.Config.Write("perspective", self.AUIManager.SavePerspective())
       
   921         
       
   922         if self.EnableSaveProjectState():
       
   923             self.SaveProjectLayout()
       
   924         
       
   925             for i in xrange(self.TabsOpened.GetPageCount()):
       
   926                 self.SavePageState(self.TabsOpened.GetPage(i))
       
   927         
       
   928         self.Config.Flush()
   833         self.Config.Flush()
   929 
   834 
   930     def SaveProjectLayout(self):
       
   931         if self.Controler is not None:
       
   932             tabs = []
       
   933             
       
   934             projects = {}
       
   935             try:
       
   936                  if self.Config.HasEntry("projects"):
       
   937                     projects = cPickle.loads(str(self.Config.Read("projects")))
       
   938             except:
       
   939                 pass
       
   940             
       
   941             project_infos = projects.setdefault(
       
   942                  EncodeFileSystemPath(os.path.realpath(self.Controler.GetFilePath())), {})
       
   943             project_infos["tabs"] = self.SaveTabLayout(self.TabsOpened)
       
   944             if self.EnableDebug:
       
   945                 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables()
       
   946                 
       
   947             self.Config.Write("projects", cPickle.dumps(projects))
       
   948             self.Config.Flush()
       
   949     
       
   950     def LoadProjectLayout(self):
       
   951         if self.Controler is not None:
       
   952             project = self.GetProjectConfiguration()
       
   953             
       
   954             try:
       
   955                 if project.has_key("tabs"):
       
   956                     self.LoadTabLayout(self.TabsOpened, project["tabs"])
       
   957             except:
       
   958                 self.DeleteAllPages()
       
   959                 
       
   960             if self.EnableDebug:
       
   961                 #try:
       
   962                 self.DebugVariablePanel.SetDebugVariables(project.get("debug_vars", []))
       
   963                 #except:
       
   964                 #    self.DebugVariablePanel.ResetView()
       
   965             
       
   966 #-------------------------------------------------------------------------------
   835 #-------------------------------------------------------------------------------
   967 #                               General Functions
   836 #                               General Functions
   968 #-------------------------------------------------------------------------------
   837 #-------------------------------------------------------------------------------
   969 
   838 
   970     def SetRefreshFunctions(self):
   839     def SetRefreshFunctions(self):
   996         selected = self.TabsOpened.GetSelection()
   865         selected = self.TabsOpened.GetSelection()
   997         if selected > -1:
   866         if selected > -1:
   998             window = self.TabsOpened.GetPage(selected)
   867             window = self.TabsOpened.GetPage(selected)
   999             
   868             
  1000             if window.CheckSaveBeforeClosing():
   869             if window.CheckSaveBeforeClosing():
  1001                 if self.EnableSaveProjectState():
       
  1002                     self.SavePageState(window)
       
  1003                 
   870                 
  1004                 # Refresh all window elements that have changed
   871                 # Refresh all window elements that have changed
  1005                 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   872                 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
  1006                 wx.CallAfter(self.RefreshTabCtrlEvent)
   873                 wx.CallAfter(self.RefreshTabCtrlEvent)
  1007                 wx.CallAfter(self.CloseFindInPouDialog)
   874                 wx.CallAfter(self.CloseFindInPouDialog)
  1008                 event.Skip()
   875                 event.Skip()
  1009             else:
   876             else:
  1010                 event.Veto()
   877                 event.Veto()
  1011         
   878         
  1012 
   879 
  1013     def GetCopyBuffer(self):
   880     def GetCopyBuffer(self, primary_selection=False):
  1014         data = None
   881         data = None
       
   882         if primary_selection and wx.Platform == '__WXMSW__':
       
   883             return data
       
   884         else:
       
   885             wx.TheClipboard.UsePrimarySelection(primary_selection)
  1015         if wx.TheClipboard.Open():
   886         if wx.TheClipboard.Open():
  1016             dataobj = wx.TextDataObject()
   887             dataobj = wx.TextDataObject()
  1017             if wx.TheClipboard.GetData(dataobj):
   888             if wx.TheClipboard.GetData(dataobj):
  1018                 data = dataobj.GetText()
   889                 data = dataobj.GetText()
  1019             wx.TheClipboard.Close()
   890             wx.TheClipboard.Close()
  1020         return data
   891         return data
  1021         
   892         
  1022     def SetCopyBuffer(self, text):
   893     def SetCopyBuffer(self, text, primary_selection=False):
       
   894         if primary_selection and wx.Platform == '__WXMSW__':
       
   895             return
       
   896         else:
       
   897             wx.TheClipboard.UsePrimarySelection(primary_selection)
  1023         if wx.TheClipboard.Open():
   898         if wx.TheClipboard.Open():
  1024             data = wx.TextDataObject()
   899             data = wx.TextDataObject()
  1025             data.SetText(text)
   900             data.SetText(text)
  1026             wx.TheClipboard.SetData(data)
   901             wx.TheClipboard.SetData(data)
  1027             wx.TheClipboard.Flush()
   902             wx.TheClipboard.Flush()
  1315         elif isinstance(control, wx.TextCtrl):
  1190         elif isinstance(control, wx.TextCtrl):
  1316             control.SetSelection(0, control.GetLastPosition())
  1191             control.SetSelection(0, control.GetLastPosition())
  1317         elif isinstance(control, wx.ComboBox):
  1192         elif isinstance(control, wx.ComboBox):
  1318             control.SetMark(0, control.GetLastPosition() + 1)
  1193             control.SetMark(0, control.GetLastPosition() + 1)
  1319     
  1194     
  1320     DeleteFunctions = {
  1195     def SetDeleteFunctions(self):
  1321         ITEM_DATATYPE: GetDeleteElementFunction(PLCControler.ProjectRemoveDataType, check_function=PLCControler.DataTypeIsUsed),
  1196         self.DeleteFunctions = {
  1322         ITEM_POU: GetDeleteElementFunction(PLCControler.ProjectRemovePou, check_function=PLCControler.PouIsUsed),
  1197             ITEM_DATATYPE: GetDeleteElementFunction(
  1323         ITEM_TRANSITION: GetDeleteElementFunction(PLCControler.ProjectRemovePouTransition, ITEM_POU),
  1198                     PLCControler.ProjectRemoveDataType, 
  1324         ITEM_ACTION: GetDeleteElementFunction(PLCControler.ProjectRemovePouAction, ITEM_POU),
  1199                     check_function=self.CheckDataTypeIsUsedBeforeDeletion),
  1325         ITEM_CONFIGURATION: GetDeleteElementFunction(PLCControler.ProjectRemoveConfiguration),
  1200             ITEM_POU: GetDeleteElementFunction(
  1326         ITEM_RESOURCE: GetDeleteElementFunction(PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
  1201                     PLCControler.ProjectRemovePou, 
  1327     }
  1202                     check_function=self.CheckPouIsUsedBeforeDeletion),
       
  1203             ITEM_TRANSITION: GetDeleteElementFunction(
       
  1204                     PLCControler.ProjectRemovePouTransition, ITEM_POU),
       
  1205             ITEM_ACTION: GetDeleteElementFunction(
       
  1206                     PLCControler.ProjectRemovePouAction, ITEM_POU),
       
  1207             ITEM_CONFIGURATION: GetDeleteElementFunction(
       
  1208                     PLCControler.ProjectRemoveConfiguration),
       
  1209             ITEM_RESOURCE: GetDeleteElementFunction(
       
  1210                     PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
       
  1211         }
  1328     
  1212     
  1329     def OnDeleteMenu(self, event):
  1213     def OnDeleteMenu(self, event):
  1330         window = self.FindFocus()
  1214         window = self.FindFocus()
  1331         if window == self.ProjectTree or window is None:
  1215         if window == self.ProjectTree or window is None:
  1332             selected = self.ProjectTree.GetSelection()
  1216             selected = self.ProjectTree.GetSelection()
  1333             if selected.IsOk():
  1217             if selected is not None and selected.IsOk():
  1334                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1218                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1335                 if function is not None:
  1219                 if function is not None:
  1336                     function(self, selected)
  1220                     function(self, selected)
  1337                     self.CloseTabsWithoutModel()
  1221                     self.CloseTabsWithoutModel()
  1338                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1222                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1370         if dialog.ShowModal() == wx.ID_OK:
  1254         if dialog.ShowModal() == wx.ID_OK:
  1371             criteria = dialog.GetCriteria()
  1255             criteria = dialog.GetCriteria()
  1372             result = self.Controler.SearchInProject(criteria)
  1256             result = self.Controler.SearchInProject(criteria)
  1373             self.ClearSearchResults()
  1257             self.ClearSearchResults()
  1374             self.SearchResultPanel.SetSearchResults(criteria, result)
  1258             self.SearchResultPanel.SetSearchResults(criteria, result)
  1375             self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.SearchResultPanel))
  1259             self.SelectTab(self.SearchResultPanel)
  1376             
  1260             
  1377 #-------------------------------------------------------------------------------
  1261 #-------------------------------------------------------------------------------
  1378 #                             Display Menu Functions
  1262 #                             Display Menu Functions
  1379 #-------------------------------------------------------------------------------
  1263 #-------------------------------------------------------------------------------
  1380 
  1264 
  1453     def EnsureTabVisible(self, tab):
  1337     def EnsureTabVisible(self, tab):
  1454         notebook = tab.GetParent()
  1338         notebook = tab.GetParent()
  1455         notebook.SetSelection(notebook.GetPageIndex(tab))
  1339         notebook.SetSelection(notebook.GetPageIndex(tab))
  1456     
  1340     
  1457     def OnPouSelectedChanging(self, event):
  1341     def OnPouSelectedChanging(self, event):
  1458         if not self.Starting:
  1342         selected = self.TabsOpened.GetSelection()
  1459             selected = self.TabsOpened.GetSelection()
  1343         if selected >= 0:
  1460             if selected >= 0:
  1344             window = self.TabsOpened.GetPage(selected)
  1461                 window = self.TabsOpened.GetPage(selected)
  1345             if not window.IsDebugging():
  1462                 if not window.IsDebugging():
  1346                 window.ResetBuffer()
  1463                     window.ResetBuffer()
       
  1464         event.Skip()
  1347         event.Skip()
  1465     
  1348     
  1466     def OnPouSelectedChanged(self, event):
  1349     def OnPouSelectedChanged(self, event):
  1467         if not self.Starting:
  1350         selected = self.TabsOpened.GetSelection()
  1468             selected = self.TabsOpened.GetSelection()
  1351         if selected >= 0:
  1469             if selected >= 0:
  1352             window = self.TabsOpened.GetPage(selected)
  1470                 window = self.TabsOpened.GetPage(selected)
  1353             tagname = window.GetTagName()
  1471                 tagname = window.GetTagName()
  1354             if not window.IsDebugging():
  1472                 if not window.IsDebugging():
  1355                 self.SelectProjectTreeItem(tagname)
  1473                     wx.CallAfter(self.SelectProjectTreeItem, tagname)
  1356                 self.PouInstanceVariablesPanel.SetPouType(tagname)
  1474                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname)
  1357                 window.RefreshView()
  1475                     window.RefreshView()
  1358                 self.EnsureTabVisible(self.LibraryPanel)
  1476                     self.EnsureTabVisible(self.LibraryPanel)
  1359             else:
  1477                 else:
  1360                 instance_path = window.GetInstancePath()
  1478                     instance_path = window.GetInstancePath()
  1361                 if tagname == "":
  1479                     if tagname == "":
  1362                     instance_path = instance_path.rsplit(".", 1)[0]
  1480                         instance_path = instance_path.rsplit(".", 1)[0]
  1363                     tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
  1481                         tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
  1364                 self.EnsureTabVisible(self.DebugVariablePanel)
  1482                     self.EnsureTabVisible(self.DebugVariablePanel)
  1365                 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1483                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1366         wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1484             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
       
  1485         event.Skip()
  1367         event.Skip()
  1486         
  1368         
  1487     def RefreshEditor(self):
  1369     def RefreshEditor(self):
  1488         selected = self.TabsOpened.GetSelection()
  1370         selected = self.TabsOpened.GetSelection()
  1489         if selected >= 0:
  1371         if selected >= 0:
  1542 #-------------------------------------------------------------------------------
  1424 #-------------------------------------------------------------------------------
  1543 #                         Types Tree Management Functions
  1425 #                         Types Tree Management Functions
  1544 #-------------------------------------------------------------------------------
  1426 #-------------------------------------------------------------------------------
  1545 
  1427 
  1546     def RefreshProjectTree(self):
  1428     def RefreshProjectTree(self):
       
  1429         # Extract current selected item tagname
       
  1430         selected = self.ProjectTree.GetSelection()
       
  1431         if selected is not None and selected.IsOk():
       
  1432             item_infos = self.ProjectTree.GetPyData(selected)
       
  1433             tagname = item_infos.get("tagname", None)
       
  1434         else:
       
  1435             tagname = None
       
  1436         
       
  1437         # Refresh treectrl items according to project infos
  1547         infos = self.Controler.GetProjectInfos()
  1438         infos = self.Controler.GetProjectInfos()
  1548         root = self.ProjectTree.GetRootItem()
  1439         root = self.ProjectTree.GetRootItem()
  1549         if not root.IsOk():
  1440         if root is None or not root.IsOk():
  1550             root = self.ProjectTree.AddRoot(infos["name"])
  1441             root = self.ProjectTree.AddRoot(infos["name"])
  1551         self.GenerateProjectTreeBranch(root, infos)
  1442         self.GenerateProjectTreeBranch(root, infos)
  1552         self.ProjectTree.Expand(root)
  1443         self.ProjectTree.Expand(root)
  1553 
  1444         
  1554     def ResetSelectedItem(self):
  1445         # Select new item corresponding to previous selected item
  1555         self.SelectedItem = None
  1446         if tagname is not None:
  1556 
  1447             self.SelectProjectTreeItem(tagname)
  1557     def GenerateProjectTreeBranch(self, root, infos):
  1448 
       
  1449     def GenerateProjectTreeBranch(self, root, infos, item_alone=False):
  1558         to_delete = []
  1450         to_delete = []
  1559         item_name = infos["name"]
  1451         item_name = infos["name"]
  1560         if infos["type"] in ITEMS_UNEDITABLE:
  1452         if infos["type"] in ITEMS_UNEDITABLE:
  1561             if len(infos["values"]) == 1:
  1453             if len(infos["values"]) == 1:
  1562                 return self.GenerateProjectTreeBranch(root, infos["values"][0])
  1454                 return self.GenerateProjectTreeBranch(root, infos["values"][0], True)
  1563             item_name = _(item_name)
  1455             item_name = _(item_name)
  1564         self.ProjectTree.SetItemText(root, item_name)
  1456         self.ProjectTree.SetItemText(root, item_name)
  1565         self.ProjectTree.SetPyData(root, infos)
  1457         self.ProjectTree.SetPyData(root, infos)
  1566         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1458         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1567         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1459         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1568         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1460         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
       
  1461         self.ProjectTree.SetItemExtraImage(root, None)
  1569         if infos["type"] == ITEM_POU:
  1462         if infos["type"] == ITEM_POU:
  1570             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1463             self.ProjectTree.SetItemImage(root, 
       
  1464                 self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
       
  1465             if item_alone:
       
  1466                 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
  1571         elif infos.has_key("icon") and infos["icon"] is not None:
  1467         elif infos.has_key("icon") and infos["icon"] is not None:
  1572             icon_name = infos["icon"]
  1468             icon_name = infos["icon"]
  1573             if not self.TreeImageDict.has_key(icon_name):
  1469             if not self.TreeImageDict.has_key(icon_name):
  1574                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1470                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1575             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1471             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1576         elif self.TreeImageDict.has_key(infos["type"]):
  1472         elif self.TreeImageDict.has_key(infos["type"]):
  1577             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1473             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1578         
  1474         
  1579         if wx.VERSION >= (2, 6, 0):
  1475         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1580             item, root_cookie = self.ProjectTree.GetFirstChild(root)
       
  1581         else:
       
  1582             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
       
  1583         for values in infos["values"]:
  1476         for values in infos["values"]:
  1584             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1477             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1585                 if not item.IsOk():
  1478                 if item is None or not item.IsOk():
  1586                     item = self.ProjectTree.AppendItem(root, "")
  1479                     item = self.ProjectTree.AppendItem(root, "")
  1587                     if wx.Platform != '__WXMSW__':
  1480                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1588                         item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
       
  1589                 self.GenerateProjectTreeBranch(item, values)
  1481                 self.GenerateProjectTreeBranch(item, values)
  1590                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1482                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1591         while item.IsOk():
  1483         while item is not None and item.IsOk():
  1592             to_delete.append(item)
  1484             to_delete.append(item)
  1593             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1485             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1594         for item in to_delete:
  1486         for item in to_delete:
  1595             self.ProjectTree.Delete(item)
  1487             self.ProjectTree.Delete(item)
  1596 
  1488 
       
  1489     TagNamePartsItemTypes = {
       
  1490         "D": [ITEM_DATATYPE],
       
  1491         "P": [ITEM_POU],
       
  1492         "T": [ITEM_POU, ITEM_TRANSITION],
       
  1493         "A": [ITEM_POU, ITEM_ACTION],
       
  1494         "C": [ITEM_CONFIGURATION],
       
  1495         "R": [ITEM_CONFIGURATION, ITEM_RESOURCE]}
       
  1496 
  1597     def SelectProjectTreeItem(self, tagname):
  1497     def SelectProjectTreeItem(self, tagname):
       
  1498         result = False
  1598         if self.ProjectTree is not None:
  1499         if self.ProjectTree is not None:
  1599             root = self.ProjectTree.GetRootItem()
  1500             root = self.ProjectTree.GetRootItem()
  1600             if root.IsOk():
  1501             if root is not None and root.IsOk():
  1601                 words = tagname.split("::")
  1502                 words = tagname.split("::")
  1602                 if words[0] == "D":
  1503                 result = self.RecursiveProjectTreeItemSelection(root,
  1603                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1504                     zip(words[1:], self.TagNamePartsItemTypes.get(words[0], [])))
  1604                 elif words[0] == "P":
  1505         return result
  1605                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
       
  1606                 elif words[0] == "T":
       
  1607                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
       
  1608                 elif words[0] == "A":
       
  1609                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
       
  1610                 elif words[0] == "C":
       
  1611                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
       
  1612                 elif words[0] == "R":
       
  1613                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
       
  1614         return False
       
  1615 
  1506 
  1616     def RecursiveProjectTreeItemSelection(self, root, items):
  1507     def RecursiveProjectTreeItemSelection(self, root, items):
  1617         found = False
  1508         found = False
  1618         if wx.VERSION >= (2, 6, 0):
  1509         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1619             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1510         while item is not None and item.IsOk() and not found:
  1620         else:
       
  1621             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
       
  1622         while item.IsOk() and not found:
       
  1623             item_infos = self.ProjectTree.GetPyData(item)
  1511             item_infos = self.ProjectTree.GetPyData(item)
  1624             if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
  1512             if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
  1625                 if len(items) == 1:
  1513                 if len(items) == 1:
  1626                     self.SelectedItem = item
  1514                     self.SelectedItem = item
  1627                     wx.CallAfter(self.ProjectTree.SelectItem, item)
  1515                     self.ProjectTree.SelectItem(item)
  1628                     wx.CallAfter(self.ResetSelectedItem)
  1516                     self.ResetSelectedItem()
  1629                     return True
  1517                     return True
  1630                 else:
  1518                 else:
  1631                     found = self.RecursiveProjectTreeItemSelection(item, items[1:])
  1519                     found = self.RecursiveProjectTreeItemSelection(item, items[1:])
  1632             else:
  1520             else:
  1633                 found = self.RecursiveProjectTreeItemSelection(item, items)
  1521                 found = self.RecursiveProjectTreeItemSelection(item, items)
  1634             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1522             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1635         return found
  1523         return found
  1636 
  1524 
       
  1525     def ResetSelectedItem(self):
       
  1526         self.SelectedItem = None
       
  1527 
  1637     def OnProjectTreeBeginDrag(self, event):
  1528     def OnProjectTreeBeginDrag(self, event):
  1638         if wx.Platform == '__WXMSW__':
  1529         selected_item = (self.SelectedItem 
  1639             self.SelectedItem = event.GetItem()
  1530                          if self.SelectedItem is not None
  1640         if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem)["type"] == ITEM_POU:
  1531                          else event.GetItem())
  1641             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
  1532         if selected_item.IsOk() and self.ProjectTree.GetPyData(selected_item)["type"] == ITEM_POU:
       
  1533             block_name = self.ProjectTree.GetItemText(selected_item)
  1642             block_type = self.Controler.GetPouType(block_name)
  1534             block_type = self.Controler.GetPouType(block_name)
  1643             if block_type != "program":
  1535             if block_type != "program":
  1644                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1536                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1645                 dragSource = wx.DropSource(self.ProjectTree)
  1537                 dragSource = wx.DropSource(self.ProjectTree)
  1646                 dragSource.SetData(data)
  1538                 dragSource.SetData(data)
  1680                         self.RefreshPageTitles()
  1572                         self.RefreshPageTitles()
  1681                 elif item_infos["type"] == ITEM_POU:
  1573                 elif item_infos["type"] == ITEM_POU:
  1682                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1574                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1683                         message = _("\"%s\" pou already exists!")%new_name
  1575                         message = _("\"%s\" pou already exists!")%new_name
  1684                         abort = True
  1576                         abort = True
  1685                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1577                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
  1686                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1578                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1687                         if messageDialog.ShowModal() == wx.ID_NO:
  1579                         if messageDialog.ShowModal() == wx.ID_NO:
  1688                             abort = True
  1580                             abort = True
  1689                         messageDialog.Destroy()
  1581                         messageDialog.Destroy()
  1690                     if not abort:
  1582                     if not abort:
  1694                         self.RefreshLibraryPanel()
  1586                         self.RefreshLibraryPanel()
  1695                         self.RefreshPageTitles()
  1587                         self.RefreshPageTitles()
  1696                 elif item_infos["type"] == ITEM_TRANSITION:
  1588                 elif item_infos["type"] == ITEM_TRANSITION:
  1697                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1589                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1698                         message = _("A POU named \"%s\" already exists!")%new_name
  1590                         message = _("A POU named \"%s\" already exists!")%new_name
  1699                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1591                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1700                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1592                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1701                     else:
  1593                     else:
  1702                         words = item_infos["tagname"].split("::")
  1594                         words = item_infos["tagname"].split("::")
  1703                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
  1595                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
  1704                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), 
  1596                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), 
  1705                                                 self.Controler.ComputePouTransitionName(words[1], new_name))
  1597                                                 self.Controler.ComputePouTransitionName(words[1], new_name))
  1706                         self.RefreshPageTitles()
  1598                         self.RefreshPageTitles()
  1707                 elif item_infos["type"] == ITEM_ACTION:
  1599                 elif item_infos["type"] == ITEM_ACTION:
  1708                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1600                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1709                         message = _("A POU named \"%s\" already exists!")%new_name
  1601                         message = _("A POU named \"%s\" already exists!")%new_name
  1710                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1602                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1711                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1603                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1712                     else:
  1604                     else:
  1713                         words = item_infos["tagname"].split("::")
  1605                         words = item_infos["tagname"].split("::")
  1714                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
  1606                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
  1715                         self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), 
  1607                         self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), 
  1722                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1614                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1723                         messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1615                         messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1724                         if messageDialog.ShowModal() == wx.ID_NO:
  1616                         if messageDialog.ShowModal() == wx.ID_NO:
  1725                             abort = True
  1617                             abort = True
  1726                         messageDialog.Destroy()
  1618                         messageDialog.Destroy()
  1727                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1619                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
  1728                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1620                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1729                         if messageDialog.ShowModal() == wx.ID_NO:
  1621                         if messageDialog.ShowModal() == wx.ID_NO:
  1730                             abort = True
  1622                             abort = True
  1731                         messageDialog.Destroy()
  1623                         messageDialog.Destroy()
  1732                     if not abort:
  1624                     if not abort:
  1741                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1633                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1742                         messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1634                         messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1743                         if messageDialog.ShowModal() == wx.ID_NO:
  1635                         if messageDialog.ShowModal() == wx.ID_NO:
  1744                             abort = True
  1636                             abort = True
  1745                         messageDialog.Destroy()
  1637                         messageDialog.Destroy()
  1746                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1638                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
  1747                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1639                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1748                         if messageDialog.ShowModal() == wx.ID_NO:
  1640                         if messageDialog.ShowModal() == wx.ID_NO:
  1749                             abort = True
  1641                             abort = True
  1750                         messageDialog.Destroy()
  1642                         messageDialog.Destroy()
  1751                     if not abort:
  1643                     if not abort:
  1778                                     ITEM_TRANSITION, ITEM_ACTION]:
  1670                                     ITEM_TRANSITION, ITEM_ACTION]:
  1779                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1671                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1780             event.Skip()
  1672             event.Skip()
  1781     
  1673     
  1782     def ProjectTreeItemSelect(self, select_item):
  1674     def ProjectTreeItemSelect(self, select_item):
  1783         name = self.ProjectTree.GetItemText(select_item)
  1675         if select_item is not None and select_item.IsOk():
  1784         item_infos = self.ProjectTree.GetPyData(select_item)
  1676             name = self.ProjectTree.GetItemText(select_item)
  1785         if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1677             item_infos = self.ProjectTree.GetPyData(select_item)
  1786                                   ITEM_CONFIGURATION, ITEM_RESOURCE,
  1678             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1787                                   ITEM_TRANSITION, ITEM_ACTION]:
  1679                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
  1788             self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
  1680                                       ITEM_TRANSITION, ITEM_ACTION]:
  1789             self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
  1681                 self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
       
  1682                 self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
  1790         
  1683         
  1791     def OnProjectTreeLeftUp(self, event):
  1684     def OnProjectTreeLeftUp(self, event):
  1792         if self.SelectedItem is not None:
  1685         if self.SelectedItem is not None:
  1793             self.ProjectTree.SelectItem(self.SelectedItem)
  1686             self.ProjectTree.SelectItem(self.SelectedItem)
  1794             self.ProjectTreeItemSelect(self.SelectedItem)
  1687             self.ProjectTreeItemSelect(self.SelectedItem)
  1795             wx.CallAfter(self.ResetSelectedItem)
  1688             self.ResetSelectedItem()
  1796         event.Skip()
  1689         event.Skip()
  1797     
  1690     
  1798     def OnProjectTreeItemSelected(self, event):
  1691     def OnProjectTreeMotion(self, event):
  1799         self.ProjectTreeItemSelect(event.GetItem())
  1692         if not event.Dragging():
       
  1693             pt = wx.Point(event.GetX(), event.GetY())
       
  1694             item, flags = self.ProjectTree.HitTest(pt)
       
  1695             if item is not None and item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL:
       
  1696                 item_infos = self.ProjectTree.GetPyData(item)
       
  1697                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
       
  1698                     self.ProjectTree.SetToolTip(None)
       
  1699                     self.LastToolTipItem = None
       
  1700                 if (self.LastToolTipItem != item and 
       
  1701                     item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]):
       
  1702                     bodytype = self.Controler.GetEditedElementBodyType(
       
  1703                             item_infos["tagname"])
       
  1704                     if item_infos["type"] == ITEM_POU:
       
  1705                         block_type = {
       
  1706                             "program": _("Program"),
       
  1707                             "functionBlock": _("Function Block"),
       
  1708                             "function": _("Function")
       
  1709                         }[self.Controler.GetPouType(item_infos["name"])]
       
  1710                     elif item_infos["type"] == ITEM_TRANSITION:
       
  1711                         block_type = "Transition"
       
  1712                     else:
       
  1713                         block_type = "Action"
       
  1714                     self.LastToolTipItem = item
       
  1715                     wx.CallAfter(self.ProjectTree.SetToolTipString, 
       
  1716                         "%s : %s : %s" % (
       
  1717                             block_type, bodytype, item_infos["name"]))
       
  1718             elif self.LastToolTipItem is not None:
       
  1719                 self.ProjectTree.SetToolTip(None)
       
  1720                 self.LastToolTipItem = None
  1800         event.Skip()
  1721         event.Skip()
  1801     
  1722     
  1802     def OnProjectTreeItemChanging(self, event):
  1723     def OnProjectTreeItemChanging(self, event):
  1803         if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1724         if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1804             self.SelectedItem = event.GetItem()
  1725             self.SelectedItem = event.GetItem()
  1859                 elif element == ITEM_DATATYPE:
  1780                 elif element == ITEM_DATATYPE:
  1860                     new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1781                     new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1861                     new_window.SetIcon(GetBitmap("DATATYPE"))
  1782                     new_window.SetIcon(GetBitmap("DATATYPE"))
  1862                     self.AddPage(new_window, "")
  1783                     self.AddPage(new_window, "")
  1863             if new_window is not None:
  1784             if new_window is not None:
  1864                 if self.EnableSaveProjectState():
       
  1865                     project_infos = self.GetProjectConfiguration()
       
  1866                     if project_infos.has_key("editors_state"):
       
  1867                         if new_window.IsDebugging():
       
  1868                             state = project_infos["editors_state"].get(new_window.GetInstancePath())
       
  1869                         else:
       
  1870                             state = project_infos["editors_state"].get(tagname)
       
  1871                         if state is not None:
       
  1872                             wx.CallAfter(new_window.SetState, state)
       
  1873                 
       
  1874                 openedidx = self.IsOpened(tagname)
  1785                 openedidx = self.IsOpened(tagname)
  1875                 old_selected = self.TabsOpened.GetSelection()
  1786                 old_selected = self.TabsOpened.GetSelection()
  1876                 if old_selected != openedidx:
  1787                 if old_selected != openedidx:
  1877                     if old_selected >= 0:
  1788                     if old_selected >= 0:
  1878                         self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1789                         self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1883                         window.SetFocus()
  1794                         window.SetFocus()
  1884                 self.RefreshPageTitles()
  1795                 self.RefreshPageTitles()
  1885             return new_window
  1796             return new_window
  1886     
  1797     
  1887     def OnProjectTreeRightUp(self, event):
  1798     def OnProjectTreeRightUp(self, event):
  1888         if wx.Platform == '__WXMSW__':
  1799         item = event.GetItem()
  1889             item = event.GetItem()
       
  1890         else:
       
  1891             item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY()))
       
  1892         self.ProjectTree.SelectItem(item)
  1800         self.ProjectTree.SelectItem(item)
  1893         self.ProjectTreeItemSelect(item)
  1801         self.ProjectTreeItemSelect(item)
  1894         name = self.ProjectTree.GetItemText(item)
  1802         name = self.ProjectTree.GetItemText(item)
  1895         item_infos = self.ProjectTree.GetPyData(item)
  1803         item_infos = self.ProjectTree.GetPyData(item)
  1896         
  1804         
  1929             
  1837             
  1930             elif name == "Transitions":
  1838             elif name == "Transitions":
  1931                 menu = wx.Menu(title='')
  1839                 menu = wx.Menu(title='')
  1932                 new_id = wx.NewId()
  1840                 new_id = wx.NewId()
  1933                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1841                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1934                 parent = self.ProjectTree.GetItemParent(item)["type"]
  1842                 parent = self.ProjectTree.GetItemParent(item)
  1935                 parent_type = self.ProjectTree.GetPyData(parent)
  1843                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1936                 while parent_type != ITEM_POU:
  1844                 while parent_type != ITEM_POU:
  1937                     parent = self.ProjectTree.GetItemParent(parent)
  1845                     parent = self.ProjectTree.GetItemParent(parent)
  1938                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1846                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1939                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1847                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1940             
  1848             
  1956                 parent = self.ProjectTree.GetItemParent(item)
  1864                 parent = self.ProjectTree.GetItemParent(item)
  1957                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1865                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1958                 while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]:
  1866                 while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]:
  1959                     parent = self.ProjectTree.GetItemParent(parent)
  1867                     parent = self.ProjectTree.GetItemParent(parent)
  1960                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1868                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
       
  1869                 parent_name = None
  1961                 if parent_type == ITEM_PROJECT:
  1870                 if parent_type == ITEM_PROJECT:
  1962                     parent_name = None
  1871                     config_names = self.Controler.GetProjectConfigNames()
       
  1872                     if len(config_names) > 0:
       
  1873                         parent_name = config_names[0]
  1963                 else:
  1874                 else:
  1964                     parent_name = self.ProjectTree.GetItemText(parent)
  1875                     parent_name = self.ProjectTree.GetItemText(parent)
  1965                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
  1876                 if parent_name is not None:
       
  1877                     self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
  1966             
  1878             
  1967         else:
  1879         else:
  1968             if item_infos["type"] == ITEM_POU:
  1880             if item_infos["type"] == ITEM_POU:
  1969                 menu = wx.Menu(title='')
  1881                 menu = wx.Menu(title='')
  1970                 if self.Controler.GetPouBodyType(name) == "SFC":
  1882                 if self.Controler.GetPouBodyType(name) == "SFC":
  2011         
  1923         
  2012         if menu is not None:
  1924         if menu is not None:
  2013             self.PopupMenu(menu)
  1925             self.PopupMenu(menu)
  2014             menu.Destroy()
  1926             menu.Destroy()
  2015         
  1927         
       
  1928         self.ResetSelectedItem()
       
  1929         
  2016         event.Skip()
  1930         event.Skip()
  2017 
  1931 
  2018 
  1932 
  2019 #-------------------------------------------------------------------------------
  1933 #-------------------------------------------------------------------------------
  2020 #                         Instances Tree Management Functions
  1934 #                         Instances Tree Management Functions
  2071                     icon = GetBitmap("TRANSITION", bodytype)
  1985                     icon = GetBitmap("TRANSITION", bodytype)
  2072                 elif instance_category == ITEM_ACTION:
  1986                 elif instance_category == ITEM_ACTION:
  2073                     icon = GetBitmap("ACTION", bodytype)
  1987                     icon = GetBitmap("ACTION", bodytype)
  2074         
  1988         
  2075         if new_window is not None:
  1989         if new_window is not None:
  2076             if self.EnableSaveProjectState():
       
  2077                 project_infos = self.GetProjectConfiguration()
       
  2078                 if project_infos.has_key("editors_state"):
       
  2079                     state = project_infos["editors_state"].get(instance_path)
       
  2080                     if state is not None:
       
  2081                         wx.CallAfter(new_window.SetState, state)
       
  2082             
       
  2083             new_window.SetIcon(icon)
  1990             new_window.SetIcon(icon)
  2084             self.AddPage(new_window, "")
  1991             self.AddPage(new_window, "")
  2085             new_window.RefreshView()
  1992             new_window.RefreshView()
  2086             new_window.SetFocus()
  1993             new_window.SetFocus()
  2087             self.RefreshPageTitles()
  1994             self.RefreshPageTitles()
  2106                     if instance_infos is None:
  2013                     if instance_infos is None:
  2107                         self.TabsOpened.DeletePage(idx)
  2014                         self.TabsOpened.DeletePage(idx)
  2108                     elif isinstance(editor, GraphicViewer):
  2015                     elif isinstance(editor, GraphicViewer):
  2109                         editor.ResetView(True)
  2016                         editor.ResetView(True)
  2110                     else:
  2017                     else:
  2111                         editor.RefreshView()
  2018                         editor.SubscribeAllDataConsumers()
  2112                 elif editor.IsDebugging():
  2019                 elif editor.IsDebugging():
  2113                     editor.RegisterVariables()
  2020                     editor.SubscribeAllDataConsumers()
  2114             self.DebugVariablePanel.UnregisterObsoleteData()
  2021             self.DebugVariablePanel.SubscribeAllDataConsumers()
  2115     
  2022     
  2116     def AddDebugVariable(self, iec_path, force=False):
  2023     def AddDebugVariable(self, iec_path, force=False, graph=False):
  2117         if self.EnableDebug:
  2024         if self.EnableDebug:
  2118             self.DebugVariablePanel.InsertValue(iec_path, force=force)
  2025             self.DebugVariablePanel.InsertValue(iec_path, force=force, graph=graph)
  2119             self.EnsureTabVisible(self.DebugVariablePanel)
  2026             self.EnsureTabVisible(self.DebugVariablePanel)
  2120             
  2027             
  2121 #-------------------------------------------------------------------------------
  2028 #-------------------------------------------------------------------------------
  2122 #                         Library Panel Management Function
  2029 #                         Library Panel Management Function
  2123 #-------------------------------------------------------------------------------
  2030 #-------------------------------------------------------------------------------
  2347         
  2254         
  2348     def GenerateAddPouFunction(self, pou_type):
  2255     def GenerateAddPouFunction(self, pou_type):
  2349         def OnAddPouMenu(event):
  2256         def OnAddPouMenu(event):
  2350             dialog = PouDialog(self, pou_type)
  2257             dialog = PouDialog(self, pou_type)
  2351             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2258             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2352             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2259             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames())
  2353             dialog.SetValues({"pouName": self.Controler.GenerateNewName(None, None, "%s%%d" % pou_type)})
  2260             dialog.SetValues({"pouName": self.Controler.GenerateNewName(None, None, "%s%%d" % pou_type)})
  2354             if dialog.ShowModal() == wx.ID_OK:
  2261             if dialog.ShowModal() == wx.ID_OK:
  2355                 values = dialog.GetValues()
  2262                 values = dialog.GetValues()
  2356                 tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2263                 tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2357                 if tagname is not None:
  2264                 if tagname is not None:
  2362 
  2269 
  2363     def GenerateAddTransitionFunction(self, pou_name):
  2270     def GenerateAddTransitionFunction(self, pou_name):
  2364         def OnAddTransitionMenu(event):
  2271         def OnAddTransitionMenu(event):
  2365             dialog = PouTransitionDialog(self)
  2272             dialog = PouTransitionDialog(self)
  2366             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2273             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2367             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2274             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames(pou_name))
  2368             dialog.SetValues({"transitionName": self.Controler.GenerateNewName(None, None, "transition%d")})
  2275             dialog.SetValues({"transitionName": self.Controler.GenerateNewName(None, None, "transition%d")})
  2369             if dialog.ShowModal() == wx.ID_OK: 
  2276             if dialog.ShowModal() == wx.ID_OK: 
  2370                 values = dialog.GetValues()
  2277                 values = dialog.GetValues()
  2371                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2278                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2372                 if tagname is not None:
  2279                 if tagname is not None:
  2377 
  2284 
  2378     def GenerateAddActionFunction(self, pou_name):
  2285     def GenerateAddActionFunction(self, pou_name):
  2379         def OnAddActionMenu(event):
  2286         def OnAddActionMenu(event):
  2380             dialog = PouActionDialog(self)
  2287             dialog = PouActionDialog(self)
  2381             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2288             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2382             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2289             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames(pou_name))
  2383             dialog.SetValues({"actionName": self.Controler.GenerateNewName(None, None, "action%d")})
  2290             dialog.SetValues({"actionName": self.Controler.GenerateNewName(None, None, "action%d")})
  2384             if dialog.ShowModal() == wx.ID_OK:
  2291             if dialog.ShowModal() == wx.ID_OK:
  2385                 values = dialog.GetValues()
  2292                 values = dialog.GetValues()
  2386                 tagname = self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2293                 tagname = self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2387                 if tagname is not None:
  2294                 if tagname is not None:
  2435         pou_xml = self.GetCopyBuffer()
  2342         pou_xml = self.GetCopyBuffer()
  2436 
  2343 
  2437         result = self.Controler.PastePou(pou_type, pou_xml)
  2344         result = self.Controler.PastePou(pou_type, pou_xml)
  2438 
  2345 
  2439         if not isinstance(result, TupleType):
  2346         if not isinstance(result, TupleType):
  2440             message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR)
  2347             self.ShowErrorMessage(result)
  2441             message.ShowModal()
       
  2442             message.Destroy()
       
  2443         else:
  2348         else:
  2444             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2349             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2445             self.EditProjectElement(ITEM_POU, result[0])
  2350             self.EditProjectElement(ITEM_POU, result[0])
  2446 
  2351 
  2447 #-------------------------------------------------------------------------------
  2352 #-------------------------------------------------------------------------------
  2448 #                        Remove Project Elements Functions
  2353 #                        Remove Project Elements Functions
  2449 #-------------------------------------------------------------------------------
  2354 #-------------------------------------------------------------------------------
  2450 
  2355 
       
  2356     def CheckElementIsUsedBeforeDeletion(self, check_function, title, name):
       
  2357         if not check_function(name):
       
  2358             return True
       
  2359         
       
  2360         dialog = wx.MessageDialog(self, 
       
  2361             _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name, 
       
  2362             title, wx.YES_NO|wx.ICON_QUESTION)
       
  2363         answer = dialog.ShowModal()
       
  2364         dialog.Destroy()
       
  2365         return answer == wx.ID_YES
       
  2366 
       
  2367     def CheckDataTypeIsUsedBeforeDeletion(self, name):
       
  2368         return self.CheckElementIsUsedBeforeDeletion(
       
  2369             self.Controler.DataTypeIsUsed,
       
  2370             _("Remove Datatype"), name)
       
  2371     
       
  2372     def CheckPouIsUsedBeforeDeletion(self, name):
       
  2373         return self.CheckElementIsUsedBeforeDeletion(
       
  2374             self.Controler.PouIsUsed,
       
  2375             _("Remove Pou"), name)
       
  2376     
  2451     def OnRemoveDataTypeMenu(self, event):
  2377     def OnRemoveDataTypeMenu(self, event):
  2452         selected = self.ProjectTree.GetSelection()
  2378         selected = self.ProjectTree.GetSelection()
  2453         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
  2379         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
  2454             name = self.ProjectTree.GetItemText(selected)
  2380             name = self.ProjectTree.GetItemText(selected)
  2455             if not self.Controler.DataTypeIsUsed(name):
  2381             if self.CheckDataTypeIsUsedBeforeDeletion(name):
  2456                 self.Controler.ProjectRemoveDataType(name)
  2382                 self.Controler.ProjectRemoveDataType(name)
  2457                 tagname = self.Controler.ComputeDataTypeName(name)
  2383                 tagname = self.Controler.ComputeDataTypeName(name)
  2458                 idx = self.IsOpened(tagname)
  2384                 idx = self.IsOpened(tagname)
  2459                 if idx is not None:
  2385                 if idx is not None:
  2460                     self.TabsOpened.DeletePage(idx)
  2386                     self.TabsOpened.DeletePage(idx)
  2461                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE)
  2387                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE)
  2462             else:
  2388             
  2463                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
       
  2464 
       
  2465     def OnRenamePouMenu(self, event):
  2389     def OnRenamePouMenu(self, event):
  2466         selected = self.ProjectTree.GetSelection()
  2390         selected = self.ProjectTree.GetSelection()
  2467         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2391         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2468             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2392             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2469 
  2393 
  2470     def OnRemovePouMenu(self, event):
  2394     def OnRemovePouMenu(self, event):
  2471         selected = self.ProjectTree.GetSelection()
  2395         selected = self.ProjectTree.GetSelection()
  2472         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2396         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2473             name = self.ProjectTree.GetItemText(selected)
  2397             name = self.ProjectTree.GetItemText(selected)
  2474             if not self.Controler.PouIsUsed(name):
  2398             if self.CheckPouIsUsedBeforeDeletion(name):
  2475                 self.Controler.ProjectRemovePou(name)
  2399                 self.Controler.ProjectRemovePou(name)
  2476                 tagname = self.Controler.ComputePouName(name)
  2400                 tagname = self.Controler.ComputePouName(name)
  2477                 idx = self.IsOpened(tagname)
  2401                 idx = self.IsOpened(tagname)
  2478                 if idx is not None:
  2402                 if idx is not None:
  2479                     self.TabsOpened.DeletePage(idx)
  2403                     self.TabsOpened.DeletePage(idx)
  2480                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2404                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2481             else:
       
  2482                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
       
  2483 
  2405 
  2484     def OnRemoveTransitionMenu(self, event):
  2406     def OnRemoveTransitionMenu(self, event):
  2485         selected = self.ProjectTree.GetSelection()
  2407         selected = self.ProjectTree.GetSelection()
  2486         item_infos = self.ProjectTree.GetPyData(selected)
  2408         item_infos = self.ProjectTree.GetPyData(selected)
  2487         if item_infos["type"] == ITEM_TRANSITION: 
  2409         if item_infos["type"] == ITEM_TRANSITION: