[squeak-dev] The Inbox: Morphic-ct.1588.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Nov 15 13:18:58 UTC 2019


A new version of Morphic was added to project The Inbox:
http://source.squeak.org/inbox/Morphic-ct.1588.mcz

==================== Summary ====================

Name: Morphic-ct.1588
Author: ct
Time: 15 November 2019, 2:18:46.719005 pm
UUID: cd229fb4-796e-a349-9c09-811159cf9e6e
Ancestors: Morphic-mt.1587

TextEditor: Add support for different keyboard layouts, fix the 9-enclosing bug and clean up #enclose:

You now can do [Editor defaultKeyboardLayout: #qwertz] to adapt the editing behavior of Squeak to the qwertz layout. Squeakers from all the world, feel free to add further keyboard layouts to #specialShiftKeyMaps!

We also had an interesting dicussion concerning the 9-enclosing bug (see http://forum.world.st/When-did-it-become-a-good-idea-for-selected-text-to-be-enclosed-by-instead-of-replaced-by-9-td4936276.html) and wondered whether there would be really anyone willing to press 9 only, without any modifier key, to enclose the selection with brackets. He or she might press 9 and shift together in future (on a qwertz layout), it would be just incon{sist,veni}ent that 8 and 9 had such different behaviors.

Depends on Collections-ct.860.

=============== Diff against Morphic-mt.1587 ===============

Item was changed:
  Object subclass: #Editor
  	instanceVariableNames: 'morph selectionShowing'
+ 	classVariableNames: 'BlinkingCursor DefaultKeyboardLayout DestructiveBackWord DumbbellCursor EnclosingCharacterMap KeystrokeActions SelectionsMayShrink SpecialShiftKeyMaps'
- 	classVariableNames: 'BlinkingCursor DestructiveBackWord DumbbellCursor KeystrokeActions SelectionsMayShrink'
  	poolDictionaries: ''
  	category: 'Morphic-Text Support'!
  
  !Editor commentStamp: 'hjh 9/28/2017 11:37' prior: 0!
  New text editors.
  TextEditor provides most of the functionality that used to be in TextMorphEditor.
  SmalltalkEditor is has Smalltalk code specific features.
  !

Item was added:
+ ----- Method: Editor class>>defaultKeyboardLayout (in category 'keyboard shortcut tables') -----
+ defaultKeyboardLayout
+ 
+ 	^ DefaultKeyboardLayout ifNil: [#qwerty]!

Item was added:
+ ----- Method: Editor class>>defaultKeyboardLayout: (in category 'keyboard shortcut tables') -----
+ defaultKeyboardLayout: aSymbol
+ 
+ 	DefaultKeyboardLayout := aSymbol!

Item was added:
+ ----- Method: Editor class>>enclosingCharacterMap (in category 'keyboard shortcut tables') -----
+ enclosingCharacterMap
+ 
+ 	^ EnclosingCharacterMap ifNil: [EnclosingCharacterMap :=
+ 		Dictionary fromKeys: '([<{|"''' values: ')]>}|"''']!

Item was changed:
  ----- Method: Editor class>>initialize (in category 'class initialization') -----
  initialize
  	"
  	Editor initialize
  	"
  	self initializeKeystrokeActions.
+ 	EnclosingCharacterMap := nil.
+ 	SpecialShiftKeyMaps := nil.
  	self allSubclassesDo: [ :c | c initialize ]!

Item was added:
+ ----- Method: Editor class>>specialShiftKeyMaps (in category 'keyboard shortcut tables') -----
+ specialShiftKeyMaps
+ 
+ 	SpecialShiftKeyMaps ifNotNil: [^ SpecialShiftKeyMaps].
+ 	SpecialShiftKeyMaps := Dictionary new
+ 		at: #qwerty put: (Dictionary fromKeys: '[]\'',.90' values: '{}|"<>()');
+ 		at: #qwertz put: (Dictionary fromKeys: '89' values: '()');
+ 		yourself.
+ 	^ SpecialShiftKeyMaps!

Item was added:
+ ----- Method: Editor>>enclosingCharacterFor:ifNone: (in category 'as yet unclassified') -----
+ enclosingCharacterFor: openingCharacter ifNone: aBlock
+ 
+ 	^ self enclosingCharacterMap
+ 		at: openingCharacter
+ 		ifAbsent: aBlock!

Item was added:
+ ----- Method: Editor>>enclosingCharacterMap (in category 'as yet unclassified') -----
+ enclosingCharacterMap
+ 
+ 	^ self class enclosingCharacterMap!

Item was added:
+ ----- Method: Editor>>keyboardLayout (in category 'accessing') -----
+ keyboardLayout
+ 
+ 	^ self class defaultKeyboardLayout!

Item was added:
+ ----- Method: Editor>>mapSpecialKeyToShift: (in category 'private') -----
+ mapSpecialKeyToShift: aCharacter
+ 	"Maps special characters such as $[ on a qwerty keyboard to their uppercase equivalent, that would be ${ in this example. Probably required by some VM implementations."
+ 
+ 	^ self specialShiftKeys
+ 		at: aCharacter
+ 		ifAbsent: [aCharacter]!

Item was added:
+ ----- Method: Editor>>specialShiftKeys (in category 'accessing') -----
+ specialShiftKeys
+ 
+ 	^ self class specialShiftKeyMaps at: self keyboardLayout!

Item was changed:
  ----- Method: TextEditor>>enclose: (in category 'editing keys') -----
  enclose: aKeyboardEvent
  	"Insert or remove bracket characters around the current selection."
  
+ 	| character left right startIndex stopIndex oldSelection text |
- 	| character left right startIndex stopIndex oldSelection which t |
- 	character := aKeyboardEvent shiftPressed
- 					ifTrue: ['{}|"<>' at: ('[]\'',.' indexOf: aKeyboardEvent keyCharacter) ifAbsent: [aKeyboardEvent keyCharacter]]
- 					ifFalse: [aKeyboardEvent keyCharacter].
  	self closeTypeIn.
+ 	
+ 	character := aKeyboardEvent keyCharacter.
+ 	(aKeyboardEvent shiftPressed
+ 			or: ["Allow Control key in lieu of Alt+Shift for certain special keys."
+ 				Preferences cmdKeysInText and: [aKeyboardEvent controlKeyPressed]])
+ 		ifTrue: [character := self mapSpecialKeyToShift: aKeyboardEvent keyCharacter].
  	startIndex := self startIndex.
  	stopIndex := self stopIndex.
  	oldSelection := self selection.
+ 	left := character.
+ 	right := self enclosingCharacterFor: left ifNone: [^ false].
+ 	
+ 	text := self text.
+ 	((startIndex > 1 and: [stopIndex <= text size])
+ 			and: [ (text at: startIndex - 1) = left and: [(text at: stopIndex) = right]])
- 	which := '([<{|"''9' indexOf: character ifAbsent: [ ^ false ].
- 	"Allow Control key in lieu of Alt+Shift for (, {, and double-quote."
- 	left := ((Preferences cmdKeysInText and: [ aKeyboardEvent controlKeyPressed ])
- 		ifTrue: [ '({<{|""(' ]
- 		ifFalse: ['([<{|"''(']) at: which.
- 	right := ((Preferences cmdKeysInText and: [ aKeyboardEvent controlKeyPressed ])
- 		ifTrue: [ ')}>}|"")' ] 
- 		ifFalse: [')]>}|"'')']) at: which.
- 	t := self text.
- 	((startIndex > 1 and: [stopIndex <= t size])
- 			and: [ (t at: startIndex-1) = left and: [(t at: stopIndex) = right]])
  		ifTrue:
  			["already enclosed; strip off brackets"
+ 			self selectFrom: startIndex - 1 to: stopIndex.
- 			self selectFrom: startIndex-1 to: stopIndex.
  			self replaceSelectionWith: oldSelection]
  		ifFalse:
  			["not enclosed; enclose by matching brackets"
+ 			self replaceSelectionWith: (Text
+ 				string: (String with: left), oldSelection string, (String with: right)
+ 				attributes: emphasisHere).
+ 			self selectFrom: startIndex + 1 to: stopIndex].
+ 	^ true!
- 			self replaceSelectionWith:
- 				(Text string: (String with: left), oldSelection string, (String with: right) attributes: emphasisHere).
- 			self selectFrom: startIndex+1 to: stopIndex].
- 	^true!



More information about the Squeak-dev mailing list