]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/wx/py/interpreter.py
wxCheckListBox doesn't require wxUSE_OWNER_DRAWN when using WXUNIVERSAL
[wxWidgets.git] / wxPython / wx / py / interpreter.py
index 38c4120efa7947a75ae3bf42481084b03c03071e..112344ad3f6015915ba18fa00090f77f54aac286 100644 (file)
@@ -1,8 +1,126 @@
+"""Interpreter executes Python commands."""
 
 
-"""Renamer stub: provides a way to drop the wx prefix from wxPython objects."""
+__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
+__cvsid__ = "$Id$"
+__revision__ = "$Revision$"[11:-2]
 
 
-from wx import _rename
-from wxPython.py import interpreter
-_rename(globals(), interpreter.__dict__, modulename='py.interpreter')
-del interpreter
-del _rename
+import os
+import sys
+from code import InteractiveInterpreter
+import dispatcher
+import introspect
+import wx
+
+class Interpreter(InteractiveInterpreter):
+    """Interpreter based on code.InteractiveInterpreter."""
+    
+    revision = __revision__
+    
+    def __init__(self, locals=None, rawin=None, 
+                 stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr):
+        """Create an interactive interpreter object."""
+        InteractiveInterpreter.__init__(self, locals=locals)
+        self.stdin = stdin
+        self.stdout = stdout
+        self.stderr = stderr
+        if rawin:
+            import __builtin__
+            __builtin__.raw_input = rawin
+            del __builtin__
+        copyright = 'Type "help", "copyright", "credits" or "license"'
+        copyright += ' for more information.'
+        self.introText = 'Python %s on %s%s%s' % \
+                         (sys.version, sys.platform, os.linesep, copyright)
+        try:
+            sys.ps1
+        except AttributeError:
+            sys.ps1 = '>>> '
+        try:
+            sys.ps2
+        except AttributeError:
+            sys.ps2 = '... '
+        self.more = 0
+        # List of lists to support recursive push().
+        self.commandBuffer = []
+        self.startupScript = os.environ.get('PYTHONSTARTUP')
+
+    def push(self, command):
+        """Send command to the interpreter to be executed.
+        
+        Because this may be called recursively, we append a new list
+        onto the commandBuffer list and then append commands into
+        that.  If the passed in command is part of a multi-line
+        command we keep appending the pieces to the last list in
+        commandBuffer until we have a complete command. If not, we
+        delete that last list."""
+
+        # In case the command is unicode try encoding it
+        if type(command) == unicode:
+            try:
+                command = command.encode(wx.GetDefaultPyEncoding())
+            except UnicodeEncodeError:
+                pass # otherwise leave it alone
+                
+        if not self.more:
+            try: del self.commandBuffer[-1]
+            except IndexError: pass
+        if not self.more: self.commandBuffer.append([])
+        self.commandBuffer[-1].append(command)
+        source = '\n'.join(self.commandBuffer[-1])
+        more = self.more = self.runsource(source)
+        dispatcher.send(signal='Interpreter.push', sender=self,
+                        command=command, more=more, source=source)
+        return more
+        
+    def runsource(self, source):
+        """Compile and run source code in the interpreter."""
+        stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
+        sys.stdin, sys.stdout, sys.stderr = \
+                   self.stdin, self.stdout, self.stderr
+        more = InteractiveInterpreter.runsource(self, source)
+        # If sys.std* is still what we set it to, then restore it.
+        # But, if the executed source changed sys.std*, assume it was
+        # meant to be changed and leave it. Power to the people.
+        if sys.stdin == self.stdin:
+            sys.stdin = stdin
+        if sys.stdout == self.stdout:
+            sys.stdout = stdout
+        if sys.stderr == self.stderr:
+            sys.stderr = stderr
+        return more
+        
+    def getAutoCompleteKeys(self):
+        """Return list of auto-completion keycodes."""
+        return [ord('.')]
+
+    def getAutoCompleteList(self, command='', *args, **kwds):
+        """Return list of auto-completion options for a command.
+        
+        The list of options will be based on the locals namespace."""
+        stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
+        sys.stdin, sys.stdout, sys.stderr = \
+                   self.stdin, self.stdout, self.stderr
+        l = introspect.getAutoCompleteList(command, self.locals,
+                                           *args, **kwds)
+        sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr
+        return l
+
+    def getCallTip(self, command='', *args, **kwds):
+        """Return call tip text for a command.
+        
+        Call tip information will be based on the locals namespace."""
+        return introspect.getCallTip(command, self.locals, *args, **kwds)
+
+
+class InterpreterAlaCarte(Interpreter):
+    """Demo Interpreter."""
+    
+    def __init__(self, locals, rawin, stdin, stdout, stderr, 
+                 ps1='main prompt', ps2='continuation prompt'):
+        """Create an interactive interpreter object."""
+        Interpreter.__init__(self, locals=locals, rawin=rawin, 
+                             stdin=stdin, stdout=stdout, stderr=stderr)
+        sys.ps1 = ps1
+        sys.ps2 = ps2
+
+