PLCOpenEditor.py
changeset 687 629680fb0582
parent 685 ecd2226716d8
child 689 ce605c1a6d04
equal deleted inserted replaced
686:3216bf5f711d 687:629680fb0582
   277             getattr(control, viewer_function)()
   277             getattr(control, viewer_function)()
   278         elif isinstance(control, wx.TextCtrl):
   278         elif isinstance(control, wx.TextCtrl):
   279             control.ProcessEvent(event)
   279             control.ProcessEvent(event)
   280     return ShortcutKeyFunction
   280     return ShortcutKeyFunction
   281 
   281 
   282 def GetParentName(tree, item, parent_type):
       
   283     parent_item = tree.GetItemParent(item)
       
   284     parent_item_type = tree.GetPyData(parent_item)
       
   285     while parent_item_type != parent_type:
       
   286         parent_item = tree.GetItemParent(parent_item)
       
   287         parent_item_type = tree.GetPyData(parent_item)
       
   288     return tree.GetItemText(parent_item)
       
   289 
       
   290 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   282 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   291     def DeleteElementFunction(self, selected):
   283     def DeleteElementFunction(self, selected):
   292         name = self.ProjectTree.GetItemText(selected)
   284         name = self.ProjectTree.GetItemText(selected)
   293         if check_function is None or not check_function(self.Controler, name):
   285         if check_function is None or not check_function(self.Controler, name):
   294             if parent_type is not None:
   286             if parent_type is not None:
   295                 parent_name = GetParentName(self.ProjectTree, selected, parent_type)
   287                 item_infos = self.ProjectTree.GetPyData(selected)
       
   288                 parent_name = item_infos["tagname"].split("::")[1]
   296                 remove_function(self.Controler, parent_name, name)
   289                 remove_function(self.Controler, parent_name, name)
   297             else:
   290             else:
   298                 remove_function(self.Controler, name)
   291                 remove_function(self.Controler, name)
   299         else:
   292         else:
   300             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   293             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   404         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   397         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   405 
   398 
   406     def _init_coll_FileMenu_Items(self, parent):
   399     def _init_coll_FileMenu_Items(self, parent):
   407         pass
   400         pass
   408     
   401     
   409     def _init_coll_AddMenu_Items(self, parent):
   402     def _init_coll_AddMenu_Items(self, parent, add_config=True):
   410         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   403         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   411               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
   404               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
   412         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   405         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   413               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
   406               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
   414         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   407         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   415               kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
   408               kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
   416         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   409         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   417               kind=wx.ITEM_NORMAL, text=_(u'&Program'))
   410               kind=wx.ITEM_NORMAL, text=_(u'&Program'))
   418         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   411         if add_config:
   419               kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
   412             AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
       
   413                   kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
   420     
   414     
   421     def _init_coll_EditMenu_Items(self, parent):
   415     def _init_coll_EditMenu_Items(self, parent):
   422         AppendMenu(parent, help='', id=wx.ID_UNDO,
   416         AppendMenu(parent, help='', id=wx.ID_UNDO,
   423               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   417               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   424         AppendMenu(parent, help='', id=wx.ID_REDO,
   418         AppendMenu(parent, help='', id=wx.ID_REDO,
   852                 notebook.AddPage(page_ref, page_title)
   846                 notebook.AddPage(page_ref, page_title)
   853                 return notebook.GetPageIndex(page_ref)
   847                 return notebook.GetPageIndex(page_ref)
   854         elif page_infos[0] == "editor":
   848         elif page_infos[0] == "editor":
   855             tagname = page_infos[1]
   849             tagname = page_infos[1]
   856             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
   850             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
   857             page_ref.RefreshView()
   851             if page_ref is not None:
   858             return notebook.GetPageIndex(page_ref)
   852                 page_ref.RefreshView()
       
   853                 return notebook.GetPageIndex(page_ref)
   859         elif page_infos[0] == "debug":
   854         elif page_infos[0] == "debug":
   860             instance_path = page_infos[1]
   855             instance_path = page_infos[1]
   861             instance_infos = self.Controler.GetInstanceInfos(instance_path)
   856             instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug)
   862             if instance_infos is not None:
   857             if instance_infos is not None:
   863                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
   858                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
   864         return None
   859         return None
   865             
   860             
   866     def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None):
   861     def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None):
  1192         pass
  1187         pass
  1193 
  1188 
  1194     def ResetView(self):
  1189     def ResetView(self):
  1195         self.DeleteAllPages()
  1190         self.DeleteAllPages()
  1196         self.ProjectTree.DeleteAllItems()
  1191         self.ProjectTree.DeleteAllItems()
       
  1192         self.ProjectTree.Enable(False)
  1197         self.PouInstanceVariablesPanel.ResetView()
  1193         self.PouInstanceVariablesPanel.ResetView()
  1198         self.LibraryPanel.ResetTree()
  1194         self.LibraryPanel.ResetTree()
  1199         self.LibraryPanel.SetControler(None)
  1195         self.LibraryPanel.SetControler(None)
  1200         self.Controler = None
  1196         self.Controler = None
  1201 
  1197 
  1385     def OnDeleteMenu(self, event):
  1381     def OnDeleteMenu(self, event):
  1386         window = self.FindFocus()
  1382         window = self.FindFocus()
  1387         if window == self.ProjectTree or window is None:
  1383         if window == self.ProjectTree or window is None:
  1388             selected = self.ProjectTree.GetSelection()
  1384             selected = self.ProjectTree.GetSelection()
  1389             if selected.IsOk():
  1385             if selected.IsOk():
  1390                 type = self.ProjectTree.GetPyData(selected)
  1386                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1391                 function = self.DeleteFunctions.get(type, None)
       
  1392                 if function is not None:
  1387                 if function is not None:
  1393                     function(self, selected)
  1388                     function(self, selected)
  1394                     self.CloseTabsWithoutModel()
  1389                     self.CloseTabsWithoutModel()
  1395                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1390                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1396                                   POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1391                                   POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1482             pane = self.AUIManager.GetPane(self.TabsOpened)
  1477             pane = self.AUIManager.GetPane(self.TabsOpened)
  1483             if pane.IsMaximized():
  1478             if pane.IsMaximized():
  1484                 self.AUIManager.RestorePane(pane)
  1479                 self.AUIManager.RestorePane(pane)
  1485             self.AUIManager.Update()
  1480             self.AUIManager.Update()
  1486     
  1481     
       
  1482     def EnsureTabVisible(self, tab):
       
  1483         notebook = tab.GetParent()
       
  1484         notebook.SetSelection(notebook.GetPageIndex(tab))
       
  1485     
  1487     def OnPouSelectedChanging(self, event):
  1486     def OnPouSelectedChanging(self, event):
  1488         if not self.Starting:
  1487         if not self.Starting:
  1489             selected = self.TabsOpened.GetSelection()
  1488             selected = self.TabsOpened.GetSelection()
  1490             if selected >= 0:
  1489             if selected >= 0:
  1491                 window = self.TabsOpened.GetPage(selected)
  1490                 window = self.TabsOpened.GetPage(selected)
  1501                 tagname = window.GetTagName()
  1500                 tagname = window.GetTagName()
  1502                 if not window.IsDebugging():
  1501                 if not window.IsDebugging():
  1503                     wx.CallAfter(self.SelectProjectTreeItem, tagname)
  1502                     wx.CallAfter(self.SelectProjectTreeItem, tagname)
  1504                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname)
  1503                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname)
  1505                     window.RefreshView()
  1504                     window.RefreshView()
       
  1505                     self.EnsureTabVisible(self.LibraryPanel)
  1506                 else:
  1506                 else:
  1507                     instance_path = window.GetInstancePath()
  1507                     instance_path = window.GetInstancePath()
       
  1508                     if tagname == "":
       
  1509                         instance_path = instance_path.rsplit(".", 1)[0]
       
  1510                         tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
       
  1511                     self.EnsureTabVisible(self.DebugVariablePanel)
  1508                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1512                     wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1509             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1513             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1510         event.Skip()
  1514         event.Skip()
  1511 
  1515 
  1512     def RefreshEditor(self):
  1516     def RefreshEditor(self):
  1579         if infos["type"] in ITEMS_UNEDITABLE:
  1583         if infos["type"] in ITEMS_UNEDITABLE:
  1580         	if len(infos["values"]) == 1:
  1584         	if len(infos["values"]) == 1:
  1581         		return self.GenerateProjectTreeBranch(root, infos["values"][0])
  1585         		return self.GenerateProjectTreeBranch(root, infos["values"][0])
  1582         	item_name = _(item_name)
  1586         	item_name = _(item_name)
  1583         self.ProjectTree.SetItemText(root, item_name)
  1587         self.ProjectTree.SetItemText(root, item_name)
  1584         self.ProjectTree.SetPyData(root, infos["type"])
  1588         self.ProjectTree.SetPyData(root, infos)
  1585         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1589         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1586         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1590         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1587         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1591         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1588         if infos["type"] == ITEM_POU:
  1592         if infos["type"] == ITEM_POU:
  1589             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1593             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1590         else:
  1594         elif infos.has_key("icon") and infos["icon"] is not None:
       
  1595             icon_path = infos["icon"]
       
  1596             if not self.TreeImageDict.has_key(icon_path):
       
  1597                 self.TreeImageDict[icon_path] = self.TreeImageList.Add(wx.Bitmap(icon_path))
       
  1598             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_path])
       
  1599         elif self.TreeImageDict.has_key(infos["type"]):
  1591             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1600             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1592             
  1601         
  1593         if wx.VERSION >= (2, 6, 0):
  1602         if wx.VERSION >= (2, 6, 0):
  1594             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1603             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1595         else:
  1604         else:
  1596             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1605             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1597         for values in infos["values"]:
  1606         for values in infos["values"]:
  1632         if wx.VERSION >= (2, 6, 0):
  1641         if wx.VERSION >= (2, 6, 0):
  1633             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1642             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1634         else:
  1643         else:
  1635             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1644             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1636         while item.IsOk() and not found:
  1645         while item.IsOk() and not found:
  1637             if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]:
  1646             item_infos = self.ProjectTree.GetPyData(item)
       
  1647             if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
  1638                 if len(items) == 1:
  1648                 if len(items) == 1:
  1639                     self.SelectedItem = item
  1649                     self.SelectedItem = item
  1640                     self.ProjectTree.SelectItem(item)
  1650                     self.ProjectTree.SelectItem(item)
  1641                     wx.CallAfter(self.ResetSelectedItem)
  1651                     wx.CallAfter(self.ResetSelectedItem)
  1642                     return True
  1652                     return True
  1648         return found
  1658         return found
  1649 
  1659 
  1650     def OnProjectTreeBeginDrag(self, event):
  1660     def OnProjectTreeBeginDrag(self, event):
  1651         if wx.Platform == '__WXMSW__':
  1661         if wx.Platform == '__WXMSW__':
  1652             self.SelectedItem = event.GetItem()
  1662             self.SelectedItem = event.GetItem()
  1653         if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1663         if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem)["type"] == ITEM_POU:
  1654             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
  1664             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
  1655             block_type = self.Controler.GetPouType(block_name)
  1665             block_type = self.Controler.GetPouType(block_name)
  1656             if block_type != "program":
  1666             if block_type != "program":
  1657                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1667                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1658                 dragSource = wx.DropSource(self.ProjectTree)
  1668                 dragSource = wx.DropSource(self.ProjectTree)
  1660                 dragSource.DoDragDrop()
  1670                 dragSource.DoDragDrop()
  1661             self.ResetSelectedItem()
  1671             self.ResetSelectedItem()
  1662 
  1672 
  1663     def OnProjectTreeItemBeginEdit(self, event):
  1673     def OnProjectTreeItemBeginEdit(self, event):
  1664         selected = event.GetItem()
  1674         selected = event.GetItem()
  1665         if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE:
  1675         if self.ProjectTree.GetPyData(selected)["type"] in ITEMS_UNEDITABLE:
  1666             event.Veto()
  1676             event.Veto()
  1667         else:
  1677         else:
  1668             event.Skip()
  1678             event.Skip()
  1669 
  1679 
  1670     def OnProjectTreeItemEndEdit(self, event):
  1680     def OnProjectTreeItemEndEdit(self, event):
  1677             elif new_name.upper() in IEC_KEYWORDS:
  1687             elif new_name.upper() in IEC_KEYWORDS:
  1678                 message = _("\"%s\" is a keyword. It can't be used!")%new_name
  1688                 message = _("\"%s\" is a keyword. It can't be used!")%new_name
  1679             else:
  1689             else:
  1680                 item = event.GetItem()
  1690                 item = event.GetItem()
  1681                 old_name = self.ProjectTree.GetItemText(item)
  1691                 old_name = self.ProjectTree.GetItemText(item)
  1682                 itemtype = self.ProjectTree.GetPyData(item)
  1692                 item_infos = self.ProjectTree.GetPyData(item)
  1683                 if itemtype == ITEM_PROJECT:
  1693                 if item_infos["type"] == ITEM_PROJECT:
  1684                     self.Controler.SetProjectProperties(name = new_name)
  1694                     self.Controler.SetProjectProperties(name = new_name)
  1685                 elif itemtype == ITEM_DATATYPE:
  1695                 elif item_infos["type"] == ITEM_DATATYPE:
  1686                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1696                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1687                         message = _("\"%s\" data type already exists!")%new_name
  1697                         message = _("\"%s\" data type already exists!")%new_name
  1688                         abort = True
  1698                         abort = True
  1689                     if not abort:
  1699                     if not abort:
  1690                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1700                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1691                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1701                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1692                                                 self.Controler.ComputeDataTypeName(new_name))
  1702                                                 self.Controler.ComputeDataTypeName(new_name))
  1693                         self.RefreshPageTitles()
  1703                         self.RefreshPageTitles()
  1694                 elif itemtype == ITEM_POU:
  1704                 elif item_infos["type"] == ITEM_POU:
  1695                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1705                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1696                         message = _("\"%s\" pou already exists!")%new_name
  1706                         message = _("\"%s\" pou already exists!")%new_name
  1697                         abort = True
  1707                         abort = True
  1698                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1708                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1699                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1709                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1704                         self.Controler.ChangePouName(old_name, new_name)
  1714                         self.Controler.ChangePouName(old_name, new_name)
  1705                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1715                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1706                                                 self.Controler.ComputePouName(new_name))
  1716                                                 self.Controler.ComputePouName(new_name))
  1707                         self.RefreshLibraryPanel()
  1717                         self.RefreshLibraryPanel()
  1708                         self.RefreshPageTitles()
  1718                         self.RefreshPageTitles()
  1709                 elif itemtype == ITEM_TRANSITION:
  1719                 elif item_infos["type"] == ITEM_TRANSITION:
  1710                     pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
       
  1711                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1720                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1712                         message = _("A POU named \"%s\" already exists!")%new_name
  1721                         message = _("A POU named \"%s\" already exists!")%new_name
  1713                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1722                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1714                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1723                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1715                     else:
  1724                     else:
  1716                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1725                         words = item_infos["tagname"].split("::")
  1717                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1726                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
  1718                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1727                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), 
       
  1728                                                 self.Controler.ComputePouTransitionName(words[1], new_name))
  1719                         self.RefreshPageTitles()
  1729                         self.RefreshPageTitles()
  1720                 elif itemtype == ITEM_ACTION:
  1730                 elif item_infos["type"] == ITEM_ACTION:
  1721                     pou_name = GetParentName(self.ProjectTree, item, ITEM_POU)
       
  1722                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1731                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1723                         message = _("A POU named \"%s\" already exists!")%new_name
  1732                         message = _("A POU named \"%s\" already exists!")%new_name
  1724                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1733                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1725                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1734                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1726                     else:
  1735                     else:
  1727                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1736                         words = item_infos["tagname"].split("::")
  1728                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1737                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
  1729                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1738                         self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), 
       
  1739                                                 self.Controler.ComputePouActionName(words[1], new_name))
  1730                         self.RefreshPageTitles()
  1740                         self.RefreshPageTitles()
  1731                 elif itemtype == ITEM_CONFIGURATION:
  1741                 elif item_infos["type"] == ITEM_CONFIGURATION:
  1732                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1742                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1733                         message = _("\"%s\" config already exists!")%new_name
  1743                         message = _("\"%s\" config already exists!")%new_name
  1734                         abort = True
  1744                         abort = True
  1735                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1745                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1736                         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)
  1746                         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)
  1745                     if not abort:
  1755                     if not abort:
  1746                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1756                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1747                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1757                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1748                                                 self.Controler.ComputeConfigurationName(new_name))
  1758                                                 self.Controler.ComputeConfigurationName(new_name))
  1749                         self.RefreshPageTitles()
  1759                         self.RefreshPageTitles()
  1750                 elif itemtype == ITEM_RESOURCE:
  1760                 elif item_infos["type"] == ITEM_RESOURCE:
  1751                     config_name = GetParentName(self.ProjectTree, item, ITEM_CONFIGURATION)
       
  1752                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1761                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1753                         message = _("\"%s\" config already exists!")%new_name
  1762                         message = _("\"%s\" config already exists!")%new_name
  1754                         abort = True
  1763                         abort = True
  1755                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1764                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1756                         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)
  1765                         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)
  1761                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1770                         messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1762                         if messageDialog.ShowModal() == wx.ID_NO:
  1771                         if messageDialog.ShowModal() == wx.ID_NO:
  1763                             abort = True
  1772                             abort = True
  1764                         messageDialog.Destroy()
  1773                         messageDialog.Destroy()
  1765                     if not abort:
  1774                     if not abort:
  1766                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
  1775                         words = item_infos["tagname"].split("::")
  1767                         self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(config_name, old_name), 
  1776                         self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name)
  1768                                                 self.Controler.ComputeConfigurationResourceName(config_name, new_name))
  1777                         self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name), 
       
  1778                                                 self.Controler.ComputeConfigurationResourceName(words[1], new_name))
  1769                         self.RefreshPageTitles()
  1779                         self.RefreshPageTitles()
  1770             if message or abort:
  1780             if message or abort:
  1771                 if message:
  1781                 if message:
  1772                     self.ShowErrorMessage(message)
  1782                     self.ShowErrorMessage(message)
  1773                 item = event.GetItem()
  1783                 item = event.GetItem()
  1780                 event.Skip()
  1790                 event.Skip()
  1781     
  1791     
  1782     def OnProjectTreeItemActivated(self, event):
  1792     def OnProjectTreeItemActivated(self, event):
  1783         selected = event.GetItem()
  1793         selected = event.GetItem()
  1784         name = self.ProjectTree.GetItemText(selected)
  1794         name = self.ProjectTree.GetItemText(selected)
  1785         data = self.ProjectTree.GetPyData(selected)
  1795         item_infos = self.ProjectTree.GetPyData(selected)
  1786         if data == ITEM_PROJECT:
  1796         if item_infos["type"] == ITEM_PROJECT:
  1787             self.EditProjectSettings()
  1797             self.EditProjectSettings()
  1788         elif data == ITEM_DATATYPE:
  1798         elif item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1789             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1799                                     ITEM_CONFIGURATION, ITEM_RESOURCE,
  1790         elif data == ITEM_POU:
  1800                                     ITEM_TRANSITION, ITEM_ACTION]:
  1791             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1801             self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1792         elif data == ITEM_CONFIGURATION:
       
  1793             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
       
  1794         elif data == ITEM_RESOURCE:
       
  1795             config_name = GetParentName(self.ProjectTree, selected, ITEM_CONFIGURATION)
       
  1796             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
       
  1797         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
       
  1798             pou_name = GetParentName(self.ProjectTree, selected, ITEM_POU)
       
  1799             if data == ITEM_TRANSITION:
       
  1800                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
       
  1801             elif data == ITEM_ACTION:
       
  1802                 tagname = self.Controler.ComputePouActionName(pou_name, name)
       
  1803             self.EditProjectElement(data, tagname)
       
  1804         event.Skip()
  1802         event.Skip()
  1805     
  1803     
  1806     def ProjectTreeItemSelect(self, select_item):
  1804     def ProjectTreeItemSelect(self, select_item):
  1807         name = self.ProjectTree.GetItemText(select_item)
  1805         name = self.ProjectTree.GetItemText(select_item)
  1808         data = self.ProjectTree.GetPyData(select_item)
  1806         item_infos = self.ProjectTree.GetPyData(select_item)
  1809         tagname = None
  1807         if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1810         if data == ITEM_DATATYPE:
  1808                                   ITEM_CONFIGURATION, ITEM_RESOURCE,
  1811             tagname = self.Controler.ComputeDataTypeName(name)
  1809                                   ITEM_TRANSITION, ITEM_ACTION]:
  1812         elif data == ITEM_POU:
  1810             self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
  1813             tagname = self.Controler.ComputePouName(name)
  1811             self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
  1814         elif data == ITEM_CONFIGURATION:
       
  1815             tagname = self.Controler.ComputeConfigurationName(name)
       
  1816         elif data == ITEM_RESOURCE:
       
  1817             config_name = GetParentName(self.ProjectTree, select_item, ITEM_CONFIGURATION)
       
  1818             tagname = self.Controler.ComputeConfigurationResourceName(config_name, name)
       
  1819         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
       
  1820             pou_name = GetParentName(self.ProjectTree, select_item, ITEM_POU)
       
  1821             if data == ITEM_TRANSITION:
       
  1822                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
       
  1823             elif data == ITEM_ACTION:
       
  1824                 tagname = self.Controler.ComputePouActionName(pou_name, name)
       
  1825         if tagname is not None:
       
  1826             self.EditProjectElement(data, tagname, True)
       
  1827         self.PouInstanceVariablesPanel.SetPouType(tagname)
       
  1828         
  1812         
  1829     def OnProjectTreeLeftUp(self, event):
  1813     def OnProjectTreeLeftUp(self, event):
  1830         if self.SelectedItem is not None:
  1814         if self.SelectedItem is not None:
  1831             self.ProjectTree.SelectItem(self.SelectedItem)
  1815             self.ProjectTree.SelectItem(self.SelectedItem)
  1832             self.ProjectTreeItemSelect(self.SelectedItem)
  1816             self.ProjectTreeItemSelect(self.SelectedItem)
  1836     def OnProjectTreeItemSelected(self, event):
  1820     def OnProjectTreeItemSelected(self, event):
  1837         self.ProjectTreeItemSelect(event.GetItem())
  1821         self.ProjectTreeItemSelect(event.GetItem())
  1838         event.Skip()
  1822         event.Skip()
  1839     
  1823     
  1840     def OnProjectTreeItemChanging(self, event):
  1824     def OnProjectTreeItemChanging(self, event):
  1841         if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1825         if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1842             self.SelectedItem = event.GetItem()
  1826             self.SelectedItem = event.GetItem()
  1843             event.Veto()
  1827             event.Veto()
  1844         else:
  1828         else:
  1845             event.Skip()
  1829             event.Skip()
  1846     
  1830     
  1923         else:
  1907         else:
  1924             item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY()))
  1908             item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY()))
  1925         self.ProjectTree.SelectItem(item)
  1909         self.ProjectTree.SelectItem(item)
  1926         self.ProjectTreeItemSelect(item)
  1910         self.ProjectTreeItemSelect(item)
  1927         name = self.ProjectTree.GetItemText(item)
  1911         name = self.ProjectTree.GetItemText(item)
  1928         type = self.ProjectTree.GetPyData(item)
  1912         item_infos = self.ProjectTree.GetPyData(item)
  1929         
  1913         
  1930         menu = None
  1914         menu = None
  1931         if type in ITEMS_UNEDITABLE:
  1915         if item_infos["type"] in ITEMS_UNEDITABLE:
  1932             name = UNEDITABLE_NAMES_DICT[name]
  1916             name = UNEDITABLE_NAMES_DICT[name]
  1933             
  1917             
  1934             if name == "Data Types":
  1918             if name == "Data Types":
  1935                 menu = wx.Menu(title='')
  1919                 menu = wx.Menu(title='')
  1936                 new_id = wx.NewId()
  1920                 new_id = wx.NewId()
  1958             
  1942             
  1959             elif name == "Transitions":
  1943             elif name == "Transitions":
  1960                 menu = wx.Menu(title='')
  1944                 menu = wx.Menu(title='')
  1961                 new_id = wx.NewId()
  1945                 new_id = wx.NewId()
  1962                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1946                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1963                 parent = self.ProjectTree.GetItemParent(item)
  1947                 parent = self.ProjectTree.GetItemParent(item)["type"]
  1964                 parent_type = self.ProjectTree.GetPyData(parent)
  1948                 parent_type = self.ProjectTree.GetPyData(parent)
  1965                 while parent_type != ITEM_POU:
  1949                 while parent_type != ITEM_POU:
  1966                     parent = self.ProjectTree.GetItemParent(parent)
  1950                     parent = self.ProjectTree.GetItemParent(parent)
  1967                     parent_type = self.ProjectTree.GetPyData(parent)
  1951                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1968                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1952                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1969             
  1953             
  1970             elif name == "Actions":
  1954             elif name == "Actions":
  1971                 menu = wx.Menu(title='')
  1955                 menu = wx.Menu(title='')
  1972                 new_id = wx.NewId()
  1956                 new_id = wx.NewId()
  1973                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1957                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1974                 parent = self.ProjectTree.GetItemParent(item)
  1958                 parent = self.ProjectTree.GetItemParent(item)
  1975                 parent_type = self.ProjectTree.GetPyData(parent)
  1959                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1976                 while parent_type != ITEM_POU:
  1960                 while parent_type != ITEM_POU:
  1977                     parent = self.ProjectTree.GetItemParent(parent)
  1961                     parent = self.ProjectTree.GetItemParent(parent)
  1978                     parent_type = self.ProjectTree.GetPyData(parent)
  1962                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1979                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1963                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1980             
  1964             
  1981             elif name == "Resources":
  1965             elif name == "Resources":
  1982                 menu = wx.Menu(title='')
  1966                 menu = wx.Menu(title='')
  1983                 new_id = wx.NewId()
  1967                 new_id = wx.NewId()
  1984                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1968                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1985                 parent = self.ProjectTree.GetItemParent(item)
  1969                 parent = self.ProjectTree.GetItemParent(item)
  1986                 parent_type = self.ProjectTree.GetPyData(parent)
  1970                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1987                 while parent_type != ITEM_CONFIGURATION:
  1971                 while parent_type not in [ITEM_CONFIGURATION, ITEM_PROJECT]:
  1988                     parent = self.ProjectTree.GetItemParent(parent)
  1972                     parent = self.ProjectTree.GetItemParent(parent)
  1989                     parent_type = self.ProjectTree.GetPyData(parent)
  1973                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1990                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1974                 if parent_type == ITEM_PROJECT:
       
  1975                     parent_name = None
       
  1976                 else:
       
  1977                     parent_name = self.ProjectTree.GetItemText(parent)
       
  1978                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
  1991             
  1979             
  1992         else:
  1980         else:
  1993             if type == ITEM_POU:
  1981             if item_infos["type"] == ITEM_POU:
  1994                 menu = wx.Menu(title='')
  1982                 menu = wx.Menu(title='')
  1995                 if self.Controler.GetPouBodyType(name) == "SFC":
  1983                 if self.Controler.GetPouBodyType(name) == "SFC":
  1996                     new_id = wx.NewId()
  1984                     new_id = wx.NewId()
  1997                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1985                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1998                     self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1986                     self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  2018                     menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu)
  2006                     menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu)
  2019                 new_id = wx.NewId()
  2007                 new_id = wx.NewId()
  2020                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
  2008                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
  2021                 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  2009                 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  2022             
  2010             
  2023             elif type == ITEM_CONFIGURATION:
  2011             elif item_infos["type"] == ITEM_CONFIGURATION:
  2024                 menu = wx.Menu(title='')
  2012                 menu = wx.Menu(title='')
  2025                 new_id = wx.NewId()
  2013                 new_id = wx.NewId()
  2026                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  2014                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  2027                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  2015                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  2028             
  2016             
  2029             elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  2017             elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  2030                 menu = wx.Menu(title='')
  2018                 menu = wx.Menu(title='')
  2031                 
  2019                 
  2032             if menu is not None:
  2020             if menu is not None:
  2033                 new_id = wx.NewId()
  2021                 new_id = wx.NewId()
  2034                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  2022                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  2127             idxs = range(self.TabsOpened.GetPageCount())
  2115             idxs = range(self.TabsOpened.GetPageCount())
  2128             idxs.reverse()
  2116             idxs.reverse()
  2129             for idx in idxs:
  2117             for idx in idxs:
  2130                 editor = self.TabsOpened.GetPage(idx)
  2118                 editor = self.TabsOpened.GetPage(idx)
  2131                 if editor.IsDebugging():
  2119                 if editor.IsDebugging():
  2132                     instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath())
  2120                     instance_infos = self.Controler.GetInstanceInfos(editor.GetInstancePath(), self.EnableDebug)
  2133                     if instance_infos is None:
  2121                     if instance_infos is None:
  2134                         self.TabsOpened.DeletePage(idx)
  2122                         self.TabsOpened.DeletePage(idx)
  2135                     elif isinstance(editor, GraphicViewer):
  2123                     elif isinstance(editor, GraphicViewer):
  2136                         editor.ResetView(True)
  2124                         editor.ResetView(True)
  2137                     else:
  2125                     else:
  2139             self.DebugVariablePanel.UnregisterObsoleteData()
  2127             self.DebugVariablePanel.UnregisterObsoleteData()
  2140     
  2128     
  2141     def AddDebugVariable(self, iec_path, force=False):
  2129     def AddDebugVariable(self, iec_path, force=False):
  2142         if self.EnableDebug:
  2130         if self.EnableDebug:
  2143             self.DebugVariablePanel.InsertValue(iec_path, force=force)
  2131             self.DebugVariablePanel.InsertValue(iec_path, force=force)
       
  2132             self.EnsureTabVisible(self.DebugVariablePanel)
  2144             
  2133             
  2145 #-------------------------------------------------------------------------------
  2134 #-------------------------------------------------------------------------------
  2146 #                         Library Panel Management Function
  2135 #                         Library Panel Management Function
  2147 #-------------------------------------------------------------------------------
  2136 #-------------------------------------------------------------------------------
  2148 
  2137 
  2439         return OnAddResourceMenu
  2428         return OnAddResourceMenu
  2440 
  2429 
  2441     def GenerateChangePouTypeFunction(self, name, new_type):
  2430     def GenerateChangePouTypeFunction(self, name, new_type):
  2442         def OnChangePouTypeMenu(event):
  2431         def OnChangePouTypeMenu(event):
  2443             selected = self.ProjectTree.GetSelection()
  2432             selected = self.ProjectTree.GetSelection()
  2444             if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
  2433             if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2445                 self.Controler.ProjectChangePouType(name, new_type)
  2434                 self.Controler.ProjectChangePouType(name, new_type)
  2446                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2435                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2447         return OnChangePouTypeMenu
  2436         return OnChangePouTypeMenu
  2448 
  2437 
  2449     def OnCopyPou(self, event):
  2438     def OnCopyPou(self, event):
  2477 #                        Remove Project Elements Functions
  2466 #                        Remove Project Elements Functions
  2478 #-------------------------------------------------------------------------------
  2467 #-------------------------------------------------------------------------------
  2479 
  2468 
  2480     def OnRemoveDataTypeMenu(self, event):
  2469     def OnRemoveDataTypeMenu(self, event):
  2481         selected = self.ProjectTree.GetSelection()
  2470         selected = self.ProjectTree.GetSelection()
  2482         if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE:
  2471         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
  2483             name = self.ProjectTree.GetItemText(selected)
  2472             name = self.ProjectTree.GetItemText(selected)
  2484             if not self.Controler.DataTypeIsUsed(name):
  2473             if not self.Controler.DataTypeIsUsed(name):
  2485                 self.Controler.ProjectRemoveDataType(name)
  2474                 self.Controler.ProjectRemoveDataType(name)
  2486                 tagname = self.Controler.ComputeDataTypeName(name)
  2475                 tagname = self.Controler.ComputeDataTypeName(name)
  2487                 idx = self.IsOpened(tagname)
  2476                 idx = self.IsOpened(tagname)
  2491             else:
  2480             else:
  2492                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2481                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2493 
  2482 
  2494     def OnRenamePouMenu(self, event):
  2483     def OnRenamePouMenu(self, event):
  2495         selected = self.ProjectTree.GetSelection()
  2484         selected = self.ProjectTree.GetSelection()
  2496         if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
  2485         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2497             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2486             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2498 
  2487 
  2499     def OnRemovePouMenu(self, event):
  2488     def OnRemovePouMenu(self, event):
  2500         selected = self.ProjectTree.GetSelection()
  2489         selected = self.ProjectTree.GetSelection()
  2501         if self.ProjectTree.GetPyData(selected) == ITEM_POU:
  2490         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2502             name = self.ProjectTree.GetItemText(selected)
  2491             name = self.ProjectTree.GetItemText(selected)
  2503             if not self.Controler.PouIsUsed(name):
  2492             if not self.Controler.PouIsUsed(name):
  2504                 self.Controler.ProjectRemovePou(name)
  2493                 self.Controler.ProjectRemovePou(name)
  2505                 tagname = self.Controler.ComputePouName(name)
  2494                 tagname = self.Controler.ComputePouName(name)
  2506                 idx = self.IsOpened(tagname)
  2495                 idx = self.IsOpened(tagname)
  2510             else:
  2499             else:
  2511                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2500                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2512 
  2501 
  2513     def OnRemoveTransitionMenu(self, event):
  2502     def OnRemoveTransitionMenu(self, event):
  2514         selected = self.ProjectTree.GetSelection()
  2503         selected = self.ProjectTree.GetSelection()
  2515         if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: 
  2504         item_infos = self.ProjectTree.GetPyData(selected)
       
  2505         if item_infos["type"] == ITEM_TRANSITION: 
  2516             transition = self.ProjectTree.GetItemText(selected)
  2506             transition = self.ProjectTree.GetItemText(selected)
  2517             item = self.ProjectTree.GetItemParent(selected)
  2507             pou_name = item_infos["tagname"].split("::")[1]
  2518             item_type = self.ProjectTree.GetPyData(item)
       
  2519             while item_type != ITEM_POU:
       
  2520                 item = self.ProjectTree.GetItemParent(item)
       
  2521                 item_type = self.ProjectTree.GetPyData(item)
       
  2522             pou_name = self.ProjectTree.GetItemText(item)
       
  2523             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2508             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2524             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2509             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2525             idx = self.IsOpened(tagname)
  2510             idx = self.IsOpened(tagname)
  2526             if idx is not None:
  2511             if idx is not None:
  2527                 self.TabsOpened.DeletePage(idx)
  2512                 self.TabsOpened.DeletePage(idx)
  2528             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2513             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2529 
  2514 
  2530     def OnRemoveActionMenu(self, event):
  2515     def OnRemoveActionMenu(self, event):
  2531         selected = self.ProjectTree.GetSelection()
  2516         selected = self.ProjectTree.GetSelection()
  2532         if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: 
  2517         item_infos = self.ProjectTree.GetPyData(selected)
       
  2518         if item_infos["type"] == ITEM_ACTION: 
  2533             action = self.ProjectTree.GetItemText(selected)
  2519             action = self.ProjectTree.GetItemText(selected)
  2534             item = self.ProjectTree.GetItemParent(selected)
  2520             pou_name = item_infos["tagname"].split("::")[1]
  2535             item_type = self.ProjectTree.GetPyData(item)
       
  2536             while item_type != ITEM_POU:
       
  2537                 item = self.ProjectTree.GetItemParent(item)
       
  2538                 item_type = self.ProjectTree.GetPyData(item)
       
  2539             pou_name = self.ProjectTree.GetItemText(item)
       
  2540             self.Controler.ProjectRemovePouAction(pou_name, action)
  2521             self.Controler.ProjectRemovePouAction(pou_name, action)
  2541             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2522             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2542             idx = self.IsOpened(tagname)
  2523             idx = self.IsOpened(tagname)
  2543             if idx is not None:
  2524             if idx is not None:
  2544                 self.TabsOpened.DeletePage(idx)
  2525                 self.TabsOpened.DeletePage(idx)
  2545             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2526             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2546 
  2527 
  2547     def OnRemoveConfigurationMenu(self, event):
  2528     def OnRemoveConfigurationMenu(self, event):
  2548         selected = self.ProjectTree.GetSelection()
  2529         selected = self.ProjectTree.GetSelection()
  2549         if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2530         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION: 
  2550             name = self.ProjectTree.GetItemText(selected)
  2531             name = self.ProjectTree.GetItemText(selected)
  2551             self.Controler.ProjectRemoveConfiguration(name)
  2532             self.Controler.ProjectRemoveConfiguration(name)
  2552             tagname = self.Controler.ComputeConfigurationName(name)
  2533             tagname = self.Controler.ComputeConfigurationName(name)
  2553             idx = self.IsOpened(tagname)
  2534             idx = self.IsOpened(tagname)
  2554             if idx is not None:
  2535             if idx is not None:
  2555                 self.TabsOpened.DeletePage(idx)
  2536                 self.TabsOpened.DeletePage(idx)
  2556             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2537             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2557 
  2538 
  2558     def OnRemoveResourceMenu(self, event):
  2539     def OnRemoveResourceMenu(self, event):
  2559         selected = self.ProjectTree.GetSelection()
  2540         selected = self.ProjectTree.GetSelection()
  2560         if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE:
  2541         item_infos = self.ProjectTree.GetPyData(selected)
       
  2542         if item_infos["type"] == ITEM_RESOURCE:
  2561             resource = self.ProjectTree.GetItemText(selected)
  2543             resource = self.ProjectTree.GetItemText(selected)
  2562             item = self.ProjectTree.GetItemParent(selected)
  2544             config_name = item_infos["tagname"].split("::")[1]
  2563             item_type = self.ProjectTree.GetPyData(item)
       
  2564             while item_type != ITEM_CONFIGURATION:
       
  2565                 item = self.ProjectTree.GetItemParent(item)
       
  2566                 item_type = self.ProjectTree.GetPyData(item)
       
  2567             config_name = self.ProjectTree.GetItemText(item)
       
  2568             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2545             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2569             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2546             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2570             idx = self.IsOpened(tagname)
  2547             idx = self.IsOpened(tagname)
  2571             if idx is not None:
  2548             if idx is not None:
  2572                 self.TabsOpened.DeletePage(idx)
  2549                 self.TabsOpened.DeletePage(idx)
  2709         result = None
  2686         result = None
  2710         
  2687         
  2711         # Open the filepath if defined
  2688         # Open the filepath if defined
  2712         if fileOpen is not None and os.path.isfile(fileOpen):
  2689         if fileOpen is not None and os.path.isfile(fileOpen):
  2713             # Create a new controller
  2690             # Create a new controller
  2714             self.Controler = PLCControler()
  2691             controler = PLCControler()
  2715             result = self.Controler.OpenXMLFile(fileOpen)
  2692             result = controler.OpenXMLFile(fileOpen)
  2716             if result is None:
  2693             if result is None:
  2717             	self.LibraryPanel.SetControler(self.Controler)
  2694                 self.Controler = controler
  2718                 self.PouInstanceVariablesPanel.SetController(self.Controler)
  2695             	self.LibraryPanel.SetControler(controler)
       
  2696                 self.ProjectTree.Enable(True)
       
  2697                 self.PouInstanceVariablesPanel.SetController(controler)
  2719                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2698                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2720         
  2699         
  2721         # Define PLCOpenEditor icon
  2700         # Define PLCOpenEditor icon
  2722         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2701         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
  2723 
  2702 
  2824         dialog = wx.FileDialog(self, _("Choose a file"), directory, "",  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
  2803         dialog = wx.FileDialog(self, _("Choose a file"), directory, "",  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
  2825         if dialog.ShowModal() == wx.ID_OK:
  2804         if dialog.ShowModal() == wx.ID_OK:
  2826             filepath = dialog.GetPath()
  2805             filepath = dialog.GetPath()
  2827             if os.path.isfile(filepath):
  2806             if os.path.isfile(filepath):
  2828                 self.ResetView()
  2807                 self.ResetView()
  2829                 self.Controler = PLCControler()
  2808                 controler = PLCControler()
  2830                 result = self.Controler.OpenXMLFile(filepath)
  2809                 result = controler.OpenXMLFile(filepath)
  2831                 if result is None:
  2810                 if result is None:
  2832                     self.LibraryPanel.SetControler(self.Controler)
  2811                     self.Controler = controler
  2833                     self.PouInstanceVariablesPanel.SetController(self.Controler)
  2812                     self.LibraryPanel.SetControler(controler)
       
  2813                     self.ProjectTree.Enable(True)
       
  2814                     self.PouInstanceVariablesPanel.SetController(controler)
  2834                     self.LoadProjectOrganization()
  2815                     self.LoadProjectOrganization()
  2835                     self._Refresh(PROJECTTREE, LIBRARYTREE)
  2816                     self._Refresh(PROJECTTREE, LIBRARYTREE)
  2836             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  2817             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  2837         dialog.Destroy()
  2818         dialog.Destroy()
  2838         
  2819         
  4252     
  4233     
  4253     def UnregisterObsoleteData(self):
  4234     def UnregisterObsoleteData(self):
  4254         items = [(idx, item) for idx, item in enumerate(self.Table.GetData())]
  4235         items = [(idx, item) for idx, item in enumerate(self.Table.GetData())]
  4255         items.reverse()
  4236         items.reverse()
  4256         for idx, item in items:
  4237         for idx, item in items:
  4257             if self.GetDataType(item.GetVariable().upper()) is None:
  4238             iec_path = item.GetVariable().upper()
       
  4239             if self.GetDataType(iec_path) is None:
  4258                 self.RemoveDataConsumer(item)
  4240                 self.RemoveDataConsumer(item)
  4259                 self.Table.RemoveItem(idx)
  4241                 self.Table.RemoveItem(idx)
  4260             else:
  4242             else:
  4261                 self.AddDataConsumer(iec_path.upper(), item)
  4243                 self.AddDataConsumer(iec_path, item)
  4262         self.Freeze()
  4244         self.Freeze()
  4263         self.Table.ResetView(self.VariablesGrid)
  4245         self.Table.ResetView(self.VariablesGrid)
  4264         self.VariablesGrid.RefreshButtons()
  4246         self.VariablesGrid.RefreshButtons()
  4265         self.Thaw()
  4247         self.Thaw()
  4266     
  4248