# HG changeset patch # User lbessard # Date 1201627896 -3600 # Node ID e4949f54c5d6154b860b6698a2e347011448a4ec # Parent e746ff4aa8be8cf2b84d2378c19df5a63eb0ca2e Changing ProjectTree contextual menu and EditMenu diff -r e746ff4aa8be -r e4949f54c5d6 PLCOpenEditor.py --- a/PLCOpenEditor.py Tue Jan 29 18:30:47 2008 +0100 +++ b/PLCOpenEditor.py Tue Jan 29 18:31:36 2008 +0100 @@ -74,9 +74,10 @@ ID_PLCOPENEDITOREDITMENUITEMS2, ID_PLCOPENEDITOREDITMENUITEMS4, ID_PLCOPENEDITOREDITMENUITEMS5, ID_PLCOPENEDITOREDITMENUITEMS6, ID_PLCOPENEDITOREDITMENUITEMS8, ID_PLCOPENEDITOREDITMENUITEMS9, - ID_PLCOPENEDITOREDITMENUITEMS11, ID_PLCOPENEDITOREDITMENUITEMS12, - ID_PLCOPENEDITOREDITMENUITEMS14, ID_PLCOPENEDITOREDITMENUITEMS15, -] = [wx.NewId() for _init_coll_EditMenu_Items in range(12)] + ID_PLCOPENEDITOREDITMENUITEMS10, ID_PLCOPENEDITOREDITMENUITEMS11, + ID_PLCOPENEDITOREDITMENUITEMS12, ID_PLCOPENEDITOREDITMENUITEMS13, + ID_PLCOPENEDITOREDITMENUITEMS14, +] = [wx.NewId() for _init_coll_EditMenu_Items in range(13)] [ID_PLCOPENEDITORSFCMENUITEMS0, ID_PLCOPENEDITORSFCMENUITEMS1, ID_PLCOPENEDITORSFCMENUITEMS2, ID_PLCOPENEDITORSFCMENUITEMS3, @@ -146,6 +147,8 @@ class PLCOpenEditor(base_class): _custom_classes = {'wx.SashWindow' : ['Viewer']} + CopyBuffer = None + if wx.VERSION < (2, 6, 0): def Bind(self, event, function, id = None): if id is not None: @@ -168,20 +171,20 @@ AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS6, kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V') parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS8, - kind=wx.ITEM_NORMAL, text=u'Add Data Type') - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9, - kind=wx.ITEM_NORMAL, text=u'Remove Data Type') - parent.AppendSeparator() - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11, - kind=wx.ITEM_NORMAL, text=u'Add POU') - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12, - kind=wx.ITEM_NORMAL, text=u'Remove POU') - parent.AppendSeparator() + addmenu = wx.Menu(title='') + parent.AppendMenu(ID_PLCOPENEDITOREDITMENUITEMS8, "Add Element", addmenu) + AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUITEMS9, + kind=wx.ITEM_NORMAL, text=u'Data Type') + AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUITEMS10, + kind=wx.ITEM_NORMAL, text=u'Function') + AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUITEMS11, + kind=wx.ITEM_NORMAL, text=u'Function Block') + AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUITEMS12, + kind=wx.ITEM_NORMAL, text=u'Program') + AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUITEMS13, + kind=wx.ITEM_NORMAL, text=u'Configuration') AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS14, - kind=wx.ITEM_NORMAL, text=u'Add Configuration') - AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUITEMS15, - kind=wx.ITEM_NORMAL, text=u'Remove Configuration') + kind=wx.ITEM_NORMAL, text=u'Delete') self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=ID_PLCOPENEDITOREDITMENUITEMS0) self.Bind(wx.EVT_MENU, self.OnUndoMenu, @@ -195,17 +198,17 @@ self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=ID_PLCOPENEDITOREDITMENUITEMS6) self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, - id=ID_PLCOPENEDITOREDITMENUITEMS8) - self.Bind(wx.EVT_MENU, self.OnRemoveDataTypeMenu, id=ID_PLCOPENEDITOREDITMENUITEMS9) - self.Bind(wx.EVT_MENU, self.OnAddPouMenu, + self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"), + id=ID_PLCOPENEDITOREDITMENUITEMS10) + self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"), id=ID_PLCOPENEDITOREDITMENUITEMS11) - self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, + self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"), id=ID_PLCOPENEDITOREDITMENUITEMS12) self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, + id=ID_PLCOPENEDITOREDITMENUITEMS13) + self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=ID_PLCOPENEDITOREDITMENUITEMS14) - self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu, - id=ID_PLCOPENEDITOREDITMENUITEMS15) def _init_coll_menuBar1_Menus(self, parent): if self.ModeSolo: @@ -213,16 +216,6 @@ parent.Append(menu=self.EditMenu, title=u'Edit') parent.Append(menu=self.HelpMenu, title=u'Help') - def _init_coll_ConfigMenu_Items(self, parent): - AppendMenu(parent, help='', id=ID_PLCOPENEDITORCONFIGMENUITEMS0, - kind=wx.ITEM_NORMAL, text=u'Add Resource') - AppendMenu(parent, help='', id=ID_PLCOPENEDITORCONFIGMENUITEMS1, - kind=wx.ITEM_NORMAL, text=u'Remove Resource') - self.Bind(wx.EVT_MENU, self.OnAddResourceMenu, - id=ID_PLCOPENEDITORCONFIGMENUITEMS0) - self.Bind(wx.EVT_MENU, self.OnRemoveResourceMenu, - id=ID_PLCOPENEDITORCONFIGMENUITEMS1) - def _init_coll_HelpMenu_Items(self, parent): AppendMenu(parent, help='', id=ID_PLCOPENEDITORHELPMENUITEMS0, kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1') @@ -277,24 +270,6 @@ self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=ID_PLCOPENEDITORFILEMENUITEMS11) - def _init_coll_SFCMenu_Items(self, parent): - AppendMenu(parent, help='', id=ID_PLCOPENEDITORSFCMENUITEMS0, - kind=wx.ITEM_NORMAL, text=u'Add Transition') - AppendMenu(parent, help='', id=ID_PLCOPENEDITORSFCMENUITEMS1, - kind=wx.ITEM_NORMAL, text=u'Add Action') - AppendMenu(parent, help='', id=ID_PLCOPENEDITORSFCMENUITEMS2, - kind=wx.ITEM_NORMAL, text=u'Remove Transition') - AppendMenu(parent, help='', id=ID_PLCOPENEDITORSFCMENUITEMS3, - kind=wx.ITEM_NORMAL, text=u'Remove Action') - self.Bind(wx.EVT_MENU, self.OnAddPouTransitionMenu, - id=ID_PLCOPENEDITORSFCMENUITEMS0) - self.Bind(wx.EVT_MENU, self.OnAddPouActionMenu, - id=ID_PLCOPENEDITORSFCMENUITEMS1) - self.Bind(wx.EVT_MENU, self.OnRemovePouTransitionMenu, - id=ID_PLCOPENEDITORSFCMENUITEMS2) - self.Bind(wx.EVT_MENU, self.OnRemovePouActionMenu, - id=ID_PLCOPENEDITORSFCMENUITEMS3) - def _init_utils(self): self.menuBar1 = wx.MenuBar() @@ -304,17 +279,13 @@ self.FileMenu = None self.EditMenu = wx.Menu(title='') self.HelpMenu = wx.Menu(title='') - self.SFCMenu = wx.Menu(title='') - self.ConfigMenu = wx.Menu(title='') - + self._init_coll_menuBar1_Menus(self.menuBar1) if self.ModeSolo: self._init_coll_FileMenu_Items(self.FileMenu) self._init_coll_EditMenu_Items(self.EditMenu) self._init_coll_HelpMenu_Items(self.HelpMenu) - self._init_coll_SFCMenu_Items(self.SFCMenu) - self._init_coll_ConfigMenu_Items(self.ConfigMenu) - + def _init_ctrls(self, prnt): if wx.VERSION >= (2, 8, 0): wx.aui.AuiMDIParentFrame.__init__(self, winid=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', @@ -451,7 +422,6 @@ self.CurrentToolBar = [] self.CurrentLanguage = "" self.SelectedItem = None - self.CopyBuffer = None self.DrawingMode = FREEDRAWING_MODE #self.DrawingMode = DRIVENDRAWING_MODE @@ -466,79 +436,6 @@ def ResetSelectedItem(self): self.SelectedItem = None - def GetPageCount(self): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - return notebook.GetPageCount() - else: - return 0 - else: - return self.TabsOpened.GetPageCount() - - def GetPage(self, idx): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - return notebook.GetPage(idx).GetViewer() - else: - return None - else: - return self.TabsOpened.GetPage(idx) - - def GetPageSelection(self): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - return notebook.GetSelection() - else: - return -1 - else: - return self.TabsOpened.GetSelection() - - def SetPageSelection(self, idx): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - notebook.SetSelection(idx) - else: - self.TabsOpened.SetSelection(idx) - - def DeletePage(self, idx): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - notebook.DeletePage(idx) - else: - self.TabsOpened.DeletePage(idx) - - def DeleteAllPages(self): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - for idx in xrange(notebook.GetPageCount()): - notebook.DeletePage(0) - else: - self.TabsOpened.DeleteAllPages() - - def SetPageText(self, idx, text): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - return notebook.SetPageText(idx, text) - else: - return self.TabsOpened.SetPageText(idx, text) - - def GetPageText(self, idx): - if wx.VERSION >= (2, 8, 0): - notebook = self.GetNotebook() - if notebook is not None: - return notebook.GetPageText(idx) - else: - return "" - else: - return self.TabsOpened.GetPageText(idx) - def OnPageClose(self, event): selected = self.GetPageSelection() if selected >= 0: @@ -556,10 +453,10 @@ event.Skip() def GetCopyBuffer(self): - return self.CopyBuffer + return PLCOpenEditor.CopyBuffer def SetCopyBuffer(self, element): - self.CopyBuffer = element + PLCOpenEditor.CopyBuffer = element self.RefreshEditMenu() def GetDrawingMode(self): @@ -571,72 +468,6 @@ else: self.SetTitle("PLCOpenEditor") - def RefreshFileMenu(self): - if self.FileMenu: - if self.Controler.HasOpenedProject(): - if self.GetPageCount() > 0: - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, True) - else: - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, True) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, True) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS6, True) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS7, True) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS9, True) - else: - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS6, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS7, False) - self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS9, False) - - def RefreshEditMenu(self): - if self.EditMenu: - if self.Controler.HasOpenedProject(): - undo, redo = self.Controler.GetBufferState() - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, undo) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, redo) - else: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, False) - if self.Controler.HasOpenedProject(): - if self.GetPageCount() > 0: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True) - else: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, True) - else: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS9, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS11, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS12, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS15, False) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True) - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True) - if self.CopyBuffer is not None: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True) - else: - self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, False) - - def RefreshEditor(self, variablepanel = True): - selected = self.GetPageSelection() - if selected != -1: - window = self.GetPage(selected) - window.RefreshView() - if variablepanel: - self.RefreshVariablePanel(window.GetTagName()) - - def RefreshVariablePanel(self, tagname): - self.VariablePanelIndexer.RefreshVariablePanel(tagname) - def ShowProperties(self): old_values = self.Controler.GetProjectProperties() dialog = ProjectDialog(self) @@ -677,6 +508,108 @@ else: event.Skip() +#------------------------------------------------------------------------------- +# Notebook Unified Functions +#------------------------------------------------------------------------------- + + def GetPageCount(self): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + return notebook.GetPageCount() + else: + return 0 + else: + return self.TabsOpened.GetPageCount() + + def GetPage(self, idx): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + return notebook.GetPage(idx).GetViewer() + else: + return None + else: + return self.TabsOpened.GetPage(idx) + + def GetPageSelection(self): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + return notebook.GetSelection() + else: + return -1 + else: + return self.TabsOpened.GetSelection() + + def SetPageSelection(self, idx): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + notebook.SetSelection(idx) + else: + self.TabsOpened.SetSelection(idx) + + def DeletePage(self, idx): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + notebook.DeletePage(idx) + else: + self.TabsOpened.DeletePage(idx) + + def DeleteAllPages(self): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + for idx in xrange(notebook.GetPageCount()): + notebook.DeletePage(0) + else: + self.TabsOpened.DeleteAllPages() + + def SetPageText(self, idx, text): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + return notebook.SetPageText(idx, text) + else: + return self.TabsOpened.SetPageText(idx, text) + + def GetPageText(self, idx): + if wx.VERSION >= (2, 8, 0): + notebook = self.GetNotebook() + if notebook is not None: + return notebook.GetPageText(idx) + else: + return "" + else: + return self.TabsOpened.GetPageText(idx) + + +#------------------------------------------------------------------------------- +# File Menu Functions +#------------------------------------------------------------------------------- + + def RefreshFileMenu(self): + if self.FileMenu: + if self.Controler.HasOpenedProject(): + if self.GetPageCount() > 0: + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, True) + else: + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, True) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, True) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS6, True) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS7, True) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS9, True) + else: + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS2, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS3, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS5, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS6, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS7, False) + self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUITEMS9, False) + def OnNewProjectMenu(self, event): dialog = ProjectDialog(self) if dialog.ShowModal() == wx.ID_OK: @@ -822,154 +755,184 @@ self.Close() event.Skip() - def ResetCurrentMode(self): + +#------------------------------------------------------------------------------- +# Edit Project Menu Functions +#------------------------------------------------------------------------------- + + def RefreshEditMenu(self): + if self.EditMenu: + if self.Controler.HasOpenedProject(): + undo, redo = self.Controler.GetBufferState() + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, undo) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, redo) + else: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS1, False) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS2, False) + if self.Controler.HasOpenedProject(): + if self.GetPageCount() > 0: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, True) + else: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, True) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, True) + else: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS0, False) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS8, False) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS14, False) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS4, True) + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS5, True) + if self.CopyBuffer is not None: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, True) + else: + self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUITEMS6, False) + + def OnRefreshMenu(self, event): selected = self.GetPageSelection() if selected != -1: window = self.GetPage(selected) - window.SetMode(MODE_SELECTION) - if wx.VERSION < (2, 8, 0): - ToolBar = self.ToolBar - else: - ToolBar = self.Panes["ToolBar"] - if ToolBar: - ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True) - - def ResetToolToggle(self, id): - if wx.VERSION < (2, 8, 0): - tool = self.ToolBar.FindById(id) - else: - tool = self.Panes["ToolBar"].FindById(id) - tool.SetToggle(False) - - def OnSelectionTool(self, event): + window.RefreshView() + self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) + event.Skip() + + def OnUndoMenu(self, event): + self.Controler.LoadPrevious() + idxs = range(self.GetPageCount()) + idxs.reverse() + for idx in idxs: + tagname = self.GetPage(idx).GetTagName() + if self.Controler.GetEditedElement(tagname) is None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + selected = self.GetPageSelection() + if selected != -1: + window = self.GetPage(selected) + window.RefreshView() + self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + event.Skip() + + def OnRedoMenu(self, event): + self.Controler.LoadNext() + idxs = range(self.GetPageCount()) + idxs.reverse() + for idx in idxs: + tagname = self.GetPage(idx).GetTagName() + if self.Controler.GetEditedElement(tagname) is None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) selected = self.GetPageSelection() if selected != -1: - self.GetPage(selected).SetMode(MODE_SELECTION) - event.Skip() - - def OnCommentTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT) + window = self.GetPage(selected) + window.RefreshView() + self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + event.Skip() + + def OnCutMenu(self, event): selected = self.GetPageSelection() if selected != -1: - self.GetPage(selected).SetMode(MODE_COMMENT) - event.Skip() - - def OnVariableTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE) + try: + self.GetPage(selected).Cut() + except: + pass + event.Skip() + + def OnCopyMenu(self, event): selected = self.GetPageSelection() if selected != -1: - self.GetPage(selected).SetMode(MODE_VARIABLE) - event.Skip() - - def OnBlockTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARBLOCK) + try: + self.GetPage(selected).Copy() + except: + pass + event.Skip() + + def OnPasteMenu(self, event): selected = self.GetPageSelection() if selected != -1: - self.GetPage(selected).SetMode(MODE_BLOCK) - event.Skip() - - def OnConnectionTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_CONNECTION) - event.Skip() - - def OnPowerRailTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_POWERRAIL) - event.Skip() - - def OnRungTool(self, event): - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).AddLadderRung() - event.Skip() - - def OnCoilTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_COIL) - event.Skip() - - def OnContactTool(self, event): - if self.DrawingMode == FREEDRAWING_MODE: - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT) - selected = self.GetPageSelection() - if selected != -1: - if self.DrawingMode == FREEDRAWING_MODE: - self.GetPage(selected).SetMode(MODE_CONTACT) - else: - self.GetPage(selected).AddLadderContact() - event.Skip() - - def OnBranchTool(self, event): - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).AddLadderBranch() - event.Skip() - - def OnInitialStepTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_INITIALSTEP) - event.Skip() - - def OnStepTool(self, event): - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP) - selected = self.GetPageSelection() - if selected != -1: - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.GetPage(selected).SetMode(MODE_STEP) - else: - self.GetPage(selected).AddStep() - event.Skip() - - def OnActionBlockTool(self, event): - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK) - selected = self.GetPageSelection() - if selected != -1: - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.GetPage(selected).SetMode(MODE_ACTION) - else: - self.GetPage(selected).AddStepAction() - event.Skip() - - def OnTransitionTool(self, event): - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION) - selected = self.GetPageSelection() - if selected != -1: - self.GetPage(selected).SetMode(MODE_TRANSITION) - event.Skip() - - def OnDivergenceTool(self, event): - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE) - selected = self.GetPageSelection() - if selected != -1: - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.GetPage(selected).SetMode(MODE_DIVERGENCE) - else: - self.GetPage(selected).AddDivergence() - event.Skip() - - def OnJumpTool(self, event): - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP) - selected = self.GetPageSelection() - if selected != -1: - if self.GetDrawingMode() == FREEDRAWING_MODE: - self.GetPage(selected).SetMode(MODE_JUMP) - else: - self.GetPage(selected).AddJump() - event.Skip() - + try: + self.GetPage(selected).Paste() + except: + pass + event.Skip() + + def OnDeleteMenu(self, event): + window = self.FindFocus() + if window == self.ProjectTree: + selected = self.ProjectTree.GetSelection() + if selected.IsOk(): + type = self.ProjectTree.GetPyData(selected) + tagname = "" + if type == ITEM_DATATYPE: + name = self.ProjectTree.GetItemText(selected) + if not self.Controler.DataTypeIsUsed(name): + self.Controler.ProjectRemoveDataType(name) + tagname = self.Controler.ComputeDataTypeName(name) + else: + message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) + message.ShowModal() + message.Destroy() + elif type == ITEM_POU: + name = self.ProjectTree.GetItemText(selected) + if not self.Controler.DataTypeIsUsed(name): + self.Controler.ProjectRemoveDataType(name) + tagname = self.Controler.ComputeDataTypeName(name) + else: + message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) + message.ShowModal() + message.Destroy() + elif type in [ITEM_TRANSITION, ITEM_ACTION]: + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) + while item_type != ITEM_POU: + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + pou_name = self.ProjectTree.GetItemText(item) + if type == ITEM_TRANSITION: + transition = self.ProjectTree.GetItemText(selected) + self.Controler.ProjectRemovePouTransition(pou_name, transition) + tagname = self.Controler.ComputePouTransitionName(pou_name, transition) + elif type == ITEM_ACTION: + action = self.ProjectTree.GetItemText(selected) + self.Controler.ProjectRemovePouAction(pou_name, action) + tagname = self.Controler.ComputePouActionName(pou_name, action) + elif type == ITEM_CONFIGURATION: + name = self.ProjectTree.GetItemText(selected) + self.Controler.ProjectRemoveConfiguration(name) + tagname = self.Controler.ComputeConfigurationName(name) + elif type == ITEM_RESOURCE: + resource = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) + while item_type != ITEM_CONFIGURATION: + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + config_name = self.ProjectTree.GetItemText(item) + self.Controler.ProjectRemoveConfigurationResource(config_name, resource) + tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + self.RefreshToolBar() + elif isinstance(window, (Viewer, TextViewer)): + event = wx.KeyEvent(wx.EVT_CHAR._getEvtType()) + event.m_keyCode = wx.WXK_DELETE + window.ProcessEvent(event) + event.Skip() + + +#------------------------------------------------------------------------------- +# Project Editor Panels Management Functions +#------------------------------------------------------------------------------- + def OnPouSelectedChanged(self, event): if wx.VERSION < (2, 8, 0) or event.GetActive(): old_selected = self.GetPageSelection() @@ -1004,6 +967,72 @@ self.RefreshToolBar() event.Skip() + def RefreshEditor(self, variablepanel = True): + selected = self.GetPageSelection() + if selected != -1: + window = self.GetPage(selected) + window.RefreshView() + if variablepanel: + self.RefreshVariablePanel(window.GetTagName()) + + def RefreshVariablePanel(self, tagname): + self.VariablePanelIndexer.RefreshVariablePanel(tagname) + + def RefreshEditorNames(self, old_tagname, new_tagname): + for i in xrange(self.GetPageCount()): + editor = self.GetPage(i) + if editor.GetTagName() == old_tagname: + editor.SetTagName(new_tagname) + self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname) + + def IsOpened(self, tagname): + for idx in xrange(self.GetPageCount()): + if self.GetPage(idx).IsViewing(tagname): + return idx + return None + + def RefreshPageTitles(self): + for idx in xrange(self.GetPageCount()): + window = self.GetPage(idx) + words = window.GetTagName().split("::") + self.SetPageText(idx, "-".join(words[1:])) + + +#------------------------------------------------------------------------------- +# Project Tree Management Functions +#------------------------------------------------------------------------------- + + def RefreshProjectTree(self): + infos = self.Controler.GetProjectInfos() + root = self.ProjectTree.GetRootItem() + if not root.IsOk(): + root = self.ProjectTree.AddRoot(infos["name"]) + self.GenerateTreeBranch(root, infos) + self.ProjectTree.Expand(self.ProjectTree.GetRootItem()) + + def GenerateTreeBranch(self, root, infos): + to_delete = [] + self.ProjectTree.SetItemText(root, infos["name"]) + self.ProjectTree.SetPyData(root, infos["type"]) + if infos["type"] == ITEM_POU and wx.Platform != '__WXMSW__': + self.ProjectTree.SetItemImage(root, LANGUAGES.index(self.Controler.GetPouBodyType(infos["name"]))) + if wx.VERSION >= (2, 6, 0): + item, root_cookie = self.ProjectTree.GetFirstChild(root) + else: + item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) + for values in infos["values"]: + if not item.IsOk(): + item = self.ProjectTree.AppendItem(root, "") + if wx.Platform != '__WXMSW__': + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) + self.GenerateTreeBranch(item, values) + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) + while item.IsOk(): + to_delete.append(item) + item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) + for item in to_delete: + self.ProjectTree.Delete(item) + def SelectProjectTreeItem(self, root, items): found = False if self.ProjectTree: @@ -1038,12 +1067,12 @@ dragSource.DoDragDrop() self.ResetSelectedItem() - def RefreshEditorNames(self, old_tagname, new_tagname): - for i in xrange(self.GetPageCount()): - editor = self.GetPage(i) - if editor.GetTagName() == old_tagname: - editor.SetTagName(new_tagname) - self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname) + def OnProjectTreeItemBeginEdit(self, event): + selected = event.GetItem() + if self.ProjectTree.GetPyData(selected) == ITEM_UNEDITABLE: + event.Veto() + else: + event.Skip() def OnProjectTreeItemEndEdit(self, event): message = None @@ -1173,13 +1202,6 @@ if selected != -1: self.GetPage(selected).RefreshView() event.Skip() - - def OnProjectTreeItemBeginEdit(self, event): - selected = event.GetItem() - if self.ProjectTree.GetPyData(selected) == ITEM_UNEDITABLE: - event.Veto() - else: - event.Skip() def OnProjectTreeItemActivated(self, event): selected = event.GetItem() @@ -1267,12 +1289,6 @@ else: event.Skip() - def IsOpened(self, tagname): - for idx in xrange(self.GetPageCount()): - if self.GetPage(idx).IsViewing(tagname): - return idx - return None - def EditProjectElement(self, elementtype, tagname, onlyopened = False): openedidx = self.IsOpened(tagname) if openedidx is not None: @@ -1372,49 +1388,106 @@ def OnProjectTreeRightUp(self, event): if wx.Platform == '__WXMSW__': - cursor_pos = event.GetPoint() - else: - cursor_pos = event.GetPosition() - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: - name = self.ProjectTree.GetItemText(selected) + item = event.GetItem() + else: + item = self.ProjectTree.GetSelection() + name = self.ProjectTree.GetItemText(item) + type = self.ProjectTree.GetPyData(item) + if type == ITEM_POU: + menu = wx.Menu(title='') if self.Controler.GetPouBodyType(name) == "SFC": - self.PopupMenuXY(self.SFCMenu, cursor_pos.x, cursor_pos.y) - elif self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: - self.PopupMenu(self.ConfigMenu) - event.Skip() - - def RefreshProjectTree(self): - infos = self.Controler.GetProjectInfos() - root = self.ProjectTree.GetRootItem() - if not root.IsOk(): - root = self.ProjectTree.AddRoot(infos["name"]) - self.GenerateTreeBranch(root, infos) - self.ProjectTree.Expand(self.ProjectTree.GetRootItem()) - - def GenerateTreeBranch(self, root, infos): - to_delete = [] - self.ProjectTree.SetItemText(root, infos["name"]) - self.ProjectTree.SetPyData(root, infos["type"]) - if infos["type"] == ITEM_POU and wx.Platform != '__WXMSW__': - self.ProjectTree.SetItemImage(root, LANGUAGES.index(self.Controler.GetPouBodyType(infos["name"]))) - if wx.VERSION >= (2, 5, 0): - item, root_cookie = self.ProjectTree.GetFirstChild(root) - else: - item, root_cookie = self.ProjectTree.GetFirstChild(root, 0) - for values in infos["values"]: - if not item.IsOk(): - item = self.ProjectTree.AppendItem(root, "") - if wx.Platform != '__WXMSW__': - item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) - self.GenerateTreeBranch(item, values) - item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) - while item.IsOk(): - to_delete.append(item) - item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie) - for item in to_delete: - self.ProjectTree.Delete(item) - + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition") + self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id) + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action") + self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id) + menu.AppendSeparator() + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") + self.Bind(wx.EVT_MENU, self.OnRemovePouMenu, id=new_id) + self.PopupMenu(menu) + elif type == ITEM_CONFIGURATION: + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource") + self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id) + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") + self.Bind(wx.EVT_MENU, self.OnRemoveConfigurationMenu, id=new_id) + self.PopupMenu(menu) + elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]: + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete") + if type == ITEM_DATATYPE: + self.Bind(wx.EVT_MENU, self.OnRemoveDataTypeMenu, id=new_id) + elif type == ITEM_TRANSITION: + self.Bind(wx.EVT_MENU, self.OnRemoveTransitionMenu, id=new_id) + elif type == ITEM_ACTION: + self.Bind(wx.EVT_MENU, self.OnRemoveActionMenu, id=new_id) + elif type == ITEM_RESOURCE: + self.Bind(wx.EVT_MENU, self.OnRemoveResourceMenu, id=new_id) + self.PopupMenu(menu) + elif type == ITEM_UNEDITABLE: + if name == "Data Types": + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add DataType") + self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id) + self.PopupMenu(menu) + elif name in ["Functions", "Function Blocks", "Programs"]: + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Pou") + self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id) + self.PopupMenu(menu) + elif name == "Configurations": + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Configuration") + self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id) + self.PopupMenu(menu) + elif name == "Transitions": + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition") + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) + while parent_type != ITEM_POU: + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) + self.PopupMenu(menu) + elif name == "Actions": + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action") + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) + while parent_type != ITEM_POU: + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id) + self.PopupMenu(menu) + elif name == "Resources": + menu = wx.Menu(title='') + new_id = wx.NewId() + AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource") + parent = self.ProjectTree.GetItemParent(item) + parent_type = self.ProjectTree.GetPyData(parent) + while parent_type != ITEM_CONFIGURATION: + parent = self.ProjectTree.GetItemParent(parent) + parent_type = self.ProjectTree.GetPyData(parent) + self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(self.ProjectTree.GetItemText(parent)), id=new_id) + self.PopupMenu(menu) + event.Skip() + + +#------------------------------------------------------------------------------- +# ToolBar Management Functions +#------------------------------------------------------------------------------- + def ResetToolBar(self): for item in self.CurrentToolBar: if wx.VERSION >= (2, 6, 0): @@ -1465,71 +1538,164 @@ self.CurrentLanguage = language self.ResetCurrentMode() - def RefreshPageTitles(self): - for idx in xrange(self.GetPageCount()): - window = self.GetPage(idx) - words = window.GetTagName().split("::") - self.SetPageText(idx, "-".join(words[1:])) - - def OnRefreshMenu(self, event): + +#------------------------------------------------------------------------------- +# Tool Bar Items Functions +#------------------------------------------------------------------------------- + + def ResetCurrentMode(self): selected = self.GetPageSelection() if selected != -1: window = self.GetPage(selected) - window.RefreshView() - self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) - event.Skip() - - def OnUndoMenu(self, event): - self.Controler.LoadPrevious() + window.SetMode(MODE_SELECTION) + if wx.VERSION < (2, 8, 0): + ToolBar = self.ToolBar + else: + ToolBar = self.Panes["ToolBar"] + if ToolBar: + ToolBar.ToggleTool(ID_PLCOPENEDITORTOOLBARSELECTION, True) + + def ResetToolToggle(self, id): + if wx.VERSION < (2, 8, 0): + tool = self.ToolBar.FindById(id) + else: + tool = self.Panes["ToolBar"].FindById(id) + tool.SetToggle(False) + + def OnSelectionTool(self, event): selected = self.GetPageSelection() if selected != -1: - window = self.GetPage(selected) - window.RefreshView() - self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - event.Skip() - - def OnRedoMenu(self, event): - self.Controler.LoadNext() + self.GetPage(selected).SetMode(MODE_SELECTION) + event.Skip() + + def OnCommentTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOMMENT) selected = self.GetPageSelection() if selected != -1: - window = self.GetPage(selected) - window.RefreshView() - self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName()) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - event.Skip() - - def OnCutMenu(self, event): + self.GetPage(selected).SetMode(MODE_COMMENT) + event.Skip() + + def OnVariableTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARVARIABLE) selected = self.GetPageSelection() if selected != -1: - try: - self.GetPage(selected).Cut() - except: - pass - event.Skip() - - def OnCopyMenu(self, event): + self.GetPage(selected).SetMode(MODE_VARIABLE) + event.Skip() + + def OnBlockTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARBLOCK) selected = self.GetPageSelection() if selected != -1: - try: - self.GetPage(selected).Copy() - except: - pass - event.Skip() - - def OnPasteMenu(self, event): + self.GetPage(selected).SetMode(MODE_BLOCK) + event.Skip() + + def OnConnectionTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONNECTION) selected = self.GetPageSelection() if selected != -1: - try: - self.GetPage(selected).Paste() - except: - pass - event.Skip() - + self.GetPage(selected).SetMode(MODE_CONNECTION) + event.Skip() + + def OnPowerRailTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARPOWERRAIL) + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).SetMode(MODE_POWERRAIL) + event.Skip() + + def OnRungTool(self, event): + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).AddLadderRung() + event.Skip() + + def OnCoilTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCOIL) + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).SetMode(MODE_COIL) + event.Skip() + + def OnContactTool(self, event): + if self.DrawingMode == FREEDRAWING_MODE: + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARCONTACT) + selected = self.GetPageSelection() + if selected != -1: + if self.DrawingMode == FREEDRAWING_MODE: + self.GetPage(selected).SetMode(MODE_CONTACT) + else: + self.GetPage(selected).AddLadderContact() + event.Skip() + + def OnBranchTool(self, event): + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).AddLadderBranch() + event.Skip() + + def OnInitialStepTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARINITIALSTEP) + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).SetMode(MODE_INITIALSTEP) + event.Skip() + + def OnStepTool(self, event): + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARSTEP) + selected = self.GetPageSelection() + if selected != -1: + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.GetPage(selected).SetMode(MODE_STEP) + else: + self.GetPage(selected).AddStep() + event.Skip() + + def OnActionBlockTool(self, event): + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARACTIONBLOCK) + selected = self.GetPageSelection() + if selected != -1: + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.GetPage(selected).SetMode(MODE_ACTION) + else: + self.GetPage(selected).AddStepAction() + event.Skip() + + def OnTransitionTool(self, event): + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARTRANSITION) + selected = self.GetPageSelection() + if selected != -1: + self.GetPage(selected).SetMode(MODE_TRANSITION) + event.Skip() + + def OnDivergenceTool(self, event): + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARDIVERGENCE) + selected = self.GetPageSelection() + if selected != -1: + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.GetPage(selected).SetMode(MODE_DIVERGENCE) + else: + self.GetPage(selected).AddDivergence() + event.Skip() + + def OnJumpTool(self, event): + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.ResetToolToggle(ID_PLCOPENEDITORTOOLBARJUMP) + selected = self.GetPageSelection() + if selected != -1: + if self.GetDrawingMode() == FREEDRAWING_MODE: + self.GetPage(selected).SetMode(MODE_JUMP) + else: + self.GetPage(selected).AddJump() + event.Skip() + + +#------------------------------------------------------------------------------- +# Add Project Elements Functions +#------------------------------------------------------------------------------- + def OnAddDataTypeMenu(self, event): dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL) dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames()) @@ -1540,62 +1706,51 @@ self.RefreshProjectTree() dialog.Destroy() event.Skip() - - def OnRemoveDataTypeMenu(self, event): - datatypes = self.Controler.GetProjectDataTypeNames() - dialog = wx.SingleChoiceDialog(self, "Select Data Type to remove:", "Data Type Remove", datatypes, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - selected = dialog.GetStringSelection() - if not self.Controler.DataTypeIsUsed(selected): - self.Controler.ProjectRemoveDataType(selected) - tagname = self.Controler.ComputeDataTypeName(selected) - idx = self.IsOpened(tagname) - if idx is not None: - self.DeletePage(idx) + + def GenerateAddPouFunction(self, pou_type): + def OnAddPouMenu(event): + dialog = PouDialog(self, pou_type) + dialog.SetPouNames(self.Controler.GetProjectPouNames()) + dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) + if dialog.ShowModal() == wx.ID_OK: + values = dialog.GetValues() + self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) self.RefreshTitle() self.RefreshEditMenu() self.RefreshProjectTree() - self.RefreshToolBar() - else: - message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) - message.ShowModal() - message.Destroy() - event.Skip() - - def OnAddPouMenu(self, event): - dialog = PouDialog(self) - dialog.SetPouNames(self.Controler.GetProjectPouNames()) - dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) - if dialog.ShowModal() == wx.ID_OK: - values = dialog.GetValues() - self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnRemovePouMenu(self, event): - pous = self.Controler.GetProjectPouNames() - dialog = wx.SingleChoiceDialog(self, "Select POU to remove:", "POU Remove", pous, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - selected = dialog.GetStringSelection() - if not self.Controler.PouIsUsed(selected): - self.Controler.ProjectRemovePou(selected) - tagname = self.Controler.ComputePouName(selected) - idx = self.IsOpened(tagname) - if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName()) - self.DeletePage(idx) + dialog.Destroy() + event.Skip() + return OnAddPouMenu + + def GenerateAddTransitionFunction(self, pou_name): + def OnAddTransitionMenu(event): + dialog = PouTransitionDialog(self) + dialog.SetPouNames(self.Controler.GetProjectPouNames()) + dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name)) + if dialog.ShowModal() == wx.ID_OK: + values = dialog.GetValues() + self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"]) self.RefreshTitle() self.RefreshEditMenu() self.RefreshProjectTree() - self.RefreshToolBar() - else: - message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) - message.ShowModal() - message.Destroy() - event.Skip() + dialog.Destroy() + event.Skip() + return OnAddTransitionMenu + + def GenerateAddActionFunction(self, pou_name): + def OnAddActionMenu(event): + dialog = PouActionDialog(self) + dialog.SetPouNames(self.Controler.GetProjectPouNames()) + dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name)) + if dialog.ShowModal() == wx.ID_OK: + values = dialog.GetValues() + self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"]) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + dialog.Destroy() + event.Skip() + return OnAddActionMenu def OnAddConfigurationMenu(self, event): dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration") @@ -1610,136 +1765,143 @@ dialog.Destroy() event.Skip() - def OnRemoveConfigurationMenu(self, event): - configs = self.Controler.GetProjectConfigNames() - dialog = wx.SingleChoiceDialog(self, "Please select a configuration", "Remove configuration", configs, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - selected = dialog.GetStringSelection() - self.Controler.ProjectRemoveConfiguration(selected) - tagname = self.Controler.ComputeConfigurationName(selected) - idx = self.IsOpened(tagname) - if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName()) - self.DeletePage(idx) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - event.Skip() - - def OnAddPouTransitionMenu(self, event): - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: - pouname = self.ProjectTree.GetItemText(selected) - if self.Controler.GetPouBodyType(pouname) == "SFC": - dialog = PouTransitionDialog(self) - dialog.SetPouNames(self.Controler.GetProjectPouNames()) - dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname)) - if dialog.ShowModal() == wx.ID_OK: - values = dialog.GetValues() - self.Controler.ProjectAddPouTransition(pouname, values["transitionName"], values["language"]) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnRemovePouTransitionMenu(self, event): - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: - pouname = self.ProjectTree.GetItemText(selected) - if self.Controler.GetPouBodyType(pouname) == "SFC": - transitions = self.Controler.GetPouTransitions(pouname) - dialog = wx.SingleChoiceDialog(self, "Select Transition to remove:", "Remove transition", transitions, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - selected = dialog.GetStringSelection() - self.Controler.ProjectRemovePouTransition(pouname, selected) - tagname = self.Controler.ComputePouTransitionName(pouname, selected) - idx = self.IsOpened(tagname) - if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName()) - self.DeletePage(idx) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnAddPouActionMenu(self, event): - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: - pouname = self.ProjectTree.GetItemText(selected) - if self.Controler.GetPouBodyType(pouname) == "SFC": - dialog = PouActionDialog(self) - dialog.SetPouNames(self.Controler.GetProjectPouNames()) - dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pouname)) - if dialog.ShowModal() == wx.ID_OK: - values = dialog.GetValues() - self.Controler.ProjectAddPouAction(pouname, values["actionName"], values["language"]) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnRemovePouActionMenu(self, event): - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_POU: - pouname = self.ProjectTree.GetItemText(selected) - if self.Controler.GetPouBodyType(pouname) == "SFC": - actions = self.Controler.GetPouActions(pouname) - dialog = wx.SingleChoiceDialog(self, "Select Action to remove:", "Remove action", actions, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - selected = dialog.GetStringSelection() - self.Controler.ProjectRemovePouAction(pouname, selected) - tagname = self.Controler.ComputePouActionName(pouname, selected) - idx = self.IsOpened(tagname) - if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName()) - self.DeletePage(idx) - self.RefreshTitle() - self.RefreshEditMenu() - self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnAddResourceMenu(self, event): - selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: - config_name = self.ProjectTree.GetItemText(selected) + def GenerateAddResourceFunction(self, config_name): + def OnAddResourceMenu(self, event): dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource") dialog.SetPouNames(self.Controler.GetProjectPouNames()) dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) if dialog.ShowModal() == wx.ID_OK: value = dialog.GetValue() self.Controler.ProjectAddConfigurationResource(config_name, value) - tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + dialog.Destroy() + event.Skip() + return OnAddResourceMenu + + +#------------------------------------------------------------------------------- +# Remove Project Elements Functions +#------------------------------------------------------------------------------- + + def OnRemoveDataTypeMenu(self, event): + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_DATATYPE: + name = self.ProjectTree.GetItemText(selected) + if not self.Controler.DataTypeIsUsed(name): + self.Controler.ProjectRemoveDataType(name) + tagname = self.Controler.ComputeDataTypeName(name) idx = self.IsOpened(tagname) if idx is not None: - self.VariablePanelIndexer.RemoveVariablePanel(self.GetPage(idx).GetTagName()) self.DeletePage(idx) self.RefreshTitle() self.RefreshEditMenu() self.RefreshProjectTree() - dialog.Destroy() - event.Skip() - - def OnRemoveResourceMenu(self, event): + self.RefreshToolBar() + else: + message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) + message.ShowModal() + message.Destroy() + event.Skip() + + def OnRemovePouMenu(self, event): selected = self.ProjectTree.GetSelection() - if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: - config_name = self.ProjectTree.GetItemText(selected) - infos = self.Controler.GetProjectInfos() - resources = [] - for config in infos["configs"]: - if config["name"] == config_name: - resources = config["resources"] - dialog = wx.SingleChoiceDialog(self, "Select Resource to remove:", "Remove resource", resources, wx.OK|wx.CANCEL) - if dialog.ShowModal() == wx.ID_OK: - resource = dialog.GetStringSelection() - self.Controler.ProjectRemoveConfigurationResource(config_name, resource) + if self.ProjectTree.GetPyData(selected) == ITEM_POU: + name = self.ProjectTree.GetItemText(selected) + if not self.Controler.PouIsUsed(name): + self.Controler.ProjectRemovePou(name) + tagname = self.Controler.ComputePouName(name) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) self.RefreshTitle() self.RefreshEditMenu() self.RefreshProjectTree() - dialog.Destroy() + self.RefreshToolBar() + else: + message = wx.MessageDialog(self, "%s is used by one or more POUs. It can't be removed!"%selected, "Error", wx.OK|wx.ICON_ERROR) + message.ShowModal() + message.Destroy() + event.Skip() + + def OnRemoveConfigurationMenu(self, event): + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_CONFIGURATION: + name = self.ProjectTree.GetItemText(selected) + self.Controler.ProjectRemoveConfiguration(name) + tagname = self.Controler.ComputeConfigurationName(name) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + event.Skip() + + def OnRemoveTransitionMenu(self, event): + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_TRANSITION: + transition = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) + while item_type != ITEM_POU: + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + pou_name = self.ProjectTree.GetItemText(item) + self.Controler.ProjectRemovePouTransition(pou_name, transition) + tagname = self.Controler.ComputePouTransitionName(pou_name, transition) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + event.Skip() + + def OnRemoveActionMenu(self, event): + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_ACTION: + transition = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) + while item_type != ITEM_POU: + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + pou_name = self.ProjectTree.GetItemText(item) + self.Controler.ProjectRemovePouAction(pou_name, action) + tagname = self.Controler.ComputePouActionName(pou_name, action) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() + event.Skip() + + def OnRemoveResourceMenu(self, event): + selected = self.ProjectTree.GetSelection() + if self.ProjectTree.GetPyData(selected) == ITEM_RESOURCE: + resource = self.ProjectTree.GetItemText(selected) + item = self.ProjectTree.GetItemParent(selected) + item_type = self.ProjectTree.GetPyData(item) + while item_type != ITEM_CONFIGURATION: + item = self.ProjectTree.GetItemParent(item) + item_type = self.ProjectTree.GetPyData(item) + config_name = self.ProjectTree.GetItemText(item) + self.Controler.ProjectRemoveConfigurationResource(config_name, resource) + tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected) + idx = self.IsOpened(tagname) + if idx is not None: + self.VariablePanelIndexer.RemoveVariablePanel(tagname) + self.DeletePage(idx) + self.RefreshTitle() + self.RefreshEditMenu() + self.RefreshProjectTree() event.Skip() def OnPLCOpenMenu(self, event): @@ -1787,7 +1949,7 @@ def _init_ctrls(self, prnt): wx.Panel.__init__(self, id=ID_SCALINGPANEL, name='ScalingPanel', parent=prnt, pos=wx.Point(0, 0), - size=wx.Size(0, 0), style=0) + size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL) self.staticText1 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT1, label='X Scale:', name='staticText1', parent=self, @@ -2335,11 +2497,13 @@ self._init_sizers() - def __init__(self, parent): + def __init__(self, parent, pou_type = None): self._init_ctrls(parent) - for option in ["function","functionBlock","program"]: + for option in ["function", "functionBlock", "program"]: self.PouType.Append(option) + if pou_type is not None: + self.PouType.SetStringSelection(pou_type) self.RefreshLanguage() self.PouNames = []