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(): |