##// END OF EJS Templates
Intercept <esc> avoid closing websocket on Firefox...
Intercept <esc> avoid closing websocket on Firefox Closes #1031; closes #1032 (rebased and fixed tiny typo)

File last commit:

r4872:34c10438
r5389:a329ff02
Show More
cocoa_frontend.py
560 lines | 18.1 KiB | text/x-python | PythonLexer
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # encoding: utf-8
Barry Wark
pep8 compliance, first pass
r1291 # -*- test-case-name: IPython.frontend.cocoa.tests.test_cocoa_frontend -*-
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Bernardo B. Marques
remove all trailling spaces
r4872 """PyObjC classes to provide a Cocoa frontend to the
Barry Wark
pep8, second pass
r1292 IPython.kernel.engineservice.IEngineBase.
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Bernardo B. Marques
remove all trailling spaces
r4872 To add an IPython interpreter to a cocoa app, instantiate an
Barry Wark
pep8 compliance, first pass
r1291 IPythonCocoaController in a XIB and connect its textView outlet to an
NSTextView instance in your UI. That's it.
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
pep8 compliance, first pass
r1291 Author: Barry Wark
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
__docformat__ = "restructuredtext en"
Barry Wark
pep8 compliance, first pass
r1291 #-----------------------------------------------------------------------------
# Copyright (C) 2008 The IPython Development Team
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
Barry Wark
pep8 compliance, first pass
r1291 #-----------------------------------------------------------------------------
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
pep8 compliance, first pass
r1291 #-----------------------------------------------------------------------------
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # Imports
Barry Wark
pep8 compliance, first pass
r1291 #-----------------------------------------------------------------------------
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
improved error rendering for cocoa_frontend
r1304 import sys
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 import objc
Gael Varoquaux
Replace all use of the ast module with the codeop module, and all use of...
r1710 from IPython.external import guid
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
from Foundation import NSObject, NSMutableArray, NSMutableDictionary,\
NSLog, NSNotificationCenter, NSMakeRange,\
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 NSLocalizedString, NSIntersectionRange,\
NSString, NSAutoreleasePool
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 from AppKit import NSApplicationWillTerminateNotification, NSBeep,\
NSTextView, NSRulerView, NSVerticalRuler
from pprint import saferepr
Barry Wark
fixed frontendbase.FrontEndBase.is_complete
r1278 import IPython
Barry Wark
pep8, second pass
r1292 from IPython.kernel.engineservice import ThreadedEngineService
Gael Varoquaux
Split the frontend base class in different files and add a base class...
r1355 from IPython.frontend.asyncfrontendbase import AsyncFrontEndBase
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
from twisted.internet.threads import blockingCallFromThread
Barry Wark
added blockID for failures (special case)
r1283 from twisted.python.failure import Failure
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
ready for wrapped_execute
r1321 #-----------------------------------------------------------------------------
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # Classes to implement the Cocoa frontend
Barry Wark
ready for wrapped_execute
r1321 #-----------------------------------------------------------------------------
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Bernardo B. Marques
remove all trailling spaces
r4872 # TODO:
# 1. use MultiEngineClient and out-of-process engine rather than
Barry Wark
pep8 compliance, first pass
r1291 # ThreadedEngineService?
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # 2. integrate Xgrid launching of engines
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 class AutoreleasePoolWrappedThreadedEngineService(ThreadedEngineService):
"""Wrap all blocks in an NSAutoreleasePool"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
improved error rendering for cocoa_frontend
r1304 def wrapped_execute(self, msg, lines):
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 """wrapped_execute"""
Barry Wark
improved error rendering for cocoa_frontend
r1304 try:
p = NSAutoreleasePool.alloc().init()
Barry Wark
ready for wrapped_execute
r1321 result = super(AutoreleasePoolWrappedThreadedEngineService,
self).wrapped_execute(msg, lines)
Barry Wark
improved error rendering for cocoa_frontend
r1304 finally:
p.drain()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Barry Wark
branch to try non-textview
r1323 class Cell(NSObject):
"""
Representation of the prompts, input and output of a cell in the
frontend
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
branch to try non-textview
r1323 blockNumber = objc.ivar().unsigned_long()
blockID = objc.ivar()
inputBlock = objc.ivar()
output = objc.ivar()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 class CellBlock(object):
"""
Storage for information about text ranges relating to a single cell
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 def __init__(self, inputPromptRange, inputRange=None, outputPromptRange=None,
outputRange=None):
super(CellBlock, self).__init__()
self.inputPromptRange = inputPromptRange
self.inputRange = inputRange
self.outputPromptRange = outputPromptRange
self.outputRange = outputRange
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 def update_ranges_for_insertion(self, text, textRange):
"""Update ranges for text insertion at textRange"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 for r in [self.inputPromptRange,self.inputRange,
self.outputPromptRange, self.outputRange]:
if(r == None):
continue
intersection = NSIntersectionRange(r,textRange)
if(intersection.length == 0): #ranges don't intersect
if r.location >= textRange.location:
r.location += len(text)
else: #ranges intersect
if(r.location > textRange.location):
offset = len(text) - intersection.length
r.length -= offset
r.location += offset
elif(r.location == textRange.location):
r.length += len(text) - intersection.length
else:
r.length -= intersection.length
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 def update_ranges_for_deletion(self, textRange):
"""Update ranges for text deletion at textRange"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 for r in [self.inputPromptRange,self.inputRange,
self.outputPromptRange, self.outputRange]:
if(r==None):
continue
intersection = NSIntersectionRange(r, textRange)
if(intersection.length == 0): #ranges don't intersect
if r.location >= textRange.location:
r.location -= textRange.length
else: #ranges intersect
if(r.location > textRange.location):
offset = intersection.length
r.length -= offset
r.location += offset
elif(r.location == textRange.location):
r.length += intersection.length
else:
r.length -= intersection.length
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 def __repr__(self):
return 'CellBlock('+ str((self.inputPromptRange,
self.inputRange,
self.outputPromptRange,
self.outputRange)) + ')'
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark <barrywarkatgmaildotcom>
renamed AsynchronousFrontEndBase to AsyncFrontEndBase
r1315 class IPythonCocoaController(NSObject, AsyncFrontEndBase):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 userNS = objc.ivar() #mirror of engine.user_ns (key=>str(value))
waitingForEngine = objc.ivar().bool()
textView = objc.IBOutlet()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def init(self):
self = super(IPythonCocoaController, self).init()
Barry Wark <barrywarkatgmaildotcom>
renamed AsynchronousFrontEndBase to AsyncFrontEndBase
r1315 AsyncFrontEndBase.__init__(self,
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 engine=AutoreleasePoolWrappedThreadedEngineService())
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if(self != None):
self._common_init()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return self
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def _common_init(self):
"""_common_init"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.userNS = NSMutableDictionary.dictionary()
self.waitingForEngine = False
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.lines = {}
self.tabSpaces = 4
self.tabUsesSpaces = True
Barry Wark
pep8, second pass
r1292 self.currentBlockID = self.next_block_ID()
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.blockRanges = {} # blockID=>CellBlock
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def awakeFromNib(self):
"""awakeFromNib"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self._common_init()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # Start the IPython engine
self.engine.startService()
NSLog('IPython engine started')
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 # Register for app termination
Barry Wark
pep8, second pass
r1292 nc = NSNotificationCenter.defaultCenter()
nc.addObserver_selector_name_object_(
self,
'appWillTerminate:',
NSApplicationWillTerminateNotification,
None)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.textView.setDelegate_(self)
self.textView.enclosingScrollView().setHasVerticalRuler_(True)
Barry Wark
pep8, second pass
r1292 r = NSRulerView.alloc().initWithScrollView_orientation_(
self.textView.enclosingScrollView(),
NSVerticalRuler)
self.verticalRulerView = r
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.verticalRulerView.setClientView_(self.textView)
Barry Wark
pep8, second pass
r1292 self._start_cli_banner()
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.start_new_block()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def appWillTerminate_(self, notification):
"""appWillTerminate"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.engine.stopService()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def complete(self, token):
"""Complete token in engine's user_ns
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Parameters
----------
token : string
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 Result
------
Bernardo B. Marques
remove all trailling spaces
r4872 Deferred result of
Barry Wark
pep8, second pass
r1292 IPython.kernel.engineservice.IEngineBase.complete
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return self.engine.complete(token)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def execute(self, block, blockID=None):
self.waitingForEngine = True
self.willChangeValueForKey_('commandHistory')
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 d = super(IPythonCocoaController, self).execute(block,
blockID)
Barry Wark
pep8, second pass
r1292 d.addBoth(self._engine_done)
d.addCallback(self._update_user_ns)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return d
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def push_(self, namespace):
"""Push dictionary of key=>values to python namespace"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 self.waitingForEngine = True
self.willChangeValueForKey_('commandHistory')
d = self.engine.push(namespace)
d.addBoth(self._engine_done)
d.addCallback(self._update_user_ns)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def pull_(self, keys):
"""Pull keys from python namespace"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 self.waitingForEngine = True
result = blockingCallFromThread(self.engine.pull, keys)
self.waitingForEngine = False
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark <barrywarkatgmaildotcom>
added encoding and objc.signature to executeFileAtPath_encoding_
r1316 @objc.signature('v@:@I')
def executeFileAtPath_encoding_(self, path, encoding):
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 """Execute file at path in an empty namespace. Update the engine
user_ns with the resulting locals."""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 lines,err = NSString.stringWithContentsOfFile_encoding_error_(
path,
Barry Wark <barrywarkatgmaildotcom>
added encoding and objc.signature to executeFileAtPath_encoding_
r1316 encoding,
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 None)
self.engine.execute(lines)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def _engine_done(self, x):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.waitingForEngine = False
self.didChangeValueForKey_('commandHistory')
return x
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def _update_user_ns(self, result):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """Update self.userNS from self.engine's namespace"""
d = self.engine.keys()
Barry Wark
pep8, second pass
r1292 d.addCallback(self._get_engine_namespace_values_for_keys)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def _get_engine_namespace_values_for_keys(self, keys):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 d = self.engine.pull(keys)
Barry Wark
pep8, second pass
r1292 d.addCallback(self._store_engine_namespace_values, keys=keys)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def _store_engine_namespace_values(self, values, keys=[]):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 assert(len(values) == len(keys))
self.willChangeValueForKey_('userNS')
for (k,v) in zip(keys,values):
self.userNS[k] = saferepr(v)
self.didChangeValueForKey_('userNS')
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
updates for frontendbase API. Cocoa plugin functional in Objective-C app
r1303 def update_cell_prompt(self, result, blockID=None):
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 print self.blockRanges
Barry Wark
pep8, second pass
r1292 if(isinstance(result, Failure)):
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 prompt = self.input_prompt()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 else:
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 prompt = self.input_prompt(number=result['number'])
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 r = self.blockRanges[blockID].inputPromptRange
self.insert_text(prompt,
textRange=r,
Barry Wark
pep8, second pass
r1292 scrollToVisible=False
)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def render_result(self, result):
blockID = result['blockID']
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 inputRange = self.blockRanges[blockID].inputRange
Barry Wark
pep8, second pass
r1292 del self.blockRanges[blockID]
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 #print inputRange,self.current_block_range()
self.insert_text('\n' +
Barry Wark
improved error rendering for cocoa_frontend
r1304 self.output_prompt(number=result['number']) +
Barry Wark
pep8, second pass
r1292 result.get('display',{}).get('pprint','') +
'\n\n',
textRange=NSMakeRange(inputRange.location+inputRange.length,
0))
return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def render_error(self, failure):
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 print failure
blockID = failure.blockID
inputRange = self.blockRanges[blockID].inputRange
Barry Wark
improved error rendering for cocoa_frontend
r1304 self.insert_text('\n' +
self.output_prompt() +
'\n' +
failure.getErrorMessage() +
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 '\n\n',
textRange=NSMakeRange(inputRange.location +
inputRange.length,
0))
Barry Wark
pep8, second pass
r1292 self.start_new_block()
return failure
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def _start_cli_banner(self):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """Print banner"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8 compliance, first pass
r1291 banner = """IPython1 %s -- An enhanced Interactive Python.""" % \
IPython.__version__
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.insert_text(banner + '\n\n')
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def start_new_block(self):
""""""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 self.currentBlockID = self.next_block_ID()
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.blockRanges[self.currentBlockID] = self.new_cell_block()
Bernardo B. Marques
remove all trailling spaces
r4872 self.insert_text(self.input_prompt(),
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 textRange=self.current_block_range().inputPromptRange)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def next_block_ID(self):
Bernardo B. Marques
remove all trailling spaces
r4872
return guid.generate()
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 def new_cell_block(self):
"""A new CellBlock at the end of self.textView.textStorage()"""
Bernardo B. Marques
remove all trailling spaces
r4872
return CellBlock(NSMakeRange(self.textView.textStorage().length(),
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 0), #len(self.input_prompt())),
Barry Wark
branch to try non-textview
r1323 NSMakeRange(self.textView.textStorage().length(),# + len(self.input_prompt()),
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 0))
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def current_block_range(self):
Bernardo B. Marques
remove all trailling spaces
r4872 return self.blockRanges.get(self.currentBlockID,
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.new_cell_block())
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, third pass
r1293 def current_block(self):
Barry Wark
pep8, second pass
r1292 """The current block's text"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 return self.text_for_range(self.current_block_range().inputRange)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, third pass
r1293 def text_for_range(self, textRange):
"""text_for_range"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 ts = self.textView.textStorage()
return ts.string().substringWithRange_(textRange)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, third pass
r1293 def current_line(self):
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 block = self.text_for_range(self.current_block_range().inputRange)
Barry Wark
pep8, second pass
r1292 block = block.split('\n')
return block[-1]
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def insert_text(self, string=None, textRange=None, scrollToVisible=True):
Bernardo B. Marques
remove all trailling spaces
r4872 """Insert text into textView at textRange, updating blockRanges
Barry Wark
pep8, second pass
r1292 as necessary
"""
if(textRange == None):
#range for end of text
Bernardo B. Marques
remove all trailling spaces
r4872 textRange = NSMakeRange(self.textView.textStorage().length(), 0)
Barry Wark
pep8, second pass
r1292 self.textView.replaceCharactersInRange_withString_(
textRange, string)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 for r in self.blockRanges.itervalues():
r.update_ranges_for_insertion(string, textRange)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.textView.setSelectedRange_(textRange)
Barry Wark
pep8, second pass
r1292 if(scrollToVisible):
self.textView.scrollRangeToVisible_(textRange)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def replace_current_block_with_string(self, textView, string):
textView.replaceCharactersInRange_withString_(
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.current_block_range().inputRange,
string)
self.current_block_range().inputRange.length = len(string)
Barry Wark
pep8, second pass
r1292 r = NSMakeRange(textView.textStorage().length(), 0)
textView.scrollRangeToVisible_(r)
textView.setSelectedRange_(r)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 def current_indent_string(self):
"""returns string for indent or None if no indent"""
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
oops... old habits die hard.
r1301 return self._indent_for_block(self.current_block())
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
fix for cocoa frontend current_indent_string; refactor to make testing easier and added a test for _indent_for_block
r1300 def _indent_for_block(self, block):
lines = block.split('\n')
if(len(lines) > 1):
currentIndent = len(lines[-1]) - len(lines[-1].lstrip())
Barry Wark
pep8, second pass
r1292 if(currentIndent == 0):
currentIndent = self.tabSpaces
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 if(self.tabUsesSpaces):
result = ' ' * currentIndent
else:
result = '\t' * (currentIndent/self.tabSpaces)
else:
result = None
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 return result
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, second pass
r1292 # NSTextView delegate methods...
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 def textView_doCommandBySelector_(self, textView, selector):
assert(textView == self.textView)
NSLog("textView_doCommandBySelector_: "+selector)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if(selector == 'insertNewline:'):
Barry Wark
pep8, second pass
r1292 indent = self.current_indent_string()
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 if(indent):
Barry Wark
pep8, third pass
r1293 line = indent + self.current_line()
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 else:
Barry Wark
pep8, third pass
r1293 line = self.current_line()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
pep8, third pass
r1293 if(self.is_complete(self.current_block())):
self.execute(self.current_block(),
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 blockID=self.currentBlockID)
Barry Wark
pep8, second pass
r1292 self.start_new_block()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return False
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 elif(selector == 'moveUp:'):
Barry Wark
pep8, third pass
r1293 prevBlock = self.get_history_previous(self.current_block())
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 if(prevBlock != None):
Barry Wark
pep8, second pass
r1292 self.replace_current_block_with_string(textView, prevBlock)
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 else:
NSBeep()
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 elif(selector == 'moveDown:'):
Barry Wark
fixes and tests for history
r1281 nextBlock = self.get_history_next()
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 if(nextBlock != None):
Barry Wark
pep8, second pass
r1292 self.replace_current_block_with_string(textView, nextBlock)
Barry Wark
history partway there. render_error fixes for cocoa frontend
r1279 else:
NSBeep()
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 elif(selector == 'moveToBeginningOfParagraph:'):
Barry Wark
pep8 compliance, first pass
r1291 textView.setSelectedRange_(NSMakeRange(
Bernardo B. Marques
remove all trailling spaces
r4872 self.current_block_range().inputRange.location,
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 0))
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
elif(selector == 'moveToEndOfParagraph:'):
Barry Wark
pep8 compliance, first pass
r1291 textView.setSelectedRange_(NSMakeRange(
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.current_block_range().inputRange.location + \
self.current_block_range().inputRange.length, 0))
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
elif(selector == 'deleteToEndOfParagraph:'):
Barry Wark
pep8 compliance, first pass
r1291 if(textView.selectedRange().location <= \
Barry Wark
pep8, second pass
r1292 self.current_block_range().location):
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 raise NotImplemented()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return False # don't actually handle the delete
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 elif(selector == 'insertTab:'):
Barry Wark
pep8, third pass
r1293 if(len(self.current_line().strip()) == 0): #only white space
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return False
else:
self.textView.complete_(self)
return True
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 elif(selector == 'deleteBackward:'):
#if we're at the beginning of the current block, ignore
Barry Wark
pep8 compliance, first pass
r1291 if(textView.selectedRange().location == \
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 self.current_block_range().inputRange.location):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return True
else:
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 for r in self.blockRanges.itervalues():
deleteRange = textView.selectedRange
if(deleteRange.length == 0):
deleteRange.location -= 1
deleteRange.length = 1
r.update_ranges_for_deletion(deleteRange)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return False
return False
Bernardo B. Marques
remove all trailling spaces
r4872
def textView_shouldChangeTextInRanges_replacementStrings_(self,
Barry Wark
pep8 compliance, first pass
r1291 textView, ranges, replacementStrings):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
Delegate method for NSTextView.
Bernardo B. Marques
remove all trailling spaces
r4872
Refuse change text in ranges not at end, but make those changes at
Barry Wark
pep8 compliance, first pass
r1291 end.
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 """
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 assert(len(ranges) == len(replacementStrings))
allow = True
for r,s in zip(ranges, replacementStrings):
r = r.rangeValue()
if(textView.textStorage().length() > 0 and
Barry Wark
merged from trunk. cocoa_frontend refactored to keep input prompt and input ranges. no crash, but garbage output
r1322 r.location < self.current_block_range().inputRange.location):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 self.insert_text(s)
allow = False
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return allow
Bernardo B. Marques
remove all trailling spaces
r4872
def textView_completions_forPartialWordRange_indexOfSelectedItem_(self,
Barry Wark
pep8 compliance, first pass
r1291 textView, words, charRange, index):
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 try:
Barry Wark
pep8 compliance, first pass
r1291 ts = textView.textStorage()
token = ts.string().substringWithRange_(charRange)
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 completions = blockingCallFromThread(self.complete, token)
except:
completions = objc.nil
NSBeep()
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263 return (completions,0)
Bernardo B. Marques
remove all trailling spaces
r4872
Barry Wark
moved frontend from ipython1-dev. Got engineservice.ThreadedEngineService running, but does nto correctly propagate errors during execute()
r1263