[Pkg] The Trunk: Morphic-cmm.577.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Dec 24 20:50:15 UTC 2011


Chris Muller uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-cmm.577.mcz

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

Name: Morphic-cmm.577
Author: cmm
Time: 29 August 2011, 9:09:42.052 pm
UUID: 5227dddb-7836-46d3-9522-a96776d7035c
Ancestors: Morphic-cmm.576

- When using the new list-filtering, if the user's keystroke will cause filtering to an empty list, then flash rather than present an empty list.
- Preserve 300ms "slow-keystroke" timing for when the legacy preference is engaged for filterableLists.  That way, in case someone wants to press, t -- t -- t to go to the third in the list that starts with 't', they will only have to wait 300ms in between presses.
- Order the items with front-matching items at the top of the list, and substring-matches below that.

=============== Diff against Morphic-cmm.576 ===============

Item was changed:
  ----- Method: PluggableListMorph>>basicKeyPressed: (in category 'model access') -----
  basicKeyPressed: aChar 
  	| milliseconds slowKeyStroke listSize newSelectionIndex oldSelectionIndex startIndex |
  	oldSelectionIndex := newSelectionIndex := self getCurrentSelectionIndex.
  	listSize := self getListSize.
  	milliseconds := Time millisecondClockValue.
  	slowKeyStroke := (Time
  		milliseconds: milliseconds
+ 		since: lastKeystrokeTime) > (self class filterableLists ifTrue: [500] ifFalse: [ 300 ]).
- 		since: lastKeystrokeTime) > 500.
  	lastKeystrokeTime := milliseconds.
  	slowKeyStroke
  		ifTrue:
  			[ "forget previous keystrokes and search in following elements"
  			lastKeystrokes := aChar asLowercase asString.
+ 			newSelectionIndex := newSelectionIndex \\ listSize + 1.
+ 			self class filterableLists ifTrue: [ list := self getFullList ] ]
- 			newSelectionIndex := newSelectionIndex \\ listSize + 1 ]
  		ifFalse: [ "append quick keystrokes but don't move selection if it still matches"
  			lastKeystrokes := lastKeystrokes , aChar asLowercase asString ].
  	"No change if model is locked"
  	model okToChange ifFalse: [ ^ self ].
  	self class filterableLists
  		ifTrue:
  			[ self
  				 filterList ;
  				 updateList.
  			newSelectionIndex := self modelIndexFor: 1 ]
  		ifFalse:
  			[ startIndex := newSelectionIndex.
  			listSize := self getListSize.
  			[ (self getListItem: newSelectionIndex) asString withBlanksTrimmed asLowercase beginsWith: lastKeystrokes ] whileFalse:
  				[ (newSelectionIndex := newSelectionIndex \\ listSize + 1) = startIndex ifTrue: [ ^ self flash"Not in list." ] ].
  			newSelectionIndex = oldSelectionIndex ifTrue: [ ^ self flash ] ].
+ 	(self hasFilter and: [(self getCurrentSelectionIndex = newSelectionIndex) not]) ifTrue:
- 	self getCurrentSelectionIndex = newSelectionIndex ifFalse:
  		[self changeModelSelection: newSelectionIndex]!

Item was changed:
  ----- Method: PluggableListMorph>>filterList (in category 'filtering') -----
  filterList
  	self hasFilter
  		ifTrue:
+ 			[ | frontMatching substringMatching newList |
+ 			self indicateFiltered.
+ 			frontMatching := OrderedCollection new.
+ 			substringMatching := OrderedCollection new.
+ 			list withIndexDo:
+ 				[ : each : n | | foundPos |
+ 				foundPos := each asString
+ 					findString: lastKeystrokes
+ 					startingAt: 1
+ 					caseSensitive: false.
+ 				foundPos = 1
+ 					ifTrue: [ frontMatching add: each ]
+ 					ifFalse:
+ 						[ foundPos = 0 ifFalse: [ substringMatching add: each ] ] ].
+ 			newList := frontMatching , substringMatching.
+ 			newList
+ 				ifEmpty:
+ 					[ lastKeystrokes := lastKeystrokes allButLast: 1.
+ 					self
+ 						 flash ;
+ 						 filterList ]
+ 				ifNotEmpty: [ list := newList ] ]
- 			[ self indicateFiltered.
- 			list := Array streamContents:
- 				[ : stream | list withIndexDo:
- 					[ : each : n | (each asString
- 						includesSubstring: lastKeystrokes
- 						caseSensitive: false) ifTrue: [ stream nextPut: each ] ] ] ]
  		ifFalse: [ self indicateUnfiltered ]!

Item was changed:
  ----- Method: PluggableListMorph>>update: (in category 'updating') -----
  update: aSymbol 
  	"Refer to the comment in View|update:."
  	aSymbol == getListSelector ifTrue:
  		[ self updateList.
  		^ self ].
  	aSymbol == getIndexSelector ifTrue:
  		[ | uiIndex modelIndex |
  		uiIndex := self uiIndexFor: (modelIndex := self getCurrentSelectionIndex).
  		self selectionIndex:
  			(uiIndex = 0
  				ifTrue:
  					[ "The filter is preventing us from selecting the item we want - remove it."
+ 					(list notNil and: [list size > 0]) ifTrue: [ self removeFilter ].
- 					list size > 0 ifTrue: [ self removeFilter ].
  					modelIndex ]
  				ifFalse: [ uiIndex ]).
  		^ self ]!



More information about the Packages mailing list