314 AppendMenu(parent, help='', id=wx.ID_PRINT, |
314 AppendMenu(parent, help='', id=wx.ID_PRINT, |
315 kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P') |
315 kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P') |
316 parent.AppendSeparator() |
316 parent.AppendSeparator() |
317 AppendMenu(parent, help='', id=wx.ID_EXIT, |
317 AppendMenu(parent, help='', id=wx.ID_EXIT, |
318 kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q') |
318 kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q') |
319 |
319 |
320 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
320 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
321 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
321 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
322 self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE) |
322 self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE) |
323 self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS) |
323 self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS) |
324 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
324 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
325 self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL) |
325 self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL) |
326 self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP) |
326 self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP) |
327 self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW) |
327 self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW) |
328 self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT) |
328 self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT) |
329 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT) |
329 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT) |
330 |
330 |
331 self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None), |
331 self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None), |
332 (wx.ID_OPEN, "open", _(u'Open'), None), |
332 (wx.ID_OPEN, "open", _(u'Open'), None), |
333 (wx.ID_SAVE, "save", _(u'Save'), None), |
333 (wx.ID_SAVE, "save", _(u'Save'), None), |
334 (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None), |
334 (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None), |
335 (wx.ID_PRINT, "print", _(u'Print'), None)]) |
335 (wx.ID_PRINT, "print", _(u'Print'), None)]) |
336 |
336 |
337 def _RecursiveAddMenuItems(self, menu, items): |
337 def _RecursiveAddMenuItems(self, menu, items): |
338 for name, text, help, children in items: |
338 for name, text, help, children in items: |
339 new_id = wx.NewId() |
339 new_id = wx.NewId() |
340 if len(children) > 0: |
340 if len(children) > 0: |
341 new_menu = wx.Menu(title='') |
341 new_menu = wx.Menu(title='') |
342 menu.AppendMenu(new_id, text, new_menu) |
342 menu.AppendMenu(new_id, text, new_menu) |
343 self._RecursiveAddMenuItems(new_menu, children) |
343 self._RecursiveAddMenuItems(new_menu, children) |
344 else: |
344 else: |
345 AppendMenu(menu, help=help, id=new_id, |
345 AppendMenu(menu, help=help, id=new_id, |
346 kind=wx.ITEM_NORMAL, text=text) |
346 kind=wx.ITEM_NORMAL, text=text) |
347 self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name), |
347 self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name), |
348 id=new_id) |
348 id=new_id) |
349 |
349 |
350 def _init_coll_AddMenu_Items(self, parent): |
350 def _init_coll_AddMenu_Items(self, parent): |
351 IDEFrame._init_coll_AddMenu_Items(self, parent, False) |
351 IDEFrame._init_coll_AddMenu_Items(self, parent, False) |
352 self._RecursiveAddMenuItems(parent, GetAddMenuItems()) |
352 self._RecursiveAddMenuItems(parent, GetAddMenuItems()) |
353 |
353 |
354 def _init_coll_HelpMenu_Items(self, parent): |
354 def _init_coll_HelpMenu_Items(self, parent): |
355 parent.Append(help='', id=wx.ID_ABOUT, |
355 parent.Append(help='', id=wx.ID_ABOUT, |
356 kind=wx.ITEM_NORMAL, text=_(u'About')) |
356 kind=wx.ITEM_NORMAL, text=_(u'About')) |
357 self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT) |
357 self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT) |
358 |
358 |
359 def _init_coll_ConnectionStatusBar_Fields(self, parent): |
359 def _init_coll_ConnectionStatusBar_Fields(self, parent): |
360 parent.SetFieldsCount(3) |
360 parent.SetFieldsCount(3) |
361 |
361 |
362 parent.SetStatusText(number=0, text='') |
362 parent.SetStatusText(number=0, text='') |
363 parent.SetStatusText(number=1, text='') |
363 parent.SetStatusText(number=1, text='') |
364 parent.SetStatusText(number=2, text='') |
364 parent.SetStatusText(number=2, text='') |
365 |
365 |
366 parent.SetStatusWidths([-1, 300, 200]) |
366 parent.SetStatusWidths([-1, 300, 200]) |
367 |
367 |
368 def _init_ctrls(self, prnt): |
368 def _init_ctrls(self, prnt): |
369 IDEFrame._init_ctrls(self, prnt) |
369 IDEFrame._init_ctrls(self, prnt) |
370 |
370 |
371 self.EditMenuSize = self.EditMenu.GetMenuItemCount() |
371 self.EditMenuSize = self.EditMenu.GetMenuItemCount() |
372 |
372 |
373 inspectorID = wx.NewId() |
373 inspectorID = wx.NewId() |
374 self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, id=inspectorID) |
374 self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, id=inspectorID) |
375 accels = [wx.AcceleratorEntry(wx.ACCEL_CTRL|wx.ACCEL_ALT, ord('I'), inspectorID)] |
375 accels = [wx.AcceleratorEntry(wx.ACCEL_CTRL|wx.ACCEL_ALT, ord('I'), inspectorID)] |
376 for method,shortcut in [("Stop", wx.WXK_F4), |
376 for method,shortcut in [("Stop", wx.WXK_F4), |
377 ("Run", wx.WXK_F5), |
377 ("Run", wx.WXK_F5), |
385 wx.CallAfter(self.RefreshStatusToolBar) |
385 wx.CallAfter(self.RefreshStatusToolBar) |
386 return OnMethod |
386 return OnMethod |
387 newid = wx.NewId() |
387 newid = wx.NewId() |
388 self.Bind(wx.EVT_MENU, OnMethodGen(self,method), id=newid) |
388 self.Bind(wx.EVT_MENU, OnMethodGen(self,method), id=newid) |
389 accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut,newid)] |
389 accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut,newid)] |
390 |
390 |
391 self.SetAcceleratorTable(wx.AcceleratorTable(accels)) |
391 self.SetAcceleratorTable(wx.AcceleratorTable(accels)) |
392 |
392 |
393 self.LogConsole = CustomStyledTextCtrl( |
393 self.LogConsole = CustomStyledTextCtrl( |
394 name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0), |
394 name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0), |
395 size=wx.Size(0, 0)) |
395 size=wx.Size(0, 0)) |
396 self.LogConsole.Bind(wx.EVT_SET_FOCUS, self.OnLogConsoleFocusChanged) |
396 self.LogConsole.Bind(wx.EVT_SET_FOCUS, self.OnLogConsoleFocusChanged) |
397 self.LogConsole.Bind(wx.EVT_KILL_FOCUS, self.OnLogConsoleFocusChanged) |
397 self.LogConsole.Bind(wx.EVT_KILL_FOCUS, self.OnLogConsoleFocusChanged) |
398 self.LogConsole.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnLogConsoleUpdateUI) |
398 self.LogConsole.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnLogConsoleUpdateUI) |
399 self.LogConsole.SetReadOnly(True) |
399 self.LogConsole.SetReadOnly(True) |
400 self.LogConsole.SetWrapMode(wx.stc.STC_WRAP_CHAR) |
400 self.LogConsole.SetWrapMode(wx.stc.STC_WRAP_CHAR) |
401 |
401 |
402 # Define Log Console styles |
402 # Define Log Console styles |
403 self.LogConsole.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces) |
403 self.LogConsole.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces) |
404 self.LogConsole.StyleClearAll() |
404 self.LogConsole.StyleClearAll() |
405 self.LogConsole.StyleSetSpec(1, "face:%(mono)s,fore:#FF0000,size:%(size)d" % faces) |
405 self.LogConsole.StyleSetSpec(1, "face:%(mono)s,fore:#FF0000,size:%(size)d" % faces) |
406 self.LogConsole.StyleSetSpec(2, "face:%(mono)s,fore:#FF0000,back:#FFFF00,size:%(size)d" % faces) |
406 self.LogConsole.StyleSetSpec(2, "face:%(mono)s,fore:#FF0000,back:#FFFF00,size:%(size)d" % faces) |
407 |
407 |
408 # Define Log Console markers |
408 # Define Log Console markers |
409 self.LogConsole.SetMarginSensitive(1, True) |
409 self.LogConsole.SetMarginSensitive(1, True) |
410 self.LogConsole.SetMarginType(1, wx.stc.STC_MARGIN_SYMBOL) |
410 self.LogConsole.SetMarginType(1, wx.stc.STC_MARGIN_SYMBOL) |
411 self.LogConsole.MarkerDefine(0, wx.stc.STC_MARK_CIRCLE, "BLACK", "RED") |
411 self.LogConsole.MarkerDefine(0, wx.stc.STC_MARK_CIRCLE, "BLACK", "RED") |
412 |
412 |
413 self.LogConsole.SetModEventMask(wx.stc.STC_MOD_INSERTTEXT) |
413 self.LogConsole.SetModEventMask(wx.stc.STC_MOD_INSERTTEXT) |
414 |
414 |
415 self.LogConsole.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnLogConsoleMarginClick) |
415 self.LogConsole.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnLogConsoleMarginClick) |
416 self.LogConsole.Bind(wx.stc.EVT_STC_MODIFIED, self.OnLogConsoleModified) |
416 self.LogConsole.Bind(wx.stc.EVT_STC_MODIFIED, self.OnLogConsoleModified) |
417 |
417 |
418 self.MainTabs["LogConsole"] = (self.LogConsole, _("Console")) |
418 self.MainTabs["LogConsole"] = (self.LogConsole, _("Console")) |
419 self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"]) |
419 self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"]) |
420 #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT) |
420 #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT) |
421 |
421 |
422 self.LogViewer = LogViewer(self.BottomNoteBook, self) |
422 self.LogViewer = LogViewer(self.BottomNoteBook, self) |
423 self.MainTabs["LogViewer"] = (self.LogViewer, _("PLC Log")) |
423 self.MainTabs["LogViewer"] = (self.LogViewer, _("PLC Log")) |
424 self.BottomNoteBook.AddPage(*self.MainTabs["LogViewer"]) |
424 self.BottomNoteBook.AddPage(*self.MainTabs["LogViewer"]) |
425 #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogViewer), wx.RIGHT) |
425 #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogViewer), wx.RIGHT) |
426 |
426 |
427 StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, |
427 StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, |
428 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
428 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
429 StatusToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
429 StatusToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
430 StatusToolBar.Realize() |
430 StatusToolBar.Realize() |
431 self.Panes["StatusToolBar"] = StatusToolBar |
431 self.Panes["StatusToolBar"] = StatusToolBar |
432 self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo(). |
432 self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo(). |
433 Name("StatusToolBar").Caption(_("Status ToolBar")). |
433 Name("StatusToolBar").Caption(_("Status ToolBar")). |
434 ToolbarPane().Top().Position(1). |
434 ToolbarPane().Top().Position(1). |
435 LeftDockable(False).RightDockable(False)) |
435 LeftDockable(False).RightDockable(False)) |
436 |
436 |
437 self.AUIManager.Update() |
437 self.AUIManager.Update() |
438 |
438 |
439 self.ConnectionStatusBar = wx.StatusBar(self, style=wx.ST_SIZEGRIP) |
439 self.ConnectionStatusBar = wx.StatusBar(self, style=wx.ST_SIZEGRIP) |
440 self._init_coll_ConnectionStatusBar_Fields(self.ConnectionStatusBar) |
440 self._init_coll_ConnectionStatusBar_Fields(self.ConnectionStatusBar) |
441 self.SetStatusBar(self.ConnectionStatusBar) |
441 self.SetStatusBar(self.ConnectionStatusBar) |
442 |
442 |
443 def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True): |
443 def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True): |
444 IDEFrame.__init__(self, parent, debug) |
444 IDEFrame.__init__(self, parent, debug) |
445 self.Log = LogPseudoFile(self.LogConsole,self.SelectTab) |
445 self.Log = LogPseudoFile(self.LogConsole,self.SelectTab) |
446 |
446 |
447 self.local_runtime = None |
447 self.local_runtime = None |
448 self.runtime_port = None |
448 self.runtime_port = None |
449 self.local_runtime_tmpdir = None |
449 self.local_runtime_tmpdir = None |
450 |
450 |
451 self.LastPanelSelected = None |
451 self.LastPanelSelected = None |
452 |
452 |
453 # Define Tree item icon list |
453 # Define Tree item icon list |
454 self.LocationImageList = wx.ImageList(16, 16) |
454 self.LocationImageList = wx.ImageList(16, 16) |
455 self.LocationImageDict = {} |
455 self.LocationImageDict = {} |
456 |
456 |
457 # Icons for location items |
457 # Icons for location items |
458 for imgname, itemtype in [ |
458 for imgname, itemtype in [ |
459 ("CONFIGURATION", LOCATION_CONFNODE), |
459 ("CONFIGURATION", LOCATION_CONFNODE), |
460 ("RESOURCE", LOCATION_MODULE), |
460 ("RESOURCE", LOCATION_MODULE), |
461 ("PROGRAM", LOCATION_GROUP), |
461 ("PROGRAM", LOCATION_GROUP), |
462 ("VAR_INPUT", LOCATION_VAR_INPUT), |
462 ("VAR_INPUT", LOCATION_VAR_INPUT), |
463 ("VAR_OUTPUT", LOCATION_VAR_OUTPUT), |
463 ("VAR_OUTPUT", LOCATION_VAR_OUTPUT), |
464 ("VAR_LOCAL", LOCATION_VAR_MEMORY)]: |
464 ("VAR_LOCAL", LOCATION_VAR_MEMORY)]: |
465 self.LocationImageDict[itemtype] = self.LocationImageList.Add(GetBitmap(imgname)) |
465 self.LocationImageDict[itemtype] = self.LocationImageList.Add(GetBitmap(imgname)) |
466 |
466 |
467 # Icons for other items |
467 # Icons for other items |
468 for imgname, itemtype in [ |
468 for imgname, itemtype in [ |
469 ("Extension", ITEM_CONFNODE)]: |
469 ("Extension", ITEM_CONFNODE)]: |
470 self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname)) |
470 self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname)) |
471 |
471 |
472 # Add beremiz's icon in top left corner of the frame |
472 # Add beremiz's icon in top left corner of the frame |
473 self.SetIcon(wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO)) |
473 self.SetIcon(wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO)) |
474 |
474 |
475 if projectOpen is not None: |
475 if projectOpen is not None: |
476 projectOpen = DecodeFileSystemPath(projectOpen, False) |
476 projectOpen = DecodeFileSystemPath(projectOpen, False) |
477 |
477 |
478 if projectOpen is not None and os.path.isdir(projectOpen): |
478 if projectOpen is not None and os.path.isdir(projectOpen): |
479 self.CTR = ProjectController(self, self.Log) |
479 self.CTR = ProjectController(self, self.Log) |
480 self.Controler = self.CTR |
480 self.Controler = self.CTR |
481 result = self.CTR.LoadProject(projectOpen, buildpath) |
481 result = self.CTR.LoadProject(projectOpen, buildpath) |
482 if not result: |
482 if not result: |
600 dialog.Destroy() |
600 dialog.Destroy() |
601 if answer == wx.ID_YES: |
601 if answer == wx.ID_YES: |
602 self.CTR.SaveProject() |
602 self.CTR.SaveProject() |
603 elif answer == wx.ID_CANCEL: |
603 elif answer == wx.ID_CANCEL: |
604 return False |
604 return False |
605 |
605 |
606 for idx in xrange(self.TabsOpened.GetPageCount()): |
606 for idx in xrange(self.TabsOpened.GetPageCount()): |
607 window = self.TabsOpened.GetPage(idx) |
607 window = self.TabsOpened.GetPage(idx) |
608 if not window.CheckSaveBeforeClosing(): |
608 if not window.CheckSaveBeforeClosing(): |
609 return False |
609 return False |
610 |
610 |
611 return True |
611 return True |
612 |
612 |
613 def GetTabInfos(self, tab): |
613 def GetTabInfos(self, tab): |
614 if (isinstance(tab, EditorPanel) and |
614 if (isinstance(tab, EditorPanel) and |
615 not isinstance(tab, (Viewer, |
615 not isinstance(tab, (Viewer, |
616 TextViewer, |
616 TextViewer, |
617 ResourceEditor, |
617 ResourceEditor, |
618 ConfigurationEditor, |
618 ConfigurationEditor, |
619 DataTypeEditor))): |
619 DataTypeEditor))): |
620 return ("confnode", tab.Controler.CTNFullName(), tab.GetTagName()) |
620 return ("confnode", tab.Controler.CTNFullName(), tab.GetTagName()) |
621 elif (isinstance(tab, TextViewer) and |
621 elif (isinstance(tab, TextViewer) and |
622 (tab.Controler is None or isinstance(tab.Controler, MiniTextControler))): |
622 (tab.Controler is None or isinstance(tab.Controler, MiniTextControler))): |
623 return ("confnode", None, tab.GetInstancePath()) |
623 return ("confnode", None, tab.GetInstancePath()) |
624 else: |
624 else: |
625 return IDEFrame.GetTabInfos(self, tab) |
625 return IDEFrame.GetTabInfos(self, tab) |
626 |
626 |
627 def LoadTab(self, notebook, page_infos): |
627 def LoadTab(self, notebook, page_infos): |
628 if page_infos[0] == "confnode": |
628 if page_infos[0] == "confnode": |
629 if page_infos[1] is None: |
629 if page_infos[1] is None: |
630 confnode = self.CTR |
630 confnode = self.CTR |
631 else: |
631 else: |
632 confnode = self.CTR.GetChildByName(page_infos[1]) |
632 confnode = self.CTR.GetChildByName(page_infos[1]) |
633 return notebook.GetPageIndex(confnode._OpenView(*page_infos[2:])) |
633 return notebook.GetPageIndex(confnode._OpenView(*page_infos[2:])) |
634 else: |
634 else: |
635 return IDEFrame.LoadTab(self, notebook, page_infos) |
635 return IDEFrame.LoadTab(self, notebook, page_infos) |
636 |
636 |
637 def OnCloseFrame(self, event): |
637 def OnCloseFrame(self, event): |
638 for evt_type in [wx.EVT_SET_FOCUS, |
638 for evt_type in [wx.EVT_SET_FOCUS, |
639 wx.EVT_KILL_FOCUS, |
639 wx.EVT_KILL_FOCUS, |
640 wx.stc.EVT_STC_UPDATEUI]: |
640 wx.stc.EVT_STC_UPDATEUI]: |
641 self.LogConsole.Unbind(evt_type) |
641 self.LogConsole.Unbind(evt_type) |
642 if self.CTR is None or self.CheckSaveBeforeClosing(_("Close Application")): |
642 if self.CTR is None or self.CheckSaveBeforeClosing(_("Close Application")): |
643 if self.CTR is not None: |
643 if self.CTR is not None: |
644 self.CTR.KillDebugThread() |
644 self.CTR.KillDebugThread() |
645 self.KillLocalRuntime() |
645 self.KillLocalRuntime() |
646 |
646 |
647 self.SaveLastState() |
647 self.SaveLastState() |
648 |
648 |
649 event.Skip() |
649 event.Skip() |
650 else: |
650 else: |
651 event.Veto() |
651 event.Veto() |
652 |
652 |
653 def RefreshFileMenu(self): |
653 def RefreshFileMenu(self): |
654 self.RefreshRecentProjectsMenu() |
654 self.RefreshRecentProjectsMenu() |
655 |
655 |
656 MenuToolBar = self.Panes["MenuToolBar"] |
656 MenuToolBar = self.Panes["MenuToolBar"] |
657 if self.CTR is not None: |
657 if self.CTR is not None: |
658 selected = self.TabsOpened.GetSelection() |
658 selected = self.TabsOpened.GetSelection() |
659 if selected >= 0: |
659 if selected >= 0: |
660 window = self.TabsOpened.GetPage(selected) |
660 window = self.TabsOpened.GetPage(selected) |
693 self.FileMenu.Enable(wx.ID_SAVE, False) |
693 self.FileMenu.Enable(wx.ID_SAVE, False) |
694 MenuToolBar.EnableTool(wx.ID_SAVE, False) |
694 MenuToolBar.EnableTool(wx.ID_SAVE, False) |
695 self.FileMenu.Enable(wx.ID_SAVEAS, False) |
695 self.FileMenu.Enable(wx.ID_SAVEAS, False) |
696 MenuToolBar.EnableTool(wx.ID_SAVEAS, False) |
696 MenuToolBar.EnableTool(wx.ID_SAVEAS, False) |
697 self.FileMenu.Enable(wx.ID_CLOSE_ALL, False) |
697 self.FileMenu.Enable(wx.ID_CLOSE_ALL, False) |
698 |
698 |
699 def RefreshRecentProjectsMenu(self): |
699 def RefreshRecentProjectsMenu(self): |
700 try: |
700 try: |
701 recent_projects = map(DecodeFileSystemPath, |
701 recent_projects = map(DecodeFileSystemPath, |
702 self.GetConfigEntry("RecentProjects", [])) |
702 self.GetConfigEntry("RecentProjects", [])) |
703 except: |
703 except: |
704 recent_projects = [] |
704 recent_projects = [] |
705 self.FileMenu.Enable(ID_FILEMENURECENTPROJECTS, len(recent_projects) > 0) |
705 self.FileMenu.Enable(ID_FILEMENURECENTPROJECTS, len(recent_projects) > 0) |
706 for idx, projectpath in enumerate(recent_projects): |
706 for idx, projectpath in enumerate(recent_projects): |
707 text = u'%d: %s' % (idx + 1, projectpath) |
707 text = u'%d: %s' % (idx + 1, projectpath) |
708 |
708 |
709 if idx < self.RecentProjectsMenu.GetMenuItemCount(): |
709 if idx < self.RecentProjectsMenu.GetMenuItemCount(): |
710 item = self.RecentProjectsMenu.FindItemByPosition(idx) |
710 item = self.RecentProjectsMenu.FindItemByPosition(idx) |
711 id = item.GetId() |
711 id = item.GetId() |
712 item.SetItemLabel(text) |
712 item.SetItemLabel(text) |
713 self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType()) |
713 self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType()) |
714 else: |
714 else: |
715 id = wx.NewId() |
715 id = wx.NewId() |
716 AppendMenu(self.RecentProjectsMenu, help='', id=id, |
716 AppendMenu(self.RecentProjectsMenu, help='', id=id, |
717 kind=wx.ITEM_NORMAL, text=text) |
717 kind=wx.ITEM_NORMAL, text=text) |
718 self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), id=id) |
718 self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), id=id) |
719 |
719 |
720 def GenerateOpenRecentProjectFunction(self, projectpath): |
720 def GenerateOpenRecentProjectFunction(self, projectpath): |
721 def OpenRecentProject(event): |
721 def OpenRecentProject(event): |
722 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
722 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
723 return |
723 return |
724 |
724 |
725 self.OpenProject(projectpath) |
725 self.OpenProject(projectpath) |
726 return OpenRecentProject |
726 return OpenRecentProject |
727 |
727 |
728 def GenerateMenuRecursive(self, items, menu): |
728 def GenerateMenuRecursive(self, items, menu): |
729 for kind, infos in items: |
729 for kind, infos in items: |
730 if isinstance(kind, ListType): |
730 if isinstance(kind, ListType): |
731 text, id = infos |
731 text, id = infos |
732 submenu = wx.Menu('') |
732 submenu = wx.Menu('') |
737 else: |
737 else: |
738 text, id, help, callback = infos |
738 text, id, help, callback = infos |
739 AppendMenu(menu, help='', id=id, kind=kind, text=text) |
739 AppendMenu(menu, help='', id=id, kind=kind, text=text) |
740 if callback is not None: |
740 if callback is not None: |
741 self.Bind(wx.EVT_MENU, callback, id=id) |
741 self.Bind(wx.EVT_MENU, callback, id=id) |
742 |
742 |
743 def RefreshEditorToolBar(self): |
743 def RefreshEditorToolBar(self): |
744 IDEFrame.RefreshEditorToolBar(self) |
744 IDEFrame.RefreshEditorToolBar(self) |
745 self.AUIManager.GetPane("EditorToolBar").Position(2) |
745 self.AUIManager.GetPane("EditorToolBar").Position(2) |
746 self.AUIManager.GetPane("StatusToolBar").Position(1) |
746 self.AUIManager.GetPane("StatusToolBar").Position(1) |
747 self.AUIManager.Update() |
747 self.AUIManager.Update() |
748 |
748 |
749 def RefreshStatusToolBar(self): |
749 def RefreshStatusToolBar(self): |
750 StatusToolBar = self.Panes["StatusToolBar"] |
750 StatusToolBar = self.Panes["StatusToolBar"] |
751 StatusToolBar.ClearTools() |
751 StatusToolBar.ClearTools() |
752 |
752 |
753 if self.CTR is not None: |
753 if self.CTR is not None: |
754 |
754 |
755 for confnode_method in self.CTR.StatusMethods: |
755 for confnode_method in self.CTR.StatusMethods: |
756 if "method" in confnode_method and confnode_method.get("shown",True): |
756 if "method" in confnode_method and confnode_method.get("shown",True): |
757 id = wx.NewId() |
757 id = wx.NewId() |
758 StatusToolBar.AddSimpleTool(id, |
758 StatusToolBar.AddSimpleTool(id, |
759 GetBitmap(confnode_method.get("bitmap", "Unknown")), |
759 GetBitmap(confnode_method.get("bitmap", "Unknown")), |
760 confnode_method["tooltip"]) |
760 confnode_method["tooltip"]) |
761 self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id) |
761 self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id) |
762 |
762 |
763 StatusToolBar.Realize() |
763 StatusToolBar.Realize() |
764 self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show() |
764 self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show() |
765 else: |
765 else: |
766 self.AUIManager.GetPane("StatusToolBar").Hide() |
766 self.AUIManager.GetPane("StatusToolBar").Hide() |
767 self.AUIManager.GetPane("EditorToolBar").Position(2) |
767 self.AUIManager.GetPane("EditorToolBar").Position(2) |
768 self.AUIManager.GetPane("StatusToolBar").Position(1) |
768 self.AUIManager.GetPane("StatusToolBar").Position(1) |
769 self.AUIManager.Update() |
769 self.AUIManager.Update() |
770 |
770 |
771 def RefreshEditMenu(self): |
771 def RefreshEditMenu(self): |
772 IDEFrame.RefreshEditMenu(self) |
772 IDEFrame.RefreshEditMenu(self) |
773 if self.FindFocus() == self.LogConsole: |
773 if self.FindFocus() == self.LogConsole: |
774 self.EditMenu.Enable(wx.ID_COPY, True) |
774 self.EditMenu.Enable(wx.ID_COPY, True) |
775 self.Panes["MenuToolBar"].EnableTool(wx.ID_COPY, True) |
775 self.Panes["MenuToolBar"].EnableTool(wx.ID_COPY, True) |
776 |
776 |
777 if self.CTR is not None: |
777 if self.CTR is not None: |
778 selected = self.TabsOpened.GetSelection() |
778 selected = self.TabsOpened.GetSelection() |
779 if selected >= 0: |
779 if selected >= 0: |
780 panel = self.TabsOpened.GetPage(selected) |
780 panel = self.TabsOpened.GetPage(selected) |
781 else: |
781 else: |
806 self.EditMenu.RemoveItem(item) |
806 self.EditMenu.RemoveItem(item) |
807 else: |
807 else: |
808 self.EditMenu.Delete(item.GetId()) |
808 self.EditMenu.Delete(item.GetId()) |
809 self.LastPanelSelected = None |
809 self.LastPanelSelected = None |
810 self.MenuBar.UpdateMenus() |
810 self.MenuBar.UpdateMenus() |
811 |
811 |
812 def RefreshAll(self): |
812 def RefreshAll(self): |
813 self.RefreshStatusToolBar() |
813 self.RefreshStatusToolBar() |
814 |
814 |
815 def GetMenuCallBackFunction(self, method): |
815 def GetMenuCallBackFunction(self, method): |
816 """ Generate the callbackfunc for a given CTR method""" |
816 """ Generate the callbackfunc for a given CTR method""" |
817 def OnMenu(event): |
817 def OnMenu(event): |
818 # Disable button to prevent re-entrant call |
818 # Disable button to prevent re-entrant call |
819 event.GetEventObject().Disable() |
819 event.GetEventObject().Disable() |
820 # Call |
820 # Call |
821 getattr(self.CTR, method)() |
821 getattr(self.CTR, method)() |
822 # Re-enable button |
822 # Re-enable button |
823 event.GetEventObject().Enable() |
823 event.GetEventObject().Enable() |
824 return OnMenu |
824 return OnMenu |
825 |
825 |
826 def GetConfigEntry(self, entry_name, default): |
826 def GetConfigEntry(self, entry_name, default): |
827 return cPickle.loads(str(self.Config.Read(entry_name, cPickle.dumps(default)))) |
827 return cPickle.loads(str(self.Config.Read(entry_name, cPickle.dumps(default)))) |
828 |
828 |
829 def ResetConnectionStatusBar(self): |
829 def ResetConnectionStatusBar(self): |
830 for field in xrange(self.ConnectionStatusBar.GetFieldsCount()): |
830 for field in xrange(self.ConnectionStatusBar.GetFieldsCount()): |
831 self.ConnectionStatusBar.SetStatusText('', field) |
831 self.ConnectionStatusBar.SetStatusText('', field) |
832 |
832 |
833 def ResetView(self): |
833 def ResetView(self): |
834 IDEFrame.ResetView(self) |
834 IDEFrame.ResetView(self) |
835 self.ConfNodeInfos = {} |
835 self.ConfNodeInfos = {} |
836 if self.CTR is not None: |
836 if self.CTR is not None: |
837 self.CTR.CloseProject() |
837 self.CTR.CloseProject() |
838 self.CTR = None |
838 self.CTR = None |
839 self.Log.flush() |
839 self.Log.flush() |
840 if self.EnableDebug: |
840 if self.EnableDebug: |
841 self.DebugVariablePanel.SetDataProducer(None) |
841 self.DebugVariablePanel.SetDataProducer(None) |
842 self.ResetConnectionStatusBar() |
842 self.ResetConnectionStatusBar() |
843 |
843 |
844 def RefreshConfigRecentProjects(self, projectpath): |
844 def RefreshConfigRecentProjects(self, projectpath): |
845 try: |
845 try: |
846 recent_projects = map(DecodeFileSystemPath, |
846 recent_projects = map(DecodeFileSystemPath, |
847 self.GetConfigEntry("RecentProjects", [])) |
847 self.GetConfigEntry("RecentProjects", [])) |
848 except: |
848 except: |
849 recent_projects = [] |
849 recent_projects = [] |
850 if projectpath in recent_projects: |
850 if projectpath in recent_projects: |
851 recent_projects.remove(projectpath) |
851 recent_projects.remove(projectpath) |
852 recent_projects.insert(0, projectpath) |
852 recent_projects.insert(0, projectpath) |
853 self.Config.Write("RecentProjects", cPickle.dumps( |
853 self.Config.Write("RecentProjects", cPickle.dumps( |
854 map(EncodeFileSystemPath, recent_projects[:MAX_RECENT_PROJECTS]))) |
854 map(EncodeFileSystemPath, recent_projects[:MAX_RECENT_PROJECTS]))) |
855 self.Config.Flush() |
855 self.Config.Flush() |
856 |
856 |
857 def ResetPerspective(self): |
857 def ResetPerspective(self): |
858 IDEFrame.ResetPerspective(self) |
858 IDEFrame.ResetPerspective(self) |
859 self.RefreshStatusToolBar() |
859 self.RefreshStatusToolBar() |
860 |
860 |
861 def OnNewProjectMenu(self, event): |
861 def OnNewProjectMenu(self, event): |
862 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
862 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
863 return |
863 return |
864 |
864 |
865 try: |
865 try: |
866 defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder")) |
866 defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder")) |
867 except: |
867 except: |
868 defaultpath = os.path.expanduser("~") |
868 defaultpath = os.path.expanduser("~") |
869 |
869 |
870 dialog = wx.DirDialog(self , _("Choose a project"), defaultpath) |
870 dialog = wx.DirDialog(self , _("Choose a project"), defaultpath) |
871 if dialog.ShowModal() == wx.ID_OK: |
871 if dialog.ShowModal() == wx.ID_OK: |
872 projectpath = dialog.GetPath() |
872 projectpath = dialog.GetPath() |
873 self.Config.Write("lastopenedfolder", |
873 self.Config.Write("lastopenedfolder", |
874 EncodeFileSystemPath(os.path.dirname(projectpath))) |
874 EncodeFileSystemPath(os.path.dirname(projectpath))) |
875 self.Config.Flush() |
875 self.Config.Flush() |
876 self.ResetView() |
876 self.ResetView() |
877 ctr = ProjectController(self, self.Log) |
877 ctr = ProjectController(self, self.Log) |
878 result = ctr.NewProject(projectpath) |
878 result = ctr.NewProject(projectpath) |
930 self.ShowErrorMessage(result) |
930 self.ShowErrorMessage(result) |
931 self.RefreshAll() |
931 self.RefreshAll() |
932 else: |
932 else: |
933 self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath) |
933 self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath) |
934 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
934 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
935 |
935 |
936 def OnCloseProjectMenu(self, event): |
936 def OnCloseProjectMenu(self, event): |
937 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
937 if self.CTR is not None and not self.CheckSaveBeforeClosing(): |
938 return |
938 return |
939 |
939 |
940 self.ResetView() |
940 self.ResetView() |
941 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
941 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) |
942 self.RefreshAll() |
942 self.RefreshAll() |
943 |
943 |
944 def OnSaveProjectMenu(self, event): |
944 def OnSaveProjectMenu(self, event): |
945 selected = self.TabsOpened.GetSelection() |
945 selected = self.TabsOpened.GetSelection() |
946 if selected != -1: |
946 if selected != -1: |
947 window = self.TabsOpened.GetPage(selected) |
947 window = self.TabsOpened.GetPage(selected) |
948 window.Save() |
948 window.Save() |
949 if self.CTR is not None: |
949 if self.CTR is not None: |
950 self.CTR.SaveProject() |
950 self.CTR.SaveProject() |
951 self.RefreshAll() |
951 self.RefreshAll() |
952 self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES) |
952 self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES) |
953 |
953 |
954 def OnSaveProjectAsMenu(self, event): |
954 def OnSaveProjectAsMenu(self, event): |
955 selected = self.TabsOpened.GetSelection() |
955 selected = self.TabsOpened.GetSelection() |
956 if selected != -1: |
956 if selected != -1: |
957 window = self.TabsOpened.GetPage(selected) |
957 window = self.TabsOpened.GetPage(selected) |
958 window.SaveAs() |
958 window.SaveAs() |
959 if self.CTR is not None: |
959 if self.CTR is not None: |
960 self.CTR.SaveProjectAs() |
960 self.CTR.SaveProjectAs() |
961 self.RefreshAll() |
961 self.RefreshAll() |
962 self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES) |
962 self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES) |
963 |
963 |
964 def OnQuitMenu(self, event): |
964 def OnQuitMenu(self, event): |
965 self.Close() |
965 self.Close() |
966 |
966 |
967 def OnAboutMenu(self, event): |
967 def OnAboutMenu(self, event): |
968 OpenHtmlFrame(self,_("About Beremiz"), Bpath("doc", "about.html"), wx.Size(550, 500)) |
968 OpenHtmlFrame(self,_("About Beremiz"), Bpath("doc", "about.html"), wx.Size(550, 500)) |
969 |
969 |
970 def OnProjectTreeItemBeginEdit(self, event): |
970 def OnProjectTreeItemBeginEdit(self, event): |
971 selected = event.GetItem() |
971 selected = event.GetItem() |
972 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFNODE: |
972 if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFNODE: |
973 event.Veto() |
973 event.Veto() |
974 else: |
974 else: |
975 IDEFrame.OnProjectTreeItemBeginEdit(self, event) |
975 IDEFrame.OnProjectTreeItemBeginEdit(self, event) |
976 |
976 |
977 def OnProjectTreeRightUp(self, event): |
977 def OnProjectTreeRightUp(self, event): |
978 item = event.GetItem() |
978 item = event.GetItem() |
979 item_infos = self.ProjectTree.GetPyData(item) |
979 item_infos = self.ProjectTree.GetPyData(item) |
980 |
980 |
981 if item_infos["type"] == ITEM_CONFNODE: |
981 if item_infos["type"] == ITEM_CONFNODE: |
982 confnode_menu = wx.Menu(title='') |
982 confnode_menu = wx.Menu(title='') |
983 |
983 |
984 confnode = item_infos["confnode"] |
984 confnode = item_infos["confnode"] |
985 if confnode is not None: |
985 if confnode is not None: |
986 menu_items = confnode.GetContextualMenuItems() |
986 menu_items = confnode.GetContextualMenuItems() |
987 if menu_items is not None: |
987 if menu_items is not None: |
988 for text, help, callback in menu_items: |
988 for text, help, callback in menu_items: |
996 self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), id=new_id) |
996 self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), id=new_id) |
997 |
997 |
998 new_id = wx.NewId() |
998 new_id = wx.NewId() |
999 AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) |
999 AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete")) |
1000 self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), id=new_id) |
1000 self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), id=new_id) |
1001 |
1001 |
1002 self.PopupMenu(confnode_menu) |
1002 self.PopupMenu(confnode_menu) |
1003 confnode_menu.Destroy() |
1003 confnode_menu.Destroy() |
1004 |
1004 |
1005 event.Skip() |
1005 event.Skip() |
1006 elif item_infos["type"] == ITEM_RESOURCE: |
1006 elif item_infos["type"] == ITEM_RESOURCE: |
1007 # prevent last resource to be delted |
1007 # prevent last resource to be delted |
1008 parent = self.ProjectTree.GetItemParent(item) |
1008 parent = self.ProjectTree.GetItemParent(item) |
1009 parent_name = self.ProjectTree.GetItemText(parent) |
1009 parent_name = self.ProjectTree.GetItemText(parent) |
1010 if parent_name == _("Resources"): |
1010 if parent_name == _("Resources"): |
1011 IDEFrame.OnProjectTreeRightUp(self, event) |
1011 IDEFrame.OnProjectTreeRightUp(self, event) |
1012 else: |
1012 else: |
1013 IDEFrame.OnProjectTreeRightUp(self, event) |
1013 IDEFrame.OnProjectTreeRightUp(self, event) |
1014 |
1014 |
1015 def OnProjectTreeItemActivated(self, event): |
1015 def OnProjectTreeItemActivated(self, event): |
1016 selected = event.GetItem() |
1016 selected = event.GetItem() |
1017 name = self.ProjectTree.GetItemText(selected) |
1017 name = self.ProjectTree.GetItemText(selected) |
1018 item_infos = self.ProjectTree.GetPyData(selected) |
1018 item_infos = self.ProjectTree.GetPyData(selected) |
1019 if item_infos["type"] == ITEM_CONFNODE: |
1019 if item_infos["type"] == ITEM_CONFNODE: |
1044 if tagname == "Project": |
1044 if tagname == "Project": |
1045 self.SelectedItem = root |
1045 self.SelectedItem = root |
1046 self.ProjectTree.SelectItem(root) |
1046 self.ProjectTree.SelectItem(root) |
1047 self.ResetSelectedItem() |
1047 self.ResetSelectedItem() |
1048 else: |
1048 else: |
1049 return self.RecursiveProjectTreeItemSelection(root, |
1049 return self.RecursiveProjectTreeItemSelection(root, |
1050 [(word, ITEM_CONFNODE) for word in tagname.split(".")]) |
1050 [(word, ITEM_CONFNODE) for word in tagname.split(".")]) |
1051 elif words[0] == "R": |
1051 elif words[0] == "R": |
1052 return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)]) |
1052 return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)]) |
1053 elif not os.path.exists(words[0]): |
1053 elif not os.path.exists(words[0]): |
1054 IDEFrame.SelectProjectTreeItem(self, tagname) |
1054 IDEFrame.SelectProjectTreeItem(self, tagname) |
1055 |
1055 |
1056 def GetAddConfNodeFunction(self, name, confnode=None): |
1056 def GetAddConfNodeFunction(self, name, confnode=None): |
1057 def AddConfNodeMenuFunction(event): |
1057 def AddConfNodeMenuFunction(event): |
1058 wx.CallAfter(self.AddConfNode, name, confnode) |
1058 wx.CallAfter(self.AddConfNode, name, confnode) |
1059 return AddConfNodeMenuFunction |
1059 return AddConfNodeMenuFunction |
1060 |
1060 |
1061 def GetDeleteMenuFunction(self, confnode): |
1061 def GetDeleteMenuFunction(self, confnode): |
1062 def DeleteMenuFunction(event): |
1062 def DeleteMenuFunction(event): |
1063 wx.CallAfter(self.DeleteConfNode, confnode) |
1063 wx.CallAfter(self.DeleteConfNode, confnode) |
1064 return DeleteMenuFunction |
1064 return DeleteMenuFunction |
1065 |
1065 |
1066 def AddResourceMenu(self, event): |
|
1067 config_names = self.CTR.GetProjectConfigNames() |
|
1068 if len(config_names) > 0: |
|
1069 tagname = self.Controler.ProjectAddConfigurationResource(config_names[0]) |
|
1070 if tagname is not None: |
|
1071 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL) |
|
1072 self.EditProjectElement(ITEM_RESOURCE, tagname) |
|
1073 |
|
1074 def AddConfNode(self, ConfNodeType, confnode=None): |
1066 def AddConfNode(self, ConfNodeType, confnode=None): |
1075 if self.CTR.CheckProjectPathPerm(): |
1067 if self.CTR.CheckProjectPathPerm(): |
1076 ConfNodeName = "%s_0" % ConfNodeType |
1068 ConfNodeName = "%s_0" % ConfNodeType |
1077 if confnode is not None: |
1069 if confnode is not None: |
1078 confnode.CTNAddChild(ConfNodeName, ConfNodeType) |
1070 confnode.CTNAddChild(ConfNodeName, ConfNodeType) |
1079 else: |
1071 else: |
1080 self.CTR.CTNAddChild(ConfNodeName, ConfNodeType) |
1072 self.CTR.CTNAddChild(ConfNodeName, ConfNodeType) |
1081 self._Refresh(TITLE, FILEMENU, PROJECTTREE) |
1073 self._Refresh(TITLE, FILEMENU, PROJECTTREE) |
1082 |
1074 |
1083 def DeleteConfNode(self, confnode): |
1075 def DeleteConfNode(self, confnode): |
1084 if self.CTR.CheckProjectPathPerm(): |
1076 if self.CTR.CheckProjectPathPerm(): |
1085 dialog = wx.MessageDialog(self, |
1077 dialog = wx.MessageDialog(self, |
1086 _("Really delete node '%s'?") % confnode.CTNName(), |
1078 _("Really delete node '%s'?") % confnode.CTNName(), |
1087 _("Remove %s node") % confnode.CTNType, |
1079 _("Remove %s node") % confnode.CTNType, |
1088 wx.YES_NO|wx.NO_DEFAULT) |
1080 wx.YES_NO|wx.NO_DEFAULT) |
1089 if dialog.ShowModal() == wx.ID_YES: |
1081 if dialog.ShowModal() == wx.ID_YES: |
1090 confnode.CTNRemove() |
1082 confnode.CTNRemove() |
1091 del confnode |
1083 del confnode |
1092 self._Refresh(TITLE, FILEMENU, PROJECTTREE) |
1084 self._Refresh(TITLE, FILEMENU, PROJECTTREE) |