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