PLCOpenEditor.py
changeset 239 d12779e971bd
parent 235 7b58a3b5b6ec
child 240 714000906db1
equal deleted inserted replaced
238:389f2046e495 239:d12779e971bd
    50 CWD = os.path.split(os.path.realpath(__file__))[0]
    50 CWD = os.path.split(os.path.realpath(__file__))[0]
    51 
    51 
    52 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
    52 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
    53  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
    53  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
    54  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    54  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    55  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    55  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
       
    56  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
       
    57  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
    56  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    58  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    57  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
    59  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
    58  ID_PLCOPENEDITORLDTOOLBAR,
    60  ID_PLCOPENEDITORLDTOOLBAR,
    59 ] = [wx.NewId() for _init_ctrls in range(13)]
    61 ] = [wx.NewId() for _init_ctrls in range(17)]
    60 
    62 
    61 [ID_PLCOPENEDITORFILEMENUGENERATE, 
    63 [ID_PLCOPENEDITORFILEMENUGENERATE, 
    62 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
    64 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
    63 
    65 
    64 [ID_PLCOPENEDITOREDITMENUADDDATATYPE, ID_PLCOPENEDITOREDITMENUADDFUNCTION,
    66 [ID_PLCOPENEDITOREDITMENUADDDATATYPE, ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   333         
   335         
   334         self._init_coll_MenuBar_Menus(self.MenuBar)
   336         self._init_coll_MenuBar_Menus(self.MenuBar)
   335         self._init_coll_FileMenu_Items(self.FileMenu)
   337         self._init_coll_FileMenu_Items(self.FileMenu)
   336         self._init_coll_EditMenu_Items(self.EditMenu)
   338         self._init_coll_EditMenu_Items(self.EditMenu)
   337         self._init_coll_HelpMenu_Items(self.HelpMenu)
   339         self._init_coll_HelpMenu_Items(self.HelpMenu)
       
   340 
       
   341     def _init_coll_MainLibrarySizer_Items(self, parent):
       
   342         parent.AddWindow(self.LibraryTree, 0, border=0, flag=wx.GROW)
       
   343         parent.AddSizer(self.LibraryComment, 0, border=0, flag=wx.GROW)
       
   344 
       
   345     def _init_coll_MainLibrarySizer_Growables(self, parent):
       
   346         parent.AddGrowableCol(0)
       
   347         parent.AddGrowableRow(0)
       
   348 
       
   349     def _init_sizers(self):
       
   350         self.MainLibrarySizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
   351         
       
   352         self._init_coll_MainLibrarySizer_Growables(self.MainLibrarySizer)
       
   353         self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer)
       
   354         
       
   355         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
   338         
   356         
   339     def _init_ctrls(self, prnt):
   357     def _init_ctrls(self, prnt):
   340         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   358         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   341               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   359               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   342               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   360               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   428                   size=wx.Size(0, 0), style=wx.SP_3D)
   446                   size=wx.Size(0, 0), style=wx.SP_3D)
   429             self.SecondSplitter.SetMinimumPaneSize(1)
   447             self.SecondSplitter.SetMinimumPaneSize(1)
   430             
   448             
   431             self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   449             self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   432             
   450             
       
   451             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
       
   452         
       
   453             self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
       
   454                   name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
       
   455                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   456             self.ThirdSplitter.SetMinimumPaneSize(1)
       
   457             
       
   458             self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.VariablePanelIndexer, -200)
       
   459             
   433             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   460             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   434                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   461                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   435                   0), size=wx.Size(0, 0), style=0)
   462                   0), size=wx.Size(0, 0), style=0)
   436             if wx.VERSION >= (2, 6, 0):
   463             if wx.VERSION >= (2, 6, 0):
   437                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   464                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   438                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   465                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   439             else:
   466             else:
   440                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   467                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   441                     self.OnPouSelectedChanged)
   468                     self.OnPouSelectedChanged)
   442         else:
   469         
       
   470             self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
       
   471                   name='LibraryPanel', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   472                   0), size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
       
   473             
       
   474             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.LibraryPanel, -250)
       
   475         else:
       
   476             self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
       
   477             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
       
   478         
   443             self.TabsOpened = wx.aui.AuiNotebook(self)
   479             self.TabsOpened = wx.aui.AuiNotebook(self)
   444             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   480             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   445                     self.OnPouSelectedChanged)
   481                     self.OnPouSelectedChanged)
   446             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   482             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   447             
   483         
   448         if wx.VERSION < (2, 8, 0):
   484             self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   449             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   485                   name='LibraryPanel', parent=self, pos=wx.Point(0,
   450             
   486                   0), size=wx.Size(0, 0), style=0)
   451             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   487             self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption("Library").Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   452         else:
   488         
   453             self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
       
   454             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
       
   455             
       
   456             self.AUIManager.Update()
   489             self.AUIManager.Update()
       
   490         
       
   491         if wx.Platform == '__WXMSW__':
       
   492             treestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   493         else:
       
   494             treestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   495         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
       
   496                   name='LibraryTree', parent=self.LibraryPanel, 
       
   497                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
       
   498                   style=treestyle)
       
   499         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
       
   500               id=ID_PLCOPENEDITORLIBRARYTREE)
       
   501         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
       
   502               id=ID_PLCOPENEDITORLIBRARYTREE)
       
   503         
       
   504         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
       
   505                   name='LibraryComment', parent=self.LibraryPanel, 
       
   506                   pos=wx.Point(0, 0), size=wx.Size(0, 60), 
       
   507                   style=wx.TE_READONLY|wx.TE_MULTILINE)
       
   508         
       
   509         self._init_sizers()
   457         
   510         
   458     def __init__(self, parent, controler = None, fileOpen = None):
   511     def __init__(self, parent, controler = None, fileOpen = None):
   459         self.ModeSolo = controler == None
   512         self.ModeSolo = controler == None
   460         if self.ModeSolo:
   513         if self.ModeSolo:
   461             self.Controler = PLCControler()
   514             self.Controler = PLCControler()
   523         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   576         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   524         
   577         
   525         if not self.ModeSolo or fileOpen is not None:
   578         if not self.ModeSolo or fileOpen is not None:
   526             self.RefreshTypesTree()
   579             self.RefreshTypesTree()
   527             self.RefreshInstancesTree()
   580             self.RefreshInstancesTree()
       
   581             self.RefreshLibraryTree()
   528         
   582         
   529         self.RefreshFileMenu()
   583         self.RefreshFileMenu()
   530         self.RefreshEditMenu()
   584         self.RefreshEditMenu()
   531         self.RefreshTitle()
   585         self.RefreshTitle()
   532         self.RefreshToolBar()
   586         self.RefreshToolBar()
   673             self.RefreshTitle()
   727             self.RefreshTitle()
   674             self.RefreshFileMenu()
   728             self.RefreshFileMenu()
   675             self.RefreshEditMenu()
   729             self.RefreshEditMenu()
   676             self.RefreshTypesTree()
   730             self.RefreshTypesTree()
   677             self.RefreshInstancesTree()
   731             self.RefreshInstancesTree()
       
   732             self.RefreshLibraryTree()
   678         event.Skip()
   733         event.Skip()
   679 
   734 
   680     def OnOpenProjectMenu(self, event):
   735     def OnOpenProjectMenu(self, event):
   681         if not self.Controler.ProjectIsSaved():
   736         if not self.Controler.ProjectIsSaved():
   682             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   737             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   698                 self.DeleteAllPages()
   753                 self.DeleteAllPages()
   699                 self.VariablePanelIndexer.RemoveAllPanels()
   754                 self.VariablePanelIndexer.RemoveAllPanels()
   700                 self.Controler.OpenXMLFile(filepath)
   755                 self.Controler.OpenXMLFile(filepath)
   701                 self.RefreshTypesTree()
   756                 self.RefreshTypesTree()
   702                 self.RefreshInstancesTree()
   757                 self.RefreshInstancesTree()
       
   758                 self.RefreshLibraryTree()
   703             self.RefreshTitle()
   759             self.RefreshTitle()
   704             self.RefreshFileMenu()
   760             self.RefreshFileMenu()
   705             self.RefreshEditMenu()
   761             self.RefreshEditMenu()
   706             self.RefreshToolBar()
   762             self.RefreshToolBar()
   707         dialog.Destroy()
   763         dialog.Destroy()
   914             window.RefreshView()
   970             window.RefreshView()
   915             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   971             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   916         self.RefreshTitle()
   972         self.RefreshTitle()
   917         self.RefreshEditMenu()
   973         self.RefreshEditMenu()
   918         self.RefreshTypesTree()
   974         self.RefreshTypesTree()
       
   975         self.RefreshInstancesTree()
       
   976         self.RefreshLibraryTree()
   919         event.Skip()
   977         event.Skip()
   920     
   978     
   921     def OnRedoMenu(self, event):
   979     def OnRedoMenu(self, event):
   922         self.Controler.LoadNext()
   980         self.Controler.LoadNext()
   923         idxs = range(self.TabsOpened.GetPageCount())
   981         idxs = range(self.TabsOpened.GetPageCount())
   933             window.RefreshView()
   991             window.RefreshView()
   934             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   992             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   935         self.RefreshTitle()
   993         self.RefreshTitle()
   936         self.RefreshEditMenu()
   994         self.RefreshEditMenu()
   937         self.RefreshTypesTree()
   995         self.RefreshTypesTree()
       
   996         self.RefreshInstancesTree()
       
   997         self.RefreshLibraryTree()
   938         event.Skip()
   998         event.Skip()
   939 
   999 
   940     def OnCutMenu(self, event):
  1000     def OnCutMenu(self, event):
   941         control = self.FindFocus()
  1001         control = self.FindFocus()
   942         if isinstance(control, Viewer):
  1002         if isinstance(control, Viewer):
  1020                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1080                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1021                     self.TabsOpened.DeletePage(idx)
  1081                     self.TabsOpened.DeletePage(idx)
  1022                 self.RefreshTitle()
  1082                 self.RefreshTitle()
  1023                 self.RefreshEditMenu()
  1083                 self.RefreshEditMenu()
  1024                 self.RefreshTypesTree()
  1084                 self.RefreshTypesTree()
       
  1085                 self.RefreshInstancesTree()
       
  1086                 self.RefreshLibraryTree()
  1025                 self.RefreshToolBar()
  1087                 self.RefreshToolBar()
  1026         elif isinstance(window, (Viewer, TextViewer)):
  1088         elif isinstance(window, (Viewer, TextViewer)):
  1027             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1089             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1028             event.m_keyCode = wx.WXK_DELETE
  1090             event.m_keyCode = wx.WXK_DELETE
  1029             window.ProcessEvent(event)
  1091             window.ProcessEvent(event)
  1095                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1157                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1096             self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1158             self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1097 
  1159 
  1098 
  1160 
  1099 #-------------------------------------------------------------------------------
  1161 #-------------------------------------------------------------------------------
  1100 #                         Project Tree Management Functions
  1162 #                         Types Tree Management Functions
  1101 #-------------------------------------------------------------------------------
  1163 #-------------------------------------------------------------------------------
  1102 
  1164 
  1103     def RefreshTypesTree(self):
  1165     def RefreshTypesTree(self):
  1104         infos = self.Controler.GetProjectInfos()
  1166         infos = self.Controler.GetProjectInfos()
  1105         root = self.TypesTree.GetRootItem()
  1167         root = self.TypesTree.GetRootItem()
  1106         if not root.IsOk():
  1168         if not root.IsOk():
  1107             root = self.TypesTree.AddRoot(infos["name"])
  1169             root = self.TypesTree.AddRoot(infos["name"])
  1108         self.GenerateTypesTreeBranch(root, infos)
  1170         self.GenerateTypesTreeBranch(root, infos)
  1109         self.TypesTree.Expand(self.TypesTree.GetRootItem())
  1171         self.TypesTree.Expand(root)
  1110 
  1172 
  1111     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1173     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1112         to_delete = []
  1174         to_delete = []
  1113         self.TypesTree.SetItemText(root, infos["name"])
  1175         self.TypesTree.SetItemText(root, infos["name"])
  1114         self.TypesTree.SetPyData(root, infos["type"])
  1176         self.TypesTree.SetPyData(root, infos["type"])
  1575                 self.PopupMenu(menu)
  1637                 self.PopupMenu(menu)
  1576         event.Skip()
  1638         event.Skip()
  1577 
  1639 
  1578 
  1640 
  1579 #-------------------------------------------------------------------------------
  1641 #-------------------------------------------------------------------------------
  1580 #                         Topology Tree Management Functions
  1642 #                         Instances Tree Management Functions
  1581 #-------------------------------------------------------------------------------
  1643 #-------------------------------------------------------------------------------
  1582 
  1644 
  1583     def RefreshInstancesTree(self):
  1645     def RefreshInstancesTree(self):
  1584         infos = self.Controler.GetProjectTopology()
  1646         infos = self.Controler.GetProjectTopology()
  1585         root = self.InstancesTree.GetRootItem()
  1647         root = self.InstancesTree.GetRootItem()
  1586         if not root.IsOk():
  1648         if not root.IsOk():
  1587             root = self.InstancesTree.AddRoot(infos["name"])
  1649             root = self.InstancesTree.AddRoot(infos["name"])
  1588         self.GenerateInstancesTreeBranch(root, infos)
  1650         self.GenerateInstancesTreeBranch(root, infos)
  1589         self.InstancesTree.Expand(self.InstancesTree.GetRootItem())
  1651         self.InstancesTree.Expand(root)
  1590 
  1652 
  1591     def GenerateInstancesTreeBranch(self, root, infos):
  1653     def GenerateInstancesTreeBranch(self, root, infos):
  1592         to_delete = []
  1654         to_delete = []
  1593         if infos.get("elmt_type", None) is not None:
  1655         if infos.get("elmt_type", None) is not None:
  1594             self.InstancesTree.SetItemText(root, "%s(%s)"%(infos["name"], infos["elmt_type"]))
  1656             self.InstancesTree.SetItemText(root, "%s(%s)"%(infos["name"], infos["elmt_type"]))
  1611         while item.IsOk():
  1673         while item.IsOk():
  1612             to_delete.append(item)
  1674             to_delete.append(item)
  1613             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1675             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1614         for item in to_delete:
  1676         for item in to_delete:
  1615             self.InstancesTree.Delete(item)
  1677             self.InstancesTree.Delete(item)
       
  1678 
       
  1679 #-------------------------------------------------------------------------------
       
  1680 #                         Library Tree Management Functions
       
  1681 #-------------------------------------------------------------------------------
       
  1682 
       
  1683     def RefreshLibraryTree(self):
       
  1684         to_delete = []
       
  1685         blocktypes = self.Controler.GetBlockTypes()
       
  1686         if wx.Platform == '__WXMSW__':
       
  1687             root = self.LibraryTree.AddRoot("Block Types")
       
  1688             self.TypeTree.SetPyData(root, {"type" : CATEGORY})
       
  1689         else:
       
  1690             root = self.LibraryTree.AddRoot("")
       
  1691         if wx.VERSION >= (2, 6, 0):
       
  1692             category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
       
  1693         else:
       
  1694             category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
       
  1695         for category in blocktypes:
       
  1696             print category["name"]
       
  1697             if not category_item.IsOk():
       
  1698                 category_item = self.LibraryTree.AppendItem(root, category["name"])
       
  1699                 if wx.Platform != '__WXMSW__':
       
  1700                     category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1701             else:
       
  1702                 self.LibraryTree.SetItemText(category_item, category["name"])
       
  1703             self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
       
  1704             if wx.VERSION >= (2, 6, 0):
       
  1705                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
       
  1706             else:
       
  1707                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
       
  1708             for blocktype in category["list"]:
       
  1709                 if not blocktype_item.IsOk():
       
  1710                     blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
       
  1711                     if wx.Platform != '__WXMSW__':
       
  1712                         blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  1713                 else:
       
  1714                     self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
       
  1715                 self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
       
  1716                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  1717             while blocktype_item.IsOk():
       
  1718                 to_delete.append(blocktype_item)
       
  1719                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  1720             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1721         while category_item.IsOk():
       
  1722             to_delete.append(category_item)
       
  1723             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1724         for item in to_delete:
       
  1725             self.LibraryTree.Delete(item)
       
  1726         if wx.Platform == '__WXMSW__':        
       
  1727             self.LibraryTree.Expand(root)
       
  1728 
       
  1729     def OnLibraryTreeItemSelected(self, event):
       
  1730         selected = event.GetItem()
       
  1731         pydata = self.LibraryTree.GetPyData(selected)
       
  1732         if pydata["type"] != CATEGORY:
       
  1733             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"])
       
  1734             if blocktype:
       
  1735                 self.LibraryComment.SetValue(blocktype["comment"])
       
  1736             else:
       
  1737                 self.LibraryComment.SetValue("")
       
  1738         else:
       
  1739             self.LibraryComment.SetValue("")
       
  1740         event.Skip()
       
  1741 
       
  1742     def OnLibraryTreeBeginDrag(self, event):
       
  1743         selected = event.GetItem()
       
  1744         pydata = self.LibraryTree.GetPyData(selected)
       
  1745         if selected is not None and pydata["type"] == BLOCK:
       
  1746             data = wx.TextDataObject(str((self.LibraryTree.GetItemText(selected), 
       
  1747                 pydata["block_type"], "", pydata["inputs"])))
       
  1748             dragSource = wx.DropSource(self.LibraryTree)
       
  1749             dragSource.SetData(data)
       
  1750             dragSource.DoDragDrop()
  1616 
  1751 
  1617 #-------------------------------------------------------------------------------
  1752 #-------------------------------------------------------------------------------
  1618 #                          ToolBar Management Functions
  1753 #                          ToolBar Management Functions
  1619 #-------------------------------------------------------------------------------
  1754 #-------------------------------------------------------------------------------
  1620 
  1755 
  1846                 values = dialog.GetValues()
  1981                 values = dialog.GetValues()
  1847                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1982                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1848                 self.RefreshTitle()
  1983                 self.RefreshTitle()
  1849                 self.RefreshEditMenu()
  1984                 self.RefreshEditMenu()
  1850                 self.RefreshTypesTree()
  1985                 self.RefreshTypesTree()
       
  1986                 self.RefreshLibraryTree()
  1851             dialog.Destroy()
  1987             dialog.Destroy()
  1852             event.Skip()
  1988             event.Skip()
  1853         return OnAddPouMenu
  1989         return OnAddPouMenu
  1854 
  1990 
  1855     def GenerateAddTransitionFunction(self, pou_name):
  1991     def GenerateAddTransitionFunction(self, pou_name):
  1861                 values = dialog.GetValues()
  1997                 values = dialog.GetValues()
  1862                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  1998                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  1863                 self.RefreshTitle()
  1999                 self.RefreshTitle()
  1864                 self.RefreshEditMenu()
  2000                 self.RefreshEditMenu()
  1865                 self.RefreshTypesTree()
  2001                 self.RefreshTypesTree()
  1866             dialog.Destroy()
  2002                 dialog.Destroy()
  1867             event.Skip()
  2003             event.Skip()
  1868         return OnAddTransitionMenu
  2004         return OnAddTransitionMenu
  1869 
  2005 
  1870     def GenerateAddActionFunction(self, pou_name):
  2006     def GenerateAddActionFunction(self, pou_name):
  1871         def OnAddActionMenu(event):
  2007         def OnAddActionMenu(event):
  1890             value = dialog.GetValue()
  2026             value = dialog.GetValue()
  1891             self.Controler.ProjectAddConfiguration(value)
  2027             self.Controler.ProjectAddConfiguration(value)
  1892             self.RefreshTitle()
  2028             self.RefreshTitle()
  1893             self.RefreshEditMenu()
  2029             self.RefreshEditMenu()
  1894             self.RefreshTypesTree()
  2030             self.RefreshTypesTree()
       
  2031             self.RefreshInstancesTree()
  1895         dialog.Destroy()
  2032         dialog.Destroy()
  1896         event.Skip()
  2033         event.Skip()
  1897 
  2034 
  1898     def GenerateAddResourceFunction(self, config_name):
  2035     def GenerateAddResourceFunction(self, config_name):
  1899         def OnAddResourceMenu(event):
  2036         def OnAddResourceMenu(event):
  1904                 value = dialog.GetValue()
  2041                 value = dialog.GetValue()
  1905                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2042                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  1906                 self.RefreshTitle()
  2043                 self.RefreshTitle()
  1907                 self.RefreshEditMenu()
  2044                 self.RefreshEditMenu()
  1908                 self.RefreshTypesTree()
  2045                 self.RefreshTypesTree()
       
  2046                 self.RefreshInstancesTree()
  1909             dialog.Destroy()
  2047             dialog.Destroy()
  1910             event.Skip()
  2048             event.Skip()
  1911         return OnAddResourceMenu
  2049         return OnAddResourceMenu
  1912 
  2050 
  1913 
  2051 
  1947                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2085                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1948                     self.TabsOpened.DeletePage(idx)
  2086                     self.TabsOpened.DeletePage(idx)
  1949                 self.RefreshTitle()
  2087                 self.RefreshTitle()
  1950                 self.RefreshEditMenu()
  2088                 self.RefreshEditMenu()
  1951                 self.RefreshTypesTree()
  2089                 self.RefreshTypesTree()
       
  2090                 self.RefreshInstancesTree()
       
  2091                 self.RefreshLibraryTree()
  1952                 self.RefreshToolBar()
  2092                 self.RefreshToolBar()
  1953             else:
  2093             else:
  1954                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  2094                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1955                 message.ShowModal()
  2095                 message.ShowModal()
  1956                 message.Destroy()
  2096                 message.Destroy()
  1957         event.Skip()
       
  1958 
       
  1959     def OnRemoveConfigurationMenu(self, event):
       
  1960         selected = self.TypesTree.GetSelection()
       
  1961         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
       
  1962             name = self.TypesTree.GetItemText(selected)
       
  1963             self.Controler.ProjectRemoveConfiguration(name)
       
  1964             tagname = self.Controler.ComputeConfigurationName(name)
       
  1965             idx = self.IsOpened(tagname)
       
  1966             if idx is not None:
       
  1967                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  1968                 self.TabsOpened.DeletePage(idx)
       
  1969             self.RefreshTitle()
       
  1970             self.RefreshEditMenu()
       
  1971             self.RefreshTypesTree()
       
  1972         event.Skip()
  2097         event.Skip()
  1973 
  2098 
  1974     def OnRemoveTransitionMenu(self, event):
  2099     def OnRemoveTransitionMenu(self, event):
  1975         selected = self.TypesTree.GetSelection()
  2100         selected = self.TypesTree.GetSelection()
  1976         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2101         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2011             self.RefreshTitle()
  2136             self.RefreshTitle()
  2012             self.RefreshEditMenu()
  2137             self.RefreshEditMenu()
  2013             self.RefreshTypesTree()
  2138             self.RefreshTypesTree()
  2014         event.Skip()
  2139         event.Skip()
  2015 
  2140 
       
  2141     def OnRemoveConfigurationMenu(self, event):
       
  2142         selected = self.TypesTree.GetSelection()
       
  2143         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
       
  2144             name = self.TypesTree.GetItemText(selected)
       
  2145             self.Controler.ProjectRemoveConfiguration(name)
       
  2146             tagname = self.Controler.ComputeConfigurationName(name)
       
  2147             idx = self.IsOpened(tagname)
       
  2148             if idx is not None:
       
  2149                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2150                 self.TabsOpened.DeletePage(idx)
       
  2151             self.RefreshTitle()
       
  2152             self.RefreshEditMenu()
       
  2153             self.RefreshTypesTree()
       
  2154             self.RefreshInstancesTree()
       
  2155         event.Skip()
       
  2156 
  2016     def OnRemoveResourceMenu(self, event):
  2157     def OnRemoveResourceMenu(self, event):
  2017         selected = self.TypesTree.GetSelection()
  2158         selected = self.TypesTree.GetSelection()
  2018         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2159         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2019             resource = self.TypesTree.GetItemText(selected)
  2160             resource = self.TypesTree.GetItemText(selected)
  2020             item = self.TypesTree.GetItemParent(selected)
  2161             item = self.TypesTree.GetItemParent(selected)
  2030                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2171                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2031                 self.TabsOpened.DeletePage(idx)
  2172                 self.TabsOpened.DeletePage(idx)
  2032             self.RefreshTitle()
  2173             self.RefreshTitle()
  2033             self.RefreshEditMenu()
  2174             self.RefreshEditMenu()
  2034             self.RefreshTypesTree()
  2175             self.RefreshTypesTree()
       
  2176             self.RefreshInstancesTree()
  2035         event.Skip()
  2177         event.Skip()
  2036     
  2178     
  2037     def OnPLCOpenEditorMenu(self, event):
  2179     def OnPLCOpenEditorMenu(self, event):
  2038         wx.MessageBox("No documentation available.\nComing soon.")
  2180         wx.MessageBox("No documentation available.\nComing soon.")
  2039         #event.Skip()
  2181         #event.Skip()
  3757             new_row["Class"] = self.Filter
  3899             new_row["Class"] = self.Filter
  3758         self.Values.append(new_row)
  3900         self.Values.append(new_row)
  3759         self.SaveValues()
  3901         self.SaveValues()
  3760         self.RefreshValues()
  3902         self.RefreshValues()
  3761         self.RefreshButtons()
  3903         self.RefreshButtons()
       
  3904         self.ParentWindow.RefreshInstancesTree()
  3762         event.Skip()
  3905         event.Skip()
  3763 
  3906 
  3764     def OnDeleteButton(self, event):
  3907     def OnDeleteButton(self, event):
  3765         row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
  3908         row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
  3766         self.Values.remove(row)
  3909         self.Values.remove(row)
  3767         self.SaveValues()
  3910         self.SaveValues()
  3768         self.RefreshValues()
  3911         self.RefreshValues()
  3769         self.RefreshButtons()
  3912         self.RefreshButtons()
       
  3913         self.ParentWindow.RefreshInstancesTree()
  3770         event.Skip()
  3914         event.Skip()
  3771 
  3915 
  3772     def OnUpButton(self, event):
  3916     def OnUpButton(self, event):
  3773         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
  3917         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
  3774         self.RefreshButtons()
  3918         self.RefreshButtons()
       
  3919         self.ParentWindow.RefreshInstancesTree()
  3775         event.Skip()
  3920         event.Skip()
  3776 
  3921 
  3777     def OnDownButton(self, event):
  3922     def OnDownButton(self, event):
  3778         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
  3923         self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
  3779         self.RefreshButtons()
  3924         self.RefreshButtons()
       
  3925         self.ParentWindow.RefreshInstancesTree()
  3780         event.Skip()
  3926         event.Skip()
  3781 
  3927 
  3782     def OnVariablesGridCellChange(self, event):
  3928     def OnVariablesGridCellChange(self, event):
  3783         row, col = event.GetRow(), event.GetCol()
  3929         row, col = event.GetRow(), event.GetCol()
  3784         colname = self.Table.GetColLabelValue(col)
  3930         colname = self.Table.GetColLabelValue(col)
  3811                     self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
  3957                     self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
  3812                 self.Controler.BufferProject()
  3958                 self.Controler.BufferProject()
  3813                 self.ParentWindow.RefreshEditor(variablepanel = False)
  3959                 self.ParentWindow.RefreshEditor(variablepanel = False)
  3814                 self.ParentWindow.RefreshTitle()
  3960                 self.ParentWindow.RefreshTitle()
  3815                 self.ParentWindow.RefreshEditMenu()
  3961                 self.ParentWindow.RefreshEditMenu()
       
  3962                 self.ParentWindow.RefreshInstancesTree()
  3816                 event.Skip()
  3963                 event.Skip()
  3817         else:
  3964         else:
  3818             self.SaveValues()
  3965             self.SaveValues()
  3819             if colname == "Class":
  3966             if colname == "Class":
  3820                 self.Table.ResetView(self.VariablesGrid)
  3967                 self.Table.ResetView(self.VariablesGrid)
       
  3968             self.ParentWindow.RefreshInstancesTree()
  3821             event.Skip()
  3969             event.Skip()
  3822     
  3970     
  3823     def OnVariablesGridEditorShown(self, event):
  3971     def OnVariablesGridEditorShown(self, event):
  3824         row, col = event.GetRow(), event.GetCol() 
  3972         row, col = event.GetRow(), event.GetCol() 
  3825         if self.Table.GetColLabelValue(col) == "Type":
  3973         if self.Table.GetColLabelValue(col) == "Type":