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]
 |