def __init__(self, parent, wId,): wx.stc.StyledTextCtrl.__init__(self, parent, wId, style = wx.CLIP_CHILDREN | wx.SUNKEN_BORDER) StyledTextCtrls.CallTipCodeHelpSTCMix.__init__(self) StyledTextCtrls.AutoCompleteCodeHelpSTCMix.__init__(self) StyledTextCtrls.PythonStyledTextCtrlMix.__init__(self, wId, ()) self.lines = StyledTextCtrls.STCLinesList(self) self.interp = PythonInterpreter() #This line makes it self aware self.interp.locals=locals() self.lastResult = '' self.CallTipSetBackground(wx.Colour(255, 255, 232)) self.SetWrapMode(1) self.bindShortcuts() self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.stc.EVT_STC_CHARADDED, self.OnAddChar, id=wId) self.Bind(wx.EVT_MENU, self.OnHistoryUp, id=wxID_SHELL_HISTORYUP) self.Bind(wx.EVT_MENU, self.OnHistoryDown, id=wxID_SHELL_HISTORYDOWN) #self.Bind(EVT_MENU, self.OnShellEnter, id=wxID_SHELL_ENTER) self.Bind(wx.EVT_MENU, self.OnShellHome, id=wxID_SHELL_HOME) self.Bind(wx.EVT_MENU, self.OnShellCodeComplete, id=wxID_SHELL_CODECOMP) self.Bind(wx.EVT_MENU, self.OnShellCallTips, id=wxID_SHELL_CALLTIPS) self.history = [] self.historyIndex = 1 self.buffer = [] self.stdout = PseudoFileOut(self) self.stderr = PseudoFileErr(self) self.stdin = PseudoFileIn(self, self.buffer) self._debugger = None if sys.hexversion < 0x01060000: copyright = sys.copyright else: copyright = p2c import Boa.__version__ as __version__ self.AddText('# Python %s\n# wxPython %s, Boa Constructor %s\n# %s'%( sys.version, wx.__version__, __version__.version, copyright)) #return so it looks right self.pushLine('','\n') self.LineScroll(-10, 0) self.SetSavePoint()
def __init__( self, parent, wId, ): wx.stc.StyledTextCtrl.__init__(self, parent, wId, style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER) StyledTextCtrls.CallTipCodeHelpSTCMix.__init__(self) StyledTextCtrls.AutoCompleteCodeHelpSTCMix.__init__(self) StyledTextCtrls.PythonStyledTextCtrlMix.__init__(self, wId, ()) self.lines = StyledTextCtrls.STCLinesList(self) self.interp = PythonInterpreter() #This line makes it self aware self.interp.locals = locals() self.lastResult = '' self.CallTipSetBackground(wx.Colour(255, 255, 232)) self.SetWrapMode(1) self.bindShortcuts() self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.stc.EVT_STC_CHARADDED, self.OnAddChar, id=wId) self.Bind(wx.EVT_MENU, self.OnHistoryUp, id=wxID_SHELL_HISTORYUP) self.Bind(wx.EVT_MENU, self.OnHistoryDown, id=wxID_SHELL_HISTORYDOWN) #self.Bind(EVT_MENU, self.OnShellEnter, id=wxID_SHELL_ENTER) self.Bind(wx.EVT_MENU, self.OnShellHome, id=wxID_SHELL_HOME) self.Bind(wx.EVT_MENU, self.OnShellCodeComplete, id=wxID_SHELL_CODECOMP) self.Bind(wx.EVT_MENU, self.OnShellCallTips, id=wxID_SHELL_CALLTIPS) self.history = [] self.historyIndex = 1 self.buffer = [] self.stdout = PseudoFileOut(self) self.stderr = PseudoFileErr(self) self.stdin = PseudoFileIn(self, self.buffer) self._debugger = None if sys.hexversion < 0x01060000: copyright = sys.copyright else: copyright = p2c import Boa.__version__ as __version__ self.AddText( '# Python %s\n# wxPython %s, Boa Constructor %s\n# %s' % (sys.version, wx.__version__, __version__.version, copyright)) #return so it looks right self.pushLine('', '\n') self.LineScroll(-10, 0) self.SetSavePoint()
class ShellEditor(wx.stc.StyledTextCtrl, StyledTextCtrls.PythonStyledTextCtrlMix, StyledTextCtrls.AutoCompleteCodeHelpSTCMix, StyledTextCtrls.CallTipCodeHelpSTCMix): def __init__(self, parent, wId,): wx.stc.StyledTextCtrl.__init__(self, parent, wId, style = wx.CLIP_CHILDREN | wx.SUNKEN_BORDER) StyledTextCtrls.CallTipCodeHelpSTCMix.__init__(self) StyledTextCtrls.AutoCompleteCodeHelpSTCMix.__init__(self) StyledTextCtrls.PythonStyledTextCtrlMix.__init__(self, wId, ()) self.lines = StyledTextCtrls.STCLinesList(self) self.interp = PythonInterpreter() #This line makes it self aware self.interp.locals=locals() self.lastResult = '' self.CallTipSetBackground(wx.Colour(255, 255, 232)) self.SetWrapMode(1) self.bindShortcuts() self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.stc.EVT_STC_CHARADDED, self.OnAddChar, id=wId) self.Bind(wx.EVT_MENU, self.OnHistoryUp, id=wxID_SHELL_HISTORYUP) self.Bind(wx.EVT_MENU, self.OnHistoryDown, id=wxID_SHELL_HISTORYDOWN) #self.Bind(EVT_MENU, self.OnShellEnter, id=wxID_SHELL_ENTER) self.Bind(wx.EVT_MENU, self.OnShellHome, id=wxID_SHELL_HOME) self.Bind(wx.EVT_MENU, self.OnShellCodeComplete, id=wxID_SHELL_CODECOMP) self.Bind(wx.EVT_MENU, self.OnShellCallTips, id=wxID_SHELL_CALLTIPS) self.history = [] self.historyIndex = 1 self.buffer = [] self.stdout = PseudoFileOut(self) self.stderr = PseudoFileErr(self) self.stdin = PseudoFileIn(self, self.buffer) self._debugger = None if sys.hexversion < 0x01060000: copyright = sys.copyright else: copyright = p2c import Boa.__version__ as __version__ self.AddText('# Python %s\n# wxPython %s, Boa Constructor %s\n# %s'%( sys.version, wx.__version__, __version__.version, copyright)) #return so it looks right self.pushLine('','\n') self.LineScroll(-10, 0) self.SetSavePoint() def destroy(self): if self.stdin.isreading(): self.stdin.kill() del self.lines del self.stdout del self.stderr del self.stdin del self.interp def bindShortcuts(self): # dictionnary of shortcuts: (MOD, KEY) -> function self.sc = {} self.sc[(keyDefs['HistoryUp'][0], keyDefs['HistoryUp'][1])] = self.OnHistoryUp self.sc[(keyDefs['HistoryDown'][0], keyDefs['HistoryDown'][1])] = self.OnHistoryDown self.sc[(keyDefs['CodeComplete'][0], keyDefs['CodeComplete'][1])] = self.OnShellCodeComplete self.sc[(keyDefs['CallTips'][0], keyDefs['CallTips'][1])] = self.OnShellCallTips def execStartupScript(self, startupfile): if startupfile: startuptext = '## Startup script: ' + startupfile self.pushLine('print %s;execfile(%s)'%(`startuptext`, `startupfile`)) else: self.pushLine('') def debugShell(self, doDebug, debugger): if doDebug: self._debugger = debugger self.stdout.write('\n## Debug mode turned on.') self.pushLine('print "?"') else: self._debugger = None self.pushLine('print "## Debug mode turned %s."'% (doDebug and 'on' or 'off')) def OnUpdateUI(self, event): if Preferences.braceHighLight: StyledTextCtrls.PythonStyledTextCtrlMix.OnUpdateUI(self, event) def getHistoryInfo(self): lineNo = self.GetCurrentLine() if self.history and self.GetLineCount()-1 == lineNo: pos = self.PositionFromLine(lineNo) + 4 endpos = self.GetLineEndPosition(lineNo) return lineNo, pos, endpos else: return None, None, None def OnHistoryUp(self, event): lineNo, pos, endpos = self.getHistoryInfo() if lineNo is not None: if self.historyIndex > 0: self.historyIndex = self.historyIndex -1 self.SetSelection(pos, endpos) self.ReplaceSelection((self.history+[''])[self.historyIndex]) def OnHistoryDown(self, event): lineNo, pos, endpos = self.getHistoryInfo() if lineNo is not None: if self.historyIndex < len(self.history): self.historyIndex = self.historyIndex +1 self.SetSelection(pos, endpos) self.ReplaceSelection((self.history+[''])[self.historyIndex]) def pushLine(self, line, addText=''): """ Interprets a line """ self.AddText(addText+'\n') prompt = '' try: self.stdin.clear() tmpstdout,tmpstderr,tmpstdin = sys.stdout,sys.stderr,sys.stdin #This line prevents redirection from the shell since everytime you #push a line it redefines the stdout, etc. sys.stdout,sys.stderr,sys.stdin = self.stdout,self.stderr,self.stdin self.lastResult = '' if self._debugger: prompt = Preferences.ps3 val = self._debugger.getVarValue(line) if val is not None: print val return False elif self.interp.push(line): prompt = Preferences.ps2 self.stdout.fin(); self.stderr.fin() return True else: # check if already destroyed if not hasattr(self, 'stdin'): return False prompt = Preferences.ps1 self.stdout.fin(); self.stderr.fin() return False finally: # This reasigns the stdout and stdin sys.stdout,sys.stderr,sys.stdin = tmpstdout,tmpstderr,tmpstdin if prompt: self.AddText(prompt) self.EnsureCaretVisible() def getShellLocals(self): return self.interp.locals def OnShellEnter(self, event): self.BeginUndoAction() try: if self.CallTipActive(): self.CallTipCancel() lc = self.GetLineCount() cl = self.GetCurrentLine() ct = self.GetCurLine()[0] line = ct[4:].rstrip() self.SetCurrentPos(self.GetTextLength()) #ll = self.GetCurrentLine() # bottom line, process the line if cl == lc -1: if self.stdin.isreading(): self.AddText('\n') self.buffer.append(line) return # Auto indent if self.pushLine(line): self.doAutoIndent(line, self.GetCurrentPos()) # Manage history if line.strip() and (self.history and self.history[-1] != line or not self.history): self.history.append(line) self.historyIndex = len(self.history) # Other lines, copy the line to the bottom line else: self.SetSelection(self.PositionFromLine(self.GetCurrentLine()), self.GetTextLength()) #self.lines.select(self.lines.current) self.ReplaceSelection(ct.rstrip()) finally: self.EndUndoAction() #event.Skip() def getCodeCompOptions(self, word, rootWord, matchWord, lnNo): if not rootWord: return self.interp.locals.keys() + __builtins__.keys() + keyword.kwlist else: try: obj = eval(rootWord, self.interp.locals) except Exception, error: return [] else: try: return recdir(obj) except Exception, err: return []
class ShellEditor(wx.stc.StyledTextCtrl, StyledTextCtrls.PythonStyledTextCtrlMix, StyledTextCtrls.AutoCompleteCodeHelpSTCMix, StyledTextCtrls.CallTipCodeHelpSTCMix): def __init__( self, parent, wId, ): wx.stc.StyledTextCtrl.__init__(self, parent, wId, style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER) StyledTextCtrls.CallTipCodeHelpSTCMix.__init__(self) StyledTextCtrls.AutoCompleteCodeHelpSTCMix.__init__(self) StyledTextCtrls.PythonStyledTextCtrlMix.__init__(self, wId, ()) self.lines = StyledTextCtrls.STCLinesList(self) self.interp = PythonInterpreter() #This line makes it self aware self.interp.locals = locals() self.lastResult = '' self.CallTipSetBackground(wx.Colour(255, 255, 232)) self.SetWrapMode(1) self.bindShortcuts() self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) self.Bind(wx.stc.EVT_STC_CHARADDED, self.OnAddChar, id=wId) self.Bind(wx.EVT_MENU, self.OnHistoryUp, id=wxID_SHELL_HISTORYUP) self.Bind(wx.EVT_MENU, self.OnHistoryDown, id=wxID_SHELL_HISTORYDOWN) #self.Bind(EVT_MENU, self.OnShellEnter, id=wxID_SHELL_ENTER) self.Bind(wx.EVT_MENU, self.OnShellHome, id=wxID_SHELL_HOME) self.Bind(wx.EVT_MENU, self.OnShellCodeComplete, id=wxID_SHELL_CODECOMP) self.Bind(wx.EVT_MENU, self.OnShellCallTips, id=wxID_SHELL_CALLTIPS) self.history = [] self.historyIndex = 1 self.buffer = [] self.stdout = PseudoFileOut(self) self.stderr = PseudoFileErr(self) self.stdin = PseudoFileIn(self, self.buffer) self._debugger = None if sys.hexversion < 0x01060000: copyright = sys.copyright else: copyright = p2c import Boa.__version__ as __version__ self.AddText( '# Python %s\n# wxPython %s, Boa Constructor %s\n# %s' % (sys.version, wx.__version__, __version__.version, copyright)) #return so it looks right self.pushLine('', '\n') self.LineScroll(-10, 0) self.SetSavePoint() def destroy(self): if self.stdin.isreading(): self.stdin.kill() del self.lines del self.stdout del self.stderr del self.stdin del self.interp def bindShortcuts(self): # dictionnary of shortcuts: (MOD, KEY) -> function self.sc = {} self.sc[(keyDefs['HistoryUp'][0], keyDefs['HistoryUp'][1])] = self.OnHistoryUp self.sc[(keyDefs['HistoryDown'][0], keyDefs['HistoryDown'][1])] = self.OnHistoryDown self.sc[(keyDefs['CodeComplete'][0], keyDefs['CodeComplete'][1])] = self.OnShellCodeComplete self.sc[(keyDefs['CallTips'][0], keyDefs['CallTips'][1])] = self.OnShellCallTips def execStartupScript(self, startupfile): if startupfile: startuptext = '## Startup script: ' + startupfile self.pushLine('print %s;execfile(%s)' % ( ` startuptext `, ` startupfile `)) else: self.pushLine('') def debugShell(self, doDebug, debugger): if doDebug: self._debugger = debugger self.stdout.write('\n## Debug mode turned on.') self.pushLine('print "?"') else: self._debugger = None self.pushLine('print "## Debug mode turned %s."' % (doDebug and 'on' or 'off')) def OnUpdateUI(self, event): if Preferences.braceHighLight: StyledTextCtrls.PythonStyledTextCtrlMix.OnUpdateUI(self, event) def getHistoryInfo(self): lineNo = self.GetCurrentLine() if self.history and self.GetLineCount() - 1 == lineNo: pos = self.PositionFromLine(lineNo) + 4 endpos = self.GetLineEndPosition(lineNo) return lineNo, pos, endpos else: return None, None, None def OnHistoryUp(self, event): lineNo, pos, endpos = self.getHistoryInfo() if lineNo is not None: if self.historyIndex > 0: self.historyIndex = self.historyIndex - 1 self.SetSelection(pos, endpos) self.ReplaceSelection((self.history + [''])[self.historyIndex]) def OnHistoryDown(self, event): lineNo, pos, endpos = self.getHistoryInfo() if lineNo is not None: if self.historyIndex < len(self.history): self.historyIndex = self.historyIndex + 1 self.SetSelection(pos, endpos) self.ReplaceSelection((self.history + [''])[self.historyIndex]) def pushLine(self, line, addText=''): """ Interprets a line """ self.AddText(addText + '\n') prompt = '' try: self.stdin.clear() tmpstdout, tmpstderr, tmpstdin = sys.stdout, sys.stderr, sys.stdin #This line prevents redirection from the shell since everytime you #push a line it redefines the stdout, etc. sys.stdout, sys.stderr, sys.stdin = self.stdout, self.stderr, self.stdin self.lastResult = '' if self._debugger: prompt = Preferences.ps3 val = self._debugger.getVarValue(line) if val is not None: print val return False elif self.interp.push(line): prompt = Preferences.ps2 self.stdout.fin() self.stderr.fin() return True else: # check if already destroyed if not hasattr(self, 'stdin'): return False prompt = Preferences.ps1 self.stdout.fin() self.stderr.fin() return False finally: # This reasigns the stdout and stdin sys.stdout, sys.stderr, sys.stdin = tmpstdout, tmpstderr, tmpstdin if prompt: self.AddText(prompt) self.EnsureCaretVisible() def getShellLocals(self): return self.interp.locals def OnShellEnter(self, event): self.BeginUndoAction() try: if self.CallTipActive(): self.CallTipCancel() lc = self.GetLineCount() cl = self.GetCurrentLine() ct = self.GetCurLine()[0] line = ct[4:].rstrip() self.SetCurrentPos(self.GetTextLength()) #ll = self.GetCurrentLine() # bottom line, process the line if cl == lc - 1: if self.stdin.isreading(): self.AddText('\n') self.buffer.append(line) return # Auto indent if self.pushLine(line): self.doAutoIndent(line, self.GetCurrentPos()) # Manage history if line.strip() and (self.history and self.history[-1] != line or not self.history): self.history.append(line) self.historyIndex = len(self.history) # Other lines, copy the line to the bottom line else: self.SetSelection(self.PositionFromLine(self.GetCurrentLine()), self.GetTextLength()) #self.lines.select(self.lines.current) self.ReplaceSelection(ct.rstrip()) finally: self.EndUndoAction() #event.Skip() def getCodeCompOptions(self, word, rootWord, matchWord, lnNo): if not rootWord: return self.interp.locals.keys() + __builtins__.keys( ) + keyword.kwlist else: try: obj = eval(rootWord, self.interp.locals) except Exception, error: return [] else: