This review requests consists of 3 changesets, for each of which I am appending a summary below: - genericDropSourceCode.cs - browse&drop-Monticello.cs - browse&drag-Tools+System.cs tl;dr: You can now drop pretty much everything into the world to spawn a new tool for it. See also the attached screencast that I have recorded just for your entertainment. :-)
Screencast: https://shorturl.at/gkwC6
Please review & let me know when I can merge it! :D
Best, Christoph
=============== Summary (genericDropSourceCode.cs) ===============
Change Set: genericDropSourceCode Date: 26 January 2022 Author: Christoph Thiede
This changeset simplifies & generalizes the #dropSourceCode mechanism which you can observe by dragging a class or method from a tool into the world. With this patch, the coupling between PasteUpMorph and tools is eliminated, and other classes can easily participate in the mechanism by specifying the dragTransferType #sourceCode and providing a passenger that implements #browse and answers the tool-buildable or a window. In addition, it is now also possible to drag a string or text into the world to spawn a new workspace.
=============== Diff ===============
Object>>browse {*Tools-Browsing} · ct 1/26/2022 21:54 (changed) browse - ToolSet browseClass: self class + ^ ToolSet browseClass: self class
PasteUpMorph>>acceptDroppingMorph:event: {dropping/grabbing} · ct 1/27/2022 00:39 (changed) acceptDroppingMorph: dropped event: evt "The supplied morph, known to be acceptable to the receiver, is now to be assimilated; the precipitating event is supplied"
| aMorph | (self isWorldMorph and: [dropped isTransferMorph]) ifTrue: [ dropped dragTransferType = #filesAndDirectories ifTrue: [^ self dropFiles: dropped passenger event: evt]. dropped dragTransferType = #sourceCode - ifTrue: [^ self dropSourceCode: dropped passenger event: evt]]. + ifTrue: [^ self dropSourceCode: dropped passenger event: evt]. + (dropped passenger isString or: [dropped passenger isText]) + ifTrue: [^ self dropEditable: dropped passenger event: evt]]. aMorph := self morphToDropFrom: dropped. self isWorldMorph ifFalse: [super acceptDroppingMorph: aMorph event: evt] ifTrue: ["Add the given morph to this world and start stepping it if it wants to be." aMorph isInWorld ifFalse: [aMorph position: evt position]. self addMorphFront: aMorph. (aMorph fullBounds intersects: self viewBox) ifFalse: [Beeper beep. aMorph position: self bounds center]]. aMorph submorphsDo: [:m | (m isKindOf: HaloMorph) ifTrue: [m delete]]. aMorph allMorphsDo: "Establish any penDown morphs in new world" [:m | | tfm mm | m player ifNotNil: [m player getPenDown ifTrue: [((mm := m player costume) notNil and: [(tfm := mm owner transformFrom: self) notNil]) ifTrue: [self noteNewLocation: (tfm localPointToGlobal: mm referencePosition) forPlayer: m player]]]]. self isPartsBin ifTrue: [aMorph isPartsDonor: true. aMorph stopSteppingSelfAndSubmorphs. aMorph suspendEventHandler] ifFalse: [self world startSteppingSubmorphsOf: aMorph]. " self presenter morph: aMorph droppedIntoPasteUpMorph: self." self showingListView ifTrue: [self sortSubmorphsBy: (self valueOfProperty: #sortOrder). self currentWorld abandonAllHalos]. self bringTopmostsToFront.
PasteUpMorph>>dropEditable:event: {event handling} · ct 1/27/2022 00:38 + dropEditable: aStringOrText event: evt + + ^ self dropTool: aStringOrText edit event: evt
PasteUpMorph>>dropSourceCode:event: {event handling} · ct 1/27/2022 00:37 (changed) dropSourceCode: anObject event: evt
- (anObject isMethodReference and: [anObject isValid]) - ifTrue: [^ self dropSourceCode: anObject compiledMethod event: evt]. - - (anObject isBehavior or: [anObject isCompiledMethod]) - ifTrue: [ - | tool window | - tool := anObject isBehavior - ifTrue: [Browser new - setClass: anObject] - ifFalse: [CodeHolder new - setClass: anObject methodClass - selector: anObject selector]. - window := ToolBuilder open: tool. - window center: evt position. - window bounds: (window bounds translatedToBeWithin: self bounds)]. - - anObject isString - ifTrue: [anObject edit]. + ^ self dropTool: anObject browse event: evt
PasteUpMorph>>dropTool:event: {event handling} · ct 1/27/2022 00:37 + dropTool: tool event: evt + + | window | + tool ifNil: [^ self]. + + window := tool containingWindow ifNil: [ToolBuilder open: tool]. + window center: evt position. + window bounds: (window bounds translatedToBeWithin: self bounds). + ^ window
PasteUpMorph>>wantsDroppedTransferMorph: {dropping/grabbing} · ct 1/26/2022 22:11 (changed) wantsDroppedTransferMorph: transferMorph
^ self hasTransferMorphConverter or: [transferMorph dragTransferType = #filesAndDirectories] - or: [transferMorph dragTransferType = #sourceCode] + or: [transferMorph dragTransferType = #sourceCode] + or: [transferMorph passenger isString or: [transferMorph passenger isText]]
String>>edit {*toolbuilder-kernel} · ct 1/26/2022 22:13 (changed) edit
- UIManager default edit: self. + ^ Project uiManager edit: self.
SystemWindow>>openAsTool {*ToolBuilder-Morphic-opening} · ct 1/26/2022 21:53 (changed) openAsTool "Open this window as a tool, that is, honor the preferences such as #reuseWindows and #openToolsAttachedToMouseCursor." - + | meOrSimilarWindow | meOrSimilarWindow := self openInWorldExtent: self extent. - (Project uiManager openToolsAttachedToMouseCursor "and: [ | event | - event := self currentEvent. - event isMouse and: [event isMouseUp]]") ifTrue: [ - meOrSimilarWindow setProperty: #initialDrop toValue: true. - meOrSimilarWindow hasDropShadow: false. - self currentHand attachMorph: meOrSimilarWindow]. + (Project uiManager openToolsAttachedToMouseCursor + and: [ | event | + event := self currentEvent. + (event isMouse and: [event isMouseUp]) or: [event isDropEvent]]) + ifTrue: [ + meOrSimilarWindow setProperty: #initialDrop toValue: true. + meOrSimilarWindow hasDropShadow: false. + self currentHand attachMorph: meOrSimilarWindow]. ^ meOrSimilarWindow
Text>>edit {*ToolBuilder-Kernel} · ct 1/26/2022 22:13 (changed) edit
- UIManager default edit: self. + ^ Project uiManager edit: self.
=============== Summary (browse&drop-Monticello.cs) ===============
Change Set: browse&drop-Monticello Date: 27 January 2022 Author: Christoph Thiede
This changeset complements genericDropSourceCode.cs by specifying the #dragItem/#dragType protocol for most tools in the Monticello UI and providing proper implementations of #browse in the model classes. At a few places, multilingual support is improved, too.
As an entrypoint to this changeset, please read: MCToolWindowBuilder>>#listMorph:selection:menu:keystroke:drag:
=============== Diff ===============
MCClassDefinition>>browseVersions {browsing} · ct 1/26/2022 22:59 + browseVersions + + ^ self actualClass browse
MCConfiguration>>browse {actions} · ct 1/26/2022 22:02 (changed) browse | browser | browser := MCConfigurationBrowser new configuration: self copyForEdit. name ifNotNil: [:nm | browser label: browser defaultLabel , ' ' , nm]. - browser show + ^ browser show
MCDefinition>>browseVersions {browsing} · ct 1/26/2022 22:58 + browseVersions + + ^ nil
MCFileBasedRepository>>morphicOpen: {user interface} · ct 1/26/2022 22:22 (changed) morphicOpen: aWorkingCopy - (MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy) + ^ (MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy) show
MCMethodDefinition>>actualMethod {accessing} · ct 1/26/2022 22:39 + actualMethod + ^ self actualMethodIn: Environment current
MCMethodDefinition>>actualMethodIn: {accessing} · ct 1/27/2022 00:43 + actualMethodIn: anEnvironment + "Answer the installed compiled method that belongs to this definition, or a change record if this version of the method is no longer installed." + | class method | + class := (self actualClassIn: anEnvironment) ifNil: [^ nil]. + method := class compiledMethodAt: self selector ifAbsent: [nil]. + (method isNil or: [method timeStamp = self timeStamp]) + ifFalse: [method := (class changeRecordsAt: self selector) + detect: [:record | record stamp = self timeStamp] + ifNone: [nil]]. + ^ method
MCMethodDefinition>>browse {browsing} · ct 1/26/2022 23:00 (changed and recategorized) browse - | browser | - browser := MCSnapshotBrowser forSnapshot: (MCSnapshot fromDefinitions: {self}). - browser - categorySelection: 1; - classSelection: 1. - classIsMeta ifTrue: [browser switchBeClass]. - browser - protocolSelection: 1; - methodSelection: 1; - showLabelled: 'Snapshot of ', self summary. - ^ browser + + ^ self actualMethod ifNotNil: [:method | method isCompiledMethod + ifTrue: [method browse] + ifFalse: [self browseVersions]]
MCMethodDefinition>>browseVersions {browsing} · ct 1/26/2022 23:00 + browseVersions + + ^ ToolSet browseVersionsOf: self actualClass selector: self selector
MCOperationsBrowser>>methodAt: {accessing} · ct 1/26/2022 22:53 + methodAt: index + + ^ self items at: index
MCOperationsBrowser>>widgetSpecs {ui} · ct 1/26/2022 22:51 (changed) widgetSpecs Preferences annotationPanes ifFalse: [ ^#( - ((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0)) + ((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0)) ((textMorph: text) (0 0.4 1 1)) ) ].
^ #( - ((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0)) + ((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0)) ((textMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultAnnotationPaneHeight)) ((textMorph: text) (0 0.4 1 1) (0 defaultAnnotationPaneHeight 0 0)) )
MCOperationsList>>browse {ui} · ct 1/26/2022 22:02 (changed) browse - (self browserClass items: operations) show + ^ (self browserClass items: operations) show
MCPatch>>browse {ui} · ct 1/26/2022 22:02 (changed) browse - (self browserClass forPatch: self) show + ^ (self browserClass forPatch: self) show
MCPatchOperation>>browse {browsing} · ct 1/26/2022 22:58 + browse + + ^ self definition browseVersions
MCRepository>>browse {user interface} · ct 1/26/2022 22:21 + browse + + ^ self morphicOpen
MCRepository>>morphicOpen {user interface} · ct 1/26/2022 22:21 (changed) morphicOpen - self morphicOpen: nil + ^ self morphicOpen: nil
MCRepository>>morphicOpen: {user interface} · ct 1/26/2022 22:21 (changed) morphicOpen: aWorkingCopy - (MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show + ^ (MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show
MCRepositoryInspector>>packageAt: {morphic ui} · ct 1/26/2022 22:24 + packageAt: index + ^ nil
MCRepositoryInspector>>versionAt: {morphic ui} · ct 1/26/2022 22:25 + versionAt: index + + ^ repository versionNamed: (self versionNames at: index)
MCSnapshotBrowser>>categoryAt: {listing} · ct 1/26/2022 22:36 + categoryAt: index + ^ nil
MCSnapshotBrowser>>classAt: {listing} · ct 1/26/2022 22:37 + classAt: index + | className environment | + className := self visibleClasses at: index. + environment := self environmentInDisplayingImage. + ^ environment at: className ifAbsent: + [environment valueOf: className]
MCSnapshotBrowser>>methodAt: {listing} · ct 1/26/2022 22:34 + methodAt: index + ^ self visibleMethods at: index
MCSnapshotBrowser>>protocolAt: {listing} · ct 1/26/2022 22:35 + protocolAt: index + ^ nil
MCSnapshotBrowser>>widgetSpecs {morphic ui} · ct 1/27/2022 00:24 (changed) widgetSpecs
Preferences annotationPanes ifFalse: [ ^#( ((listMorph: category) (0 0 0.25 0.4)) ((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30)) ((listMorph: protocol) (0.50 0 0.75 0.4)) - ((listMorph:selection:menu:keystroke: methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4)) + ((listMorph:selection:menu:keystroke:drag: methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4)) ((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0)) ((codePane: text) (0 0.4 1 1)) ) ].
^#( ((listMorph: category) (0 0 0.25 0.4)) ((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30)) ((listMorph: protocol) (0.50 0 0.75 0.4)) - ((listMorph:selection:menu:keystroke: methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4)) + ((listMorph:selection:menu:keystroke:drag: methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4))
((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0))
((inputMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultInputFieldHeight)) ((codePane: text) (0 0.4 1 1) (0 defaultInputFieldHeight 0 0)) )
MCTool>>dragType: {morphic ui} · ct 1/26/2022 22:16 + dragType: anObject + + ^ #sourceCode
MCToolWindowBuilder>>listMorph: {building-parts} · ct 1/26/2022 22:19 (changed) listMorph: listSymbol ^ self listMorph: (listSymbol, 'List') asSymbol selection: (listSymbol, 'Selection') asSymbol - menu: (listSymbol, 'ListMenu:') asSymbol + menu: (listSymbol, 'ListMenu:') asSymbol + keystroke: nil + drag: (listSymbol, 'At:') asSymbol
MCToolWindowBuilder>>listMorph:selection: {building-parts} · ct 1/26/2022 22:27 (changed) listMorph: listSymbol selection: selectionSymbol - self listMorph: listSymbol selection: selectionSymbol menu: nil + ^ self listMorph: listSymbol selection: selectionSymbol menu: nil
MCToolWindowBuilder>>listMorph:selection:menu: {building-parts} · ct 1/26/2022 22:17 (changed) listMorph: listSymbol selection: selectionSymbol menu: menuSymbol - self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil + ^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil
MCToolWindowBuilder>>listMorph:selection:menu:keystroke: {building-parts} · ct 1/26/2022 22:17 (changed) listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol - | list | - list := builder pluggableListSpec new. - list - model: tool; - list: listSymbol; - getIndex: selectionSymbol; - setIndex: (selectionSymbol, ':') asSymbol; - frame: currentFrame. - menuSymbol ifNotNil: [list menu: menuSymbol]. - keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol]. - window children add: list + ^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil drag: nil
MCToolWindowBuilder>>listMorph:selection:menu:keystroke:drag: {building-parts} · ct 1/26/2022 22:27 + listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol drag: dragSymbol + | list | + list := builder pluggableListSpec new. + list + model: tool; + list: listSymbol; + getIndex: selectionSymbol; + setIndex: (selectionSymbol, ':') asSymbol; + frame: currentFrame; + dragItem: dragSymbol; + dragType: #dragType:. + menuSymbol ifNotNil: [list menu: menuSymbol]. + keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol]. + window children add: list
MCVersion>>browse {actions} · ct 1/27/2022 00:24 (changed) browse - (MCSnapshotBrowser forSnapshot: self snapshot) - label: 'Snapshot of ', self fileName; + ^ (MCSnapshotBrowser forSnapshot: self snapshot) + label: ('Snapshot of {1}' translated format: {self fileName}); show
MCVersionHistoryBrowser>>versionAt: {accessing} · ct 1/27/2022 00:16 + versionAt: index + ^ self repositoryGroup versionWithInfo: (self infos at: index)
MCVersionHistoryBrowser>>widgetSpecs {morphic ui} · ct 1/27/2022 00:16 (changed) widgetSpecs ^ #( - ((listMorph:selection:menu: list selection getMenu:) (0 0 0.3 1)) + ((listMorph:selection:menu:keystroke:drag: list selection getMenu: nil versionAt:) (0 0 0.3 1)) ((textMorph: summary) (0.3 0 1 1)) )
MCVersionInspector>>browse {accessing} · ct 1/26/2022 22:02 (changed) browse - self version browse + ^ self version browse
MCWorkingCopy>>browse {ui} · ct 1/27/2022 00:25 (changed) browse
- (MCSnapshotBrowser forSnapshot: self package snapshot) - label: 'Snapshot Browser: ', self packageName; - show. + ^ (MCSnapshotBrowser forSnapshot: self package snapshot) + label: ('Snapshot Browser: {1}' translated format: {self packageName}); + show
MCWorkingCopyBrowser>>repositoryAt: {morphic ui} · ct 1/26/2022 22:20 + repositoryAt: index + ^ self repositories at: index
MCWorkingCopyBrowser>>workingCopyAt: {morphic ui} · ct 1/26/2022 22:19 + workingCopyAt: index + ^ self workingCopies at: index
=============== Summary (browse&drag-Tools+System.cs) ===============
Change Set: browse&drag-Tools+System Date: 27 January 2022 Author: Christoph Thiede
This changeset complements genericDropSourceCode.cs by specifying the #dragItem/#dragType protocol for some changes tools and browsers, and providing proper implementations of #browse for changes.
All affected tools: - Change sorters (single + dual), change set browser - Dependency browser - Package browser - Preferences (no UI support yet, just follow the idiom to answer the browsing tool from #browse)
=============== Postscript ===============
('accessing' author classChanges classRemoves editPostscript hasPostscript methodChanges methodInfoFromRemoval: name name: numberOfChanges postscriptHasDependents printOn: removePostscript structures superclasses) ('change logging' addClass: changeClass:from: event: noteNewMethod:forClass:selector:priorMethod: removeSelector:class:priorMethod:lastMethodInfo: renameClass:from:to:) ('class changes' changedClassNames changedClasses changedClassesDo: classChangeAt: commentClass: containsClass: fatDefForClass: noteClassForgotten: noteClassStructure: noteRemovalOf: reorganizeClass: trimHistory) ('converting' convertApril2000:using: convertToCurrentVersion:refStream:) ('fileIn/Out' askAddedInstVars: askRemovedInstVars: askRenames:addTo:using: assurePostscriptExists assurePreambleExists buildMessageForMailOutWithUser: checkForAlienAuthorship checkForAnyAlienAuthorship checkForConversionMethods checkForSlips checkForUnclassifiedMethods checkForUncommentedClasses checkForUncommentedMethods checkForUnsentMessages chooseSubjectPrefixForEmail defaultChangeSetDirectory fileOut fileOutChangesFor:on: fileOutOn: fileOutPSFor:on: fileOutPostscriptOn: fileOutPreambleOn: lookForSlips mailOut objectForDataStream: postscript postscriptString postscriptString: postscript: preamble preambleString preambleString: preambleTemplate preamble: setPreambleToSay: summaryString summaryStringDelta: verboseFileOut) ('initialize-release' beIsolationSetFor: clear initialize isMoribund veryDeepCopyWith: wither zapHistory) ('isolation layers' invoke isolatedProject isolationSet: revoke uninstall) ('method changes' adoptSelector:forClass: atSelector:class:put: changedMessageList changedMessageListAugmented changedMethods changedMethodsDo: hasAnyChangeForSelector: messageListForChangesWhich:ifNone: methodChangesAtClass: removeSelectorChanges:class: selectorsInClass:) ('moving changes' absorbClass:from: absorbMethod:class:from: absorbStructureOfClass:from: assimilateAllChangesFoundIn: editPreamble expungeEmptyClassChangeEntries expungeUniclasses forgetAllChangesFoundIn: forgetChangesForClass:in: hasPreamble methodsWithAnyInitialsOtherThan: methodsWithInitialsOtherThan: methodsWithoutComments removeClassAndMetaClassChanges: removeClassChanges: removePreamble) ('testing' belongsToAProject containsMethodAtPosition: correspondingProject isEmpty methodsWithoutClassifications okayToRemove okayToRemoveInforming: projectsBelongedTo) ('private' addCoherency: atClass:add: atClass:includes: atSelector:class: changed:with: changeRecorderFor: fileOutClassDefinition:on: oldNameFor:) ('*Monticello-testing' isForPackageLoad) ('*Etoys-Squeakland-fileIn/Out' checkForSUnit) ('*Tools-Browsing' browse)
=============== Diff ===============
ChangeSet>>browse {*Tools-Browsing} · ct 1/26/2022 22:03 + browse + + ^ ChangeSetBrowser openOn: self
ChangeSorter>>buildChangeSetListWith: {toolbuilder} · ct 1/26/2022 22:04 (changed) buildChangeSetListWith: builder
| listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; list: #changeSetList; getSelected: #currentCngSet; setSelected: #showChangeSetNamed:; menu: #changeSetMenu:shifted:; keyPress: #changeSetListKey:from:; dragItem: #dragChangeSet:; + dragType: #dragTypeForChangeSet:; autoDeselect: false. ^ listSpec
ChangeSorter>>buildClassListWith: {toolbuilder} · ct 1/26/2022 22:06 (changed) buildClassListWith: builder
| listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; list: #classList; getSelected: #currentClassName; setSelected: #currentClassName:; menu: #classListMenu:shifted:; keyPress: #classListKey:from:; - dragItem: #dragClass:. + dragItem: #dragClass:; + dragType: #dragTypeForClass:. ^ listSpec
ChangeSorter>>buildMessageListWith: {toolbuilder} · ct 1/26/2022 22:07 (changed) buildMessageListWith: builder
| listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; list: #messageList; getSelected: #currentSelector; setSelected: #currentSelector:; menu: #messageMenu:shifted:; keyPress: #messageListKey:from:; - dragItem: #dragMessage:. + dragItem: #dragMessage:; + dragType: #dragTypeForMessage:. ^ listSpec
ChangeSorter>>dragTypeForChangeSet: {dragging} · ct 1/26/2022 22:04 + dragTypeForChangeSet: anIndex + + ^ #sourceCode
ChangeSorter>>dragTypeForClass: {dragging} · ct 1/26/2022 22:06 + dragTypeForClass: anIndex + + ^ #sourceCode
ChangeSorter>>dragTypeForMessage: {dragging} · ct 1/26/2022 22:06 + dragTypeForMessage: anIndex + + ^ #sourceCode
DependencyBrowser>>buildClassDepsWith: {toolbuilder} · ct 1/27/2022 00:03 (changed) buildClassDepsWith: builder | listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; name: 'Required Classes' ; list: #classDepsList; getIndex: #classDepsIndex; setIndex: #classDepsIndex:; menu: #classDepsMenu:; - keyPress: #classDepsKey:from:. + keyPress: #classDepsKey:from:; + dragItem: #dragFromClassDepAt:; + dragType: #dragTypeForClassDepAt:. ^listSpec
DependencyBrowser>>buildClassListWith: {toolbuilder} · ct 1/27/2022 00:07 (changed) buildClassListWith: builder | listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; name: 'Client classes' ; list: #classList; getIndex: #classListIndex; setIndex: #classListIndex:; menu: #classListMenu:; - keyPress: #classListKey:from:. + keyPress: #classListKey:from:; + dragItem: #dragFromClassAt:; + dragType: #dragTypeForClassAt:. ^listSpec
DependencyBrowser>>buildMessageListWith: {toolbuilder} · ct 1/27/2022 00:05 (changed) buildMessageListWith: builder | listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; name: 'Client methods' ; list: #messageList; getIndex: #messageListIndex; setIndex: #messageListIndex:; menu: #messageListMenu:; - keyPress: #messageListKey:from:. + keyPress: #messageListKey:from:; + dragItem: #dragFromMessageAt:; + dragType: #dragTypeForMessageAt:. ^listSpec
DependencyBrowser>>buildPackageDepsWith: {toolbuilder} · ct 1/27/2022 00:05 (changed) buildPackageDepsWith: builder | listSpec | listSpec := builder pluggableListSpec new. - listSpec + listSpec model: self; - name: 'Required Packages' ; - list: #packageDepsList; - getIndex: #packageDepsIndex; - setIndex: #packageDepsIndex:; - menu: #packageDepsMenu:; - keyPress: #packageDepsKey:from:. - ^listSpec + name: 'Required Packages'; + list: #packageDepsList; + getIndex: #packageDepsIndex; + setIndex: #packageDepsIndex:; + menu: #packageDepsMenu:; + keyPress: #packageDepsKey:from:; + dragItem: #dragFromPackageDepAt:; + dragType: #dragTypeForPackageDepAt:. + ^ listSpec
DependencyBrowser>>buildPackageListWith: {toolbuilder} · ct 1/27/2022 00:06 (changed) buildPackageListWith: builder | listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; name: 'Packages' ; list: #packageList; getIndex: #packageListIndex; setIndex: #packageListIndex:; menu: #packageListMenu:; - keyPress: #packageListKey:from:. + keyPress: #packageListKey:from:; + dragItem: #dragFromPackageAt:; + dragType: #dragTypeForPackageAt:. ^listSpec
DependencyBrowser>>dragFromClassAt: {class list} · ct 1/27/2022 00:08 + dragFromClassAt: anInteger + + ^ self environment classNamed: (self classList at: anInteger)
DependencyBrowser>>dragFromClassDepAt: {class dependencies} · ct 1/27/2022 00:04 + dragFromClassDepAt: anInteger + + ^ self environment classNamed: (self classDeps at: anInteger)
DependencyBrowser>>dragFromMessageAt: {message list} · ct 1/27/2022 00:08 + dragFromMessageAt: anInteger + + ^ self selectedClass >> (self messageList at: anInteger)
DependencyBrowser>>dragFromPackageAt: {package list} · ct 1/27/2022 00:10 + dragFromPackageAt: anInteger + + ^ PackageInfo named: (self packageList at: anInteger)
DependencyBrowser>>dragFromPackageDepAt: {package dependencies} · ct 1/27/2022 00:11 + dragFromPackageDepAt: anInteger + + ^ PackageInfo named: (self packageDeps at: anInteger)
DependencyBrowser>>dragTypeForClassAt: {class list} · ct 1/27/2022 00:07 + dragTypeForClassAt: anInteger + + ^ #sourceCode
DependencyBrowser>>dragTypeForClassDepAt: {class dependencies} · ct 1/27/2022 00:04 + dragTypeForClassDepAt: anInteger + + ^ #sourceCode
DependencyBrowser>>dragTypeForMessageAt: {message list} · ct 1/27/2022 00:08 + dragTypeForMessageAt: anInteger + + ^ #sourceCode
DependencyBrowser>>dragTypeForPackageAt: {package list} · ct 1/27/2022 00:10 + dragTypeForPackageAt: anInteger + + ^ #sourceCode
DependencyBrowser>>dragTypeForPackageDepAt: {package dependencies} · ct 1/27/2022 00:09 + dragTypeForPackageDepAt: anInteger + + ^ #sourceCode
PackagePaneBrowser>>buildPackageListWith: {toolbuilder} · ct 1/27/2022 00:11 (changed) buildPackageListWith: builder | listSpec | listSpec := builder pluggableListSpec new. listSpec model: self; name: #packageList; list: #packageList; getIndex: #packageListIndex; setIndex: #packageListIndex:; menu: #packageMenu:; - keyPress: #packageListKey:from:. + keyPress: #packageListKey:from:; + dragItem: #dragFromPackageAt:; + dragType: #dragTypeForPackageAt:. ^listSpec
PackagePaneBrowser>>dragFromPackageAt: {package list} · ct 1/27/2022 00:12 + dragFromPackageAt: anInteger + + ^ PackageInfo named: (self packageList at: anInteger)
PackagePaneBrowser>>dragTypeForPackageAt: {package list} · ct 1/27/2022 00:11 + dragTypeForPackageAt: anInteger + + ^ #sourceCode
PragmaPreference>>browse {browsing} · ct 1/26/2022 22:02 (changed) browse
- ToolSet + ^ ToolSet browse: self provider class - selector: self selectors first. + selector: self selectors first
Preference>>browse {browsing} · ct 1/26/2022 22:02 (changed) browse
- ToolSet + ^ ToolSet browse: Preferences class - selector: self selectors first. + selector: self selectors first
--- Sent from Squeak Inbox Talk ["genericDropSourceCode.1.cs"] ["browse&drop-Monticello.1.cs"] ["browse&drag-Tools+System.1.cs"]