git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25782 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Buffer class."""
 | 
						|
 | 
						|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
 | 
						|
__cvsid__ = "$Id$"
 | 
						|
__revision__ = "$Revision$"[11:-2]
 | 
						|
 | 
						|
from interpreter import Interpreter
 | 
						|
import imp
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
import document
 | 
						|
 | 
						|
 | 
						|
class Buffer:
 | 
						|
    """Buffer class."""
 | 
						|
 | 
						|
    id = 0
 | 
						|
 | 
						|
    def __init__(self, filename=None):
 | 
						|
        """Create a Buffer instance."""
 | 
						|
        Buffer.id += 1
 | 
						|
        self.id = Buffer.id
 | 
						|
        self.interp = Interpreter(locals={})
 | 
						|
        self.name = ''
 | 
						|
        self.editors = {}
 | 
						|
        self.editor = None
 | 
						|
        self.modules = sys.modules.keys()
 | 
						|
        self.syspath = sys.path[:]
 | 
						|
        while True:
 | 
						|
            try:
 | 
						|
                self.syspath.remove('')
 | 
						|
            except ValueError:
 | 
						|
                break
 | 
						|
        while True:
 | 
						|
            try:
 | 
						|
                self.syspath.remove('.')
 | 
						|
            except ValueError:
 | 
						|
                break
 | 
						|
        self.open(filename)
 | 
						|
 | 
						|
    def addEditor(self, editor):
 | 
						|
        """Add an editor."""
 | 
						|
        self.editor = editor
 | 
						|
        self.editors[editor.id] = editor
 | 
						|
 | 
						|
    def hasChanged(self):
 | 
						|
        """Return True if text in editor has changed since last save."""
 | 
						|
        if self.editor:
 | 
						|
            return self.editor.hasChanged()
 | 
						|
        else:
 | 
						|
            return False
 | 
						|
 | 
						|
    def new(self, filepath):
 | 
						|
        """New empty buffer."""
 | 
						|
        if not filepath:
 | 
						|
            return
 | 
						|
        if os.path.exists(filepath):
 | 
						|
            self.confirmed = self.overwriteConfirm(filepath)
 | 
						|
        else:
 | 
						|
            self.confirmed = True
 | 
						|
 | 
						|
    def open(self, filename):
 | 
						|
        """Open file into buffer."""
 | 
						|
        self.doc = document.Document(filename)
 | 
						|
        self.name = self.doc.filename or ('Untitled:' + str(self.id))
 | 
						|
        self.modulename = self.doc.filebase
 | 
						|
        # XXX This should really make sure filedir is first item in syspath.
 | 
						|
        # XXX Or maybe this should be moved to the update namespace method.
 | 
						|
        if self.doc.filedir and self.doc.filedir not in self.syspath:
 | 
						|
            # To create the proper context for updateNamespace.
 | 
						|
            self.syspath.insert(0, self.doc.filedir)
 | 
						|
        if self.doc.filepath and os.path.exists(self.doc.filepath):
 | 
						|
            self.confirmed = True
 | 
						|
        if self.editor:
 | 
						|
            text = self.doc.read()
 | 
						|
            self.editor._setBuffer(buffer=self, text=text)
 | 
						|
 | 
						|
    def overwriteConfirm(filepath):
 | 
						|
        """Confirm overwriting an existing file."""
 | 
						|
        return False
 | 
						|
 | 
						|
    def save(self):
 | 
						|
        """Save buffer."""
 | 
						|
        filepath = self.doc.filepath
 | 
						|
        if not filepath:
 | 
						|
            return  # XXX Get filename
 | 
						|
        if not os.path.exists(filepath):
 | 
						|
            self.confirmed = True
 | 
						|
        if not self.confirmed:
 | 
						|
            self.confirmed = self.overwriteConfirm(filepath)
 | 
						|
        if self.confirmed:
 | 
						|
            self.doc.write(self.editor.getText())
 | 
						|
            if self.editor:
 | 
						|
                self.editor.setSavePoint()
 | 
						|
 | 
						|
    def saveAs(self, filename):
 | 
						|
        """Save buffer."""
 | 
						|
        self.doc = document.Document(filename)
 | 
						|
        self.name = self.doc.filename
 | 
						|
        self.modulename = self.doc.filebase
 | 
						|
        self.save()
 | 
						|
 | 
						|
    def updateNamespace(self):
 | 
						|
        """Update the namespace for autocompletion and calltips.
 | 
						|
 | 
						|
        Return True if updated, False if there was an error."""
 | 
						|
        if not self.interp or not hasattr(self.editor, 'getText'):
 | 
						|
            return False
 | 
						|
        syspath = sys.path
 | 
						|
        sys.path = self.syspath
 | 
						|
        text = self.editor.getText()
 | 
						|
        text = text.replace('\r\n', '\n')
 | 
						|
        text = text.replace('\r', '\n')
 | 
						|
        name = self.modulename or self.name
 | 
						|
        module = imp.new_module(name)
 | 
						|
        newspace = module.__dict__.copy()
 | 
						|
        try:
 | 
						|
            try:
 | 
						|
                code = compile(text, name, 'exec')
 | 
						|
            except:
 | 
						|
                raise
 | 
						|
#                return False
 | 
						|
            try:
 | 
						|
                exec code in newspace
 | 
						|
            except:
 | 
						|
                raise
 | 
						|
#                return False
 | 
						|
            else:
 | 
						|
                # No problems, so update the namespace.
 | 
						|
                self.interp.locals.clear()
 | 
						|
                self.interp.locals.update(newspace)
 | 
						|
                return True
 | 
						|
        finally:
 | 
						|
            sys.path = syspath
 | 
						|
            for m in sys.modules.keys():
 | 
						|
                if m not in self.modules:
 | 
						|
                    del sys.modules[m]
 |