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 ]!
squeak-dev@lists.squeakfoundation.org