Beremiz.py
changeset 738 413946c04c87
parent 737 7b421e080636
child 739 90dcb47a99ed
equal deleted inserted replaced
737:7b421e080636 738:413946c04c87
   154 import wx.lib.buttons, wx.lib.statbmp
   154 import wx.lib.buttons, wx.lib.statbmp
   155 from util.TextCtrlAutoComplete import TextCtrlAutoComplete
   155 from util.TextCtrlAutoComplete import TextCtrlAutoComplete
   156 import cPickle
   156 import cPickle
   157 from util.BrowseValuesLibraryDialog import BrowseValuesLibraryDialog
   157 from util.BrowseValuesLibraryDialog import BrowseValuesLibraryDialog
   158 import types, time, re, platform, time, traceback, commands
   158 import types, time, re, platform, time, traceback, commands
   159 from ProjectController import ProjectController, MATIEC_ERROR_MODEL
   159 from ProjectController import ProjectController, MATIEC_ERROR_MODEL, ITEM_CONFNODE
   160 from util.MiniTextControler import MiniTextControler
   160 from util.MiniTextControler import MiniTextControler
   161 from util.ProcessLogger import ProcessLogger
   161 from util.ProcessLogger import ProcessLogger
   162 
   162 
   163 from docutil import OpenHtmlFrame
   163 from docutil import OpenHtmlFrame
   164 from PLCOpenEditor import IDEFrame, AppendMenu, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES 
   164 from PLCOpenEditor import IDEFrame, AppendMenu, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES 
   165 from PLCOpenEditor import EditorPanel, Viewer, TextViewer, GraphicViewer, ResourceEditor, ConfigurationEditor, DataTypeEditor
   165 from PLCOpenEditor import EditorPanel, Viewer, TextViewer, GraphicViewer, ResourceEditor, ConfigurationEditor, DataTypeEditor
   166 from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
   166 from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY, ITEM_PROJECT, ITEM_RESOURCE
   167 
   167 
   168 SCROLLBAR_UNIT = 10
   168 SCROLLBAR_UNIT = 10
   169 WINDOW_COLOUR = wx.Colour(240,240,240)
   169 WINDOW_COLOUR = wx.Colour(240,240,240)
   170 TITLE_COLOUR = wx.Colour(200,200,220)
   170 TITLE_COLOUR = wx.Colour(200,200,220)
   171 CHANGED_TITLE_COLOUR = wx.Colour(220,200,220)
   171 CHANGED_TITLE_COLOUR = wx.Colour(220,200,220)
   450                                (wx.ID_OPEN, "open.png", _(u'Open'), None),
   450                                (wx.ID_OPEN, "open.png", _(u'Open'), None),
   451                                (wx.ID_SAVE, "save.png", _(u'Save'), None),
   451                                (wx.ID_SAVE, "save.png", _(u'Save'), None),
   452                                (wx.ID_SAVEAS, "saveas.png", _(u'Save As...'), None),
   452                                (wx.ID_SAVEAS, "saveas.png", _(u'Save As...'), None),
   453                                (wx.ID_PRINT, "print.png", _(u'Print'), None)])
   453                                (wx.ID_PRINT, "print.png", _(u'Print'), None)])
   454     
   454     
       
   455     def _init_coll_AddMenu_Items(self, parent):
       
   456         IDEFrame._init_coll_AddMenu_Items(self, parent, False)
       
   457         new_id = wx.NewId()
       
   458         AppendMenu(parent, help='', id=new_id,
       
   459                   kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
       
   460         for name, XSDClass, help in ProjectController.CTNChildrenTypes:
       
   461             new_id = wx.NewId()
       
   462             AppendMenu(parent, help='', id=new_id, 
       
   463                        kind=wx.ITEM_NORMAL, text=help)
       
   464             self.Bind(wx.EVT_MENU, self._GetAddConfNodeFunction(name), id=new_id)
       
   465     
   455     def _init_coll_HelpMenu_Items(self, parent):
   466     def _init_coll_HelpMenu_Items(self, parent):
   456         parent.Append(help='', id=wx.ID_ABOUT,
   467         parent.Append(help='', id=wx.ID_ABOUT,
   457               kind=wx.ITEM_NORMAL, text=_(u'About'))
   468               kind=wx.ITEM_NORMAL, text=_(u'About'))
   458         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
   469         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
   459     
   470     
   493                                 ("Build",    wx.WXK_F11)]:
   504                                 ("Build",    wx.WXK_F11)]:
   494             def OnMethodGen(obj,meth):
   505             def OnMethodGen(obj,meth):
   495                 def OnMethod(evt):
   506                 def OnMethod(evt):
   496                     if obj.CTR is not None:
   507                     if obj.CTR is not None:
   497                        obj.CTR.CallMethod('_'+meth)
   508                        obj.CTR.CallMethod('_'+meth)
   498                     wx.CallAfter(self.RefreshAll)
   509                     wx.CallAfter(self.RefreshStatusToolBar)
   499                 return OnMethod
   510                 return OnMethod
   500             newid = wx.NewId()
   511             newid = wx.NewId()
   501             self.Bind(wx.EVT_MENU, OnMethodGen(self,method), id=newid)
   512             self.Bind(wx.EVT_MENU, OnMethodGen(self,method), id=newid)
   502             accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut,newid)]
   513             accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut,newid)]
   503         
   514         
   508               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER|wx.HSCROLL|wx.VSCROLL)
   519               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER|wx.HSCROLL|wx.VSCROLL)
   509         self.PLCConfig.SetBackgroundColour(wx.WHITE)
   520         self.PLCConfig.SetBackgroundColour(wx.WHITE)
   510         self.PLCConfig.Bind(wx.EVT_LEFT_DOWN, self.OnPanelLeftDown)
   521         self.PLCConfig.Bind(wx.EVT_LEFT_DOWN, self.OnPanelLeftDown)
   511         self.PLCConfig.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   522         self.PLCConfig.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   512         self.PLCConfig.Bind(wx.EVT_MOUSEWHEEL, self.OnPLCConfigScroll)
   523         self.PLCConfig.Bind(wx.EVT_MOUSEWHEEL, self.OnPLCConfigScroll)
   513         self.MainTabs["PLCConfig"] = (self.PLCConfig, _("Topology"))
   524         #self.MainTabs["PLCConfig"] = (self.PLCConfig, _("Topology"))
   514         self.BottomNoteBook.InsertPage(0, self.PLCConfig, _("Topology"), True)
   525         #self.BottomNoteBook.InsertPage(0, self.PLCConfig, _("Topology"), True)
   515         
   526         
   516         self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='',
   527         self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='',
   517                   name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0),
   528                   name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0),
   518                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   529                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   519         self.LogConsole.Bind(wx.EVT_LEFT_DCLICK, self.OnLogConsoleDClick)
   530         self.LogConsole.Bind(wx.EVT_LEFT_DCLICK, self.OnLogConsoleDClick)
   520         self.MainTabs["LogConsole"] = (self.LogConsole, _("Log Console"))
   531         self.MainTabs["LogConsole"] = (self.LogConsole, _("Log Console"))
   521         self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"])
   532         self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"])
   522         self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT)
   533         self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT)
       
   534 
       
   535         StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
       
   536                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
       
   537         StatusToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   538         StatusToolBar.Realize()
       
   539         self.Panes["StatusToolBar"] = StatusToolBar
       
   540         self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo().
       
   541                   Name("StatusToolBar").Caption(_("Status ToolBar")).
       
   542                   ToolbarPane().Top().Position(2).
       
   543                   LeftDockable(False).RightDockable(False))
   523         
   544         
   524         self._init_beremiz_sizers()
   545         self._init_beremiz_sizers()
   525 
   546 
       
   547         self.AUIManager.Update()
       
   548         
   526     def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True):
   549     def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True):
   527         IDEFrame.__init__(self, parent, debug)
   550         IDEFrame.__init__(self, parent, debug)
   528         self.Log = LogPseudoFile(self.LogConsole,self.RiseLogConsole)
   551         self.Log = LogPseudoFile(self.LogConsole,self.RiseLogConsole)
   529         
   552         
   530         self.local_runtime = None
   553         self.local_runtime = None
   551             ("VAR_INPUT",     LOCATION_VAR_INPUT),
   574             ("VAR_INPUT",     LOCATION_VAR_INPUT),
   552             ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
   575             ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
   553             ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
   576             ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
   554             self.LocationImageDict[itemtype]=self.LocationImageList.Add(wx.Bitmap(os.path.join(base_folder, "plcopeneditor", 'Images', '%s.png'%imgname)))
   577             self.LocationImageDict[itemtype]=self.LocationImageList.Add(wx.Bitmap(os.path.join(base_folder, "plcopeneditor", 'Images', '%s.png'%imgname)))
   555         
   578         
       
   579         # Icons for other items
       
   580         for imgname, itemtype in [
       
   581             ("Extension", ITEM_CONFNODE)]:
       
   582             self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'images', '%s.png'%imgname)))
       
   583         
   556         # Add beremiz's icon in top left corner of the frame
   584         # Add beremiz's icon in top left corner of the frame
   557         self.SetIcon(wx.Icon(Bpath( "images", "brz.ico"), wx.BITMAP_TYPE_ICO))
   585         self.SetIcon(wx.Icon(Bpath( "images", "brz.ico"), wx.BITMAP_TYPE_ICO))
   558         
   586         
   559         if projectOpen is None and self.Config.HasEntry("currenteditedproject"):
   587         if projectOpen is None and self.Config.HasEntry("currenteditedproject"):
   560             projectOpen = str(self.Config.Read("currenteditedproject"))
   588             projectOpen = str(self.Config.Read("currenteditedproject"))
   565             self.CTR = ProjectController(self, self.Log)
   593             self.CTR = ProjectController(self, self.Log)
   566             self.Controler = self.CTR
   594             self.Controler = self.CTR
   567             result = self.CTR.LoadProject(projectOpen, buildpath)
   595             result = self.CTR.LoadProject(projectOpen, buildpath)
   568             if not result:
   596             if not result:
   569                 self.LibraryPanel.SetControler(self.Controler)
   597                 self.LibraryPanel.SetControler(self.Controler)
       
   598                 self.ProjectTree.Enable(True)
   570                 self.PouInstanceVariablesPanel.SetController(self.Controler)
   599                 self.PouInstanceVariablesPanel.SetController(self.Controler)
   571                 self.RefreshConfigRecentProjects(os.path.abspath(projectOpen))
   600                 self.RefreshConfigRecentProjects(os.path.abspath(projectOpen))
   572                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
   601                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
   573                 self.RefreshAll()
   602                 self.RefreshStatusToolBar()
   574             else:
   603             else:
   575                 self.ResetView()
   604                 self.ResetView()
   576                 self.ShowErrorMessage(result)
   605                 self.ShowErrorMessage(result)
   577         else:
   606         else:
   578             self.CTR = ctr
   607             self.CTR = ctr
   579             self.Controler = ctr
   608             self.Controler = ctr
   580             if ctr is not None:
   609             if ctr is not None:
   581                 self.LibraryPanel.SetControler(self.Controler)
   610                 self.LibraryPanel.SetControler(self.Controler)
       
   611                 self.ProjectTree.Enable(True)
   582                 self.PouInstanceVariablesPanel.SetController(self.Controler)
   612                 self.PouInstanceVariablesPanel.SetController(self.Controler)
   583                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
   613                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
   584                 self.RefreshAll()
   614                 self.RefreshStatusToolBar()
   585         if self.EnableDebug:
   615         if self.EnableDebug:
   586             self.DebugVariablePanel.SetDataProducer(self.CTR)
   616             self.DebugVariablePanel.SetDataProducer(self.CTR)
   587         
   617         
   588         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   618         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   589         
   619         
   590         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   620         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   591         self.RefreshConfNodeMenu()
   621         self.RefreshConfNodeMenu()
       
   622         self.RefreshStatusToolBar()
   592         self.LogConsole.SetFocus()
   623         self.LogConsole.SetFocus()
   593 
   624 
   594     def RiseLogConsole(self):
   625     def RiseLogConsole(self):
   595         self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.LogConsole))
   626         self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.LogConsole))
   596         
   627         
   821                 text, id, help, callback = infos
   852                 text, id, help, callback = infos
   822                 AppendMenu(menu, help='', id=id, kind=kind, text=text)
   853                 AppendMenu(menu, help='', id=id, kind=kind, text=text)
   823                 if callback is not None:
   854                 if callback is not None:
   824                     self.Bind(wx.EVT_MENU, callback, id=id)
   855                     self.Bind(wx.EVT_MENU, callback, id=id)
   825     
   856     
       
   857     def RefreshStatusToolBar(self):
       
   858         StatusToolBar = self.Panes["StatusToolBar"]
       
   859         StatusToolBar.ClearTools()
       
   860         
       
   861         if self.CTR is not None:
       
   862             
       
   863             for confnode_method in self.CTR.StatusMethods:
       
   864                 if "method" in confnode_method and confnode_method.get("shown",True):
       
   865                     id = wx.NewId()
       
   866                     StatusToolBar.AddSimpleTool(id, 
       
   867                         wx.Bitmap(Bpath("images", "%s.png"%confnode_method.get("bitmap", "Unknown"))), 
       
   868                         confnode_method["tooltip"])
       
   869                     self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id)
       
   870             
       
   871             StatusToolBar.Realize()
       
   872             self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show()
       
   873         else:
       
   874             self.AUIManager.GetPane("StatusToolBar").Hide()
       
   875         self.AUIManager.Update()
       
   876     
   826     def RefreshConfNodeMenu(self):
   877     def RefreshConfNodeMenu(self):
   827         if self.CTR is not None:
   878         if self.CTR is not None:
   828             selected = self.TabsOpened.GetSelection()
   879             selected = self.TabsOpened.GetSelection()
   829             if selected >= 0:
   880             if selected >= 0:
   830                 panel = self.TabsOpened.GetPage(selected)
   881                 panel = self.TabsOpened.GetPage(selected)
  1418         def OnConfNodeTreeItemChannelChanged(event):
  1469         def OnConfNodeTreeItemChannelChanged(event):
  1419             res = self.SetConfNodeParamsAttribute(confnode, "BaseParams.IEC_Channel", value)
  1470             res = self.SetConfNodeParamsAttribute(confnode, "BaseParams.IEC_Channel", value)
  1420             event.Skip()
  1471             event.Skip()
  1421         return OnConfNodeTreeItemChannelChanged
  1472         return OnConfNodeTreeItemChannelChanged
  1422     
  1473     
  1423     def _GetAddConfNodeFunction(self, name, confnode):
  1474     def _GetAddConfNodeFunction(self, name, confnode=None):
  1424         def OnConfNodeMenu(event):
  1475         def OnConfNodeMenu(event):
  1425             wx.CallAfter(self.AddConfNode, name, confnode)
  1476             wx.CallAfter(self.AddConfNode, name, confnode)
  1426         return OnConfNodeMenu
  1477         return OnConfNodeMenu
  1427     
  1478     
  1428     def Gen_AddConfNodeMenu(self, confnode):
  1479     def Gen_AddConfNodeMenu(self, confnode):
  1434                     main_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=_("Append ")+help)
  1485                     main_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=_("Append ")+help)
  1435                     self.Bind(wx.EVT_MENU, self._GetAddConfNodeFunction(name, confnode), id=new_id)
  1486                     self.Bind(wx.EVT_MENU, self._GetAddConfNodeFunction(name, confnode), id=new_id)
  1436             self.PopupMenuXY(main_menu)
  1487             self.PopupMenuXY(main_menu)
  1437             main_menu.Destroy()
  1488             main_menu.Destroy()
  1438         return AddConfNodeMenu
  1489         return AddConfNodeMenu
       
  1490     
       
  1491     def GetMenuCallBackFunction(self, method):
       
  1492         """ Generate the callbackfunc for a given CTR method"""
       
  1493         def OnMenu(event):
       
  1494             # Disable button to prevent re-entrant call 
       
  1495             event.GetEventObject().Disable()
       
  1496             # Call
       
  1497             getattr(self.CTR, method)()
       
  1498             # Re-enable button 
       
  1499             event.GetEventObject().Enable()
       
  1500             # Trigger refresh on Idle
       
  1501             wx.CallAfter(self.RefreshStatusToolBar)
       
  1502         return OnMenu
  1439     
  1503     
  1440     def GetButtonCallBackFunction(self, confnode, method):
  1504     def GetButtonCallBackFunction(self, confnode, method):
  1441         """ Generate the callbackfunc for a given confnode method"""
  1505         """ Generate the callbackfunc for a given confnode method"""
  1442         def OnButtonClick(event):
  1506         def OnButtonClick(event):
  1443             # Disable button to prevent re-entrant call 
  1507             # Disable button to prevent re-entrant call 
  1654                         if element_infos["value"] is not None:
  1718                         if element_infos["value"] is not None:
  1655                             textctrl.ChangeValue(str(element_infos["value"]))
  1719                             textctrl.ChangeValue(str(element_infos["value"]))
  1656                         textctrl.Bind(wx.EVT_TEXT, self.GetTextCtrlCallBackFunction(textctrl, confnode, element_path))
  1720                         textctrl.Bind(wx.EVT_TEXT, self.GetTextCtrlCallBackFunction(textctrl, confnode, element_path))
  1657             first = False
  1721             first = False
  1658     
  1722     
       
  1723     def GetConfigEntry(self, entry_name, default):
       
  1724         return cPickle.loads(str(self.Config.Read(entry_name, cPickle.dumps(default))))
       
  1725     
  1659     def ResetView(self):
  1726     def ResetView(self):
  1660         IDEFrame.ResetView(self)
  1727         IDEFrame.ResetView(self)
  1661         self.ConfNodeInfos = {}
  1728         self.ConfNodeInfos = {}
  1662         if self.CTR is not None:
  1729         if self.CTR is not None:
  1663             self.CTR.CloseProject()
  1730             self.CTR.CloseProject()
  1693             result = ctr.NewProject(projectpath)
  1760             result = ctr.NewProject(projectpath)
  1694             if not result:
  1761             if not result:
  1695                 self.CTR = ctr
  1762                 self.CTR = ctr
  1696                 self.Controler = self.CTR
  1763                 self.Controler = self.CTR
  1697                 self.LibraryPanel.SetControler(self.Controler)
  1764                 self.LibraryPanel.SetControler(self.Controler)
       
  1765                 self.ProjectTree.Enable(True)
  1698                 self.PouInstanceVariablesPanel.SetController(self.Controler)
  1766                 self.PouInstanceVariablesPanel.SetController(self.Controler)
  1699                 self.RefreshConfigRecentProjects(projectpath)
  1767                 self.RefreshConfigRecentProjects(projectpath)
  1700                 if self.EnableDebug:
  1768                 if self.EnableDebug:
  1701                     self.DebugVariablePanel.SetDataProducer(self.CTR)
  1769                     self.DebugVariablePanel.SetDataProducer(self.CTR)
  1702                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1770                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1703                 self.RefreshAll()
  1771                 self.RefreshStatusToolBar()
  1704             else:
  1772             else:
  1705                 self.ResetView()
  1773                 self.ResetView()
  1706                 self.ShowErrorMessage(result)
  1774                 self.ShowErrorMessage(result)
  1707             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  1775             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  1708         dialog.Destroy()
  1776         dialog.Destroy()
  1729             self.CTR = ProjectController(self, self.Log)
  1797             self.CTR = ProjectController(self, self.Log)
  1730             self.Controler = self.CTR
  1798             self.Controler = self.CTR
  1731             result = self.CTR.LoadProject(projectpath)
  1799             result = self.CTR.LoadProject(projectpath)
  1732             if not result:
  1800             if not result:
  1733                 self.LibraryPanel.SetControler(self.Controler)
  1801                 self.LibraryPanel.SetControler(self.Controler)
       
  1802                 self.ProjectTree.Enable(True)
  1734                 self.PouInstanceVariablesPanel.SetController(self.Controler)
  1803                 self.PouInstanceVariablesPanel.SetController(self.Controler)
  1735                 self.RefreshConfigRecentProjects(projectpath)
  1804                 self.RefreshConfigRecentProjects(projectpath)
  1736                 if self.EnableDebug:
  1805                 if self.EnableDebug:
  1737                     self.DebugVariablePanel.SetDataProducer(self.CTR)
  1806                     self.DebugVariablePanel.SetDataProducer(self.CTR)
  1738                 self.LoadProjectOrganization()
  1807                 self.LoadProjectOrganization()
  1739                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1808                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1740                 self.RefreshAll()
  1809                 self.RefreshStatusToolBar()
  1741             else:
  1810             else:
  1742                 self.ResetView()
  1811                 self.ResetView()
  1743                 self.ShowErrorMessage(result)
  1812                 self.ShowErrorMessage(result)
  1744         else:
  1813         else:
  1745             self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath)
  1814             self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath)
  1750             return
  1819             return
  1751         
  1820         
  1752         self.SaveProjectOrganization()
  1821         self.SaveProjectOrganization()
  1753         self.ResetView()
  1822         self.ResetView()
  1754         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  1823         self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
  1755         self.RefreshAll()
  1824         self.RefreshStatusToolBar()
  1756     
  1825     
  1757     def OnSaveProjectMenu(self, event):
  1826     def OnSaveProjectMenu(self, event):
  1758         if self.CTR is not None:
  1827         if self.CTR is not None:
  1759             self.CTR.SaveProject()
  1828             self.CTR.SaveProject()
  1760             self.RefreshAll()
       
  1761             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
  1829             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
  1762     
  1830     
  1763     def OnSaveProjectAsMenu(self, event):
  1831     def OnSaveProjectAsMenu(self, event):
  1764         if self.CTR is not None:
  1832         if self.CTR is not None:
  1765             self.CTR.SaveProjectAs()
  1833             self.CTR.SaveProjectAs()
  1766             self.RefreshAll()
       
  1767             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
  1834             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
  1768         event.Skip()
  1835         event.Skip()
  1769     
  1836     
  1770     def OnPropertiesMenu(self, event):
  1837     def OnPropertiesMenu(self, event):
  1771         self.ShowProperties()
  1838         self.ShowProperties()
  1782     
  1849     
  1783     def OnPageClose(self, event):
  1850     def OnPageClose(self, event):
  1784         wx.CallAfter(self.RefreshConfNodeMenu)
  1851         wx.CallAfter(self.RefreshConfNodeMenu)
  1785         IDEFrame.OnPageClose(self, event)
  1852         IDEFrame.OnPageClose(self, event)
  1786     
  1853     
       
  1854     def OnProjectTreeItemBeginEdit(self, event):
       
  1855         selected = event.GetItem()
       
  1856         if self.ProjectTree.GetPyData(selected)["type"] in ITEM_CONFNODE:
       
  1857             event.Veto()
       
  1858         else:
       
  1859             IDEFrame.OnProjectTreeItemBeginEdit(self, event)
       
  1860     
       
  1861     def OnProjectTreeRightUp(self, event):
       
  1862         if wx.Platform == '__WXMSW__':
       
  1863             item = event.GetItem()
       
  1864         else:
       
  1865             item, flags = self.ProjectTree.HitTest(wx.Point(event.GetX(), event.GetY()))
       
  1866         item_infos = self.ProjectTree.GetPyData(item)
       
  1867         
       
  1868         if item_infos["type"] == ITEM_CONFNODE:
       
  1869             confnode_menu = wx.Menu(title='')
       
  1870             
       
  1871             confnode = item_infos["confnode"]
       
  1872             if confnode is not None and len(confnode.CTNChildrenTypes) > 0:
       
  1873                 for name, XSDClass, help in confnode.CTNChildrenTypes:
       
  1874                     new_id = wx.NewId()
       
  1875                     confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=name)
       
  1876                     self.Bind(wx.EVT_MENU, self._GetAddConfNodeFunction(name, confnode), id=new_id)
       
  1877 
       
  1878             new_id = wx.NewId()
       
  1879             AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
       
  1880             self.Bind(wx.EVT_MENU, self.GetDeleteButtonFunction(confnode), id=new_id)
       
  1881                 
       
  1882             self.PopupMenu(confnode_menu)
       
  1883             confnode_menu.Destroy()
       
  1884             
       
  1885             event.Skip()
       
  1886         else:
       
  1887             IDEFrame.OnProjectTreeRightUp(self, event)
       
  1888     
       
  1889     def OnProjectTreeItemActivated(self, event):
       
  1890         selected = event.GetItem()
       
  1891         name = self.ProjectTree.GetItemText(selected)
       
  1892         item_infos = self.ProjectTree.GetPyData(selected)
       
  1893         if item_infos["type"] == ITEM_CONFNODE:
       
  1894             item_infos["confnode"]._OpenView()
       
  1895             event.Skip()
       
  1896         elif item_infos["type"] == ITEM_PROJECT:
       
  1897             self.CTR._OpenView()
       
  1898         else:
       
  1899             IDEFrame.OnProjectTreeItemActivated(self, event)
       
  1900     
       
  1901     def SelectProjectTreeItem(self, tagname):
       
  1902         if self.ProjectTree is not None:
       
  1903             root = self.ProjectTree.GetRootItem()
       
  1904             if root.IsOk():
       
  1905                 words = tagname.split("::")
       
  1906                 if len(words) == 1:
       
  1907                     if tagname == "Project":
       
  1908                         self.SelectedItem = root
       
  1909                         self.ProjectTree.SelectItem(root)
       
  1910                         wx.CallAfter(self.ResetSelectedItem)
       
  1911                     else:
       
  1912                         return self.RecursiveProjectTreeItemSelection(root, 
       
  1913                               [(word, ITEM_CONFNODE) for word in tagname.split(".")])
       
  1914                 elif words[0] == "R":
       
  1915                     return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)])
       
  1916                 else:
       
  1917                     IDEFrame.SelectProjectTreeItem(self, tagname)
       
  1918             
  1787     def GetAddButtonFunction(self, confnode, window):
  1919     def GetAddButtonFunction(self, confnode, window):
  1788         def AddButtonFunction(event):
  1920         def AddButtonFunction(event):
  1789             if confnode and len(confnode.CTNChildrenTypes) > 0:
  1921             if confnode and len(confnode.CTNChildrenTypes) > 0:
  1790                 confnode_menu = wx.Menu(title='')
  1922                 confnode_menu = wx.Menu(title='')
  1791                 for name, XSDClass, help in confnode.CTNChildrenTypes:
  1923                 for name, XSDClass, help in confnode.CTNChildrenTypes:
  1801         def DeleteButtonFunction(event):
  1933         def DeleteButtonFunction(event):
  1802             wx.CallAfter(self.DeleteConfNode, confnode)
  1934             wx.CallAfter(self.DeleteConfNode, confnode)
  1803             event.Skip()
  1935             event.Skip()
  1804         return DeleteButtonFunction
  1936         return DeleteButtonFunction
  1805     
  1937     
  1806     def AddConfNode(self, ConfNodeType, confnode):
  1938     def AddConfNode(self, ConfNodeType, confnode=None):
  1807         if self.CTR.CheckProjectPathPerm():
  1939         if self.CTR.CheckProjectPathPerm():
  1808             dialog = wx.TextEntryDialog(self, _("Please enter a name for confnode:"), _("Add ConfNode"), "", wx.OK|wx.CANCEL)
  1940             dialog = wx.TextEntryDialog(self, _("Please enter a name for confnode:"), _("Add ConfNode"), "", wx.OK|wx.CANCEL)
  1809             if dialog.ShowModal() == wx.ID_OK:
  1941             if dialog.ShowModal() == wx.ID_OK:
  1810                 ConfNodeName = dialog.GetValue()
  1942                 ConfNodeName = dialog.GetValue()
  1811                 confnode.CTNAddChild(ConfNodeName, ConfNodeType)
  1943                 if confnode is not None:
       
  1944                     confnode.CTNAddChild(ConfNodeName, ConfNodeType)
       
  1945                 else:
       
  1946                     self.CTR.CTNAddChild(ConfNodeName, ConfNodeType)
  1812                 self.CTR.RefreshConfNodesBlockLists()
  1947                 self.CTR.RefreshConfNodesBlockLists()
  1813                 self._Refresh(TITLE, FILEMENU)
  1948                 self._Refresh(TITLE, FILEMENU, PROJECTTREE)
  1814                 self.RefreshConfNodeTree()
  1949                 self.RefreshConfNodeTree()
  1815             dialog.Destroy()
  1950             dialog.Destroy()
  1816     
  1951     
  1817     def DeleteConfNode(self, confnode):
  1952     def DeleteConfNode(self, confnode):
  1818         if self.CTR.CheckProjectPathPerm():
  1953         if self.CTR.CheckProjectPathPerm():
  1820             if dialog.ShowModal() == wx.ID_YES:
  1955             if dialog.ShowModal() == wx.ID_YES:
  1821                 self.ConfNodeInfos.pop(confnode)
  1956                 self.ConfNodeInfos.pop(confnode)
  1822                 confnode.CTNRemove()
  1957                 confnode.CTNRemove()
  1823                 del confnode
  1958                 del confnode
  1824                 self.CTR.RefreshConfNodesBlockLists()
  1959                 self.CTR.RefreshConfNodesBlockLists()
  1825                 self._Refresh(TITLE, FILEMENU)
  1960                 self._Refresh(TITLE, FILEMENU, PROJECTTREE)
  1826                 self.RefreshConfNodeTree()
  1961                 self.RefreshConfNodeTree()
  1827             dialog.Destroy()
  1962             dialog.Destroy()
  1828     
  1963     
  1829 #-------------------------------------------------------------------------------
  1964 #-------------------------------------------------------------------------------
  1830 #                               Exception Handler
  1965 #                               Exception Handler