PLCOpenEditor.py
changeset 121 40b91ba978db
parent 120 add8e391e00c
child 122 e6faee0c271b
equal deleted inserted replaced
120:add8e391e00c 121:40b91ba978db
    43 __version__ = "$Revision$"
    43 __version__ = "$Revision$"
    44 
    44 
    45 CWD = os.path.split(__file__)[0]
    45 CWD = os.path.split(__file__)[0]
    46 
    46 
    47 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    47 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    48  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITOREDITORPANEL,
    48  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    49  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTOOLBAR,
    49  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    50  ID_PLCOPENEDITORDEFAULTTOOLBAR, ID_PLCOPENEDITORSFCTOOLBAR, 
    50  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    51  ID_PLCOPENEDITORFBDTOOLBAR, ID_PLCOPENEDITORLDTOOLBAR,
    51  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
    52 ] = [wx.NewId() for _init_ctrls in range(10)]
    52  ID_PLCOPENEDITORLDTOOLBAR,
       
    53 ] = [wx.NewId() for _init_ctrls in range(11)]
    53 
    54 
    54 [ID_PLCOPENEDITORFILEMENUITEMS0, ID_PLCOPENEDITORFILEMENUITEMS1, 
    55 [ID_PLCOPENEDITORFILEMENUITEMS0, ID_PLCOPENEDITORFILEMENUITEMS1, 
    55  ID_PLCOPENEDITORFILEMENUITEMS2, ID_PLCOPENEDITORFILEMENUITEMS3, 
    56  ID_PLCOPENEDITORFILEMENUITEMS2, ID_PLCOPENEDITORFILEMENUITEMS3, 
    56  ID_PLCOPENEDITORFILEMENUITEMS5, ID_PLCOPENEDITORFILEMENUITEMS6, 
    57  ID_PLCOPENEDITORFILEMENUITEMS5, ID_PLCOPENEDITORFILEMENUITEMS6, 
    57  ID_PLCOPENEDITORFILEMENUITEMS7, ID_PLCOPENEDITORFILEMENUITEMS9, 
    58  ID_PLCOPENEDITORFILEMENUITEMS7, ID_PLCOPENEDITORFILEMENUITEMS9, 
   137     if wx.VERSION >= (2, 6, 0):
   138     if wx.VERSION >= (2, 6, 0):
   138         parent.Append(help=help, id=id, kind=kind, text=text)
   139         parent.Append(help=help, id=id, kind=kind, text=text)
   139     else:
   140     else:
   140         parent.Append(helpString=help, id=id, kind=kind, item=text)
   141         parent.Append(helpString=help, id=id, kind=kind, item=text)
   141 
   142 
   142 class PLCOpenEditor(wx.Frame):
   143 if wx.VERSION >= (2, 8, 0):
       
   144     base_class = wx.aui.AuiMDIParentFrame
       
   145 else:
       
   146     base_class = wx.Frame
       
   147 
       
   148 class PLCOpenEditor(base_class):
   143     _custom_classes = {'wx.SashWindow' : ['Viewer']}
   149     _custom_classes = {'wx.SashWindow' : ['Viewer']}
   144     
   150     
   145     if wx.VERSION < (2, 6, 0):
   151     if wx.VERSION < (2, 6, 0):
   146         def Bind(self, event, function, id = None):
   152         def Bind(self, event, function, id = None):
   147             if id is not None:
   153             if id is not None:
   301         self._init_coll_HelpMenu_Items(self.HelpMenu)
   307         self._init_coll_HelpMenu_Items(self.HelpMenu)
   302         self._init_coll_SFCMenu_Items(self.SFCMenu)
   308         self._init_coll_SFCMenu_Items(self.SFCMenu)
   303         self._init_coll_ConfigMenu_Items(self.ConfigMenu)
   309         self._init_coll_ConfigMenu_Items(self.ConfigMenu)
   304 
   310 
   305     def _init_ctrls(self, prnt):
   311     def _init_ctrls(self, prnt):
   306         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   312         if wx.VERSION >= (2, 8, 0):
   307               parent=prnt, pos=wx.Point(235, 287), size=wx.Size(1000, 600),
   313             wx.aui.AuiMDIParentFrame.__init__(self, winid=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', 
   308               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   314                   parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
       
   315                   style=wx.DEFAULT_FRAME_STYLE|wx.SUNKEN_BORDER|wx.CLIP_CHILDREN, title=u'PLCOpenEditor')
       
   316         else:
       
   317             wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
       
   318                   parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
       
   319                   style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   309         self._init_utils()
   320         self._init_utils()
   310         self.SetClientSize(wx.Size(1000, 600))
   321         self.SetClientSize(wx.Size(1000, 600))
   311         self.SetMenuBar(self.menuBar1)
   322         self.SetMenuBar(self.menuBar1)
   312         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   323         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   313         if not self.ModeSolo:
   324         if not self.ModeSolo:
       
   325             self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=ID_PLCOPENEDITORFILEMENUITEMS2)
   314             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=ID_PLCOPENEDITORFILEMENUITEMS5)
   326             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=ID_PLCOPENEDITORFILEMENUITEMS5)
   315             accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, ID_PLCOPENEDITORFILEMENUITEMS5)])
   327             accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 119, ID_PLCOPENEDITORFILEMENUITEMS2),
       
   328                                          wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, ID_PLCOPENEDITORFILEMENUITEMS5)])
   316             self.SetAcceleratorTable(accel)
   329             self.SetAcceleratorTable(accel)
   317         
   330         
   318         if wx.VERSION >= (2, 8, 0):
   331         if wx.VERSION >= (2, 8, 0):
   319             self.AUIManager = wx.aui.AuiManager(self)
   332             self.AUIManager = wx.aui.AuiManager(self)
       
   333             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   320             self.Panes = {}
   334             self.Panes = {}
   321         
   335         
   322         if wx.VERSION < (2, 8, 0):
   336         if wx.VERSION < (2, 8, 0):
   323             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   337             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   324                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   338                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   333         else:
   347         else:
   334             self.ProjectTree = wx.TreeCtrl(id=ID_PLCOPENEDITORPROJECTTREE,
   348             self.ProjectTree = wx.TreeCtrl(id=ID_PLCOPENEDITORPROJECTTREE,
   335                   name='treeCtrl1', parent=self, pos=wx.Point(0, 0),
   349                   name='treeCtrl1', parent=self, pos=wx.Point(0, 0),
   336                   size=wx.Size(200, -1),
   350                   size=wx.Size(200, -1),
   337                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   351                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   338             self.AUIManager.AddPane(self.ProjectTree, wx.aui.AuiPaneInfo().Caption("Project Tree").CloseButton(False))
   352             self.AUIManager.AddPane(self.ProjectTree, wx.aui.AuiPaneInfo().Caption("Project Tree").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   339         if wx.VERSION >= (2, 6, 0):
   353         if wx.VERSION >= (2, 6, 0):
   340             self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
   354             self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
   341         else:
   355         else:
   342             wx.EVT_RIGHT_UP(self.ProjectTree, self.OnProjectTreeRightUp)
   356             wx.EVT_RIGHT_UP(self.ProjectTree, self.OnProjectTreeRightUp)
   343         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
   357         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
   373         
   387         
   374         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   388         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   375               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   389               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   376             
   390             
   377         if wx.VERSION < (2, 8, 0):
   391         if wx.VERSION < (2, 8, 0):
       
   392             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
       
   393                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
       
   394                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   395             self.SecondSplitter.SetMinimumPaneSize(1)
       
   396             
       
   397             self.MainSplitter.SplitVertically(self.ProjectTree, self.SecondSplitter, 200)
       
   398             
   378             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   399             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   379                   name='TabsOpened', parent=self.MainSplitter, pos=wx.Point(0,
   400                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   380                   0), size=wx.Size(0, 0), style=0)
   401                   0), size=wx.Size(0, 0), style=0)
   381             self.MainSplitter.SplitVertically(self.ProjectTree, self.TabsOpened, 200)
   402             if wx.VERSION >= (2, 6, 0):
   382         else:
   403                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   383             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   404                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   384                   name='TabsOpened', parent=self, pos=wx.Point(0,
   405             else:
   385                   0), size=wx.Size(0, 0), style=0)
   406                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   386             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().Name("TabsOpened").CenterPane())
   407                     self.OnPouSelectedChanged)
   387 
   408         
   388         if wx.VERSION >= (2, 6, 0):
   409         if wx.VERSION < (2, 8, 0):
   389             self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   410             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self.Controler)
   390                 self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   411             
   391         else:
   412             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   392             wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   413         else:
   393                 self.OnPouSelectedChanged)
   414             self.VariablePanelIndexer = VariablePanelIndexer(self, self.Controler)
   394         
   415             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   395         if wx.VERSION > (2, 8, 0):
   416             
   396             self.AUIManager.Update(); 
   417             self.AUIManager.Update(); 
   397         
   418         
   398     def __init__(self, parent, controler = None, fileOpen = None):
   419     def __init__(self, parent, controler = None, fileOpen = None):
   399         self.ModeSolo = controler == None
   420         self.ModeSolo = controler == None
       
   421         if self.ModeSolo:
       
   422             self.Controler = PLCControler()
       
   423             if fileOpen is not None:
       
   424                 self.Controler.OpenXMLFile(fileOpen)
       
   425         else:
       
   426             self.Controler = controler
       
   427         
   400         self._init_ctrls(parent)
   428         self._init_ctrls(parent)
   401         
   429         
   402         if wx.Platform != '__WXMSW__':
   430         if wx.Platform != '__WXMSW__':
   403             self.TreeImageList = wx.ImageList(16, 16)
   431             self.TreeImageList = wx.ImageList(16, 16)
   404             for language in LANGUAGES:
   432             for language in LANGUAGES:
   405                 self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
   433                 self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
   406             self.ProjectTree.AssignImageList(self.TreeImageList)
   434             self.ProjectTree.AssignImageList(self.TreeImageList)
   407         
   435         
   408         if self.ModeSolo:
       
   409             self.Controler = PLCControler()
       
   410             if fileOpen:
       
   411                 self.Controler.OpenXMLFile(fileOpen)
       
   412                 self.RefreshProjectTree()
       
   413         else:
       
   414             self.Controler = controler
       
   415             self.RefreshProjectTree()
       
   416         
       
   417         self.CurrentToolBar = []
   436         self.CurrentToolBar = []
   418         self.CurrentLanguage = ""
   437         self.CurrentLanguage = ""
   419         self.CopyBuffer = None
   438         self.CopyBuffer = None
   420         self.DrawingMode = FREEDRAWING_MODE
   439         self.DrawingMode = FREEDRAWING_MODE
   421         #self.DrawingMode = DRIVENDRAWING_MODE
   440         #self.DrawingMode = DRIVENDRAWING_MODE
   422         
   441         
       
   442         if not self.ModeSolo or fileOpen is not None:
       
   443             self.RefreshProjectTree()
       
   444         
   423         self.RefreshFileMenu()
   445         self.RefreshFileMenu()
   424         self.RefreshEditMenu()
   446         self.RefreshEditMenu()
   425         self.RefreshTitle()
   447         self.RefreshTitle()
   426         self.RefreshToolBar()
   448         self.RefreshToolBar()
   427 
   449 
       
   450     def GetPageCount(self):
       
   451         if wx.VERSION >= (2, 8, 0):
       
   452             notebook = self.GetNotebook()
       
   453             if notebook is not None:
       
   454                 return notebook.GetPageCount()
       
   455             else:
       
   456                 return 0
       
   457         else:
       
   458             return self.TabsOpened.GetPageCount()
       
   459     
       
   460     def GetPage(self, idx):
       
   461         if wx.VERSION >= (2, 8, 0):
       
   462             notebook = self.GetNotebook()
       
   463             if notebook is not None:
       
   464                 return notebook.GetPage(idx).GetViewer()
       
   465             else:
       
   466                 return None
       
   467         else:
       
   468             return self.TabsOpened.GetPage(idx)
       
   469 
       
   470     def GetPageSelection(self):
       
   471         if wx.VERSION >= (2, 8, 0):
       
   472             notebook = self.GetNotebook()
       
   473             if notebook is not None:
       
   474                 return notebook.GetSelection()
       
   475             else:
       
   476                 return -1
       
   477         else:
       
   478             return self.TabsOpened.GetSelection()
       
   479 
       
   480     def SetPageSelection(self, idx):
       
   481         if wx.VERSION >= (2, 8, 0):
       
   482             notebook = self.GetNotebook()
       
   483             if notebook is not None:
       
   484                 notebook.SetSelection(idx)
       
   485         else:
       
   486             self.TabsOpened.SetSelection(idx)
       
   487 
       
   488     def DeletePage(self, idx):
       
   489         if wx.VERSION >= (2, 8, 0):
       
   490             notebook = self.GetNotebook()
       
   491             if notebook is not None:
       
   492                 notebook.DeletePage(idx)
       
   493         else:
       
   494             self.TabsOpened.DeletePage(idx)
       
   495 
       
   496     def DeleteAllPages(self):
       
   497         if wx.VERSION >= (2, 8, 0):
       
   498             notebook = self.GetNotebook()
       
   499             if notebook is not None:
       
   500                 for idx in xrange(notebook.GetPageCount()):
       
   501                     notebook.DeletePage(idx)
       
   502         else:
       
   503             self.TabsOpened.DeleteAllPages()
       
   504 
       
   505     def SetPageText(self, idx, text):
       
   506         if wx.VERSION >= (2, 8, 0):
       
   507             notebook = self.GetNotebook()
       
   508             if notebook is not None:
       
   509                 return notebook.SetPageText(idx, text)
       
   510         else:
       
   511             return self.TabsOpened.SetPageText(idx, text)
       
   512 
       
   513     def GetPageText(self, idx):
       
   514         if wx.VERSION >= (2, 8, 0):
       
   515             notebook = self.GetNotebook()
       
   516             if notebook is not None:
       
   517                 return notebook.GetPageText(idx)
       
   518             else:
       
   519                 return ""
       
   520         else:
       
   521             return self.TabsOpened.GetPageText(idx)
       
   522 
       
   523     def OnPageClose(self, event):
       
   524         selected = self.GetPageSelection()
       
   525         if selected >= 0:
       
   526             tagname = self.GetPage(selected).GetTagName()
       
   527             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
   528             if self.GetPageCount() > 0:
       
   529                 new_index = min(selected, self.GetPageCount() - 1)
       
   530                 tagname = self.GetPage(new_index).GetTagName()
       
   531                 self.SetPageSelection(new_index)
       
   532                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
       
   533             self.RefreshTitle()
       
   534             self.RefreshFileMenu()
       
   535             self.RefreshEditMenu()
       
   536             self.RefreshToolBar()
       
   537         event.Skip()
       
   538 
   428     def GetCopyBuffer(self):
   539     def GetCopyBuffer(self):
   429         return self.CopyBuffer
   540         return self.CopyBuffer
   430     
   541     
   431     def SetCopyBuffer(self, element):
   542     def SetCopyBuffer(self, element):
   432         self.CopyBuffer = element
   543         self.CopyBuffer = element
   442             self.SetTitle("PLCOpenEditor")
   553             self.SetTitle("PLCOpenEditor")
   443 
   554 
   444     def RefreshFileMenu(self):
   555     def RefreshFileMenu(self):
   445         if self.FileMenu:
   556         if self.FileMenu:
   446             if self.Controler.HasOpenedProject():
   557             if self.Controler.HasOpenedProject():
   447                 if self.TabsOpened.GetPageCount() > 0:
   558                 if self.GetPageCount() > 0:
   448                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, True)
   559                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, True)
   449                 else:
   560                 else:
   450                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False)
   561                     self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False)
   451                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, True)
   562                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, True)
   452                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, True)
   563                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, True)
   469                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, redo)
   580                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, redo)
   470             else:
   581             else:
   471                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, False)
   582                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, False)
   472                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, False)
   583                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, False)
   473             if self.Controler.HasOpenedProject():
   584             if self.Controler.HasOpenedProject():
   474                 if self.TabsOpened.GetPageCount() > 0:
   585                 if self.GetPageCount() > 0:
   475                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True)
   586                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True)
   476                 else:
   587                 else:
   477                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   588                     self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   478                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True)
   589                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True)
   479                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True)
   590                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True)
   480             else:
   591             else:
   481                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   592                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False)
   482                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False)
   593                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False)
   483                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False)
   594                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False)
   484             bodytype = self.Controler.GetCurrentElementEditingBodyType()
       
   485             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True)
   595             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True)
   486             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True)
   596             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True)
   487             if self.CopyBuffer is not None:
   597             if self.CopyBuffer is not None:
   488                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True)
   598                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True)
   489             else:
   599             else:
   490                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, False)
   600                 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, False)
   491 
   601 
   492     def RefreshEditor(self):
   602     def RefreshEditor(self, variablepanel = True):
   493         selected = self.TabsOpened.GetSelection()
   603         selected = self.GetPageSelection()
   494         if selected != -1:
   604         if selected != -1:
   495             self.TabsOpened.GetPage(selected).RefreshView()
   605             window = self.GetPage(selected)
       
   606             window.RefreshView()
       
   607             if variablepanel:
       
   608                 self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   496 
   609 
   497     def ShowProperties(self):
   610     def ShowProperties(self):
   498         old_values = self.Controler.GetProjectProperties()
   611         old_values = self.Controler.GetProjectProperties()
   499         dialog = ProjectDialog(self)
   612         dialog = ProjectDialog(self)
   500         dialog.SetValues(old_values)
   613         dialog.SetValues(old_values)
   506             self.RefreshProjectTree()
   619             self.RefreshProjectTree()
   507         dialog.Destroy()
   620         dialog.Destroy()
   508 
   621 
   509     def OnCloseFrame(self, event):
   622     def OnCloseFrame(self, event):
   510         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
   623         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
   511             self.Controler.CloseAllElements()
   624             self.AUIManager.UnInit()
   512             self._onclose()
   625             self._onclose()
   513             event.Skip()
   626             event.Skip()
   514         elif not self.Controler.ProjectIsSaved():
   627         elif not self.Controler.ProjectIsSaved():
   515             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   628             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   516             answer = dialog.ShowModal()
   629             answer = dialog.ShowModal()
   518             if answer == wx.ID_YES:
   631             if answer == wx.ID_YES:
   519                 self.SaveProject()
   632                 self.SaveProject()
   520                 event.Skip()
   633                 event.Skip()
   521             elif answer == wx.ID_NO:
   634             elif answer == wx.ID_NO:
   522                 self.Controler.Reset()
   635                 self.Controler.Reset()
       
   636                 self.AUIManager.UnInit()
   523                 wx.CallAfter(self.Close)
   637                 wx.CallAfter(self.Close)
   524                 event.Skip()
   638                 event.Skip()
   525             else:
   639             else:
   526                 event.Veto()
   640                 event.Veto()
   527         else:
   641         else:
   550         dialog = wx.FileDialog(self, "Choose a file", directory, "",  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.OPEN)
   664         dialog = wx.FileDialog(self, "Choose a file", directory, "",  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.OPEN)
   551         if dialog.ShowModal() == wx.ID_OK:
   665         if dialog.ShowModal() == wx.ID_OK:
   552             filepath = dialog.GetPath()
   666             filepath = dialog.GetPath()
   553             if os.path.isfile(filepath):
   667             if os.path.isfile(filepath):
   554                 self.Controler.OpenXMLFile(filepath)
   668                 self.Controler.OpenXMLFile(filepath)
   555                 self.TabsOpened.DeleteAllPages()
   669                 self.DeleteAllPages()
   556                 self.RefreshProjectTree()
   670                 self.RefreshProjectTree()
   557             self.RefreshTitle()
   671             self.RefreshTitle()
   558             self.RefreshFileMenu()
   672             self.RefreshFileMenu()
   559             self.RefreshEditMenu()
   673             self.RefreshEditMenu()
   560             self.RefreshToolBar()
   674             self.RefreshToolBar()
   561         dialog.Destroy()
   675         dialog.Destroy()
   562         event.Skip()
   676         event.Skip()
   563 
   677 
   564     def OnCloseTabMenu(self, event):
   678     def OnCloseTabMenu(self, event):
   565         selected = self.TabsOpened.GetSelection()
   679         selected = self.GetPageSelection()
   566         if selected >= 0:
   680         if selected >= 0:
   567             self.Controler.CloseElementEditing()
   681             tagname = self.GetPage(selected).GetTagName()
   568             self.TabsOpened.DeletePage(selected)
   682             self.DeletePage(selected)
   569             if self.TabsOpened.GetPageCount() > 0:
   683             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   570                 self.TabsOpened.SetSelection(min(selected, self.TabsOpened.GetPageCount() - 1))
   684             if self.GetPageCount() > 0:
       
   685                 new_index = min(selected, self.GetPageCount() - 1)
       
   686                 tagname = self.GetPage(new_index).GetTagName()
       
   687                 self.SetPageSelection(new_index)
       
   688                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   571             self.RefreshTitle()
   689             self.RefreshTitle()
   572             self.RefreshFileMenu()
   690             self.RefreshFileMenu()
   573             self.RefreshEditMenu()
   691             self.RefreshEditMenu()
   574             self.RefreshToolBar()
   692             self.RefreshToolBar()
   575         event.Skip()
   693         event.Skip()
   576     
   694     
   577     def OnCloseProjectMenu(self, event):
   695     def OnCloseProjectMenu(self, event):
   578         self.TabsOpened.DeleteAllPages()
   696         self.DeleteAllPages()
       
   697         self.VariablePanelIndexer.RemoveAllPanels()
   579         self.ProjectTree.DeleteAllItems()
   698         self.ProjectTree.DeleteAllItems()
   580         self.Controler.Reset()
   699         self.Controler.Reset()
   581         self.RefreshTitle()
   700         self.RefreshTitle()
   582         self.RefreshFileMenu()
   701         self.RefreshFileMenu()
   583         self.RefreshEditMenu()
   702         self.RefreshEditMenu()
   652     def OnQuitMenu(self, event):
   771     def OnQuitMenu(self, event):
   653         self.Close()
   772         self.Close()
   654         event.Skip()
   773         event.Skip()
   655 
   774 
   656     def ResetCurrentMode(self):
   775     def ResetCurrentMode(self):
   657         selected = self.TabsOpened.GetSelection()
   776         selected = self.GetPageSelection()
   658         if selected != -1:
   777         if selected != -1:
   659             window = self.TabsOpened.GetPage(selected)
   778             window = self.GetPage(selected)
   660             window.SetMode(MODE_SELECTION)
   779             window.SetMode(MODE_SELECTION)
   661         if wx.VERSION < (2, 8, 0):
   780         if wx.VERSION < (2, 8, 0):
   662             self.ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
   781             ToolBar = self.ToolBar
   663         else:
   782         else:
   664             self.Panes["ToolBar"].ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
   783             ToolBar = self.Panes["ToolBar"]
   665 
   784         if ToolBar:
       
   785             ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True)
       
   786         
   666     def ResetToolToggle(self, id):
   787     def ResetToolToggle(self, id):
   667         if wx.VERSION < (2, 8, 0):
   788         if wx.VERSION < (2, 8, 0):
   668             tool = self.ToolBar.FindById(id)
   789             tool = self.ToolBar.FindById(id)
   669         else:
   790         else:
   670             tool = self.Panes["ToolBar"].FindById(id)
   791             tool = self.Panes["ToolBar"].FindById(id)
   671         tool.SetToggle(False)
   792         tool.SetToggle(False)
   672 
   793 
   673     def OnSelectionTool(self, event):
   794     def OnSelectionTool(self, event):
   674         selected = self.TabsOpened.GetSelection()
   795         self.GetPageSelection()
   675         if selected != -1:
   796         if selected != -1:
   676             self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
   797             self.GetPage(selected).SetMode(MODE_SELECTION)
   677         event.Skip()
   798         event.Skip()
   678     
   799     
   679     def OnCommentTool(self, event):
   800     def OnCommentTool(self, event):
   680         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT)
   801         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT)
   681         selected = self.TabsOpened.GetSelection()
   802         selected = self.GetPageSelection()
   682         if selected != -1:
   803         if selected != -1:
   683             self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
   804             self.GetPage(selected).SetMode(MODE_COMMENT)
   684         event.Skip()
   805         event.Skip()
   685     
   806     
   686     def OnVariableTool(self, event):
   807     def OnVariableTool(self, event):
   687         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE)
   808         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE)
   688         selected = self.TabsOpened.GetSelection()
   809         selected = self.GetPageSelection()
   689         if selected != -1:
   810         if selected != -1:
   690             self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
   811             self.GetPage(selected).SetMode(MODE_VARIABLE)
   691         event.Skip()
   812         event.Skip()
   692     
   813     
   693     def OnBlockTool(self, event):
   814     def OnBlockTool(self, event):
   694         selected = self.TabsOpened.GetSelection()
   815         selected = self.GetPageSelection()
   695         if selected != -1:
   816         if selected != -1:
   696             self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
   817             self.GetPage(selected).SetMode(MODE_BLOCK)
   697         event.Skip()
   818         event.Skip()
   698         
   819         
   699     def OnConnectionTool(self, event):
   820     def OnConnectionTool(self, event):
   700         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION)
   821         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION)
   701         selected = self.TabsOpened.GetSelection()
   822         selected = self.GetPageSelection()
   702         if selected != -1:
   823         if selected != -1:
   703             self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
   824             self.GetPage(selected).SetMode(MODE_CONNECTION)
   704         event.Skip()
   825         event.Skip()
   705 
   826 
   706     def OnWireTool(self, event):
   827     def OnWireTool(self, event):
   707         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARWIRE)
   828         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARWIRE)
   708         selected = self.TabsOpened.GetSelection()
   829         selected = self.GetPageSelection()
   709         if selected != -1:
   830         if selected != -1:
   710             self.TabsOpened.GetPage(selected).SetMode(MODE_WIRE)
   831             self.GetPage(selected).SetMode(MODE_WIRE)
   711         event.Skip()
   832         event.Skip()
   712 
   833 
   713     def OnPowerRailTool(self, event):
   834     def OnPowerRailTool(self, event):
   714         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL)
   835         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL)
   715         selected = self.TabsOpened.GetSelection()
   836         selected = self.GetPageSelection()
   716         if selected != -1:
   837         if selected != -1:
   717             self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
   838             self.GetPage(selected).SetMode(MODE_POWERRAIL)
   718         event.Skip()
   839         event.Skip()
   719 
   840 
   720     def OnRungTool(self, event):
   841     def OnRungTool(self, event):
   721         selected = self.TabsOpened.GetSelection()
   842         selected = self.GetPageSelection()
   722         if selected != -1:
   843         if selected != -1:
   723             self.TabsOpened.GetPage(selected).Viewer.AddLadderRung()
   844             self.GetPage(selected).AddLadderRung()
   724         event.Skip()
   845         event.Skip()
   725     
   846     
   726     def OnCoilTool(self, event):
   847     def OnCoilTool(self, event):
   727         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL)
   848         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL)
   728         selected = self.TabsOpened.GetSelection()
   849         selected = self.GetPageSelection()
   729         if selected != -1:
   850         if selected != -1:
   730             self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
   851             self.GetPage(selected).SetMode(MODE_COIL)
   731         event.Skip()
   852         event.Skip()
   732     
   853     
   733     def OnContactTool(self, event):
   854     def OnContactTool(self, event):
   734         if self.DrawingMode == FREEDRAWING_MODE:
   855         if self.DrawingMode == FREEDRAWING_MODE:
   735             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT)
   856             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT)
   736         selected = self.TabsOpened.GetSelection()
   857         selected = self.GetPageSelection()
   737         if selected != -1:
   858         if selected != -1:
   738             if self.DrawingMode == FREEDRAWING_MODE:
   859             if self.DrawingMode == FREEDRAWING_MODE:
   739                 self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
   860                 self.GetPage(selected).SetMode(MODE_CONTACT)
   740             else:
   861             else:
   741                 self.TabsOpened.GetPage(selected).Viewer.AddLadderContact()
   862                 self.GetPage(selected).AddLadderContact()
   742         event.Skip()
   863         event.Skip()
   743     
   864     
   744     def OnBranchTool(self, event): 
   865     def OnBranchTool(self, event): 
   745         selected = self.TabsOpened.GetSelection()
   866         selected = self.GetPageSelection()
   746         if selected != -1:
   867         if selected != -1:
   747             self.TabsOpened.GetPage(selected).Viewer.AddLadderBranch()
   868             self.GetPage(selected).AddLadderBranch()
   748         event.Skip()    
   869         event.Skip()    
   749     
   870     
   750     def OnInitialStepTool(self, event):
   871     def OnInitialStepTool(self, event):
   751         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP)
   872         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP)
   752         selected = self.TabsOpened.GetSelection()
   873         selected = self.GetPageSelection()
   753         if selected != -1:
   874         if selected != -1:
   754             self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
   875             self.GetPage(selected).SetMode(MODE_INITIALSTEP)
   755         event.Skip()
   876         event.Skip()
   756     
   877     
   757     def OnStepTool(self, event):
   878     def OnStepTool(self, event):
   758         if self.GetDrawingMode() == FREEDRAWING_MODE:
   879         if self.GetDrawingMode() == FREEDRAWING_MODE:
   759             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP)
   880             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP)
   760         selected = self.TabsOpened.GetSelection()
   881         selected = self.GetPageSelection()
   761         if selected != -1:
   882         if selected != -1:
   762             if self.GetDrawingMode() == FREEDRAWING_MODE:
   883             if self.GetDrawingMode() == FREEDRAWING_MODE:
   763                 self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
   884                 self.GetPage(selected).SetMode(MODE_STEP)
   764             else:
   885             else:
   765                 self.TabsOpened.GetPage(selected).Viewer.AddStep()
   886                 self.GetPage(selected).AddStep()
   766         event.Skip()
   887         event.Skip()
   767 
   888 
   768     def OnActionBlockTool(self, event):
   889     def OnActionBlockTool(self, event):
   769         if self.GetDrawingMode() == FREEDRAWING_MODE:
   890         if self.GetDrawingMode() == FREEDRAWING_MODE:
   770             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK)
   891             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK)
   771         selected = self.TabsOpened.GetSelection()
   892         selected = self.GetPageSelection()
   772         if selected != -1:
   893         if selected != -1:
   773             if self.GetDrawingMode() == FREEDRAWING_MODE:
   894             if self.GetDrawingMode() == FREEDRAWING_MODE:
   774                 self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
   895                 self.GetPage(selected).SetMode(MODE_ACTION)
   775             else:
   896             else:
   776                 self.TabsOpened.GetPage(selected).Viewer.AddStepAction()
   897                 self.GetPage(selected).AddStepAction()
   777         event.Skip()
   898         event.Skip()
   778 
   899 
   779     def OnTransitionTool(self, event):
   900     def OnTransitionTool(self, event):
   780         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION)
   901         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION)
   781         selected = self.TabsOpened.GetSelection()
   902         selected = self.GetPageSelection()
   782         if selected != -1:
   903         if selected != -1:
   783             self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
   904             self.GetPage(selected).SetMode(MODE_TRANSITION)
   784         event.Skip()
   905         event.Skip()
   785 
   906 
   786     def OnDivergenceTool(self, event):
   907     def OnDivergenceTool(self, event):
   787         if self.GetDrawingMode() == FREEDRAWING_MODE:
   908         if self.GetDrawingMode() == FREEDRAWING_MODE:
   788             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE)
   909             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE)
   789         selected = self.TabsOpened.GetSelection()
   910         selected = self.GetPageSelection()
   790         if selected != -1:
   911         if selected != -1:
   791             if self.GetDrawingMode() == FREEDRAWING_MODE:
   912             if self.GetDrawingMode() == FREEDRAWING_MODE:
   792                 self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
   913                 self.GetPage(selected).SetMode(MODE_DIVERGENCE)
   793             else:
   914             else:
   794                 self.TabsOpened.GetPage(selected).Viewer.AddDivergence()
   915                 self.GetPage(selected).AddDivergence()
   795         event.Skip()
   916         event.Skip()
   796     
   917     
   797     def OnJumpTool(self, event):
   918     def OnJumpTool(self, event):
   798         if self.GetDrawingMode() == FREEDRAWING_MODE:
   919         if self.GetDrawingMode() == FREEDRAWING_MODE:
   799             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP)
   920             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP)
   800         selected = self.TabsOpened.GetSelection()
   921         selected = self.GetPageSelection()
   801         if selected != -1:
   922         if selected != -1:
   802             if self.GetDrawingMode() == FREEDRAWING_MODE:
   923             if self.GetDrawingMode() == FREEDRAWING_MODE:
   803                 self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
   924                 self.GetPage(selected).SetMode(MODE_JUMP)
   804             else:
   925             else:
   805                 self.TabsOpened.GetPage(selected).Viewer.AddJump()
   926                 self.GetPage(selected).AddJump()
   806         event.Skip()
   927         event.Skip()
   807         
   928         
   808     def OnPouSelectedChanged(self, event):
   929     def OnPouSelectedChanged(self, event):
   809         old_selected = self.TabsOpened.GetSelection()
   930         if wx.VERSION < (2, 8, 0) or event.GetActive():
   810         if old_selected >= 0:
   931             old_selected = self.GetPageSelection()
   811             self.TabsOpened.GetPage(old_selected).ResetBuffer()
   932             if old_selected >= 0:
   812         selected = event.GetSelection()
   933                 self.GetPage(old_selected).ResetBuffer()
   813         if selected >= 0:
   934             if wx.VERSION >= (2, 8, 0):
   814             self.Controler.RefreshCurrentElementEditing(selected)
   935                 window = event.GetEventObject().GetViewer()
   815             found = False
   936             else:
   816             name = self.TabsOpened.GetPageText(selected)
   937                 selected = event.GetSelection()
   817             if self.ProjectTree:
   938                 if selected >= 0:
   818                 root = self.ProjectTree.GetRootItem()
   939                     window = self.GetPage(selected)
   819                 if wx.VERSION >= (2, 6, 0):
       
   820                     item, root_cookie = self.ProjectTree.GetFirstChild(root)
       
   821                 else:
   940                 else:
   822                     item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
   941                     window = None
   823                 while item.IsOk() and not found:
   942             if window:
   824                     if self.ProjectTree.GetItemText(item) == name:
   943 ##                found = False
   825                         self.ProjectTree.SelectItem(item)
   944 ##                words = window.GetTagName().split("::")
   826                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
   945 ##                if self.ProjectTree:
   827             self.TabsOpened.GetPage(selected).RefreshView()
   946 ##                    root = self.ProjectTree.GetRootItem()
   828             self.RefreshFileMenu()
   947 ##                    if wx.VERSION >= (2, 6, 0):
   829             self.RefreshEditMenu()
   948 ##                        item, root_cookie = self.ProjectTree.GetFirstChild(root)
   830             self.RefreshToolBar()
   949 ##                    else:
       
   950 ##                        item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
       
   951 ##                    while item.IsOk() and not found:
       
   952 ##                        if self.ProjectTree.GetItemText(item) == words[1]:
       
   953 ##                            self.ProjectTree.SelectItem(item)
       
   954 ##                        item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
       
   955                 window.RefreshView()
       
   956                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
       
   957                 self.RefreshFileMenu()
       
   958                 self.RefreshEditMenu()
       
   959                 self.RefreshToolBar()
   831         event.Skip()
   960         event.Skip()
   832 
   961 
   833     def OnProjectTreeBeginDrag(self, event):
   962     def OnProjectTreeBeginDrag(self, event):
   834         item = event.GetItem()
   963         item = event.GetItem()
   835         if self.ProjectTree.GetPyData(item) == ITEM_POU:
   964         if self.ProjectTree.GetPyData(item) == ITEM_POU:
   840                 dragSource = wx.DropSource(self.ProjectTree)
   969                 dragSource = wx.DropSource(self.ProjectTree)
   841                 dragSource.SetData(data)
   970                 dragSource.SetData(data)
   842                 dragSource.DoDragDrop()
   971                 dragSource.DoDragDrop()
   843 
   972 
   844     def RefreshEditorNames(self, item_type, old_name, new_name):
   973     def RefreshEditorNames(self, item_type, old_name, new_name):
   845         for i in xrange(self.TabsOpened.GetPageCount()):
   974         for i in xrange(self.GetPageCount()):
   846             editor = self.TabsOpened.GetPage(i)
   975             editor = self.GetPage(i)
   847             editor.RefreshName(item_type, old_name, new_name)
   976             editor.RefreshName(item_type, old_name, new_name)
   848 
   977 
   849     def OnProjectTreeItemEndEdit(self, event):
   978     def OnProjectTreeItemEndEdit(self, event):
   850         message = None
   979         message = None
   851         abort = False
   980         abort = False
   871                             abort = True
  1000                             abort = True
   872                         messageDialog.Destroy()
  1001                         messageDialog.Destroy()
   873                     if not abort:
  1002                     if not abort:
   874                         self.Controler.ChangePouName(old_name, new_name)
  1003                         self.Controler.ChangePouName(old_name, new_name)
   875                         self.RefreshEditorNames(itemtype, old_name, new_name)
  1004                         self.RefreshEditorNames(itemtype, old_name, new_name)
   876                         self.RefreshTabsOpenedTitles()
  1005                         self.RefreshPageTitles()
   877                 elif itemtype == ITEM_TRANSITION:
  1006                 elif itemtype == ITEM_TRANSITION:
   878                     parent = self.ProjectTree.GetItemParent(item)
  1007                     parent = self.ProjectTree.GetItemParent(item)
   879                     parent_type = self.ProjectTree.GetPyData(parent)
  1008                     parent_type = self.ProjectTree.GetPyData(parent)
   880                     while parent_type != ITEM_POU:
  1009                     while parent_type != ITEM_POU:
   881                         parent = self.ProjectTree.GetItemParent(parent)
  1010                         parent = self.ProjectTree.GetItemParent(parent)
   886                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1015                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
   887                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1016                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
   888                     else:
  1017                     else:
   889                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1018                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
   890                         self.RefreshEditorNames(itemtype, old_name, new_name)
  1019                         self.RefreshEditorNames(itemtype, old_name, new_name)
   891                         self.RefreshTabsOpenedTitles()
  1020                         self.RefreshPageTitles()
   892                 elif itemtype == ITEM_ACTION:
  1021                 elif itemtype == ITEM_ACTION:
   893                     parent = self.ProjectTree.GetItemParent(item)
  1022                     parent = self.ProjectTree.GetItemParent(item)
   894                     parent_type = self.ProjectTree.GetPyData(parent)
  1023                     parent_type = self.ProjectTree.GetPyData(parent)
   895                     while parent_type != ITEM_POU:
  1024                     while parent_type != ITEM_POU:
   896                         parent = self.ProjectTree.GetItemParent(parent)
  1025                         parent = self.ProjectTree.GetItemParent(parent)
   901                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1030                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
   902                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1031                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
   903                     else:
  1032                     else:
   904                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1033                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
   905                         self.RefreshEditorNames(itemtype, old_name, new_name)
  1034                         self.RefreshEditorNames(itemtype, old_name, new_name)
   906                         self.RefreshTabsOpenedTitles()
  1035                         self.RefreshPageTitles()
   907                 elif itemtype == ITEM_CONFIGURATION:
  1036                 elif itemtype == ITEM_CONFIGURATION:
   908                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1037                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
   909                         message = "\"%s\" config already exists!"%new_name
  1038                         message = "\"%s\" config already exists!"%new_name
   910                         abort = True
  1039                         abort = True
   911                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1040                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
   919                             abort = True
  1048                             abort = True
   920                         messageDialog.Destroy()
  1049                         messageDialog.Destroy()
   921                     if not abort:
  1050                     if not abort:
   922                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1051                         self.Controler.ChangeConfigurationName(old_name, new_name)
   923                         self.RefreshEditorNames(itemtype, old_name, new_name)
  1052                         self.RefreshEditorNames(itemtype, old_name, new_name)
   924                         self.RefreshTabsOpenedTitles()
  1053                         self.RefreshPageTitles()
   925                 elif itemtype == ITEM_RESOURCE:
  1054                 elif itemtype == ITEM_RESOURCE:
   926                     parent = self.ProjectTree.GetItemParent(item)
  1055                     parent = self.ProjectTree.GetItemParent(item)
   927                     parent_type = self.ProjectTree.GetPyData(parent)
  1056                     parent_type = self.ProjectTree.GetPyData(parent)
   928                     while parent_type != ITEM_CONFIGURATION:
  1057                     while parent_type != ITEM_CONFIGURATION:
   929                         parent = self.ProjectTree.GetItemParent(parent)
  1058                         parent = self.ProjectTree.GetItemParent(parent)
   943                             abort = True
  1072                             abort = True
   944                         messageDialog.Destroy()
  1073                         messageDialog.Destroy()
   945                     if not abort:
  1074                     if not abort:
   946                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
  1075                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
   947                         self.RefreshEditorNames(itemtype, old_name, new_name)
  1076                         self.RefreshEditorNames(itemtype, old_name, new_name)
   948                         self.RefreshTabsOpenedTitles()
  1077                         self.RefreshPageTitles()
   949             if message or abort:
  1078             if message or abort:
   950                 if message:
  1079                 if message:
   951                     messageDialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
  1080                     messageDialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
   952                     messageDialog.ShowModal()
  1081                     messageDialog.ShowModal()
   953                     messageDialog.Destroy()
  1082                     messageDialog.Destroy()
   954                 item = event.GetItem()
  1083                 item = event.GetItem()
   955                 wx.CallAfter(self.ProjectTree.EditLabel, item)
  1084                 wx.CallAfter(self.ProjectTree.EditLabel, item)
   956                 event.Veto()
  1085                 event.Veto()
   957             else:
  1086             else:
   958                 wx.CallAfter(self.RefreshProjectTree)
  1087                 wx.CallAfter(self.RefreshProjectTree)
   959                 window = self.TabsOpened.GetCurrentPage()
  1088                 selected = self.GetPageSelection()
   960                 if window:
  1089                 if selected != -1:
   961                     window.RefreshView()
  1090                     self.GetPage(selected).RefreshView()
   962                 event.Skip()
  1091                 event.Skip()
   963 
  1092 
   964     def OnProjectTreeItemBeginEdit(self, event):
  1093     def OnProjectTreeItemBeginEdit(self, event):
   965         selected = event.GetItem()
  1094         selected = event.GetItem()
   966         if self.ProjectTree.GetPyData(selected) == ITEM_UNEDITABLE:
  1095         if self.ProjectTree.GetPyData(selected) == ITEM_UNEDITABLE:
   976             self.ProjectTree.Expand(selected)
  1105             self.ProjectTree.Expand(selected)
   977         name = self.ProjectTree.GetItemText(selected)
  1106         name = self.ProjectTree.GetItemText(selected)
   978         data = self.ProjectTree.GetPyData(selected)
  1107         data = self.ProjectTree.GetPyData(selected)
   979         if name == "Properties":
  1108         if name == "Properties":
   980             self.ShowProperties()
  1109             self.ShowProperties()
   981         if data in [ITEM_POU, ITEM_CONFIGURATION]:
  1110         if data == ITEM_POU:
   982             self.EditProjectElement(data, name)
  1111             self.EditProjectElement(data, self.Controler.ComputePouName(name))
       
  1112         elif data == ITEM_CONFIGURATION:
       
  1113             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
   983         elif data == ITEM_RESOURCE:
  1114         elif data == ITEM_RESOURCE:
   984             item = self.ProjectTree.GetItemParent(selected)
  1115             item = self.ProjectTree.GetItemParent(selected)
   985             item_type = self.ProjectTree.GetPyData(item)
  1116             item_type = self.ProjectTree.GetPyData(item)
   986             while item_type != ITEM_CONFIGURATION:
  1117             while item_type != ITEM_CONFIGURATION:
   987                 item = self.ProjectTree.GetItemParent(item)
  1118                 item = self.ProjectTree.GetItemParent(item)
   988                 item_type = self.ProjectTree.GetPyData(item)
  1119                 item_type = self.ProjectTree.GetPyData(item)
   989             config_name = self.ProjectTree.GetItemText(item)
  1120             config_name = self.ProjectTree.GetItemText(item)
   990             self.EditProjectElement(data, "%s::%s"%(config_name, name))
  1121             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
   991         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1122         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
   992             item = self.ProjectTree.GetItemParent(selected)
  1123             item = self.ProjectTree.GetItemParent(selected)
   993             item_type = self.ProjectTree.GetPyData(item)
  1124             item_type = self.ProjectTree.GetPyData(item)
   994             while item_type != ITEM_POU:
  1125             while item_type != ITEM_POU:
   995                 item = self.ProjectTree.GetItemParent(item)
  1126                 item = self.ProjectTree.GetItemParent(item)
   996                 item_type = self.ProjectTree.GetPyData(item)
  1127                 item_type = self.ProjectTree.GetPyData(item)
   997             pou_name = self.ProjectTree.GetItemText(item)
  1128             pou_name = self.ProjectTree.GetItemText(item)
   998             self.EditProjectElement(data, "%s::%s"%(pou_name, name))
  1129             if data == ITEM_TRANSITION:
       
  1130                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
       
  1131             elif data == ITEM_ACTION:
       
  1132                 tagname = self.Controler.ComputePouActionName(pou_name, name)
       
  1133             self.EditProjectElement(data, tagname)
   999     
  1134     
  1000     def OnProjectTreeItemSelected(self, event):
  1135     def OnProjectTreeItemSelected(self, event):
  1001         selected = event.GetItem()
  1136         selected = event.GetItem()
  1002         name = self.ProjectTree.GetItemText(selected)
  1137         name = self.ProjectTree.GetItemText(selected)
  1003         data = self.ProjectTree.GetPyData(selected)
  1138         data = self.ProjectTree.GetPyData(selected)
  1004         if data in [ITEM_POU, ITEM_CONFIGURATION]:
  1139         if data == ITEM_POU:
  1005             self.EditProjectElement(data, name, True)
  1140             self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
       
  1141         elif data == ITEM_CONFIGURATION:
       
  1142             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1006         elif data == ITEM_RESOURCE:
  1143         elif data == ITEM_RESOURCE:
  1007             item = self.ProjectTree.GetItemParent(selected)
  1144             item = self.ProjectTree.GetItemParent(selected)
  1008             item_type = self.ProjectTree.GetPyData(item)
  1145             item_type = self.ProjectTree.GetPyData(item)
  1009             while item_type != ITEM_CONFIGURATION:
  1146             while item_type != ITEM_CONFIGURATION:
  1010                 item = self.ProjectTree.GetItemParent(item)
  1147                 item = self.ProjectTree.GetItemParent(item)
  1011                 item_type = self.ProjectTree.GetPyData(item)
  1148                 item_type = self.ProjectTree.GetPyData(item)
  1012             config_name = self.ProjectTree.GetItemText(item)
  1149             config_name = self.ProjectTree.GetItemText(item)
  1013             self.EditProjectElement(data, "%s::%s"%(config_name, name), True)
  1150             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True)
  1014         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1151         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1015             item = self.ProjectTree.GetItemParent(selected)
  1152             item = self.ProjectTree.GetItemParent(selected)
  1016             item_type = self.ProjectTree.GetPyData(item)
  1153             item_type = self.ProjectTree.GetPyData(item)
  1017             while item_type != ITEM_POU:
  1154             while item_type != ITEM_POU:
  1018                 item = self.ProjectTree.GetItemParent(item)
  1155                 item = self.ProjectTree.GetItemParent(item)
  1019                 item_type = self.ProjectTree.GetPyData(item)
  1156                 item_type = self.ProjectTree.GetPyData(item)
  1020             pou_name = self.ProjectTree.GetItemText(item)
  1157             pou_name = self.ProjectTree.GetItemText(item)
  1021             self.EditProjectElement(data, "%s::%s"%(pou_name, name), True)
  1158             if data == ITEM_TRANSITION:
  1022         event.Skip()
  1159                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1023     
  1160             elif data == ITEM_ACTION:
  1024     def EditProjectElement(self, elementtype, elementname, onlyopened = False):
  1161                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1025         idx = None
  1162             self.EditProjectElement(data, tagname, True)
  1026         names = elementname.split("::")
  1163         event.Skip()
  1027         if elementtype == ITEM_CONFIGURATION and len(names) == 1:
  1164     
  1028             if not onlyopened:
  1165     def IsOpened(self, tagname):
  1029                 idx = self.Controler.OpenConfigurationEditing(*names)
  1166         for idx in xrange(self.GetPageCount()):
  1030                 if idx is not None:
  1167             if self.GetPage(idx).IsViewing(tagname):
  1031                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "config", config_name = names[0])
  1168                 return idx
  1032                     new_window.SetIndex(idx)
  1169         return None
       
  1170     
       
  1171     def EditProjectElement(self, elementtype, tagname, onlyopened = False):
       
  1172         openedidx = self.IsOpened(tagname)
       
  1173         if openedidx is not None:
       
  1174             old_selected = self.GetPageSelection()
       
  1175             if old_selected != openedidx:
       
  1176                 if old_selected >= 0:
       
  1177                     self.GetPage(old_selected).ResetBuffer()
       
  1178                 self.SetPageSelection(openedidx)
       
  1179             self.GetPage(openedidx).RefreshView()
       
  1180             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
       
  1181             self.RefreshPageTitles()
       
  1182             self.RefreshFileMenu()
       
  1183             self.RefreshEditMenu()
       
  1184             self.RefreshToolBar()
       
  1185         elif not onlyopened:
       
  1186             if wx.VERSION >= (2, 8, 0):
       
  1187                 if elementtype == ITEM_CONFIGURATION:
       
  1188                     new_window = MDIConfigurationEditor(self, tagname, self, self.Controler)
       
  1189                     self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
       
  1190                 elif elementtype == ITEM_RESOURCE:
       
  1191                     new_window = MDIResourceEditor(self, tagname, self, self.Controler)
       
  1192                     self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
       
  1193                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
  1194                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
       
  1195                     if bodytype == "FBD":
       
  1196                         new_window = MDIViewer(self, tagname, self, self.Controler)
       
  1197                     elif bodytype == "LD":
       
  1198                         new_window = LD_MDIViewer(self, tagname, self, self.Controler)
       
  1199                     elif bodytype == "SFC":
       
  1200                         new_window = SFC_MDIViewer(self, tagname, self, self.Controler)
       
  1201                     else:
       
  1202                         new_window = TextMDIViewer(self, tagname, self, self.Controler)
       
  1203                         viewer = new_window.GetViewer()
       
  1204                         viewer.SetTextSyntax(elementtype)
       
  1205                         if bodytype == "IL":
       
  1206                             viewer.SetKeywords(IL_KEYWORDS)
       
  1207                         else:
       
  1208                             viewer.SetKeywords(ST_KEYWORDS)
       
  1209                 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged)
       
  1210                 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose)
       
  1211             else:
       
  1212                 if elementtype == ITEM_CONFIGURATION:
       
  1213                     new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
  1033                     self.TabsOpened.AddPage(new_window, "")
  1214                     self.TabsOpened.AddPage(new_window, "")
  1034             if idx is None:
  1215                     self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
  1035                 idx = self.Controler.ChangeConfigurationEditing(*names)
  1216                 elif elementtype == ITEM_RESOURCE:
  1036         elif elementtype == ITEM_RESOURCE and len(names) == 2:
  1217                     new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1037             if not onlyopened:
       
  1038                 idx = self.Controler.OpenConfigurationResourceEditing(*names)
       
  1039                 if idx is not None:
       
  1040                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "resource", config_name = names[0], resource_name = names[1])
       
  1041                     new_window.SetIndex(idx)
       
  1042                     self.TabsOpened.AddPage(new_window, "")
  1218                     self.TabsOpened.AddPage(new_window, "")
  1043             if idx is None:
  1219                     self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1044                 idx = self.Controler.ChangeConfigurationResourceEditing(*names)
  1220                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1045         elif elementtype == ITEM_POU and len(names) == 1:
  1221                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1046             if not onlyopened:
  1222                     if bodytype == "FBD":
  1047                 idx = self.Controler.OpenPouEditing(*names)
  1223                         new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1048                 if idx != None:
  1224                     elif bodytype == "LD":
  1049                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, self.Controler.GetPouType(names[0]), pou_name = names[0])
  1225                         new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1050                     new_window.SetIndex(idx)
  1226                     elif bodytype == "SFC":
       
  1227                         new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1228                     else:
       
  1229                         new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
       
  1230                         new_window.SetTextSyntax(elementtype)
       
  1231                         if bodytype == "IL":
       
  1232                             new_window.SetKeywords(IL_KEYWORDS)
       
  1233                         else:
       
  1234                             new_window.SetKeywords(ST_KEYWORDS)
  1051                     self.TabsOpened.AddPage(new_window, "")
  1235                     self.TabsOpened.AddPage(new_window, "")
  1052             if idx is None:
  1236             if elementtype == ITEM_POU:
  1053                 idx = self.Controler.ChangePouEditing(*names)
  1237                 words = tagname.split("::")
  1054         elif elementtype == ITEM_TRANSITION and len(names) == 2:
  1238                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1055             if not onlyopened:
  1239             elif elementtype == ITEM_TRANSITION:
  1056                 idx = self.Controler.OpenPouTransitionEditing(*names)
  1240                 self.VariablePanelIndexer.AddVariablePanel(tagname, "transition")
  1057                 if idx is not None:
  1241             elif elementtype == ITEM_TRANSITION:
  1058                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "transition", pou_name = names[0], transition_name = names[1])
  1242                 self.VariablePanelIndexer.AddVariablePanel(tagname, "action")
  1059                     new_window.SetIndex(idx)
  1243             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1060                     self.TabsOpened.AddPage(new_window, "")
  1244             openedidx = self.IsOpened(tagname)
  1061             if idx is None:
  1245             old_selected = self.GetPageSelection()
  1062                 idx = self.Controler.ChangePouTransitionEditing(*names)
  1246             if old_selected != openedidx:
  1063         elif elementtype == ITEM_ACTION and len(names) == 2:
  1247                 if old_selected >= 0:
  1064             if not onlyopened:
  1248                     self.GetPage(old_selected).ResetBuffer()
  1065                 idx = self.Controler.OpenPouActionEditing(*names)
  1249             for i in xrange(self.GetPageCount()):
  1066                 if idx is not None:
  1250                 window = self.GetPage(i)
  1067                     new_window = PouEditorPanel(self.TabsOpened, self, self.Controler, "action", pou_name = names[0], action_name = names[1])
  1251                 if window.GetTagName() == tagname:
  1068                     new_window.SetIndex(idx)
  1252                     self.SetPageSelection(i)
  1069                     self.TabsOpened.AddPage(new_window, "")
       
  1070             if idx is None:
       
  1071                 idx = self.Controler.ChangePouActionEditing(*names)
       
  1072         if idx != None:
       
  1073             old_selected = self.TabsOpened.GetSelection()
       
  1074             if old_selected >= 0:
       
  1075                 self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1076             for i in xrange(self.TabsOpened.GetPageCount()):
       
  1077                 window = self.TabsOpened.GetPage(i)
       
  1078                 if window.GetIndex() == idx:
       
  1079                     self.TabsOpened.SetSelection(i)
       
  1080                     window.RefreshView()
  1253                     window.RefreshView()
  1081                     self.RefreshTabsOpenedTitles()
  1254                     self.RefreshPageTitles()
  1082                     self.RefreshFileMenu()
  1255                     self.RefreshFileMenu()
  1083                     self.RefreshEditMenu()
  1256                     self.RefreshEditMenu()
  1084                     self.RefreshToolBar()
  1257                     self.RefreshToolBar()
  1085                     return
       
  1086     
  1258     
  1087     def OnProjectTreeRightUp(self, event):
  1259     def OnProjectTreeRightUp(self, event):
  1088         cursor_pos = event.GetPosition()
  1260         cursor_pos = event.GetPosition()
  1089         selected = self.ProjectTree.GetSelection()
  1261         selected = self.ProjectTree.GetSelection()
  1090         if self.ProjectTree.GetPyData(selected) == ITEM_POU:
  1262         if self.ProjectTree.GetPyData(selected) == ITEM_POU:
  1135             
  1307             
  1136             if wx.VERSION < (2, 8, 0):
  1308             if wx.VERSION < (2, 8, 0):
  1137                 ToolBar = self.ToolBar
  1309                 ToolBar = self.ToolBar
  1138             else:
  1310             else:
  1139                 ToolBar = self.Panes["ToolBar"]
  1311                 ToolBar = self.Panes["ToolBar"]
  1140             ToolBar.DeleteTool(item)
  1312             if ToolBar:
  1141             ToolBar.Realize()
  1313                 ToolBar.DeleteTool(item)
  1142             if wx.VERSION >= (2, 8, 0):
  1314                 ToolBar.Realize()
  1143                 self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1315                 if wx.VERSION >= (2, 8, 0):
  1144                 self.AUIManager.Update()
  1316                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  1317                     self.AUIManager.Update()
  1145 
  1318 
  1146     def RefreshToolBar(self):
  1319     def RefreshToolBar(self):
  1147         language = self.Controler.GetCurrentElementEditingBodyType()
  1320         selected = self.GetPageSelection()
  1148         if language and language != self.CurrentLanguage:
  1321         if selected != -1:
       
  1322             language = self.Controler.GetEditedElementBodyType(self.GetPage(selected).GetTagName())
       
  1323         else:
       
  1324             language = None
       
  1325         if language is not None and language != self.CurrentLanguage:
  1149             self.ResetToolBar()
  1326             self.ResetToolBar()
  1150             self.CurrentLanguage = language
  1327             self.CurrentLanguage = language
  1151             self.CurrentToolBar = []
  1328             self.CurrentToolBar = []
  1152             if wx.VERSION < (2, 8, 0):
  1329             if wx.VERSION < (2, 8, 0):
  1153                 ToolBar = self.ToolBar
  1330                 ToolBar = self.ToolBar
  1154             else:
  1331             else:
  1155                 ToolBar = self.Panes["ToolBar"]
  1332                 ToolBar = self.Panes["ToolBar"]
  1156             for radio, modes, id, method, picture, help in ToolBarItems[language]:
  1333             if ToolBar:
  1157                 if modes & self.DrawingMode:
  1334                 for radio, modes, id, method, picture, help in ToolBarItems[language]:
  1158                     if radio or self.DrawingMode == FREEDRAWING_MODE:
  1335                     if modes & self.DrawingMode:
  1159                         ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
  1336                         if radio or self.DrawingMode == FREEDRAWING_MODE:
  1160                     else:
  1337                             ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
  1161                         ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
  1338                         else:
  1162                     self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
  1339                             ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
  1163                     self.CurrentToolBar.append(id)
  1340                         self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
  1164             ToolBar.Realize()
  1341                         self.CurrentToolBar.append(id)
  1165             if wx.VERSION >= (2, 8, 0):
  1342                 ToolBar.Realize()
  1166                 self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1343                 if wx.VERSION >= (2, 8, 0):
  1167                 self.AUIManager.Update()
  1344                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  1345                     self.AUIManager.Update()
  1168         elif not language:
  1346         elif not language:
  1169             self.ResetToolBar()
  1347             self.ResetToolBar()
  1170             self.CurrentLanguage = language
  1348             self.CurrentLanguage = language
  1171         self.ResetCurrentMode()
  1349         self.ResetCurrentMode()
  1172 
  1350 
  1173     def RefreshTabsOpenedTitles(self):
  1351     def RefreshPageTitles(self):
  1174         pous = self.Controler.GetElementsOpenedNames()
  1352         for idx in xrange(self.GetPageCount()):
  1175         for i, pou in enumerate(pous):
  1353             window = self.GetPage(idx)
  1176             self.TabsOpened.SetPageText(i, pou)
  1354             words = window.GetTagName().split("::")
       
  1355             self.SetPageText(idx, "-".join(words[1:]))
  1177     
  1356     
  1178     def OnRefreshMenu(self, event):
  1357     def OnRefreshMenu(self, event):
  1179         selected = self.TabsOpened.GetSelection()
  1358         selected = self.GetPageSelection()
  1180         if selected != -1:
  1359         if selected != -1:
  1181             self.TabsOpened.GetPage(selected).RefreshView()
  1360             window = self.GetPage(selected)
  1182             self.TabsOpened.GetPage(selected).Refresh()
  1361             window.RefreshView()
       
  1362             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
  1183         event.Skip()
  1363         event.Skip()
  1184 
  1364 
  1185     def OnUndoMenu(self, event):
  1365     def OnUndoMenu(self, event):
  1186         self.Controler.LoadPrevious()
  1366         self.Controler.LoadPrevious()
  1187         selected = self.TabsOpened.GetSelection()
  1367         selected = self.GetPageSelection()
  1188         if selected != -1:
  1368         if selected != -1:
  1189             self.TabsOpened.GetPage(selected).RefreshView()
  1369             window = self.GetPage(selected)
  1190             self.TabsOpened.GetPage(selected).Refresh()
  1370             window.RefreshView()
       
  1371             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
  1191         self.RefreshTitle()
  1372         self.RefreshTitle()
  1192         self.RefreshEditMenu()
  1373         self.RefreshEditMenu()
  1193         self.RefreshProjectTree()
  1374         self.RefreshProjectTree()
  1194         event.Skip()
  1375         event.Skip()
  1195     
  1376     
  1196     def OnRedoMenu(self, event):
  1377     def OnRedoMenu(self, event):
  1197         self.Controler.LoadNext()
  1378         self.Controler.LoadNext()
  1198         selected = self.TabsOpened.GetSelection()
  1379         selected = self.GetPageSelection()
  1199         if selected != -1:
  1380         if selected != -1:
  1200             self.TabsOpened.GetPage(selected).RefreshView()
  1381             window = self.GetPage(selected)
  1201             self.TabsOpened.GetPage(selected).Refresh()
  1382             window.RefreshView()
       
  1383             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
  1202         self.RefreshTitle()
  1384         self.RefreshTitle()
  1203         self.RefreshEditMenu()
  1385         self.RefreshEditMenu()
  1204         self.RefreshProjectTree()
  1386         self.RefreshProjectTree()
  1205         event.Skip()
  1387         event.Skip()
  1206 
  1388 
  1207     def OnCutMenu(self, event):
  1389     def OnCutMenu(self, event):
  1208         selected = self.TabsOpened.GetSelection()
  1390         selected = self.GetPageSelection()
  1209         if selected != -1:
  1391         if selected != -1:
  1210             try:
  1392             try:
  1211                 self.TabsOpened.GetPage(selected).Viewer.Cut()
  1393                 self.GetPage(selected).Cut()
  1212             except:
  1394             except:
  1213                 pass
  1395                 pass
  1214         event.Skip()
  1396         event.Skip()
  1215     
  1397     
  1216     def OnCopyMenu(self, event):
  1398     def OnCopyMenu(self, event):
  1217         selected = self.TabsOpened.GetSelection()
  1399         selected = self.GetPageSelection()
  1218         if selected != -1:
  1400         if selected != -1:
  1219             try:
  1401             try:
  1220                 self.TabsOpened.GetPage(selected).Viewer.Copy()
  1402                 self.GetPage(selected).Copy()
  1221             except:
  1403             except:
  1222                 pass
  1404                 pass
  1223         event.Skip()
  1405         event.Skip()
  1224     
  1406     
  1225     def OnPasteMenu(self, event):
  1407     def OnPasteMenu(self, event):
  1226         selected = self.TabsOpened.GetSelection()
  1408         selected = self.GetPageSelection()
  1227         if selected != -1:
  1409         if selected != -1:
  1228             try:
  1410             try:
  1229                 self.TabsOpened.GetPage(selected).Viewer.Paste()
  1411                 self.GetPage(selected).Paste()
  1230             except:
  1412             except:
  1231                 pass
  1413                 pass
  1232         event.Skip()
  1414         event.Skip()
  1233     
  1415     
  1234     def OnAddPouMenu(self, event):
  1416     def OnAddPouMenu(self, event):
  1249         dialog = wx.SingleChoiceDialog(self, "Select POU to remove:", "POU Remove", pous, wx.OK|wx.CANCEL)
  1431         dialog = wx.SingleChoiceDialog(self, "Select POU to remove:", "POU Remove", pous, wx.OK|wx.CANCEL)
  1250         if dialog.ShowModal() == wx.ID_OK:
  1432         if dialog.ShowModal() == wx.ID_OK:
  1251             selected = dialog.GetStringSelection()
  1433             selected = dialog.GetStringSelection()
  1252             if not self.Controler.PouIsUsed(selected):
  1434             if not self.Controler.PouIsUsed(selected):
  1253                 self.Controler.ProjectRemovePou(selected)
  1435                 self.Controler.ProjectRemovePou(selected)
  1254                 deleted = None
  1436                 tagname = self.Controler.ComputePouName(selected)
  1255                 for i in xrange(self.TabsOpened.GetPageCount()):
  1437                 idx = self.IsOpened(tagname)
  1256                     if self.TabsOpened.GetPageText(i) == selected:
  1438                 if idx is not None:
  1257                         deleted = i
  1439                     self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
  1258                 if deleted is not None:
  1440                     self.DeletePage(idx)
  1259                     self.TabsOpened.DeletePage(deleted)
       
  1260                 self.RefreshTitle()
  1441                 self.RefreshTitle()
  1261                 self.RefreshEditMenu()
  1442                 self.RefreshEditMenu()
  1262                 self.RefreshProjectTree()
  1443                 self.RefreshProjectTree()
  1263                 self.RefreshToolBar()
  1444                 self.RefreshToolBar()
  1264             else:
  1445             else:
  1284         configs = self.Controler.GetProjectConfigNames()
  1465         configs = self.Controler.GetProjectConfigNames()
  1285         dialog = wx.SingleChoiceDialog(self, "Please select a configuration", "Remove configuration", configs, wx.OK|wx.CANCEL)
  1466         dialog = wx.SingleChoiceDialog(self, "Please select a configuration", "Remove configuration", configs, wx.OK|wx.CANCEL)
  1286         if dialog.ShowModal() == wx.ID_OK:
  1467         if dialog.ShowModal() == wx.ID_OK:
  1287             selected = dialog.GetStringSelection()
  1468             selected = dialog.GetStringSelection()
  1288             self.Controler.ProjectRemoveConfiguration(selected)
  1469             self.Controler.ProjectRemoveConfiguration(selected)
       
  1470             tagname = self.Controler.ComputeConfigurationName(selected)
       
  1471             idx = self.IsOpened(tagname)
       
  1472             if idx is not None:
       
  1473                 self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
       
  1474                 self.DeletePage(idx)
  1289             self.RefreshTitle()
  1475             self.RefreshTitle()
  1290             self.RefreshEditMenu()
  1476             self.RefreshEditMenu()
  1291             self.RefreshProjectTree()
  1477             self.RefreshProjectTree()
  1292         event.Skip()
  1478         event.Skip()
  1293 
  1479 
  1316                 transitions = self.Controler.GetPouTransitions(pouname)
  1502                 transitions = self.Controler.GetPouTransitions(pouname)
  1317                 dialog = wx.SingleChoiceDialog(self, "Select Transition to remove:", "Remove transition", transitions, wx.OK|wx.CANCEL)
  1503                 dialog = wx.SingleChoiceDialog(self, "Select Transition to remove:", "Remove transition", transitions, wx.OK|wx.CANCEL)
  1318                 if dialog.ShowModal() == wx.ID_OK: 
  1504                 if dialog.ShowModal() == wx.ID_OK: 
  1319                     selected = dialog.GetStringSelection()
  1505                     selected = dialog.GetStringSelection()
  1320                     self.Controler.ProjectRemovePouTransition(pouname, selected)
  1506                     self.Controler.ProjectRemovePouTransition(pouname, selected)
       
  1507                     tagname = self.Controler.ComputePouTransitionName(pouname, selected)
       
  1508                     idx = self.IsOpened(tagname)
       
  1509                     if idx is not None:
       
  1510                         self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
       
  1511                         self.DeletePage(idx)
  1321                     self.RefreshTitle()
  1512                     self.RefreshTitle()
  1322                     self.RefreshEditMenu()
  1513                     self.RefreshEditMenu()
  1323                     self.RefreshProjectTree()
  1514                     self.RefreshProjectTree()
  1324                 dialog.Destroy()
  1515                 dialog.Destroy()
  1325         event.Skip()
  1516         event.Skip()
  1349                 actions = self.Controler.GetPouActions(pouname)
  1540                 actions = self.Controler.GetPouActions(pouname)
  1350                 dialog = wx.SingleChoiceDialog(self, "Select Action to remove:", "Remove action", actions, wx.OK|wx.CANCEL)
  1541                 dialog = wx.SingleChoiceDialog(self, "Select Action to remove:", "Remove action", actions, wx.OK|wx.CANCEL)
  1351                 if dialog.ShowModal() == wx.ID_OK: 
  1542                 if dialog.ShowModal() == wx.ID_OK: 
  1352                     selected = dialog.GetStringSelection()
  1543                     selected = dialog.GetStringSelection()
  1353                     self.Controler.ProjectRemovePouAction(pouname, selected)
  1544                     self.Controler.ProjectRemovePouAction(pouname, selected)
       
  1545                     tagname = self.Controler.ComputePouActionName(pouname, selected)
       
  1546                     idx = self.IsOpened(tagname)
       
  1547                     if idx is not None:
       
  1548                         self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
       
  1549                         self.DeletePage(idx)
  1354                     self.RefreshTitle()
  1550                     self.RefreshTitle()
  1355                     self.RefreshEditMenu()
  1551                     self.RefreshEditMenu()
  1356                     self.RefreshProjectTree()
  1552                     self.RefreshProjectTree()
  1357                 dialog.Destroy()
  1553                 dialog.Destroy()
  1358         event.Skip()
  1554         event.Skip()
  1365             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1561             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1366             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1562             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  1367             if dialog.ShowModal() == wx.ID_OK:
  1563             if dialog.ShowModal() == wx.ID_OK:
  1368                 value = dialog.GetValue()
  1564                 value = dialog.GetValue()
  1369                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  1565                 self.Controler.ProjectAddConfigurationResource(config_name, value)
       
  1566                 tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
       
  1567                 idx = self.IsOpened(tagname)
       
  1568                 if idx is not None:
       
  1569                     self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName())
       
  1570                     self.DeletePage(idx)
  1370                 self.RefreshTitle()
  1571                 self.RefreshTitle()
  1371                 self.RefreshEditMenu()
  1572                 self.RefreshEditMenu()
  1372                 self.RefreshProjectTree()
  1573                 self.RefreshProjectTree()
  1373             dialog.Destroy()
  1574             dialog.Destroy()
  1374         event.Skip()
  1575         event.Skip()
  2159     
  2360     
  2160     def GetValue(self):
  2361     def GetValue(self):
  2161         return self.GetSizer().GetItem(1).GetWindow().GetValue()
  2362         return self.GetSizer().GetItem(1).GetWindow().GetValue()
  2162 
  2363 
  2163 #-------------------------------------------------------------------------------
  2364 #-------------------------------------------------------------------------------
  2164 #                            Pou Editor Panel
  2365 #                            Variables Editor Panel
       
  2366 #-------------------------------------------------------------------------------
       
  2367 
       
  2368 class VariablePanelIndexer(wx.Panel):
       
  2369     
       
  2370     def _init_sizers(self):
       
  2371         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
       
  2372         
       
  2373         self.SetSizer(self.MainSizer)
       
  2374     
       
  2375     def _init_ctrls(self, prnt):
       
  2376         wx.Panel.__init__(self, id=wx.NewId(),
       
  2377               name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0),
       
  2378               size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL)
       
  2379         
       
  2380         self._init_sizers()
       
  2381     
       
  2382     def __init__(self, parent, controler):
       
  2383         self._init_ctrls(parent)
       
  2384         
       
  2385         self.ParentWindow = parent
       
  2386         self.Controler = controler
       
  2387         
       
  2388         self.VariablePanelList = {}
       
  2389         self.CurrentPanel = None
       
  2390         
       
  2391     def AddVariablePanel(self, tagname, element_type):
       
  2392         new_panel = VariablePanel(self, self.ParentWindow, self.Controler, element_type)
       
  2393         new_panel.SetTagName(tagname)
       
  2394         new_panel.Hide()
       
  2395         new_panel.RefreshView()
       
  2396         self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
       
  2397         self.VariablePanelList[tagname] = new_panel
       
  2398         
       
  2399     def RemoveVariablePanel(self, tagname):
       
  2400         if tagname in self.VariablePanelList:
       
  2401             panel = self.VariablePanelList.pop(tagname)
       
  2402             panel.Hide()
       
  2403             self.MainSizer.Remove(panel)
       
  2404             if self.CurrentPanel == tagname:
       
  2405                 self.CurrentPanel = None
       
  2406     
       
  2407     def RemoveAllPanels(self):
       
  2408         if self.CurrentPanel is not None and self.CurrentPanel in self.VariablePanelList:
       
  2409             self.VariablePanelList[self.CurrentPanel].Hide()
       
  2410         self.VariablePanelList = {}
       
  2411         self.MainSizer.Clear()
       
  2412         self.CurrentPanel = None
       
  2413     
       
  2414     def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
       
  2415         if old_name in self.VariablePanelList:
       
  2416             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
       
  2417             if self.CurrentPanel == old_tagname:
       
  2418                 self.CurrentPanel = new_tagname
       
  2419                 
       
  2420     def ChangeVariablePanel(self, tagname):
       
  2421         if tagname in self.VariablePanelList and tagname != self.CurrentPanel:
       
  2422             if self.CurrentPanel is not None:
       
  2423                 self.VariablePanelList[self.CurrentPanel].Hide()
       
  2424             self.CurrentPanel = tagname
       
  2425             self.VariablePanelList[self.CurrentPanel].RefreshView()
       
  2426             self.VariablePanelList[self.CurrentPanel].Show()
       
  2427             self.MainSizer.Layout()
       
  2428 
       
  2429     def RefreshVariablePanel(self, tagname):
       
  2430         if tagname in self.VariablePanelList:
       
  2431             self.VariablePanelList[self.CurrentPanel].RefreshView()
       
  2432 
       
  2433 #-------------------------------------------------------------------------------
       
  2434 #                            Variables Editor Panel
  2165 #-------------------------------------------------------------------------------
  2435 #-------------------------------------------------------------------------------
  2166 
  2436 
  2167 class VariableTable(wx.grid.PyGridTableBase):
  2437 class VariableTable(wx.grid.PyGridTableBase):
  2168     
  2438     
  2169     """
  2439     """
  2382             if message is not None:
  2652             if message is not None:
  2383                 message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  2653                 message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  2384                 message.ShowModal()
  2654                 message.ShowModal()
  2385                 message.Destroy()
  2655                 message.Destroy()
  2386 
  2656 
  2387 [ID_POUEDITORPANEL, ID_POUEDITORPANELVIEWER, 
  2657 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
  2388  ID_POUEDITORPANELVARIABLESGRID, ID_POUEDITORPANELRETURNTYPE, 
  2658  ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELCLASSFILTER, 
  2389  ID_POUEDITORPANELCLASSFILTER, ID_POUEDITORPANELADDBUTTON,
  2659  ID_VARIABLEEDITORPANELADDBUTTON, ID_VARIABLEEDITORPANELDELETEBUTTON, 
  2390  ID_POUEDITORPANELDELETEBUTTON, ID_POUEDITORPANELUPBUTTON, 
  2660  ID_VARIABLEEDITORPANELUPBUTTON, ID_VARIABLEEDITORPANELDOWNBUTTON, 
  2391  ID_POUEDITORPANELDOWNBUTTON, ID_POUEDITORPANELSTATICTEXT1, 
  2661  ID_VARIABLEEDITORPANELSTATICTEXT1, ID_VARIABLEEDITORPANELSTATICTEXT2, 
  2392  ID_POUEDITORPANELSTATICTEXT2, ID_POUEDITORPANELSTATICTEXT3,
  2662  ID_VARIABLEEDITORPANELSTATICTEXT3,
  2393 ] = [wx.NewId() for _init_ctrls in range(12)]
  2663 ] = [wx.NewId() for _init_ctrls in range(11)]
  2394 
  2664 
  2395 class PouEditorPanel(wx.SplitterWindow):
  2665 class VariablePanel(wx.Panel):
  2396     
  2666     
  2397     if wx.VERSION < (2, 6, 0):
  2667     if wx.VERSION < (2, 6, 0):
  2398         def Bind(self, event, function, id = None):
  2668         def Bind(self, event, function, id = None):
  2399             if id is not None:
  2669             if id is not None:
  2400                 event(self, id, function)
  2670                 event(self, id, function)
  2401             else:
  2671             else:
  2402                 event(self, function)
  2672                 event(self, function)
  2403     
  2673     
  2404     def _init_coll_VariablePanelSizer_Items(self, parent):
  2674     def _init_coll_MainSizer_Items(self, parent):
  2405         parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
  2675         parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
  2406         parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW)
  2676         parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW)
  2407     
  2677     
  2408     def _init_coll_VariablePanelSizer_Growables(self, parent):
  2678     def _init_coll_MainSizer_Growables(self, parent):
  2409         parent.AddGrowableCol(0)
  2679         parent.AddGrowableCol(0)
  2410         parent.AddGrowableRow(0)
  2680         parent.AddGrowableRow(0)
  2411     
  2681     
  2412     def _init_coll_ControlPanelSizer_Items(self, parent):
  2682     def _init_coll_ControlPanelSizer_Items(self, parent):
  2413         parent.AddSizer(self.ChoicePanelSizer, 0, border=0, flag=wx.GROW)
  2683         parent.AddSizer(self.ChoicePanelSizer, 0, border=0, flag=wx.GROW)
  2436         parent.AddGrowableCol(2)
  2706         parent.AddGrowableCol(2)
  2437         parent.AddGrowableCol(3)
  2707         parent.AddGrowableCol(3)
  2438         parent.AddGrowableRow(0)
  2708         parent.AddGrowableRow(0)
  2439 
  2709 
  2440     def _init_sizers(self):
  2710     def _init_sizers(self):
  2441         self.VariablePanelSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
  2711         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0)
  2442         self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2712         self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2443         self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5)
  2713         self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5)
  2444         self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
  2714         self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0)
  2445         
  2715         
  2446         self._init_coll_VariablePanelSizer_Items(self.VariablePanelSizer)
  2716         self._init_coll_MainSizer_Items(self.MainSizer)
  2447         self._init_coll_VariablePanelSizer_Growables(self.VariablePanelSizer)
  2717         self._init_coll_MainSizer_Growables(self.MainSizer)
  2448         self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
  2718         self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
  2449         self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
  2719         self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
  2450         self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
  2720         self._init_coll_ChoicePanelSizer_Items(self.ChoicePanelSizer)
  2451         self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
  2721         self._init_coll_ButtonPanelSizer_Items(self.ButtonPanelSizer)
  2452         self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
  2722         self._init_coll_ButtonPanelSizer_Growables(self.ButtonPanelSizer)
  2453         
  2723         
  2454         self.VariablePanel.SetSizer(self.VariablePanelSizer)
  2724         self.SetSizer(self.MainSizer)
  2455 
  2725 
  2456     def _init_ctrls(self, prnt, element_type):
  2726     def _init_ctrls(self, prnt):
  2457         wx.SplitterWindow.__init__(self, id=ID_POUEDITORPANEL,
  2727         wx.Panel.__init__(self, id=ID_VARIABLEEDITORPANEL,
  2458               name='EditVariablePanel', parent=prnt, point=wx.Point(0, 0),
  2728               name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
  2459               size=wx.Size(0, 0), style=wx.SP_3D)
       
  2460         self.SetNeedUpdating(True)
       
  2461         self.SetMinimumPaneSize(1)
       
  2462         
       
  2463         if element_type == "config":
       
  2464             self.Viewer = wx.Panel(id=ID_POUEDITORPANELVIEWER,
       
  2465               name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
       
  2466               size=wx.Size(0, 0), style=0)
       
  2467             self.Viewer.SetSizer(wx.BoxSizer(wx.VERTICAL))
       
  2468             self.Viewer.ResetBuffer = lambda: None
       
  2469             self.Viewer.RefreshView = lambda: None
       
  2470         elif element_type == "resource":
       
  2471             self.Viewer = ResourceEditor(self, self.ParentWindow, self.Controler)
       
  2472         elif element_type == "FBD":
       
  2473             self.Viewer = Viewer(self, self.ParentWindow, self.Controler)
       
  2474         elif element_type == "LD":
       
  2475             self.Viewer = LD_Viewer(self, self.ParentWindow, self.Controler)
       
  2476         elif element_type == "SFC":
       
  2477             self.Viewer = SFC_Viewer(self, self.ParentWindow, self.Controler)
       
  2478         else:
       
  2479             self.Viewer = TextViewer(self, self.ParentWindow, self.Controler)
       
  2480             self.Viewer.SetTextSyntax(element_type)
       
  2481             if element_type == "IL":
       
  2482                 self.Viewer.SetKeywords(IL_KEYWORDS)
       
  2483             else:
       
  2484                 self.Viewer.SetKeywords(ST_KEYWORDS)
       
  2485         
       
  2486         self.VariablePanel = wx.Panel(id=ID_POUEDITORPANELVIEWER,
       
  2487               name='VariablePanel', parent=self, pos=wx.Point(0, 0),
       
  2488               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2729               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2489         
  2730         
  2490         self.staticText1 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT1,
  2731         self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1,
  2491               label='Return Type:', name='staticText1', parent=self.VariablePanel,
  2732               label='Return Type:', name='staticText1', parent=self,
  2492               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2733               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2493 
  2734 
  2494         self.ReturnType = wx.Choice(id=ID_POUEDITORPANELRETURNTYPE,
  2735         self.ReturnType = wx.Choice(id=ID_VARIABLEEDITORPANELRETURNTYPE,
  2495               name='ReturnType', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2736               name='ReturnType', parent=self, pos=wx.Point(0, 0),
  2496               size=wx.Size(145, 24), style=0)
  2737               size=wx.Size(145, 24), style=0)
  2497         self.Bind(wx.EVT_CHOICE, self.OnReturnTypeChanged, id=ID_POUEDITORPANELRETURNTYPE)
  2738         self.Bind(wx.EVT_CHOICE, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
  2498 
  2739 
  2499         self.staticText2 = wx.StaticText(id=ID_POUEDITORPANELSTATICTEXT2,
  2740         self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2,
  2500               label='Class Filter:', name='staticText2', parent=self.VariablePanel,
  2741               label='Class Filter:', name='staticText2', parent=self,
  2501               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2742               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  2502 
  2743 
  2503         self.ClassFilter = wx.Choice(id=ID_POUEDITORPANELCLASSFILTER,
  2744         self.ClassFilter = wx.Choice(id=ID_VARIABLEEDITORPANELCLASSFILTER,
  2504               name='ClassFilter', parent=self.VariablePanel, pos=wx.Point(0, 0),
  2745               name='ClassFilter', parent=self, pos=wx.Point(0, 0),
  2505               size=wx.Size(145, 24), style=0)
  2746               size=wx.Size(145, 24), style=0)
  2506         self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_POUEDITORPANELCLASSFILTER)
  2747         self.Bind(wx.EVT_CHOICE, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
  2507 
  2748 
  2508         self.VariablesGrid = wx.grid.Grid(id=ID_POUEDITORPANELVARIABLESGRID,
  2749         self.VariablesGrid = wx.grid.Grid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
  2509               name='VariablesGrid', parent=self.VariablePanel, pos=wx.Point(0, 0), 
  2750               name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
  2510               size=wx.Size(0, 150), style=wx.VSCROLL)
  2751               size=wx.Size(0, 150), style=wx.VSCROLL)
  2511         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  2752         self.VariablesGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
  2512               'Sans'))
  2753               'Sans'))
  2513         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  2754         self.VariablesGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL,
  2514               False, 'Sans'))
  2755               False, 'Sans'))
  2524             wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridSelectCell)
  2765             wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridSelectCell)
  2525             wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
  2766             wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
  2526             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
  2767             wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
  2527         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
  2768         self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
  2528         
  2769         
  2529         self.AddButton = wx.Button(id=ID_POUEDITORPANELADDBUTTON, label='Add',
  2770         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label='Add',
  2530               name='AddButton', parent=self.VariablePanel, pos=wx.Point(345, 340),
  2771               name='AddButton', parent=self, pos=wx.Point(345, 340),
  2531               size=wx.Size(72, 32), style=0)
  2772               size=wx.Size(72, 32), style=0)
  2532         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_POUEDITORPANELADDBUTTON)
  2773         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
  2533 
  2774 
  2534         self.DeleteButton = wx.Button(id=ID_POUEDITORPANELDELETEBUTTON, label='Delete',
  2775         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label='Delete',
  2535               name='DeleteButton', parent=self.VariablePanel, pos=wx.Point(425, 340),
  2776               name='DeleteButton', parent=self, pos=wx.Point(425, 340),
  2536               size=wx.Size(72, 32), style=0)
  2777               size=wx.Size(72, 32), style=0)
  2537         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_POUEDITORPANELDELETEBUTTON)
  2778         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
  2538 
  2779 
  2539         self.UpButton = wx.Button(id=ID_POUEDITORPANELUPBUTTON, label='^',
  2780         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
  2540               name='UpButton', parent=self.VariablePanel, pos=wx.Point(505, 340),
  2781               name='UpButton', parent=self, pos=wx.Point(505, 340),
  2541               size=wx.Size(32, 32), style=0)
  2782               size=wx.Size(32, 32), style=0)
  2542         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_POUEDITORPANELUPBUTTON)
  2783         self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_VARIABLEEDITORPANELUPBUTTON)
  2543 
  2784 
  2544         self.DownButton = wx.Button(id=ID_POUEDITORPANELDOWNBUTTON, label='v',
  2785         self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
  2545               name='DownButton', parent=self.VariablePanel, pos=wx.Point(545, 340),
  2786               name='DownButton', parent=self, pos=wx.Point(545, 340),
  2546               size=wx.Size(32, 32), style=0)
  2787               size=wx.Size(32, 32), style=0)
  2547         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_POUEDITORPANELDOWNBUTTON)
  2788         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_VARIABLEEDITORPANELDOWNBUTTON)
  2548 
       
  2549         self.SplitHorizontally(self.Viewer, self.VariablePanel, -200)
       
  2550 
  2789 
  2551         self._init_sizers()
  2790         self._init_sizers()
  2552 
  2791 
  2553     def __init__(self, parent, window, controler, element_type, pou_name = None, transition_name = None, action_name = None, config_name = None, resource_name = None):
  2792     def __init__(self, parent, window, controler, element_type):
       
  2793         self._init_ctrls(parent)
  2554         self.ParentWindow = window
  2794         self.ParentWindow = window
  2555         self.Controler = controler
  2795         self.Controler = controler
  2556         self.ElementType = element_type
  2796         self.ElementType = element_type
  2557         self.PouName = pou_name
       
  2558         self.TransitionName = transition_name
       
  2559         self.ActionName = action_name
       
  2560         self.ConfigName = config_name
       
  2561         self.ResourceName = resource_name
       
  2562         
       
  2563         if element_type == "config":
       
  2564             self._init_ctrls(parent, "config")
       
  2565             pou_type = "config"
       
  2566         elif element_type == "resource":
       
  2567             self._init_ctrls(parent, "resource")
       
  2568             pou_type = "resource"
       
  2569         else:
       
  2570             if element_type == "transition":
       
  2571                 self._init_ctrls(parent, self.Controler.GetTransitionBodyType(pou_name, transition_name))
       
  2572             elif element_type == "action":
       
  2573                 self._init_ctrls(parent, self.Controler.GetActionBodyType(pou_name, action_name))
       
  2574             else:
       
  2575                 self._init_ctrls(parent, self.Controler.GetPouBodyType(pou_name))
       
  2576             pou_type = self.Controler.GetPouType(pou_name)
       
  2577         
  2797         
  2578         self.Filter = "All"
  2798         self.Filter = "All"
  2579         self.FilterChoices = []
  2799         self.FilterChoices = []
  2580         self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", 
  2800         self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", 
  2581             "   Input" : "Input", "   Output" : "Output", "   InOut" : "InOut", 
  2801             "   Input" : "Input", "   Output" : "Output", "   InOut" : "InOut", 
  2582             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2802             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
  2583             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2803             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
  2584         
  2804         
  2585         if pou_type in ["config", "resource"]:
  2805         if element_type in ["config", "resource"]:
  2586             self.DefaultTypes = {"All" : "Global"}
  2806             self.DefaultTypes = {"All" : "Global"}
  2587             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2807             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2588         else:
  2808         else:
  2589             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2809             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  2590             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2810             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  2591         if pou_type in ["config", "resource"] or pou_type == "program":
  2811         if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]:
  2592             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  2812             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  2593             if pou_type not in ["config", "resource"]:
  2813             if element_type not in ["config", "resource"]:
  2594                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2814                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  2595             else:
  2815             else:
  2596                 self.FilterChoices = ["All","Global","Access"]
  2816                 self.FilterChoices = ["All","Global","Access"]
  2597             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
  2817             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
  2598             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  2818             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  2610         self.RefreshTypeList()
  2830         self.RefreshTypeList()
  2611 
  2831 
  2612         self.OptionList = "Yes,No"
  2832         self.OptionList = "Yes,No"
  2613         self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]
  2833         self.TypeList = [value for value, parent in TypeHierarchy_list if not value.startswith("ANY")]
  2614         
  2834         
  2615         if pou_type == "function":
  2835         if element_type == "function":
  2616             for value, parent in TypeHierarchy_list:
  2836             for value, parent in TypeHierarchy_list:
  2617                 if not value.startswith("ANY"):
  2837                 if not value.startswith("ANY"):
  2618                     self.ReturnType.Append(value)
  2838                     self.ReturnType.Append(value)
  2619             self.ReturnType.Enable(True)
  2839             self.ReturnType.Enable(True)
  2620         else:
  2840         else:
  2628             attr = wx.grid.GridCellAttr()
  2848             attr = wx.grid.GridCellAttr()
  2629             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
  2849             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
  2630             self.VariablesGrid.SetColAttr(col, attr)
  2850             self.VariablesGrid.SetColAttr(col, attr)
  2631             self.VariablesGrid.SetColSize(col, self.ColSizes[col])
  2851             self.VariablesGrid.SetColSize(col, self.ColSizes[col])
  2632     
  2852     
  2633     def SetIndex(self, index):
  2853     def SetTagName(self, tagname):
  2634         self.ControlerIndex = index
  2854         self.TagName = tagname
  2635         
  2855     
  2636     def GetIndex(self):
       
  2637         return self.ControlerIndex
       
  2638     
       
  2639     def RefreshName(self, name_type, old_name, new_name):
       
  2640         if name_type == ITEM_POU and self.PouName == old_name:
       
  2641             self.PouName = new_name
       
  2642         elif name_type == ITEM_TRANSITION and self.TransitionName == old_name:
       
  2643             self.TransitionName = new_name
       
  2644         elif name_type == ITEM_ACTION and self.ActionName == old_name:
       
  2645             self.ActionName = new_name
       
  2646         elif name_type == ITEM_CONFIGURATION and self.ConfigName == old_name:
       
  2647             self.ConfigName = new_name
       
  2648         elif name_type == ITEM_RESOURCE and self.ResourceName == old_name:
       
  2649             self.ResourceName = new_name
       
  2650     
       
  2651     def SetMode(self, mode):
       
  2652         if self.ElementType not in ["resource", "config"]:
       
  2653             if self.ElementType == "transition":
       
  2654                 language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
       
  2655             elif self.ElementType == "action":
       
  2656                 language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
       
  2657             else:
       
  2658                 language = self.Controler.GetPouBodyType(self.PouName)
       
  2659             if language not in ["IL", "ST"]:
       
  2660                 self.Viewer.SetMode(mode)
       
  2661 
       
  2662     def ResetBuffer(self):
       
  2663         self.Viewer.ResetBuffer()
       
  2664 
       
  2665     def RefreshView(self):
  2856     def RefreshView(self):
  2666         self.PouNames = self.Controler.GetProjectPouNames()
  2857         self.PouNames = self.Controler.GetProjectPouNames()
  2667         
  2858         
       
  2859         words = self.TagName.split("::")
  2668         if self.ElementType == "config":
  2860         if self.ElementType == "config":
  2669             self.PouIsUsed = False
  2861             self.PouIsUsed = False
  2670             returnType = None
  2862             returnType = None
  2671             self.Values = self.Controler.GetConfigurationGlobalVars(self.ConfigName)
  2863             self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
  2672         elif self.ElementType == "resource":
  2864         elif self.ElementType == "resource":
  2673             self.PouIsUsed = False
  2865             self.PouIsUsed = False
  2674             returnType = None
  2866             returnType = None
  2675             self.Values = self.Controler.GetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName)
  2867             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
  2676         else:
  2868         else:
  2677             self.PouIsUsed = self.Controler.PouIsUsed(self.PouName)
  2869             self.PouIsUsed = self.Controler.PouIsUsed(words[1])
  2678             returnType = self.Controler.GetCurrentElementEditingInterfaceReturnType()
  2870             returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  2679             self.Values = self.Controler.GetCurrentElementEditingInterfaceVars()
  2871             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  2680         
  2872         
  2681         if returnType and self.ReturnType.IsEnabled():
  2873         if returnType and self.ReturnType.IsEnabled():
  2682             self.ReturnType.SetStringSelection(returnType)
  2874             self.ReturnType.SetStringSelection(returnType)
  2683         
  2875         
  2684         self.RefreshValues()
  2876         self.RefreshValues()
  2685         self.RefreshViewerVarList()
       
  2686         self.RefreshButtons()
  2877         self.RefreshButtons()
  2687         self.Viewer.RefreshView()
       
  2688     
       
  2689     def RefreshViewerVarList(self):
       
  2690         if self.ElementType not in ["config", "resource"]:
       
  2691             varlist = [var["Name"] for var in self.Values]
       
  2692             if self.ElementType == "transition":
       
  2693                 language = self.Controler.GetTransitionBodyType(self.PouName, self.TransitionName)
       
  2694                 varlist.append(self.TransitionName)
       
  2695             elif self.ElementType == "action":
       
  2696                 language = self.Controler.GetActionBodyType(self.PouName, self.ActionName)
       
  2697                 varlist.append(self.ActionName)
       
  2698             else:
       
  2699                 language = self.Controler.GetPouBodyType(self.PouName)
       
  2700                 varlist.append(self.PouName)
       
  2701             if language in ["IL", "ST"]:
       
  2702                 self.Viewer.SetVariables(varlist)
       
  2703                 self.Viewer.SetFunctions(self.Controler.GetBlockTypes())
       
  2704     
  2878     
  2705     def OnReturnTypeChanged(self, event):
  2879     def OnReturnTypeChanged(self, event):
  2706         self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  2880         words = self.TagName.split("::")
       
  2881         self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  2707         self.Controler.BufferProject()
  2882         self.Controler.BufferProject()
  2708         self.ParentWindow.RefreshTitle()
  2883         self.ParentWindow.RefreshTitle()
  2709         self.ParentWindow.RefreshEditMenu()
  2884         self.ParentWindow.RefreshEditMenu()
  2710         event.Skip()
  2885         event.Skip()
  2711     
  2886     
  2795                 event.Veto()
  2970                 event.Veto()
  2796             else:
  2971             else:
  2797                 self.SaveValues(False)
  2972                 self.SaveValues(False)
  2798                 old_value = self.Table.GetOldValue()
  2973                 old_value = self.Table.GetOldValue()
  2799                 if old_value != "":
  2974                 if old_value != "":
  2800                     self.Controler.UpdateCurrentPouEditingUsedVariable(old_value, value)
  2975                     self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
  2801                 self.Controler.BufferProject()
  2976                 self.Controler.BufferProject()
       
  2977                 self.ParentWindow.RefreshEditor(variablepanel = False)
  2802                 self.ParentWindow.RefreshTitle()
  2978                 self.ParentWindow.RefreshTitle()
  2803                 self.ParentWindow.RefreshEditMenu()
  2979                 self.ParentWindow.RefreshEditMenu()
  2804                 self.RefreshViewerVarList()
       
  2805                 self.Viewer.RefreshView()
       
  2806                 event.Skip()
  2980                 event.Skip()
  2807         else:
  2981         else:
  2808             self.SaveValues()
  2982             self.SaveValues()
  2809             if colname == "Class":
  2983             if colname == "Class":
  2810                 self.Table.ResetView(self.VariablesGrid)
  2984                 self.Table.ResetView(self.VariablesGrid)
  2811             event.Skip()
  2985             event.Skip()
  2812 
       
  2813     def OnVariablesGridCellLeftClick(self, event):
       
  2814         if event.GetCol() == "#":
       
  2815             row = event.GetRow()
       
  2816             var_name = self.Table.GetValueByName(row, "Name")
       
  2817             var_class = self.Table.GetValueByName(row, "Class")
       
  2818             var_type = self.Table.GetValueByName(row, "Type")
       
  2819             data = wx.TextDataObject(str((var_name, var_class, var_type)))
       
  2820             dragSource = wx.DropSource(self.VariablesGrid)
       
  2821             dragSource.SetData(data)
       
  2822             dragSource.DoDragDrop()
       
  2823         event.Skip()
       
  2824     
  2986     
  2825     def OnVariablesGridEditorShown(self, event):
  2987     def OnVariablesGridEditorShown(self, event):
  2826         row, col = event.GetRow(), event.GetCol() 
  2988         row, col = event.GetRow(), event.GetCol() 
  2827         if self.Table.GetColLabelValue(col) == "Type":
  2989         if self.Table.GetColLabelValue(col) == "Type":
  2828             type_menu = wx.Menu(title='')
  2990             type_menu = wx.Menu(title='')
  2848         def VariableTypeFunction(event):
  3010         def VariableTypeFunction(event):
  2849             row = self.VariablesGrid.GetGridCursorRow()
  3011             row = self.VariablesGrid.GetGridCursorRow()
  2850             self.Table.SetValueByName(row, "Type", base_type)
  3012             self.Table.SetValueByName(row, "Type", base_type)
  2851             self.Table.ResetView(self.VariablesGrid)
  3013             self.Table.ResetView(self.VariablesGrid)
  2852             self.SaveValues(False)
  3014             self.SaveValues(False)
  2853             self.Viewer.RefreshView()
  3015             self.ParentWindow.RefreshEditor(variablepanel = False)
  2854             self.Viewer.VerifyVariableTypeCompatibility()
       
  2855             self.Controler.BufferProject()
  3016             self.Controler.BufferProject()
  2856             self.ParentWindow.RefreshTitle()
  3017             self.ParentWindow.RefreshTitle()
  2857             self.ParentWindow.RefreshEditMenu()
  3018             self.ParentWindow.RefreshEditMenu()
  2858             event.Skip()
  3019             event.Skip()
  2859         return VariableTypeFunction
  3020         return VariableTypeFunction
  2862         if event.GetCol() == 0:
  3023         if event.GetCol() == 0:
  2863             row = event.GetRow()
  3024             row = event.GetRow()
  2864             var_name = self.Table.GetValueByName(row, "Name")
  3025             var_name = self.Table.GetValueByName(row, "Name")
  2865             var_class = self.Table.GetValueByName(row, "Class")
  3026             var_class = self.Table.GetValueByName(row, "Class")
  2866             var_type = self.Table.GetValueByName(row, "Type")
  3027             var_type = self.Table.GetValueByName(row, "Type")
  2867             data = wx.TextDataObject(str((var_name, var_class, var_type)))
  3028             data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
  2868             dragSource = wx.DropSource(self.VariablesGrid)
  3029             dragSource = wx.DropSource(self.VariablesGrid)
  2869             dragSource.SetData(data)
  3030             dragSource.SetData(data)
  2870             dragSource.DoDragDrop()
  3031             dragSource.DoDragDrop()
  2871         event.Skip()
  3032         event.Skip()
  2872     
  3033     
  2894                 data.append(variable)
  3055                 data.append(variable)
  2895         self.Table.SetData(data)
  3056         self.Table.SetData(data)
  2896         self.Table.ResetView(self.VariablesGrid)
  3057         self.Table.ResetView(self.VariablesGrid)
  2897 
  3058 
  2898     def SaveValues(self, buffer = True):
  3059     def SaveValues(self, buffer = True):
       
  3060         words = self.TagName.split("::")
  2899         if self.ElementType == "config":
  3061         if self.ElementType == "config":
  2900             self.Controler.SetConfigurationGlobalVars(self.ConfigName, self.Values)
  3062             self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
  2901         elif self.ElementType == "resource":
  3063         elif self.ElementType == "resource":
  2902             self.Controler.SetConfigurationResourceGlobalVars(self.ConfigName, self.ResourceName, self.Values)
  3064             self.Controler.SetConfigurationResourceGlobalVars(words[1], words[2], self.Values)
  2903         else:
  3065         else:
  2904             if self.ReturnType.IsEnabled():
  3066             if self.ReturnType.IsEnabled():
  2905                 self.Controler.SetPouInterfaceReturnType(self.PouName, self.ReturnType.GetStringSelection())
  3067                 self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  2906             self.Controler.SetPouInterfaceVars(self.PouName, self.Values)
  3068             self.Controler.SetPouInterfaceVars(words[1], self.Values)
  2907         if buffer:
  3069         if buffer:
  2908             self.Controler.BufferProject()
  3070             self.Controler.BufferProject()
  2909             self.ParentWindow.RefreshTitle()
  3071             self.ParentWindow.RefreshTitle()
  2910             self.ParentWindow.RefreshEditMenu()
  3072             self.ParentWindow.RefreshEditMenu()
  2911 
  3073