[squeak-dev] The Trunk: Morphic-mt.1163.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Jun 4 16:53:49 UTC 2016


Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1163.mcz

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

Name: Morphic-mt.1163
Author: mt
Time: 4 June 2016, 6:53:04.95683 pm
UUID: cb5b0690-e94a-a945-8c0b-aa83a2b22cb8
Ancestors: Morphic-mt.1162

Use event filters to implement keyboard shortcuts (world, docking bar, system windows).

=============== Diff against Morphic-mt.1162 ===============

Item was added:
+ ----- Method: DockingBarMorph>>filterEvent:for: (in category 'events-processing') -----
+ filterEvent: aKeyboardEvent for: anObject
+ 	"Provide keyboard shortcuts."
+ 	
+ 	| index itemToSelect |
+ 	
+ 	aKeyboardEvent isKeyDown "No #isKeystroke to improve compatibility for all platforms."
+ 		ifFalse: [^ aKeyboardEvent].
+ 		
+ 	aKeyboardEvent controlKeyPressed
+ 		ifFalse: [^ aKeyboardEvent].
+ 	
+ 	"Search field."
+ 	aKeyboardEvent keyCharacter = $0
+ 		ifTrue: [
+ 			self searchBarMorph ifNotNil: [ :morph |
+ 				morph model activate: aKeyboardEvent in: morph ].
+ 			^ aKeyboardEvent ignore "hit!!"].
+ 	
+ 	"Select menu items."
+ 	(aKeyboardEvent keyValue 
+ 		between: $1 asciiValue 
+ 		and: $9 asciiValue)
+ 			ifFalse: [^ aKeyboardEvent].	
+ 			
+ 	index := aKeyboardEvent keyValue - $1 asciiValue + 1.
+ 	itemToSelect := (self submorphs select: [ :each | 
+ 		each isKindOf: DockingBarItemMorph ]) 
+ 			at: index 
+ 			ifAbsent: [^ aKeyboardEvent].
+ 			
+ 	self activate: aKeyboardEvent.
+ 	self 
+ 		selectItem: itemToSelect
+ 		event: aKeyboardEvent.
+ 
+ 	^ aKeyboardEvent ignore "hit!!"!

Item was removed:
- ----- Method: DockingBarMorph>>handleListenEvent: (in category 'events-processing') -----
- handleListenEvent: anEvent
- 	" I am registered as a keyboardListener of the ActiveHand, 
- 	watching for ctrl-<n> keystrokes, and upon them if I have 
- 	an nth menu item, I'll activate myself and select it. "
- 	
- 	(anEvent controlKeyPressed and: [ 
- 		anEvent keyValue 
- 			between: 48 " $0 asciiValue " 
- 			and: 55 " $7 asciiValue " ]) ifTrue: [ 
- 		| index itemToSelect |
- 		index := anEvent keyValue - 48.
- 		itemToSelect := (submorphs select: [ :each | 
- 			each isKindOf: DockingBarItemMorph ]) 
- 				at: index 
- 				ifAbsent: [ 
- 					^self searchBarMorph ifNotNil: [ :morph |
- 						morph model activate: anEvent in: morph ] ].
- 		self activate: anEvent.
- 		self 
- 			selectItem: itemToSelect
- 			event: anEvent ]!

Item was removed:
- ----- Method: DockingBarMorph>>setupGlobalHotKeyEventListeners (in category 'initialize-release') -----
- setupGlobalHotKeyEventListeners
- 	PasteUpMorph globalCommandKeysEnabled
- 		ifTrue: [ ActiveHand addKeyboardListener: self ]
- 		ifFalse: [ ActiveHand removeKeyboardListener: self ]!

Item was changed:
  ----- Method: MorphicProject>>createOrUpdateMainDockingBar (in category 'docking bars support') -----
  createOrUpdateMainDockingBar
  	"Private - create a new main docking bar or update the current one"
  	| w mainDockingBars |
  	w := self world.
  	mainDockingBars := w mainDockingBars.
  	mainDockingBars isEmpty ifTrue:
  		[ "no docking bar, just create a new one"
  		self dockingBar createDockingBar
+ 			 openInWorld: w .
- 			 openInWorld: w ;
- 			 setupGlobalHotKeyEventListeners.
  		^ self ].
  	"update if needed"
  	mainDockingBars do:
+ 		[ : each | self dockingBar updateIfNeeded: each ]!
- 		[ : each | self dockingBar updateIfNeeded: each.
- 		each setupGlobalHotKeyEventListeners ]!

Item was changed:
  ----- Method: PasteUpMorph class>>globalCommandKeysEnabled: (in category 'preferences') -----
+ globalCommandKeysEnabled: aBoolean
+ 
+ 	GlobalCommandKeysEnabled = aBoolean ifTrue: [^ self].
- globalCommandKeysEnabled: aBoolean 
  	GlobalCommandKeysEnabled := aBoolean.
+ 	
+ 	SystemWindow allSubInstancesDo: [:ea |
+ 		aBoolean
+ 			ifTrue: [ea addKeyboardShortcuts]
+ 			ifFalse: [ea removeKeyboardShortcuts]].
+ 
+ 	PasteUpMorph allSubInstancesDo: [:ea |
+ 		aBoolean
+ 			ifTrue: [ea addKeyboardShortcuts]
+ 			ifFalse: [ea removeKeyboardShortcuts]].!
- 	aBoolean
- 		ifTrue:
- 			[ ActiveHand
- 				 addKeyboardListener: SystemWindow topWindow ;
- 				 addKeyboardListener: ActiveWorld.
- 			ActiveWorld dockingBars do:
- 				[ : each | ActiveHand addKeyboardListener: each ] ]
- 		ifFalse:
- 			[ ActiveHand
- 				 removeKeyboardListener: SystemWindow topWindow ;
- 				 removeKeyboardListener: ActiveWorld.
- 			ActiveWorld dockingBars do:
- 				[ : each | ActiveHand removeKeyboardListener: each ] ].
- 	TheWorldMainDockingBar updateInstances!

Item was added:
+ ----- Method: PasteUpMorph>>addKeyboardShortcuts (in category 'initialization') -----
+ addKeyboardShortcuts
+ 	"Install an event capture filter to add shortcuts for global operations like opening a tool."
+ 	
+ 	self addKeyboardCaptureFilter: self.!

Item was changed:
  ----- Method: PasteUpMorph>>becomeActiveDuring: (in category 'initialization') -----
  becomeActiveDuring: aBlock
  	"Make the receiver the ActiveWorld during the evaluation of aBlock.
  	Note that this method does deliberately *not* use #ensure: to prevent
  	re-installation of the world on project switches."
  	| priorWorld priorHand priorEvent |
  	priorWorld := ActiveWorld.
  	priorHand := ActiveHand.
  	priorEvent := ActiveEvent.
- 	priorHand removeKeyboardListener: priorWorld.
  	ActiveWorld := self.
  	ActiveHand := self hands first. "default"
  	ActiveEvent := nil. "not in event cycle"
- 	self class globalCommandKeysEnabled ifTrue: [ ActiveHand addKeyboardListener: self ].
  	aBlock
  		on: Error
  		do: [:ex | 
  			ActiveWorld := priorWorld.
  			ActiveEvent := priorEvent.
  			ActiveHand := priorHand.
  			ex pass]!

Item was added:
+ ----- Method: PasteUpMorph>>filterEvent:for: (in category 'events-processing') -----
+ filterEvent: aKeyboardEvent for: anObject
+ 	"Provide keyboard shortcuts."
+ 	
+ 	"Delegate keyboard shortcuts to my docking bars."
+ 	self submorphsDo: [:ea | ea isDockingBar ifTrue: [
+ 		ea filterEvent: aKeyboardEvent for: anObject. "No support for converting events here!!"
+ 		aKeyboardEvent wasIgnored ifTrue: [^ aKeyboardEvent "early out"]]].
+ 	
+ 	aKeyboardEvent isKeystroke
+ 		ifFalse: [^ aKeyboardEvent].
+ 	
+ 	aKeyboardEvent commandKeyPressed ifTrue: [
+ 		aKeyboardEvent keyCharacter caseOf: {
+ 			[$R] -> [Utilities browseRecentSubmissions].
+ 			[$L] -> [self findAFileList: aKeyboardEvent].
+ 			[$O] -> [self findAMonticelloBrowser].
+ 			[$P] -> [self findAPreferencesPanel: aKeyboardEvent].
+ 			"[$Z] -> [ChangeList browseRecentLog]."
+ 			[$]] -> [Smalltalk snapshot: true andQuit: false].
+ 		} otherwise: [^ aKeyboardEvent "no hit"].
+ 		^ aKeyboardEvent ignore "hit!!"].
+ 
+ 	^ aKeyboardEvent "no hit"!

Item was removed:
- ----- Method: PasteUpMorph>>handleListenEvent: (in category 'events-processing') -----
- handleListenEvent: aUserInputEvent 
- 	"Handlers for *global* keys, regardless of which widget has keyboard focus."
- 	aUserInputEvent type = #keystroke ifTrue:
- 		[ aUserInputEvent commandKeyPressed ifTrue:
- 			[ aUserInputEvent keyValue = $R asciiValue ifTrue: [ Utilities browseRecentSubmissions ].
- 			aUserInputEvent keyValue = $L asciiValue ifTrue: [ World findAFileList: aUserInputEvent ].
- 			aUserInputEvent keyValue = $O asciiValue ifTrue: [ World findAMonticelloBrowser ].
- 			aUserInputEvent keyValue = $P asciiValue ifTrue: [ World findAPreferencesPanel: aUserInputEvent ].
- 			"aUserInputEvent keyValue = $Z asciiValue ifTrue: [ ChangeList browseRecentLog ]."
- 			aUserInputEvent keyValue = $] asciiValue ifTrue:
- 				[ Smalltalk
- 					snapshot: true
- 					andQuit: false ] ] ]!

Item was changed:
  ----- Method: PasteUpMorph>>initialize (in category 'initialization') -----
  initialize
  "initialize the state of the receiver"
  	super initialize.
  ""
  	cursor := 1.
  	padding := 3.
  	self enableDragNDrop.
  	self isWorldMorph
  		ifTrue: [self setProperty: #automaticPhraseExpansion toValue: true].
+ 	self clipSubmorphs: true.
+ 	self initializeKeyboardShortcuts.!
- 	self clipSubmorphs: true!

Item was added:
+ ----- Method: PasteUpMorph>>initializeKeyboardShortcuts (in category 'initialization') -----
+ initializeKeyboardShortcuts
+ 	"Install an event capture filter to add shortcuts for global operations like opening a tool."
+ 	
+ 	PasteUpMorph globalCommandKeysEnabled
+ 		ifTrue: [self addKeyboardShortcuts].!

Item was added:
+ ----- Method: PasteUpMorph>>removeKeyboardShortcuts (in category 'initialization') -----
+ removeKeyboardShortcuts
+ 	
+ 	self removeKeyboardCaptureFilter: self.!

Item was added:
+ ----- Method: SystemWindow>>addKeyboardShortcuts (in category 'initialization') -----
+ addKeyboardShortcuts
+ 	"Install an event capture filter to add shortcuts for window control operations."
+ 	
+ 	self addKeyboardCaptureFilter: self.!

Item was changed:
  ----- Method: SystemWindow>>beKeyWindow (in category 'top window') -----
  beKeyWindow
  	"Let me be the most important window on the screen. I am at the top and I can have a shadow to get more attention by the user. I am the window that is responsible for window keyboard shortcuts."
  
  	| oldKeyWindow |
  	self isKeyWindow ifTrue: [^ self].
  
  	oldKeyWindow := TopWindow.
  	TopWindow := self.
  
- 	PasteUpMorph globalCommandKeysEnabled ifTrue:
- 		[ self activeHand addKeyboardListener: self ].
- 	
  	self
  		unlockWindowDecorations; "here, because all windows might be active anyway"
  		activate; "if not already active, activate now"
  		comeToFront. "key windows are on top"
  
  	"Change appearance to get noticed."
  	self hasDropShadow: Preferences menuAppearance3d.
  	(self valueOfProperty: #borderWidthWhenActive)
  		ifNotNil: [:bw | self acquireBorderWidth: bw].
  
  	oldKeyWindow ifNotNil: [:wnd |
  		wnd passivateIfNeeded.
  		
- 		self activeHand removeKeyboardListener: oldKeyWindow.	
- 		
  		"Change appearance to not look prettier than the new key window."
  		wnd hasDropShadow: false.
  		(wnd valueOfProperty: #borderWidthWhenInactive)
  			ifNotNil: [:bw | wnd acquireBorderWidth: bw]].
  
  	"Synchronize focus look with position of current hand because any call could have made this window the new key window."
  	self updateFocusLookAtHand.!

Item was added:
+ ----- Method: SystemWindow>>filterEvent:for: (in category 'events') -----
+ filterEvent: aKeyboardEvent for: anObject
+ 	"Provide keyboard shortcuts."
+ 		
+ 	aKeyboardEvent isKeystroke
+ 		ifFalse: [^ aKeyboardEvent].
+ 	
+ 	aKeyboardEvent commandKeyPressed ifTrue: [
+ 		aKeyboardEvent keyCharacter caseOf: {
+ 			[$\] -> [self class sendTopWindowToBack].
+ 			[Character escape] -> [self delete].
+ 		} otherwise: [^ aKeyboardEvent "no hit"].
+ 		^ aKeyboardEvent ignore "hit!!"].
+ 	
+ 	aKeyboardEvent controlKeyPressed ifTrue: [
+ 		aKeyboardEvent keyCharacter caseOf: {
+ 			[Character escape] -> [self world findWindow: aKeyboardEvent].
+ 		} otherwise: [^ aKeyboardEvent "no hit"].
+ 		^ aKeyboardEvent ignore "hit!!"].
+ 
+ 	^ aKeyboardEvent "no hit"!

Item was changed:
  ----- Method: SystemWindow>>handleListenEvent: (in category 'events') -----
  handleListenEvent: aUserInputEvent 
+ 	"See #mouseEnterDragging:. Watch for finished drag-and-drop action and lock contents accordingly."
  
- 	"1) Handle keyboard shortcuts"
- 	aUserInputEvent type = #keystroke ifTrue:
- 		[ aUserInputEvent commandKeyPressed ifTrue:
- 			[ aUserInputEvent keyValue = $\ asciiValue ifTrue: [ self class sendTopWindowToBack ].
- 			"Command+Escape"
- 			aUserInputEvent keyValue = 27 ifTrue:
- 				[ aUserInputEvent wasHandled: true.
- 				self delete ] ].
- 		aUserInputEvent controlKeyPressed ifTrue:
- 			[ aUserInputEvent keyValue = 27 ifTrue: [ self world findWindow: aUserInputEvent ] ] ].
- 
- 	"2) See #mouseEnterDragging:. Watch for finished drag-and-drop action and lock contents accordingly."
  	(aUserInputEvent isMouse and: [ aUserInputEvent hand hasSubmorphs not ]) ifTrue: 
  		[ self isKeyWindow ifFalse: [ self passivateIfNeeded ].
  		aUserInputEvent hand removeMouseListener: self ].!

Item was changed:
  ----- Method: SystemWindow>>initialize (in category 'initialization') -----
  initialize
  	"Initialize a system window. Add label, stripes, etc., if desired"
  
  	super initialize.
  
  	self layoutPolicy: ProportionalLayout new.
  
  	self wantsPaneSplitters: true.
  	self layoutInset: ProportionalSplitterMorph gripThickness.
  	self cellInset: ProportionalSplitterMorph gripThickness.
  
  	self initializeLabelArea.				
  	self addCornerGrips.
  	self setDefaultParameters.
  
  	allowReframeHandles := true.
  	isCollapsed := false.
  	paneMorphs := Array new.
  	mustNotClose := false.
+ 	updatablePanes := Array new.
+ 
+ 	self initializeKeyboardShortcuts.!
- 	updatablePanes := Array new.!

Item was added:
+ ----- Method: SystemWindow>>initializeKeyboardShortcuts (in category 'initialization') -----
+ initializeKeyboardShortcuts
+ 	"Install an event capture filter to add shortcuts for window control operations."
+ 	
+ 	PasteUpMorph globalCommandKeysEnabled
+ 		ifTrue: [self addKeyboardShortcuts].!

Item was added:
+ ----- Method: SystemWindow>>removeKeyboardShortcuts (in category 'initialization') -----
+ removeKeyboardShortcuts
+ 	
+ 	self removeKeyboardCaptureFilter: self.!

Item was changed:
+ (PackageInfo named: 'Morphic') postscript: 'SystemWindow allSubInstancesDo: [:ea |
+ 	ea initializeKeyboardShortcuts.
+ 	HandMorph allInstancesDo: [:hand | hand removeKeyboardListener: ea]].
+ PasteUpMorph allSubInstancesDo: [:ea |
+ 	ea initializeKeyboardShortcuts.
+ 	HandMorph allInstancesDo: [:hand | hand removeKeyboardListener: ea]].
+ DockingBarMorph allSubInstancesDo: [:ea |
+ 	HandMorph allInstancesDo: [:hand | hand removeKeyboardListener: ea]].'!
- (PackageInfo named: 'Morphic') postscript: 'SystemWindow reconfigureWindowsForFocus.'!



More information about the Squeak-dev mailing list