PLCOpenEditor.py
changeset 235 7b58a3b5b6ec
parent 231 fc2d6cbb8b39
child 239 d12779e971bd
equal deleted inserted replaced
234:b9898f557e9b 235:7b58a3b5b6ec
    47 
    47 
    48 __version__ = "$Revision$"
    48 __version__ = "$Revision$"
    49 
    49 
    50 CWD = os.path.split(os.path.realpath(__file__))[0]
    50 CWD = os.path.split(os.path.realpath(__file__))[0]
    51 
    51 
    52 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORPROJECTTREE, 
    52 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
       
    53  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
    53  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    54  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    54  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    55  ID_PLCOPENEDITOREDITORPANEL, ID_PLCOPENEDITORTABSOPENED, 
    55  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    56  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
    56  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
    57  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
    57  ID_PLCOPENEDITORLDTOOLBAR,
    58  ID_PLCOPENEDITORLDTOOLBAR,
    58 ] = [wx.NewId() for _init_ctrls in range(11)]
    59 ] = [wx.NewId() for _init_ctrls in range(13)]
    59 
    60 
    60 [ID_PLCOPENEDITORFILEMENUGENERATE, 
    61 [ID_PLCOPENEDITORFILEMENUGENERATE, 
    61 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
    62 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
    62 
    63 
    63 [ID_PLCOPENEDITOREDITMENUADDDATATYPE, ID_PLCOPENEDITOREDITMENUADDFUNCTION,
    64 [ID_PLCOPENEDITOREDITMENUADDDATATYPE, ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   182     if wx.VERSION >= (2, 6, 0):
   183     if wx.VERSION >= (2, 6, 0):
   183         parent.Append(help=help, id=id, kind=kind, text=text)
   184         parent.Append(help=help, id=id, kind=kind, text=text)
   184     else:
   185     else:
   185         parent.Append(helpString=help, id=id, kind=kind, item=text)
   186         parent.Append(helpString=help, id=id, kind=kind, item=text)
   186 
   187 
   187 if wx.VERSION >= (2, 8, 0):
   188 class PLCOpenEditor(wx.Frame):
   188     base_class = wx.aui.AuiMDIParentFrame
       
   189 else:
       
   190     base_class = wx.Frame
       
   191 
       
   192 class PLCOpenEditor(base_class):
       
   193     
   189     
   194     CopyBuffer = None
   190     CopyBuffer = None
   195     
   191     
   196     if wx.VERSION < (2, 6, 0):
   192     if wx.VERSION < (2, 6, 0):
   197         def Bind(self, event, function, id = None):
   193         def Bind(self, event, function, id = None):
   339         self._init_coll_FileMenu_Items(self.FileMenu)
   335         self._init_coll_FileMenu_Items(self.FileMenu)
   340         self._init_coll_EditMenu_Items(self.EditMenu)
   336         self._init_coll_EditMenu_Items(self.EditMenu)
   341         self._init_coll_HelpMenu_Items(self.HelpMenu)
   337         self._init_coll_HelpMenu_Items(self.HelpMenu)
   342         
   338         
   343     def _init_ctrls(self, prnt):
   339     def _init_ctrls(self, prnt):
   344         if wx.VERSION >= (2, 8, 0):
   340         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   345             wx.aui.AuiMDIParentFrame.__init__(self, winid=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', 
   341               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   346                   parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   342               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   347                   style=wx.DEFAULT_FRAME_STYLE|wx.SUNKEN_BORDER|wx.CLIP_CHILDREN, title=u'PLCOpenEditor')
       
   348         else:
       
   349             wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
       
   350                   parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
       
   351                   style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
       
   352         self._init_utils()
   343         self._init_utils()
   353         self.SetClientSize(wx.Size(1000, 600))
   344         self.SetClientSize(wx.Size(1000, 600))
   354         self.SetMenuBar(self.MenuBar)
   345         self.SetMenuBar(self.MenuBar)
   355         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   346         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   356         
   347         
   364                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   355                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   365                   size=wx.Size(0, 0), style=wx.SP_3D)
   356                   size=wx.Size(0, 0), style=wx.SP_3D)
   366             self.MainSplitter.SetNeedUpdating(True)
   357             self.MainSplitter.SetNeedUpdating(True)
   367             self.MainSplitter.SetMinimumPaneSize(1)
   358             self.MainSplitter.SetMinimumPaneSize(1)
   368             
   359             
   369             self.ProjectTree = wx.TreeCtrl(id=ID_PLCOPENEDITORPROJECTTREE,
   360             self.TreeNoteBook = wx.Notebook(id=ID_PLCOPENEDITORTREENOTEBOOK,
   370                   name='treeCtrl1', parent=self.MainSplitter, pos=wx.Point(0, 0),
   361                   name='TreeNoteBook', parent=self.MainSplitter, pos=wx.Point(0,
   371                   size=wx.Size(-1, -1),
   362                   0), size=wx.Size(0, 0), style=0)
       
   363         else:
       
   364             self.TreeNoteBook = wx.aui.AuiNotebook(self)
       
   365             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption("Project").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
       
   366         
       
   367         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
       
   368                   name='TypesTree', parent=self.TreeNoteBook, 
       
   369                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   372                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   370                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   373         else:
   371         self.TreeNoteBook.AddPage(self.TypesTree, "Types")
   374             self.ProjectTree = wx.TreeCtrl(id=ID_PLCOPENEDITORPROJECTTREE,
   372         
   375                   name='treeCtrl1', parent=self, pos=wx.Point(0, 0),
   373         if wx.Platform == '__WXMSW__':
   376                   size=wx.Size(200, -1),
   374             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
       
   375                   id=ID_PLCOPENEDITORTYPESTREE)
       
   376             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
       
   377                   id=ID_PLCOPENEDITORTYPESTREE)
       
   378         else:
       
   379             if wx.VERSION >= (2, 6, 0):
       
   380                 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
       
   381                 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
       
   382             else:
       
   383                 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
       
   384                 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
       
   385             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
       
   386                   id=ID_PLCOPENEDITORTYPESTREE)
       
   387         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
       
   388               id=ID_PLCOPENEDITORTYPESTREE)
       
   389         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
       
   390               id=ID_PLCOPENEDITORTYPESTREE)
       
   391         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
       
   392               id=ID_PLCOPENEDITORTYPESTREE)
       
   393         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
       
   394               id=ID_PLCOPENEDITORTYPESTREE)
       
   395         
       
   396         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
       
   397                   name='InstancesTree', parent=self.TreeNoteBook, 
       
   398                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   377                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   399                   style=wx.TR_HAS_BUTTONS|wx.TR_EDIT_LABELS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   378             self.AUIManager.AddPane(self.ProjectTree, wx.aui.AuiPaneInfo().Caption("Project Tree").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   400         self.TreeNoteBook.AddPage(self.InstancesTree, "Instances")
   379         if wx.Platform == '__WXMSW__':
       
   380             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
       
   381                   id=ID_PLCOPENEDITORPROJECTTREE)
       
   382             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnProjectTreeItemSelected,
       
   383                   id=ID_PLCOPENEDITORPROJECTTREE)
       
   384         else:
       
   385             if wx.VERSION >= (2, 6, 0):
       
   386                 self.ProjectTree.Bind(wx.EVT_RIGHT_UP, self.OnProjectTreeRightUp)
       
   387                 self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
       
   388             else:
       
   389                 wx.EVT_RIGHT_UP(self.ProjectTree, self.OnProjectTreeRightUp)
       
   390                 wx.EVT_LEFT_UP(self.ProjectTree, self.OnProjectTreeLeftUp)
       
   391             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
       
   392                   id=ID_PLCOPENEDITORPROJECTTREE)
       
   393         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
       
   394               id=ID_PLCOPENEDITORPROJECTTREE)
       
   395         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
       
   396               id=ID_PLCOPENEDITORPROJECTTREE)
       
   397         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
       
   398               id=ID_PLCOPENEDITORPROJECTTREE)
       
   399         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
       
   400               id=ID_PLCOPENEDITORPROJECTTREE)
       
   401         
   401         
   402         if wx.VERSION < (2, 8, 0):
   402         if wx.VERSION < (2, 8, 0):
   403             self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   403             self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   404                   ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   404                   ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   405             self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   405             self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   426             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   426             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   427                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   427                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   428                   size=wx.Size(0, 0), style=wx.SP_3D)
   428                   size=wx.Size(0, 0), style=wx.SP_3D)
   429             self.SecondSplitter.SetMinimumPaneSize(1)
   429             self.SecondSplitter.SetMinimumPaneSize(1)
   430             
   430             
   431             self.MainSplitter.SplitVertically(self.ProjectTree, self.SecondSplitter, 200)
   431             self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   432             
   432             
   433             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   433             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   434                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   434                   name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
   435                   0), size=wx.Size(0, 0), style=0)
   435                   0), size=wx.Size(0, 0), style=0)
   436             if wx.VERSION >= (2, 6, 0):
   436             if wx.VERSION >= (2, 6, 0):
   437                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   437                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
   438                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   438                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
   439             else:
   439             else:
   440                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   440                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
   441                     self.OnPouSelectedChanged)
   441                     self.OnPouSelectedChanged)
   442         
   442         else:
       
   443             self.TabsOpened = wx.aui.AuiNotebook(self)
       
   444             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
       
   445                     self.OnPouSelectedChanged)
       
   446             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
       
   447             
   443         if wx.VERSION < (2, 8, 0):
   448         if wx.VERSION < (2, 8, 0):
   444             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   449             self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   445             
   450             
   446             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   451             self.SecondSplitter.SplitHorizontally(self.TabsOpened, self.VariablePanelIndexer, -200)
   447         else:
   452         else:
   448             self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   453             self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   449             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variable Panel").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   454             self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   450             
   455             
   451             self.AUIManager.Update()
   456             self.AUIManager.Update()
   452         
   457         
   453     def __init__(self, parent, controler = None, fileOpen = None):
   458     def __init__(self, parent, controler = None, fileOpen = None):
   454         self.ModeSolo = controler == None
   459         self.ModeSolo = controler == None
   461         
   466         
   462         self._init_ctrls(parent)
   467         self._init_ctrls(parent)
   463         
   468         
   464         self.SetIcon(wx.Icon(os.path.join(CWD,"Images","poe.ico"),wx.BITMAP_TYPE_ICO))
   469         self.SetIcon(wx.Icon(os.path.join(CWD,"Images","poe.ico"),wx.BITMAP_TYPE_ICO))
   465         
   470         
   466         self.TreeImageList = wx.ImageList(16, 16)
   471         self.TypesTreeImageList = wx.ImageList(16, 16)
   467         self.TreeImageDict = {}
   472         self.InstancesTreeImageList = wx.ImageList(16, 16)
       
   473         self.TypesTreeImageDict = {}
       
   474         self.InstancesTreeImageDict = {}
   468         for language in LANGUAGES:
   475         for language in LANGUAGES:
   469             self.TreeImageDict[language]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
   476             self.TypesTreeImageDict[language]=self.TypesTreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
       
   477             self.InstancesTreeImageDict[language]=self.InstancesTreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%language)))
   470         
   478         
   471         for imgname, itemtype in [
   479         for imgname, itemtype in [
   472             #editables
   480             #editables
   473             ("PROJECT",        ITEM_PROJECT),
   481             ("PROJECT",        ITEM_PROJECT),
   474             #("POU",            ITEM_POU),
   482             #("POU",            ITEM_POU),
   481             # uneditables
   489             # uneditables
   482             ("DATATYPES",      ITEM_DATATYPES),
   490             ("DATATYPES",      ITEM_DATATYPES),
   483             ("FUNCTION",       ITEM_FUNCTION),
   491             ("FUNCTION",       ITEM_FUNCTION),
   484             ("FUNCTIONBLOCK",  ITEM_FUNCTIONBLOCK),
   492             ("FUNCTIONBLOCK",  ITEM_FUNCTIONBLOCK),
   485             ("PROGRAM",        ITEM_PROGRAM),
   493             ("PROGRAM",        ITEM_PROGRAM),
       
   494             ("VAR_LOCAL",      ITEM_VAR_LOCAL),
       
   495             ("VAR_LOCAL",      ITEM_VAR_GLOBAL),
       
   496             ("VAR_LOCAL",      ITEM_VAR_EXTERNAL),
       
   497             ("VAR_LOCAL",      ITEM_VAR_TEMP),
       
   498             ("VAR_INPUT",      ITEM_VAR_INPUT),
       
   499             ("VAR_OUTPUT",     ITEM_VAR_OUTPUT),
       
   500             ("VAR_INOUT",      ITEM_VAR_INOUT),
   486             ("TRANSITIONS",    ITEM_TRANSITIONS),
   501             ("TRANSITIONS",    ITEM_TRANSITIONS),
   487             ("ACTIONS",        ITEM_ACTIONS),
   502             ("ACTIONS",        ITEM_ACTIONS),
   488             ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
   503             ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
   489             ("RESOURCES",      ITEM_RESOURCES),
   504             ("RESOURCES",      ITEM_RESOURCES),
   490             ("PROPERTIES",     ITEM_PROPERTIES)]:
   505             ("PROPERTIES",     ITEM_PROPERTIES)]:
   491             self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
   506             self.TypesTreeImageDict[itemtype]=self.TypesTreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
   492         self.ProjectTree.AssignImageList(self.TreeImageList)
   507             self.InstancesTreeImageDict[itemtype]=self.InstancesTreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%imgname)))
       
   508         self.TypesTree.AssignImageList(self.TypesTreeImageList)
       
   509         self.InstancesTree.AssignImageList(self.InstancesTreeImageList)
   493         
   510         
   494         self.CurrentToolBar = []
   511         self.CurrentToolBar = []
   495         self.CurrentLanguage = ""
   512         self.CurrentLanguage = ""
   496         self.SelectedItem = None
   513         self.SelectedItem = None
   497         self.Errors = []
   514         self.Errors = []
   504         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   521         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   505         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   522         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   506         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   523         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   507         
   524         
   508         if not self.ModeSolo or fileOpen is not None:
   525         if not self.ModeSolo or fileOpen is not None:
   509             self.RefreshProjectTree()
   526             self.RefreshTypesTree()
       
   527             self.RefreshInstancesTree()
   510         
   528         
   511         self.RefreshFileMenu()
   529         self.RefreshFileMenu()
   512         self.RefreshEditMenu()
   530         self.RefreshEditMenu()
   513         self.RefreshTitle()
   531         self.RefreshTitle()
   514         self.RefreshToolBar()
   532         self.RefreshToolBar()
   515 
   533 
   516     def ResetSelectedItem(self):
   534     def ResetSelectedItem(self):
   517         self.SelectedItem = None
   535         self.SelectedItem = None
   518 
   536 
   519     def OnPageClose(self, event):
   537     def OnPageClose(self, event):
   520         selected = self.GetPageSelection()
   538         selected = self.TabsOpened.GetSelection()
   521         if selected >= 0:
   539         if selected >= 0:
   522             tagname = self.GetPage(selected).GetTagName()
   540             tagname = self.GetPage(selected).GetTagName()
   523             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   541             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   524             if self.GetPageCount() > 0:
   542             if self.TabsOpened.GetPageCount() > 0:
   525                 new_index = min(selected, self.GetPageCount() - 1)
   543                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   526                 tagname = self.GetPage(new_index).GetTagName()
   544                 tagname = self.GetPage(new_index).GetTagName()
   527                 self.SetPageSelection(new_index)
   545                 self.TabsOpened.SetSelection(new_index)
   528                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   546                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   529             self.RefreshTitle()
   547             self.RefreshTitle()
   530             self.RefreshFileMenu()
   548             self.RefreshFileMenu()
   531             self.RefreshEditMenu()
   549             self.RefreshEditMenu()
   532             self.RefreshToolBar()
   550             self.RefreshToolBar()
   558             if new_values != old_values:
   576             if new_values != old_values:
   559                 self.Controler.SetProjectProperties(None, new_values)
   577                 self.Controler.SetProjectProperties(None, new_values)
   560                 self.RefreshTitle()
   578                 self.RefreshTitle()
   561                 self.RefreshFileMenu()
   579                 self.RefreshFileMenu()
   562                 self.RefreshEditMenu()
   580                 self.RefreshEditMenu()
   563                 self.RefreshProjectTree()
   581                 self.RefreshTypesTree()
   564                 for i in xrange(self.GetPageCount()):
   582                 for i in xrange(self.TabsOpened.GetPageCount()):
   565                     editor = self.GetPage(i)
   583                     editor = self.GetPage(i)
   566                     editor.RefreshScaling()
   584                     editor.RefreshScaling()
   567         dialog.Destroy()
   585         dialog.Destroy()
   568 
   586 
   569     def OnCloseFrame(self, event):
   587     def OnCloseFrame(self, event):
   589 
   607 
   590 #-------------------------------------------------------------------------------
   608 #-------------------------------------------------------------------------------
   591 #                            Notebook Unified Functions
   609 #                            Notebook Unified Functions
   592 #-------------------------------------------------------------------------------
   610 #-------------------------------------------------------------------------------
   593 
   611 
   594     def GetPageCount(self):
       
   595         if wx.VERSION >= (2, 8, 0):
       
   596             notebook = self.GetNotebook()
       
   597             if notebook is not None:
       
   598                 return notebook.GetPageCount()
       
   599             else:
       
   600                 return 0
       
   601         else:
       
   602             return self.TabsOpened.GetPageCount()
       
   603     
       
   604     def GetPage(self, idx):
       
   605         if wx.VERSION >= (2, 8, 0):
       
   606             notebook = self.GetNotebook()
       
   607             if notebook is not None:
       
   608                 return notebook.GetPage(idx).GetViewer()
       
   609             else:
       
   610                 return None
       
   611         else:
       
   612             return self.TabsOpened.GetPage(idx)
       
   613 
       
   614     def GetPageSelection(self):
       
   615         if wx.VERSION >= (2, 8, 0):
       
   616             notebook = self.GetNotebook()
       
   617             if notebook is not None:
       
   618                 return notebook.GetSelection()
       
   619             else:
       
   620                 return -1
       
   621         else:
       
   622             return self.TabsOpened.GetSelection()
       
   623 
       
   624     def SetPageSelection(self, idx):
       
   625         if wx.VERSION >= (2, 8, 0):
       
   626             notebook = self.GetNotebook()
       
   627             if notebook is not None:
       
   628                 notebook.SetSelection(idx)
       
   629         else:
       
   630             self.TabsOpened.SetSelection(idx)
       
   631 
       
   632     def DeletePage(self, idx):
       
   633         if wx.VERSION >= (2, 8, 0):
       
   634             notebook = self.GetNotebook()
       
   635             if notebook is not None:
       
   636                 notebook.DeletePage(idx)
       
   637         else:
       
   638             self.TabsOpened.DeletePage(idx)
       
   639 
       
   640     def DeleteAllPages(self):
   612     def DeleteAllPages(self):
   641         if wx.VERSION >= (2, 8, 0):
   613         if wx.VERSION >= (2, 8, 0):
   642             notebook = self.GetNotebook()
   614             for idx in xrange(self.TabsOpened.GetPageCount()):
   643             if notebook is not None:
   615                 self.TabsOpened.DeletePage(0)
   644                 for idx in xrange(notebook.GetPageCount()):
       
   645                     notebook.DeletePage(0)
       
   646         else:
   616         else:
   647             self.TabsOpened.DeleteAllPages()
   617             self.TabsOpened.DeleteAllPages()
   648 
       
   649     def SetPageText(self, idx, text):
       
   650         if wx.VERSION >= (2, 8, 0):
       
   651             notebook = self.GetNotebook()
       
   652             if notebook is not None:
       
   653                 return notebook.SetPageText(idx, text)
       
   654         else:
       
   655             return self.TabsOpened.SetPageText(idx, text)
       
   656 
   618 
   657     def SetPageBitmap(self, idx, bitmap):
   619     def SetPageBitmap(self, idx, bitmap):
   658         if wx.VERSION >= (2, 8, 0):
   620         if wx.VERSION >= (2, 8, 0):
   659             notebook = self.GetNotebook()
   621             return self.TabsOpened.SetPageBitmap(idx, bitmap)
   660             if notebook is not None:
       
   661                 return notebook.SetPageBitmap(idx, bitmap)
       
   662         else:
   622         else:
   663             return self.TabsOpened.SetPageImage(idx, bitmap)
   623             return self.TabsOpened.SetPageImage(idx, bitmap)
   664 
       
   665     def GetPageText(self, idx):
       
   666         if wx.VERSION >= (2, 8, 0):
       
   667             notebook = self.GetNotebook()
       
   668             if notebook is not None:
       
   669                 return notebook.GetPageText(idx)
       
   670             else:
       
   671                 return ""
       
   672         else:
       
   673             return self.TabsOpened.GetPageText(idx)
       
   674 
   624 
   675 
   625 
   676 #-------------------------------------------------------------------------------
   626 #-------------------------------------------------------------------------------
   677 #                            File Menu Functions
   627 #                            File Menu Functions
   678 #-------------------------------------------------------------------------------
   628 #-------------------------------------------------------------------------------
   679 
   629 
   680     def RefreshFileMenu(self):
   630     def RefreshFileMenu(self):
   681         if self.Controler.HasOpenedProject():
   631         if self.Controler.HasOpenedProject():
   682             selected = self.GetPageSelection()
   632             selected = self.TabsOpened.GetSelection()
   683             if selected >= 0:
   633             if selected >= 0:
   684                 graphic_viewer = isinstance(self.GetPage(selected), Viewer)
   634                 graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer)
   685             else:
   635             else:
   686                 graphic_viewer = False
   636                 graphic_viewer = False
   687             if self.GetPageCount() > 0:
   637             if self.TabsOpened.GetPageCount() > 0:
   688                 self.FileMenu.Enable(wx.ID_CLOSE, True)
   638                 self.FileMenu.Enable(wx.ID_CLOSE, True)
   689                 if graphic_viewer:
   639                 if graphic_viewer:
   690                     self.FileMenu.Enable(wx.ID_PREVIEW, True)
   640                     self.FileMenu.Enable(wx.ID_PREVIEW, True)
   691                     self.FileMenu.Enable(wx.ID_PRINT, True)
   641                     self.FileMenu.Enable(wx.ID_PRINT, True)
   692                 else:
   642                 else:
   721             properties = dialog.GetValues()
   671             properties = dialog.GetValues()
   722             self.Controler.CreateNewProject(properties)
   672             self.Controler.CreateNewProject(properties)
   723             self.RefreshTitle()
   673             self.RefreshTitle()
   724             self.RefreshFileMenu()
   674             self.RefreshFileMenu()
   725             self.RefreshEditMenu()
   675             self.RefreshEditMenu()
   726             self.RefreshProjectTree()
   676             self.RefreshTypesTree()
       
   677             self.RefreshInstancesTree()
   727         event.Skip()
   678         event.Skip()
   728 
   679 
   729     def OnOpenProjectMenu(self, event):
   680     def OnOpenProjectMenu(self, event):
   730         if not self.Controler.ProjectIsSaved():
   681         if not self.Controler.ProjectIsSaved():
   731             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   682             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   745             filepath = dialog.GetPath()
   696             filepath = dialog.GetPath()
   746             if os.path.isfile(filepath):
   697             if os.path.isfile(filepath):
   747                 self.DeleteAllPages()
   698                 self.DeleteAllPages()
   748                 self.VariablePanelIndexer.RemoveAllPanels()
   699                 self.VariablePanelIndexer.RemoveAllPanels()
   749                 self.Controler.OpenXMLFile(filepath)
   700                 self.Controler.OpenXMLFile(filepath)
   750                 self.RefreshProjectTree()
   701                 self.RefreshTypesTree()
       
   702                 self.RefreshInstancesTree()
   751             self.RefreshTitle()
   703             self.RefreshTitle()
   752             self.RefreshFileMenu()
   704             self.RefreshFileMenu()
   753             self.RefreshEditMenu()
   705             self.RefreshEditMenu()
   754             self.RefreshToolBar()
   706             self.RefreshToolBar()
   755         dialog.Destroy()
   707         dialog.Destroy()
   756         event.Skip()
   708         event.Skip()
   757 
   709 
   758     def OnCloseTabMenu(self, event):
   710     def OnCloseTabMenu(self, event):
   759         selected = self.GetPageSelection()
   711         selected = self.TabsOpened.GetSelection()
   760         if selected >= 0:
   712         if selected >= 0:
   761             tagname = self.GetPage(selected).GetTagName()
   713             tagname = self.TabsOpened.GetPage(selected).GetTagName()
   762             self.DeletePage(selected)
   714             self.TabsOpened.DeletePage(selected)
   763             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   715             self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   764             if self.GetPageCount() > 0:
   716             if self.TabsOpened.GetPageCount() > 0:
   765                 new_index = min(selected, self.GetPageCount() - 1)
   717                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   766                 tagname = self.GetPage(new_index).GetTagName()
   718                 tagname = self.TabsOpened.GetPage(new_index).GetTagName()
   767                 self.SetPageSelection(new_index)
   719                 self.TabsOpened.SetSelection(new_index)
   768                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   720                 self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   769             self.RefreshTitle()
   721             self.RefreshTitle()
   770             self.RefreshFileMenu()
   722             self.RefreshFileMenu()
   771             self.RefreshEditMenu()
   723             self.RefreshEditMenu()
   772             self.RefreshToolBar()
   724             self.RefreshToolBar()
   781                 self.SaveProject()
   733                 self.SaveProject()
   782             elif answer == wx.ID_CANCEL:
   734             elif answer == wx.ID_CANCEL:
   783                 return
   735                 return
   784         self.DeleteAllPages()
   736         self.DeleteAllPages()
   785         self.VariablePanelIndexer.RemoveAllPanels()
   737         self.VariablePanelIndexer.RemoveAllPanels()
   786         self.ProjectTree.DeleteAllItems()
   738         self.TypesTree.DeleteAllItems()
       
   739         self.InstancesTree.DeleteAllItems()
   787         self.Controler.Reset()
   740         self.Controler.Reset()
   788         self.RefreshTitle()
   741         self.RefreshTitle()
   789         self.RefreshFileMenu()
   742         self.RefreshFileMenu()
   790         self.RefreshEditMenu()
   743         self.RefreshEditMenu()
   791         self.RefreshToolBar()
   744         self.RefreshToolBar()
   859             self.PrintData = wx.PrintData(self.PageSetupData.GetPrintData())
   812             self.PrintData = wx.PrintData(self.PageSetupData.GetPrintData())
   860         dialog.Destroy()
   813         dialog.Destroy()
   861         event.Skip()
   814         event.Skip()
   862 
   815 
   863     def OnPreviewMenu(self, event):
   816     def OnPreviewMenu(self, event):
   864         selected = self.GetPageSelection()        
   817         selected = self.TabsOpened.GetSelection()        
   865         if selected != -1:
   818         if selected != -1:
   866             data = wx.PrintDialogData(self.PrintData)
   819             data = wx.PrintDialogData(self.PrintData)
   867             properties = self.Controler.GetProjectProperties()
   820             properties = self.Controler.GetProjectProperties()
   868             page_size = map(int, properties["pageSize"])
   821             page_size = map(int, properties["pageSize"])
   869             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   822             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   870             printout = GraphicPrintout(self.GetPage(selected), page_size, margins, True)
   823             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   871             printout2 = GraphicPrintout(self.GetPage(selected), page_size, margins, True)
   824             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   872             preview = wx.PrintPreview(printout, printout2, data)
   825             preview = wx.PrintPreview(printout, printout2, data)
   873 
   826 
   874             if preview.Ok():
   827             if preview.Ok():
   875                 preview_frame = wx.PreviewFrame(preview, self, "Print preview")
   828                 preview_frame = wx.PreviewFrame(preview, self, "Print preview")
   876 
   829 
   878                 
   831                 
   879                 preview_frame.Show(True)
   832                 preview_frame.Show(True)
   880         event.Skip()
   833         event.Skip()
   881 
   834 
   882     def OnPrintMenu(self, event):
   835     def OnPrintMenu(self, event):
   883         selected = self.GetPageSelection()        
   836         selected = self.TabsOpened.GetSelection()        
   884         if selected != -1:
   837         if selected != -1:
   885             dialog_data = wx.PrintDialogData(self.PrintData)
   838             dialog_data = wx.PrintDialogData(self.PrintData)
   886             dialog_data.SetToPage(1)
   839             dialog_data.SetToPage(1)
   887             properties = self.Controler.GetProjectProperties()
   840             properties = self.Controler.GetProjectProperties()
   888             page_size = map(int, properties["pageSize"])
   841             page_size = map(int, properties["pageSize"])
   889             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   842             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   890             printer = wx.Printer(dialog_data)
   843             printer = wx.Printer(dialog_data)
   891             printout = GraphicPrintout(self.GetPage(selected), page_size, margins)
   844             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
   892             
   845             
   893             if not printer.Print(self, printout, True):
   846             if not printer.Print(self, printout, True):
   894                 wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
   847                 wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
   895             printout.Destroy()
   848             printout.Destroy()
   896         event.Skip()
   849         event.Skip()
   915             self.EditMenu.Enable(wx.ID_REDO, redo)
   868             self.EditMenu.Enable(wx.ID_REDO, redo)
   916         else:
   869         else:
   917             self.EditMenu.Enable(wx.ID_UNDO, False)
   870             self.EditMenu.Enable(wx.ID_UNDO, False)
   918             self.EditMenu.Enable(wx.ID_REDO, False)
   871             self.EditMenu.Enable(wx.ID_REDO, False)
   919         if self.Controler.HasOpenedProject():
   872         if self.Controler.HasOpenedProject():
   920             if self.GetPageCount() > 0:
   873             if self.TabsOpened.GetPageCount() > 0:
   921                 self.EditMenu.Enable(wx.ID_REFRESH, True)
   874                 self.EditMenu.Enable(wx.ID_REFRESH, True)
   922             else:
   875             else:
   923                 self.EditMenu.Enable(wx.ID_REFRESH, False)
   876                 self.EditMenu.Enable(wx.ID_REFRESH, False)
   924             self.EditMenu.Enable(wx.ID_ADD, True)
   877             self.EditMenu.Enable(wx.ID_ADD, True)
   925             self.EditMenu.Enable(wx.ID_DELETE, True)
   878             self.EditMenu.Enable(wx.ID_DELETE, True)
   933             self.EditMenu.Enable(wx.ID_PASTE, True)
   886             self.EditMenu.Enable(wx.ID_PASTE, True)
   934         else:
   887         else:
   935             self.EditMenu.Enable(wx.ID_PASTE, False)
   888             self.EditMenu.Enable(wx.ID_PASTE, False)
   936 
   889 
   937     def OnRefreshMenu(self, event):
   890     def OnRefreshMenu(self, event):
   938         selected = self.GetPageSelection()
   891         selected = self.TabsOpened.GetSelection()
   939         if selected != -1:
   892         if selected != -1:
   940             window = self.GetPage(selected)
   893             window = self.TabsOpened.GetPage(selected)
   941             window.RefreshView()
   894             window.RefreshView()
   942             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   895             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   943         event.Skip()
   896         event.Skip()
   944 
   897 
   945     def OnClearErrorsMenu(self, event):
   898     def OnClearErrorsMenu(self, event):
   946         self.ClearErrors()
   899         self.ClearErrors()
   947         event.Skip()
   900         event.Skip()
   948 
   901 
   949     def OnUndoMenu(self, event):
   902     def OnUndoMenu(self, event):
   950         self.Controler.LoadPrevious()
   903         self.Controler.LoadPrevious()
   951         idxs = range(self.GetPageCount())
   904         idxs = range(self.TabsOpened.GetPageCount())
   952         idxs.reverse()
   905         idxs.reverse()
   953         for idx in idxs:
   906         for idx in idxs:
   954             tagname = self.GetPage(idx).GetTagName()
   907             tagname = self.TabsOpened.GetPage(idx).GetTagName()
   955             if self.Controler.GetEditedElement(tagname) is None:
   908             if self.Controler.GetEditedElement(tagname) is None:
   956                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   909                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   957                 self.DeletePage(idx)
   910                 self.TabsOpened.DeletePage(idx)
   958         selected = self.GetPageSelection()        
   911         selected = self.TabsOpened.GetSelection()        
   959         if selected != -1:
   912         if selected != -1:
   960             window = self.GetPage(selected)
   913             window = self.TabsOpened.GetPage(selected)
   961             window.RefreshView()
   914             window.RefreshView()
   962             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   915             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   963         self.RefreshTitle()
   916         self.RefreshTitle()
   964         self.RefreshEditMenu()
   917         self.RefreshEditMenu()
   965         self.RefreshProjectTree()
   918         self.RefreshTypesTree()
   966         event.Skip()
   919         event.Skip()
   967     
   920     
   968     def OnRedoMenu(self, event):
   921     def OnRedoMenu(self, event):
   969         self.Controler.LoadNext()
   922         self.Controler.LoadNext()
   970         idxs = range(self.GetPageCount())
   923         idxs = range(self.TabsOpened.GetPageCount())
   971         idxs.reverse()
   924         idxs.reverse()
   972         for idx in idxs:
   925         for idx in idxs:
   973             tagname = self.GetPage(idx).GetTagName()
   926             tagname = self.TabsOpened.GetPage(idx).GetTagName()
   974             if self.Controler.GetEditedElement(tagname) is None:
   927             if self.Controler.GetEditedElement(tagname) is None:
   975                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   928                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   976                 self.DeletePage(idx)
   929                 self.TabsOpened.DeletePage(idx)
   977         selected = self.GetPageSelection()
   930         selected = self.TabsOpened.GetSelection()
   978         if selected != -1:
   931         if selected != -1:
   979             window = self.GetPage(selected)
   932             window = self.TabsOpened.GetPage(selected)
   980             window.RefreshView()
   933             window.RefreshView()
   981             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   934             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   982         self.RefreshTitle()
   935         self.RefreshTitle()
   983         self.RefreshEditMenu()
   936         self.RefreshEditMenu()
   984         self.RefreshProjectTree()
   937         self.RefreshTypesTree()
   985         event.Skip()
   938         event.Skip()
   986 
   939 
   987     def OnCutMenu(self, event):
   940     def OnCutMenu(self, event):
   988         control = self.FindFocus()
   941         control = self.FindFocus()
   989         if isinstance(control, Viewer):
   942         if isinstance(control, Viewer):
  1008             control.ProcessEvent(event)
   961             control.ProcessEvent(event)
  1009         event.Skip()
   962         event.Skip()
  1010     
   963     
  1011     def OnDeleteMenu(self, event):
   964     def OnDeleteMenu(self, event):
  1012         window = self.FindFocus()
   965         window = self.FindFocus()
  1013         if window == self.ProjectTree:
   966         if window == self.TypesTree:
  1014             selected = self.ProjectTree.GetSelection()
   967             selected = self.TypesTree.GetSelection()
  1015             if selected.IsOk():
   968             if selected.IsOk():
  1016                 type = self.ProjectTree.GetPyData(selected)
   969                 type = self.TypesTree.GetPyData(selected)
  1017                 tagname = ""
   970                 tagname = ""
  1018                 if type == ITEM_DATATYPE:
   971                 if type == ITEM_DATATYPE:
  1019                     name = self.ProjectTree.GetItemText(selected)
   972                     name = self.TypesTree.GetItemText(selected)
  1020                     if not self.Controler.DataTypeIsUsed(name):
   973                     if not self.Controler.DataTypeIsUsed(name):
  1021                         self.Controler.ProjectRemoveDataType(name)
   974                         self.Controler.ProjectRemoveDataType(name)
  1022                         tagname = self.Controler.ComputeDataTypeName(name)
   975                         tagname = self.Controler.ComputeDataTypeName(name)
  1023                     else:
   976                     else:
  1024                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
   977                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1025                         message.ShowModal()
   978                         message.ShowModal()
  1026                         message.Destroy()
   979                         message.Destroy()
  1027                 elif type == ITEM_POU:
   980                 elif type == ITEM_POU:
  1028                     name = self.ProjectTree.GetItemText(selected)
   981                     name = self.TypesTree.GetItemText(selected)
  1029                     if not self.Controler.DataTypeIsUsed(name):
   982                     if not self.Controler.DataTypeIsUsed(name):
  1030                         self.Controler.ProjectRemoveDataType(name)
   983                         self.Controler.ProjectRemoveDataType(name)
  1031                         tagname = self.Controler.ComputeDataTypeName(name)
   984                         tagname = self.Controler.ComputeDataTypeName(name)
  1032                     else:
   985                     else:
  1033                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
   986                         message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1034                         message.ShowModal()
   987                         message.ShowModal()
  1035                         message.Destroy()
   988                         message.Destroy()
  1036                 elif type in [ITEM_TRANSITION, ITEM_ACTION]:
   989                 elif type in [ITEM_TRANSITION, ITEM_ACTION]:
  1037                     item = self.ProjectTree.GetItemParent(selected)
   990                     item = self.TypesTree.GetItemParent(selected)
  1038                     item_type = self.ProjectTree.GetPyData(item)
   991                     item_type = self.TypesTree.GetPyData(item)
  1039                     while item_type != ITEM_POU:
   992                     while item_type != ITEM_POU:
  1040                         item = self.ProjectTree.GetItemParent(item)
   993                         item = self.TypesTree.GetItemParent(item)
  1041                         item_type = self.ProjectTree.GetPyData(item)
   994                         item_type = self.TypesTree.GetPyData(item)
  1042                     pou_name = self.ProjectTree.GetItemText(item)
   995                     pou_name = self.TypesTree.GetItemText(item)
  1043                     if type == ITEM_TRANSITION:
   996                     if type == ITEM_TRANSITION:
  1044                         transition = self.ProjectTree.GetItemText(selected)
   997                         transition = self.TypesTree.GetItemText(selected)
  1045                         self.Controler.ProjectRemovePouTransition(pou_name, transition)
   998                         self.Controler.ProjectRemovePouTransition(pou_name, transition)
  1046                         tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
   999                         tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  1047                     elif type == ITEM_ACTION:
  1000                     elif type == ITEM_ACTION:
  1048                         action = self.ProjectTree.GetItemText(selected)
  1001                         action = self.TypesTree.GetItemText(selected)
  1049                         self.Controler.ProjectRemovePouAction(pou_name, action)
  1002                         self.Controler.ProjectRemovePouAction(pou_name, action)
  1050                         tagname = self.Controler.ComputePouActionName(pou_name, action)
  1003                         tagname = self.Controler.ComputePouActionName(pou_name, action)
  1051                 elif type == ITEM_CONFIGURATION:
  1004                 elif type == ITEM_CONFIGURATION:
  1052                     name = self.ProjectTree.GetItemText(selected)
  1005                     name = self.TypesTree.GetItemText(selected)
  1053                     self.Controler.ProjectRemoveConfiguration(name)
  1006                     self.Controler.ProjectRemoveConfiguration(name)
  1054                     tagname = self.Controler.ComputeConfigurationName(name)
  1007                     tagname = self.Controler.ComputeConfigurationName(name)
  1055                 elif type == ITEM_RESOURCE:
  1008                 elif type == ITEM_RESOURCE:
  1056                     resource = self.ProjectTree.GetItemText(selected)
  1009                     resource = self.TypesTree.GetItemText(selected)
  1057                     item = self.ProjectTree.GetItemParent(selected)
  1010                     item = self.TypesTree.GetItemParent(selected)
  1058                     item_type = self.ProjectTree.GetPyData(item)
  1011                     item_type = self.TypesTree.GetPyData(item)
  1059                     while item_type != ITEM_CONFIGURATION:
  1012                     while item_type != ITEM_CONFIGURATION:
  1060                         item = self.ProjectTree.GetItemParent(item)
  1013                         item = self.TypesTree.GetItemParent(item)
  1061                         item_type = self.ProjectTree.GetPyData(item)
  1014                         item_type = self.TypesTree.GetPyData(item)
  1062                     config_name = self.ProjectTree.GetItemText(item)
  1015                     config_name = self.TypesTree.GetItemText(item)
  1063                     self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  1016                     self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  1064                     tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  1017                     tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  1065                 idx = self.IsOpened(tagname)
  1018                 idx = self.IsOpened(tagname)
  1066                 if idx is not None:
  1019                 if idx is not None:
  1067                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1020                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1068                     self.DeletePage(idx)
  1021                     self.TabsOpened.DeletePage(idx)
  1069                 self.RefreshTitle()
  1022                 self.RefreshTitle()
  1070                 self.RefreshEditMenu()
  1023                 self.RefreshEditMenu()
  1071                 self.RefreshProjectTree()
  1024                 self.RefreshTypesTree()
  1072                 self.RefreshToolBar()
  1025                 self.RefreshToolBar()
  1073         elif isinstance(window, (Viewer, TextViewer)):
  1026         elif isinstance(window, (Viewer, TextViewer)):
  1074             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1027             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1075             event.m_keyCode = wx.WXK_DELETE
  1028             event.m_keyCode = wx.WXK_DELETE
  1076             window.ProcessEvent(event)
  1029             window.ProcessEvent(event)
  1080 #-------------------------------------------------------------------------------
  1033 #-------------------------------------------------------------------------------
  1081 #                      Project Editor Panels Management Functions
  1034 #                      Project Editor Panels Management Functions
  1082 #-------------------------------------------------------------------------------
  1035 #-------------------------------------------------------------------------------
  1083     
  1036     
  1084     def OnPouSelectedChanged(self, event):
  1037     def OnPouSelectedChanged(self, event):
  1085         if wx.VERSION < (2, 8, 0) or event.GetActive():
  1038         old_selected = self.TabsOpened.GetSelection()
  1086             old_selected = self.GetPageSelection()
  1039         if old_selected >= 0:
  1087             if old_selected >= 0:
  1040             self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1088                 self.GetPage(old_selected).ResetBuffer()
  1041         selected = event.GetSelection()
  1089             if wx.VERSION >= (2, 8, 0):
  1042         if selected >= 0:
  1090                 window = event.GetEventObject().GetViewer()
  1043             window = self.TabsOpened.GetPage(selected)
  1091             else:
  1044             self.SelectTypesTreeItem(window.GetTagName())
  1092                 selected = event.GetSelection()
  1045             window.RefreshView()
  1093                 if selected >= 0:
  1046             self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1094                     window = self.GetPage(selected)
  1047             self.RefreshFileMenu()
  1095                 else:
  1048             self.RefreshEditMenu()
  1096                     window = None
  1049             self.RefreshToolBar()
  1097             if window:
       
  1098                 self.SelectProjectTreeItem(window.GetTagName())
       
  1099                 window.RefreshView()
       
  1100                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
       
  1101                 self.RefreshFileMenu()
       
  1102                 self.RefreshEditMenu()
       
  1103                 self.RefreshToolBar()
       
  1104         event.Skip()
  1050         event.Skip()
  1105 
  1051 
  1106     def RefreshEditor(self, variablepanel = True):
  1052     def RefreshEditor(self, variablepanel = True):
  1107         selected = self.GetPageSelection()
  1053         selected = self.TabsOpened.GetSelection()
  1108         if selected != -1:
  1054         if selected != -1:
  1109             window = self.GetPage(selected)
  1055             window = self.TabsOpened.GetPage(selected)
  1110             window.RefreshView()
  1056             window.RefreshView()
  1111             if variablepanel:
  1057             if variablepanel:
  1112                 self.RefreshVariablePanel(window.GetTagName())
  1058                 self.RefreshVariablePanel(window.GetTagName())
  1113 
  1059 
  1114     def RefreshVariablePanel(self, tagname):
  1060     def RefreshVariablePanel(self, tagname):
  1115         self.VariablePanelIndexer.RefreshVariablePanel(tagname)
  1061         self.VariablePanelIndexer.RefreshVariablePanel(tagname)
  1116 
  1062 
  1117     def RefreshEditorNames(self, old_tagname, new_tagname):
  1063     def RefreshEditorNames(self, old_tagname, new_tagname):
  1118         for i in xrange(self.GetPageCount()):
  1064         for i in xrange(self.TabsOpened.GetPageCount()):
  1119             editor = self.GetPage(i)
  1065             editor = self.TabsOpened.GetPage(i)
  1120             if editor.GetTagName() == old_tagname:
  1066             if editor.GetTagName() == old_tagname:
  1121                 editor.SetTagName(new_tagname)
  1067                 editor.SetTagName(new_tagname)
  1122         self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname)
  1068         self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname)
  1123 
  1069 
  1124     def IsOpened(self, tagname):
  1070     def IsOpened(self, tagname):
  1125         for idx in xrange(self.GetPageCount()):
  1071         for idx in xrange(self.TabsOpened.GetPageCount()):
  1126             if self.GetPage(idx).IsViewing(tagname):
  1072             if self.TabsOpened.GetPage(idx).IsViewing(tagname):
  1127                 return idx
  1073                 return idx
  1128         return None
  1074         return None
  1129 
  1075 
  1130     def RefreshPageTitles(self):
  1076     def RefreshPageTitles(self):
  1131         for idx in xrange(self.GetPageCount()):
  1077         for idx in xrange(self.TabsOpened.GetPageCount()):
  1132             window = self.GetPage(idx)
  1078             window = self.TabsOpened.GetPage(idx)
  1133             words = window.GetTagName().split("::")
  1079             words = window.GetTagName().split("::")
  1134             if words[0] == "P":
  1080             if words[0] == "P":
  1135                 pou_type = self.Controler.GetEditedElementType(window.GetTagName())[1].upper()
  1081                 pou_type = self.Controler.GetEditedElementType(window.GetTagName())[1].upper()
  1136                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName())
  1082                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName())
  1137                 self.SetPageBitmap(idx, GenerateBitmap(pou_type, pou_body_type))
  1083                 self.SetPageBitmap(idx, GenerateBitmap(pou_type, pou_body_type))
  1145                 self.SetPageBitmap(idx, GenerateBitmap("CONFIGURATION"))
  1091                 self.SetPageBitmap(idx, GenerateBitmap("CONFIGURATION"))
  1146             elif words[0] == "R":
  1092             elif words[0] == "R":
  1147                 self.SetPageBitmap(idx, GenerateBitmap("RESOURCE"))
  1093                 self.SetPageBitmap(idx, GenerateBitmap("RESOURCE"))
  1148             elif words[0] == "D":
  1094             elif words[0] == "D":
  1149                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1095                 self.SetPageBitmap(idx, GenerateBitmap("DATATYPE"))
  1150             self.SetPageText(idx, "-".join(words[1:]))
  1096             self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1151 
  1097 
  1152 
  1098 
  1153 #-------------------------------------------------------------------------------
  1099 #-------------------------------------------------------------------------------
  1154 #                         Project Tree Management Functions
  1100 #                         Project Tree Management Functions
  1155 #-------------------------------------------------------------------------------
  1101 #-------------------------------------------------------------------------------
  1156 
  1102 
  1157     def RefreshProjectTree(self):
  1103     def RefreshTypesTree(self):
  1158         infos = self.Controler.GetProjectInfos()
  1104         infos = self.Controler.GetProjectInfos()
  1159         root = self.ProjectTree.GetRootItem()
  1105         root = self.TypesTree.GetRootItem()
  1160         if not root.IsOk():
  1106         if not root.IsOk():
  1161             root = self.ProjectTree.AddRoot(infos["name"])
  1107             root = self.TypesTree.AddRoot(infos["name"])
  1162         self.GenerateTreeBranch(root, infos)
  1108         self.GenerateTypesTreeBranch(root, infos)
  1163         self.ProjectTree.Expand(self.ProjectTree.GetRootItem())
  1109         self.TypesTree.Expand(self.TypesTree.GetRootItem())
  1164 
  1110 
  1165     def GenerateTreeBranch(self, root, infos):
  1111     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1166         to_delete = []
  1112         to_delete = []
  1167         self.ProjectTree.SetItemText(root, infos["name"])
  1113         self.TypesTree.SetItemText(root, infos["name"])
  1168         self.ProjectTree.SetPyData(root, infos["type"])
  1114         self.TypesTree.SetPyData(root, infos["type"])
  1169         if infos["tagname"] in self.Errors:
  1115         if infos.get("tagname", None) in self.Errors:
  1170             self.ProjectTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
  1116             self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
  1171             self.ProjectTree.SetItemTextColour(root, wx.RED)
  1117             self.TypesTree.SetItemTextColour(root, wx.RED)
  1172         else:
  1118         else:
  1173             self.ProjectTree.SetItemBackgroundColour(root, wx.WHITE)
  1119             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
  1174             self.ProjectTree.SetItemTextColour(root, wx.BLACK)
  1120             self.TypesTree.SetItemTextColour(root, wx.BLACK)
  1175         if infos["type"] == ITEM_POU :
  1121         if infos["type"] == ITEM_POU:
  1176             self.ProjectTree.SetItemImage(root,self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1122             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1177         else:
  1123         else:
  1178             self.ProjectTree.SetItemImage(root,self.TreeImageDict[infos["type"]])      
  1124             self.TypesTree.SetItemImage(root, self.TypesTreeImageDict[infos["type"]])      
  1179             
  1125             
  1180         if wx.VERSION >= (2, 6, 0):
  1126         if wx.VERSION >= (2, 6, 0):
  1181             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1127             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1182         else:
  1128         else:
  1183             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1129             item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1184         for values in infos["values"]:
  1130         for values in infos["values"]:
  1185             if not item.IsOk():
  1131             if not item.IsOk():
  1186                 item = self.ProjectTree.AppendItem(root, "")
  1132                 item = self.TypesTree.AppendItem(root, "")
  1187                 if wx.Platform != '__WXMSW__':
  1133                 if wx.Platform != '__WXMSW__':
  1188                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1134                     item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1189             self.GenerateTreeBranch(item, values)
  1135             self.GenerateTypesTreeBranch(item, values)
  1190             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1136             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1191         while item.IsOk():
  1137         while item.IsOk():
  1192             to_delete.append(item)
  1138             to_delete.append(item)
  1193             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1139             item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1194         for item in to_delete:
  1140         for item in to_delete:
  1195             self.ProjectTree.Delete(item)
  1141             self.TypesTree.Delete(item)
  1196 
  1142 
  1197     def SelectProjectTreeItem(self, tagname):
  1143     def SelectTypesTreeItem(self, tagname):
  1198         if self.ProjectTree:
  1144         if self.TypesTree:
  1199             root = self.ProjectTree.GetRootItem()
  1145             root = self.TypesTree.GetRootItem()
  1200             words = tagname.split("::")
  1146             words = tagname.split("::")
  1201             if words[0] == "D":
  1147             if words[0] == "D":
  1202                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1148                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1203             elif words[0] == "P":
  1149             elif words[0] == "P":
  1204                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
  1150                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU)])
  1205             elif words[0] == "T":
  1151             elif words[0] == "T":
  1206                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
  1152                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
  1207             elif words[0] == "A":
  1153             elif words[0] == "A":
  1208                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
  1154                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
  1209             elif words[0] == "C":
  1155             elif words[0] == "C":
  1210                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
  1156                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
  1211             elif words[0] == "R":
  1157             elif words[0] == "R":
  1212                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1158                 return self.RecursiveTypesTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
  1213         return False
  1159         return False
  1214 
  1160 
  1215     def RecursiveProjectTreeItemSelection(self, root, items):
  1161     def RecursiveTypesTreeItemSelection(self, root, items):
  1216         found = False
  1162         found = False
  1217         if self.ProjectTree:
  1163         if self.TypesTree:
  1218             if wx.VERSION >= (2, 6, 0):
  1164             if wx.VERSION >= (2, 6, 0):
  1219                 item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1165                 item, root_cookie = self.TypesTree.GetFirstChild(root)
  1220             else:
  1166             else:
  1221                 item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
  1167                 item, root_cookie = self.TypesTree.GetFirstChild(root, 0)
  1222             while item.IsOk() and not found:
  1168             while item.IsOk() and not found:
  1223                 if (self.ProjectTree.GetItemText(item), self.ProjectTree.GetPyData(item)) == items[0]:
  1169                 if (self.TypesTree.GetItemText(item), self.TypesTree.GetPyData(item)) == items[0]:
  1224                     if len(items) == 1:
  1170                     if len(items) == 1:
  1225                         self.SelectedItem = item
  1171                         self.SelectedItem = item
  1226                         self.ProjectTree.SelectItem(item)
  1172                         self.TypesTree.SelectItem(item)
  1227                         wx.CallAfter(self.ResetSelectedItem)
  1173                         wx.CallAfter(self.ResetSelectedItem)
  1228                         return True
  1174                         return True
  1229                     else:
  1175                     else:
  1230                         found = self.RecursiveProjectTreeItemSelection(item, items[1:])
  1176                         found = self.RecursiveTypesTreeItemSelection(item, items[1:])
  1231                 else:
  1177                 else:
  1232                     found = self.RecursiveProjectTreeItemSelection(item, items)
  1178                     found = self.RecursiveTypesTreeItemSelection(item, items)
  1233                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1179                 item, root_cookie = self.TypesTree.GetNextChild(root, root_cookie)
  1234         return found
  1180         return found
  1235 
  1181 
  1236     def OnProjectTreeBeginDrag(self, event):
  1182     def OnTypesTreeBeginDrag(self, event):
  1237         if wx.Platform == '__WXMSW__':
  1183         if wx.Platform == '__WXMSW__':
  1238             self.SelectedItem = event.GetItem()
  1184             self.SelectedItem = event.GetItem()
  1239         if self.SelectedItem is not None and self.ProjectTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1185         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1240             block_name = self.ProjectTree.GetItemText(self.SelectedItem)
  1186             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1241             block_type = self.Controler.GetPouType(block_name)
  1187             block_type = self.Controler.GetPouType(block_name)
  1242             if block_type != "program":
  1188             if block_type != "program":
  1243                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1189                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1244                 dragSource = wx.DropSource(self.ProjectTree)
  1190                 dragSource = wx.DropSource(self.TypesTree)
  1245                 dragSource.SetData(data)
  1191                 dragSource.SetData(data)
  1246                 dragSource.DoDragDrop()
  1192                 dragSource.DoDragDrop()
  1247             self.ResetSelectedItem()
  1193             self.ResetSelectedItem()
  1248 
  1194 
  1249     def OnProjectTreeItemBeginEdit(self, event):
  1195     def OnTypesTreeItemBeginEdit(self, event):
  1250         selected = event.GetItem()
  1196         selected = event.GetItem()
  1251         if self.ProjectTree.GetPyData(selected) in ITEMS_UNEDITABLE:
  1197         if self.TypesTree.GetPyData(selected) in ITEMS_UNEDITABLE:
  1252             event.Veto()
  1198             event.Veto()
  1253         else:
  1199         else:
  1254             event.Skip()
  1200             event.Skip()
  1255 
  1201 
  1256     def OnProjectTreeItemEndEdit(self, event):
  1202     def OnTypesTreeItemEndEdit(self, event):
  1257         message = None
  1203         message = None
  1258         abort = False
  1204         abort = False
  1259         new_name = event.GetLabel()
  1205         new_name = event.GetLabel()
  1260         if new_name != "":
  1206         if new_name != "":
  1261             if not TestIdentifier(new_name):
  1207             if not TestIdentifier(new_name):
  1262                 message = "\"%s\" is not a valid identifier!"%new_name
  1208                 message = "\"%s\" is not a valid identifier!"%new_name
  1263             elif new_name.upper() in IEC_KEYWORDS:
  1209             elif new_name.upper() in IEC_KEYWORDS:
  1264                 message = "\"%s\" is a keyword. It can't be used!"%new_name
  1210                 message = "\"%s\" is a keyword. It can't be used!"%new_name
  1265             else:
  1211             else:
  1266                 item = event.GetItem()
  1212                 item = event.GetItem()
  1267                 old_name = self.ProjectTree.GetItemText(item)
  1213                 old_name = self.TypesTree.GetItemText(item)
  1268                 itemtype = self.ProjectTree.GetPyData(item)
  1214                 itemtype = self.TypesTree.GetPyData(item)
  1269                 if itemtype == ITEM_PROJECT:
  1215                 if itemtype == ITEM_PROJECT:
  1270                     self.Controler.SetProjectProperties(name = new_name)
  1216                     self.Controler.SetProjectProperties(name = new_name)
  1271                 elif itemtype == ITEM_DATATYPE:
  1217                 elif itemtype == ITEM_DATATYPE:
  1272                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1218                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1273                         message = "\"%s\" data type already exists!"%new_name
  1219                         message = "\"%s\" data type already exists!"%new_name
  1290                         self.Controler.ChangePouName(old_name, new_name)
  1236                         self.Controler.ChangePouName(old_name, new_name)
  1291                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1237                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1292                                                 self.Controler.ComputePouName(new_name))
  1238                                                 self.Controler.ComputePouName(new_name))
  1293                         self.RefreshPageTitles()
  1239                         self.RefreshPageTitles()
  1294                 elif itemtype == ITEM_TRANSITION:
  1240                 elif itemtype == ITEM_TRANSITION:
  1295                     parent = self.ProjectTree.GetItemParent(item)
  1241                     parent = self.TypesTree.GetItemParent(item)
  1296                     parent_type = self.ProjectTree.GetPyData(parent)
  1242                     parent_type = self.TypesTree.GetPyData(parent)
  1297                     while parent_type != ITEM_POU:
  1243                     while parent_type != ITEM_POU:
  1298                         parent = self.ProjectTree.GetItemParent(parent)
  1244                         parent = self.TypesTree.GetItemParent(parent)
  1299                         parent_type = self.ProjectTree.GetPyData(parent)
  1245                         parent_type = self.TypesTree.GetPyData(parent)
  1300                     pou_name = self.ProjectTree.GetItemText(parent)
  1246                     pou_name = self.TypesTree.GetItemText(parent)
  1301                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1247                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1302                         message = "A pou with \"%s\" as name exists!"%new_name
  1248                         message = "A pou with \"%s\" as name exists!"%new_name
  1303                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1249                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1304                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1250                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1305                     else:
  1251                     else:
  1306                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1252                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1307                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1253                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1308                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1254                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1309                         self.RefreshPageTitles()
  1255                         self.RefreshPageTitles()
  1310                 elif itemtype == ITEM_ACTION:
  1256                 elif itemtype == ITEM_ACTION:
  1311                     parent = self.ProjectTree.GetItemParent(item)
  1257                     parent = self.TypesTree.GetItemParent(item)
  1312                     parent_type = self.ProjectTree.GetPyData(parent)
  1258                     parent_type = self.TypesTree.GetPyData(parent)
  1313                     while parent_type != ITEM_POU:
  1259                     while parent_type != ITEM_POU:
  1314                         parent = self.ProjectTree.GetItemParent(parent)
  1260                         parent = self.TypesTree.GetItemParent(parent)
  1315                         parent_type = self.ProjectTree.GetPyData(parent)
  1261                         parent_type = self.TypesTree.GetPyData(parent)
  1316                     pou_name = self.ProjectTree.GetItemText(parent)
  1262                     pou_name = self.TypesTree.GetItemText(parent)
  1317                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1263                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1318                         message = "A pou with \"%s\" as name exists!"%new_name
  1264                         message = "A pou with \"%s\" as name exists!"%new_name
  1319                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1265                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1320                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1266                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1321                     else:
  1267                     else:
  1341                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1287                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1342                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1288                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1343                                                 self.Controler.ComputeConfigurationName(new_name))
  1289                                                 self.Controler.ComputeConfigurationName(new_name))
  1344                         self.RefreshPageTitles()
  1290                         self.RefreshPageTitles()
  1345                 elif itemtype == ITEM_RESOURCE:
  1291                 elif itemtype == ITEM_RESOURCE:
  1346                     parent = self.ProjectTree.GetItemParent(item)
  1292                     parent = self.TypesTree.GetItemParent(item)
  1347                     parent_type = self.ProjectTree.GetPyData(parent)
  1293                     parent_type = self.TypesTree.GetPyData(parent)
  1348                     while parent_type != ITEM_CONFIGURATION:
  1294                     while parent_type != ITEM_CONFIGURATION:
  1349                         parent = self.ProjectTree.GetItemParent(parent)
  1295                         parent = self.TypesTree.GetItemParent(parent)
  1350                         parent_type = self.ProjectTree.GetPyData(parent)
  1296                         parent_type = self.TypesTree.GetPyData(parent)
  1351                     config_name = self.ProjectTree.GetItemText(parent)
  1297                     config_name = self.TypesTree.GetItemText(parent)
  1352                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1298                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1353                         message = "\"%s\" config already exists!"%new_name
  1299                         message = "\"%s\" config already exists!"%new_name
  1354                         abort = True
  1300                         abort = True
  1355                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1301                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1356                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1302                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1371                 if message:
  1317                 if message:
  1372                     messageDialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
  1318                     messageDialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
  1373                     messageDialog.ShowModal()
  1319                     messageDialog.ShowModal()
  1374                     messageDialog.Destroy()
  1320                     messageDialog.Destroy()
  1375                 item = event.GetItem()
  1321                 item = event.GetItem()
  1376                 wx.CallAfter(self.ProjectTree.EditLabel, item)
  1322                 wx.CallAfter(self.TypesTree.EditLabel, item)
  1377                 event.Veto()
  1323                 event.Veto()
  1378             else:
  1324             else:
  1379                 wx.CallAfter(self.RefreshProjectTree)
  1325                 wx.CallAfter(self.RefreshTypesTree)
  1380                 selected = self.GetPageSelection()
  1326                 selected = self.TabsOpened.GetSelection()
  1381                 if selected != -1:
  1327                 if selected != -1:
  1382                     self.GetPage(selected).RefreshView()
  1328                     self.TabsOpened.GetPage(selected).RefreshView()
  1383                 event.Skip()
  1329                 event.Skip()
  1384     
  1330     
  1385     def OnProjectTreeItemActivated(self, event):
  1331     def OnTypesTreeItemActivated(self, event):
  1386         selected = event.GetItem()
  1332         selected = event.GetItem()
  1387         if self.ProjectTree.IsExpanded(selected):
  1333         if self.TypesTree.IsExpanded(selected):
  1388             self.ProjectTree.Collapse(selected)
  1334             self.TypesTree.Collapse(selected)
  1389         else:
  1335         else:
  1390             self.ProjectTree.Expand(selected)
  1336             self.TypesTree.Expand(selected)
  1391         name = self.ProjectTree.GetItemText(selected)
  1337         name = self.TypesTree.GetItemText(selected)
  1392         data = self.ProjectTree.GetPyData(selected)
  1338         data = self.TypesTree.GetPyData(selected)
  1393         if name == "Properties":
  1339         if name == "Properties":
  1394             self.ShowProperties()
  1340             self.ShowProperties()
  1395         if data == ITEM_DATATYPE:
  1341         if data == ITEM_DATATYPE:
  1396             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1342             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1397         elif data == ITEM_POU:
  1343         elif data == ITEM_POU:
  1398             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1344             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1399         elif data == ITEM_CONFIGURATION:
  1345         elif data == ITEM_CONFIGURATION:
  1400             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1346             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name))
  1401         elif data == ITEM_RESOURCE:
  1347         elif data == ITEM_RESOURCE:
  1402             item = self.ProjectTree.GetItemParent(selected)
  1348             item = self.TypesTree.GetItemParent(selected)
  1403             item_type = self.ProjectTree.GetPyData(item)
  1349             item_type = self.TypesTree.GetPyData(item)
  1404             while item_type != ITEM_CONFIGURATION:
  1350             while item_type != ITEM_CONFIGURATION:
  1405                 item = self.ProjectTree.GetItemParent(item)
  1351                 item = self.TypesTree.GetItemParent(item)
  1406                 item_type = self.ProjectTree.GetPyData(item)
  1352                 item_type = self.TypesTree.GetPyData(item)
  1407             config_name = self.ProjectTree.GetItemText(item)
  1353             config_name = self.TypesTree.GetItemText(item)
  1408             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
  1354             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name))
  1409         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1355         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1410             item = self.ProjectTree.GetItemParent(selected)
  1356             item = self.TypesTree.GetItemParent(selected)
  1411             item_type = self.ProjectTree.GetPyData(item)
  1357             item_type = self.TypesTree.GetPyData(item)
  1412             while item_type != ITEM_POU:
  1358             while item_type != ITEM_POU:
  1413                 item = self.ProjectTree.GetItemParent(item)
  1359                 item = self.TypesTree.GetItemParent(item)
  1414                 item_type = self.ProjectTree.GetPyData(item)
  1360                 item_type = self.TypesTree.GetPyData(item)
  1415             pou_name = self.ProjectTree.GetItemText(item)
  1361             pou_name = self.TypesTree.GetItemText(item)
  1416             if data == ITEM_TRANSITION:
  1362             if data == ITEM_TRANSITION:
  1417                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1363                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1418             elif data == ITEM_ACTION:
  1364             elif data == ITEM_ACTION:
  1419                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1365                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1420             self.EditProjectElement(data, tagname)
  1366             self.EditProjectElement(data, tagname)
  1421         event.Skip()
  1367         event.Skip()
  1422     
  1368     
  1423     def ProjectTreeItemSelect(self, select_item):
  1369     def TypesTreeItemSelect(self, select_item):
  1424         name = self.ProjectTree.GetItemText(select_item)
  1370         name = self.TypesTree.GetItemText(select_item)
  1425         data = self.ProjectTree.GetPyData(select_item)
  1371         data = self.TypesTree.GetPyData(select_item)
  1426         if data == ITEM_DATATYPE:
  1372         if data == ITEM_DATATYPE:
  1427             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True)
  1373             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name), True)
  1428         elif data == ITEM_POU:
  1374         elif data == ITEM_POU:
  1429             self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
  1375             self.EditProjectElement(data, self.Controler.ComputePouName(name), True)
  1430         elif data == ITEM_CONFIGURATION:
  1376         elif data == ITEM_CONFIGURATION:
  1431             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1377             self.EditProjectElement(data, self.Controler.ComputeConfigurationName(name), True)
  1432         elif data == ITEM_RESOURCE:
  1378         elif data == ITEM_RESOURCE:
  1433             item = self.ProjectTree.GetItemParent(select_item)
  1379             item = self.TypesTree.GetItemParent(select_item)
  1434             item_type = self.ProjectTree.GetPyData(item)
  1380             item_type = self.TypesTree.GetPyData(item)
  1435             while item_type != ITEM_CONFIGURATION:
  1381             while item_type != ITEM_CONFIGURATION:
  1436                 item = self.ProjectTree.GetItemParent(item)
  1382                 item = self.TypesTree.GetItemParent(item)
  1437                 item_type = self.ProjectTree.GetPyData(item)
  1383                 item_type = self.TypesTree.GetPyData(item)
  1438             config_name = self.ProjectTree.GetItemText(item)
  1384             config_name = self.TypesTree.GetItemText(item)
  1439             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True)
  1385             self.EditProjectElement(data, self.Controler.ComputeConfigurationResourceName(config_name, name), True)
  1440         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1386         elif data in [ITEM_TRANSITION, ITEM_ACTION]:
  1441             item = self.ProjectTree.GetItemParent(select_item)
  1387             item = self.TypesTree.GetItemParent(select_item)
  1442             item_type = self.ProjectTree.GetPyData(item)
  1388             item_type = self.TypesTree.GetPyData(item)
  1443             while item_type != ITEM_POU:
  1389             while item_type != ITEM_POU:
  1444                 item = self.ProjectTree.GetItemParent(item)
  1390                 item = self.TypesTree.GetItemParent(item)
  1445                 item_type = self.ProjectTree.GetPyData(item)
  1391                 item_type = self.TypesTree.GetPyData(item)
  1446             pou_name = self.ProjectTree.GetItemText(item)
  1392             pou_name = self.TypesTree.GetItemText(item)
  1447             if data == ITEM_TRANSITION:
  1393             if data == ITEM_TRANSITION:
  1448                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1394                 tagname = self.Controler.ComputePouTransitionName(pou_name, name)
  1449             elif data == ITEM_ACTION:
  1395             elif data == ITEM_ACTION:
  1450                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1396                 tagname = self.Controler.ComputePouActionName(pou_name, name)
  1451             self.EditProjectElement(data, tagname, True)
  1397             self.EditProjectElement(data, tagname, True)
  1452     
  1398     
  1453     def OnProjectTreeLeftUp(self, event):
  1399     def OnTypesTreeLeftUp(self, event):
  1454         if self.SelectedItem is not None:
  1400         if self.SelectedItem is not None:
  1455             self.ProjectTree.SelectItem(self.SelectedItem)
  1401             self.TypesTree.SelectItem(self.SelectedItem)
  1456             self.ProjectTreeItemSelect(self.SelectedItem)
  1402             self.TypesTreeItemSelect(self.SelectedItem)
  1457             wx.CallAfter(self.ResetSelectedItem)
  1403             wx.CallAfter(self.ResetSelectedItem)
  1458         event.Skip()
  1404         event.Skip()
  1459     
  1405     
  1460     def OnProjectTreeItemSelected(self, event):
  1406     def OnTypesTreeItemSelected(self, event):
  1461         self.ProjectTreeItemSelect(event.GetItem())
  1407         self.TypesTreeItemSelect(event.GetItem())
  1462         event.Skip()
  1408         event.Skip()
  1463     
  1409     
  1464     def OnProjectTreeItemChanging(self, event):
  1410     def OnTypesTreeItemChanging(self, event):
  1465         if self.ProjectTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1411         if self.TypesTree.GetPyData(event.GetItem()) not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1466             self.SelectedItem = event.GetItem()
  1412             self.SelectedItem = event.GetItem()
  1467             event.Veto()
  1413             event.Veto()
  1468         else:
  1414         else:
  1469             event.Skip()
  1415             event.Skip()
  1470     
  1416     
  1471     def EditProjectElement(self, elementtype, tagname, onlyopened = False):
  1417     def EditProjectElement(self, elementtype, tagname, onlyopened = False):
  1472         openedidx = self.IsOpened(tagname)
  1418         openedidx = self.IsOpened(tagname)
  1473         if openedidx is not None:
  1419         if openedidx is not None:
  1474             old_selected = self.GetPageSelection()
  1420             old_selected = self.TabsOpened.GetSelection()
  1475             if old_selected != openedidx:
  1421             if old_selected != openedidx:
  1476                 if old_selected >= 0:
  1422                 if old_selected >= 0:
  1477                     self.GetPage(old_selected).ResetBuffer()
  1423                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1478                 self.SetPageSelection(openedidx)
  1424                 self.TabsOpened.SetSelection(openedidx)
  1479             self.GetPage(openedidx).RefreshView()
  1425             self.TabsOpened.GetPage(openedidx).RefreshView()
  1480             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1426             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1481             self.RefreshPageTitles()
  1427             self.RefreshPageTitles()
  1482             self.RefreshFileMenu()
  1428             self.RefreshFileMenu()
  1483             self.RefreshEditMenu()
  1429             self.RefreshEditMenu()
  1484             self.RefreshToolBar()
  1430             self.RefreshToolBar()
  1485         elif not onlyopened:
  1431         elif not onlyopened:
  1486             if wx.VERSION >= (2, 8, 0):
       
  1487                 if elementtype == ITEM_CONFIGURATION:
       
  1488                     new_window = MDIConfigurationEditor(self, tagname, self, self.Controler)
       
  1489                 elif elementtype == ITEM_RESOURCE:
       
  1490                     new_window = MDIResourceEditor(self, tagname, self, self.Controler)
       
  1491                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
  1492                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
       
  1493                     if bodytype == "FBD":
       
  1494                         new_window = MDIViewer(self, tagname, self, self.Controler)
       
  1495                         new_window.GetViewer().RefreshScaling(False)
       
  1496                     elif bodytype == "LD":
       
  1497                         new_window = LD_MDIViewer(self, tagname, self, self.Controler)
       
  1498                         new_window.GetViewer().RefreshScaling(False)
       
  1499                     elif bodytype == "SFC":
       
  1500                         new_window = SFC_MDIViewer(self, tagname, self, self.Controler)
       
  1501                         new_window.GetViewer().RefreshScaling(False)
       
  1502                     else:
       
  1503                         new_window = TextMDIViewer(self, tagname, self, self.Controler)
       
  1504                         viewer = new_window.GetViewer()
       
  1505                         viewer.SetTextSyntax(elementtype)
       
  1506                         if bodytype == "IL":
       
  1507                             viewer.SetKeywords(IL_KEYWORDS)
       
  1508                         else:
       
  1509                             viewer.SetKeywords(ST_KEYWORDS)
       
  1510                 elif elementtype == ITEM_DATATYPE:
       
  1511                     new_window = MDIDataTypeEditor(self, tagname, self, self.Controler)
       
  1512                 new_window.Bind(wx.EVT_ACTIVATE, self.OnPouSelectedChanged)
       
  1513                 new_window.Bind(wx.EVT_CLOSE, self.OnPageClose)
       
  1514                 new_window.Layout()
       
  1515             else:
       
  1516                 if elementtype == ITEM_CONFIGURATION:
       
  1517                     new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1518                     self.TabsOpened.AddPage(new_window, "")
       
  1519                 elif elementtype == ITEM_RESOURCE:
       
  1520                     new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1521                     self.TabsOpened.AddPage(new_window, "")
       
  1522                 elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
  1523                     bodytype = self.Controler.GetEditedElementBodyType(tagname)
       
  1524                     if bodytype == "FBD":
       
  1525                         new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1526                         new_window.RefreshScaling(False)
       
  1527                     elif bodytype == "LD":
       
  1528                         new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1529                         new_window.RefreshScaling(False)
       
  1530                     elif bodytype == "SFC":
       
  1531                         new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1532                         new_window.RefreshScaling(False)
       
  1533                     else:
       
  1534                         new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
       
  1535                         new_window.SetTextSyntax(elementtype)
       
  1536                         if bodytype == "IL":
       
  1537                             new_window.SetKeywords(IL_KEYWORDS)
       
  1538                         else:
       
  1539                             new_window.SetKeywords(ST_KEYWORDS)
       
  1540                     self.TabsOpened.AddPage(new_window, "")
       
  1541                 elif elementtype == ITEM_DATATYPE:
       
  1542                     new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1543                     self.TabsOpened.AddPage(new_window, "")
       
  1544             if elementtype == ITEM_CONFIGURATION:
  1432             if elementtype == ITEM_CONFIGURATION:
       
  1433                 new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1434                 self.TabsOpened.AddPage(new_window, "")
  1545                 self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
  1435                 self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
  1546             elif elementtype == ITEM_RESOURCE:
  1436             elif elementtype == ITEM_RESOURCE:
       
  1437                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1438                 self.TabsOpened.AddPage(new_window, "")
  1547                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1439                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1548             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1440             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
  1441                 bodytype = self.Controler.GetEditedElementBodyType(tagname)
       
  1442                 if bodytype == "FBD":
       
  1443                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1444                     new_window.RefreshScaling(False)
       
  1445                 elif bodytype == "LD":
       
  1446                     new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1447                     new_window.RefreshScaling(False)
       
  1448                 elif bodytype == "SFC":
       
  1449                     new_window = SFC_Viewer(self.TabsOpened, tagname, self, self.Controler)
       
  1450                     new_window.RefreshScaling(False)
       
  1451                 else:
       
  1452                     new_window = TextViewer(self.TabsOpened, tagname, self, self.Controler)
       
  1453                     new_window.SetTextSyntax(elementtype)
       
  1454                     if bodytype == "IL":
       
  1455                         new_window.SetKeywords(IL_KEYWORDS)
       
  1456                     else:
       
  1457                         new_window.SetKeywords(ST_KEYWORDS)
       
  1458                 self.TabsOpened.AddPage(new_window, "")
  1549                 words = tagname.split("::")
  1459                 words = tagname.split("::")
  1550                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1460                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
       
  1461             elif elementtype == ITEM_DATATYPE:
       
  1462                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1463                 self.TabsOpened.AddPage(new_window, "")
  1551             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1464             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1552             openedidx = self.IsOpened(tagname)
  1465             openedidx = self.IsOpened(tagname)
  1553             old_selected = self.GetPageSelection()
  1466             old_selected = self.TabsOpened.GetSelection()
  1554             if old_selected != openedidx:
  1467             if old_selected != openedidx:
  1555                 if old_selected >= 0:
  1468                 if old_selected >= 0:
  1556                     self.GetPage(old_selected).ResetBuffer()
  1469                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1557             for i in xrange(self.GetPageCount()):
  1470             for i in xrange(self.TabsOpened.GetPageCount()):
  1558                 window = self.GetPage(i)
  1471                 window = self.TabsOpened.GetPage(i)
  1559                 if window.GetTagName() == tagname:
  1472                 if window.GetTagName() == tagname:
  1560                     self.SetPageSelection(i)
  1473                     self.TabsOpened.SetSelection(i)
  1561                     window.RefreshView()
  1474                     window.RefreshView()
  1562                     window.SetFocus()
  1475                     window.SetFocus()
  1563                     self.RefreshPageTitles()
  1476                     self.RefreshPageTitles()
  1564                     self.RefreshFileMenu()
  1477                     self.RefreshFileMenu()
  1565                     self.RefreshEditMenu()
  1478                     self.RefreshEditMenu()
  1566                     self.RefreshToolBar()
  1479                     self.RefreshToolBar()
  1567     
  1480     
  1568     def OnProjectTreeRightUp(self, event):
  1481     def OnTypesTreeRightUp(self, event):
  1569         if wx.Platform == '__WXMSW__':
  1482         if wx.Platform == '__WXMSW__':
  1570             item = event.GetItem()
  1483             item = event.GetItem()
  1571         else:
  1484         else:
  1572             item = self.ProjectTree.GetSelection()
  1485             item = self.TypesTree.GetSelection()
  1573         name = self.ProjectTree.GetItemText(item)
  1486         name = self.TypesTree.GetItemText(item)
  1574         type = self.ProjectTree.GetPyData(item)
  1487         type = self.TypesTree.GetPyData(item)
  1575         if type == ITEM_POU:
  1488         if type == ITEM_POU:
  1576             menu = wx.Menu(title='')
  1489             menu = wx.Menu(title='')
  1577             if self.Controler.GetPouBodyType(name) == "SFC":
  1490             if self.Controler.GetPouBodyType(name) == "SFC":
  1578                 new_id = wx.NewId()
  1491                 new_id = wx.NewId()
  1579                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1492                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1629                 self.PopupMenu(menu)
  1542                 self.PopupMenu(menu)
  1630             elif name == "Transitions":
  1543             elif name == "Transitions":
  1631                 menu = wx.Menu(title='')
  1544                 menu = wx.Menu(title='')
  1632                 new_id = wx.NewId()
  1545                 new_id = wx.NewId()
  1633                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1546                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1634                 parent = self.ProjectTree.GetItemParent(item)
  1547                 parent = self.TypesTree.GetItemParent(item)
  1635                 parent_type = self.ProjectTree.GetPyData(parent)
  1548                 parent_type = self.TypesTree.GetPyData(parent)
  1636                 while parent_type != ITEM_POU:
  1549                 while parent_type != ITEM_POU:
  1637                     parent = self.ProjectTree.GetItemParent(parent)
  1550                     parent = self.TypesTree.GetItemParent(parent)
  1638                     parent_type = self.ProjectTree.GetPyData(parent)
  1551                     parent_type = self.TypesTree.GetPyData(parent)
  1639                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1552                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1640                 self.PopupMenu(menu)
  1553                 self.PopupMenu(menu)
  1641             elif name == "Actions":
  1554             elif name == "Actions":
  1642                 menu = wx.Menu(title='')
  1555                 menu = wx.Menu(title='')
  1643                 new_id = wx.NewId()
  1556                 new_id = wx.NewId()
  1644                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1557                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1645                 parent = self.ProjectTree.GetItemParent(item)
  1558                 parent = self.TypesTree.GetItemParent(item)
  1646                 parent_type = self.ProjectTree.GetPyData(parent)
  1559                 parent_type = self.TypesTree.GetPyData(parent)
  1647                 while parent_type != ITEM_POU:
  1560                 while parent_type != ITEM_POU:
  1648                     parent = self.ProjectTree.GetItemParent(parent)
  1561                     parent = self.TypesTree.GetItemParent(parent)
  1649                     parent_type = self.ProjectTree.GetPyData(parent)
  1562                     parent_type = self.TypesTree.GetPyData(parent)
  1650                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1563                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1651                 self.PopupMenu(menu)
  1564                 self.PopupMenu(menu)
  1652             elif name == "Resources":
  1565             elif name == "Resources":
  1653                 menu = wx.Menu(title='')
  1566                 menu = wx.Menu(title='')
  1654                 new_id = wx.NewId()
  1567                 new_id = wx.NewId()
  1655                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource")
  1568                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource")
  1656                 parent = self.ProjectTree.GetItemParent(item)
  1569                 parent = self.TypesTree.GetItemParent(item)
  1657                 parent_type = self.ProjectTree.GetPyData(parent)
  1570                 parent_type = self.TypesTree.GetPyData(parent)
  1658                 while parent_type != ITEM_CONFIGURATION:
  1571                 while parent_type != ITEM_CONFIGURATION:
  1659                     parent = self.ProjectTree.GetItemParent(parent)
  1572                     parent = self.TypesTree.GetItemParent(parent)
  1660                     parent_type = self.ProjectTree.GetPyData(parent)
  1573                     parent_type = self.TypesTree.GetPyData(parent)
  1661                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1574                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1662                 self.PopupMenu(menu)
  1575                 self.PopupMenu(menu)
  1663         event.Skip()
  1576         event.Skip()
  1664 
  1577 
       
  1578 
       
  1579 #-------------------------------------------------------------------------------
       
  1580 #                         Topology Tree Management Functions
       
  1581 #-------------------------------------------------------------------------------
       
  1582 
       
  1583     def RefreshInstancesTree(self):
       
  1584         infos = self.Controler.GetProjectTopology()
       
  1585         root = self.InstancesTree.GetRootItem()
       
  1586         if not root.IsOk():
       
  1587             root = self.InstancesTree.AddRoot(infos["name"])
       
  1588         self.GenerateInstancesTreeBranch(root, infos)
       
  1589         self.InstancesTree.Expand(self.InstancesTree.GetRootItem())
       
  1590 
       
  1591     def GenerateInstancesTreeBranch(self, root, infos):
       
  1592         to_delete = []
       
  1593         if infos.get("elmt_type", None) is not None:
       
  1594             self.InstancesTree.SetItemText(root, "%s(%s)"%(infos["name"], infos["elmt_type"]))
       
  1595         else:
       
  1596             self.InstancesTree.SetItemText(root, infos["name"])
       
  1597         self.InstancesTree.SetPyData(root, infos["type"])
       
  1598         self.InstancesTree.SetItemImage(root, self.InstancesTreeImageDict[infos["type"]])      
       
  1599             
       
  1600         if wx.VERSION >= (2, 6, 0):
       
  1601             item, root_cookie = self.InstancesTree.GetFirstChild(root)
       
  1602         else:
       
  1603             item, root_cookie = self.InstancesTree.GetFirstChild(root, 0)
       
  1604         for values in infos["values"]:
       
  1605             if not item.IsOk():
       
  1606                 item = self.InstancesTree.AppendItem(root, "")
       
  1607                 if wx.Platform != '__WXMSW__':
       
  1608                     item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  1609             self.GenerateInstancesTreeBranch(item, values)
       
  1610             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  1611         while item.IsOk():
       
  1612             to_delete.append(item)
       
  1613             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
       
  1614         for item in to_delete:
       
  1615             self.InstancesTree.Delete(item)
  1665 
  1616 
  1666 #-------------------------------------------------------------------------------
  1617 #-------------------------------------------------------------------------------
  1667 #                          ToolBar Management Functions
  1618 #                          ToolBar Management Functions
  1668 #-------------------------------------------------------------------------------
  1619 #-------------------------------------------------------------------------------
  1669 
  1620 
  1684                 if wx.VERSION >= (2, 8, 0):
  1635                 if wx.VERSION >= (2, 8, 0):
  1685                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1636                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  1686                     self.AUIManager.Update()
  1637                     self.AUIManager.Update()
  1687 
  1638 
  1688     def RefreshToolBar(self):
  1639     def RefreshToolBar(self):
  1689         selected = self.GetPageSelection()
  1640         selected = self.TabsOpened.GetSelection()
  1690         if selected != -1:
  1641         if selected != -1:
  1691             language = self.Controler.GetEditedElementBodyType(self.GetPage(selected).GetTagName())
  1642             language = self.Controler.GetEditedElementBodyType(self.TabsOpened.GetPage(selected).GetTagName())
  1692         else:
  1643         else:
  1693             language = None
  1644             language = None
  1694         if language is not None and language != self.CurrentLanguage:
  1645         if language is not None and language != self.CurrentLanguage:
  1695             self.ResetToolBar()
  1646             self.ResetToolBar()
  1696             self.CurrentLanguage = language
  1647             self.CurrentLanguage = language
  1721 #-------------------------------------------------------------------------------
  1672 #-------------------------------------------------------------------------------
  1722 #                           ToolBar Items Functions
  1673 #                           ToolBar Items Functions
  1723 #-------------------------------------------------------------------------------
  1674 #-------------------------------------------------------------------------------
  1724 
  1675 
  1725     def ResetCurrentMode(self):
  1676     def ResetCurrentMode(self):
  1726         selected = self.GetPageSelection()
  1677         selected = self.TabsOpened.GetSelection()
  1727         if selected != -1:
  1678         if selected != -1:
  1728             window = self.GetPage(selected)
  1679             window = self.TabsOpened.GetPage(selected)
  1729             window.SetMode(MODE_SELECTION)
  1680             window.SetMode(MODE_SELECTION)
  1730         if wx.VERSION < (2, 8, 0):
  1681         if wx.VERSION < (2, 8, 0):
  1731             ToolBar = self.ToolBar
  1682             ToolBar = self.ToolBar
  1732         else:
  1683         else:
  1733             ToolBar = self.Panes["ToolBar"]
  1684             ToolBar = self.Panes["ToolBar"]
  1740         else:
  1691         else:
  1741             tool = self.Panes["ToolBar"].FindById(id)
  1692             tool = self.Panes["ToolBar"].FindById(id)
  1742         tool.SetToggle(False)
  1693         tool.SetToggle(False)
  1743 
  1694 
  1744     def OnSelectionTool(self, event):
  1695     def OnSelectionTool(self, event):
  1745         selected = self.GetPageSelection()
  1696         selected = self.TabsOpened.GetSelection()
  1746         if selected != -1:
  1697         if selected != -1:
  1747             self.GetPage(selected).SetMode(MODE_SELECTION)
  1698             self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
  1748         event.Skip()
  1699         event.Skip()
  1749     
  1700     
  1750     def OnCommentTool(self, event):
  1701     def OnCommentTool(self, event):
  1751         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT)
  1702         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT)
  1752         selected = self.GetPageSelection()
  1703         selected = self.TabsOpened.GetSelection()
  1753         if selected != -1:
  1704         if selected != -1:
  1754             self.GetPage(selected).SetMode(MODE_COMMENT)
  1705             self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
  1755         event.Skip()
  1706         event.Skip()
  1756     
  1707     
  1757     def OnVariableTool(self, event):
  1708     def OnVariableTool(self, event):
  1758         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE)
  1709         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE)
  1759         selected = self.GetPageSelection()
  1710         selected = self.TabsOpened.GetSelection()
  1760         if selected != -1:
  1711         if selected != -1:
  1761             self.GetPage(selected).SetMode(MODE_VARIABLE)
  1712             self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
  1762         event.Skip()
  1713         event.Skip()
  1763     
  1714     
  1764     def OnBlockTool(self, event):
  1715     def OnBlockTool(self, event):
  1765         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARBLOCK)
  1716         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARBLOCK)
  1766         selected = self.GetPageSelection()
  1717         selected = self.TabsOpened.GetSelection()
  1767         if selected != -1:
  1718         if selected != -1:
  1768             self.GetPage(selected).SetMode(MODE_BLOCK)
  1719             self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
  1769         event.Skip()
  1720         event.Skip()
  1770         
  1721         
  1771     def OnConnectionTool(self, event):
  1722     def OnConnectionTool(self, event):
  1772         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION)
  1723         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION)
  1773         selected = self.GetPageSelection()
  1724         selected = self.TabsOpened.GetSelection()
  1774         if selected != -1:
  1725         if selected != -1:
  1775             self.GetPage(selected).SetMode(MODE_CONNECTION)
  1726             self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
  1776         event.Skip()
  1727         event.Skip()
  1777 
  1728 
  1778     def OnPowerRailTool(self, event):
  1729     def OnPowerRailTool(self, event):
  1779         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL)
  1730         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL)
  1780         selected = self.GetPageSelection()
  1731         selected = self.TabsOpened.GetSelection()
  1781         if selected != -1:
  1732         if selected != -1:
  1782             self.GetPage(selected).SetMode(MODE_POWERRAIL)
  1733             self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
  1783         event.Skip()
  1734         event.Skip()
  1784 
  1735 
  1785     def OnRungTool(self, event):
  1736     def OnRungTool(self, event):
  1786         selected = self.GetPageSelection()
  1737         selected = self.TabsOpened.GetSelection()
  1787         if selected != -1:
  1738         if selected != -1:
  1788             self.GetPage(selected).AddLadderRung()
  1739             self.TabsOpened.GetPage(selected).AddLadderRung()
  1789         event.Skip()
  1740         event.Skip()
  1790     
  1741     
  1791     def OnCoilTool(self, event):
  1742     def OnCoilTool(self, event):
  1792         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL)
  1743         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL)
  1793         selected = self.GetPageSelection()
  1744         selected = self.TabsOpened.GetSelection()
  1794         if selected != -1:
  1745         if selected != -1:
  1795             self.GetPage(selected).SetMode(MODE_COIL)
  1746             self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
  1796         event.Skip()
  1747         event.Skip()
  1797     
  1748     
  1798     def OnContactTool(self, event):
  1749     def OnContactTool(self, event):
  1799         if self.DrawingMode == FREEDRAWING_MODE:
  1750         if self.DrawingMode == FREEDRAWING_MODE:
  1800             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT)
  1751             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT)
  1801         selected = self.GetPageSelection()
  1752         selected = self.TabsOpened.GetSelection()
  1802         if selected != -1:
  1753         if selected != -1:
  1803             if self.DrawingMode == FREEDRAWING_MODE:
  1754             if self.DrawingMode == FREEDRAWING_MODE:
  1804                 self.GetPage(selected).SetMode(MODE_CONTACT)
  1755                 self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
  1805             else:
  1756             else:
  1806                 self.GetPage(selected).AddLadderContact()
  1757                 self.TabsOpened.GetPage(selected).AddLadderContact()
  1807         event.Skip()
  1758         event.Skip()
  1808     
  1759     
  1809     def OnBranchTool(self, event): 
  1760     def OnBranchTool(self, event): 
  1810         selected = self.GetPageSelection()
  1761         selected = self.TabsOpened.GetSelection()
  1811         if selected != -1:
  1762         if selected != -1:
  1812             self.GetPage(selected).AddLadderBranch()
  1763             self.TabsOpened.GetPage(selected).AddLadderBranch()
  1813         event.Skip()    
  1764         event.Skip()    
  1814     
  1765     
  1815     def OnInitialStepTool(self, event):
  1766     def OnInitialStepTool(self, event):
  1816         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP)
  1767         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP)
  1817         selected = self.GetPageSelection()
  1768         selected = self.TabsOpened.GetSelection()
  1818         if selected != -1:
  1769         if selected != -1:
  1819             self.GetPage(selected).SetMode(MODE_INITIALSTEP)
  1770             self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
  1820         event.Skip()
  1771         event.Skip()
  1821     
  1772     
  1822     def OnStepTool(self, event):
  1773     def OnStepTool(self, event):
  1823         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1774         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1824             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP)
  1775             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP)
  1825         selected = self.GetPageSelection()
  1776         selected = self.TabsOpened.GetSelection()
  1826         if selected != -1:
  1777         if selected != -1:
  1827             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1778             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1828                 self.GetPage(selected).SetMode(MODE_STEP)
  1779                 self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
  1829             else:
  1780             else:
  1830                 self.GetPage(selected).AddStep()
  1781                 self.TabsOpened.GetPage(selected).AddStep()
  1831         event.Skip()
  1782         event.Skip()
  1832 
  1783 
  1833     def OnActionBlockTool(self, event):
  1784     def OnActionBlockTool(self, event):
  1834         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1785         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1835             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK)
  1786             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK)
  1836         selected = self.GetPageSelection()
  1787         selected = self.TabsOpened.GetSelection()
  1837         if selected != -1:
  1788         if selected != -1:
  1838             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1789             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1839                 self.GetPage(selected).SetMode(MODE_ACTION)
  1790                 self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
  1840             else:
  1791             else:
  1841                 self.GetPage(selected).AddStepAction()
  1792                 self.TabsOpened.GetPage(selected).AddStepAction()
  1842         event.Skip()
  1793         event.Skip()
  1843 
  1794 
  1844     def OnTransitionTool(self, event):
  1795     def OnTransitionTool(self, event):
  1845         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION)
  1796         self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION)
  1846         selected = self.GetPageSelection()
  1797         selected = self.TabsOpened.GetSelection()
  1847         if selected != -1:
  1798         if selected != -1:
  1848             self.GetPage(selected).SetMode(MODE_TRANSITION)
  1799             self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
  1849         event.Skip()
  1800         event.Skip()
  1850 
  1801 
  1851     def OnDivergenceTool(self, event):
  1802     def OnDivergenceTool(self, event):
  1852         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1803         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1853             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE)
  1804             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE)
  1854         selected = self.GetPageSelection()
  1805         selected = self.TabsOpened.GetSelection()
  1855         if selected != -1:
  1806         if selected != -1:
  1856             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1807             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1857                 self.GetPage(selected).SetMode(MODE_DIVERGENCE)
  1808                 self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
  1858             else:
  1809             else:
  1859                 self.GetPage(selected).AddDivergence()
  1810                 self.TabsOpened.GetPage(selected).AddDivergence()
  1860         event.Skip()
  1811         event.Skip()
  1861     
  1812     
  1862     def OnJumpTool(self, event):
  1813     def OnJumpTool(self, event):
  1863         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1814         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1864             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP)
  1815             self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP)
  1865         selected = self.GetPageSelection()
  1816         selected = self.TabsOpened.GetSelection()
  1866         if selected != -1:
  1817         if selected != -1:
  1867             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1818             if self.GetDrawingMode() == FREEDRAWING_MODE:
  1868                 self.GetPage(selected).SetMode(MODE_JUMP)
  1819                 self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
  1869             else:
  1820             else:
  1870                 self.GetPage(selected).AddJump()
  1821                 self.TabsOpened.GetPage(selected).AddJump()
  1871         event.Skip()
  1822         event.Skip()
  1872 
  1823 
  1873 
  1824 
  1874 #-------------------------------------------------------------------------------
  1825 #-------------------------------------------------------------------------------
  1875 #                         Add Project Elements Functions
  1826 #                         Add Project Elements Functions
  1880         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  1831         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  1881         if dialog.ShowModal() == wx.ID_OK:
  1832         if dialog.ShowModal() == wx.ID_OK:
  1882             self.Controler.ProjectAddDataType(dialog.GetValue())
  1833             self.Controler.ProjectAddDataType(dialog.GetValue())
  1883             self.RefreshTitle()
  1834             self.RefreshTitle()
  1884             self.RefreshEditMenu()
  1835             self.RefreshEditMenu()
  1885             self.RefreshProjectTree()
  1836             self.RefreshTypesTree()
  1886         dialog.Destroy()
  1837         dialog.Destroy()
  1887         event.Skip()
  1838         event.Skip()
  1888 
  1839 
  1889     def GenerateAddPouFunction(self, pou_type):
  1840     def GenerateAddPouFunction(self, pou_type):
  1890         def OnAddPouMenu(event):
  1841         def OnAddPouMenu(event):
  1894             if dialog.ShowModal() == wx.ID_OK:
  1845             if dialog.ShowModal() == wx.ID_OK:
  1895                 values = dialog.GetValues()
  1846                 values = dialog.GetValues()
  1896                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1847                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  1897                 self.RefreshTitle()
  1848                 self.RefreshTitle()
  1898                 self.RefreshEditMenu()
  1849                 self.RefreshEditMenu()
  1899                 self.RefreshProjectTree()
  1850                 self.RefreshTypesTree()
  1900             dialog.Destroy()
  1851             dialog.Destroy()
  1901             event.Skip()
  1852             event.Skip()
  1902         return OnAddPouMenu
  1853         return OnAddPouMenu
  1903 
  1854 
  1904     def GenerateAddTransitionFunction(self, pou_name):
  1855     def GenerateAddTransitionFunction(self, pou_name):
  1909             if dialog.ShowModal() == wx.ID_OK: 
  1860             if dialog.ShowModal() == wx.ID_OK: 
  1910                 values = dialog.GetValues()
  1861                 values = dialog.GetValues()
  1911                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  1862                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  1912                 self.RefreshTitle()
  1863                 self.RefreshTitle()
  1913                 self.RefreshEditMenu()
  1864                 self.RefreshEditMenu()
  1914                 self.RefreshProjectTree()
  1865                 self.RefreshTypesTree()
  1915             dialog.Destroy()
  1866             dialog.Destroy()
  1916             event.Skip()
  1867             event.Skip()
  1917         return OnAddTransitionMenu
  1868         return OnAddTransitionMenu
  1918 
  1869 
  1919     def GenerateAddActionFunction(self, pou_name):
  1870     def GenerateAddActionFunction(self, pou_name):
  1924             if dialog.ShowModal() == wx.ID_OK:
  1875             if dialog.ShowModal() == wx.ID_OK:
  1925                 values = dialog.GetValues()
  1876                 values = dialog.GetValues()
  1926                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  1877                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  1927                 self.RefreshTitle()
  1878                 self.RefreshTitle()
  1928                 self.RefreshEditMenu()
  1879                 self.RefreshEditMenu()
  1929                 self.RefreshProjectTree()
  1880                 self.RefreshTypesTree()
  1930             dialog.Destroy()
  1881             dialog.Destroy()
  1931             event.Skip()
  1882             event.Skip()
  1932         return OnAddActionMenu
  1883         return OnAddActionMenu
  1933 
  1884 
  1934     def OnAddConfigurationMenu(self, event):
  1885     def OnAddConfigurationMenu(self, event):
  1938         if dialog.ShowModal() == wx.ID_OK:
  1889         if dialog.ShowModal() == wx.ID_OK:
  1939             value = dialog.GetValue()
  1890             value = dialog.GetValue()
  1940             self.Controler.ProjectAddConfiguration(value)
  1891             self.Controler.ProjectAddConfiguration(value)
  1941             self.RefreshTitle()
  1892             self.RefreshTitle()
  1942             self.RefreshEditMenu()
  1893             self.RefreshEditMenu()
  1943             self.RefreshProjectTree()
  1894             self.RefreshTypesTree()
  1944         dialog.Destroy()
  1895         dialog.Destroy()
  1945         event.Skip()
  1896         event.Skip()
  1946 
  1897 
  1947     def GenerateAddResourceFunction(self, config_name):
  1898     def GenerateAddResourceFunction(self, config_name):
  1948         def OnAddResourceMenu(event):
  1899         def OnAddResourceMenu(event):
  1952             if dialog.ShowModal() == wx.ID_OK:
  1903             if dialog.ShowModal() == wx.ID_OK:
  1953                 value = dialog.GetValue()
  1904                 value = dialog.GetValue()
  1954                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  1905                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  1955                 self.RefreshTitle()
  1906                 self.RefreshTitle()
  1956                 self.RefreshEditMenu()
  1907                 self.RefreshEditMenu()
  1957                 self.RefreshProjectTree()
  1908                 self.RefreshTypesTree()
  1958             dialog.Destroy()
  1909             dialog.Destroy()
  1959             event.Skip()
  1910             event.Skip()
  1960         return OnAddResourceMenu
  1911         return OnAddResourceMenu
  1961 
  1912 
  1962 
  1913 
  1963 #-------------------------------------------------------------------------------
  1914 #-------------------------------------------------------------------------------
  1964 #                        Remove Project Elements Functions
  1915 #                        Remove Project Elements Functions
  1965 #-------------------------------------------------------------------------------
  1916 #-------------------------------------------------------------------------------
  1966 
  1917 
  1967     def OnRemoveDataTypeMenu(self, event):
  1918     def OnRemoveDataTypeMenu(self, event):
  1968         selected = self.ProjectTree.GetSelection()
  1919         selected = self.TypesTree.GetSelection()
  1969         if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE:
  1920         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  1970             name = self.ProjectTree.GetItemText(selected)
  1921             name = self.TypesTree.GetItemText(selected)
  1971             if not self.Controler.DataTypeIsUsed(name):
  1922             if not self.Controler.DataTypeIsUsed(name):
  1972                 self.Controler.ProjectRemoveDataType(name)
  1923                 self.Controler.ProjectRemoveDataType(name)
  1973                 tagname = self.Controler.ComputeDataTypeName(name)
  1924                 tagname = self.Controler.ComputeDataTypeName(name)
  1974                 idx = self.IsOpened(tagname)
  1925                 idx = self.IsOpened(tagname)
  1975                 if idx is not None:
  1926                 if idx is not None:
  1976                     self.DeletePage(idx)
  1927                     self.TabsOpened.DeletePage(idx)
  1977                 self.RefreshTitle()
  1928                 self.RefreshTitle()
  1978                 self.RefreshEditMenu()
  1929                 self.RefreshEditMenu()
  1979                 self.RefreshProjectTree()
  1930                 self.RefreshTypesTree()
  1980                 self.RefreshToolBar()
  1931                 self.RefreshToolBar()
  1981             else:
  1932             else:
  1982                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1933                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1983                 message.ShowModal()
  1934                 message.ShowModal()
  1984                 message.Destroy()
  1935                 message.Destroy()
  1985         event.Skip()
  1936         event.Skip()
  1986 
  1937 
  1987     def OnRemovePouMenu(self, event):
  1938     def OnRemovePouMenu(self, event):
  1988         selected = self.ProjectTree.GetSelection()
  1939         selected = self.TypesTree.GetSelection()
  1989         if self.ProjectTree.GetPyData(selected) == ITEM_POU: 
  1940         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  1990             name = self.ProjectTree.GetItemText(selected)
  1941             name = self.TypesTree.GetItemText(selected)
  1991             if not self.Controler.PouIsUsed(name):
  1942             if not self.Controler.PouIsUsed(name):
  1992                 self.Controler.ProjectRemovePou(name)
  1943                 self.Controler.ProjectRemovePou(name)
  1993                 tagname = self.Controler.ComputePouName(name)
  1944                 tagname = self.Controler.ComputePouName(name)
  1994                 idx = self.IsOpened(tagname)
  1945                 idx = self.IsOpened(tagname)
  1995                 if idx is not None:
  1946                 if idx is not None:
  1996                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1947                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1997                     self.DeletePage(idx)
  1948                     self.TabsOpened.DeletePage(idx)
  1998                 self.RefreshTitle()
  1949                 self.RefreshTitle()
  1999                 self.RefreshEditMenu()
  1950                 self.RefreshEditMenu()
  2000                 self.RefreshProjectTree()
  1951                 self.RefreshTypesTree()
  2001                 self.RefreshToolBar()
  1952                 self.RefreshToolBar()
  2002             else:
  1953             else:
  2003                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  1954                 message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR)
  2004                 message.ShowModal()
  1955                 message.ShowModal()
  2005                 message.Destroy()
  1956                 message.Destroy()
  2006         event.Skip()
  1957         event.Skip()
  2007 
  1958 
  2008     def OnRemoveConfigurationMenu(self, event):
  1959     def OnRemoveConfigurationMenu(self, event):
  2009         selected = self.ProjectTree.GetSelection()
  1960         selected = self.TypesTree.GetSelection()
  2010         if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  1961         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2011             name = self.ProjectTree.GetItemText(selected)
  1962             name = self.TypesTree.GetItemText(selected)
  2012             self.Controler.ProjectRemoveConfiguration(name)
  1963             self.Controler.ProjectRemoveConfiguration(name)
  2013             tagname = self.Controler.ComputeConfigurationName(name)
  1964             tagname = self.Controler.ComputeConfigurationName(name)
  2014             idx = self.IsOpened(tagname)
  1965             idx = self.IsOpened(tagname)
  2015             if idx is not None:
  1966             if idx is not None:
  2016                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1967                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2017                 self.DeletePage(idx)
  1968                 self.TabsOpened.DeletePage(idx)
  2018             self.RefreshTitle()
  1969             self.RefreshTitle()
  2019             self.RefreshEditMenu()
  1970             self.RefreshEditMenu()
  2020             self.RefreshProjectTree()
  1971             self.RefreshTypesTree()
  2021         event.Skip()
  1972         event.Skip()
  2022 
  1973 
  2023     def OnRemoveTransitionMenu(self, event):
  1974     def OnRemoveTransitionMenu(self, event):
  2024         selected = self.ProjectTree.GetSelection()
  1975         selected = self.TypesTree.GetSelection()
  2025         if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: 
  1976         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2026             transition = self.ProjectTree.GetItemText(selected)
  1977             transition = self.TypesTree.GetItemText(selected)
  2027             item = self.ProjectTree.GetItemParent(selected)
  1978             item = self.TypesTree.GetItemParent(selected)
  2028             item_type = self.ProjectTree.GetPyData(item)
  1979             item_type = self.TypesTree.GetPyData(item)
  2029             while item_type != ITEM_POU:
  1980             while item_type != ITEM_POU:
  2030                 item = self.ProjectTree.GetItemParent(item)
  1981                 item = self.TypesTree.GetItemParent(item)
  2031                 item_type = self.ProjectTree.GetPyData(item)
  1982                 item_type = self.TypesTree.GetPyData(item)
  2032             pou_name = self.ProjectTree.GetItemText(item)
  1983             pou_name = self.TypesTree.GetItemText(item)
  2033             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  1984             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2034             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  1985             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2035             idx = self.IsOpened(tagname)
  1986             idx = self.IsOpened(tagname)
  2036             if idx is not None:
  1987             if idx is not None:
  2037                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1988                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2038                 self.DeletePage(idx)
  1989                 self.TabsOpened.DeletePage(idx)
  2039             self.RefreshTitle()
  1990             self.RefreshTitle()
  2040             self.RefreshEditMenu()
  1991             self.RefreshEditMenu()
  2041             self.RefreshProjectTree()
  1992             self.RefreshTypesTree()
  2042         event.Skip()
  1993         event.Skip()
  2043 
  1994 
  2044     def OnRemoveActionMenu(self, event):
  1995     def OnRemoveActionMenu(self, event):
  2045         selected = self.ProjectTree.GetSelection()
  1996         selected = self.TypesTree.GetSelection()
  2046         if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: 
  1997         if self.TypesTree.GetPyData(selected) == ITEM_ACTION: 
  2047             action = self.ProjectTree.GetItemText(selected)
  1998             action = self.TypesTree.GetItemText(selected)
  2048             item = self.ProjectTree.GetItemParent(selected)
  1999             item = self.TypesTree.GetItemParent(selected)
  2049             item_type = self.ProjectTree.GetPyData(item)
  2000             item_type = self.TypesTree.GetPyData(item)
  2050             while item_type != ITEM_POU:
  2001             while item_type != ITEM_POU:
  2051                 item = self.ProjectTree.GetItemParent(item)
  2002                 item = self.TypesTree.GetItemParent(item)
  2052                 item_type = self.ProjectTree.GetPyData(item)
  2003                 item_type = self.TypesTree.GetPyData(item)
  2053             pou_name = self.ProjectTree.GetItemText(item)
  2004             pou_name = self.TypesTree.GetItemText(item)
  2054             self.Controler.ProjectRemovePouAction(pou_name, action)
  2005             self.Controler.ProjectRemovePouAction(pou_name, action)
  2055             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2006             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2056             idx = self.IsOpened(tagname)
  2007             idx = self.IsOpened(tagname)
  2057             if idx is not None:
  2008             if idx is not None:
  2058                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2009                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2059                 self.DeletePage(idx)
  2010                 self.TabsOpened.DeletePage(idx)
  2060             self.RefreshTitle()
  2011             self.RefreshTitle()
  2061             self.RefreshEditMenu()
  2012             self.RefreshEditMenu()
  2062             self.RefreshProjectTree()
  2013             self.RefreshTypesTree()
  2063         event.Skip()
  2014         event.Skip()
  2064 
  2015 
  2065     def OnRemoveResourceMenu(self, event):
  2016     def OnRemoveResourceMenu(self, event):
  2066         selected = self.ProjectTree.GetSelection()
  2017         selected = self.TypesTree.GetSelection()
  2067         if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE:
  2018         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2068             resource = self.ProjectTree.GetItemText(selected)
  2019             resource = self.TypesTree.GetItemText(selected)
  2069             item = self.ProjectTree.GetItemParent(selected)
  2020             item = self.TypesTree.GetItemParent(selected)
  2070             item_type = self.ProjectTree.GetPyData(item)
  2021             item_type = self.TypesTree.GetPyData(item)
  2071             while item_type != ITEM_CONFIGURATION:
  2022             while item_type != ITEM_CONFIGURATION:
  2072                 item = self.ProjectTree.GetItemParent(item)
  2023                 item = self.TypesTree.GetItemParent(item)
  2073                 item_type = self.ProjectTree.GetPyData(item)
  2024                 item_type = self.TypesTree.GetPyData(item)
  2074             config_name = self.ProjectTree.GetItemText(item)
  2025             config_name = self.TypesTree.GetItemText(item)
  2075             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2026             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2076             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2027             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2077             idx = self.IsOpened(tagname)
  2028             idx = self.IsOpened(tagname)
  2078             if idx is not None:
  2029             if idx is not None:
  2079                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2030                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2080                 self.DeletePage(idx)
  2031                 self.TabsOpened.DeletePage(idx)
  2081             self.RefreshTitle()
  2032             self.RefreshTitle()
  2082             self.RefreshEditMenu()
  2033             self.RefreshEditMenu()
  2083             self.RefreshProjectTree()
  2034             self.RefreshTypesTree()
  2084         event.Skip()
  2035         event.Skip()
  2085     
  2036     
  2086     def OnPLCOpenEditorMenu(self, event):
  2037     def OnPLCOpenEditorMenu(self, event):
  2087         wx.MessageBox("No documentation available.\nComing soon.")
  2038         wx.MessageBox("No documentation available.\nComing soon.")
  2088         #event.Skip()
  2039         #event.Skip()
  2099 #-------------------------------------------------------------------------------
  2050 #-------------------------------------------------------------------------------
  2100 #                        Errors showing functions
  2051 #                        Errors showing functions
  2101 #-------------------------------------------------------------------------------
  2052 #-------------------------------------------------------------------------------
  2102 
  2053 
  2103     def ShowError(self, infos, start, end):
  2054     def ShowError(self, infos, start, end):
  2104         print infos
       
  2105         self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2055         self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2106         self.SelectProjectTreeItem(infos[0])
  2056         self.SelectTypesTreeItem(infos[0])
  2107         if infos[1] == "name":
  2057         if infos[1] == "name":
  2108             self.Errors.append(infos[0])
  2058             self.Errors.append(infos[0])
  2109             self.RefreshProjectTree()
  2059             self.RefreshTypesTree()
  2110             self.ProjectTree.Unselect()
  2060             self.TypesTree.Unselect()
  2111         elif infos[1] == "variable":
  2061         elif infos[1] == "variable":
  2112             self.VariablePanelIndexer.AddVariableError(infos)
  2062             self.VariablePanelIndexer.AddVariableError(infos)
  2113         else:
  2063         else:
  2114             selected = self.GetPageSelection()
  2064             selected = self.TabsOpened.GetSelection()
  2115             if selected != -1:
  2065             if selected != -1:
  2116                 viewer = self.GetPage(selected)
  2066                 viewer = self.TabsOpened.GetPage(selected)
  2117                 viewer.AddShownError(infos[1:], start, end)
  2067                 viewer.AddShownError(infos[1:], start, end)
  2118                 viewer.RefreshView()
  2068                 viewer.RefreshView()
  2119     
  2069     
  2120     def ClearErrors(self):
  2070     def ClearErrors(self):
  2121         self.Errors = []
  2071         self.Errors = []
  2122         self.RefreshProjectTree()
  2072         self.RefreshTypesTree()
  2123         self.VariablePanelIndexer.ClearErrors()
  2073         self.VariablePanelIndexer.ClearErrors()
  2124         for i in xrange(self.GetPageCount()):
  2074         for i in xrange(self.TabsOpened.GetPageCount()):
  2125             viewer = self.GetPage(i)
  2075             viewer = self.TabsOpened.GetPage(i)
  2126             viewer.ClearErrors()
  2076             viewer.ClearErrors()
  2127         
  2077         
  2128 current_num = 0
  2078 current_num = 0
  2129 def GetNewNum():
  2079 def GetNewNum():
  2130     global current_num
  2080     global current_num