A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-Richo.583.mcz
==================== Summary ====================
Name: Morphic-Richo.583 Author: Richo Time: 6 October 2011, 4:29:55.07 pm UUID: 4df53f26-036e-3c4a-8a98-af5e787d3ada Ancestors: Morphic-ul.582
After installing OCompletion typing any of the following characters ')]}' signals an MNU: Character>>#keyCharacter.
This commit seems to fix the problem by making SmalltalkEditor>>#blinkPrevParen: always receive a character instead of a KeyboardEvent.
I lacked the courage to change TextEditor>>#blinkPrevParen: but I think it should be changed as well for consistency.
=============== Diff against Morphic-ul.582 ===============
Item was changed: ----- Method: SmalltalkEditor>>blinkPrevParen: (in category 'parenblinking') ----- + blinkPrevParen: aCharacter - blinkPrevParen: aKeyboardEvent "Same as super, but tries to follow the Smalltalk syntax."
| openDelimiter closeDelimiter level string here inside | string := paragraph text string. here := pointBlock stringIndex. + openDelimiter := aCharacter. - openDelimiter := aKeyboardEvent keyCharacter. closeDelimiter := '([{' at: (')]}' indexOf: openDelimiter). level := 1. inside := nil. "Tricky." (here > 1 and: [ (string at: here - 1) = $$ ]) ifTrue: [ ^self ]. "Just a character literal." [ level > 0 and: [ here > 1 ] ] whileTrue: [ | hereChar | hereChar := string at: (here := here - 1). inside "Are we inside a comment or string literal?" ifNotNil: [ "Yes." hereChar = inside ifTrue: [ (here > 1 and: [ (string at: here - 1) ~= inside ]) ifTrue: [ inside := nil ] ifFalse: [ here := here - 1 ] ] ] ifNil: [ (here > 1 and: [ (string at: here - 1) = $$ ]) "Just a character literal." ifTrue: [ here := here - 1 ] ifFalse: [ hereChar caseOf: { [ closeDelimiter ] -> [ (level := level - 1) = 0 ifTrue: [ ^self blinkParenAt: here ] ]. [ openDelimiter ] -> [ level := level + 1 ]. [ $" ] -> [ inside := $" ]. [ $' ] -> [ inside := $' ] } otherwise: [] ] ] ]!
Item was changed: ----- Method: TextEditor>>dispatchOnKeyboardEvent: (in category 'typing support') ----- dispatchOnKeyboardEvent: aKeyboardEvent "Carry out the action associated with this character, if any. Type-ahead is passed so some routines can flush or use it."
| honorCommandKeys openers closers result | (aKeyboardEvent keyCharacter == Character cr and: [ morph acceptOnCR ]) ifTrue: [ self closeTypeIn. ^ true ]. self clearParens. aKeyboardEvent keyValue = 13 ifTrue: [ aKeyboardEvent controlKeyPressed ifTrue: [ ^ self normalCharacter: aKeyboardEvent ]. aKeyboardEvent shiftPressed ifTrue: [ ^ self lf: aKeyboardEvent ]. aKeyboardEvent commandKeyPressed ifTrue: [ ^ self crlf: aKeyboardEvent ]. ^ self crWithIndent: aKeyboardEvent ]. ((honorCommandKeys := Preferences cmdKeysInText) and: [ aKeyboardEvent keyCharacter = Character enter ]) ifTrue: [ ^ self dispatchOnEnterWith: aKeyboardEvent ]. "Special keys overwrite crtl+key combinations - at least on Windows. To resolve this conflict, assume that keys other than cursor keys aren't used together with Crtl." ((self class specialShiftCmdKeys includes: aKeyboardEvent keyValue) and: [ aKeyboardEvent keyValue < 27 ]) ifTrue: [ ^ aKeyboardEvent controlKeyPressed ifTrue: [ self perform: (self class shiftCmdActions at: aKeyboardEvent keyValue + 1) with: aKeyboardEvent ] ifFalse: [ self perform: (self class cmdActions at: aKeyboardEvent keyValue + 1) with: aKeyboardEvent ] ]. "backspace, and escape keys (ascii 8 and 27) are command keys" ((honorCommandKeys and: [ aKeyboardEvent commandKeyPressed ]) or: [ self class specialShiftCmdKeys includes: aKeyboardEvent keyValue ]) ifTrue: [ ^ aKeyboardEvent shiftPressed ifTrue: [ self perform: (self class shiftCmdActions at: aKeyboardEvent keyValue + 1) with: aKeyboardEvent ] ifFalse: [ self perform: (self class cmdActions at: aKeyboardEvent keyValue + 1) with: aKeyboardEvent ] ]. "the control key can be used to invoke shift-cmd shortcuts" (honorCommandKeys and: [ aKeyboardEvent controlKeyPressed ]) ifTrue: [ ^ self perform: (self class shiftCmdActions at: aKeyboardEvent keyValue + 1) with: aKeyboardEvent ]. openers := '([{'. closers := ')]}'. result := self normalCharacter: aKeyboardEvent. (closers includes: aKeyboardEvent keyCharacter) + ifTrue: [ self blinkPrevParen: aKeyboardEvent keyCharacter]. - ifTrue: [ self blinkPrevParen: aKeyboardEvent ]. (self class autoEnclose and: [ openers includes: aKeyboardEvent keyCharacter ]) ifTrue: [ self addString: (closers at: (openers indexOf: aKeyboardEvent keyCharacter)) asString; insertTypeAhead ;
moveCursor: [ :position | position - 1 ] forward: false select: false ]. ^ result!
squeak-dev@lists.squeakfoundation.org