PLCOpenEditor.py
changeset 673 b686f0081e2b
parent 666 d4bb66691248
child 675 0ea836add01f
equal deleted inserted replaced
672:d751b1c609b3 673:b686f0081e2b
   136  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
   136  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
   137  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   137  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   138  ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, 
   138  ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, 
   139 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
   139 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
   140 
   140 
       
   141 # Define PLCOpenEditor DisplayMenu extra items id
       
   142 [ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE, 
       
   143 ] = [wx.NewId() for _init_coll_DisplayMenu_Items in range(1)]
   141 
   144 
   142 #-------------------------------------------------------------------------------
   145 #-------------------------------------------------------------------------------
   143 #                            EditorToolBar definitions
   146 #                            EditorToolBar definitions
   144 #-------------------------------------------------------------------------------
   147 #-------------------------------------------------------------------------------
   145 
   148 
   300                 remove_function(self.Controler, name)
   303                 remove_function(self.Controler, name)
   301         else:
   304         else:
   302             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   305             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   303     return DeleteElementFunction
   306     return DeleteElementFunction
   304 
   307 
       
   308 def ComputeTabsOrganization(tabs, rect):
       
   309     if len(tabs) == 1:
       
   310         return tabs[0]
       
   311     split = None
       
   312     for idx, tab in enumerate(tabs):
       
   313         if tab["size"][0] == rect.width:
       
   314             if tab["pos"][1] == rect.y:
       
   315                 split = (wx.TOP, float(tab["size"][1]) / float(rect.height))
       
   316                 split_rect = wx.Rect(rect.x, rect.y + tab["size"][1] + 7, 
       
   317                                      rect.width, rect.height - tab["size"][1] - 7)
       
   318             elif tab["pos"][1] == rect.height + 1 - tab["size"][1]:
       
   319                 split = (wx.BOTTOM, 1.0 - float(tab["size"][1]) / float(rect.height))
       
   320                 split_rect = wx.Rect(rect.x, rect.y, 
       
   321                                      rect.width, rect.height - tab["size"][1] - 7)
       
   322             break
       
   323         elif tab["size"][1] == rect.height:
       
   324             if tab["pos"][0] == rect.x:
       
   325                 split = (wx.LEFT, float(tab["size"][0]) / float(rect.width))
       
   326                 split_rect = wx.Rect(rect.x + tab["size"][0] + 7, rect.y, 
       
   327                                      rect.width - tab["size"][0] - 7, rect.height)
       
   328             elif tab["pos"][0] == rect.width + 1 - tab["size"][0]:
       
   329                 split = (wx.RIGHT, 1.0 - float(tab["size"][0]) / float(rect.width))
       
   330                 split_rect = wx.Rect(rect.x, rect.y, 
       
   331                                      rect.width - tab["size"][0] - 7, rect.height)
       
   332             break
       
   333     if split != None:
       
   334         split_tab = tabs.pop(idx)
       
   335         return {"split": split,
       
   336                 "tab": split_tab, 
       
   337                 "others": ComputeTabsOrganization(tabs, split_rect)}
       
   338     return tabs
   305 
   339 
   306 #-------------------------------------------------------------------------------
   340 #-------------------------------------------------------------------------------
   307 #                              IDEFrame Base Class
   341 #                              IDEFrame Base Class
   308 #-------------------------------------------------------------------------------
   342 #-------------------------------------------------------------------------------
   309 
   343 
   405         for idx, value in enumerate(ZOOM_FACTORS):
   439         for idx, value in enumerate(ZOOM_FACTORS):
   406             new_id = wx.NewId()
   440             new_id = wx.NewId()
   407             AppendMenu(zoommenu, help='', id=new_id,
   441             AppendMenu(zoommenu, help='', id=new_id,
   408                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   442                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   409             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   443             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
       
   444         
       
   445         if USE_AUI:
       
   446             parent.AppendSeparator()
       
   447             AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
       
   448                   kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
       
   449             self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
       
   450         
   410         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   451         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   411         if self.EnableDebug:
   452         if self.EnableDebug:
   412             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   453             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   413 
   454             
   414     def _init_coll_HelpMenu_Items(self, parent):
   455     def _init_coll_HelpMenu_Items(self, parent):
   415         pass
   456         pass
   416 
   457 
   417     def _init_utils(self):
   458     def _init_utils(self):
   418         self.MenuBar = wx.MenuBar()
   459         self.MenuBar = wx.MenuBar()
   448         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   489         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   449               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   490               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   450               style=wx.DEFAULT_FRAME_STYLE)
   491               style=wx.DEFAULT_FRAME_STYLE)
   451         self.SetClientSize(wx.Size(1000, 600))
   492         self.SetClientSize(wx.Size(1000, 600))
   452         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
   493         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
       
   494         self.Bind(wx.EVT_SIZE, self.OnResize)
   453         
   495         
   454         self.TabsImageList = wx.ImageList(31, 16)
   496         self.TabsImageList = wx.ImageList(31, 16)
   455         self.TabsImageListIndexes = {}
   497         self.TabsImageListIndexes = {}
   456         
   498         
   457         #-----------------------------------------------------------------------
   499         #-----------------------------------------------------------------------
   467                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   509                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   468                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   510                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   469             self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   511             self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   470                     self.OnAllowNotebookDnD)
   512                     self.OnAllowNotebookDnD)
   471             self.AUIManager.AddPane(self.LeftNoteBook, 
   513             self.AUIManager.AddPane(self.LeftNoteBook, 
   472                   wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).
   514                   wx.aui.AuiPaneInfo().Name("ProjectPane").
       
   515                   Caption(_("Project")).Left().Layer(1).
   473                   BestSize(wx.Size(300, 500)).CloseButton(False))
   516                   BestSize(wx.Size(300, 500)).CloseButton(False))
   474         
   517             
   475             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   518             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   476                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   519                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   477                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   520                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   478             self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   521             self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   479                     self.OnAllowNotebookDnD)
   522                     self.OnAllowNotebookDnD)
   480             self.AUIManager.AddPane(self.BottomNoteBook, 
   523             self.AUIManager.AddPane(self.BottomNoteBook, 
   481                   wx.aui.AuiPaneInfo().Bottom().Layer(0).
   524                   wx.aui.AuiPaneInfo().Name("ResultPane").
       
   525                   Bottom().Layer(0).
   482                   BestSize(wx.Size(800, 300)).CloseButton(False))
   526                   BestSize(wx.Size(800, 300)).CloseButton(False))
   483             
   527             
   484             self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   528             self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   485                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   529                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   486                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   530                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   487             self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   531             self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   488                     self.OnAllowNotebookDnD)
   532                     self.OnAllowNotebookDnD)
   489             self.AUIManager.AddPane(self.RightNoteBook, 
   533             self.AUIManager.AddPane(self.RightNoteBook, 
   490                   wx.aui.AuiPaneInfo().Right().Layer(0).
   534                   wx.aui.AuiPaneInfo().Name("LibraryPane").
       
   535                   Right().Layer(0).
   491                   BestSize(wx.Size(250, 400)).CloseButton(False))
   536                   BestSize(wx.Size(250, 400)).CloseButton(False))
   492             
   537             
   493             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   538             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   494                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   539                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   495             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   540             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   498                     self.OnPouSelectedChanged)
   543                     self.OnPouSelectedChanged)
   499             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   544             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   500                     self.OnPageClose)
   545                     self.OnPageClose)
   501             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   546             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   502                     self.OnPageDragged)
   547                     self.OnPageDragged)
   503             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   548             self.AUIManager.AddPane(self.TabsOpened, 
       
   549                   wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
   504         
   550         
   505         else:
   551         else:
   506             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   552             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   507                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   553                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   508                   size=wx.Size(0, 0), style=wx.SP_3D)
   554                   size=wx.Size(0, 0), style=wx.SP_3D)
   551                   0), size=wx.Size(0, 0), style=0)
   597                   0), size=wx.Size(0, 0), style=0)
   552             
   598             
   553             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.RightNoteBook, -250)
   599             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.RightNoteBook, -250)
   554         
   600         
   555         #-----------------------------------------------------------------------
   601         #-----------------------------------------------------------------------
   556         #                       Creating PLCopen Project tree
   602         #                    Creating PLCopen Project Types Tree
   557         #-----------------------------------------------------------------------
   603         #-----------------------------------------------------------------------
       
   604         
       
   605         self.MainTabs = {}
   558         
   606         
   559         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   607         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   560                   name='TypesTree', parent=self.LeftNoteBook, 
   608                   name='TypesTree', parent=self.LeftNoteBook, 
   561                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   609                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   562                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   610                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   580               id=ID_PLCOPENEDITORTYPESTREE)
   628               id=ID_PLCOPENEDITORTYPESTREE)
   581         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   629         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   582               id=ID_PLCOPENEDITORTYPESTREE)
   630               id=ID_PLCOPENEDITORTYPESTREE)
   583         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
   631         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
   584               id=ID_PLCOPENEDITORTYPESTREE)
   632               id=ID_PLCOPENEDITORTYPESTREE)
   585         self.LeftNoteBook.AddPage(self.TypesTree, _("Types"))
   633         
   586 
   634         self.MainTabs["TypesTree"] = (self.TypesTree, _("Types"))
       
   635         self.LeftNoteBook.AddPage(*self.MainTabs["TypesTree"])
       
   636         
   587         #-----------------------------------------------------------------------
   637         #-----------------------------------------------------------------------
   588         #                       Creating PLCopen Project tree
   638         #                  Creating PLCopen Project Instances Tree
   589         #-----------------------------------------------------------------------
   639         #-----------------------------------------------------------------------
   590         
   640         
   591         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   641         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   592                   name='InstancesTree', parent=self.LeftNoteBook, 
   642                   name='InstancesTree', parent=self.LeftNoteBook, 
   593                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   643                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   599                 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp)
   649                 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp)
   600             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   650             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   601                   id=ID_PLCOPENEDITORINSTANCESTREE)
   651                   id=ID_PLCOPENEDITORINSTANCESTREE)
   602             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   652             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   603                   id=ID_PLCOPENEDITORINSTANCESTREE)
   653                   id=ID_PLCOPENEDITORINSTANCESTREE)
   604         self.LeftNoteBook.AddPage(self.InstancesTree, _("Instances"))
   654         
       
   655         self.MainTabs["InstancesTree"] = (self.InstancesTree, _("Instances"))
       
   656         self.LeftNoteBook.AddPage(*self.MainTabs["InstancesTree"])
   605         
   657         
   606         #-----------------------------------------------------------------------
   658         #-----------------------------------------------------------------------
   607         #                            Creating Tool Bar
   659         #                            Creating Tool Bar
   608         #-----------------------------------------------------------------------
   660         #-----------------------------------------------------------------------
   609 
   661         
   610         if USE_AUI:
   662         if USE_AUI:
   611             MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   663             MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   612                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   664                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   613             MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   665             MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   614             MenuToolBar.Realize()
   666             MenuToolBar.Realize()
   639             self.EditorToolBar.Realize()
   691             self.EditorToolBar.Realize()
   640             
   692             
   641         self.Bind(wx.EVT_MENU, self.OnSelectionTool, 
   693         self.Bind(wx.EVT_MENU, self.OnSelectionTool, 
   642               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   694               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   643         
   695         
       
   696         #-----------------------------------------------------------------------
       
   697         #                            Creating Search Panel
       
   698         #-----------------------------------------------------------------------
       
   699         
   644         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   700         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   645         self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
   701         self.MainTabs["SearchResultPanel"] = (self.SearchResultPanel, _("Search"))
   646 
   702         self.BottomNoteBook.AddPage(*self.MainTabs["SearchResultPanel"])
       
   703         
       
   704         #-----------------------------------------------------------------------
       
   705         #                            Creating Library Panel
       
   706         #-----------------------------------------------------------------------
       
   707         
   647         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   708         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   648               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   709               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   649               0), size=wx.Size(0, 0), style=0)
   710               0), size=wx.Size(0, 0), style=0)
   650         self.RightNoteBook.AddPage(self.LibraryPanel, _("Library"))
   711         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
       
   712         self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"])
   651         
   713         
   652         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
   714         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
   653                   name='LibraryTree', parent=self.LibraryPanel, 
   715                   name='LibraryTree', parent=self.LibraryPanel, 
   654                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   716                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   655                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
   717                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
   668         
   730         
   669         self._init_sizers()
   731         self._init_sizers()
   670         
   732         
   671         if self.EnableDebug:
   733         if self.EnableDebug:
   672             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   734             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   673             self.RightNoteBook.AddPage(self.DebugVariablePanel, _("Debugger"))
   735             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
       
   736             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   674         
   737         
   675         if USE_AUI:
   738         if USE_AUI:
   676             self.AUIManager.Update()
   739             self.AUIManager.Update()
   677     
   740     
   678     ## Constructor of the PLCOpenEditor class.
   741     ## Constructor of the PLCOpenEditor class.
   735         self.Highlights = {}
   798         self.Highlights = {}
   736         self.DrawingMode = FREEDRAWING_MODE
   799         self.DrawingMode = FREEDRAWING_MODE
   737         #self.DrawingMode = DRIVENDRAWING_MODE
   800         #self.DrawingMode = DRIVENDRAWING_MODE
   738         if USE_AUI:
   801         if USE_AUI:
   739             self.AuiTabCtrl = []
   802             self.AuiTabCtrl = []
       
   803         self.Starting = False
       
   804         self.DefaultPerspective = None
   740         
   805         
   741         # Initialize Printing configuring elements
   806         # Initialize Printing configuring elements
   742         self.PrintData = wx.PrintData()
   807         self.PrintData = wx.PrintData()
   743         self.PrintData.SetPaperId(wx.PAPER_A4)
   808         self.PrintData.SetPaperId(wx.PAPER_A4)
   744         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   809         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   748         
   813         
   749         self.SetRefreshFunctions()
   814         self.SetRefreshFunctions()
   750     
   815     
   751     def Show(self):
   816     def Show(self):
   752         wx.Frame.Show(self)
   817         wx.Frame.Show(self)
   753         wx.CallAfter(self.RestoreFrameSize)
   818         wx.CallAfter(self.RestoreLastState)
   754     
   819     
   755     def OnActivated(self, event):
   820     def OnActivated(self, event):
   756         if event.GetActive():
   821         if event.GetActive():
   757             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   822             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   758         event.Skip()
   823         event.Skip()
   759     
   824 
   760     def RestoreFrameSize(self):
   825 #-------------------------------------------------------------------------------
       
   826 #                Saving and restoring frame organization functions
       
   827 #-------------------------------------------------------------------------------
       
   828 
       
   829     def OnResize(self, event):
       
   830         if self.Starting:
       
   831             self.RestoreLastOrganization()
       
   832             self.Starting = False
       
   833             self.RefreshEditor()
       
   834         event.Skip()
       
   835     
       
   836     def GetTabInfos(self, tab):
       
   837         if isinstance(tab, EditorPanel):
       
   838             if tab.IsDebugging():
       
   839                 return ("debug", tab.GetInstancePath())
       
   840             else:
       
   841                 return ("editor", tab.GetTagName())
       
   842         else:
       
   843             for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
       
   844                 if page_ref == tab:
       
   845                     return ("main", page_name)
       
   846         return None
       
   847         
       
   848     def SaveTabOrganization(self, notebook):
       
   849         tabs = []
       
   850         for child in notebook.GetChildren():
       
   851             if isinstance(child, wx.aui.AuiTabCtrl):
       
   852                 pos = child.GetPosition()
       
   853                 tab = {"pos": (pos.x, pos.y), "pages": []}
       
   854                 tab_size = child.GetSize()
       
   855                 for page_idx in xrange(child.GetPageCount()):
       
   856                     page = child.GetWindowFromIdx(page_idx)
       
   857                     if not tab.has_key("size"):
       
   858                         tab["size"] = (tab_size[0], tab_size[1] + page.GetSize()[1])
       
   859                     tab_infos = self.GetTabInfos(page)
       
   860                     if tab_infos is not None:
       
   861                         tab["pages"].append((tab_infos, page_idx == child.GetActivePage()))
       
   862                 tabs.append(tab)
       
   863         tabs.sort(lambda x, y: cmp(x["pos"], y["pos"]))
       
   864         size = notebook.GetSize()
       
   865         return ComputeTabsOrganization(tabs, wx.Rect(1, 1, size[0] - 2, size[1] - 2))
       
   866     
       
   867     def LoadTab(self, notebook, page_infos):
       
   868         if page_infos[0] == "main":
       
   869             infos = self.MainTabs.get(page_infos[1])
       
   870             if infos is not None:
       
   871                 page_ref, page_title = infos
       
   872                 notebook.AddPage(page_ref, page_title)
       
   873                 return notebook.GetPageIndex(page_ref)
       
   874         elif page_infos[0] == "editor":
       
   875             tagname = page_infos[1]
       
   876             page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
       
   877             page_ref.RefreshView()
       
   878             return notebook.GetPageIndex(page_ref)
       
   879         elif page_infos[0] == "debug":
       
   880             instance_path = page_infos[1]
       
   881             item = self.GetInstancesTreeItem(self.InstancesTree.GetRootItem(), instance_path)
       
   882             item_infos = self.InstancesTree.GetPyData(item)
       
   883             if item_infos[1] is not None:
       
   884                 instance_type = item_infos[1]
       
   885             else:
       
   886                 instance_type = self.InstancesTree.GetItemText(item).split(" (")[1].split(")")[0]
       
   887             return notebook.GetPageIndex(self.OpenDebugViewer(item_infos[0], instance_path, instance_type))
       
   888         return None
       
   889             
       
   890     def LoadTabOrganization(self, notebook, tabs, mode="all", first_index=None):
       
   891         if isinstance(tabs, ListType):
       
   892             if len(tabs) == 0:
       
   893                 return
       
   894             raise ValueError, "Not supported"
       
   895         
       
   896         if tabs.has_key("split"):
       
   897             self.LoadTabOrganization(notebook, tabs["others"])
       
   898             
       
   899             split_dir, split_ratio = tabs["split"]
       
   900             first_index = self.LoadTabOrganization(notebook, tabs["tab"], mode="first")
       
   901             notebook.Split(first_index, split_dir)
       
   902             self.LoadTabOrganization(notebook, tabs["tab"], mode="others", first_index=first_index)
       
   903             
       
   904         elif mode == "first":
       
   905             return self.LoadTab(notebook, tabs["pages"][0][0])
       
   906         else:
       
   907             selected = first_index
       
   908             if mode == "others":
       
   909                 add_tabs = tabs["pages"][1:]
       
   910             else:
       
   911                 add_tabs = tabs["pages"]
       
   912             for page_infos, page_selected in add_tabs:
       
   913                 page_idx = self.LoadTab(notebook, page_infos)
       
   914                 if page_selected:
       
   915                     selected = page_idx
       
   916             if selected is not None:
       
   917                 wx.CallAfter(notebook.SetSelection, selected)
       
   918         
       
   919     def RestoreLastState(self):
   761         frame_size = None
   920         frame_size = None
   762         if self.Config.HasEntry("framesize"):
   921         if self.Config.HasEntry("framesize"):
   763             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   922             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   764         
   923         
       
   924         self.Starting = True
   765         if frame_size is None:
   925         if frame_size is None:
   766             self.Maximize()
   926             self.Maximize()
   767         else:
   927         else:
   768             self.SetClientSize(frame_size)
   928             self.SetClientSize(frame_size)
   769     
   929         
   770     def SaveFrameSize(self):
   930     def RestoreLastOrganization(self):
       
   931         if USE_AUI:
       
   932             notebooks = {}
       
   933             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   934                                          (self.BottomNoteBook, "bottomnotebook"),
       
   935                                          (self.RightNoteBook, "rightnotebook")]:
       
   936                 notebooks[entry_name] = self.SaveTabOrganization(notebook)
       
   937             self.DefaultPerspective = {
       
   938                 "perspective": self.AUIManager.SavePerspective(),
       
   939                 "notebooks": notebooks,
       
   940             }
       
   941             
       
   942             if self.Config.HasEntry("perspective"):
       
   943                 self.AUIManager.LoadPerspective(str(self.Config.Read("perspective")))
       
   944         
       
   945             if self.Config.HasEntry("notebooks"):
       
   946                 notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
       
   947                 
       
   948                 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
   949                     for idx in xrange(notebook.GetPageCount()):
       
   950                         notebook.RemovePage(0)
       
   951                         
       
   952                 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   953                                              (self.BottomNoteBook, "bottomnotebook"),
       
   954                                              (self.RightNoteBook, "rightnotebook")]:
       
   955                     self.LoadTabOrganization(notebook, notebooks.get(entry_name))
       
   956     
       
   957             self.LoadProjectOrganization()
       
   958     
       
   959     def SaveLastState(self):
   771         if not self.IsMaximized():
   960         if not self.IsMaximized():
   772             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   961             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   773         elif self.Config.HasEntry("framesize"):
   962         elif self.Config.HasEntry("framesize"):
   774             self.Config.DeleteEntry("framesize")
   963             self.Config.DeleteEntry("framesize")
       
   964         
       
   965         if USE_AUI:
       
   966             notebooks = {}
       
   967             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
   968                                          (self.BottomNoteBook, "bottomnotebook"),
       
   969                                          (self.RightNoteBook, "rightnotebook")]:
       
   970                 notebooks[entry_name] = self.SaveTabOrganization(notebook)
       
   971             self.Config.Write("notebooks", cPickle.dumps(notebooks))
       
   972             
       
   973             self.Config.Write("perspective", self.AUIManager.SavePerspective())
       
   974         
       
   975             self.SaveProjectOrganization()
       
   976         
   775         self.Config.Flush()
   977         self.Config.Flush()
   776 
   978 
       
   979     def SaveProjectOrganization(self):
       
   980         if USE_AUI and self.Controler is not None:
       
   981             tabs = []
       
   982             
       
   983             if self.Config.HasEntry("projects"):
       
   984                 projects = cPickle.loads(str(self.Config.Read("projects")))
       
   985             else:
       
   986                 projects = {}
       
   987             
       
   988             project_infos = {
       
   989                 "tabs": self.SaveTabOrganization(self.TabsOpened)
       
   990             }
       
   991             if self.EnableDebug:
       
   992                 project_infos["debug_vars"] = self.DebugVariablePanel.GetDebugVariables()
       
   993                 
       
   994             projects[os.path.realpath(self.Controler.GetFilePath())] = project_infos    
       
   995             
       
   996             self.Config.Write("projects", cPickle.dumps(projects))
       
   997             self.Config.Flush()
       
   998     
       
   999     def LoadProjectOrganization(self):
       
  1000         if USE_AUI and self.Controler is not None and self.Config.HasEntry("projects"):
       
  1001             projects = cPickle.loads(str(self.Config.Read("projects")))
       
  1002             
       
  1003             project = projects.get(os.path.realpath(self.Controler.GetFilePath()))
       
  1004             if project is not None:
       
  1005                 self.LoadTabOrganization(self.TabsOpened, project["tabs"])
       
  1006             
       
  1007                 if self.EnableDebug:
       
  1008                     for variable in project["debug_vars"]:
       
  1009                         self.DebugVariablePanel.InsertValue(variable, force=True)
       
  1010             
   777 #-------------------------------------------------------------------------------
  1011 #-------------------------------------------------------------------------------
   778 #                               General Functions
  1012 #                               General Functions
   779 #-------------------------------------------------------------------------------
  1013 #-------------------------------------------------------------------------------
   780 
  1014 
   781     def SetRefreshFunctions(self):
  1015     def SetRefreshFunctions(self):
  1225                 window.RefreshVisibleElements()
  1459                 window.RefreshVisibleElements()
  1226                 window.RefreshScrollBars()
  1460                 window.RefreshScrollBars()
  1227             event.Skip()
  1461             event.Skip()
  1228         return ZoomFunction
  1462         return ZoomFunction
  1229 
  1463 
       
  1464     def OnResetPerspective(self, event):
       
  1465         if USE_AUI and self.DefaultPerspective is not None:
       
  1466             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
       
  1467         
       
  1468             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
       
  1469                 for idx in xrange(notebook.GetPageCount()):
       
  1470                     notebook.RemovePage(0)
       
  1471                         
       
  1472             notebooks = self.DefaultPerspective["notebooks"]
       
  1473             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
       
  1474                                          (self.BottomNoteBook, "bottomnotebook"),
       
  1475                                          (self.RightNoteBook, "rightnotebook")]:
       
  1476                 self.LoadTabOrganization(notebook, notebooks.get(entry_name))
  1230 
  1477 
  1231 #-------------------------------------------------------------------------------
  1478 #-------------------------------------------------------------------------------
  1232 #                      Project Editor Panels Management Functions
  1479 #                      Project Editor Panels Management Functions
  1233 #-------------------------------------------------------------------------------
  1480 #-------------------------------------------------------------------------------
  1234     
  1481     
  1253                 if pane.IsMaximized():
  1500                 if pane.IsMaximized():
  1254                     self.AUIManager.RestorePane(pane)
  1501                     self.AUIManager.RestorePane(pane)
  1255                 self.AUIManager.Update()
  1502                 self.AUIManager.Update()
  1256     
  1503     
  1257     def OnPouSelectedChanging(self, event):
  1504     def OnPouSelectedChanging(self, event):
       
  1505         if not self.Starting:
       
  1506             selected = self.TabsOpened.GetSelection()
       
  1507             if selected >= 0:
       
  1508                 window = self.TabsOpened.GetPage(selected)
       
  1509                 if not window.IsDebugging():
       
  1510                     window.ResetBuffer()
       
  1511         event.Skip()
       
  1512     
       
  1513     def OnPouSelectedChanged(self, event):
       
  1514         if not self.Starting:
       
  1515             selected = self.TabsOpened.GetSelection()
       
  1516             if selected >= 0:
       
  1517                 window = self.TabsOpened.GetPage(selected)
       
  1518                 if not window.IsDebugging():
       
  1519                     wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName())
       
  1520                     window.RefreshView()
       
  1521                 else:
       
  1522                     wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath())
       
  1523             wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
       
  1524         event.Skip()
       
  1525 
       
  1526     def RefreshEditor(self):
  1258         selected = self.TabsOpened.GetSelection()
  1527         selected = self.TabsOpened.GetSelection()
  1259         if selected >= 0:
  1528         if selected >= 0:
  1260             window = self.TabsOpened.GetPage(selected)
  1529             window = self.TabsOpened.GetPage(selected)
  1261             if not window.IsDebugging():
  1530             if not window.IsDebugging():
  1262                 window.ResetBuffer()
  1531                 self.SelectTypesTreeItem(window.GetTagName())
  1263         event.Skip()
  1532             else:
  1264     
  1533                 self.SelectInstancesTreeItem(window.GetInstancePath())
  1265     def OnPouSelectedChanged(self, event):
  1534             if USE_AUI:
  1266         selected = self.TabsOpened.GetSelection()
  1535                 for child in self.TabsOpened.GetChildren():
  1267         if selected >= 0:
  1536                     if isinstance(child, wx.aui.AuiTabCtrl):
  1268             window = self.TabsOpened.GetPage(selected)
  1537                         active_page = child.GetActivePage()
  1269             if not window.IsDebugging():
  1538                         if active_page >= 0:
  1270                 wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName())
  1539                             window = child.GetWindowFromIdx(active_page)
       
  1540                             window.RefreshView()
       
  1541             else:
  1271                 window.RefreshView()
  1542                 window.RefreshView()
  1272             else:
  1543             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1273                 wx.CallAfter(self.SelectInstancesTreeItem, window.GetInstancePath())
       
  1274         wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
       
  1275         event.Skip()
       
  1276 
       
  1277     def RefreshEditor(self):
       
  1278         selected = self.TabsOpened.GetSelection()
       
  1279         if USE_AUI:
       
  1280             for child in self.TabsOpened.GetChildren():
       
  1281                 if isinstance(child, wx.aui.AuiTabCtrl):
       
  1282                     active_page = child.GetActivePage()
       
  1283                     if active_page >= 0:
       
  1284                         window = child.GetWindowFromIdx(active_page)
       
  1285                         window.RefreshView()
       
  1286         elif selected >= 0:
       
  1287             window = self.TabsOpened.GetPage(idx)
       
  1288             window.RefreshView()
       
  1289     
  1544     
  1290     def RefreshEditorNames(self, old_tagname, new_tagname):
  1545     def RefreshEditorNames(self, old_tagname, new_tagname):
  1291         for i in xrange(self.TabsOpened.GetPageCount()):
  1546         for i in xrange(self.TabsOpened.GetPageCount()):
  1292             editor = self.TabsOpened.GetPage(i)
  1547             editor = self.TabsOpened.GetPage(i)
  1293             if editor.GetTagName() == old_tagname:
  1548             if editor.GetTagName() == old_tagname:
  1644                     icon = self.GenerateBitmap("TRANSITION", bodytype)
  1899                     icon = self.GenerateBitmap("TRANSITION", bodytype)
  1645                 elif element == ITEM_ACTION:
  1900                 elif element == ITEM_ACTION:
  1646                     icon = self.GenerateBitmap("ACTION", bodytype)
  1901                     icon = self.GenerateBitmap("ACTION", bodytype)
  1647                 new_window.SetIcon(icon)
  1902                 new_window.SetIcon(icon)
  1648                 self.AddPage(new_window, "")
  1903                 self.AddPage(new_window, "")
  1649                 words = tagname.split("::")
       
  1650             elif element == ITEM_DATATYPE:
  1904             elif element == ITEM_DATATYPE:
  1651                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1905                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1652                 new_window.SetIcon(self.GenerateBitmap("DATATYPE"))
  1906                 new_window.SetIcon(self.GenerateBitmap("DATATYPE"))
  1653                 self.AddPage(new_window, "")
  1907                 self.AddPage(new_window, "")
  1654             elif isinstance(element, EditorPanel):
  1908             elif isinstance(element, EditorPanel):
  1664                     window = self.TabsOpened.GetPage(i)
  1918                     window = self.TabsOpened.GetPage(i)
  1665                     if window == new_window:
  1919                     if window == new_window:
  1666                         self.TabsOpened.SetSelection(i)
  1920                         self.TabsOpened.SetSelection(i)
  1667                         window.SetFocus()
  1921                         window.SetFocus()
  1668                 self.RefreshPageTitles()
  1922                 self.RefreshPageTitles()
       
  1923             return new_window
  1669     
  1924     
  1670     def OnTypesTreeRightUp(self, event):
  1925     def OnTypesTreeRightUp(self, event):
  1671         if wx.Platform == '__WXMSW__':
  1926         if wx.Platform == '__WXMSW__':
  1672             item = event.GetItem()
  1927             item = event.GetItem()
  1673         else:
  1928         else:
  1852 
  2107 
  1853     def OnInstancesTreeItemActivated(self, event):
  2108     def OnInstancesTreeItemActivated(self, event):
  1854         if self.Controler.DebugAvailable():
  2109         if self.Controler.DebugAvailable():
  1855             selected_item = event.GetItem()
  2110             selected_item = event.GetItem()
  1856             selected_infos = self.InstancesTree.GetPyData(selected_item)
  2111             selected_infos = self.InstancesTree.GetPyData(selected_item)
  1857             if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]:
  2112             if selected_item is not None and (
  1858                 instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
  2113                 selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION] or
       
  2114                 selected_infos[0] in ITEMS_VARIABLE):
       
  2115                 
       
  2116                 instance_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  2117                 if selected_infos[1] is not None:
       
  2118                     instance_type = selected_infos[1]
       
  2119                 else:
       
  2120                     instance_type = var_type.split(")")[0]
  1859                 parent_item = self.InstancesTree.GetItemParent(selected_item)
  2121                 parent_item = self.InstancesTree.GetItemParent(selected_item)
  1860                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
  2122                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
  1861                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
  2123                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
  1862                     instance_path = "%s.%s"%(parent_name, instance_path)
  2124                     instance_path = "%s.%s"%(parent_name, instance_path)
  1863                     parent_item = self.InstancesTree.GetItemParent(parent_item)
  2125                     parent_item = self.InstancesTree.GetItemParent(parent_item)
  1864                 openedidx = self.IsOpened(instance_path)
       
  1865                 if openedidx is not None:
       
  1866                     old_selected = self.TabsOpened.GetSelection()
       
  1867                     if old_selected != openedidx:
       
  1868                         if old_selected >= 0:
       
  1869                             self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1870                         self.TabsOpened.SetSelection(openedidx)
       
  1871                 elif selected_infos[1] is not None:
       
  1872                     bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], True)
       
  1873                     if bodytype == "FBD":
       
  1874                         new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1875                         new_window.RefreshScaling(False)
       
  1876                     elif bodytype == "LD":
       
  1877                         new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1878                         new_window.RefreshScaling(False)
       
  1879                     elif bodytype == "SFC":
       
  1880                         new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1881                         new_window.RefreshScaling(False)
       
  1882                     else:
       
  1883                         new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1884                         new_window.SetTextSyntax(bodytype)
       
  1885                         if bodytype == "IL":
       
  1886                             new_window.SetKeywords(IL_KEYWORDS)
       
  1887                         else:
       
  1888                             new_window.SetKeywords(ST_KEYWORDS)
       
  1889                     if selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]:
       
  1890                         pou_type = self.Controler.GetEditedElementType(selected_infos[1], True)[1].upper()
       
  1891                         icon = self.GenerateBitmap(pou_type, bodytype)
       
  1892                     elif selected_infos[0] == ITEM_TRANSITION:
       
  1893                         icon = self.GenerateBitmap("TRANSITION", bodytype)
       
  1894                     elif selected_infos[0] == ITEM_ACTION:
       
  1895                         icon = self.GenerateBitmap("ACTION", bodytype)
       
  1896                     new_window.SetIcon(icon)
       
  1897                     self.AddPage(new_window, "")
       
  1898                     new_window.RefreshView()
       
  1899                     new_window.SetFocus()
       
  1900                     self.RefreshPageTitles()
       
  1901             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  1902                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  1903                 var_type = var_type.split(")")[0]
       
  1904                 
  2126                 
  1905                 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\
  2127                 self.OpenDebugViewer(selected_infos[0], instance_path, instance_type)
  1906                    self.Controler.IsOfType(var_type, "ANY_BIT", True):
  2128         
  1907                     parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1908                     while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1909                         parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1910                         var_path = "%s.%s"%(parent_name, var_path)
       
  1911                         parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1912                     
       
  1913                     self.OpenGraphicViewer(var_path)
       
  1914         event.Skip()
  2129         event.Skip()
       
  2130 
       
  2131     def OpenDebugViewer(self, instance_category, instance_path, instance_type):
       
  2132         openedidx = self.IsOpened(instance_path)
       
  2133         if openedidx is not None:
       
  2134             old_selected = self.TabsOpened.GetSelection()
       
  2135             if old_selected != openedidx:
       
  2136                 if old_selected >= 0:
       
  2137                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  2138                 self.TabsOpened.SetSelection(openedidx)
       
  2139         
       
  2140         elif instance_category in ITEMS_VARIABLE:
       
  2141             if self.Controler.IsOfType(instance_type, "ANY_NUM", True) or\
       
  2142                self.Controler.IsOfType(instance_type, "ANY_BIT", True):
       
  2143                 
       
  2144                 return self.OpenGraphicViewer(instance_path)
       
  2145         
       
  2146         else:
       
  2147             bodytype = self.Controler.GetEditedElementBodyType(instance_type, True)
       
  2148             new_window = None
       
  2149             if bodytype == "FBD":
       
  2150                 new_window = Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
       
  2151                 new_window.RefreshScaling(False)
       
  2152             elif bodytype == "LD":
       
  2153                 new_window = LD_Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
       
  2154                 new_window.RefreshScaling(False)
       
  2155             elif bodytype == "SFC":
       
  2156                 new_window = SFC_Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
       
  2157                 new_window.RefreshScaling(False)
       
  2158             else:
       
  2159                 new_window = TextViewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
       
  2160                 new_window.SetTextSyntax(bodytype)
       
  2161                 if bodytype == "IL":
       
  2162                     new_window.SetKeywords(IL_KEYWORDS)
       
  2163                 else:
       
  2164                     new_window.SetKeywords(ST_KEYWORDS)
       
  2165             if new_window is not None:
       
  2166                 if instance_category in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]:
       
  2167                     pou_type = self.Controler.GetEditedElementType(instance_type, True)[1].upper()
       
  2168                     icon = self.GenerateBitmap(pou_type, bodytype)
       
  2169                 elif instance_category == ITEM_TRANSITION:
       
  2170                     icon = self.GenerateBitmap("TRANSITION", bodytype)
       
  2171                 elif instance_category == ITEM_ACTION:
       
  2172                     icon = self.GenerateBitmap("ACTION", bodytype)
       
  2173                 new_window.SetIcon(icon)
       
  2174                 self.AddPage(new_window, "")
       
  2175                 new_window.RefreshView()
       
  2176                 new_window.SetFocus()
       
  2177                 self.RefreshPageTitles()
       
  2178             return new_window
       
  2179         
       
  2180         return None
  1915 
  2181 
  1916     def OpenGraphicViewer(self, var_path):
  2182     def OpenGraphicViewer(self, var_path):
  1917         new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path)
  2183         new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path)
  1918         self.AddPage(new_window, "")
  2184         self.AddPage(new_window, "")
  1919         new_window.RefreshView()
  2185         new_window.RefreshView()
  1920         new_window.SetFocus()
  2186         new_window.SetFocus()
  1921         self.RefreshPageTitles()
  2187         self.RefreshPageTitles()
       
  2188         return new_window
  1922 
  2189 
  1923     def OnInstancesTreeRightUp(self, event):
  2190     def OnInstancesTreeRightUp(self, event):
  1924         if self.Controler.DebugAvailable():
  2191         if self.Controler.DebugAvailable():
  1925             if wx.Platform == '__WXMSW__':
  2192             if wx.Platform == '__WXMSW__':
  1926                 selected_item = event.GetItem()
  2193                 selected_item = event.GetItem()
  2689     def OnCloseFrame(self, event):
  2956     def OnCloseFrame(self, event):
  2690         if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")):
  2957         if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")):
  2691             if USE_AUI:
  2958             if USE_AUI:
  2692                 self.AUIManager.UnInit()
  2959                 self.AUIManager.UnInit()
  2693             
  2960             
  2694             self.SaveFrameSize()
  2961             self.SaveLastState()
  2695             
  2962             
  2696             event.Skip()
  2963             event.Skip()
  2697         else:
  2964         else:
  2698             event.Veto()
  2965             event.Veto()
  2699 
  2966 
  2785             if os.path.isfile(filepath):
  3052             if os.path.isfile(filepath):
  2786                 self.ResetView()
  3053                 self.ResetView()
  2787                 self.Controler = PLCControler()
  3054                 self.Controler = PLCControler()
  2788                 result = self.Controler.OpenXMLFile(filepath)
  3055                 result = self.Controler.OpenXMLFile(filepath)
  2789                 if result is None:
  3056                 if result is None:
       
  3057                     self.LoadProjectOrganization()
  2790                     self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  3058                     self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2791             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  3059             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  2792         dialog.Destroy()
  3060         dialog.Destroy()
  2793         
  3061         
  2794         if result is not None:
  3062         if result is not None:
  2795             self.ShowErrorMessage(result)
  3063             self.ShowErrorMessage(result)
  2796     
  3064     
  2797     def OnCloseProjectMenu(self, event):
  3065     def OnCloseProjectMenu(self, event):
  2798         if not self.CheckSaveBeforeClosing():
  3066         if not self.CheckSaveBeforeClosing():
  2799             return
  3067             return
       
  3068         self.SaveProjectOrganization()
  2800         self.ResetView()
  3069         self.ResetView()
  2801         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  3070         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  2802 
  3071 
  2803     def OnSaveProjectMenu(self, event):
  3072     def OnSaveProjectMenu(self, event):
  2804         self.SaveProject()
  3073         self.SaveProject()
  4214         items.reverse()
  4483         items.reverse()
  4215         for idx, item in items:
  4484         for idx, item in items:
  4216             if self.GetDataType(item.GetVariable().upper()) is None:
  4485             if self.GetDataType(item.GetVariable().upper()) is None:
  4217                 self.RemoveDataConsumer(item)
  4486                 self.RemoveDataConsumer(item)
  4218                 self.Table.RemoveItem(idx)
  4487                 self.Table.RemoveItem(idx)
       
  4488             else:
       
  4489                 self.AddDataConsumer(iec_path.upper(), item)
  4219         self.Freeze()
  4490         self.Freeze()
  4220         self.Table.ResetView(self.VariablesGrid)
  4491         self.Table.ResetView(self.VariablesGrid)
  4221         self.VariablesGrid.RefreshButtons()
  4492         self.VariablesGrid.RefreshButtons()
  4222         self.Thaw()
  4493         self.Thaw()
  4223     
  4494     
  4261                 menu.Enable(new_id, False)
  4532                 menu.Enable(new_id, False)
  4262             self.PopupMenu(menu)
  4533             self.PopupMenu(menu)
  4263             menu.Destroy()
  4534             menu.Destroy()
  4264         event.Skip()
  4535         event.Skip()
  4265     
  4536     
  4266     def InsertValue(self, iec_path, idx = None):
  4537     def InsertValue(self, iec_path, idx = None, force=False):
  4267         if idx is None:
  4538         if idx is None:
  4268             idx = self.Table.GetNumberRows()
  4539             idx = self.Table.GetNumberRows()
  4269         for item in self.Table.GetData():
  4540         for item in self.Table.GetData():
  4270             if iec_path == item.GetVariable():
  4541             if iec_path == item.GetVariable():
  4271                 return
  4542                 return
  4272         item = VariableTableItem(self, iec_path, "")
  4543         item = VariableTableItem(self, iec_path, "")
  4273         result = self.AddDataConsumer(iec_path.upper(), item)
  4544         result = self.AddDataConsumer(iec_path.upper(), item)
  4274         if result is not None:
  4545         if result is not None or force:
  4275             self.Table.InsertItem(idx, item)
  4546             self.Table.InsertItem(idx, item)
  4276             self.RefreshGrid()
  4547             self.RefreshGrid()
  4277 
  4548         
       
  4549     def GetDebugVariables(self):
       
  4550         return [item.GetVariable() for item in self.Table.GetData()]
  4278         
  4551         
  4279 #-------------------------------------------------------------------------------
  4552 #-------------------------------------------------------------------------------
  4280 #                               Viewer Printout
  4553 #                               Viewer Printout
  4281 #-------------------------------------------------------------------------------
  4554 #-------------------------------------------------------------------------------
  4282 
  4555