PLCOpenEditor.py
changeset 684 f10449b18dbe
parent 683 37882f34f9cb
child 685 ecd2226716d8
equal deleted inserted replaced
683:37882f34f9cb 684:f10449b18dbe
   112 from GraphicViewer import *
   112 from GraphicViewer import *
   113 from RessourceEditor import *
   113 from RessourceEditor import *
   114 from DataTypeEditor import *
   114 from DataTypeEditor import *
   115 from PLCControler import *
   115 from PLCControler import *
   116 from SearchResultPanel import SearchResultPanel
   116 from SearchResultPanel import SearchResultPanel
   117 from controls import CustomGrid, CustomTable, LibraryPanel
   117 from controls import CustomGrid, CustomTable, CustomTree, LibraryPanel, PouInstanceVariablesPanel
   118 
   118 
   119 # Define PLCOpenEditor controls id
   119 # Define PLCOpenEditor controls id
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   122  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   122  ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER, 
   123  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   123  ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER, 
   124  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   124  ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL, 
   125  ID_PLCOPENEDITORLIBRARYSEARCHCTRL, ID_PLCOPENEDITORLIBRARYTREE, 
   125  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   126  ID_PLCOPENEDITORLIBRARYCOMMENT, ID_PLCOPENEDITORTABSOPENED, 
   126  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED, 
   127  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITOREDITORMENUTOOLBAR, 
   127  ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR, 
   128  ID_PLCOPENEDITOREDITORTOOLBAR, 
   128  ID_PLCOPENEDITORPROJECTPANEL, 
   129 ] = [wx.NewId() for _init_ctrls in range(17)]
   129 ] = [wx.NewId() for _init_ctrls in range(17)]
   130 
   130 
   131 # Define PLCOpenEditor FileMenu extra items id
   131 # Define PLCOpenEditor FileMenu extra items id
   132 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   132 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   133 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   133 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   268     if wx.VERSION >= (2, 6, 0):
   268     if wx.VERSION >= (2, 6, 0):
   269         parent.Append(help=help, id=id, kind=kind, text=text)
   269         parent.Append(help=help, id=id, kind=kind, text=text)
   270     else:
   270     else:
   271         parent.Append(helpString=help, id=id, kind=kind, item=text)
   271         parent.Append(helpString=help, id=id, kind=kind, item=text)
   272 
   272 
   273 [TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, 
   273 [TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, 
   274  INSTANCESTREE, LIBRARYTREE, SCALING, PAGETITLES
   274  POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
   275 ] = range(10)
   275 ] = range(10)
   276 
   276 
   277 def GetShortcutKeyCallbackFunction(viewer_function):
   277 def GetShortcutKeyCallbackFunction(viewer_function):
   278     def ShortcutKeyFunction(self, event):
   278     def ShortcutKeyFunction(self, event):
   279         control = self.FindFocus()
   279         control = self.FindFocus()
   293         parent_item_type = tree.GetPyData(parent_item)
   293         parent_item_type = tree.GetPyData(parent_item)
   294     return tree.GetItemText(parent_item)
   294     return tree.GetItemText(parent_item)
   295 
   295 
   296 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   296 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   297     def DeleteElementFunction(self, selected):
   297     def DeleteElementFunction(self, selected):
   298         name = self.TypesTree.GetItemText(selected)
   298         name = self.ProjectTree.GetItemText(selected)
   299         if check_function is None or not check_function(self.Controler, name):
   299         if check_function is None or not check_function(self.Controler, name):
   300             if parent_type is not None:
   300             if parent_type is not None:
   301                 parent_name = GetParentName(self.TypesTree, selected, parent_type)
   301                 parent_name = GetParentName(self.ProjectTree, selected, parent_type)
   302                 remove_function(self.Controler, parent_name, name)
   302                 remove_function(self.Controler, parent_name, name)
   303             else:
   303             else:
   304                 remove_function(self.Controler, name)
   304                 remove_function(self.Controler, name)
   305         else:
   305         else:
   306             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   306             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   410         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   410         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   411 
   411 
   412     def _init_coll_FileMenu_Items(self, parent):
   412     def _init_coll_FileMenu_Items(self, parent):
   413         pass
   413         pass
   414     
   414     
       
   415     def _init_coll_AddMenu_Items(self, parent):
       
   416         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
       
   417               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
       
   418         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
       
   419               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
       
   420         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
       
   421               kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
       
   422         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
       
   423               kind=wx.ITEM_NORMAL, text=_(u'&Program'))
       
   424         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
       
   425               kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
       
   426     
   415     def _init_coll_EditMenu_Items(self, parent):
   427     def _init_coll_EditMenu_Items(self, parent):
   416         AppendMenu(parent, help='', id=wx.ID_UNDO,
   428         AppendMenu(parent, help='', id=wx.ID_UNDO,
   417               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   429               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   418         AppendMenu(parent, help='', id=wx.ID_REDO,
   430         AppendMenu(parent, help='', id=wx.ID_REDO,
   419               kind=wx.ITEM_NORMAL, text=_(u'Redo\tCTRL+Y'))
   431               kind=wx.ITEM_NORMAL, text=_(u'Redo\tCTRL+Y'))
   429               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
   441               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
   430         parent.AppendSeparator()
   442         parent.AppendSeparator()
   431         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
   443         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
   432               kind=wx.ITEM_NORMAL, text=_(u'Search in Project\tCTRL+F'))
   444               kind=wx.ITEM_NORMAL, text=_(u'Search in Project\tCTRL+F'))
   433         parent.AppendSeparator()
   445         parent.AppendSeparator()
   434         addmenu = wx.Menu(title='')
   446         add_menu = wx.Menu(title='')
   435         parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), addmenu)
   447         self._init_coll_AddMenu_Items(add_menu)
   436         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   448         parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), add_menu)
   437               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
       
   438         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
       
   439               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
       
   440         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
       
   441               kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
       
   442         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
       
   443               kind=wx.ITEM_NORMAL, text=_(u'&Program'))
       
   444         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
       
   445               kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
       
   446         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
   449         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
   447               kind=wx.ITEM_NORMAL, text=_(u'Select All\tCTRL+A'))
   450               kind=wx.ITEM_NORMAL, text=_(u'Select All\tCTRL+A'))
   448         AppendMenu(parent, help='', id=wx.ID_DELETE,
   451         AppendMenu(parent, help='', id=wx.ID_DELETE,
   449               kind=wx.ITEM_NORMAL, text=_(u'&Delete'))
   452               kind=wx.ITEM_NORMAL, text=_(u'&Delete'))
   450         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   453         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   544                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   547                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   545             self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   548             self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   546                     self.OnAllowNotebookDnD)
   549                     self.OnAllowNotebookDnD)
   547             self.AUIManager.AddPane(self.LeftNoteBook, 
   550             self.AUIManager.AddPane(self.LeftNoteBook, 
   548                   wx.aui.AuiPaneInfo().Name("ProjectPane").
   551                   wx.aui.AuiPaneInfo().Name("ProjectPane").
   549                   Caption(_("Project")).Left().Layer(1).
   552                   Left().Layer(1).
   550                   BestSize(wx.Size(300, 500)).CloseButton(False))
   553                   BestSize(wx.Size(300, 500)).CloseButton(False))
   551             
   554             
   552             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   555             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   553                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   556                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   554                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   557                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   636         #                    Creating PLCopen Project Types Tree
   639         #                    Creating PLCopen Project Types Tree
   637         #-----------------------------------------------------------------------
   640         #-----------------------------------------------------------------------
   638         
   641         
   639         self.MainTabs = {}
   642         self.MainTabs = {}
   640         
   643         
   641         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   644         self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL,
   642                   name='TypesTree', parent=self.LeftNoteBook, 
   645                   name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
       
   646                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   647         
       
   648         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
       
   649                   name='ProjectTree', parent=self.ProjectPanel, 
   643                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   650                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   644                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   651                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
       
   652         self.ProjectTree.SetBackgroundBitmap(wx.Bitmap(os.path.join(CWD, 'Images', 'custom_tree_background.png')),
       
   653 											 wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
       
   654         add_menu = wx.Menu()
       
   655         self._init_coll_AddMenu_Items(add_menu)
       
   656         self.ProjectTree.SetAddMenu(add_menu)
   645         if wx.Platform == '__WXMSW__':
   657         if wx.Platform == '__WXMSW__':
   646             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
   658             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
   647                   id=ID_PLCOPENEDITORTYPESTREE)
   659                   id=ID_PLCOPENEDITORPROJECTTREE)
   648             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
   660             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected,
   649                   id=ID_PLCOPENEDITORTYPESTREE)
   661                   id=ID_PLCOPENEDITORPROJECTTREE)
   650         else:
   662         else:
   651             if wx.VERSION >= (2, 6, 0):
   663             if wx.VERSION >= (2, 6, 0):
   652                 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
   664                 self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
   653                 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
   665                 self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
   654             else:
   666             else:
   655                 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
   667                 wx.EVT_RIGHT_UP(self.ProjectTree, self.OnProjectTreeRightUp)
   656                 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
   668                 wx.EVT_LEFT_UP(self.ProjectTree, self.OnProjectTreeLeftUp)
   657             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
   669             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
   658                   id=ID_PLCOPENEDITORTYPESTREE)
   670                   id=ID_PLCOPENEDITORPROJECTTREE)
   659         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
   671         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
   660               id=ID_PLCOPENEDITORTYPESTREE)
   672               id=ID_PLCOPENEDITORPROJECTTREE)
   661         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
   673         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
   662               id=ID_PLCOPENEDITORTYPESTREE)
   674               id=ID_PLCOPENEDITORPROJECTTREE)
   663         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   675         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
   664               id=ID_PLCOPENEDITORTYPESTREE)
   676               id=ID_PLCOPENEDITORPROJECTTREE)
   665         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
   677         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
   666               id=ID_PLCOPENEDITORTYPESTREE)
   678               id=ID_PLCOPENEDITORPROJECTTREE)
   667         
       
   668         self.MainTabs["TypesTree"] = (self.TypesTree, _("Types"))
       
   669         self.LeftNoteBook.AddPage(*self.MainTabs["TypesTree"])
       
   670         
   679         
   671         #-----------------------------------------------------------------------
   680         #-----------------------------------------------------------------------
   672         #                  Creating PLCopen Project Instances Tree
   681         #        Creating PLCopen Project POU Instance Variables Panel
   673         #-----------------------------------------------------------------------
   682         #-----------------------------------------------------------------------
   674         
   683         
   675         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   684         self.PouInstanceVariablesPanel = PouInstanceVariablesPanel(self.ProjectPanel, self, self.Controler, self.EnableDebug)
   676                   name='InstancesTree', parent=self.LeftNoteBook, 
   685         
   677                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   686         self.MainTabs["ProjectPanel"] = (self.ProjectPanel, _("Project"))
   678                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   687         self.LeftNoteBook.AddPage(*self.MainTabs["ProjectPanel"])
   679         if self.EnableDebug:
   688         
   680             if wx.VERSION >= (2, 6, 0):
   689         self.ProjectPanel.SplitHorizontally(self.ProjectTree, self.PouInstanceVariablesPanel, 300)
   681                 self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp)
       
   682             else:
       
   683                 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp)
       
   684             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
       
   685                   id=ID_PLCOPENEDITORINSTANCESTREE)
       
   686             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
       
   687                   id=ID_PLCOPENEDITORINSTANCESTREE)
       
   688         
       
   689         self.MainTabs["InstancesTree"] = (self.InstancesTree, _("Instances"))
       
   690         self.LeftNoteBook.AddPage(*self.MainTabs["InstancesTree"])
       
   691         
   690         
   692         #-----------------------------------------------------------------------
   691         #-----------------------------------------------------------------------
   693         #                            Creating Tool Bar
   692         #                            Creating Tool Bar
   694         #-----------------------------------------------------------------------
   693         #-----------------------------------------------------------------------
   695         
   694         
   803             ("RESOURCES",      ITEM_RESOURCES),
   802             ("RESOURCES",      ITEM_RESOURCES),
   804             ("PROPERTIES",     ITEM_PROPERTIES)]:
   803             ("PROPERTIES",     ITEM_PROPERTIES)]:
   805             self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
   804             self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
   806         
   805         
   807         # Assign icon list to TreeCtrls
   806         # Assign icon list to TreeCtrls
   808         self.TypesTree.SetImageList(self.TreeImageList)
   807         self.ProjectTree.SetImageList(self.TreeImageList)
   809         self.InstancesTree.SetImageList(self.TreeImageList)
   808         self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList)
   810         
   809         
   811         self.CurrentEditorToolBar = []
   810         self.CurrentEditorToolBar = []
   812         self.CurrentMenu = None
   811         self.CurrentMenu = None
   813         self.SelectedItem = None
   812         self.SelectedItem = None
   814         self.Highlights = {}
   813         self.Highlights = {}
   926             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
   925             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
   927             page_ref.RefreshView()
   926             page_ref.RefreshView()
   928             return notebook.GetPageIndex(page_ref)
   927             return notebook.GetPageIndex(page_ref)
   929         elif page_infos[0] == "debug":
   928         elif page_infos[0] == "debug":
   930             instance_path = page_infos[1]
   929             instance_path = page_infos[1]
   931             item = self.GetInstancesTreeItem(self.InstancesTree.GetRootItem(), instance_path)
   930             instance_infos = self.Controler.GetInstanceInfos(instance_path)
   932             item_infos = self.InstancesTree.GetPyData(item)
   931             if instance_infos is not None:
   933             if item_infos[1] is not None:
   932                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
   934                 instance_type = item_infos[1]
       
   935             else:
       
   936                 instance_type = self.InstancesTree.GetItemText(item).split(" (")[1].split(")")[0]
       
   937             return notebook.GetPageIndex(self.OpenDebugViewer(item_infos[0], instance_path, instance_type))
       
   938         return None
   933         return None
   939             
   934             
   940     def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None):
   935     def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None):
   941         if isinstance(tabs, ListType):
   936         if isinstance(tabs, ListType):
   942             if len(tabs) == 0:
   937             if len(tabs) == 0:
  1091             TITLE : self.RefreshTitle,
  1086             TITLE : self.RefreshTitle,
  1092             EDITORTOOLBAR : self.RefreshEditorToolBar,
  1087             EDITORTOOLBAR : self.RefreshEditorToolBar,
  1093             FILEMENU : self.RefreshFileMenu,
  1088             FILEMENU : self.RefreshFileMenu,
  1094             EDITMENU : self.RefreshEditMenu,
  1089             EDITMENU : self.RefreshEditMenu,
  1095             DISPLAYMENU : self.RefreshDisplayMenu,
  1090             DISPLAYMENU : self.RefreshDisplayMenu,
  1096             TYPESTREE : self.RefreshTypesTree,
  1091             PROJECTTREE : self.RefreshProjectTree,
  1097             INSTANCESTREE : self.RefreshInstancesTree, 
  1092             POUINSTANCEVARIABLESPANEL : self.RefreshPouInstanceVariablesPanel, 
  1098             LIBRARYTREE : self.RefreshLibraryPanel,
  1093             LIBRARYTREE : self.RefreshLibraryPanel,
  1099             SCALING : self.RefreshScaling,
  1094             SCALING : self.RefreshScaling,
  1100             PAGETITLES: self.RefreshPageTitles}
  1095             PAGETITLES: self.RefreshPageTitles}
  1101 
  1096 
  1102     ## Call PLCOpenEditor refresh functions.
  1097     ## Call PLCOpenEditor refresh functions.
  1147     def RefreshScaling(self):
  1142     def RefreshScaling(self):
  1148         for i in xrange(self.TabsOpened.GetPageCount()):
  1143         for i in xrange(self.TabsOpened.GetPageCount()):
  1149             editor = self.TabsOpened.GetPage(i)
  1144             editor = self.TabsOpened.GetPage(i)
  1150             editor.RefreshScaling()
  1145             editor.RefreshScaling()
  1151 
  1146 
  1152     def ShowProperties(self):
  1147     def EditProjectSettings(self):
  1153         old_values = self.Controler.GetProjectProperties()
  1148         old_values = self.Controler.GetProjectProperties()
  1154         dialog = ProjectDialog(self)
  1149         dialog = ProjectDialog(self)
  1155         dialog.SetValues(old_values)
  1150         dialog.SetValues(old_values)
  1156         if dialog.ShowModal() == wx.ID_OK:
  1151         if dialog.ShowModal() == wx.ID_OK:
  1157             new_values = dialog.GetValues()
  1152             new_values = dialog.GetValues()
  1158             new_values["creationDateTime"] = old_values["creationDateTime"]
  1153             new_values["creationDateTime"] = old_values["creationDateTime"]
  1159             if new_values != old_values:
  1154             if new_values != old_values:
  1160                 self.Controler.SetProjectProperties(None, new_values)
  1155                 self.Controler.SetProjectProperties(None, new_values)
  1161                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
  1156                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
  1162                               TYPESTREE, INSTANCESTREE, SCALING)
  1157                               PROJECTTREE, POUINSTANCEVARIABLESPANEL, SCALING)
  1163         dialog.Destroy()
  1158         dialog.Destroy()
  1164 
  1159 
  1165 #-------------------------------------------------------------------------------
  1160 #-------------------------------------------------------------------------------
  1166 #                            Notebook Unified Functions
  1161 #                            Notebook Unified Functions
  1167 #-------------------------------------------------------------------------------
  1162 #-------------------------------------------------------------------------------
  1279     def RefreshFileMenu(self):
  1274     def RefreshFileMenu(self):
  1280         pass
  1275         pass
  1281 
  1276 
  1282     def ResetView(self):
  1277     def ResetView(self):
  1283         self.DeleteAllPages()
  1278         self.DeleteAllPages()
  1284         self.TypesTree.DeleteAllItems()
  1279         self.ProjectTree.DeleteAllItems()
  1285         self.InstancesTree.DeleteAllItems()
  1280         self.PouInstanceVariablesPanel.ResetView()
  1286         self.LibraryPanel.ResetTree()
  1281         self.LibraryPanel.ResetTree()
  1287         self.LibraryPanel.SetControler(None)
  1282         self.LibraryPanel.SetControler(None)
  1288         self.Controler = None
  1283         self.Controler = None
  1289 
  1284 
  1290     def OnCloseTabMenu(self, event):
  1285     def OnCloseTabMenu(self, event):
  1427         if selected != -1:
  1422         if selected != -1:
  1428             window = self.TabsOpened.GetPage(selected)
  1423             window = self.TabsOpened.GetPage(selected)
  1429             window.Undo()
  1424             window.Undo()
  1430         else:
  1425         else:
  1431             self.Controler.LoadPrevious()
  1426             self.Controler.LoadPrevious()
  1432         self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1427         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, 
  1433                       SCALING, PAGETITLES)    
  1428                       SCALING, PAGETITLES)    
  1434     
  1429     
  1435     def OnRedoMenu(self, event):
  1430     def OnRedoMenu(self, event):
  1436         selected = self.TabsOpened.GetSelection()
  1431         selected = self.TabsOpened.GetSelection()
  1437         if selected != -1:
  1432         if selected != -1:
  1438             window = self.TabsOpened.GetPage(selected)
  1433             window = self.TabsOpened.GetPage(selected)
  1439             window.Redo()
  1434             window.Redo()
  1440         else:
  1435         else:
  1441             self.Controler.LoadNext()
  1436             self.Controler.LoadNext()
  1442         self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1437         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, 
  1443                       SCALING, PAGETITLES)
  1438                       SCALING, PAGETITLES)
  1444     
  1439     
  1445     def OnEnableUndoRedoMenu(self, event):
  1440     def OnEnableUndoRedoMenu(self, event):
  1446         self.Controler.EnableProjectBuffer(event.IsChecked())
  1441         self.Controler.EnableProjectBuffer(event.IsChecked())
  1447         self.RefreshEditMenu()
  1442         self.RefreshEditMenu()
  1470         ITEM_RESOURCE: GetDeleteElementFunction(PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
  1465         ITEM_RESOURCE: GetDeleteElementFunction(PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
  1471     }
  1466     }
  1472     
  1467     
  1473     def OnDeleteMenu(self, event):
  1468     def OnDeleteMenu(self, event):
  1474         window = self.FindFocus()
  1469         window = self.FindFocus()
  1475         if window == self.TypesTree or window is None:
  1470         if window == self.ProjectTree or window is None:
  1476             selected = self.TypesTree.GetSelection()
  1471             selected = self.ProjectTree.GetSelection()
  1477             if selected.IsOk():
  1472             if selected.IsOk():
  1478                 type = self.TypesTree.GetPyData(selected)
  1473                 type = self.ProjectTree.GetPyData(selected)
  1479                 function = self.DeleteFunctions.get(type, None)
  1474                 function = self.DeleteFunctions.get(type, None)
  1480                 if function is not None:
  1475                 if function is not None:
  1481                     function(self, selected)
  1476                     function(self, selected)
  1482                     self.CloseTabsWithoutModel()
  1477                     self.CloseTabsWithoutModel()
  1483                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, 
  1478                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1484                                   INSTANCESTREE, LIBRARYTREE)
  1479                                   POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1485         elif isinstance(window, (Viewer, TextViewer)):
  1480         elif isinstance(window, (Viewer, TextViewer)):
  1486             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1481             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1487             event.m_keyCode = wx.WXK_DELETE
  1482             event.m_keyCode = wx.WXK_DELETE
  1488             window.ProcessEvent(event)
  1483             window.ProcessEvent(event)
  1489 
  1484 
  1585     def OnPouSelectedChanged(self, event):
  1580     def OnPouSelectedChanged(self, event):
  1586         if not self.Starting:
  1581         if not self.Starting:
  1587             selected = self.TabsOpened.GetSelection()
  1582             selected = self.TabsOpened.GetSelection()
  1588             if selected >= 0:
  1583             if selected >= 0:
  1589                 window = self.TabsOpened.GetPage(selected)
  1584                 window = self.TabsOpened.GetPage(selected)
       
  1585                 tagname = window.GetTagName()
  1590                 if not window.IsDebugging():
  1586                 if not window.IsDebugging():
  1591                     wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName())
  1587                     wx.CallAfter(self.SelectProjectTreeItem, tagname)
       
  1588                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname)
  1592                     window.RefreshView()
  1589                     window.RefreshView()
  1593                 else:
  1590                 else:
  1594                     wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath())
  1591                     instance_path = window.GetInstancePath()
       
  1592                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1595             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1593             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1596         event.Skip()
  1594         event.Skip()
  1597 
  1595 
  1598     def RefreshEditor(self):
  1596     def RefreshEditor(self):
  1599         selected = self.TabsOpened.GetSelection()
  1597         selected = self.TabsOpened.GetSelection()
  1600         if selected >= 0:
  1598         if selected >= 0:
  1601             window = self.TabsOpened.GetPage(selected)
  1599             window = self.TabsOpened.GetPage(selected)
  1602             if not window.IsDebugging():
  1600             if not window.IsDebugging():
  1603                 self.SelectTypesTreeItem(window.GetTagName())
  1601                 self.SelectProjectTreeItem(window.GetTagName())
  1604             else:
  1602             else:
  1605                 self.SelectInstancesTreeItem(window.GetInstancePath())
  1603                 self.PouInstanceVariablesPanel.SetPouType(window.GetTagName(), window.GetInstancePath())
  1606             if USE_AUI:
  1604             if USE_AUI:
  1607                 for child in self.TabsOpened.GetChildren():
  1605                 for child in self.TabsOpened.GetChildren():
  1608                     if isinstance(child, wx.aui.AuiTabCtrl):
  1606                     if isinstance(child, wx.aui.AuiTabCtrl):
  1609                         active_page = child.GetActivePage()
  1607                         active_page = child.GetActivePage()
  1610                         if active_page >= 0:
  1608                         if active_page >= 0:
  1649 
  1647 
  1650 #-------------------------------------------------------------------------------
  1648 #-------------------------------------------------------------------------------
  1651 #                         Types Tree Management Functions
  1649 #                         Types Tree Management Functions
  1652 #-------------------------------------------------------------------------------
  1650 #-------------------------------------------------------------------------------
  1653 
  1651 
  1654     def RefreshTypesTree(self):
  1652     def RefreshProjectTree(self):
  1655         infos = self.Controler.GetProjectInfos()
  1653         infos = self.Controler.GetProjectInfos()
  1656         root = self.TypesTree.GetRootItem()
  1654         root = self.ProjectTree.GetRootItem()
  1657         if not root.IsOk():
  1655         if not root.IsOk():
  1658             root = self.TypesTree.AddRoot(infos["name"])
  1656             root = self.ProjectTree.AddRoot(infos["name"])
  1659         self.GenerateTypesTreeBranch(root, infos)
  1657         self.GenerateProjectTreeBranch(root, infos)
  1660         self.TypesTree.Expand(root)
  1658         self.ProjectTree.Expand(root)
  1661 
  1659 
  1662     def ResetSelectedItem(self):
  1660     def ResetSelectedItem(self):
  1663         self.SelectedItem = None
  1661         self.SelectedItem = None
  1664 
  1662 
  1665     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1663     def GenerateProjectTreeBranch(self, root, infos):
  1666         to_delete = []
  1664         to_delete = []
  1667         item_name = infos["name"]
  1665         item_name = infos["name"]
  1668         if infos["type"] in ITEMS_UNEDITABLE:
  1666         if infos["type"] in ITEMS_UNEDITABLE:
  1669             item_name = _(item_name)
  1667         	if len(infos["values"]) == 1:
  1670         self.TypesTree.SetItemText(root, item_name)
  1668         		return self.GenerateProjectTreeBranch(root, infos["values"][0])
  1671         self.TypesTree.SetPyData(root, infos["type"])
  1669         	item_name = _(item_name)
       
  1670         self.ProjectTree.SetItemText(root, item_name)
       
  1671         self.ProjectTree.SetPyData(root, infos["type"])
  1672         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1672         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1673         self.TypesTree.SetItemBackgroundColour(root, highlight_colours[0])
  1673         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1674         self.TypesTree.SetItemTextColour(root, highlight_colours[1])
  1674         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1675         if infos["type"] == ITEM_POU:
  1675         if infos["type"] == ITEM_POU:
  1676             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1676             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1677         else:
  1677         else:
  1678             self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1678             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1679             
  1679             
  1680         if wx.VERSION >= (2, 6, 0):
  1680         if wx.VERSION >= (2, 6, 0):
  1681             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1681             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1682         else:
  1682         else:
  1683             item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1683             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1684         for values in infos["values"]:
  1684         for values in infos["values"]:
  1685             if not item.IsOk():
  1685             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1686                 item = self.TypesTree.AppendItem(root, "")
  1686                 if not item.IsOk():
  1687                 if wx.Platform != '__WXMSW__':
  1687                     item = self.ProjectTree.AppendItem(root, "")
  1688                     item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1688                     if wx.Platform != '__WXMSW__':
  1689             self.GenerateTypesTreeBranch(item, values)
  1689                         item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1690             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1690                 self.GenerateProjectTreeBranch(item, values)
       
  1691                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1691         while item.IsOk():
  1692         while item.IsOk():
  1692             to_delete.append(item)
  1693             to_delete.append(item)
  1693             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1694             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1694         for item in to_delete:
  1695         for item in to_delete:
  1695             self.TypesTree.Delete(item)
  1696             self.ProjectTree.Delete(item)
  1696 
  1697 
  1697     def SelectTypesTreeItem(self, tagname):
  1698     def SelectProjectTreeItem(self, tagname):
  1698         if self.TypesTree is not None:
  1699         if self.ProjectTree is not None:
  1699             root = self.TypesTree.GetRootItem()
  1700             root = self.ProjectTree.GetRootItem()
  1700             if root.IsOk():
  1701             if root.IsOk():
  1701                 words = tagname.split("::")
  1702                 words = tagname.split("::")
  1702                 if words[0] == "D":
  1703                 if words[0] == "D":
  1703                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1704                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1704                 elif words[0] == "P":
  1705                 elif words[0] == "P":
  1705                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU)])
  1706                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
  1706                 elif words[0] == "T":
  1707                 elif words[0] == "T":
  1707                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
  1708                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
  1708                 elif words[0] == "A":
  1709                 elif words[0] == "A":
  1709                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
  1710                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
  1710                 elif words[0] == "C":
  1711                 elif words[0] == "C":
  1711                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
  1712                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
  1712                 elif words[0] == "R":
  1713                 elif words[0] == "R":
  1713                     return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1714                     return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1714         return False
  1715         return False
  1715 
  1716 
  1716     def RecursiveTypesTreeItemSelection(self, root, items):
  1717     def RecursiveProjectTreeItemSelection(self, root, items):
  1717         found = False
  1718         found = False
  1718         if wx.VERSION >= (2, 6, 0):
  1719         if wx.VERSION >= (2, 6, 0):
  1719             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1720             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1720         else:
  1721         else:
  1721             item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1722             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1722         while item.IsOk() and not found:
  1723         while item.IsOk() and not found:
  1723             if (self.TypesTree.GetItemText(item), self.TypesTree.GetPyData(item)) == items[0]:
  1724             if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]:
  1724                 if len(items) == 1:
  1725                 if len(items) == 1:
  1725                     self.SelectedItem = item
  1726                     self.SelectedItem = item
  1726                     self.TypesTree.SelectItem(item)
  1727                     self.ProjectTree.SelectItem(item)
  1727                     wx.CallAfter(self.ResetSelectedItem)
  1728                     wx.CallAfter(self.ResetSelectedItem)
  1728                     return True
  1729                     return True
  1729                 else:
  1730                 else:
  1730                     found = self.RecursiveTypesTreeItemSelection(item, items[1:])
  1731                     found = self.RecursiveProjectTreeItemSelection(item, items[1:])
  1731             else:
  1732             else:
  1732                 found = self.RecursiveTypesTreeItemSelection(item, items)
  1733                 found = self.RecursiveProjectTreeItemSelection(item, items)
  1733             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1734             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1734         return found
  1735         return found
  1735 
  1736 
  1736     def OnTypesTreeBeginDrag(self, event):
  1737     def OnProjectTreeBeginDrag(self, event):
  1737         if wx.Platform == '__WXMSW__':
  1738         if wx.Platform == '__WXMSW__':
  1738             self.SelectedItem = event.GetItem()
  1739             self.SelectedItem = event.GetItem()
  1739         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1740         if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1740             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1741             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
  1741             block_type = self.Controler.GetPouType(block_name)
  1742             block_type = self.Controler.GetPouType(block_name)
  1742             if block_type != "program":
  1743             if block_type != "program":
  1743                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1744                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1744                 dragSource = wx.DropSource(self.TypesTree)
  1745                 dragSource = wx.DropSource(self.ProjectTree)
  1745                 dragSource.SetData(data)
  1746                 dragSource.SetData(data)
  1746                 dragSource.DoDragDrop()
  1747                 dragSource.DoDragDrop()
  1747             self.ResetSelectedItem()
  1748             self.ResetSelectedItem()
  1748 
  1749 
  1749     def OnTypesTreeItemBeginEdit(self, event):
  1750     def OnProjectTreeItemBeginEdit(self, event):
  1750         selected = event.GetItem()
  1751         selected = event.GetItem()
  1751         if self.TypesTree.GetPyData(selected) in ITEMS_UNEDITABLE:
  1752         if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE:
  1752             event.Veto()
  1753             event.Veto()
  1753         else:
  1754         else:
  1754             event.Skip()
  1755             event.Skip()
  1755 
  1756 
  1756     def OnTypesTreeItemEndEdit(self, event):
  1757     def OnProjectTreeItemEndEdit(self, event):
  1757         message = None
  1758         message = None
  1758         abort = False
  1759         abort = False
  1759         new_name = event.GetLabel()
  1760         new_name = event.GetLabel()
  1760         if new_name != "":
  1761         if new_name != "":
  1761             if not TestIdentifier(new_name):
  1762             if not TestIdentifier(new_name):
  1762                 message = _("\"%s\" is not a valid identifier!")%new_name
  1763                 message = _("\"%s\" is not a valid identifier!")%new_name
  1763             elif new_name.upper() in IEC_KEYWORDS:
  1764             elif new_name.upper() in IEC_KEYWORDS:
  1764                 message = _("\"%s\" is a keyword. It can't be used!")%new_name
  1765                 message = _("\"%s\" is a keyword. It can't be used!")%new_name
  1765             else:
  1766             else:
  1766                 item = event.GetItem()
  1767                 item = event.GetItem()
  1767                 old_name = self.TypesTree.GetItemText(item)
  1768                 old_name = self.ProjectTree.GetItemText(item)
  1768                 itemtype = self.TypesTree.GetPyData(item)
  1769                 itemtype = self.ProjectTree.GetPyData(item)
  1769                 if itemtype == ITEM_PROJECT:
  1770                 if itemtype == ITEM_PROJECT:
  1770                     self.Controler.SetProjectProperties(name = new_name)
  1771                     self.Controler.SetProjectProperties(name = new_name)
  1771                 elif itemtype == ITEM_DATATYPE:
  1772                 elif itemtype == ITEM_DATATYPE:
  1772                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1773                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1773                         message = _("\"%s\" data type already exists!")%new_name
  1774                         message = _("\"%s\" data type already exists!")%new_name
  1791                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1792                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1792                                                 self.Controler.ComputePouName(new_name))
  1793                                                 self.Controler.ComputePouName(new_name))
  1793                         self.RefreshLibraryPanel()
  1794                         self.RefreshLibraryPanel()
  1794                         self.RefreshPageTitles()
  1795                         self.RefreshPageTitles()
  1795                 elif itemtype == ITEM_TRANSITION:
  1796                 elif itemtype == ITEM_TRANSITION:
  1796                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1797                     pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
  1797                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1798                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1798                         message = _("A POU named \"%s\" already exists!")%new_name
  1799                         message = _("A POU named \"%s\" already exists!")%new_name
  1799                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1800                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1800                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1801                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1801                     else:
  1802                     else:
  1802                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1803                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1803                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1804                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1804                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1805                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1805                         self.RefreshPageTitles()
  1806                         self.RefreshPageTitles()
  1806                 elif itemtype == ITEM_ACTION:
  1807                 elif itemtype == ITEM_ACTION:
  1807                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1808                     pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
  1808                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1809                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1809                         message = _("A POU named \"%s\" already exists!")%new_name
  1810                         message = _("A POU named \"%s\" already exists!")%new_name
  1810                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1811                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1811                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1812                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1812                     else:
  1813                     else:
  1832                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1833                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1833                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1834                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1834                                                 self.Controler.ComputeConfigurationName(new_name))
  1835                                                 self.Controler.ComputeConfigurationName(new_name))
  1835                         self.RefreshPageTitles()
  1836                         self.RefreshPageTitles()
  1836                 elif itemtype == ITEM_RESOURCE:
  1837                 elif itemtype == ITEM_RESOURCE:
  1837                     config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION)
  1838                     config_name = GetParentName(self.ProjectTree, item, ITEM_CONFIGURATION)
  1838                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1839                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1839                         message = _("\"%s\" config already exists!")%new_name
  1840                         message = _("\"%s\" config already exists!")%new_name
  1840                         abort = True
  1841                         abort = True
  1841                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1842                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1842                         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)
  1843                         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)
  1855                         self.RefreshPageTitles()
  1856                         self.RefreshPageTitles()
  1856             if message or abort:
  1857             if message or abort:
  1857                 if message:
  1858                 if message:
  1858                     self.ShowErrorMessage(message)
  1859                     self.ShowErrorMessage(message)
  1859                 item = event.GetItem()
  1860                 item = event.GetItem()
  1860                 wx.CallAfter(self.TypesTree.EditLabel, item)
  1861                 wx.CallAfter(self.ProjectTree.EditLabel, item)
  1861                 event.Veto()
  1862                 event.Veto()
  1862             else:
  1863             else:
  1863                 wx.CallAfter(self.RefreshTypesTree)
  1864                 wx.CallAfter(self.RefreshProjectTree)
  1864                 self.RefreshEditor()
  1865                 self.RefreshEditor()
  1865                 self._Refresh(TITLE, FILEMENU, EDITMENU)
  1866                 self._Refresh(TITLE, FILEMENU, EDITMENU)
  1866                 event.Skip()
  1867                 event.Skip()
  1867     
  1868     
  1868     def OnTypesTreeItemActivated(self, event):
  1869     def OnProjectTreeItemActivated(self, event):
  1869         selected = event.GetItem()
  1870         selected = event.GetItem()
  1870         name = self.TypesTree.GetItemText(selected)
  1871         name = self.ProjectTree.GetItemText(selected)
  1871         data = self.TypesTree.GetPyData(selected)
  1872         data = self.ProjectTree.GetPyData(selected)
  1872         if UNEDITABLE_NAMES_DICT.get(name, name) == "Properties":
  1873         if data == ITEM_PROJECT:
  1873             self.ShowProperties()
  1874             self.EditProjectSettings()
  1874         if data == ITEM_DATATYPE:
  1875         elif data == ITEM_DATATYPE:
  1875             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1876             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1876         elif data == ITEM_POU:
  1877         elif data == ITEM_POU:
  1877             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1878             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1878         elif data == ITEM_CONFIGURATION:
  1879         elif data == ITEM_CONFIGURATION:
  1879             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1880             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1880         elif data == ITEM_RESOURCE:
  1881         elif data == ITEM_RESOURCE:
  1881             config_name = GetParentName(self.TypesTree, selected, ITEM_CONFIGURATION)
  1882             config_name = GetParentName(self.ProjectTree, selected, ITEM_CONFIGURATION)
  1882             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
  1883             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
  1883         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1884         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1884             pou_name = GetParentName(self.TypesTree, selected, ITEM_POU)
  1885             pou_name = GetParentName(self.ProjectTree, selected, ITEM_POU)
  1885             if data == ITEM_TRANSITION:
  1886             if data == ITEM_TRANSITION:
  1886                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1887                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1887             elif data == ITEM_ACTION:
  1888             elif data == ITEM_ACTION:
  1888                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1889                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1889             self.EditProjectElement(data, tagname)
  1890             self.EditProjectElement(data, tagname)
  1890         event.Skip()
  1891         event.Skip()
  1891     
  1892     
  1892     def TypesTreeItemSelect(self, select_item):
  1893     def ProjectTreeItemSelect(self, select_item):
  1893         name = self.TypesTree.GetItemText(select_item)
  1894         name = self.ProjectTree.GetItemText(select_item)
  1894         data = self.TypesTree.GetPyData(select_item)
  1895         data = self.ProjectTree.GetPyData(select_item)
       
  1896         tagname = None
  1895         if data == ITEM_DATATYPE:
  1897         if data == ITEM_DATATYPE:
  1896             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True)
  1898             tagname = self.Controler.ComputeDataTypeName(name)
  1897         elif data == ITEM_POU:
  1899         elif data == ITEM_POU:
  1898             self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
  1900             tagname = self.Controler.ComputePouName(name)
  1899         elif data == ITEM_CONFIGURATION:
  1901         elif data == ITEM_CONFIGURATION:
  1900             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1902             tagname = self.Controler.ComputeConfigurationName(name)
  1901         elif data == ITEM_RESOURCE:
  1903         elif data == ITEM_RESOURCE:
  1902             config_name = GetParentName(self.TypesTree, select_item, ITEM_CONFIGURATION)
  1904             config_name = GetParentName(self.ProjectTree, select_item, ITEM_CONFIGURATION)
  1903             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True)
  1905             tagname = self.Controler.ComputeConfigurationResourceName(config_name, name)
  1904         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1906         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1905             pou_name = GetParentName(self.TypesTree, select_item, ITEM_POU)
  1907             pou_name = GetParentName(self.ProjectTree, select_item, ITEM_POU)
  1906             if data == ITEM_TRANSITION:
  1908             if data == ITEM_TRANSITION:
  1907                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1909                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1908             elif data == ITEM_ACTION:
  1910             elif data == ITEM_ACTION:
  1909                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1911                 tagname = self.Controler.ComputePouActionName(pou_name, name)
       
  1912         if tagname is not None:
  1910             self.EditProjectElement(data, tagname, True)
  1913             self.EditProjectElement(data, tagname, True)
  1911     
  1914         self.PouInstanceVariablesPanel.SetPouType(tagname)
  1912     def OnTypesTreeLeftUp(self, event):
  1915         
       
  1916     def OnProjectTreeLeftUp(self, event):
  1913         if self.SelectedItem is not None:
  1917         if self.SelectedItem is not None:
  1914             self.TypesTree.SelectItem(self.SelectedItem)
  1918             self.ProjectTree.SelectItem(self.SelectedItem)
  1915             self.TypesTreeItemSelect(self.SelectedItem)
  1919             self.ProjectTreeItemSelect(self.SelectedItem)
  1916             wx.CallAfter(self.ResetSelectedItem)
  1920             wx.CallAfter(self.ResetSelectedItem)
  1917         event.Skip()
  1921         event.Skip()
  1918     
  1922     
  1919     def OnTypesTreeItemSelected(self, event):
  1923     def OnProjectTreeItemSelected(self, event):
  1920         self.TypesTreeItemSelect(event.GetItem())
  1924         self.ProjectTreeItemSelect(event.GetItem())
  1921         event.Skip()
  1925         event.Skip()
  1922     
  1926     
  1923     def OnTypesTreeItemChanging(self, event):
  1927     def OnProjectTreeItemChanging(self, event):
  1924         if self.TypesTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1928         if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1925             self.SelectedItem = event.GetItem()
  1929             self.SelectedItem = event.GetItem()
  1926             event.Veto()
  1930             event.Veto()
  1927         else:
  1931         else:
  1928             event.Skip()
  1932             event.Skip()
  1929     
  1933     
  1998                         self.TabsOpened.SetSelection(i)
  2002                         self.TabsOpened.SetSelection(i)
  1999                         window.SetFocus()
  2003                         window.SetFocus()
  2000                 self.RefreshPageTitles()
  2004                 self.RefreshPageTitles()
  2001             return new_window
  2005             return new_window
  2002     
  2006     
  2003     def OnTypesTreeRightUp(self, event):
  2007     def OnProjectTreeRightUp(self, event):
  2004         if wx.Platform == '__WXMSW__':
  2008         if wx.Platform == '__WXMSW__':
  2005             item = event.GetItem()
  2009             item = event.GetItem()
  2006         else:
  2010         else:
  2007             item, flags = self.TypesTree.HitTest(wx.Point(event.GetX(), event.GetY()))
  2011             item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY()))
  2008         self.TypesTree.SelectItem(item)
  2012         self.ProjectTree.SelectItem(item)
  2009         self.TypesTreeItemSelect(item)
  2013         self.ProjectTreeItemSelect(item)
  2010         name = self.TypesTree.GetItemText(item)
  2014         name = self.ProjectTree.GetItemText(item)
  2011         type = self.TypesTree.GetPyData(item)
  2015         type = self.ProjectTree.GetPyData(item)
  2012         
  2016         
  2013         menu = None
  2017         menu = None
  2014         if type in ITEMS_UNEDITABLE:
  2018         if type in ITEMS_UNEDITABLE:
  2015             name = UNEDITABLE_NAMES_DICT[name]
  2019             name = UNEDITABLE_NAMES_DICT[name]
  2016             
  2020             
  2041             
  2045             
  2042             elif name == "Transitions":
  2046             elif name == "Transitions":
  2043                 menu = wx.Menu(title='')
  2047                 menu = wx.Menu(title='')
  2044                 new_id = wx.NewId()
  2048                 new_id = wx.NewId()
  2045                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  2049                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  2046                 parent = self.TypesTree.GetItemParent(item)
  2050                 parent = self.ProjectTree.GetItemParent(item)
  2047                 parent_type = self.TypesTree.GetPyData(parent)
  2051                 parent_type = self.ProjectTree.GetPyData(parent)
  2048                 while parent_type != ITEM_POU:
  2052                 while parent_type != ITEM_POU:
  2049                     parent = self.TypesTree.GetItemParent(parent)
  2053                     parent = self.ProjectTree.GetItemParent(parent)
  2050                     parent_type = self.TypesTree.GetPyData(parent)
  2054                     parent_type = self.ProjectTree.GetPyData(parent)
  2051                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  2055                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  2052             
  2056             
  2053             elif name == "Actions":
  2057             elif name == "Actions":
  2054                 menu = wx.Menu(title='')
  2058                 menu = wx.Menu(title='')
  2055                 new_id = wx.NewId()
  2059                 new_id = wx.NewId()
  2056                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  2060                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  2057                 parent = self.TypesTree.GetItemParent(item)
  2061                 parent = self.ProjectTree.GetItemParent(item)
  2058                 parent_type = self.TypesTree.GetPyData(parent)
  2062                 parent_type = self.ProjectTree.GetPyData(parent)
  2059                 while parent_type != ITEM_POU:
  2063                 while parent_type != ITEM_POU:
  2060                     parent = self.TypesTree.GetItemParent(parent)
  2064                     parent = self.ProjectTree.GetItemParent(parent)
  2061                     parent_type = self.TypesTree.GetPyData(parent)
  2065                     parent_type = self.ProjectTree.GetPyData(parent)
  2062                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  2066                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  2063             
  2067             
  2064             elif name == "Resources":
  2068             elif name == "Resources":
  2065                 menu = wx.Menu(title='')
  2069                 menu = wx.Menu(title='')
  2066                 new_id = wx.NewId()
  2070                 new_id = wx.NewId()
  2067                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  2071                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  2068                 parent = self.TypesTree.GetItemParent(item)
  2072                 parent = self.ProjectTree.GetItemParent(item)
  2069                 parent_type = self.TypesTree.GetPyData(parent)
  2073                 parent_type = self.ProjectTree.GetPyData(parent)
  2070                 while parent_type != ITEM_CONFIGURATION:
  2074                 while parent_type != ITEM_CONFIGURATION:
  2071                     parent = self.TypesTree.GetItemParent(parent)
  2075                     parent = self.ProjectTree.GetItemParent(parent)
  2072                     parent_type = self.TypesTree.GetPyData(parent)
  2076                     parent_type = self.ProjectTree.GetPyData(parent)
  2073                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  2077                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  2074             
  2078             
  2075         else:
  2079         else:
  2076             if type == ITEM_POU:
  2080             if type == ITEM_POU:
  2077                 menu = wx.Menu(title='')
  2081                 menu = wx.Menu(title='')
  2078                 if self.Controler.GetPouBodyType(name) == "SFC":
  2082                 if self.Controler.GetPouBodyType(name) == "SFC":
  2126 
  2130 
  2127 #-------------------------------------------------------------------------------
  2131 #-------------------------------------------------------------------------------
  2128 #                         Instances Tree Management Functions
  2132 #                         Instances Tree Management Functions
  2129 #-------------------------------------------------------------------------------
  2133 #-------------------------------------------------------------------------------
  2130 
  2134 
  2131     def RefreshInstancesTree(self):
  2135     def GetTreeImage(self, var_class):
  2132         infos = self.Controler.GetProjectTopology(self.EnableDebug)
  2136         return self.TreeImageDict[var_class]
  2133         root = self.InstancesTree.GetRootItem()
  2137     
  2134         if not root.IsOk():
  2138     def RefreshPouInstanceVariablesPanel(self):
  2135             root = self.InstancesTree.AddRoot(infos["name"])
  2139         self.PouInstanceVariablesPanel.RefreshView()
  2136         self.GenerateInstancesTreeBranch(root, infos)
       
  2137         self.InstancesTree.Expand(root)
       
  2138 
       
  2139     def GenerateInstancesTreeBranch(self, root, infos):
       
  2140         to_delete = []
       
  2141         if infos.get("elmt_type", None) is not None:
       
  2142             self.InstancesTree.SetItemText(root, "%s (%s)"%(infos["name"], infos["elmt_type"]))
       
  2143         else:
       
  2144             self.InstancesTree.SetItemText(root, infos["name"])
       
  2145         self.InstancesTree.SetPyData(root, (infos["type"], infos.get("tagname", None)))
       
  2146         self.InstancesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
       
  2147             
       
  2148         if wx.VERSION >= (2, 6, 0):
       
  2149             item, root_cookie = self.InstancesTree.GetFirstChild(root)
       
  2150         else:
       
  2151             item, root_cookie = self.InstancesTree.GetFirstChild(root, 0)
       
  2152         for values in infos["values"]:
       
  2153             if not item.IsOk():
       
  2154                 item = self.InstancesTree.AppendItem(root, "")
       
  2155                 if wx.Platform != '__WXMSW__':
       
  2156                     item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  2157             self.GenerateInstancesTreeBranch(item, values)
       
  2158             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  2159         while item.IsOk():
       
  2160             to_delete.append(item)
       
  2161             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  2162         for item in to_delete:
       
  2163             self.InstancesTree.Delete(item)
       
  2164         if infos["type"] in [ITEM_CONFIGURATION, ITEM_RESOURCE]:
       
  2165             self.InstancesTree.Expand(root)
       
  2166 
       
  2167     def OnInstancesTreeBeginDrag(self, event):
       
  2168         if self.Controler.DebugAvailable():
       
  2169             selected_item = event.GetItem()
       
  2170             selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  2171             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  2172                 var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
       
  2173                 parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  2174                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  2175                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  2176                     var_path = "%s.%s"%(parent_name, var_path)
       
  2177                     parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  2178                 data = wx.TextDataObject(str((var_path, "debug")))
       
  2179                 dragSource = wx.DropSource(self.InstancesTree)
       
  2180                 dragSource.SetData(data)
       
  2181                 dragSource.DoDragDrop()
       
  2182             event.Skip()
       
  2183         else:
       
  2184             event.Veto()
       
  2185 
       
  2186     def OnInstancesTreeItemActivated(self, event):
       
  2187         if self.Controler.DebugAvailable():
       
  2188             selected_item = event.GetItem()
       
  2189             selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  2190             if selected_item is not None and (
       
  2191                 selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION] or
       
  2192                 selected_infos[0] in ITEMS_VARIABLE):
       
  2193                 
       
  2194                 instance_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  2195                 if selected_infos[1] is not None:
       
  2196                     instance_type = selected_infos[1]
       
  2197                 else:
       
  2198                     instance_type = var_type.split(")")[0]
       
  2199                 parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  2200                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  2201                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  2202                     instance_path = "%s.%s"%(parent_name, instance_path)
       
  2203                     parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  2204                 
       
  2205                 self.OpenDebugViewer(selected_infos[0], instance_path, instance_type)
       
  2206         
       
  2207         event.Skip()
       
  2208 
  2140 
  2209     def OpenDebugViewer(self, instance_category, instance_path, instance_type):
  2141     def OpenDebugViewer(self, instance_category, instance_path, instance_type):
  2210         openedidx = self.IsOpened(instance_path)
  2142         openedidx = self.IsOpened(instance_path)
  2211         if openedidx is not None:
  2143         if openedidx is not None:
  2212             old_selected = self.TabsOpened.GetSelection()
  2144             old_selected = self.TabsOpened.GetSelection()
  2269         new_window.RefreshView()
  2201         new_window.RefreshView()
  2270         new_window.SetFocus()
  2202         new_window.SetFocus()
  2271         self.RefreshPageTitles()
  2203         self.RefreshPageTitles()
  2272         return new_window
  2204         return new_window
  2273 
  2205 
  2274     def OnInstancesTreeRightUp(self, event):
       
  2275         if self.Controler.DebugAvailable():
       
  2276             if wx.Platform == '__WXMSW__':
       
  2277                 selected_item = event.GetItem()
       
  2278             else:
       
  2279                 selected_item = self.InstancesTree.GetSelection()
       
  2280             selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  2281             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  2282                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  2283                 var_type = var_type.split(")")[0]
       
  2284                 
       
  2285                 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\
       
  2286                    self.Controler.IsOfType(var_type, "ANY_BIT", True):
       
  2287                     parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  2288                     while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  2289                         parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  2290                         var_path = "%s.%s"%(parent_name, var_path)
       
  2291                         parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  2292                     
       
  2293                     menu = wx.Menu(title='')
       
  2294                     new_id = wx.NewId()
       
  2295                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel"))
       
  2296                     self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id)
       
  2297                     new_id = wx.NewId()
       
  2298                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log"))
       
  2299                     self.PopupMenu(menu)
       
  2300         event.Skip()
       
  2301 
       
  2302     def AddVariableGraphicFunction(self, iec_path):
       
  2303         def AddVariableGraphic(event):
       
  2304             self.OpenGraphicViewer(iec_path)
       
  2305             event.Skip()
       
  2306         return AddVariableGraphic
       
  2307 
       
  2308     def GetInstancesTreeItem(self, root, instancepath):
       
  2309         paths = instancepath.split(".", 1)
       
  2310         if wx.VERSION >= (2, 6, 0):
       
  2311             item, root_cookie = self.InstancesTree.GetFirstChild(root)
       
  2312         else:
       
  2313             item, root_cookie = self.InstancesTree.GetFirstChild(root, 0)
       
  2314         while item.IsOk():
       
  2315             name = self.InstancesTree.GetItemText(item).split(" (")[0]
       
  2316             if name == paths[0]:
       
  2317                 if len(paths) == 1:
       
  2318                     return item
       
  2319                 else:
       
  2320                     return self.GetInstancesTreeItem(item, paths[1])
       
  2321             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  2322         return None
       
  2323     
       
  2324     def SelectInstancesTreeItem(self, instancepath):
       
  2325         if self.InstancesTree is not None:
       
  2326             root = self.InstancesTree.GetRootItem()
       
  2327             if root.IsOk():
       
  2328                 item = self.GetInstancesTreeItem(root, instancepath)
       
  2329                 if item is not None:
       
  2330                     self.InstancesTree.SelectItem(item)
       
  2331                     return True
       
  2332         return False
       
  2333     
       
  2334     def ResetGraphicViewers(self):
  2206     def ResetGraphicViewers(self):
  2335         for i in xrange(self.TabsOpened.GetPageCount()):
  2207         for i in xrange(self.TabsOpened.GetPageCount()):
  2336             editor = self.TabsOpened.GetPage(i)
  2208             editor = self.TabsOpened.GetPage(i)
  2337             if isinstance(editor, GraphicViewer):
  2209             if isinstance(editor, GraphicViewer):
  2338                 editor.ResetView()
  2210                 editor.ResetView()
  2339 
  2211 
  2340     def CloseObsoleteDebugTabs(self):
  2212     def CloseObsoleteDebugTabs(self):
  2341         if self.EnableDebug:
  2213         if self.EnableDebug:
  2342             idxs = range(self.TabsOpened.GetPageCount())
  2214             idxs = range(self.TabsOpened.GetPageCount())
  2343             idxs.reverse()
  2215             idxs.reverse()
  2344             root = None
       
  2345             if self.InstancesTree is not None:
       
  2346                 root = self.InstancesTree.GetRootItem()
       
  2347                 if not root.IsOk():
       
  2348                     root = None
       
  2349             for idx in idxs:
  2216             for idx in idxs:
  2350                 editor = self.TabsOpened.GetPage(idx)
  2217                 editor = self.TabsOpened.GetPage(idx)
  2351                 if editor.IsDebugging():
  2218                 if editor.IsDebugging():
  2352                     item = None
  2219                     instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath())
  2353                     if root is not None:
  2220                     if instance_infos is None:
  2354                         item = self.GetInstancesTreeItem(root, editor.GetInstancePath())
       
  2355                     if item is None:
       
  2356                         self.TabsOpened.DeletePage(idx)
  2221                         self.TabsOpened.DeletePage(idx)
  2357                     elif isinstance(editor, GraphicViewer):
  2222                     elif isinstance(editor, GraphicViewer):
  2358                         editor.ResetView(True)
  2223                         editor.ResetView(True)
  2359                     else:
  2224                     else:
  2360                         editor.RefreshView()
  2225                         editor.RefreshView()
  2361             self.DebugVariablePanel.UnregisterObsoleteData()
  2226             self.DebugVariablePanel.UnregisterObsoleteData()
  2362     
  2227     
  2363     def AddDebugVariable(self, iec_path):
  2228     def AddDebugVariable(self, iec_path, force=False):
  2364         if self.EnableDebug:
  2229         if self.EnableDebug:
  2365             self.DebugVariablePanel.InsertValue(iec_path)
  2230             self.DebugVariablePanel.InsertValue(iec_path, force=force)
  2366             
  2231             
  2367 #-------------------------------------------------------------------------------
  2232 #-------------------------------------------------------------------------------
  2368 #                         Library Panel Management Function
  2233 #                         Library Panel Management Function
  2369 #-------------------------------------------------------------------------------
  2234 #-------------------------------------------------------------------------------
  2370 
  2235 
  2601         dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL)
  2466         dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL)
  2602         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  2467         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  2603         if dialog.ShowModal() == wx.ID_OK:
  2468         if dialog.ShowModal() == wx.ID_OK:
  2604             tagname = self.Controler.ProjectAddDataType(dialog.GetValue())
  2469             tagname = self.Controler.ProjectAddDataType(dialog.GetValue())
  2605             if tagname is not None:
  2470             if tagname is not None:
  2606                 self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2471                 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2607                 self.EditProjectElement(ITEM_DATATYPE, tagname)
  2472                 self.EditProjectElement(ITEM_DATATYPE, tagname)
  2608         dialog.Destroy()
  2473         dialog.Destroy()
  2609 
  2474 
  2610     def GenerateAddPouFunction(self, pou_type):
  2475     def GenerateAddPouFunction(self, pou_type):
  2611         def OnAddPouMenu(event):
  2476         def OnAddPouMenu(event):
  2614             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2479             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2615             if dialog.ShowModal() == wx.ID_OK:
  2480             if dialog.ShowModal() == wx.ID_OK:
  2616                 values = dialog.GetValues()
  2481                 values = dialog.GetValues()
  2617                 tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2482                 tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2618                 if tagname is not None:
  2483                 if tagname is not None:
  2619                     self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE)
  2484                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2620                     self.EditProjectElement(ITEM_POU, tagname)
  2485                     self.EditProjectElement(ITEM_POU, tagname)
  2621             dialog.Destroy()
  2486             dialog.Destroy()
  2622         return OnAddPouMenu
  2487         return OnAddPouMenu
  2623 
  2488 
  2624     def GenerateAddTransitionFunction(self, pou_name):
  2489     def GenerateAddTransitionFunction(self, pou_name):
  2628             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2493             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2629             if dialog.ShowModal() == wx.ID_OK: 
  2494             if dialog.ShowModal() == wx.ID_OK: 
  2630                 values = dialog.GetValues()
  2495                 values = dialog.GetValues()
  2631                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2496                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2632                 if tagname is not None:
  2497                 if tagname is not None:
  2633                     self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2498                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2634                     self.EditProjectElement(ITEM_TRANSITION, tagname)
  2499                     self.EditProjectElement(ITEM_TRANSITION, tagname)
  2635             dialog.Destroy()
  2500             dialog.Destroy()
  2636         return OnAddTransitionMenu
  2501         return OnAddTransitionMenu
  2637 
  2502 
  2638     def GenerateAddActionFunction(self, pou_name):
  2503     def GenerateAddActionFunction(self, pou_name):
  2642             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2507             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2643             if dialog.ShowModal() == wx.ID_OK:
  2508             if dialog.ShowModal() == wx.ID_OK:
  2644                 values = dialog.GetValues()
  2509                 values = dialog.GetValues()
  2645                 tagname = self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2510                 tagname = self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2646                 if tagname is not None:
  2511                 if tagname is not None:
  2647                     self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2512                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2648                     self.EditProjectElement(ITEM_ACTION, tagname)
  2513                     self.EditProjectElement(ITEM_ACTION, tagname)
  2649             dialog.Destroy()
  2514             dialog.Destroy()
  2650         return OnAddActionMenu
  2515         return OnAddActionMenu
  2651 
  2516 
  2652     def OnAddConfigurationMenu(self, event):
  2517     def OnAddConfigurationMenu(self, event):
  2655         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2520         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2656         if dialog.ShowModal() == wx.ID_OK:
  2521         if dialog.ShowModal() == wx.ID_OK:
  2657             value = dialog.GetValue()
  2522             value = dialog.GetValue()
  2658             tagname = self.Controler.ProjectAddConfiguration(value)
  2523             tagname = self.Controler.ProjectAddConfiguration(value)
  2659             if tagname is not None:
  2524             if tagname is not None:
  2660                 self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2525                 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2661                 self.EditProjectElement(ITEM_CONFIGURATION, tagname)
  2526                 self.EditProjectElement(ITEM_CONFIGURATION, tagname)
  2662         dialog.Destroy()
  2527         dialog.Destroy()
  2663 
  2528 
  2664     def GenerateAddResourceFunction(self, config_name):
  2529     def GenerateAddResourceFunction(self, config_name):
  2665         def OnAddResourceMenu(event):
  2530         def OnAddResourceMenu(event):
  2668             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2533             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2669             if dialog.ShowModal() == wx.ID_OK:
  2534             if dialog.ShowModal() == wx.ID_OK:
  2670                 value = dialog.GetValue()
  2535                 value = dialog.GetValue()
  2671                 tagname = self.Controler.ProjectAddConfigurationResource(config_name, value)
  2536                 tagname = self.Controler.ProjectAddConfigurationResource(config_name, value)
  2672                 if tagname is not None:
  2537                 if tagname is not None:
  2673                     self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2538                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2674                     self.EditProjectElement(ITEM_RESOURCE, tagname)
  2539                     self.EditProjectElement(ITEM_RESOURCE, tagname)
  2675             dialog.Destroy()
  2540             dialog.Destroy()
  2676         return OnAddResourceMenu
  2541         return OnAddResourceMenu
  2677 
  2542 
  2678     def GenerateChangePouTypeFunction(self, name, new_type):
  2543     def GenerateChangePouTypeFunction(self, name, new_type):
  2679         def OnChangePouTypeMenu(event):
  2544         def OnChangePouTypeMenu(event):
  2680             selected = self.TypesTree.GetSelection()
  2545             selected = self.ProjectTree.GetSelection()
  2681             if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2546             if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
  2682                 self.Controler.ProjectChangePouType(name, new_type)
  2547                 self.Controler.ProjectChangePouType(name, new_type)
  2683                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE)
  2548                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2684         return OnChangePouTypeMenu
  2549         return OnChangePouTypeMenu
  2685 
  2550 
  2686     def OnCopyPou(self, event):
  2551     def OnCopyPou(self, event):
  2687         selected = self.TypesTree.GetSelection()
  2552         selected = self.ProjectTree.GetSelection()
  2688         pou_name = self.TypesTree.GetItemText(selected)
  2553         pou_name = self.ProjectTree.GetItemText(selected)
  2689         
  2554         
  2690         pou_xml = self.Controler.GetPouXml(pou_name)
  2555         pou_xml = self.Controler.GetPouXml(pou_name)
  2691         if pou_xml is not None:
  2556         if pou_xml is not None:
  2692             self.SetCopyBuffer(pou_xml)
  2557             self.SetCopyBuffer(pou_xml)
  2693             self._Refresh(EDITMENU)
  2558             self._Refresh(EDITMENU)
  2694 
  2559 
  2695     def OnPastePou(self, event):
  2560     def OnPastePou(self, event):
  2696         selected = self.TypesTree.GetSelection()
  2561         selected = self.ProjectTree.GetSelection()
  2697 
  2562 
  2698         pou_type = self.TypesTree.GetItemText(selected)
  2563         pou_type = self.ProjectTree.GetItemText(selected)
  2699         pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs'
  2564         pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs'
  2700         pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type]
  2565         pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type]
  2701 
  2566 
  2702         pou_xml = self.GetCopyBuffer()
  2567         pou_xml = self.GetCopyBuffer()
  2703 
  2568 
  2706         if result is not None:
  2571         if result is not None:
  2707             message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR)
  2572             message = wx.MessageDialog(self, result, _("Error"), wx.OK|wx.ICON_ERROR)
  2708             message.ShowModal()
  2573             message.ShowModal()
  2709             message.Destroy()
  2574             message.Destroy()
  2710         else:
  2575         else:
  2711             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, LIBRARYTREE)
  2576             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2712 
  2577 
  2713 #-------------------------------------------------------------------------------
  2578 #-------------------------------------------------------------------------------
  2714 #                        Remove Project Elements Functions
  2579 #                        Remove Project Elements Functions
  2715 #-------------------------------------------------------------------------------
  2580 #-------------------------------------------------------------------------------
  2716 
  2581 
  2717     def OnRemoveDataTypeMenu(self, event):
  2582     def OnRemoveDataTypeMenu(self, event):
  2718         selected = self.TypesTree.GetSelection()
  2583         selected = self.ProjectTree.GetSelection()
  2719         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  2584         if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE:
  2720             name = self.TypesTree.GetItemText(selected)
  2585             name = self.ProjectTree.GetItemText(selected)
  2721             if not self.Controler.DataTypeIsUsed(name):
  2586             if not self.Controler.DataTypeIsUsed(name):
  2722                 self.Controler.ProjectRemoveDataType(name)
  2587                 self.Controler.ProjectRemoveDataType(name)
  2723                 tagname = self.Controler.ComputeDataTypeName(name)
  2588                 tagname = self.Controler.ComputeDataTypeName(name)
  2724                 idx = self.IsOpened(tagname)
  2589                 idx = self.IsOpened(tagname)
  2725                 if idx is not None:
  2590                 if idx is not None:
  2726                     self.TabsOpened.DeletePage(idx)
  2591                     self.TabsOpened.DeletePage(idx)
  2727                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE)
  2592                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE)
  2728             else:
  2593             else:
  2729                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2594                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2730 
  2595 
  2731     def OnRenamePouMenu(self, event):
  2596     def OnRenamePouMenu(self, event):
  2732         selected = self.TypesTree.GetSelection()
  2597         selected = self.ProjectTree.GetSelection()
  2733         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2598         if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
  2734             wx.CallAfter(self.TypesTree.EditLabel, selected)
  2599             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2735 
  2600 
  2736     def OnRemovePouMenu(self, event):
  2601     def OnRemovePouMenu(self, event):
  2737         selected = self.TypesTree.GetSelection()
  2602         selected = self.ProjectTree.GetSelection()
  2738         if self.TypesTree.GetPyData(selected) == ITEM_POU:
  2603         if self.ProjectTree.GetPyData(selected) == ITEM_POU:
  2739             name = self.TypesTree.GetItemText(selected)
  2604             name = self.ProjectTree.GetItemText(selected)
  2740             if not self.Controler.PouIsUsed(name):
  2605             if not self.Controler.PouIsUsed(name):
  2741                 self.Controler.ProjectRemovePou(name)
  2606                 self.Controler.ProjectRemovePou(name)
  2742                 tagname = self.Controler.ComputePouName(name)
  2607                 tagname = self.Controler.ComputePouName(name)
  2743                 idx = self.IsOpened(tagname)
  2608                 idx = self.IsOpened(tagname)
  2744                 if idx is not None:
  2609                 if idx is not None:
  2745                     self.TabsOpened.DeletePage(idx)
  2610                     self.TabsOpened.DeletePage(idx)
  2746                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2611                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2747             else:
  2612             else:
  2748                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2613                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2749 
  2614 
  2750     def OnRemoveTransitionMenu(self, event):
  2615     def OnRemoveTransitionMenu(self, event):
  2751         selected = self.TypesTree.GetSelection()
  2616         selected = self.ProjectTree.GetSelection()
  2752         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2617         if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: 
  2753             transition = self.TypesTree.GetItemText(selected)
  2618             transition = self.ProjectTree.GetItemText(selected)
  2754             item = self.TypesTree.GetItemParent(selected)
  2619             item = self.ProjectTree.GetItemParent(selected)
  2755             item_type = self.TypesTree.GetPyData(item)
  2620             item_type = self.ProjectTree.GetPyData(item)
  2756             while item_type != ITEM_POU:
  2621             while item_type != ITEM_POU:
  2757                 item = self.TypesTree.GetItemParent(item)
  2622                 item = self.ProjectTree.GetItemParent(item)
  2758                 item_type = self.TypesTree.GetPyData(item)
  2623                 item_type = self.ProjectTree.GetPyData(item)
  2759             pou_name = self.TypesTree.GetItemText(item)
  2624             pou_name = self.ProjectTree.GetItemText(item)
  2760             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2625             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2761             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2626             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2762             idx = self.IsOpened(tagname)
  2627             idx = self.IsOpened(tagname)
  2763             if idx is not None:
  2628             if idx is not None:
  2764                 self.TabsOpened.DeletePage(idx)
  2629                 self.TabsOpened.DeletePage(idx)
  2765             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2630             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2766 
  2631 
  2767     def OnRemoveActionMenu(self, event):
  2632     def OnRemoveActionMenu(self, event):
  2768         selected = self.TypesTree.GetSelection()
  2633         selected = self.ProjectTree.GetSelection()
  2769         if self.TypesTree.GetPyData(selected) == ITEM_ACTION: 
  2634         if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: 
  2770             action = self.TypesTree.GetItemText(selected)
  2635             action = self.ProjectTree.GetItemText(selected)
  2771             item = self.TypesTree.GetItemParent(selected)
  2636             item = self.ProjectTree.GetItemParent(selected)
  2772             item_type = self.TypesTree.GetPyData(item)
  2637             item_type = self.ProjectTree.GetPyData(item)
  2773             while item_type != ITEM_POU:
  2638             while item_type != ITEM_POU:
  2774                 item = self.TypesTree.GetItemParent(item)
  2639                 item = self.ProjectTree.GetItemParent(item)
  2775                 item_type = self.TypesTree.GetPyData(item)
  2640                 item_type = self.ProjectTree.GetPyData(item)
  2776             pou_name = self.TypesTree.GetItemText(item)
  2641             pou_name = self.ProjectTree.GetItemText(item)
  2777             self.Controler.ProjectRemovePouAction(pou_name, action)
  2642             self.Controler.ProjectRemovePouAction(pou_name, action)
  2778             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2643             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2779             idx = self.IsOpened(tagname)
  2644             idx = self.IsOpened(tagname)
  2780             if idx is not None:
  2645             if idx is not None:
  2781                 self.TabsOpened.DeletePage(idx)
  2646                 self.TabsOpened.DeletePage(idx)
  2782             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2647             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2783 
  2648 
  2784     def OnRemoveConfigurationMenu(self, event):
  2649     def OnRemoveConfigurationMenu(self, event):
  2785         selected = self.TypesTree.GetSelection()
  2650         selected = self.ProjectTree.GetSelection()
  2786         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2651         if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2787             name = self.TypesTree.GetItemText(selected)
  2652             name = self.ProjectTree.GetItemText(selected)
  2788             self.Controler.ProjectRemoveConfiguration(name)
  2653             self.Controler.ProjectRemoveConfiguration(name)
  2789             tagname = self.Controler.ComputeConfigurationName(name)
  2654             tagname = self.Controler.ComputeConfigurationName(name)
  2790             idx = self.IsOpened(tagname)
  2655             idx = self.IsOpened(tagname)
  2791             if idx is not None:
  2656             if idx is not None:
  2792                 self.TabsOpened.DeletePage(idx)
  2657                 self.TabsOpened.DeletePage(idx)
  2793             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2658             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2794 
  2659 
  2795     def OnRemoveResourceMenu(self, event):
  2660     def OnRemoveResourceMenu(self, event):
  2796         selected = self.TypesTree.GetSelection()
  2661         selected = self.ProjectTree.GetSelection()
  2797         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2662         if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE:
  2798             resource = self.TypesTree.GetItemText(selected)
  2663             resource = self.ProjectTree.GetItemText(selected)
  2799             item = self.TypesTree.GetItemParent(selected)
  2664             item = self.ProjectTree.GetItemParent(selected)
  2800             item_type = self.TypesTree.GetPyData(item)
  2665             item_type = self.ProjectTree.GetPyData(item)
  2801             while item_type != ITEM_CONFIGURATION:
  2666             while item_type != ITEM_CONFIGURATION:
  2802                 item = self.TypesTree.GetItemParent(item)
  2667                 item = self.ProjectTree.GetItemParent(item)
  2803                 item_type = self.TypesTree.GetPyData(item)
  2668                 item_type = self.ProjectTree.GetPyData(item)
  2804             config_name = self.TypesTree.GetItemText(item)
  2669             config_name = self.ProjectTree.GetItemText(item)
  2805             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2670             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2806             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2671             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2807             idx = self.IsOpened(tagname)
  2672             idx = self.IsOpened(tagname)
  2808             if idx is not None:
  2673             if idx is not None:
  2809                 self.TabsOpened.DeletePage(idx)
  2674                 self.TabsOpened.DeletePage(idx)
  2810             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2675             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2811     
  2676     
  2812     def OnPLCOpenEditorMenu(self, event):
  2677     def OnPLCOpenEditorMenu(self, event):
  2813         wx.MessageBox(_("No documentation available.\nComing soon."))
  2678         wx.MessageBox(_("No documentation available.\nComing soon."))
  2814         
  2679         
  2815     def OnPLCOpenMenu(self, event):
  2680     def OnPLCOpenMenu(self, event):
  2822 #-------------------------------------------------------------------------------
  2687 #-------------------------------------------------------------------------------
  2823 #                        Highlights showing functions
  2688 #                        Highlights showing functions
  2824 #-------------------------------------------------------------------------------
  2689 #-------------------------------------------------------------------------------
  2825 
  2690 
  2826     def ShowHighlight(self, infos, start, end, highlight_type):
  2691     def ShowHighlight(self, infos, start, end, highlight_type):
  2827         self.SelectTypesTreeItem(infos[0])
  2692         self.SelectProjectTreeItem(infos[0])
  2828         if infos[1] == "name":
  2693         if infos[1] == "name":
  2829             self.Highlights[infos[0]] = highlight_type
  2694             self.Highlights[infos[0]] = highlight_type
  2830             self.RefreshTypesTree()
  2695             self.RefreshProjectTree()
  2831             self.TypesTree.Unselect()
  2696             self.ProjectTree.Unselect()
  2832         else:
  2697         else:
  2833             self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2698             self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2834             selected = self.TabsOpened.GetSelection()
  2699             selected = self.TabsOpened.GetSelection()
  2835             if selected != -1:
  2700             if selected != -1:
  2836                 viewer = self.TabsOpened.GetPage(selected)
  2701                 viewer = self.TabsOpened.GetPage(selected)
  2845     def ClearHighlights(self, highlight_type=None):
  2710     def ClearHighlights(self, highlight_type=None):
  2846         if highlight_type is None:
  2711         if highlight_type is None:
  2847             self.Highlights = {}
  2712             self.Highlights = {}
  2848         else:
  2713         else:
  2849             self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
  2714             self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
  2850         self.RefreshTypesTree()
  2715         self.RefreshProjectTree()
  2851         for i in xrange(self.TabsOpened.GetPageCount()):
  2716         for i in xrange(self.TabsOpened.GetPageCount()):
  2852             viewer = self.TabsOpened.GetPage(i)
  2717             viewer = self.TabsOpened.GetPage(i)
  2853             viewer.ClearHighlights(highlight_type)
  2718             viewer.ClearHighlights(highlight_type)
  2854 
  2719 
  2855     def ClearErrors(self):
  2720     def ClearErrors(self):
  2950             # Create a new controller
  2815             # Create a new controller
  2951             self.Controler = PLCControler()
  2816             self.Controler = PLCControler()
  2952             result = self.Controler.OpenXMLFile(fileOpen)
  2817             result = self.Controler.OpenXMLFile(fileOpen)
  2953             if result is None:
  2818             if result is None:
  2954             	self.LibraryPanel.SetControler(self.Controler)
  2819             	self.LibraryPanel.SetControler(self.Controler)
  2955                 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2820                 self.PouInstanceVariablesPanel.SetController(self.Controler)
       
  2821                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2956         
  2822         
  2957         # Define PLCOpenEditor icon
  2823         # Define PLCOpenEditor icon
  2958         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2824         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2959 
  2825 
  2960         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
  2826         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
  3040             properties = dialog.GetValues()
  2906             properties = dialog.GetValues()
  3041             self.ResetView()
  2907             self.ResetView()
  3042             self.Controler = PLCControler()
  2908             self.Controler = PLCControler()
  3043             self.Controler.CreateNewProject(properties)
  2909             self.Controler.CreateNewProject(properties)
  3044             self.LibraryPanel.SetControler(self.Controler)
  2910             self.LibraryPanel.SetControler(self.Controler)
  3045             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, 
  2911             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, 
  3046                           LIBRARYTREE)
  2912                           LIBRARYTREE)
  3047 
  2913 
  3048     def OnOpenProjectMenu(self, event):
  2914     def OnOpenProjectMenu(self, event):
  3049         if self.Controler is not None and not self.CheckSaveBeforeClosing():
  2915         if self.Controler is not None and not self.CheckSaveBeforeClosing():
  3050             return
  2916             return
  3065                 self.ResetView()
  2931                 self.ResetView()
  3066                 self.Controler = PLCControler()
  2932                 self.Controler = PLCControler()
  3067                 result = self.Controler.OpenXMLFile(filepath)
  2933                 result = self.Controler.OpenXMLFile(filepath)
  3068                 if result is None:
  2934                 if result is None:
  3069                     self.LibraryPanel.SetControler(self.Controler)
  2935                     self.LibraryPanel.SetControler(self.Controler)
       
  2936                     self.PouInstanceVariablesPanel.SetController(self.Controler)
  3070                     self.LoadProjectOrganization()
  2937                     self.LoadProjectOrganization()
  3071                     self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2938                     self._Refresh(PROJECTTREE, LIBRARYTREE)
  3072             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  2939             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  3073         dialog.Destroy()
  2940         dialog.Destroy()
  3074         
  2941         
  3075         if result is not None:
  2942         if result is not None:
  3076             self.ShowErrorMessage(result)
  2943             self.ShowErrorMessage(result)