PLCOpenEditor.py
changeset 407 0a324a874981
parent 403 2160fd6d83ed
child 411 9ab97d517ae8
equal deleted inserted replaced
406:af07b091bbee 407:0a324a874981
   109 from DataTypeEditor import *
   109 from DataTypeEditor import *
   110 from PLCControler import *
   110 from PLCControler import *
   111 from plcopen.structures import LOCATIONDATATYPES
   111 from plcopen.structures import LOCATIONDATATYPES
   112 
   112 
   113 # Define PLCOpenEditor controls id
   113 # Define PLCOpenEditor controls id
   114 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
   114 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
       
   115  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   115  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   116  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   116  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   117  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   117  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   118  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   118  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   119  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   119  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
   120  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
   120  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
   121  ID_PLCOPENEDITORTOOLBAR, ID_PLCOPENEDITORDEFAULTTOOLBAR, 
   121  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
   122  ID_PLCOPENEDITORSFCTOOLBAR, ID_PLCOPENEDITORFBDTOOLBAR, 
   122  ID_PLCOPENEDITORLDTOOLBAR,
   123  ID_PLCOPENEDITORLDTOOLBAR,
   123 ] = [wx.NewId() for _init_ctrls in range(17)]
   124 ] = [wx.NewId() for _init_ctrls in range(19)]
   124 
   125 
   125 # Define PLCOpenEditor FileMenu extra items id
   126 # Define PLCOpenEditor FileMenu extra items id
   126 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   127 [ID_PLCOPENEDITORFILEMENUGENERATE, 
   127 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   128 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   128 
   129 
   271     return tree.GetItemText(parent_item)
   272     return tree.GetItemText(parent_item)
   272 
   273 
   273 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   274 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
   274     def DeleteElementFunction(self, selected):
   275     def DeleteElementFunction(self, selected):
   275         name = self.TypesTree.GetItemText(selected)
   276         name = self.TypesTree.GetItemText(selected)
   276         if check_function is None or not check_function(self.Controler, name, self.Debug):
   277         if check_function is None or not check_function(self.Controler, name):
   277             if parent_type is not None:
   278             if parent_type is not None:
   278                 parent_name = GetParentName(self.TypesTree, selected, parent_type)
   279                 parent_name = GetParentName(self.TypesTree, selected, parent_type)
   279                 remove_function(self.Controler, parent_name, name)
   280                 remove_function(self.Controler, parent_name, name)
   280             else:
   281             else:
   281                 remove_function(self.Controler, name)
   282                 remove_function(self.Controler, name)
   283             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   284             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   284     return DeleteElementFunction
   285     return DeleteElementFunction
   285 
   286 
   286 
   287 
   287 #-------------------------------------------------------------------------------
   288 #-------------------------------------------------------------------------------
   288 #                            PLCOpenEditor Main Class
   289 #                              IDEFrame Base Class
   289 #-------------------------------------------------------------------------------
   290 #-------------------------------------------------------------------------------
   290 
   291 
   291 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   292 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   292 
   293 
   293 class PLCOpenEditor(wx.Frame):
   294 class IDEFrame(wx.Frame):
   294     
   295     
   295     # Compatibility function for wx versions < 2.6
   296     # Compatibility function for wx versions < 2.6
   296     if wx.VERSION < (2, 6, 0):
   297     if wx.VERSION < (2, 6, 0):
   297         def Bind(self, event, function, id = None):
   298         def Bind(self, event, function, id = None):
   298             if id is not None:
   299             if id is not None:
   300             else:
   301             else:
   301                 event(self, function)
   302                 event(self, function)
   302     
   303     
   303     def _init_coll_MenuBar_Menus(self, parent):
   304     def _init_coll_MenuBar_Menus(self, parent):
   304         parent.Append(menu=self.FileMenu, title=_(u'File'))
   305         parent.Append(menu=self.FileMenu, title=_(u'File'))
   305         if not self.Debug:
   306         parent.Append(menu=self.EditMenu, title=_(u'Edit'))
   306             parent.Append(menu=self.EditMenu, title=_(u'Edit'))
       
   307         parent.Append(menu=self.DisplayMenu, title=_(u'Display'))
   307         parent.Append(menu=self.DisplayMenu, title=_(u'Display'))
   308         parent.Append(menu=self.HelpMenu, title=_(u'Help'))
   308         parent.Append(menu=self.HelpMenu, title=_(u'Help'))
   309 
   309 
   310     def _init_coll_FileMenu_Items(self, parent):
   310     def _init_coll_FileMenu_Items(self, parent):
   311         if self.ModeSolo:
   311         pass
   312             AppendMenu(parent, help='', id=wx.ID_NEW,
       
   313                   kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N'))
       
   314             AppendMenu(parent, help='', id=wx.ID_OPEN,
       
   315                   kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O'))
       
   316         AppendMenu(parent, help='', id=wx.ID_CLOSE,
       
   317               kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W'))
       
   318         if self.ModeSolo:
       
   319             AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
       
   320                   kind=wx.ITEM_NORMAL, text=_(u'Close Project'))
       
   321             parent.AppendSeparator()
       
   322         if not self.Debug:
       
   323             AppendMenu(parent, help='', id=wx.ID_SAVE,
       
   324                   kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S'))
       
   325         if self.ModeSolo:
       
   326             AppendMenu(parent, help='', id=wx.ID_SAVEAS,
       
   327                   kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S'))
       
   328             AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
       
   329                   kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G'))
       
   330             parent.AppendSeparator()
       
   331         AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
       
   332               kind=wx.ITEM_NORMAL, text=_(u'Page Setup'))
       
   333         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
       
   334               kind=wx.ITEM_NORMAL, text=_(u'Preview'))
       
   335         AppendMenu(parent, help='', id=wx.ID_PRINT,
       
   336               kind=wx.ITEM_NORMAL, text=_(u'Print'))
       
   337         if not self.Debug:
       
   338             parent.AppendSeparator()
       
   339             AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
       
   340                   kind=wx.ITEM_NORMAL, text=_(u'Properties'))
       
   341         parent.AppendSeparator()
       
   342         if self.ModeSolo:
       
   343             AppendMenu(parent, help='', id=wx.ID_EXIT,
       
   344                   kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q'))
       
   345         else:
       
   346             AppendMenu(parent, help='', id=wx.ID_STOP,
       
   347                   kind=wx.ITEM_NORMAL, text=_(u'Close\tCTRL+Q'))
       
   348         
       
   349         if self.ModeSolo:
       
   350             self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
       
   351             self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
       
   352         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
       
   353         if self.ModeSolo:
       
   354             self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
       
   355         if not self.Debug:
       
   356             self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
       
   357         if self.ModeSolo:
       
   358             self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
       
   359             self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
       
   360                   id=ID_PLCOPENEDITORFILEMENUGENERATE)
       
   361         self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
       
   362         self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
       
   363         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
       
   364         if not self.Debug:
       
   365             self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
       
   366         if self.ModeSolo:
       
   367             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
       
   368         else:
       
   369             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP)
       
   370     
   312     
   371     def _init_coll_EditMenu_Items(self, parent):
   313     def _init_coll_EditMenu_Items(self, parent):
   372         AppendMenu(parent, help='', id=wx.ID_UNDO,
   314         AppendMenu(parent, help='', id=wx.ID_UNDO,
   373               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   315               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   374         AppendMenu(parent, help='', id=wx.ID_REDO,
   316         AppendMenu(parent, help='', id=wx.ID_REDO,
   419         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   361         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   420 
   362 
   421     def _init_coll_DisplayMenu_Items(self, parent):
   363     def _init_coll_DisplayMenu_Items(self, parent):
   422         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   364         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   423               kind=wx.ITEM_NORMAL, text=_(u'Refresh\tF5'))
   365               kind=wx.ITEM_NORMAL, text=_(u'Refresh\tF5'))
   424         if not self.Debug and not self.ModeSolo:
   366         if self.EnableDebug:
   425             AppendMenu(parent, help='', id=wx.ID_CLEAR,
   367             AppendMenu(parent, help='', id=wx.ID_CLEAR,
   426                   kind=wx.ITEM_NORMAL, text=_(u'Clear Errors\tCTRL+K'))
   368                   kind=wx.ITEM_NORMAL, text=_(u'Clear Errors\tCTRL+K'))
   427         parent.AppendSeparator()
   369         parent.AppendSeparator()
   428         zoommenu = wx.Menu(title='')
   370         zoommenu = wx.Menu(title='')
   429         parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
   371         parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
   431             new_id = wx.NewId()
   373             new_id = wx.NewId()
   432             AppendMenu(zoommenu, help='', id=new_id,
   374             AppendMenu(zoommenu, help='', id=new_id,
   433                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   375                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   434             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   376             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   435         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   377         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   436         if not self.Debug and not self.ModeSolo:
   378         if self.EnableDebug:
   437             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   379             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   438 
   380 
   439     def _init_coll_HelpMenu_Items(self, parent):
   381     def _init_coll_HelpMenu_Items(self, parent):
   440         AppendMenu(parent, help='', id=wx.ID_HELP, 
   382         pass
   441             kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor\tF1'))
       
   442         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
       
   443         #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
       
   444         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
       
   445         #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
       
   446         if self.ModeSolo:
       
   447             AppendMenu(parent, help='', id=wx.ID_ABOUT,
       
   448                   kind=wx.ITEM_NORMAL, text=_(u'About'))
       
   449         self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
       
   450         #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
       
   451         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
       
   452 
   383 
   453     def _init_utils(self):
   384     def _init_utils(self):
   454         self.MenuBar = wx.MenuBar()
   385         self.MenuBar = wx.MenuBar()
   455 
   386 
   456         self.FileMenu = wx.Menu(title='')
   387         self.FileMenu = wx.Menu(title='')
   457         if not self.Debug:
   388         self.EditMenu = wx.Menu(title='')
   458             self.EditMenu = wx.Menu(title='')
       
   459         self.DisplayMenu = wx.Menu(title='')
   389         self.DisplayMenu = wx.Menu(title='')
   460         self.HelpMenu = wx.Menu(title='')
   390         self.HelpMenu = wx.Menu(title='')
   461         
   391         
   462         self._init_coll_MenuBar_Menus(self.MenuBar)
   392         self._init_coll_MenuBar_Menus(self.MenuBar)
   463         self._init_coll_FileMenu_Items(self.FileMenu)
   393         self._init_coll_FileMenu_Items(self.FileMenu)
   464         if not self.Debug:
   394         self._init_coll_EditMenu_Items(self.EditMenu)
   465             self._init_coll_EditMenu_Items(self.EditMenu)
       
   466         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   395         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   467         self._init_coll_HelpMenu_Items(self.HelpMenu)
   396         self._init_coll_HelpMenu_Items(self.HelpMenu)
   468 
   397 
   469     def _init_coll_MainLibrarySizer_Items(self, parent):
   398     def _init_coll_MainLibrarySizer_Items(self, parent):
   470         parent.AddWindow(self.LibraryTree, 0, border=0, flag=wx.GROW)
   399         parent.AddWindow(self.LibraryTree, 0, border=0, flag=wx.GROW)
   481         self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer)
   410         self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer)
   482         
   411         
   483         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
   412         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
   484         
   413         
   485     def _init_ctrls(self, prnt):
   414     def _init_ctrls(self, prnt):
   486         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   415         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   487               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   416               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   488               style=wx.DEFAULT_FRAME_STYLE, title=_(u'PLCOpenEditor'))
   417               style=wx.DEFAULT_FRAME_STYLE)
   489         self._init_utils()
   418         self._init_utils()
   490         self.SetClientSize(wx.Size(1000, 600))
   419         self.SetClientSize(wx.Size(1000, 600))
   491         self.SetMenuBar(self.MenuBar)
   420         self.SetMenuBar(self.MenuBar)
   492         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   421         
       
   422         self.TabsImageList = wx.ImageList(31, 16)
       
   423         self.TabsImageListIndexes = {}
       
   424         
       
   425         #-----------------------------------------------------------------------
       
   426         #                          Creating main structure
       
   427         #-----------------------------------------------------------------------
   493         
   428         
   494         if USE_AUI:
   429         if USE_AUI:
   495             self.AUIManager = wx.aui.AuiManager(self)
   430             self.AUIManager = wx.aui.AuiManager(self)
   496             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   431             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   497             self.Panes = {}
   432             self.Panes = {}
   498         
   433             
   499             self.TreeNoteBook = wx.aui.AuiNotebook(self)
   434             self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
   500             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   435                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
       
   436                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
       
   437             self.AUIManager.AddPane(self.LeftNoteBook, 
       
   438                   wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).
       
   439                   BestSize(wx.Size(300, 500)).CloseButton(False))
       
   440         
       
   441             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
       
   442                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
       
   443                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
       
   444             self.AUIManager.AddPane(self.BottomNoteBook, 
       
   445                   wx.aui.AuiPaneInfo().Bottom().Layer(0).
       
   446                   BestSize(wx.Size(800, 200)).CloseButton(False))
       
   447             
       
   448             self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
       
   449                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
       
   450                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
       
   451             self.AUIManager.AddPane(self.RightNoteBook, 
       
   452                   wx.aui.AuiPaneInfo().Right().Layer(0).
       
   453                   BestSize(wx.Size(250, 400)).CloseButton(False))
       
   454         
       
   455             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
       
   456                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
       
   457             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
       
   458                     self.OnPouSelectedChanged)
       
   459             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
       
   460                     self.OnPageClose)
       
   461             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
       
   462                     self.OnPageDragged)
       
   463             self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   501         
   464         
   502         else:
   465         else:
   503             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   466             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   504                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   467                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   505                   size=wx.Size(0, 0), style=wx.SP_3D)
   468                   size=wx.Size(0, 0), style=wx.SP_3D)
   506             self.MainSplitter.SetNeedUpdating(True)
   469             self.MainSplitter.SetNeedUpdating(True)
   507             self.MainSplitter.SetMinimumPaneSize(1)
   470             self.MainSplitter.SetMinimumPaneSize(1)
   508             
   471             
   509             self.TreeNoteBook = wx.Notebook(id=ID_PLCOPENEDITORTREENOTEBOOK,
   472             self.LeftNoteBook = wx.Notebook(id=ID_PLCOPENEDITORLEFTNOTEBOOK,
   510                   name='TreeNoteBook', parent=self.MainSplitter, pos=wx.Point(0,
   473                   name='LeftNoteBook', parent=self.MainSplitter, pos=wx.Point(0,
       
   474                   0), size=wx.Size(0, 0), style=0)
       
   475         
       
   476             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
       
   477                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
       
   478                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   479             self.SecondSplitter.SetMinimumPaneSize(1)
       
   480                 
       
   481             self.MainSplitter.SplitVertically(self.LeftNoteBook, self.SecondSplitter, 200)
       
   482             
       
   483             self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
       
   484                   name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
       
   485                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   486             self.ThirdSplitter.SetMinimumPaneSize(1)
       
   487             
       
   488             self.BottomNoteBook = wx.Notebook(id=ID_PLCOPENEDITORBOTTOMNOTEBOOK,
       
   489                   name='BottomNoteBook', parent=self.SecondSplitter, pos=wx.Point(0,
   511                   0), size=wx.Size(0, 0), style=0)
   490                   0), size=wx.Size(0, 0), style=0)
   512             
   491             
   513         typestreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
   492             self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.BottomNoteBook, -200)
   514         if not self.Debug:
   493             
   515             typestreestyle |= wx.TR_EDIT_LABELS
   494             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
       
   495                   name='TabsOpened', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   496                   0), size=wx.Size(0, 0), style=0)
       
   497             self.TabsOpened.SetImageList(self.TabsImageList)
       
   498             if wx.VERSION >= (2, 6, 0):
       
   499                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   500                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   501             else:
       
   502                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   503                     self.OnPouSelectedChanged)
       
   504             
       
   505             self.RightNoteBook = wx.Notebook(id=ID_PLCOPENEDITORRIGHTNOTEBOOK,
       
   506                   name='RightNoteBook', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   507                   0), size=wx.Size(0, 0), style=0)
       
   508             
       
   509             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.RightNoteBook, -250)
       
   510         
       
   511         #-----------------------------------------------------------------------
       
   512         #                       Creating PLCopen Project tree
       
   513         #-----------------------------------------------------------------------
       
   514         
   516         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   515         self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE,
   517                   name='TypesTree', parent=self.TreeNoteBook, 
   516                   name='TypesTree', parent=self.LeftNoteBook, 
   518                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   517                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   519                   style=typestreestyle)
   518                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   520         if not self.Debug:
   519         if wx.Platform == '__WXMSW__':
   521             if wx.Platform == '__WXMSW__':
   520             self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
   522                 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp,
   521                   id=ID_PLCOPENEDITORTYPESTREE)
   523                       id=ID_PLCOPENEDITORTYPESTREE)
   522             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
   524                 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected,
   523                   id=ID_PLCOPENEDITORTYPESTREE)
   525                       id=ID_PLCOPENEDITORTYPESTREE)
   524         else:
       
   525             if wx.VERSION >= (2, 6, 0):
       
   526                 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
       
   527                 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
   526             else:
   528             else:
   527                 if wx.VERSION >= (2, 6, 0):
   529                 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
   528                     self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp)
   530                 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
   529                     self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp)
   531             self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
   530                 else:
       
   531                     wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp)
       
   532                     wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp)
       
   533                 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging,
       
   534                       id=ID_PLCOPENEDITORTYPESTREE)
       
   535             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
       
   536                   id=ID_PLCOPENEDITORTYPESTREE)
   532                   id=ID_PLCOPENEDITORTYPESTREE)
   537             self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
   533         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag,
   538                   id=ID_PLCOPENEDITORTYPESTREE)
   534               id=ID_PLCOPENEDITORTYPESTREE)
   539             self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   535         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit,
   540                   id=ID_PLCOPENEDITORTYPESTREE)
   536               id=ID_PLCOPENEDITORTYPESTREE)
   541             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
   537         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit,
   542                   id=ID_PLCOPENEDITORTYPESTREE)
   538               id=ID_PLCOPENEDITORTYPESTREE)
       
   539         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated,
       
   540               id=ID_PLCOPENEDITORTYPESTREE)
       
   541         self.LeftNoteBook.AddPage(self.TypesTree, _("Types"))
       
   542 
       
   543         #-----------------------------------------------------------------------
       
   544         #                       Creating PLCopen Project tree
       
   545         #-----------------------------------------------------------------------
   543         
   546         
   544         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   547         self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE,
   545                   name='InstancesTree', parent=self.TreeNoteBook, 
   548                   name='InstancesTree', parent=self.LeftNoteBook, 
   546                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   549                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   547                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   550                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   548         
   551         if self.EnableDebug:
   549         self.TabsImageList = wx.ImageList(31, 16)
       
   550         self.TabsImageListIndexes = {}
       
   551         
       
   552         if self.Debug:
       
   553             if wx.VERSION >= (2, 6, 0):
   552             if wx.VERSION >= (2, 6, 0):
   554                 self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp)
   553                 self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp)
   555             else:
   554             else:
   556                 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp)
   555                 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp)
   557             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   556             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   558                   id=ID_PLCOPENEDITORINSTANCESTREE)
   557                   id=ID_PLCOPENEDITORINSTANCESTREE)
   559             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   558             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   560                   id=ID_PLCOPENEDITORINSTANCESTREE)
   559                   id=ID_PLCOPENEDITORINSTANCESTREE)
   561             
   560         self.LeftNoteBook.AddPage(self.InstancesTree, _("Instances"))
   562             self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances"))
   561         
   563             self.TreeNoteBook.AddPage(self.TypesTree, _("Types"))
   562         #-----------------------------------------------------------------------
   564             
   563         #                            Creating Tool Bar
   565             if USE_AUI:
   564         #-----------------------------------------------------------------------
   566                 self.TabsOpened = wx.aui.AuiNotebook(self)
   565 
   567                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   566         if USE_AUI:
   568                         self.OnPouSelectedChanged)
   567             ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   569                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   568                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   570                         self.OnPageClose)
   569             ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   571                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   570             ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   572                         self.OnPageDragged)
   571                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   573                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   572             ToolBar.Realize()
   574                 
   573             self.Panes["ToolBar"] = ToolBar
   575                 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler)
   574             self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
   576                 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption(_("Variables")).Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False))
   575                       Name("ToolBar").Caption(_("Toolbar")).
   577             else:
   576                       ToolbarPane().Top().
   578                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   577                       LeftDockable(False).RightDockable(False))
   579                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   578         else:
   580                       size=wx.Size(0, 0), style=wx.SP_3D)
   579             self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   581                 self.SecondSplitter.SetMinimumPaneSize(1)
   580                   ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   582                 
   581             self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   583                 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   582             self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   584                 
   583                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   585                 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
   584             self.ToolBar.Realize()
   586                       name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0,
       
   587                       0), size=wx.Size(0, 0), style=0)
       
   588                 if wx.VERSION >= (2, 6, 0):
       
   589                     self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   590                         self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   591                 else:
       
   592                     wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   593                         self.OnPouSelectedChanged)
       
   594                 
       
   595                 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler)
       
   596                 
       
   597                 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250)
       
   598         else:
       
   599             self.TreeNoteBook.AddPage(self.TypesTree, _("Types"))
       
   600             self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances"))
       
   601             
       
   602             if USE_AUI:
       
   603                 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
       
   604                         wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
       
   605                 ToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   606                 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
       
   607                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
       
   608                 ToolBar.Realize()
       
   609                 self.Panes["ToolBar"] = ToolBar
       
   610                 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
       
   611                           Name("ToolBar").Caption(_("Toolbar")).
       
   612                           ToolbarPane().Top().
       
   613                           LeftDockable(False).RightDockable(False))
       
   614             else:
       
   615                 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
       
   616                       ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
       
   617                 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   618                 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
       
   619                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
       
   620                 self.ToolBar.Realize()
       
   621             
   585             
   622             self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   586             self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   623                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   587                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   624             
   588         
   625             if USE_AUI:
   589         self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
   626                 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   590         self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
   627                 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption(_("Variables")).Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   591 
   628             
   592         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   629                 self.TabsOpened = wx.aui.AuiNotebook(self)
   593               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   630                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   594               0), size=wx.Size(0, 0), style=0)
   631                         self.OnPouSelectedChanged)
   595         self.RightNoteBook.AddPage(self.LibraryPanel, _("Library"))
   632                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   596         
   633                         self.OnPageClose)
   597         if wx.Platform == '__WXMSW__':
   634                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   598             librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
   635                         self.OnPageDragged)
   599         else:
   636                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0)))
   600             librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
   637             
   601         self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
   638                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   602                   name='LibraryTree', parent=self.LibraryPanel, 
   639                       name='LibraryPanel', parent=self, pos=wx.Point(0,
   603                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   640                       0), size=wx.Size(0, 0), style=0)
   604                   style=librarytreestyle)
   641                 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption(_("Library")).Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   605         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
   642             else:
   606               id=ID_PLCOPENEDITORLIBRARYTREE)
   643                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   607         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
   644                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   608               id=ID_PLCOPENEDITORLIBRARYTREE)
   645                       size=wx.Size(0, 0), style=wx.SP_3D)
   609         
   646                 self.SecondSplitter.SetMinimumPaneSize(1)
   610         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
   647                 
   611                   name='LibraryComment', parent=self.LibraryPanel, 
   648                 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200)
   612                   pos=wx.Point(0, 0), size=wx.Size(0, 60), 
   649                 
   613                   style=wx.TE_READONLY|wx.TE_MULTILINE)
   650                 self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler)
   614         
   651             
   615         self._init_sizers()
   652                 self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
   616         
   653                       name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
   617         if self.EnableDebug:
   654                       size=wx.Size(0, 0), style=wx.SP_3D)
   618             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   655                 self.ThirdSplitter.SetMinimumPaneSize(1)
   619             self.RightNoteBook.AddPage(self.DebugVariablePanel, _("Debugger"))
   656                 
       
   657                 self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.VariablePanelIndexer, -200)
       
   658                 
       
   659                 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
       
   660                       name='TabsOpened', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   661                       0), size=wx.Size(0, 0), style=0)
       
   662                 self.TabsOpened.SetImageList(self.TabsImageList)
       
   663                 if wx.VERSION >= (2, 6, 0):
       
   664                     self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   665                         self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   666                 else:
       
   667                     wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   668                         self.OnPouSelectedChanged)
       
   669             
       
   670                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
       
   671                       name='LibraryPanel', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   672                       0), size=wx.Size(0, 0), style=wx.SUNKEN_BORDER)
       
   673                 
       
   674                 self.ThirdSplitter.SplitVertically(self.TabsOpened, self.LibraryPanel, -250)
       
   675                 
       
   676             if wx.Platform == '__WXMSW__':
       
   677                 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   678             else:
       
   679                 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   680             self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE,
       
   681                       name='LibraryTree', parent=self.LibraryPanel, 
       
   682                       pos=wx.Point(0, 0), size=wx.Size(0, 0),
       
   683                       style=librarytreestyle)
       
   684             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected,
       
   685                   id=ID_PLCOPENEDITORLIBRARYTREE)
       
   686             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
       
   687                   id=ID_PLCOPENEDITORLIBRARYTREE)
       
   688             
       
   689             self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
       
   690                       name='LibraryComment', parent=self.LibraryPanel, 
       
   691                       pos=wx.Point(0, 0), size=wx.Size(0, 60), 
       
   692                       style=wx.TE_READONLY|wx.TE_MULTILINE)
       
   693             
       
   694             self._init_sizers()
       
   695         
   620         
   696         if USE_AUI:
   621         if USE_AUI:
   697             self.AUIManager.Update()
   622             self.AUIManager.Update()
   698     
   623     
   699     ## Constructor of the PLCOpenEditor class.
   624     ## Constructor of the PLCOpenEditor class.
   700     #  @param parent The parent window.
   625     #  @param parent The parent window.
   701     #  @param controler The controler been used by PLCOpenEditor (default: None).
   626     #  @param controler The controler been used by PLCOpenEditor (default: None).
   702     #  @param fileOpen The filepath to open if no controler defined (default: None).
   627     #  @param fileOpen The filepath to open if no controler defined (default: None).
   703     #  @param debug The filepath to open if no controler defined (default: False).
   628     #  @param debug The filepath to open if no controler defined (default: False).
   704     def __init__(self, parent, controler = None, fileOpen = None, debug = False):
   629     def __init__(self, parent, enable_debug = False):
   705         # Variable indicating that PLCOpenEditor was opened with a defined controler
   630         self.Controler = None
   706         self.ModeSolo = controler == None
   631         self.EnableDebug = enable_debug
   707         self.Debug = debug
       
   708         if self.ModeSolo:
       
   709             # If no controler defined, create a new one
       
   710             self.Controler = PLCControler()
       
   711             # Open the filepath if defined
       
   712             if fileOpen is not None:
       
   713                 self.Controler.OpenXMLFile(fileOpen)
       
   714         else:
       
   715             self.Controler = controler
       
   716         
   632         
   717         self._init_ctrls(parent)
   633         self._init_ctrls(parent)
   718         
       
   719         # Define PLCOpenEditor icon
       
   720         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
       
   721         
   634         
   722         # Define Tree item icon list
   635         # Define Tree item icon list
   723         self.TreeImageList = wx.ImageList(16, 16)
   636         self.TreeImageList = wx.ImageList(16, 16)
   724         self.TreeImageDict = {}
   637         self.TreeImageDict = {}
   725         
   638         
   776         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   689         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   777         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   690         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   778         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   691         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   779         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   692         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   780         
   693         
   781         # Refresh elements that need to
   694         self.SetRefreshFunctions()
   782         if not self.ModeSolo or fileOpen is not None:
   695         
   783             self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
   696         self.Maximize()
   784         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
       
   785 
       
   786 
   697 
   787 #-------------------------------------------------------------------------------
   698 #-------------------------------------------------------------------------------
   788 #                               General Functions
   699 #                               General Functions
   789 #-------------------------------------------------------------------------------
   700 #-------------------------------------------------------------------------------
       
   701 
       
   702     def SetRefreshFunctions(self):
       
   703         self.RefreshFunctions = {
       
   704             TITLE : self.RefreshTitle,
       
   705             TOOLBAR : self.RefreshToolBar,
       
   706             FILEMENU : self.RefreshFileMenu,
       
   707             EDITMENU : self.RefreshEditMenu,
       
   708             DISPLAYMENU : self.RefreshDisplayMenu,
       
   709             TYPESTREE : self.RefreshTypesTree,
       
   710             INSTANCESTREE : self.RefreshInstancesTree, 
       
   711             LIBRARYTREE : self.RefreshLibraryTree,
       
   712             SCALING : self.RefreshScaling}
   790 
   713 
   791     ## Call PLCOpenEditor refresh functions.
   714     ## Call PLCOpenEditor refresh functions.
   792     #  @param elements List of elements to refresh.
   715     #  @param elements List of elements to refresh.
   793     def _Refresh(self, *elements):
   716     def _Refresh(self, *elements):
   794         for element in elements:
   717         for element in elements:
   795             self.RefreshFunctions[element](self)
   718             self.RefreshFunctions[element]()
   796 
   719 
   797     ## Callback function when AUINotebook Page closed with CloseButton
   720     ## Callback function when AUINotebook Page closed with CloseButton
   798     #  @param event AUINotebook Event.
   721     #  @param event AUINotebook Event.
   799     def OnPageClose(self, event):
   722     def OnPageClose(self, event):
   800         # Get Selected Tab
   723         # Get Selected Tab
   801         selected = event.GetSelection()
   724         selected = event.GetSelection()
   802         if selected >= 0:
   725         if selected >= 0:
   803             # Remove corresponding VariablePanel
   726             # Remove corresponding VariablePanel
   804             if not self.Debug:
   727             window = self.TabsOpened.GetPage(selected)
   805                 tagname = self.TabsOpened.GetPage(selected).GetTagName()
   728             if not window.IsDebugging():
   806                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   729                 self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName())
   807             # Refresh Tab selection
   730             # Refresh Tab selection
   808             if self.TabsOpened.GetPageCount() > 0:
   731             if self.TabsOpened.GetPageCount() > 0:
   809                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   732                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   810                 self.TabsOpened.SetSelection(new_index)
   733                 self.TabsOpened.SetSelection(new_index)
   811                 if not self.Debug:
   734                 window = self.TabsOpened.GetPage(selected)
   812                     tagname = self.TabsOpened.GetPage(new_index).GetTagName()
   735                 if not window.IsDebugging():
   813                     self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   736                     self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
   814             # Refresh all window elements that have changed
   737             # Refresh all window elements that have changed
   815             self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   738             self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   816         wx.CallAfter(self.RefreshTabCtrlEvent)
   739         wx.CallAfter(self.RefreshTabCtrlEvent)
   817         event.Skip()
   740         event.Skip()
   818 
   741 
   837         self.RefreshEditMenu()
   760         self.RefreshEditMenu()
   838 
   761 
   839     def GetDrawingMode(self):
   762     def GetDrawingMode(self):
   840         return self.DrawingMode
   763         return self.DrawingMode
   841 
   764 
   842     def RefreshTitle(self):
       
   843         name = _("PLCOpenEditor")
       
   844         if self.Debug:
       
   845             name += _(" (Debug)")
       
   846         if self.Controler.HasOpenedProject() > 0:
       
   847             self.SetTitle("%s - %s"%(name, self.Controler.GetFilename()))
       
   848         else:
       
   849             self.SetTitle(name)
       
   850 
       
   851     def RefreshScaling(self):
   765     def RefreshScaling(self):
   852         for i in xrange(self.TabsOpened.GetPageCount()):
   766         for i in xrange(self.TabsOpened.GetPageCount()):
   853             editor = self.TabsOpened.GetPage(i)
   767             editor = self.TabsOpened.GetPage(i)
   854             editor.RefreshScaling()
   768             editor.RefreshScaling()
   855 
   769 
   856     def ShowProperties(self):
   770     def ShowProperties(self):
   857         old_values = self.Controler.GetProjectProperties(self.Debug)
   771         old_values = self.Controler.GetProjectProperties()
   858         dialog = ProjectDialog(self)
   772         dialog = ProjectDialog(self)
   859         dialog.SetValues(old_values)
   773         dialog.SetValues(old_values)
   860         if dialog.ShowModal() == wx.ID_OK:
   774         if dialog.ShowModal() == wx.ID_OK:
   861             new_values = dialog.GetValues()
   775             new_values = dialog.GetValues()
   862             new_values["creationDateTime"] = old_values["creationDateTime"]
   776             new_values["creationDateTime"] = old_values["creationDateTime"]
   863             if new_values != old_values:
   777             if new_values != old_values:
   864                 self.Controler.SetProjectProperties(None, new_values)
   778                 self.Controler.SetProjectProperties(None, new_values)
   865                 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
   779                 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
   866                               TYPESTREE, INSTANCESTREE, SCALING)
   780                               TYPESTREE, INSTANCESTREE, SCALING)
   867         dialog.Destroy()
   781         dialog.Destroy()
   868 
       
   869     def OnCloseFrame(self, event):
       
   870         if not self.ModeSolo and getattr(self, "_onclose", None) is not None:
       
   871             self.AUIManager.UnInit()
       
   872             self._onclose()
       
   873             event.Skip()
       
   874         elif self.CheckSaveBeforeClosing():
       
   875             event.Skip()
       
   876         else:
       
   877             event.Veto()
       
   878 
   782 
   879 #-------------------------------------------------------------------------------
   783 #-------------------------------------------------------------------------------
   880 #                            Notebook Unified Functions
   784 #                            Notebook Unified Functions
   881 #-------------------------------------------------------------------------------
   785 #-------------------------------------------------------------------------------
   882 
   786 
   978 #-------------------------------------------------------------------------------
   882 #-------------------------------------------------------------------------------
   979 #                            File Menu Functions
   883 #                            File Menu Functions
   980 #-------------------------------------------------------------------------------
   884 #-------------------------------------------------------------------------------
   981 
   885 
   982     def RefreshFileMenu(self):
   886     def RefreshFileMenu(self):
   983         if self.Controler.HasOpenedProject():
   887         pass
   984             selected = self.TabsOpened.GetSelection()
       
   985             if selected >= 0:
       
   986                 graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer)
       
   987             else:
       
   988                 graphic_viewer = False
       
   989             if self.TabsOpened.GetPageCount() > 0:
       
   990                 self.FileMenu.Enable(wx.ID_CLOSE, True)
       
   991                 if graphic_viewer:
       
   992                     self.FileMenu.Enable(wx.ID_PREVIEW, True)
       
   993                     self.FileMenu.Enable(wx.ID_PRINT, True)
       
   994                 else:
       
   995                     self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
   996                     self.FileMenu.Enable(wx.ID_PRINT, False)
       
   997             else:
       
   998                 self.FileMenu.Enable(wx.ID_CLOSE, False)
       
   999                 self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
  1000                 self.FileMenu.Enable(wx.ID_PRINT, False)
       
  1001             self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
       
  1002             if not self.Debug:
       
  1003                 self.FileMenu.Enable(wx.ID_SAVE, True)
       
  1004                 self.FileMenu.Enable(wx.ID_PROPERTIES, True)
       
  1005             if self.ModeSolo:
       
  1006                 self.FileMenu.Enable(wx.ID_CLOSE_ALL, True)
       
  1007                 self.FileMenu.Enable(wx.ID_SAVEAS, True)
       
  1008                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, True)
       
  1009         else:
       
  1010             self.FileMenu.Enable(wx.ID_CLOSE, False)
       
  1011             self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
       
  1012             self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
  1013             self.FileMenu.Enable(wx.ID_PRINT, False)
       
  1014             if not self.Debug:
       
  1015                 self.FileMenu.Enable(wx.ID_SAVE, False)
       
  1016                 self.FileMenu.Enable(wx.ID_PROPERTIES, False)
       
  1017             if self.ModeSolo:
       
  1018                 self.FileMenu.Enable(wx.ID_CLOSE_ALL, False)
       
  1019                 self.FileMenu.Enable(wx.ID_SAVEAS, False)
       
  1020                 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, False)
       
  1021 
       
  1022     def OnNewProjectMenu(self, event):
       
  1023         dialog = ProjectDialog(self)
       
  1024         if dialog.ShowModal() == wx.ID_OK:
       
  1025             properties = dialog.GetValues()
       
  1026             self.Controler.CreateNewProject(properties)
       
  1027             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, 
       
  1028                           LIBRARYTREE)
       
  1029         event.Skip()
       
  1030 
       
  1031     def OnOpenProjectMenu(self, event):
       
  1032         if not self.CheckSaveBeforeClosing():
       
  1033             return
       
  1034         filepath = self.Controler.GetFilePath()
       
  1035         if filepath != "":
       
  1036             directory = os.path.dirname(filepath)
       
  1037         else:
       
  1038             directory = os.getcwd()
       
  1039         dialog = wx.FileDialog(self, _("Choose a file"), directory, "",  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
       
  1040         if dialog.ShowModal() == wx.ID_OK:
       
  1041             filepath = dialog.GetPath()
       
  1042             if os.path.isfile(filepath):
       
  1043                 self.DeleteAllPages()
       
  1044                 self.VariablePanelIndexer.RemoveAllPanels()
       
  1045                 self.Controler.OpenXMLFile(filepath)
       
  1046                 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
       
  1047             self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU)
       
  1048         dialog.Destroy()
       
  1049         event.Skip()
       
  1050 
   888 
  1051     def OnCloseTabMenu(self, event):
   889     def OnCloseTabMenu(self, event):
  1052         selected = self.TabsOpened.GetSelection()
   890         selected = self.TabsOpened.GetSelection()
  1053         if selected >= 0:
   891         if selected >= 0:
  1054             if not self.Debug:
   892             window = self.TabsOpened.GetPage(selected)
  1055                 tagname = self.TabsOpened.GetPage(selected).GetTagName()
   893             if not window.IsDebugging():
  1056                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
   894                 self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName())
  1057             self.TabsOpened.DeletePage(selected)
   895             self.TabsOpened.DeletePage(selected)
  1058             if self.TabsOpened.GetPageCount() > 0:
   896             if self.TabsOpened.GetPageCount() > 0:
  1059                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   897                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
  1060                 self.TabsOpened.SetSelection(new_index)
   898                 self.TabsOpened.SetSelection(new_index)
  1061                 if not self.Debug:
   899                 window = self.TabsOpened.GetPage(new_index)
  1062                     tagname = self.TabsOpened.GetPage(new_index).GetTagName()
   900                 if not window.IsDebugging():
  1063                     self.VariablePanelIndexer.ChangeVariablePanel(tagname)
   901                     self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1064             self._Refresh(TOOLBAR, FILEMENU, EDITMENU)
   902             self._Refresh(TOOLBAR, FILEMENU, EDITMENU)
  1065         event.Skip()
   903         event.Skip()
  1066     
       
  1067     def OnCloseProjectMenu(self, event):
       
  1068         if not self.CheckSaveBeforeClosing():
       
  1069             return
       
  1070         self.DeleteAllPages()
       
  1071         self.VariablePanelIndexer.RemoveAllPanels()
       
  1072         self.TypesTree.DeleteAllItems()
       
  1073         self.InstancesTree.DeleteAllItems()
       
  1074         self.Controler.Reset()
       
  1075         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU)
       
  1076         event.Skip()
       
  1077 
       
  1078     def OnSaveProjectMenu(self, event):
       
  1079         if not self.ModeSolo and getattr(self, "_onsave", None) != None:
       
  1080             self._onsave()
       
  1081         else:
       
  1082             self.SaveProject()
       
  1083         event.Skip()
       
  1084 
       
  1085     def OnSaveProjectAsMenu(self, event):
       
  1086         self.SaveProjectAs()
       
  1087         event.Skip()
       
  1088 
       
  1089     def OnGenerateProgramMenu(self, event):
       
  1090         dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(),  _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR)
       
  1091         if dialog.ShowModal() == wx.ID_OK:
       
  1092             filepath = dialog.GetPath()
       
  1093             message_text = ""
       
  1094             header, icon = _("Done"), wx.ICON_INFORMATION
       
  1095             if os.path.isdir(os.path.dirname(filepath)):
       
  1096                 program, errors, warnings = self.Controler.GenerateProgram(filepath)
       
  1097                 message_text += "".join([_("warning: %s\n") for warning in warnings])
       
  1098                 if len(errors) > 0:
       
  1099                     message_text += "".join([_("error: %s\n") for warning in warnings])
       
  1100                     message_text += _("Can't generate program to file %s!")%filepath
       
  1101                     header, icon = _("Error"), wx.ICON_ERROR
       
  1102                 else:
       
  1103                     message_text += _("Program was successfully generated!")
       
  1104             else:
       
  1105                 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath)
       
  1106                 header, icon = _("Error"), wx.ICON_ERROR
       
  1107             message = wx.MessageDialog(self, message_text, header, wx.OK|icon)
       
  1108             message.ShowModal()
       
  1109             message.Destroy()
       
  1110         dialog.Destroy()
       
  1111         event.Skip()
       
  1112 
       
  1113     def SaveProject(self):
       
  1114         result = self.Controler.SaveXMLFile()
       
  1115         if not result:
       
  1116             self.SaveProjectAs()
       
  1117         else:
       
  1118             self.RefreshTitle()
       
  1119     
       
  1120     def SaveProjectAs(self):
       
  1121         filepath = self.Controler.GetFilePath()
       
  1122         if filepath != "":
       
  1123             directory, filename = os.path.split(filepath)
       
  1124         else:
       
  1125             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug)
       
  1126         dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT)
       
  1127         if dialog.ShowModal() == wx.ID_OK:
       
  1128             filepath = dialog.GetPath()
       
  1129             if os.path.isdir(os.path.dirname(filepath)):
       
  1130                 result = self.Controler.SaveXMLFile(filepath)
       
  1131                 if not result:
       
  1132                     self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
       
  1133             else:
       
  1134                 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
       
  1135             self.RefreshTitle()
       
  1136         dialog.Destroy()
       
  1137 
   904 
  1138     def OnPageSetupMenu(self, event):
   905     def OnPageSetupMenu(self, event):
  1139         dialog = wx.PageSetupDialog(self, self.PageSetupData)
   906         dialog = wx.PageSetupDialog(self, self.PageSetupData)
  1140         if dialog.ShowModal() == wx.ID_OK:
   907         if dialog.ShowModal() == wx.ID_OK:
  1141             self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData())
   908             self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData())
  1144         event.Skip()
   911         event.Skip()
  1145 
   912 
  1146     def OnPreviewMenu(self, event):
   913     def OnPreviewMenu(self, event):
  1147         selected = self.TabsOpened.GetSelection()        
   914         selected = self.TabsOpened.GetSelection()        
  1148         if selected != -1:
   915         if selected != -1:
       
   916             window = self.TabsOpened.GetPage(selected)
  1149             data = wx.PrintDialogData(self.PrintData)
   917             data = wx.PrintDialogData(self.PrintData)
  1150             properties = self.Controler.GetProjectProperties(self.Debug)
   918             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1151             page_size = map(int, properties["pageSize"])
   919             page_size = map(int, properties["pageSize"])
  1152             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   920             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1153             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   921             printout = GraphicPrintout(window, page_size, margins, True)
  1154             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
   922             printout2 = GraphicPrintout(window, page_size, margins, True)
  1155             preview = wx.PrintPreview(printout, printout2, data)
   923             preview = wx.PrintPreview(printout, printout2, data)
  1156 
   924 
  1157             if preview.Ok():
   925             if preview.Ok():
  1158                 preview_frame = wx.PreviewFrame(preview, self, _("Print preview"))
   926                 preview_frame = wx.PreviewFrame(preview, self, _("Print preview"))
  1159 
   927 
  1163         event.Skip()
   931         event.Skip()
  1164 
   932 
  1165     def OnPrintMenu(self, event):
   933     def OnPrintMenu(self, event):
  1166         selected = self.TabsOpened.GetSelection()        
   934         selected = self.TabsOpened.GetSelection()        
  1167         if selected != -1:
   935         if selected != -1:
       
   936             window = self.TabsOpened.GetPage(selected)
  1168             dialog_data = wx.PrintDialogData(self.PrintData)
   937             dialog_data = wx.PrintDialogData(self.PrintData)
  1169             dialog_data.SetToPage(1)
   938             dialog_data.SetToPage(1)
  1170             properties = self.Controler.GetProjectProperties(self.Debug)
   939             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1171             page_size = map(int, properties["pageSize"])
   940             page_size = map(int, properties["pageSize"])
  1172             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
   941             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1173             printer = wx.Printer(dialog_data)
   942             printer = wx.Printer(dialog_data)
  1174             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
   943             printout = GraphicPrintout(window, page_size, margins)
  1175             
   944             
  1176             if not printer.Print(self, printout, True):
   945             if not printer.Print(self, printout, True):
  1177                 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"))
   946                 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"))
  1178             printout.Destroy()
   947             printout.Destroy()
  1179         event.Skip()
   948         event.Skip()
  1184 
   953 
  1185     def OnQuitMenu(self, event):
   954     def OnQuitMenu(self, event):
  1186         self.Close()
   955         self.Close()
  1187         event.Skip()
   956         event.Skip()
  1188 
   957 
  1189 
       
  1190 #-------------------------------------------------------------------------------
   958 #-------------------------------------------------------------------------------
  1191 #                            Edit Menu Functions
   959 #                            Edit Menu Functions
  1192 #-------------------------------------------------------------------------------
   960 #-------------------------------------------------------------------------------
  1193 
   961 
  1194     def RefreshEditMenu(self):
   962     def RefreshEditMenu(self):
  1195         if not self.Debug:
   963         if self.Controler is not None:
       
   964             undo, redo = self.Controler.GetBufferState()
       
   965             self.EditMenu.Enable(wx.ID_UNDO, undo)
       
   966             self.EditMenu.Enable(wx.ID_REDO, redo)
       
   967             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1196             self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
   968             self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
  1197                                 self.Controler.IsProjectBufferEnabled())
   969                             self.Controler.IsProjectBufferEnabled())
  1198             if self.Controler.HasOpenedProject():
   970             self.EditMenu.Enable(wx.ID_ADD, True)
  1199                 undo, redo = self.Controler.GetBufferState()
   971             self.EditMenu.Enable(wx.ID_DELETE, True)
  1200                 self.EditMenu.Enable(wx.ID_UNDO, undo)
   972             if self.TabsOpened.GetPageCount() > 0:
  1201                 self.EditMenu.Enable(wx.ID_REDO, redo)
   973                 self.EditMenu.Enable(wx.ID_CUT, True)
  1202                 self.EditMenu.Enable(wx.ID_ADD, True)
   974                 self.EditMenu.Enable(wx.ID_COPY, True)
  1203                 self.EditMenu.Enable(wx.ID_DELETE, True)
   975                 if self.GetCopyBuffer() is not None:
  1204                 if self.TabsOpened.GetPageCount() > 0:
   976                     self.EditMenu.Enable(wx.ID_PASTE, True)
  1205                     self.EditMenu.Enable(wx.ID_CUT, True)
       
  1206                     self.EditMenu.Enable(wx.ID_COPY, True)
       
  1207                     if self.GetCopyBuffer() is not None:
       
  1208                         self.EditMenu.Enable(wx.ID_PASTE, True)
       
  1209                     else:
       
  1210                         self.EditMenu.Enable(wx.ID_PASTE, False)
       
  1211                     self.EditMenu.Enable(wx.ID_SELECTALL, True)
       
  1212                 else:
   977                 else:
  1213                     self.EditMenu.Enable(wx.ID_CUT, False)
       
  1214                     self.EditMenu.Enable(wx.ID_COPY, False)
       
  1215                     self.EditMenu.Enable(wx.ID_PASTE, False)
   978                     self.EditMenu.Enable(wx.ID_PASTE, False)
  1216                     self.EditMenu.Enable(wx.ID_SELECTALL, False)
   979                 self.EditMenu.Enable(wx.ID_SELECTALL, True)
  1217             else:
   980             else:
  1218                 self.EditMenu.Enable(wx.ID_UNDO, False)
       
  1219                 self.EditMenu.Enable(wx.ID_REDO, False)
       
  1220                 self.EditMenu.Enable(wx.ID_CUT, False)
   981                 self.EditMenu.Enable(wx.ID_CUT, False)
  1221                 self.EditMenu.Enable(wx.ID_COPY, False)
   982                 self.EditMenu.Enable(wx.ID_COPY, False)
  1222                 self.EditMenu.Enable(wx.ID_PASTE, False)
   983                 self.EditMenu.Enable(wx.ID_PASTE, False)
  1223                 self.EditMenu.Enable(wx.ID_SELECTALL, False)
   984                 self.EditMenu.Enable(wx.ID_SELECTALL, False)
  1224                 self.EditMenu.Enable(wx.ID_ADD, False)
   985         else:
  1225                 self.EditMenu.Enable(wx.ID_DELETE, False)
   986             self.EditMenu.Enable(wx.ID_UNDO, False)
       
   987             self.EditMenu.Enable(wx.ID_REDO, False)
       
   988             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
       
   989             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
       
   990             self.EditMenu.Enable(wx.ID_CUT, False)
       
   991             self.EditMenu.Enable(wx.ID_COPY, False)
       
   992             self.EditMenu.Enable(wx.ID_PASTE, False)
       
   993             self.EditMenu.Enable(wx.ID_SELECTALL, False)
       
   994             self.EditMenu.Enable(wx.ID_ADD, False)
       
   995             self.EditMenu.Enable(wx.ID_DELETE, False)
  1226     
   996     
  1227     def CloseTabsWithoutModel(self):
   997     def CloseTabsWithoutModel(self):
  1228         idxs = range(self.TabsOpened.GetPageCount())
   998         idxs = range(self.TabsOpened.GetPageCount())
  1229         idxs.reverse()
   999         idxs.reverse()
  1230         for idx in idxs:
  1000         for idx in idxs:
  1231             tagname = self.TabsOpened.GetPage(idx).GetTagName()
  1001             window = self.TabsOpened.GetPage(idx)
  1232             if self.Controler.GetEditedElement(tagname, self.Debug) is None:
  1002             if not window.IsDebugging():
  1233                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  1003                 tagname = window.GetTagName()
  1234                 self.TabsOpened.DeletePage(idx)
  1004                 if self.Controler.GetEditedElement(tagname) is None:
  1235         
  1005                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  1006                     self.TabsOpened.DeletePage(idx)
       
  1007 
       
  1008     def CloseDebugTabs(self):
       
  1009         if self.EnableDebug:
       
  1010             idxs = range(self.TabsOpened.GetPageCount())
       
  1011             idxs.reverse()
       
  1012             for idx in idxs:
       
  1013                 window = self.TabsOpened.GetPage(idx)
       
  1014                 if window.IsDebugging():
       
  1015                     self.TabsOpened.DeletePage(idx)
       
  1016             self.DebugVariablePanel.ResetGrid()
       
  1017 
  1236     def OnUndoMenu(self, event):
  1018     def OnUndoMenu(self, event):
  1237         self.Controler.LoadPrevious()
  1019         self.Controler.LoadPrevious()
  1238         self.CloseTabsWithoutModel()
  1020         self.CloseTabsWithoutModel()
  1239         self.RefreshEditor()
  1021         self.RefreshEditor()
  1240         self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1022         self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1299 #-------------------------------------------------------------------------------
  1081 #-------------------------------------------------------------------------------
  1300 #                             Display Menu Functions
  1082 #                             Display Menu Functions
  1301 #-------------------------------------------------------------------------------
  1083 #-------------------------------------------------------------------------------
  1302 
  1084 
  1303     def RefreshDisplayMenu(self):
  1085     def RefreshDisplayMenu(self):
  1304         if self.Controler.HasOpenedProject():
  1086         if self.Controler is not None:
  1305             if self.TabsOpened.GetPageCount() > 0:
  1087             if self.TabsOpened.GetPageCount() > 0:
  1306                 self.DisplayMenu.Enable(wx.ID_REFRESH, True)
  1088                 self.DisplayMenu.Enable(wx.ID_REFRESH, True)
  1307                 selected = self.TabsOpened.GetSelection()
  1089                 selected = self.TabsOpened.GetSelection()
  1308                 if selected != -1:
  1090                 if selected != -1:
  1309                     window = self.TabsOpened.GetPage(selected)
  1091                     window = self.TabsOpened.GetPage(selected)
  1317                 else:
  1099                 else:
  1318                     self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1100                     self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1319             else:
  1101             else:
  1320                 self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1102                 self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1321                 self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1103                 self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1322             if not self.Debug and not self.ModeSolo:
  1104             if self.EnableDebug:
  1323                 self.DisplayMenu.Enable(wx.ID_CLEAR, True)
  1105                 self.DisplayMenu.Enable(wx.ID_CLEAR, True)
  1324         else:
  1106         else:
  1325             self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1107             self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1326             if not self.Debug and not self.ModeSolo:
  1108             if self.EnableDebug:
  1327                 self.DisplayMenu.Enable(wx.ID_CLEAR, False)
  1109                 self.DisplayMenu.Enable(wx.ID_CLEAR, False)
  1328             self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1110             self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1329         
  1111         
  1330     def OnRefreshMenu(self, event):
  1112     def OnRefreshMenu(self, event):
  1331         self.RefreshEditor(not self.Debug)
  1113         self.RefreshEditor()
  1332         event.Skip()
  1114         event.Skip()
  1333 
  1115 
  1334     def OnClearErrorsMenu(self, event):
  1116     def OnClearErrorsMenu(self, event):
  1335         self.ClearErrors()
  1117         self.ClearErrors()
  1336         event.Skip()
  1118         event.Skip()
  1371                 self.AUIManager.Update()
  1153                 self.AUIManager.Update()
  1372     
  1154     
  1373     def OnPouSelectedChanged(self, event):
  1155     def OnPouSelectedChanged(self, event):
  1374         old_selected = self.TabsOpened.GetSelection()
  1156         old_selected = self.TabsOpened.GetSelection()
  1375         if old_selected >= 0:
  1157         if old_selected >= 0:
  1376             if self.Debug:
  1158             window = self.TabsOpened.GetPage(old_selected)
  1377                 pass
  1159             if not window.IsDebugging():
  1378             else:
  1160                 window.ResetBuffer()
  1379                 self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1380         selected = event.GetSelection()
  1161         selected = event.GetSelection()
  1381         if selected >= 0:
  1162         if selected >= 0:
  1382             window = self.TabsOpened.GetPage(selected)
  1163             window = self.TabsOpened.GetPage(selected)
  1383             if not self.Debug:
  1164             if not window.IsDebugging():
  1384                 self.SelectTypesTreeItem(window.GetTagName())
  1165                 self.SelectTypesTreeItem(window.GetTagName())
  1385             else:
  1166             else:
  1386                 self.SelectInstancesTreeItem(self.InstancesTree.GetRootItem(), window.GetInstancePath())
  1167                 self.SelectInstancesTreeItem(self.InstancesTree.GetRootItem(), window.GetInstancePath())
  1387             window.RefreshView()
  1168             window.RefreshView()
  1388             if not self.Debug:
  1169             if not window.IsDebugging():
  1389                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1170                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1390             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, TOOLBAR)
  1171             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, TOOLBAR)
  1391         event.Skip()
  1172         event.Skip()
  1392 
  1173 
  1393     def RefreshEditor(self, variablepanel = True):
  1174     def RefreshEditor(self, variablepanel = True):
  1394         selected = self.TabsOpened.GetSelection()
  1175         selected = self.TabsOpened.GetSelection()
  1395         if selected != -1:
  1176         if selected != -1:
  1396             window = self.TabsOpened.GetPage(selected)
  1177             window = self.TabsOpened.GetPage(selected)
  1397             window.RefreshView()
  1178             window.RefreshView()
  1398             if variablepanel:
  1179             if window.IsDebugging() and variablepanel:
  1399                 self.RefreshVariablePanel(window.GetTagName())
  1180                 self.RefreshVariablePanel(window.GetTagName())
  1400 
  1181 
  1401     def RefreshVariablePanel(self, tagname):
  1182     def RefreshVariablePanel(self, tagname):
  1402         self.VariablePanelIndexer.RefreshVariablePanel(tagname)
  1183         self.VariablePanelIndexer.RefreshVariablePanel(tagname)
  1403 
  1184 
  1415         return None
  1196         return None
  1416 
  1197 
  1417     def RefreshPageTitles(self):
  1198     def RefreshPageTitles(self):
  1418         for idx in xrange(self.TabsOpened.GetPageCount()):
  1199         for idx in xrange(self.TabsOpened.GetPageCount()):
  1419             window = self.TabsOpened.GetPage(idx)
  1200             window = self.TabsOpened.GetPage(idx)
       
  1201             debug = window.IsDebugging()
  1420             words = window.GetTagName().split("::")
  1202             words = window.GetTagName().split("::")
  1421             if words[0] == "P":
  1203             if words[0] == "P":
  1422                 pou_type = self.Controler.GetEditedElementType(window.GetTagName(), self.Debug)[1].upper()
  1204                 pou_type = self.Controler.GetEditedElementType(window.GetTagName(), debug)[1].upper()
  1423                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1205                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
  1424                 self.SetPageBitmap(idx, self.GenerateBitmap(pou_type, pou_body_type))
  1206                 self.SetPageBitmap(idx, self.GenerateBitmap(pou_type, pou_body_type))
  1425             elif words[0] == "T":
  1207             elif words[0] == "T":
  1426                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1208                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
  1427                 self.SetPageBitmap(idx, self.GenerateBitmap("TRANSITION", pou_body_type))
  1209                 self.SetPageBitmap(idx, self.GenerateBitmap("TRANSITION", pou_body_type))
  1428             elif words[0] == "A":
  1210             elif words[0] == "A":
  1429                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), self.Debug)
  1211                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
  1430                 self.SetPageBitmap(idx, self.GenerateBitmap("ACTION", pou_body_type))
  1212                 self.SetPageBitmap(idx, self.GenerateBitmap("ACTION", pou_body_type))
  1431             elif words[0] == "C":
  1213             elif words[0] == "C":
  1432                 self.SetPageBitmap(idx, self.GenerateBitmap("CONFIGURATION"))
  1214                 self.SetPageBitmap(idx, self.GenerateBitmap("CONFIGURATION"))
  1433             elif words[0] == "R":
  1215             elif words[0] == "R":
  1434                 self.SetPageBitmap(idx, self.GenerateBitmap("RESOURCE"))
  1216                 self.SetPageBitmap(idx, self.GenerateBitmap("RESOURCE"))
  1435             elif words[0] == "D":
  1217             elif words[0] == "D":
  1436                 self.SetPageBitmap(idx, self.GenerateBitmap("DATATYPE"))
  1218                 self.SetPageBitmap(idx, self.GenerateBitmap("DATATYPE"))
  1437             if self.Debug:
  1219             if debug:
  1438                 self.TabsOpened.SetPageText(idx, window.GetInstancePath())
  1220                 text = window.GetInstancePath()
       
  1221                 if len(text) > 15:
       
  1222                     text = "..." + text[-12:]
       
  1223                 self.TabsOpened.SetPageText(idx, text)
  1439             else:
  1224             else:
  1440                 self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1225                 self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
  1441 
  1226 
  1442     def GetTabsOpenedDClickFunction(self, tabctrl):
  1227     def GetTabsOpenedDClickFunction(self, tabctrl):
  1443         def OnTabsOpenedDClick(event):
  1228         def OnTabsOpenedDClick(event):
  1455 #-------------------------------------------------------------------------------
  1240 #-------------------------------------------------------------------------------
  1456 #                         Types Tree Management Functions
  1241 #                         Types Tree Management Functions
  1457 #-------------------------------------------------------------------------------
  1242 #-------------------------------------------------------------------------------
  1458 
  1243 
  1459     def RefreshTypesTree(self):
  1244     def RefreshTypesTree(self):
  1460         infos = self.Controler.GetProjectInfos(self.Debug)
  1245         infos = self.Controler.GetProjectInfos()
  1461         root = self.TypesTree.GetRootItem()
  1246         root = self.TypesTree.GetRootItem()
  1462         if not root.IsOk():
  1247         if not root.IsOk():
  1463             root = self.TypesTree.AddRoot(infos["name"])
  1248             root = self.TypesTree.AddRoot(infos["name"])
  1464         self.GenerateTypesTreeBranch(root, infos)
  1249         self.GenerateTypesTreeBranch(root, infos)
  1465         self.TypesTree.Expand(root)
  1250         self.TypesTree.Expand(root)
  1477             self.TypesTree.SetItemTextColour(root, wx.RED)
  1262             self.TypesTree.SetItemTextColour(root, wx.RED)
  1478         else:
  1263         else:
  1479             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
  1264             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
  1480             self.TypesTree.SetItemTextColour(root, wx.BLACK)
  1265             self.TypesTree.SetItemTextColour(root, wx.BLACK)
  1481         if infos["type"] == ITEM_POU:
  1266         if infos["type"] == ITEM_POU:
  1482             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"], self.Debug)])
  1267             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1483         else:
  1268         else:
  1484             self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1269             self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1485             
  1270             
  1486         if wx.VERSION >= (2, 6, 0):
  1271         if wx.VERSION >= (2, 6, 0):
  1487             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1272             item, root_cookie = self.TypesTree.GetFirstChild(root)
  1542     def OnTypesTreeBeginDrag(self, event):
  1327     def OnTypesTreeBeginDrag(self, event):
  1543         if wx.Platform == '__WXMSW__':
  1328         if wx.Platform == '__WXMSW__':
  1544             self.SelectedItem = event.GetItem()
  1329             self.SelectedItem = event.GetItem()
  1545         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1330         if self.SelectedItem is not None and self.TypesTree.GetPyData(self.SelectedItem) == ITEM_POU:
  1546             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1331             block_name = self.TypesTree.GetItemText(self.SelectedItem)
  1547             block_type = self.Controler.GetPouType(block_name, self.Debug)
  1332             block_type = self.Controler.GetPouType(block_name)
  1548             if block_type != "program":
  1333             if block_type != "program":
  1549                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1334                 data = wx.TextDataObject(str((block_name, block_type, "")))
  1550                 dragSource = wx.DropSource(self.TypesTree)
  1335                 dragSource = wx.DropSource(self.TypesTree)
  1551                 dragSource.SetData(data)
  1336                 dragSource.SetData(data)
  1552                 dragSource.DoDragDrop()
  1337                 dragSource.DoDragDrop()
  1573                 old_name = self.TypesTree.GetItemText(item)
  1358                 old_name = self.TypesTree.GetItemText(item)
  1574                 itemtype = self.TypesTree.GetPyData(item)
  1359                 itemtype = self.TypesTree.GetPyData(item)
  1575                 if itemtype == ITEM_PROJECT:
  1360                 if itemtype == ITEM_PROJECT:
  1576                     self.Controler.SetProjectProperties(name = new_name)
  1361                     self.Controler.SetProjectProperties(name = new_name)
  1577                 elif itemtype == ITEM_DATATYPE:
  1362                 elif itemtype == ITEM_DATATYPE:
  1578                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]:
  1363                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1579                         message = _("\"%s\" data type already exists!")%new_name
  1364                         message = _("\"%s\" data type already exists!")%new_name
  1580                         abort = True
  1365                         abort = True
  1581                     if not abort:
  1366                     if not abort:
  1582                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1367                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1583                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1368                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1584                                                 self.Controler.ComputeDataTypeName(new_name))
  1369                                                 self.Controler.ComputeDataTypeName(new_name))
  1585                         self.RefreshPageTitles()
  1370                         self.RefreshPageTitles()
  1586                 elif itemtype == ITEM_POU:
  1371                 elif itemtype == ITEM_POU:
  1587                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]:
  1372                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1588                         message = _("\"%s\" pou already exists!")%new_name
  1373                         message = _("\"%s\" pou already exists!")%new_name
  1589                         abort = True
  1374                         abort = True
  1590                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1375                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1591                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1376                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1592                         if messageDialog.ShowModal() == wx.ID_NO:
  1377                         if messageDialog.ShowModal() == wx.ID_NO:
  1593                             abort = True
  1378                             abort = True
  1594                         messageDialog.Destroy()
  1379                         messageDialog.Destroy()
  1595                     if not abort:
  1380                     if not abort:
  1598                                                 self.Controler.ComputePouName(new_name))
  1383                                                 self.Controler.ComputePouName(new_name))
  1599                         self.RefreshLibraryTree()
  1384                         self.RefreshLibraryTree()
  1600                         self.RefreshPageTitles()
  1385                         self.RefreshPageTitles()
  1601                 elif itemtype == ITEM_TRANSITION:
  1386                 elif itemtype == ITEM_TRANSITION:
  1602                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1387                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1603                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1388                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1604                         message = _("A pou with \"%s\" as name exists!")%new_name
  1389                         message = _("A pou with \"%s\" as name exists!")%new_name
  1605                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1390                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1606                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1391                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1607                     else:
  1392                     else:
  1608                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1393                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1609                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1394                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1610                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1395                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1611                         self.RefreshPageTitles()
  1396                         self.RefreshPageTitles()
  1612                 elif itemtype == ITEM_ACTION:
  1397                 elif itemtype == ITEM_ACTION:
  1613                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1398                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1614                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1399                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1615                         message = _("A pou with \"%s\" as name exists!")%new_name
  1400                         message = _("A pou with \"%s\" as name exists!")%new_name
  1616                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1401                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name) if name != old_name]:
  1617                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1402                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1618                     else:
  1403                     else:
  1619                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1404                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1620                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1405                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1621                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1406                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1622                         self.RefreshPageTitles()
  1407                         self.RefreshPageTitles()
  1623                 elif itemtype == ITEM_CONFIGURATION:
  1408                 elif itemtype == ITEM_CONFIGURATION:
  1624                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]:
  1409                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1625                         message = _("\"%s\" config already exists!")%new_name
  1410                         message = _("\"%s\" config already exists!")%new_name
  1626                         abort = True
  1411                         abort = True
  1627                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1412                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1628                         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)
  1413                         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)
  1629                         if messageDialog.ShowModal() == wx.ID_NO:
  1414                         if messageDialog.ShowModal() == wx.ID_NO:
  1630                             abort = True
  1415                             abort = True
  1631                         messageDialog.Destroy()
  1416                         messageDialog.Destroy()
  1632                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1417                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1633                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1418                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1634                         if messageDialog.ShowModal() == wx.ID_NO:
  1419                         if messageDialog.ShowModal() == wx.ID_NO:
  1635                             abort = True
  1420                             abort = True
  1636                         messageDialog.Destroy()
  1421                         messageDialog.Destroy()
  1637                     if not abort:
  1422                     if not abort:
  1639                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1424                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1640                                                 self.Controler.ComputeConfigurationName(new_name))
  1425                                                 self.Controler.ComputeConfigurationName(new_name))
  1641                         self.RefreshPageTitles()
  1426                         self.RefreshPageTitles()
  1642                 elif itemtype == ITEM_RESOURCE:
  1427                 elif itemtype == ITEM_RESOURCE:
  1643                     config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION)
  1428                     config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION)
  1644                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]:
  1429                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1645                         message = _("\"%s\" config already exists!")%new_name
  1430                         message = _("\"%s\" config already exists!")%new_name
  1646                         abort = True
  1431                         abort = True
  1647                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1432                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1648                         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)
  1433                         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)
  1649                         if messageDialog.ShowModal() == wx.ID_NO:
  1434                         if messageDialog.ShowModal() == wx.ID_NO:
  1650                             abort = True
  1435                             abort = True
  1651                         messageDialog.Destroy()
  1436                         messageDialog.Destroy()
  1652                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1437                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables()]:
  1653                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1438                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1654                         if messageDialog.ShowModal() == wx.ID_NO:
  1439                         if messageDialog.ShowModal() == wx.ID_NO:
  1655                             abort = True
  1440                             abort = True
  1656                         messageDialog.Destroy()
  1441                         messageDialog.Destroy()
  1657                     if not abort:
  1442                     if not abort:
  1752             elif elementtype == ITEM_RESOURCE:
  1537             elif elementtype == ITEM_RESOURCE:
  1753                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1538                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1754                 self.AddPage(new_window, "")
  1539                 self.AddPage(new_window, "")
  1755                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1540                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1756             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1541             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1757                 bodytype = self.Controler.GetEditedElementBodyType(tagname, self.Debug)
  1542                 bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1758                 if bodytype == "FBD":
  1543                 if bodytype == "FBD":
  1759                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1544                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1760                     new_window.RefreshScaling(False)
  1545                     new_window.RefreshScaling(False)
  1761                 elif bodytype == "LD":
  1546                 elif bodytype == "LD":
  1762                     new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1547                     new_window = LD_Viewer(self.TabsOpened, tagname, self, self.Controler)
  1771                         new_window.SetKeywords(IL_KEYWORDS)
  1556                         new_window.SetKeywords(IL_KEYWORDS)
  1772                     else:
  1557                     else:
  1773                         new_window.SetKeywords(ST_KEYWORDS)
  1558                         new_window.SetKeywords(ST_KEYWORDS)
  1774                 self.AddPage(new_window, "")
  1559                 self.AddPage(new_window, "")
  1775                 words = tagname.split("::")
  1560                 words = tagname.split("::")
  1776                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1], self.Debug))
  1561                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1777             elif elementtype == ITEM_DATATYPE:
  1562             elif elementtype == ITEM_DATATYPE:
  1778                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1563                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1779                 self.AddPage(new_window, "")
  1564                 self.AddPage(new_window, "")
  1780             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1565             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1781             openedidx = self.IsOpened(tagname)
  1566             openedidx = self.IsOpened(tagname)
  1798             item = self.TypesTree.GetSelection()
  1583             item = self.TypesTree.GetSelection()
  1799         name = self.TypesTree.GetItemText(item)
  1584         name = self.TypesTree.GetItemText(item)
  1800         type = self.TypesTree.GetPyData(item)
  1585         type = self.TypesTree.GetPyData(item)
  1801         if type == ITEM_POU:
  1586         if type == ITEM_POU:
  1802             menu = wx.Menu(title='')
  1587             menu = wx.Menu(title='')
  1803             if self.Controler.GetPouBodyType(name, self.Debug) == "SFC":
  1588             if self.Controler.GetPouBodyType(name) == "SFC":
  1804                 new_id = wx.NewId()
  1589                 new_id = wx.NewId()
  1805                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1590                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1806                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1591                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1807                 new_id = wx.NewId()
  1592                 new_id = wx.NewId()
  1808                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1593                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1809                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1594                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1810                 menu.AppendSeparator()
  1595                 menu.AppendSeparator()
  1811             new_id = wx.NewId()
  1596             new_id = wx.NewId()
  1812             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Create a new POU from"))
  1597             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Create a new POU from"))
  1813             self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id)
  1598             self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id)
  1814             pou_type = self.Controler.GetPouType(name, self.Debug)
  1599             pou_type = self.Controler.GetPouType(name)
  1815             if pou_type in ["function", "functionBlock"]:
  1600             if pou_type in ["function", "functionBlock"]:
  1816                 change_menu = wx.Menu(title='')
  1601                 change_menu = wx.Menu(title='')
  1817                 if pou_type == "function":
  1602                 if pou_type == "function":
  1818                     new_id = wx.NewId()
  1603                     new_id = wx.NewId()
  1819                     AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Function Block"))
  1604                     AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Function Block"))
  1903 #-------------------------------------------------------------------------------
  1688 #-------------------------------------------------------------------------------
  1904 #                         Instances Tree Management Functions
  1689 #                         Instances Tree Management Functions
  1905 #-------------------------------------------------------------------------------
  1690 #-------------------------------------------------------------------------------
  1906 
  1691 
  1907     def RefreshInstancesTree(self):
  1692     def RefreshInstancesTree(self):
  1908         infos = self.Controler.GetProjectTopology(self.Debug)
  1693         infos = self.Controler.GetProjectTopology(self.EnableDebug)
  1909         root = self.InstancesTree.GetRootItem()
  1694         root = self.InstancesTree.GetRootItem()
  1910         if not root.IsOk():
  1695         if not root.IsOk():
  1911             root = self.InstancesTree.AddRoot(infos["name"])
  1696             root = self.InstancesTree.AddRoot(infos["name"])
  1912         self.GenerateInstancesTreeBranch(root, infos)
  1697         self.GenerateInstancesTreeBranch(root, infos)
  1913         self.InstancesTree.Expand(root)
  1698         self.InstancesTree.Expand(root)
  1937             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1722             item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie)
  1938         for item in to_delete:
  1723         for item in to_delete:
  1939             self.InstancesTree.Delete(item)
  1724             self.InstancesTree.Delete(item)
  1940 
  1725 
  1941     def OnInstancesTreeBeginDrag(self, event):
  1726     def OnInstancesTreeBeginDrag(self, event):
  1942         selected_item = event.GetItem()
  1727         if self.Controler.DebugAvailable():
  1943         selected_infos = self.InstancesTree.GetPyData(selected_item)
  1728             selected_item = event.GetItem()
  1944         if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  1729             selected_infos = self.InstancesTree.GetPyData(selected_item)
  1945             var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
  1730             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  1946             parent_item = self.InstancesTree.GetItemParent(selected_item)
  1731                 var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
  1947             while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1948                 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1949                 var_path = "%s.%s"%(parent_name, var_path)
       
  1950                 parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1951             data = wx.TextDataObject(str((var_path, "debug")))
       
  1952             dragSource = wx.DropSource(self.InstancesTree)
       
  1953             dragSource.SetData(data)
       
  1954             dragSource.DoDragDrop()
       
  1955         event.Skip()
       
  1956 
       
  1957     def OnInstancesTreeItemActivated(self, event):
       
  1958         selected_item = event.GetItem()
       
  1959         selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  1960         if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]:
       
  1961             instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
       
  1962             parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1963             while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1964                 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1965                 instance_path = "%s.%s"%(parent_name, instance_path)
       
  1966                 parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1967             openedidx = self.IsOpened(instance_path)
       
  1968             if openedidx is not None:
       
  1969                 old_selected = self.TabsOpened.GetSelection()
       
  1970                 if old_selected != openedidx:
       
  1971                     if old_selected >= 0:
       
  1972                         self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1973                     self.TabsOpened.SetSelection(openedidx)
       
  1974             elif selected_infos[1] is not None:
       
  1975                 bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], self.Debug)
       
  1976                 if bodytype == "FBD":
       
  1977                     new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1978                     new_window.RefreshScaling(False)
       
  1979                 elif bodytype == "LD":
       
  1980                     new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1981                     new_window.RefreshScaling(False)
       
  1982                 elif bodytype == "SFC":
       
  1983                     new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1984                     new_window.RefreshScaling(False)
       
  1985                 else:
       
  1986                     new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1987                     new_window.SetTextSyntax(bodytype)
       
  1988                     if bodytype == "IL":
       
  1989                         new_window.SetKeywords(IL_KEYWORDS)
       
  1990                     else:
       
  1991                         new_window.SetKeywords(ST_KEYWORDS)
       
  1992                 self.AddPage(new_window, "")
       
  1993                 new_window.SetFocus()
       
  1994                 self.RefreshPageTitles()
       
  1995         if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  1996             var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  1997             var_type = var_type.split(")")[0]
       
  1998             
       
  1999             if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\
       
  2000                self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug):
       
  2001                 parent_item = self.InstancesTree.GetItemParent(selected_item)
  1732                 parent_item = self.InstancesTree.GetItemParent(selected_item)
  2002                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
  1733                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
  2003                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
  1734                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
  2004                     var_path = "%s.%s"%(parent_name, var_path)
  1735                     var_path = "%s.%s"%(parent_name, var_path)
  2005                     parent_item = self.InstancesTree.GetItemParent(parent_item)
  1736                     parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1737                 data = wx.TextDataObject(str((var_path, "debug")))
       
  1738                 dragSource = wx.DropSource(self.InstancesTree)
       
  1739                 dragSource.SetData(data)
       
  1740                 dragSource.DoDragDrop()
       
  1741             event.Skip()
       
  1742         else:
       
  1743             event.Veto()
       
  1744 
       
  1745     def OnInstancesTreeItemActivated(self, event):
       
  1746         if self.Controler.DebugAvailable():
       
  1747             selected_item = event.GetItem()
       
  1748             selected_infos = self.InstancesTree.GetPyData(selected_item)
       
  1749             if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]:
       
  1750                 instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0]
       
  1751                 parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1752                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1753                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1754                     instance_path = "%s.%s"%(parent_name, instance_path)
       
  1755                     parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1756                 openedidx = self.IsOpened(instance_path)
       
  1757                 if openedidx is not None:
       
  1758                     old_selected = self.TabsOpened.GetSelection()
       
  1759                     if old_selected != openedidx:
       
  1760                         if old_selected >= 0:
       
  1761                             self.TabsOpened.GetPage(old_selected).ResetBuffer()
       
  1762                         self.TabsOpened.SetSelection(openedidx)
       
  1763                 elif selected_infos[1] is not None:
       
  1764                     bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], True)
       
  1765                     if bodytype == "FBD":
       
  1766                         new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1767                         new_window.RefreshScaling(False)
       
  1768                     elif bodytype == "LD":
       
  1769                         new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1770                         new_window.RefreshScaling(False)
       
  1771                     elif bodytype == "SFC":
       
  1772                         new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1773                         new_window.RefreshScaling(False)
       
  1774                     else:
       
  1775                         new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path)
       
  1776                         new_window.SetTextSyntax(bodytype)
       
  1777                         if bodytype == "IL":
       
  1778                             new_window.SetKeywords(IL_KEYWORDS)
       
  1779                         else:
       
  1780                             new_window.SetKeywords(ST_KEYWORDS)
       
  1781                     self.AddPage(new_window, "")
       
  1782                     new_window.SetFocus()
       
  1783                     self.RefreshPageTitles()
       
  1784             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
       
  1785                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
       
  1786                 var_type = var_type.split(")")[0]
  2006                 
  1787                 
  2007                 self.OpenGraphicViewer(var_path)
  1788                 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\
       
  1789                    self.Controler.IsOfType(var_type, "ANY_BIT", True):
       
  1790                     parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  1791                     while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  1792                         parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  1793                         var_path = "%s.%s"%(parent_name, var_path)
       
  1794                         parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1795                     
       
  1796                     self.OpenGraphicViewer(var_path)
  2008         event.Skip()
  1797         event.Skip()
  2009 
  1798 
  2010     def OpenGraphicViewer(self, var_path):
  1799     def OpenGraphicViewer(self, var_path):
  2011         new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path)
  1800         new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path)
  2012         self.AddPage(new_window, "")
  1801         self.AddPage(new_window, "")
  2013         new_window.SetFocus()
  1802         new_window.SetFocus()
  2014         self.RefreshPageTitles()
  1803         self.RefreshPageTitles()
  2015 
  1804 
  2016     def OnInstancesTreeRightUp(self, event):
  1805     def OnInstancesTreeRightUp(self, event):
  2017         if wx.Platform == '__WXMSW__':
  1806         if self.Controler.DebugAvailable():
  2018             selected_item = event.GetItem()
  1807             if wx.Platform == '__WXMSW__':
  2019         else:
  1808                 selected_item = event.GetItem()
  2020             selected_item = self.InstancesTree.GetSelection()
  1809             else:
  2021         selected_infos = self.InstancesTree.GetPyData(selected_item)
  1810                 selected_item = self.InstancesTree.GetSelection()
  2022         if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  1811             selected_infos = self.InstancesTree.GetPyData(selected_item)
  2023             var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
  1812             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  2024             var_type = var_type.split(")")[0]
  1813                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
  2025             
  1814                 var_type = var_type.split(")")[0]
  2026             if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\
       
  2027                self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug):
       
  2028                 parent_item = self.InstancesTree.GetItemParent(selected_item)
       
  2029                 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
       
  2030                     parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
       
  2031                     var_path = "%s.%s"%(parent_name, var_path)
       
  2032                     parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  2033                 
  1815                 
  2034                 menu = wx.Menu(title='')
  1816                 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\
  2035                 new_id = wx.NewId()
  1817                    self.Controler.IsOfType(var_type, "ANY_BIT", True):
  2036                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel"))
  1818                     parent_item = self.InstancesTree.GetItemParent(selected_item)
  2037                 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id)
  1819                     while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT:
  2038                 new_id = wx.NewId()
  1820                         parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0]
  2039                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log"))
  1821                         var_path = "%s.%s"%(parent_name, var_path)
  2040                 self.PopupMenu(menu)
  1822                         parent_item = self.InstancesTree.GetItemParent(parent_item)
       
  1823                     
       
  1824                     menu = wx.Menu(title='')
       
  1825                     new_id = wx.NewId()
       
  1826                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel"))
       
  1827                     self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id)
       
  1828                     new_id = wx.NewId()
       
  1829                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log"))
       
  1830                     self.PopupMenu(menu)
  2041         event.Skip()
  1831         event.Skip()
  2042 
  1832 
  2043     def AddVariableGraphicFunction(self, iec_path):
  1833     def AddVariableGraphicFunction(self, iec_path):
  2044         def AddVariableGraphic(event):
  1834         def AddVariableGraphic(event):
  2045             self.OpenGraphicViewer(iec_path)
  1835             self.OpenGraphicViewer(iec_path)
  2074 #-------------------------------------------------------------------------------
  1864 #-------------------------------------------------------------------------------
  2075 #                         Library Tree Management Functions
  1865 #                         Library Tree Management Functions
  2076 #-------------------------------------------------------------------------------
  1866 #-------------------------------------------------------------------------------
  2077 
  1867 
  2078     def RefreshLibraryTree(self):
  1868     def RefreshLibraryTree(self):
  2079         if not self.Debug:
  1869         to_delete = []
  2080             to_delete = []
  1870         blocktypes = self.Controler.GetBlockTypes()
  2081             blocktypes = self.Controler.GetBlockTypes(debug = self.Debug)
  1871         root = self.LibraryTree.GetRootItem()
  2082             root = self.LibraryTree.GetRootItem()
  1872         if not root.IsOk():
  2083             if not root.IsOk():
  1873             if wx.Platform == '__WXMSW__':
  2084                 if wx.Platform == '__WXMSW__':
  1874                 root = self.LibraryTree.AddRoot(_("Block Types"))
  2085                     root = self.LibraryTree.AddRoot(_("Block Types"))
  1875                 self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
  2086                     self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
  1876             else:
       
  1877                 root = self.LibraryTree.AddRoot("")
       
  1878         if wx.VERSION >= (2, 6, 0):
       
  1879             category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
       
  1880         else:
       
  1881             category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
       
  1882         for category in blocktypes:
       
  1883             category_name = category["name"]
       
  1884             if not category_item.IsOk():
       
  1885                 category_item = self.LibraryTree.AppendItem(root, _(category_name))
       
  1886                 if wx.Platform != '__WXMSW__':
       
  1887                     category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  1888             else:
       
  1889                 self.LibraryTree.SetItemText(category_item, _(category_name))
       
  1890             self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
       
  1891             if wx.VERSION >= (2, 6, 0):
       
  1892                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
       
  1893             else:
       
  1894                 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
       
  1895             for blocktype in category["list"]:
       
  1896                 if not blocktype_item.IsOk():
       
  1897                     blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
       
  1898                     if wx.Platform != '__WXMSW__':
       
  1899                         blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  2087                 else:
  1900                 else:
  2088                     root = self.LibraryTree.AddRoot("")
  1901                     self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
  2089             if wx.VERSION >= (2, 6, 0):
  1902                 self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
  2090                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
  1903                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  2091             else:
  1904             while blocktype_item.IsOk():
  2092                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
  1905                 to_delete.append(blocktype_item)
  2093             for category in blocktypes:
  1906                 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
  2094                 category_name = category["name"]
  1907             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  2095                 if not category_item.IsOk():
  1908         while category_item.IsOk():
  2096                     category_item = self.LibraryTree.AppendItem(root, _(category_name))
  1909             to_delete.append(category_item)
  2097                     if wx.Platform != '__WXMSW__':
  1910             category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  2098                         category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  1911         for item in to_delete:
  2099                 else:
  1912             self.LibraryTree.Delete(item)
  2100                     self.LibraryTree.SetItemText(category_item, _(category_name))
  1913         if wx.Platform == '__WXMSW__':        
  2101                 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
  1914             self.LibraryTree.Expand(root)
  2102                 if wx.VERSION >= (2, 6, 0):
       
  2103                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
       
  2104                 else:
       
  2105                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
       
  2106                 for blocktype in category["list"]:
       
  2107                     if not blocktype_item.IsOk():
       
  2108                         blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"])
       
  2109                         if wx.Platform != '__WXMSW__':
       
  2110                             blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2111                     else:
       
  2112                         self.LibraryTree.SetItemText(blocktype_item, blocktype["name"])
       
  2113                     self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
       
  2114                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2115                 while blocktype_item.IsOk():
       
  2116                     to_delete.append(blocktype_item)
       
  2117                     blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie)
       
  2118                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  2119             while category_item.IsOk():
       
  2120                 to_delete.append(category_item)
       
  2121                 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
       
  2122             for item in to_delete:
       
  2123                 self.LibraryTree.Delete(item)
       
  2124             if wx.Platform == '__WXMSW__':        
       
  2125                 self.LibraryTree.Expand(root)
       
  2126 
  1915 
  2127     def OnLibraryTreeItemSelected(self, event):
  1916     def OnLibraryTreeItemSelected(self, event):
  2128         selected = event.GetItem()
  1917         selected = event.GetItem()
  2129         pydata = self.LibraryTree.GetPyData(selected)
  1918         pydata = self.LibraryTree.GetPyData(selected)
  2130         if pydata is not None and pydata["type"] != CATEGORY:
  1919         if pydata is not None and pydata["type"] != CATEGORY:
  2131             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug)
  1920             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"])
  2132             if blocktype:
  1921             if blocktype:
  2133                 comment = blocktype["comment"]
  1922                 comment = blocktype["comment"]
  2134                 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", ""))
  1923                 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", ""))
  2135             else:
  1924             else:
  2136                 self.LibraryComment.SetValue("")
  1925                 self.LibraryComment.SetValue("")
  2151 #-------------------------------------------------------------------------------
  1940 #-------------------------------------------------------------------------------
  2152 #                          ToolBar Management Functions
  1941 #                          ToolBar Management Functions
  2153 #-------------------------------------------------------------------------------
  1942 #-------------------------------------------------------------------------------
  2154 
  1943 
  2155     def ResetToolBar(self):
  1944     def ResetToolBar(self):
  2156         if not self.Debug:
  1945         for item in self.CurrentToolBar:
  2157             for item in self.CurrentToolBar:
  1946             if wx.VERSION >= (2, 6, 0):
  2158                 if wx.VERSION >= (2, 6, 0):
  1947                 self.Unbind(wx.EVT_MENU, id=item)
  2159                     self.Unbind(wx.EVT_MENU, id=item)
  1948             else:
  2160                 else:
  1949                 self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED) 
  2161                     self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED) 
  1950             
  2162                 
  1951             if USE_AUI:
       
  1952                 ToolBar = self.Panes["ToolBar"]
       
  1953             else:
       
  1954                 ToolBar = self.ToolBar
       
  1955             if ToolBar:
       
  1956                 ToolBar.DeleteTool(item)
       
  1957                 ToolBar.Realize()
  2163                 if USE_AUI:
  1958                 if USE_AUI:
  2164                     ToolBar = self.Panes["ToolBar"]
  1959                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  2165                 else:
  1960                     self.AUIManager.Update()
  2166                     ToolBar = self.ToolBar
       
  2167                 if ToolBar:
       
  2168                     ToolBar.DeleteTool(item)
       
  2169                     ToolBar.Realize()
       
  2170                     if USE_AUI:
       
  2171                         self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  2172                         self.AUIManager.Update()
       
  2173 
  1961 
  2174     def RefreshToolBar(self):
  1962     def RefreshToolBar(self):
  2175         if not self.Debug:
  1963         selected = self.TabsOpened.GetSelection()
  2176             selected = self.TabsOpened.GetSelection()
  1964         language = None
  2177             if selected != -1:
  1965         if selected != -1:
  2178                 language = self.Controler.GetEditedElementBodyType(self.TabsOpened.GetPage(selected).GetTagName(), self.Debug)
  1966             window = self.TabsOpened.GetPage(selected)
       
  1967             if not window.IsDebugging():
       
  1968                 language = self.Controler.GetEditedElementBodyType(window.GetTagName())
       
  1969         if language is not None and language != self.CurrentLanguage:
       
  1970             self.ResetToolBar()
       
  1971             self.CurrentLanguage = language
       
  1972             self.CurrentToolBar = []
       
  1973             if USE_AUI:
       
  1974                 ToolBar = self.Panes["ToolBar"]
  2179             else:
  1975             else:
  2180                 language = None
  1976                 ToolBar = self.ToolBar
  2181             if language is not None and language != self.CurrentLanguage:
  1977             if ToolBar:
  2182                 self.ResetToolBar()
  1978                 for radio, modes, id, method, picture, help in ToolBarItems[language]:
  2183                 self.CurrentLanguage = language
  1979                     if modes & self.DrawingMode:
  2184                 self.CurrentToolBar = []
  1980                         if radio or self.DrawingMode == FREEDRAWING_MODE:
       
  1981                             ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
       
  1982                         else:
       
  1983                             ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
       
  1984                         self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
       
  1985                         self.CurrentToolBar.append(id)
       
  1986                 ToolBar.Realize()
  2185                 if USE_AUI:
  1987                 if USE_AUI:
  2186                     ToolBar = self.Panes["ToolBar"]
  1988                     self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
  2187                 else:
  1989                     self.AUIManager.Update()
  2188                     ToolBar = self.ToolBar
  1990         elif not language:
  2189                 if ToolBar:
  1991             self.ResetToolBar()
  2190                     for radio, modes, id, method, picture, help in ToolBarItems[language]:
  1992             self.CurrentLanguage = language
  2191                         if modes & self.DrawingMode:
  1993         self.ResetCurrentMode()
  2192                             if radio or self.DrawingMode == FREEDRAWING_MODE:
       
  2193                                 ToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
       
  2194                             else:
       
  2195                                 ToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
       
  2196                             self.Bind(wx.EVT_TOOL, getattr(self, method), id=id)
       
  2197                             self.CurrentToolBar.append(id)
       
  2198                     ToolBar.Realize()
       
  2199                     if USE_AUI:
       
  2200                         self.AUIManager.GetPane("ToolBar").BestSize(ToolBar.GetBestSize())
       
  2201                         self.AUIManager.Update()
       
  2202             elif not language:
       
  2203                 self.ResetToolBar()
       
  2204                 self.CurrentLanguage = language
       
  2205             self.ResetCurrentMode()
       
  2206 
  1994 
  2207 
  1995 
  2208 #-------------------------------------------------------------------------------
  1996 #-------------------------------------------------------------------------------
  2209 #                           ToolBar Items Functions
  1997 #                           ToolBar Items Functions
  2210 #-------------------------------------------------------------------------------
  1998 #-------------------------------------------------------------------------------
  2363 #                         Add Project Elements Functions
  2151 #                         Add Project Elements Functions
  2364 #-------------------------------------------------------------------------------
  2152 #-------------------------------------------------------------------------------
  2365 
  2153 
  2366     def OnAddDataTypeMenu(self, event):
  2154     def OnAddDataTypeMenu(self, event):
  2367         dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL)
  2155         dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL)
  2368         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug))
  2156         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames())
  2369         if dialog.ShowModal() == wx.ID_OK:
  2157         if dialog.ShowModal() == wx.ID_OK:
  2370             self.Controler.ProjectAddDataType(dialog.GetValue())
  2158             self.Controler.ProjectAddDataType(dialog.GetValue())
  2371             self.RefreshTitle()
  2159             self._Refresh(TITLE, EDITMENU, TYPESTREE)
  2372             self.RefreshEditMenu()
       
  2373             self.RefreshTypesTree()
       
  2374         dialog.Destroy()
  2160         dialog.Destroy()
  2375         event.Skip()
  2161         event.Skip()
  2376 
  2162 
  2377     def GenerateAddPouFunction(self, pou_type):
  2163     def GenerateAddPouFunction(self, pou_type):
  2378         def OnAddPouMenu(event):
  2164         def OnAddPouMenu(event):
  2379             dialog = PouDialog(self, pou_type)
  2165             dialog = PouDialog(self, pou_type)
  2380             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2166             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2381             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2167             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2382             if dialog.ShowModal() == wx.ID_OK:
  2168             if dialog.ShowModal() == wx.ID_OK:
  2383                 values = dialog.GetValues()
  2169                 values = dialog.GetValues()
  2384                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2170                 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
  2385                 self.RefreshTitle()
  2171                 self._Refresh(TITLE, EDITMENU, TYPESTREE, LIBRARYTREE)
  2386                 self.RefreshEditMenu()
       
  2387                 self.RefreshTypesTree()
       
  2388                 self.RefreshLibraryTree()
       
  2389             dialog.Destroy()
  2172             dialog.Destroy()
  2390             event.Skip()
  2173             event.Skip()
  2391         return OnAddPouMenu
  2174         return OnAddPouMenu
  2392 
  2175 
  2393     def GenerateAddTransitionFunction(self, pou_name):
  2176     def GenerateAddTransitionFunction(self, pou_name):
  2394         def OnAddTransitionMenu(event):
  2177         def OnAddTransitionMenu(event):
  2395             dialog = PouTransitionDialog(self)
  2178             dialog = PouTransitionDialog(self)
  2396             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2179             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2397             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug))
  2180             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2398             if dialog.ShowModal() == wx.ID_OK: 
  2181             if dialog.ShowModal() == wx.ID_OK: 
  2399                 values = dialog.GetValues()
  2182                 values = dialog.GetValues()
  2400                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2183                 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2401                 self.RefreshTitle()
  2184                 self._Refresh(TITLE, EDITMENU, TYPESTREE)
  2402                 self.RefreshEditMenu()
       
  2403                 self.RefreshTypesTree()
       
  2404                 dialog.Destroy()
  2185                 dialog.Destroy()
  2405             event.Skip()
  2186             event.Skip()
  2406         return OnAddTransitionMenu
  2187         return OnAddTransitionMenu
  2407 
  2188 
  2408     def GenerateAddActionFunction(self, pou_name):
  2189     def GenerateAddActionFunction(self, pou_name):
  2409         def OnAddActionMenu(event):
  2190         def OnAddActionMenu(event):
  2410             dialog = PouActionDialog(self)
  2191             dialog = PouActionDialog(self)
  2411             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2192             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2412             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug))
  2193             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name))
  2413             if dialog.ShowModal() == wx.ID_OK:
  2194             if dialog.ShowModal() == wx.ID_OK:
  2414                 values = dialog.GetValues()
  2195                 values = dialog.GetValues()
  2415                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2196                 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"])
  2416                 self.RefreshTitle()
  2197                 self._Refresh(TITLE, EDITMENU, TYPESTREE)
  2417                 self.RefreshEditMenu()
       
  2418                 self.RefreshTypesTree()
       
  2419             dialog.Destroy()
  2198             dialog.Destroy()
  2420             event.Skip()
  2199             event.Skip()
  2421         return OnAddActionMenu
  2200         return OnAddActionMenu
  2422 
  2201 
  2423     def OnAddConfigurationMenu(self, event):
  2202     def OnAddConfigurationMenu(self, event):
  2424         dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration"))
  2203         dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration"))
  2425         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2204         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2426         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2205         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2427         if dialog.ShowModal() == wx.ID_OK:
  2206         if dialog.ShowModal() == wx.ID_OK:
  2428             value = dialog.GetValue()
  2207             value = dialog.GetValue()
  2429             self.Controler.ProjectAddConfiguration(value)
  2208             self.Controler.ProjectAddConfiguration(value)
  2430             self.RefreshTitle()
  2209             self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE)
  2431             self.RefreshEditMenu()
       
  2432             self.RefreshTypesTree()
       
  2433             self.RefreshInstancesTree()
       
  2434         dialog.Destroy()
  2210         dialog.Destroy()
  2435         event.Skip()
  2211         event.Skip()
  2436 
  2212 
  2437     def GenerateAddResourceFunction(self, config_name):
  2213     def GenerateAddResourceFunction(self, config_name):
  2438         def OnAddResourceMenu(event):
  2214         def OnAddResourceMenu(event):
  2439             dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource"))
  2215             dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource"))
  2440             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2216             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2441             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2217             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables())
  2442             if dialog.ShowModal() == wx.ID_OK:
  2218             if dialog.ShowModal() == wx.ID_OK:
  2443                 value = dialog.GetValue()
  2219                 value = dialog.GetValue()
  2444                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2220                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2445                 self.RefreshTitle()
  2221                 self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE)
  2446                 self.RefreshEditMenu()
       
  2447                 self.RefreshTypesTree()
       
  2448                 self.RefreshInstancesTree()
       
  2449             dialog.Destroy()
  2222             dialog.Destroy()
  2450             event.Skip()
  2223             event.Skip()
  2451         return OnAddResourceMenu
  2224         return OnAddResourceMenu
  2452 
  2225 
  2453     def GenerateChangePouTypeFunction(self, name, new_type):
  2226     def GenerateChangePouTypeFunction(self, name, new_type):
  2454         def OnChangePouTypeMenu(event):
  2227         def OnChangePouTypeMenu(event):
  2455             selected = self.TypesTree.GetSelection()
  2228             selected = self.TypesTree.GetSelection()
  2456             if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2229             if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2457                 self.Controler.ProjectChangePouType(name, new_type)
  2230                 self.Controler.ProjectChangePouType(name, new_type)
  2458                 self.RefreshTitle()
  2231                 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE, LIBRARYTREE)
  2459                 self.RefreshEditMenu()
       
  2460                 self.RefreshTypesTree()
       
  2461                 self.RefreshLibraryTree()
       
  2462                 self.RefreshToolBar()
       
  2463             event.Skip()
  2232             event.Skip()
  2464         return OnChangePouTypeMenu
  2233         return OnChangePouTypeMenu
  2465 
  2234 
  2466     def OnCreatePouFromMenu(self, event):
  2235     def OnCreatePouFromMenu(self, event):
  2467         selected = self.TypesTree.GetSelection()
  2236         selected = self.TypesTree.GetSelection()
  2468         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2237         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2469             dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL)
  2238             dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL)
  2470             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2239             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2471             if dialog.ShowModal() == wx.ID_OK:
  2240             if dialog.ShowModal() == wx.ID_OK:
  2472                 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected))
  2241                 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected))
  2473                 self.RefreshTitle()
  2242                 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE, LIBRARYTREE)
  2474                 self.RefreshEditMenu()
       
  2475                 self.RefreshTypesTree()
       
  2476                 self.RefreshLibraryTree()
       
  2477                 self.RefreshToolBar()
       
  2478         event.Skip()
  2243         event.Skip()
  2479 
  2244 
  2480 #-------------------------------------------------------------------------------
  2245 #-------------------------------------------------------------------------------
  2481 #                        Remove Project Elements Functions
  2246 #                        Remove Project Elements Functions
  2482 #-------------------------------------------------------------------------------
  2247 #-------------------------------------------------------------------------------
  2483 
  2248 
  2484     def OnRemoveDataTypeMenu(self, event):
  2249     def OnRemoveDataTypeMenu(self, event):
  2485         selected = self.TypesTree.GetSelection()
  2250         selected = self.TypesTree.GetSelection()
  2486         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  2251         if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE:
  2487             name = self.TypesTree.GetItemText(selected)
  2252             name = self.TypesTree.GetItemText(selected)
  2488             if not self.Controler.DataTypeIsUsed(name, self.Debug):
  2253             if not self.Controler.DataTypeIsUsed(name):
  2489                 self.Controler.ProjectRemoveDataType(name)
  2254                 self.Controler.ProjectRemoveDataType(name)
  2490                 tagname = self.Controler.ComputeDataTypeName(name)
  2255                 tagname = self.Controler.ComputeDataTypeName(name)
  2491                 idx = self.IsOpened(tagname)
  2256                 idx = self.IsOpened(tagname)
  2492                 if idx is not None:
  2257                 if idx is not None:
  2493                     self.TabsOpened.DeletePage(idx)
  2258                     self.TabsOpened.DeletePage(idx)
  2494                 self.RefreshTitle()
  2259                 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE)
  2495                 self.RefreshEditMenu()
       
  2496                 self.RefreshTypesTree()
       
  2497                 self.RefreshToolBar()
       
  2498             else:
  2260             else:
  2499                 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR)
  2261                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2500                 message.ShowModal()
       
  2501                 message.Destroy()
       
  2502         event.Skip()
  2262         event.Skip()
  2503 
  2263 
  2504     def OnRenamePouMenu(self, event):
  2264     def OnRenamePouMenu(self, event):
  2505         selected = self.TypesTree.GetSelection()
  2265         selected = self.TypesTree.GetSelection()
  2506         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2266         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2509 
  2269 
  2510     def OnRemovePouMenu(self, event):
  2270     def OnRemovePouMenu(self, event):
  2511         selected = self.TypesTree.GetSelection()
  2271         selected = self.TypesTree.GetSelection()
  2512         if self.TypesTree.GetPyData(selected) == ITEM_POU:
  2272         if self.TypesTree.GetPyData(selected) == ITEM_POU:
  2513             name = self.TypesTree.GetItemText(selected)
  2273             name = self.TypesTree.GetItemText(selected)
  2514             if not self.Controler.PouIsUsed(name, self.Debug):
  2274             if not self.Controler.PouIsUsed(name):
  2515                 self.Controler.ProjectRemovePou(name)
  2275                 self.Controler.ProjectRemovePou(name)
  2516                 tagname = self.Controler.ComputePouName(name)
  2276                 tagname = self.Controler.ComputePouName(name)
  2517                 idx = self.IsOpened(tagname)
  2277                 idx = self.IsOpened(tagname)
  2518                 if idx is not None:
  2278                 if idx is not None:
  2519                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2279                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2520                     self.TabsOpened.DeletePage(idx)
  2280                     self.TabsOpened.DeletePage(idx)
  2521                 self.RefreshTitle()
  2281                 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2522                 self.RefreshEditMenu()
       
  2523                 self.RefreshTypesTree()
       
  2524                 self.RefreshInstancesTree()
       
  2525                 self.RefreshLibraryTree()
       
  2526                 self.RefreshToolBar()
       
  2527             else:
  2282             else:
  2528                 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR)
  2283                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2529                 message.ShowModal()
       
  2530                 message.Destroy()
       
  2531         event.Skip()
  2284         event.Skip()
  2532 
  2285 
  2533     def OnRemoveTransitionMenu(self, event):
  2286     def OnRemoveTransitionMenu(self, event):
  2534         selected = self.TypesTree.GetSelection()
  2287         selected = self.TypesTree.GetSelection()
  2535         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2288         if self.TypesTree.GetPyData(selected) == ITEM_TRANSITION: 
  2544             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2297             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2545             idx = self.IsOpened(tagname)
  2298             idx = self.IsOpened(tagname)
  2546             if idx is not None:
  2299             if idx is not None:
  2547                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2300                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2548                 self.TabsOpened.DeletePage(idx)
  2301                 self.TabsOpened.DeletePage(idx)
  2549             self.RefreshTitle()
  2302             self._Refresh(TITLE, EDITMENU, TYPESTREE)
  2550             self.RefreshEditMenu()
       
  2551             self.RefreshTypesTree()
       
  2552         event.Skip()
  2303         event.Skip()
  2553 
  2304 
  2554     def OnRemoveActionMenu(self, event):
  2305     def OnRemoveActionMenu(self, event):
  2555         selected = self.TypesTree.GetSelection()
  2306         selected = self.TypesTree.GetSelection()
  2556         if self.TypesTree.GetPyData(selected) == ITEM_ACTION: 
  2307         if self.TypesTree.GetPyData(selected) == ITEM_ACTION: 
  2565             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2316             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2566             idx = self.IsOpened(tagname)
  2317             idx = self.IsOpened(tagname)
  2567             if idx is not None:
  2318             if idx is not None:
  2568                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2319                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2569                 self.TabsOpened.DeletePage(idx)
  2320                 self.TabsOpened.DeletePage(idx)
  2570             self.RefreshTitle()
  2321             self._Refresh(TITLE, EDITMENU, TYPESTREE)
  2571             self.RefreshEditMenu()
       
  2572             self.RefreshTypesTree()
       
  2573         event.Skip()
  2322         event.Skip()
  2574 
  2323 
  2575     def OnRemoveConfigurationMenu(self, event):
  2324     def OnRemoveConfigurationMenu(self, event):
  2576         selected = self.TypesTree.GetSelection()
  2325         selected = self.TypesTree.GetSelection()
  2577         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2326         if self.TypesTree.GetPyData(selected) == ITEM_CONFIGURATION: 
  2580             tagname = self.Controler.ComputeConfigurationName(name)
  2329             tagname = self.Controler.ComputeConfigurationName(name)
  2581             idx = self.IsOpened(tagname)
  2330             idx = self.IsOpened(tagname)
  2582             if idx is not None:
  2331             if idx is not None:
  2583                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2332                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2584                 self.TabsOpened.DeletePage(idx)
  2333                 self.TabsOpened.DeletePage(idx)
  2585             self.RefreshTitle()
  2334             self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE)
  2586             self.RefreshEditMenu()
       
  2587             self.RefreshTypesTree()
       
  2588             self.RefreshInstancesTree()
       
  2589         event.Skip()
  2335         event.Skip()
  2590 
  2336 
  2591     def OnRemoveResourceMenu(self, event):
  2337     def OnRemoveResourceMenu(self, event):
  2592         selected = self.TypesTree.GetSelection()
  2338         selected = self.TypesTree.GetSelection()
  2593         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2339         if self.TypesTree.GetPyData(selected) == ITEM_RESOURCE:
  2602             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2348             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2603             idx = self.IsOpened(tagname)
  2349             idx = self.IsOpened(tagname)
  2604             if idx is not None:
  2350             if idx is not None:
  2605                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2351                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
  2606                 self.TabsOpened.DeletePage(idx)
  2352                 self.TabsOpened.DeletePage(idx)
  2607             self.RefreshTitle()
  2353             self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE)
  2608             self.RefreshEditMenu()
       
  2609             self.RefreshTypesTree()
       
  2610             self.RefreshInstancesTree()
       
  2611         event.Skip()
  2354         event.Skip()
  2612     
  2355     
  2613     def OnPLCOpenEditorMenu(self, event):
  2356     def OnPLCOpenEditorMenu(self, event):
  2614         wx.MessageBox(_("No documentation available.\nComing soon."))
  2357         wx.MessageBox(_("No documentation available.\nComing soon."))
  2615         #event.Skip()
  2358         #event.Skip()
  2649         self.VariablePanelIndexer.ClearErrors()
  2392         self.VariablePanelIndexer.ClearErrors()
  2650         for i in xrange(self.TabsOpened.GetPageCount()):
  2393         for i in xrange(self.TabsOpened.GetPageCount()):
  2651             viewer = self.TabsOpened.GetPage(i)
  2394             viewer = self.TabsOpened.GetPage(i)
  2652             viewer.ClearErrors()
  2395             viewer.ClearErrors()
  2653 
  2396 
  2654     RefreshFunctions = {
  2397 #-------------------------------------------------------------------------------
  2655         TITLE : RefreshTitle,
  2398 #                            PLCOpenEditor Main Class
  2656         TOOLBAR : RefreshToolBar,
  2399 #-------------------------------------------------------------------------------
  2657         FILEMENU : RefreshFileMenu,
  2400 
  2658         EDITMENU : RefreshEditMenu,
  2401 class PLCOpenEditor(IDEFrame):
  2659         DISPLAYMENU : RefreshDisplayMenu,
  2402 
  2660         TYPESTREE : RefreshTypesTree,
  2403     # Compatibility function for wx versions < 2.6
  2661         INSTANCESTREE : RefreshInstancesTree, 
  2404     if wx.VERSION < (2, 6, 0):
  2662         LIBRARYTREE : RefreshLibraryTree,
  2405         def Bind(self, event, function, id = None):
  2663         SCALING : RefreshScaling}
  2406             if id is not None:
  2664 
  2407                 event(self, id, function)
  2665 current_num = 0
  2408             else:
  2666 def GetNewNum():
  2409                 event(self, function)
  2667     global current_num
  2410 
  2668     current_num += 1
  2411     def _init_coll_FileMenu_Items(self, parent):
  2669     return current_num
  2412         AppendMenu(parent, help='', id=wx.ID_NEW,
       
  2413               kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N'))
       
  2414         AppendMenu(parent, help='', id=wx.ID_OPEN,
       
  2415               kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O'))
       
  2416         AppendMenu(parent, help='', id=wx.ID_CLOSE,
       
  2417               kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W'))
       
  2418         AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
       
  2419               kind=wx.ITEM_NORMAL, text=_(u'Close Project'))
       
  2420         parent.AppendSeparator()
       
  2421         AppendMenu(parent, help='', id=wx.ID_SAVE,
       
  2422               kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S'))
       
  2423         AppendMenu(parent, help='', id=wx.ID_SAVEAS,
       
  2424               kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S'))
       
  2425         AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
       
  2426               kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G'))
       
  2427         parent.AppendSeparator()
       
  2428         AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
       
  2429               kind=wx.ITEM_NORMAL, text=_(u'Page Setup'))
       
  2430         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
       
  2431               kind=wx.ITEM_NORMAL, text=_(u'Preview'))
       
  2432         AppendMenu(parent, help='', id=wx.ID_PRINT,
       
  2433               kind=wx.ITEM_NORMAL, text=_(u'Print'))
       
  2434         parent.AppendSeparator()
       
  2435         AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
       
  2436               kind=wx.ITEM_NORMAL, text=_(u'Properties'))
       
  2437         parent.AppendSeparator()
       
  2438         AppendMenu(parent, help='', id=wx.ID_EXIT,
       
  2439               kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q'))
       
  2440         
       
  2441         self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
       
  2442         self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
       
  2443         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
       
  2444         self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
       
  2445         self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
       
  2446         self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
       
  2447         self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
       
  2448               id=ID_PLCOPENEDITORFILEMENUGENERATE)
       
  2449         self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
       
  2450         self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
       
  2451         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
       
  2452         self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES)
       
  2453         self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
       
  2454 
       
  2455     def _init_coll_HelpMenu_Items(self, parent):
       
  2456         AppendMenu(parent, help='', id=wx.ID_HELP, 
       
  2457             kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor\tF1'))
       
  2458         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
       
  2459         #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
       
  2460         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
       
  2461         #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
       
  2462         AppendMenu(parent, help='', id=wx.ID_ABOUT,
       
  2463             kind=wx.ITEM_NORMAL, text=_(u'About'))
       
  2464         self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
       
  2465         #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
       
  2466         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
       
  2467 
       
  2468     ## Constructor of the PLCOpenEditor class.
       
  2469     #  @param parent The parent window.
       
  2470     #  @param controler The controler been used by PLCOpenEditor (default: None).
       
  2471     #  @param fileOpen The filepath to open if no controler defined (default: None).
       
  2472     #  @param debug The filepath to open if no controler defined (default: False).
       
  2473     def __init__(self, parent, fileOpen = None):
       
  2474         IDEFrame.__init__(self, parent)
       
  2475         
       
  2476         # Open the filepath if defined
       
  2477         if fileOpen is not None:
       
  2478             # Create a new controller
       
  2479             self.Controler = PLCControler()
       
  2480             self.Controler.OpenXMLFile(fileOpen)
       
  2481         
       
  2482         # Define PLCOpenEditor icon
       
  2483         self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO))
       
  2484 
       
  2485         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
       
  2486         
       
  2487         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
       
  2488 
       
  2489     def OnCloseFrame(self, event):
       
  2490         if self.Controler is None or self.CheckSaveBeforeClosing():
       
  2491             if USE_AUI:
       
  2492                 self.AUIManager.UnInit()
       
  2493             event.Skip()
       
  2494         else:
       
  2495             event.Veto()
       
  2496 
       
  2497     def RefreshTitle(self):
       
  2498         name = _("PLCOpenEditor")
       
  2499         if self.Controler is not None:
       
  2500             self.SetTitle("%s - %s"%(name, self.Controler.GetFilename()))
       
  2501         else:
       
  2502             self.SetTitle(name)
       
  2503 
       
  2504 #-------------------------------------------------------------------------------
       
  2505 #                            File Menu Functions
       
  2506 #-------------------------------------------------------------------------------
       
  2507 
       
  2508     def RefreshFileMenu(self):
       
  2509         if self.Controler is not None:
       
  2510             selected = self.TabsOpened.GetSelection()
       
  2511             if selected >= 0:
       
  2512                 graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer)
       
  2513             else:
       
  2514                 graphic_viewer = False
       
  2515             if self.TabsOpened.GetPageCount() > 0:
       
  2516                 self.FileMenu.Enable(wx.ID_CLOSE, True)
       
  2517                 if graphic_viewer:
       
  2518                     self.FileMenu.Enable(wx.ID_PREVIEW, True)
       
  2519                     self.FileMenu.Enable(wx.ID_PRINT, True)
       
  2520                 else:
       
  2521                     self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
  2522                     self.FileMenu.Enable(wx.ID_PRINT, False)
       
  2523             else:
       
  2524                 self.FileMenu.Enable(wx.ID_CLOSE, False)
       
  2525                 self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
  2526                 self.FileMenu.Enable(wx.ID_PRINT, False)
       
  2527             self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
       
  2528             self.FileMenu.Enable(wx.ID_SAVE, True)
       
  2529             self.FileMenu.Enable(wx.ID_PROPERTIES, True)
       
  2530             self.FileMenu.Enable(wx.ID_CLOSE_ALL, True)
       
  2531             self.FileMenu.Enable(wx.ID_SAVEAS, True)
       
  2532             self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, True)
       
  2533         else:
       
  2534             self.FileMenu.Enable(wx.ID_CLOSE, False)
       
  2535             self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
       
  2536             self.FileMenu.Enable(wx.ID_PREVIEW, False)
       
  2537             self.FileMenu.Enable(wx.ID_PRINT, False)
       
  2538             self.FileMenu.Enable(wx.ID_SAVE, False)
       
  2539             self.FileMenu.Enable(wx.ID_PROPERTIES, False)
       
  2540             self.FileMenu.Enable(wx.ID_CLOSE_ALL, False)
       
  2541             self.FileMenu.Enable(wx.ID_SAVEAS, False)
       
  2542             self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, False)
       
  2543 
       
  2544     def OnNewProjectMenu(self, event):
       
  2545         if self.Controler is not None and not self.CheckSaveBeforeClosing():
       
  2546             return
       
  2547         dialog = ProjectDialog(self)
       
  2548         if dialog.ShowModal() == wx.ID_OK:
       
  2549             properties = dialog.GetValues()
       
  2550             self.Controler = PLCControler()
       
  2551             self.Controler.CreateNewProject(properties)
       
  2552             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, 
       
  2553                           LIBRARYTREE)
       
  2554         event.Skip()
       
  2555 
       
  2556     def OnOpenProjectMenu(self, event):
       
  2557         if self.Controler is not None and not self.CheckSaveBeforeClosing():
       
  2558             return
       
  2559         filepath = ""
       
  2560         if self.Controler is not None:
       
  2561             filepath = self.Controler.GetFilePath()
       
  2562         if filepath != "":
       
  2563             directory = os.path.dirname(filepath)
       
  2564         else:
       
  2565             directory = os.getcwd()
       
  2566         dialog = wx.FileDialog(self, _("Choose a file"), directory, "",  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
       
  2567         if dialog.ShowModal() == wx.ID_OK:
       
  2568             filepath = dialog.GetPath()
       
  2569             if os.path.isfile(filepath):
       
  2570                 self.DeleteAllPages()
       
  2571                 self.VariablePanelIndexer.RemoveAllPanels()
       
  2572                 self.Controler = PLCControler()
       
  2573                 self.Controler.OpenXMLFile(filepath)
       
  2574                 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE)
       
  2575             self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU)
       
  2576         dialog.Destroy()
       
  2577         event.Skip()
       
  2578     
       
  2579     def OnCloseProjectMenu(self, event):
       
  2580         if not self.CheckSaveBeforeClosing():
       
  2581             return
       
  2582         self.DeleteAllPages()
       
  2583         self.VariablePanelIndexer.RemoveAllPanels()
       
  2584         self.TypesTree.DeleteAllItems()
       
  2585         self.InstancesTree.DeleteAllItems()
       
  2586         self.LibraryTree.DeleteAllItems()
       
  2587         self.Controler = None
       
  2588         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU)
       
  2589         event.Skip()
       
  2590 
       
  2591     def OnSaveProjectMenu(self, event):
       
  2592         self.SaveProject()
       
  2593         event.Skip()
       
  2594 
       
  2595     def OnSaveProjectAsMenu(self, event):
       
  2596         self.SaveProjectAs()
       
  2597         event.Skip()
       
  2598 
       
  2599     def OnGenerateProgramMenu(self, event):
       
  2600         dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(),  _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR)
       
  2601         if dialog.ShowModal() == wx.ID_OK:
       
  2602             filepath = dialog.GetPath()
       
  2603             message_text = ""
       
  2604             header, icon = _("Done"), wx.ICON_INFORMATION
       
  2605             if os.path.isdir(os.path.dirname(filepath)):
       
  2606                 program, errors, warnings = self.Controler.GenerateProgram(filepath)
       
  2607                 message_text += "".join([_("warning: %s\n") for warning in warnings])
       
  2608                 if len(errors) > 0:
       
  2609                     message_text += "".join([_("error: %s\n") for warning in warnings])
       
  2610                     message_text += _("Can't generate program to file %s!")%filepath
       
  2611                     header, icon = _("Error"), wx.ICON_ERROR
       
  2612                 else:
       
  2613                     message_text += _("Program was successfully generated!")
       
  2614             else:
       
  2615                 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath)
       
  2616                 header, icon = _("Error"), wx.ICON_ERROR
       
  2617             message = wx.MessageDialog(self, message_text, header, wx.OK|icon)
       
  2618             message.ShowModal()
       
  2619             message.Destroy()
       
  2620         dialog.Destroy()
       
  2621         event.Skip()
       
  2622 
       
  2623     def SaveProject(self):
       
  2624         result = self.Controler.SaveXMLFile()
       
  2625         if not result:
       
  2626             self.SaveProjectAs()
       
  2627         else:
       
  2628             self.RefreshTitle()
       
  2629     
       
  2630     def SaveProjectAs(self):
       
  2631         filepath = self.Controler.GetFilePath()
       
  2632         if filepath != "":
       
  2633             directory, filename = os.path.split(filepath)
       
  2634         else:
       
  2635             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties()
       
  2636         dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT)
       
  2637         if dialog.ShowModal() == wx.ID_OK:
       
  2638             filepath = dialog.GetPath()
       
  2639             if os.path.isdir(os.path.dirname(filepath)):
       
  2640                 result = self.Controler.SaveXMLFile(filepath)
       
  2641                 if not result:
       
  2642                     self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
       
  2643             else:
       
  2644                 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
       
  2645             self.RefreshTitle()
       
  2646         dialog.Destroy()
  2670 
  2647 
  2671 #-------------------------------------------------------------------------------
  2648 #-------------------------------------------------------------------------------
  2672 #                            Create Project Dialog
  2649 #                            Create Project Dialog
  2673 #-------------------------------------------------------------------------------
  2650 #-------------------------------------------------------------------------------
  2674 
  2651 
  3781               name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0),
  3758               name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0),
  3782               size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL)
  3759               size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL)
  3783         
  3760         
  3784         self._init_sizers()
  3761         self._init_sizers()
  3785     
  3762     
  3786     def __init__(self, parent, window, controler):
  3763     def __init__(self, parent, window):
  3787         self._init_ctrls(parent)
  3764         self._init_ctrls(parent)
  3788         
  3765         
  3789         self.ParentWindow = window
  3766         self.ParentWindow = window
  3790         self.Controler = controler
       
  3791         
  3767         
  3792         self.VariablePanelList = {}
  3768         self.VariablePanelList = {}
  3793         self.CurrentPanel = None
  3769         self.CurrentPanel = None
  3794         
  3770         
  3795     def AddVariablePanel(self, tagname, element_type):
  3771     def AddVariablePanel(self, tagname, element_type):
  3796         new_panel = VariablePanel(self, self.ParentWindow, self.Controler, element_type)
  3772         new_panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
  3797         new_panel.SetTagName(tagname)
  3773         new_panel.SetTagName(tagname)
  3798         new_panel.Hide()
  3774         new_panel.Hide()
  3799         new_panel.RefreshView()
  3775         new_panel.RefreshView()
  3800         self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
  3776         self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
  3801         self.VariablePanelList[tagname] = new_panel
  3777         self.VariablePanelList[tagname] = new_panel
  3976 
  3952 
  3977         Otherwise default to the default renderer.
  3953         Otherwise default to the default renderer.
  3978         """
  3954         """
  3979         
  3955         
  3980         for row in range(self.GetNumberRows()):
  3956         for row in range(self.GetNumberRows()):
       
  3957             grid.SetRowMinimalHeight(row, 28)
       
  3958             grid.AutoSizeRow(row, False)
  3981             for col in range(self.GetNumberCols()):
  3959             for col in range(self.GetNumberCols()):
  3982                 editor = None
  3960                 editor = None
  3983                 renderer = None
  3961                 renderer = None
  3984                 colname = self.GetColLabelValue(col, False)
  3962                 colname = self.GetColLabelValue(col, False)
  3985                 if col != 0 and self.GetValueByName(row, "Edit"):
  3963                 if col != 0 and self.GetValueByName(row, "Edit"):
  4333     
  4311     
  4334     def SetTagName(self, tagname):
  4312     def SetTagName(self, tagname):
  4335         self.TagName = tagname
  4313         self.TagName = tagname
  4336     
  4314     
  4337     def IsFunctionBlockType(self, name):
  4315     def IsFunctionBlockType(self, name):
  4338         bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
  4316         bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
  4339         pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
  4317         pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
  4340         if poutype != "function" and bodytype in ["ST", "IL"]:
  4318         if poutype != "function" and bodytype in ["ST", "IL"]:
  4341             return False
  4319             return False
  4342         else:
  4320         else:
  4343             return name in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug)
  4321             return name in self.Controler.GetFunctionBlockTypes(self.TagName)
  4344     
  4322     
  4345     def RefreshView(self):
  4323     def RefreshView(self):
  4346         self.PouNames = self.Controler.GetProjectPouNames(self.ParentWindow.Debug)
  4324         self.PouNames = self.Controler.GetProjectPouNames()
  4347         
  4325         
  4348         words = self.TagName.split("::")
  4326         words = self.TagName.split("::")
  4349         if self.ElementType == "config":
  4327         if self.ElementType == "config":
  4350             self.PouIsUsed = False
  4328             self.PouIsUsed = False
  4351             returnType = None
  4329             returnType = None
  4352             self.Values = self.Controler.GetConfigurationGlobalVars(words[1], self.ParentWindow.Debug)
  4330             self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
  4353         elif self.ElementType == "resource":
  4331         elif self.ElementType == "resource":
  4354             self.PouIsUsed = False
  4332             self.PouIsUsed = False
  4355             returnType = None
  4333             returnType = None
  4356             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2], self.ParentWindow.Debug)
  4334             self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
  4357         else:
  4335         else:
  4358             self.PouIsUsed = self.Controler.PouIsUsed(words[1], self.ParentWindow.Debug)
  4336             self.PouIsUsed = self.Controler.PouIsUsed(words[1])
  4359             returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.ParentWindow.Debug)
  4337             returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  4360             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.ParentWindow.Debug)
  4338             self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  4361         
  4339         
  4362         if returnType and self.ReturnType.IsEnabled():
  4340         if returnType and self.ReturnType.IsEnabled():
  4363             self.ReturnType.SetStringSelection(returnType)
  4341             self.ReturnType.SetStringSelection(returnType)
  4364         
  4342         
  4365         self.RefreshValues()
  4343         self.RefreshValues()
  4368     def OnReturnTypeChanged(self, event):
  4346     def OnReturnTypeChanged(self, event):
  4369         words = self.TagName.split("::")
  4347         words = self.TagName.split("::")
  4370         self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  4348         self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  4371         self.Controler.BufferProject()
  4349         self.Controler.BufferProject()
  4372         self.ParentWindow.RefreshEditor(variablepanel = False)
  4350         self.ParentWindow.RefreshEditor(variablepanel = False)
  4373         self.ParentWindow.RefreshTitle()
  4351         self.ParentWindow._Refresh(TITLE, EDITMENU, INSTANCESTREE, LIBRARYTREE)
  4374         self.ParentWindow.RefreshEditMenu()
       
  4375         self.ParentWindow.RefreshInstancesTree()
       
  4376         self.ParentWindow.RefreshLibraryTree()
       
  4377         event.Skip()
  4352         event.Skip()
  4378     
  4353     
  4379     def OnClassFilter(self, event):
  4354     def OnClassFilter(self, event):
  4380         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  4355         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
  4381         self.RefreshTypeList()
  4356         self.RefreshTypeList()
  4443         self.RefreshButtons()
  4418         self.RefreshButtons()
  4444         event.Skip()
  4419         event.Skip()
  4445 
  4420 
  4446     def OnVariablesGridCellChange(self, event):
  4421     def OnVariablesGridCellChange(self, event):
  4447         row, col = event.GetRow(), event.GetCol()
  4422         row, col = event.GetRow(), event.GetCol()
  4448         colname = self.Table.GetColLabelValue(col)
  4423         colname = self.Table.GetColLabelValue(col, False)
  4449         value = self.Table.GetValue(row, col)
  4424         value = self.Table.GetValue(row, col)
  4450         if colname == "Name" and value != "":
  4425         if colname == "Name" and value != "":
  4451             if not TestIdentifier(value):
  4426             if not TestIdentifier(value):
  4452                 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4427                 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4453                 message.ShowModal()
  4428                 message.ShowModal()
  4473                 old_value = self.Table.GetOldValue()
  4448                 old_value = self.Table.GetOldValue()
  4474                 if old_value != "":
  4449                 if old_value != "":
  4475                     self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
  4450                     self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
  4476                 self.Controler.BufferProject()
  4451                 self.Controler.BufferProject()
  4477                 self.ParentWindow.RefreshEditor(variablepanel = False)
  4452                 self.ParentWindow.RefreshEditor(variablepanel = False)
  4478                 self.ParentWindow.RefreshTitle()
  4453                 self.ParentWindow._Refresh(TITLE, EDITMENU, INSTANCESTREE, LIBRARYTREE)
  4479                 self.ParentWindow.RefreshEditMenu()
       
  4480                 self.ParentWindow.RefreshInstancesTree()
       
  4481                 self.ParentWindow.RefreshLibraryTree()
       
  4482                 event.Skip()
  4454                 event.Skip()
  4483         else:
  4455         else:
  4484             self.SaveValues()
  4456             self.SaveValues()
  4485             if colname == "Class":
  4457             if colname == "Class":
  4486                 self.Table.ResetView(self.VariablesGrid)
  4458                 self.Table.ResetView(self.VariablesGrid)
  4496                 new_id = wx.NewId()
  4468                 new_id = wx.NewId()
  4497                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  4469                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  4498                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  4470                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  4499             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
  4471             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
  4500             datatype_menu = wx.Menu(title='')
  4472             datatype_menu = wx.Menu(title='')
  4501             for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.ParentWindow.Debug):
  4473             for datatype in self.Controler.GetDataTypes(basetypes = False):
  4502                 new_id = wx.NewId()
  4474                 new_id = wx.NewId()
  4503                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  4475                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  4504                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  4476                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  4505             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
  4477             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
  4506             functionblock_menu = wx.Menu(title='')
  4478             functionblock_menu = wx.Menu(title='')
  4507             bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
  4479             bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
  4508             pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
  4480             pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
  4509             if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
  4481             if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
  4510                 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug):
  4482                 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
  4511                     new_id = wx.NewId()
  4483                     new_id = wx.NewId()
  4512                     AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  4484                     AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  4513                     self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  4485                     self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  4514                 type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
  4486                 type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
  4515             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
  4487             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
  4524             self.Table.SetValueByName(row, "Type", base_type)
  4496             self.Table.SetValueByName(row, "Type", base_type)
  4525             self.Table.ResetView(self.VariablesGrid)
  4497             self.Table.ResetView(self.VariablesGrid)
  4526             self.SaveValues(False)
  4498             self.SaveValues(False)
  4527             self.ParentWindow.RefreshEditor(variablepanel = False)
  4499             self.ParentWindow.RefreshEditor(variablepanel = False)
  4528             self.Controler.BufferProject()
  4500             self.Controler.BufferProject()
  4529             self.ParentWindow.RefreshTitle()
  4501             self.ParentWindow._Refresh(TITLE, EDITMENU, INSTANCESTREE, LIBRARYTREE)
  4530             self.ParentWindow.RefreshEditMenu()
       
  4531             self.ParentWindow.RefreshInstancesTree()
       
  4532             self.ParentWindow.RefreshLibraryTree()
       
  4533             event.Skip()
  4502             event.Skip()
  4534         return VariableTypeFunction
  4503         return VariableTypeFunction
  4535     
  4504     
  4536     def OnVariablesGridCellLeftClick(self, event):
  4505     def OnVariablesGridCellLeftClick(self, event):
  4537         row = event.GetRow()
  4506         row = event.GetRow()
  4594             if self.ReturnType.IsEnabled():
  4563             if self.ReturnType.IsEnabled():
  4595                 self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  4564                 self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
  4596             self.Controler.SetPouInterfaceVars(words[1], self.Values)
  4565             self.Controler.SetPouInterfaceVars(words[1], self.Values)
  4597         if buffer:
  4566         if buffer:
  4598             self.Controler.BufferProject()
  4567             self.Controler.BufferProject()
  4599             self.ParentWindow.RefreshTitle()
  4568             self.ParentWindow._Refresh(TITLE, EDITMENU, INSTANCESTREE, LIBRARYTREE)
  4600             self.ParentWindow.RefreshEditMenu()
       
  4601             self.ParentWindow.RefreshInstancesTree()
       
  4602             self.ParentWindow.RefreshLibraryTree()
       
  4603 
  4569 
  4604     def AddVariableError(self, infos):
  4570     def AddVariableError(self, infos):
  4605         if isinstance(infos[0], TupleType):
  4571         if isinstance(infos[0], TupleType):
  4606             for i in xrange(*infos[0]):
  4572             for i in xrange(*infos[0]):
  4607                 self.Table.AddError((i,) + infos[1:])
  4573                 self.Table.AddError((i,) + infos[1:])
  4867               size=wx.Size(32, 32), style=0)
  4833               size=wx.Size(32, 32), style=0)
  4868         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON)
  4834         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON)
  4869         
  4835         
  4870         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'),
  4836         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'),
  4871               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4837               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4872               size=wx.Size(72, 32), style=0)
  4838               size=wx.DefaultSize, style=0)
  4873         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON)
  4839         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON)
  4874         
  4840         
  4875         self._init_sizers()
  4841         self._init_sizers()
  4876     
  4842     
  4877     def __init__(self, parent, controler):
  4843     def __init__(self, parent, controler):
  4897             self.HasNewData = False
  4863             self.HasNewData = False
  4898             self.RefreshGrid()
  4864             self.RefreshGrid()
  4899         DebugViewer.RefreshNewData(self)
  4865         DebugViewer.RefreshNewData(self)
  4900     
  4866     
  4901     def RefreshGrid(self):
  4867     def RefreshGrid(self):
       
  4868         self.Freeze()
       
  4869         self.Table.ResetView(self.VariablesGrid)
       
  4870         self.Thaw()
       
  4871     
       
  4872     def ResetGrid(self):
       
  4873         self.DeleteDataConsumers()
       
  4874         self.Table.Empty()
  4902         self.Freeze()
  4875         self.Freeze()
  4903         self.Table.ResetView(self.VariablesGrid)
  4876         self.Table.ResetView(self.VariablesGrid)
  4904         self.Thaw()
  4877         self.Thaw()
  4905     
  4878     
  4906     def OnDeleteButton(self, event):
  4879     def OnDeleteButton(self, event):