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

commits at source.squeak.org commits at source.squeak.org
Mon Jan 30 13:33:49 UTC 2023


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

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

Name: ToolBuilder-Morphic-mt.333
Author: mt
Time: 30 January 2023, 2:33:48.497867 pm
UUID: 9219e0aa-4436-2c44-8dba-a4d8a5b176e9
Ancestors: ToolBuilder-Morphic-mt.332

In tree widgets, narrow down filter column via [TAB] just like in multi-column list widgets. Also affects tree search via [CMD]+[F] (and [CMD]+[G]).

Remove the now obsolete preference #filterByLabelsOnly. You can hit [TAB] for that now.

=============== Diff against ToolBuilder-Morphic-mt.332 ===============

Item was changed:
  SimpleHierarchicalListMorph subclass: #PluggableTreeMorph
+ 	instanceVariableNames: 'rootWrappers selectedWrapper getRootsSelector getChildrenSelector hasChildrenSelector getLabelSelector getIconSelector getSelectedPathSelector setSelectedPathSelector setSelectedParentSelector getHelpSelector dropItemSelector wantsDropSelector dragItemSelector dragTypeSelector nodeClass lastKeystrokeTime lastKeystrokes dragStartedSelector doubleClickSelector findText findQueue filterColumnIndex'
- 	instanceVariableNames: 'rootWrappers selectedWrapper getRootsSelector getChildrenSelector hasChildrenSelector getLabelSelector getIconSelector getSelectedPathSelector setSelectedPathSelector setSelectedParentSelector getHelpSelector dropItemSelector wantsDropSelector dragItemSelector dragTypeSelector nodeClass lastKeystrokeTime lastKeystrokes dragStartedSelector doubleClickSelector findText findQueue'
  	classVariableNames: 'FilterByLabelsOnly MaximumSearchDepth'
  	poolDictionaries: ''
  	category: 'ToolBuilder-Morphic'!
  
  !PluggableTreeMorph commentStamp: 'ar 2/12/2005 04:38' prior: 0!
  A pluggable tree morph.!

Item was removed:
- ----- Method: PluggableTreeMorph class>>filterByLabelsOnly (in category 'preferences') -----
- filterByLabelsOnly
- 	<preference: 'Filterable Trees by labels only'
- 		category: 'scrolling'
- 		description: 'When using the Filterable Lists option, set this to only match the labels, not the contents, of hierarchical lists.  Otherwise, search both labels and contents will be matched.'
- 		type: #Boolean>
- 	^ FilterByLabelsOnly ifNil: [ false ]!

Item was removed:
- ----- Method: PluggableTreeMorph class>>filterByLabelsOnly: (in category 'preferences') -----
- filterByLabelsOnly: aBoolean
- 	FilterByLabelsOnly := aBoolean!

Item was added:
+ ----- Method: PluggableTreeMorph>>drawBackgroundOn: (in category 'drawing') -----
+ drawBackgroundOn: aCanvas
+ 	"Overwritten to indicate current filter column."
+ 
+ 	| leftOffset colWidth |
+ 	filterColumnIndex ifNil: [^ self].
+ 	columns ifNil: [^ self].
+ 
+ 	leftOffset := scroller left.
+ 	1 to: filterColumnIndex - 1 do: [:col |
+ 		leftOffset := leftOffset + (self widthOfColumn: col)].
+ 	
+ 	"For #spaceFill columns, just use the remaining space to the right for the highlight."
+ 	colWidth := (self widthOfColumn: filterColumnIndex) ifNil: [scroller right - leftOffset].
+ 	aCanvas
+ 		fillRectangle: (leftOffset @ scroller top extent: colWidth @ scroller height)
+ 		color: IndentingListItemMorph filterBackgroundColor.!

Item was added:
+ ----- Method: PluggableTreeMorph>>filterColumnIndex (in category 'filtering') -----
+ filterColumnIndex!

Item was changed:
  ----- Method: PluggableTreeMorph>>filterTreeNow (in category 'filtering') -----
  filterTreeNow
  
  	| any |
  	self hasFilter ifFalse: [^ self removeFilter].
  		
  	"Show all current items again before filtering them out."
  	scroller submorphsDo: [:m | m removeFilter].
  	
  	"Filter the children of the current parent. Do not filter the parent."
  	any := false.
  	self selectedParentMorph
  		ifNil: [self roots do: [:each |
+ 				(each applyFilter: lastKeystrokes column: filterColumnIndex) ifTrue: [any := true]]]
- 				(each applyFilter: lastKeystrokes) ifTrue: [any := true]]]
  		ifNotNil: [:pm | pm childrenDo: [:each |
+ 				(each applyFilter: lastKeystrokes column: filterColumnIndex) ifTrue: [any := true]]].
- 				(each applyFilter: lastKeystrokes) ifTrue: [any := true]]].
  	
  	any ifFalse: [
  		"Remove the last character and try filtering again."
  		lastKeystrokes := lastKeystrokes allButLast: 1.
  		^ self filterTreeNow].
  
  	self adjustSubmorphPositions!

Item was changed:
  ----- Method: PluggableTreeMorph>>findAgainNow (in category 'searching') -----
  findAgainNow
  
  	| currentPath |
  	(findQueue isNil or: [findQueue isEmpty]) ifTrue: [^ self flash].
  	
  	self flag: #todo. "mt: Ask model about breadth-first or depth-first, indicate search progress in UI, allow find-again-backwards, ..."
  	
  	Cursor wait showWhile: [
  		[findQueue notEmpty] whileTrue: [
  			| currentItem |
  			currentPath := findQueue removeFirst.
  			currentItem := currentPath last.
  			currentItem hasContents ifTrue: [
  				findQueue addAll: (currentItem contents collect: [:nextItem | currentPath copyWith: nextItem])].
  			
  			(self matches: findText in: currentItem) ifTrue: [
  				"Search used model data. View might already be outdated.
  				Collapse parent now to get up-to-date children."
  				self selectedMorph isExpanded ifTrue: [
  					self toggleExpandedState: self selectedMorph].
  				"Match!! Stop search for now. Select the match."
  				self selectPath: (currentPath collect: [:ea | ea item]).
+ 				self selectedMorph ifNil: [
+ 					^ self inform: 'Could not find path. View up to date?' translated].
  				"Revert a side-effect from #selectPath:."
  				self selectedMorph isExpanded ifTrue: [
  					self toggleExpandedState: self selectedMorph].
  				"Mimic filter function to highlight (and filter) search results."
  				lastKeystrokes := findText.
  				self filterTree.
  				self scrollSelectionAndExtraIntoView.
  				^ self]]].
  				
  	self inform: 'Nothing found.' translated.!

Item was added:
+ ----- Method: PluggableTreeMorph>>highlightNextColumn (in category 'filtering') -----
+ highlightNextColumn
+ 
+ 	columns ifNil: [^ self].
+ 	columns size = 1 ifTrue: [^ self].
+ 
+ 	filterColumnIndex
+ 		ifNil: [filterColumnIndex := 1]
+ 		ifNotNil: [:i | filterColumnIndex := filterColumnIndex \\ columns size + 1].
+ 	
+ 	self filterTree.!

Item was added:
+ ----- Method: PluggableTreeMorph>>highlightNoColumn (in category 'filtering') -----
+ highlightNoColumn
+ 
+ 	filterColumnIndex := nil.
+ 	self removeFilter.!

Item was changed:
  ----- Method: PluggableTreeMorph>>matches:in: (in category 'searching') -----
  matches: pattern in: wrapper
  
+ 	^ filterColumnIndex
+ 		ifNil: [self matchesPattern: pattern contents: wrapper asStringOrText]
+ 		ifNotNil: [self matchesPattern: pattern contents: wrapper asStringOrText column: filterColumnIndex]!
- 	^ ((PluggableTreeMorph filterByLabelsOnly
- 		ifTrue: [ wrapper itemName ]
- 		ifFalse: [ wrapper asStringOrText ])
- 			findString: findText
- 			startingAt: 1
- 			caseSensitive: false) > 0!

Item was added:
+ ----- Method: PluggableTreeMorph>>matchesPattern:contents: (in category 'searching') -----
+ matchesPattern: pattern contents: contents
+ 
+ 	^ (contents
+ 		findString: pattern
+ 		startingAt: 1
+ 		caseSensitive: false) > 0!

Item was added:
+ ----- Method: PluggableTreeMorph>>matchesPattern:contents:column: (in category 'searching') -----
+ matchesPattern: pattern contents: contents column: index
+ 
+ 	| columnScanner data |
+ 	"self assert: [columns notNil]."
+ 	columnScanner := ReadStream on: contents asString.
+ 	
+ 	index - 1 timesRepeat: [columnScanner upTo: Character tab].
+ 	data := index = columns size
+ 		ifTrue: [columnScanner upToEnd "Fix trailing tab issue"]
+ 		ifFalse: [columnScanner upTo: Character tab].
+ 	^ (data
+ 		findString: pattern
+ 		startingAt: 1
+ 		caseSensitive: false) > 0!

Item was added:
+ ----- Method: PluggableTreeMorph>>shouldFilterColumnIndex: (in category 'filtering') -----
+ shouldFilterColumnIndex: anIndex
+ 
+ 	^ filterColumnIndex isNil or: [filterColumnIndex = anIndex]!

Item was changed:
  ----- Method: PluggableTreeMorph>>specialKeyPressed: (in category 'event handling') -----
  specialKeyPressed: asciiValue
  
  	(super specialKeyPressed: asciiValue)
  		ifTrue: [^ true].
+ 
+ 	asciiValue = Character tab asciiValue ifTrue: [
+ 		self highlightNextColumn.
+ 		^ true].
+ 
- 		
  	(#(8 13) includes: asciiValue) ifTrue: [
  		"backspace key" 
+ 		self highlightNoColumn. "i.e., remove filter"
- 		self removeFilter.
  		^ true].
  
  	^ false!



More information about the Squeak-dev mailing list