X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c15cc56f2d829c87360fdcadd93646c4b991706c..53a118d6fe4ecbeda81c0eb2bef65e204b3588ad:/wxPython/wx/py/shell.py?ds=inline diff --git a/wxPython/wx/py/shell.py b/wxPython/wx/py/shell.py index 6f89357ddd..77963e712f 100644 --- a/wxPython/wx/py/shell.py +++ b/wxPython/wx/py/shell.py @@ -292,6 +292,22 @@ class Shell(editwindow.EditWindow): self.Bind(wx.EVT_CHAR, self.OnChar) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) + # Assign handler for the context menu + self.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu) + self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateUI) + + # Assign handlers for edit events + self.Bind(wx.EVT_MENU, lambda evt: self.Cut(), id=wx.ID_CUT) + self.Bind(wx.EVT_MENU, lambda evt: self.Copy(), id=wx.ID_COPY) + self.Bind(wx.EVT_MENU, lambda evt: self.CopyWithPrompts(), id=frame.ID_COPY_PLUS) + self.Bind(wx.EVT_MENU, lambda evt: self.Paste(), id=wx.ID_PASTE) + self.Bind(wx.EVT_MENU, lambda evt: self.PasteAndRun(), id=frame.ID_PASTE_PLUS) + self.Bind(wx.EVT_MENU, lambda evt: self.SelectAll(), id=wx.ID_SELECTALL) + self.Bind(wx.EVT_MENU, lambda evt: self.Clear(), id=wx.ID_CLEAR) + self.Bind(wx.EVT_MENU, lambda evt: self.Undo(), id=wx.ID_UNDO) + self.Bind(wx.EVT_MENU, lambda evt: self.Redo(), id=wx.ID_REDO) + + # Assign handler for idle time. self.waiting = False self.Bind(wx.EVT_IDLE, self.OnIdle) @@ -343,18 +359,19 @@ class Shell(editwindow.EditWindow): def showIntro(self, text=''): """Display introductory text in the shell.""" if text: - if not text.endswith(os.linesep): - text += os.linesep self.write(text) try: - self.write(self.interp.introText) + if self.interp.introText: + if text and not text.endswith(os.linesep): + self.write(os.linesep) + self.write(self.interp.introText) except AttributeError: pass def setBuiltinKeywords(self): """Create pseudo keywords as part of builtins. - This sets `close`, `exit` and `quit` to a helpful string. + This sets "close", "exit" and "quit" to a helpful string. """ import __builtin__ __builtin__.close = __builtin__.exit = __builtin__.quit = \ @@ -417,7 +434,7 @@ Platform: %s""" % \ # commands/responses. if not self.CanEdit(): return - key = event.KeyCode() + key = event.GetKeyCode() currpos = self.GetCurrentPos() stoppos = self.promptPosEnd # Return (Enter) needs to be ignored in this handler. @@ -452,7 +469,7 @@ Platform: %s""" % \ def OnKeyDown(self, event): """Key down event handler.""" - key = event.KeyCode() + key = event.GetKeyCode() # If the auto-complete window is up let it do its thing. if self.AutoCompActive(): event.Skip() @@ -1366,6 +1383,48 @@ Platform: %s""" % \ config.WriteBool('View/ShowLineNumbers', self.lineNumbers) config.WriteInt('View/Zoom/Shell', self.GetZoom()) + def GetContextMenu(self): + """ + Create and return a context menu for the shell. + This is used instead of the scintilla default menu + in order to correctly respect our immutable buffer. + """ + menu = wx.Menu() + menu.Append(wx.ID_UNDO, "Undo") + menu.Append(wx.ID_REDO, "Redo") + + menu.AppendSeparator() + + menu.Append(wx.ID_CUT, "Cut") + menu.Append(wx.ID_COPY, "Copy") + menu.Append(frame.ID_COPY_PLUS, "Copy Plus") + menu.Append(wx.ID_PASTE, "Paste") + menu.Append(frame.ID_PASTE_PLUS, "Paste Plus") + menu.Append(wx.ID_CLEAR, "Clear") + + menu.AppendSeparator() + + menu.Append(wx.ID_SELECTALL, "Select All") + return menu + + def OnContextMenu(self, evt): + menu = self.GetContextMenu() + self.PopupMenu(menu) + + def OnUpdateUI(self, evt): + id = evt.Id + if id in (wx.ID_CUT, wx.ID_CLEAR): + evt.Enable(self.CanCut()) + elif id in (wx.ID_COPY, frame.ID_COPY_PLUS): + evt.Enable(self.CanCopy()) + elif id in (wx.ID_PASTE, frame.ID_PASTE_PLUS): + evt.Enable(self.CanPaste()) + elif id == wx.ID_UNDO: + evt.Enable(self.CanUndo()) + elif id == wx.ID_REDO: + evt.Enable(self.CanRedo()) + + ## NOTE: The DnD of file names is disabled until I can figure out how