[squeak-dev] The Inbox: Tools-jr.1172.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Aug 21 19:21:24 UTC 2022


A new version of Tools was added to project The Inbox:
http://source.squeak.org/inbox/Tools-jr.1172.mcz

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

Name: Tools-jr.1172
Author: jr
Time: 21 August 2022, 9:05:38.256081 pm
UUID: 17df5e65-b866-1d4e-8e93-e7010250f9cc
Ancestors: Tools-jr.1171

Add "back" and "forward" navigation to the system browser.

For now, they are hidden in the window menu (right click on the title bar) until somebody comes up with a better UI integration proposal.

Sometimes, browser display something that you cannot go back to, like the text for a new message or class that has not been saved yet, or simply nothing. Extend MessageNavigation to allow to record that users have navigated away from the previously viewed object. That allows them to go back from the state that is not saved.

=============== Diff against Tools-jr.1171 ===============

Item was changed:
  CodeHolder subclass: #Browser
+ 	instanceVariableNames: 'environment systemOrganizer classOrganizer metaClassOrganizer editSelection metaClassIndicated selectedSystemCategory selectedClassName selectedMessageName selectedMessageCategoryName classDefinition metaClassDefinition navigation'
- 	instanceVariableNames: 'environment systemOrganizer classOrganizer metaClassOrganizer editSelection metaClassIndicated selectedSystemCategory selectedClassName selectedMessageName selectedMessageCategoryName classDefinition metaClassDefinition'
  	classVariableNames: 'ListClassesHierarchically RecentClasses ShowClassIcons ShowMessageIcons SortMessageCategoriesAlphabetically'
  	poolDictionaries: ''
  	category: 'Tools-Browser'!
  
  !Browser commentStamp: 'cwp 12/27/2012 11:09' prior: 0!
  I represent a query path into the class descriptions, the software of the system.!

Item was added:
+ ----- Method: Browser>>addModelMenuItemsTo:forMorph:hand: (in category 'user interface') -----
+ addModelMenuItemsTo: aCustomMenu forMorph: aMorph hand: aHandMorph 
+ 	super addModelMenuItemsTo: aCustomMenu forMorph: aMorph hand: aHandMorph.
+ 	aCustomMenu add: 'navigate back' translated target: self action: #goBack;
+ 		add: 'navigate forward' translated target: self action: #goForward.!

Item was added:
+ ----- Method: Browser>>goBack (in category 'user interface') -----
+ goBack
+ 	| previous |
+ 	self okToChange ifFalse: [^ self].
+ 	previous := self navigation goBack.
+ 	previous ifNil: [^ self].
+ 	self navigation suspendNavigationLogDuring:
+ 		[previous isClassReference ifTrue: [self selectClassReferenced: previous].
+ 		previous isMethodReference ifTrue: [self selectMethodReferenced: previous]].!

Item was added:
+ ----- Method: Browser>>goForward (in category 'user interface') -----
+ goForward
+ 	| next |
+ 	self okToChange ifFalse: [^ self].
+ 	next := self navigation goForward.
+ 	next ifNil: [^ self].
+ 	self navigation suspendNavigationLogDuring:
+ 		[next isClassReference ifTrue: [self selectClassReferenced: next].
+ 		next isMethodReference ifTrue: [self selectMethodReferenced: next]].!

Item was changed:
  ----- Method: Browser>>metaClassIndicated: (in category 'metaclass') -----
  metaClassIndicated: trueOrFalse 
  	"Indicate whether browsing instance or class messages."
  
  	metaClassIndicated := trueOrFalse.
  	self setClassOrganizer.
  	self hasSystemCategorySelected ifTrue:
  		[self editSelection: (self hasClassSelected
  			ifFalse: [metaClassIndicated
  				ifTrue: [#none]
  				ifFalse: [#newClass]]
  			ifTrue: [#editClass])].
  	selectedMessageCategoryName := nil.
  	selectedMessageName := nil.
  	contents := nil.
+ 	editSelection caseOf:
+ 		{[#editClass] -> [self navigation current: (ClassReference class: self selectedClass)]}
+ 		otherwise: [self navigation current: nil].
  	self changed: #classSelectionChanged.
  	self changed: #messageCategoryList.
  	self changed: #messageList.
  	self changed: #contents.
  	self changed: #annotation.
  	self decorateButtons
  !

Item was added:
+ ----- Method: Browser>>navigation (in category 'accessing') -----
+ navigation
+ 	^ navigation ifNil: [navigation := MessageNavigation new]!

Item was changed:
  ----- Method: Browser>>selectClassNamed: (in category 'class list') -----
  selectClassNamed: aSymbolOrString
  	| className currentMessageCategoryName currentMessageName |
  
  	currentMessageCategoryName := [self selectedMessageCategoryName]
  										on: Error
  										do: [:ex| ex return: nil].
  	currentMessageName := [self selectedMessageName]
  								on: Error
  								do: [:ex| ex return: nil].
  								
  	selectedClassName := aSymbolOrString ifNotNil: [ aSymbolOrString asSymbol ].
  	self setClassOrganizer.
  	self setClassDefinition.
  
  	"Try to reselect the category and/or selector if the new class has them."
  	selectedMessageCategoryName :=(self messageCategoryList includes: currentMessageCategoryName)
  		ifTrue: [currentMessageCategoryName]
  		ifFalse: [nil].
  	selectedMessageName := (self messageList includes: currentMessageName)
  		ifTrue: [currentMessageName]
  		ifFalse: [nil].
  
  	self hasMessageSelected ifTrue:
  		[self editSelection: #editMessage] ifFalse:
  	[self hasMessageCategorySelected ifTrue:
  		[self editSelection: #newMessage] ifFalse:
  	[self classCommentIndicated
  		ifTrue: [self editSelection: #editComment]
  		ifFalse: [self editSelection: (self hasClassSelected not
  					ifTrue: [(metaClassIndicated or: [ self hasSystemCategorySelected not ])
  						ifTrue: [#none]
  						ifFalse: [#newClass]]
  					ifFalse: [#editClass])]]].
  	contents := nil.
+ 	editSelection caseOf:
+ 		{[#editClass] -> [self navigation current: (ClassReference class: self selectedClass)].
+ 		[#editMessage] -> [self navigation current: (MethodReference class: self selectedClass selector: selectedMessageName)]}
+ 		otherwise: [self navigation current: nil].
  	self selectedClass isNil
  		ifFalse: [className := self selectedClass name.
  					(RecentClasses includes: className)
  				ifTrue: [RecentClasses remove: className].
  			RecentClasses addFirst: className.
  			RecentClasses size > 16
  				ifTrue: [RecentClasses removeLast]].
  	self changed: #classSelectionChanged.
  	self changed: #classCommentText.
  	self changed: #classListIndex.	"update my selection"
  	self changed: #messageCategoryList.
  	self changed: #messageList.
  	self changed: #relabel.
  	self changed: #selectedSystemCategoryName.
  	self contentsChanged!

Item was added:
+ ----- Method: Browser>>selectClassReferenced: (in category 'user interface') -----
+ selectClassReferenced: aClassReference
+ 	| class |
+ 	class := aClassReference actualClass.
+ 	self
+ 		selectCategoryForClass: class theNonMetaClass;
+ 		selectClassNamed: aClassReference classSymbol;
+ 		metaClassIndicated: class isMeta.!

Item was changed:
  ----- Method: Browser>>selectMessageNamed: (in category 'message list') -----
  selectMessageNamed: aSymbolOrString
  	| name |
  	name := aSymbolOrString ifNotNil: [ aSymbolOrString asSymbol ].
  	selectedMessageName := name.
  
  	self editSelection: (name notNil
  		ifTrue: [#editMessage]
  		ifFalse: [self messageCategoryListIndex > 0
  			ifTrue: [#newMessage]
  			ifFalse: [self hasClassSelected
  				ifTrue: [#editClass]
  				ifFalse: [#newClass]]]).
  	contents := nil.
  	self changed: #messageListIndex. "update my selection"
  	self contentsChanged.
+ 	self decorateButtons.
+ 	self navigation current: (MethodReference class: self selectedClass selector: selectedMessageName).!
- 	self decorateButtons.!

Item was added:
+ ----- Method: Browser>>selectMethodReferenced: (in category 'user interface') -----
+ selectMethodReferenced: aMethodReference
+ 	| class |
+ 	class := aMethodReference actualClass.
+ 	navigation suspendNavigationLogDuring:
+ 		[self
+ 			selectCategoryForClass: class theNonMetaClass;
+ 			selectClassNamed: aMethodReference classSymbol.
+ 		class isMeta ifTrue: [self indicateClassMessages] ifFalse: [self indicateInstanceMessages].
+ 		self selectMessageCategoryNamed: aMethodReference category].
+ 	self selectMessageNamed: aMethodReference selector.!

Item was changed:
  ----- Method: MessageNavigation>>current: (in category 'navigating') -----
  current: aMethodReferenceOrClassReference
+ 	"Note the given object as the one currently viewed. Update the history accordingly. If the object is nil, indicate that nothing is currently viewed, but add the previously viewed object to the history."
- 	"Note the given object as the one currently viewed. Update the history accordingly."
  	suspendLevel > 0 ifTrue: [^ self].
+ 	(current notNil & aMethodReferenceOrClassReference notNil
+ 		and: [current = aMethodReferenceOrClassReference]) ifTrue: [^ self].
- 	current = aMethodReferenceOrClassReference ifTrue: [^ self].
  	(backwardHistory notEmpty and: [aMethodReferenceOrClassReference = backwardHistory last]) ifTrue: [^ self goBack].
  	(forwardHistory notEmpty and: [aMethodReferenceOrClassReference = forwardHistory last]) ifTrue: [^ self goForward].
  	current ifNotNil: [backwardHistory addLast: current].
  	current := aMethodReferenceOrClassReference.
+ 	aMethodReferenceOrClassReference ifNotNil: [forwardHistory removeAll].!
- 	forwardHistory removeAll.!



More information about the Squeak-dev mailing list