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)] |
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) |
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 |
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: |
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 |
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 |
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): |