<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Christoph,<div class=""><br class=""></div><div class="">I'm not sure if these commits are the cause of this, but it seems possible enough.</div><div class=""><br class=""></div><div class="">Dragging a messageName (method list item) from the right-most pane of a browser is a feature that has existed for some time, as I'm sure you know.  It used to be that one could "cancel" the drag by returning the drag to its original source pane and releasing the mouse button.  (I recall this would 'repel' the dragged morph and make the 'garbage can' sound, one of those cute Morphic animations.)</div><div class=""><br class=""></div><div class="">But now in 6.0beta-21848 (and earlier?), letting go of the drag with the pointer over the original position instead opens up a new window with a message list browser on the item that is no longer being dragged.  I have uploading a screen recording here:</div><div class=""><br class=""></div><div class=""><a href="https://youtu.be/DW68lMEc49c" class="">https://youtu.be/DW68lMEc49c</a></div><div class=""><br class=""></div><div class="">and created a GitHub issue here: </div><div class=""><br class=""></div><div class=""><a href="https://github.com/squeak-smalltalk/squeak-object-memory/issues/34" class="">https://github.com/squeak-smalltalk/squeak-object-memory/issues/34</a></div><div class=""><br class=""></div><div class="">Can the previous behavior of canceling the drag and repelling the morph be resurrected?  Or at least not open a window when the morph lands where it began.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Tim J</div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jan 30, 2022, at 4:02 PM, <a href="mailto:christoph.thiede@student.hpi.uni-potsdam.de" class="">christoph.thiede@student.hpi.uni-potsdam.de</a> wrote:</div><br class="Apple-interchange-newline"><div class="">Hi all,<br class="">
<br class="">
here is an updated version that ensures that dropped methods are only opened in a compact CodeHolder rather than a full browser. Thanks to Marcel for the feedback!<br class="">
<br class="">
To make this possible, PasteUpMorph>>#dropSourceCode:event: now checks whether the droppee understands #browseCompact and sends this message preferably instead of #browse. CompiledMethod and MethodReference implement this new selector and dispatch this via the ToolSet to CodeHolder. Not 100% sure whether the ToolSet abstraction is useful here.<br class="">
<br class="">
---<br class="">
<br class="">
Also, here is one more generic thought: With this changeset, we effectively provide the ToolBuilder significantly more information about the object being represented in a list. Thinking of this abstraction rather as a framework than as a libary only, why do we express this information in such a concealed way? If I were to build a new framework, instead of ...<br class="">
<br class="">
    listSpec<br class="">
        dragItem: #dragFromPackageAt:;<br class="">
        dragType: #dragTypeForPackageAt:<br class="">
<br class="">
... I would design my spec class to simply understand ...<br class="">
<br class="">
    listSpec itemSourceCode: #packageAt:<br class="">
<br class="">
... that is, just *inform* the ToolBuilder about the objects we are dealing with and leave it up to the ToolBuilder how to deal with this information, i.e., how to present it to the user or allow them to interact with it. We must not forget that the ToolBuilder is an abstraction from different UI frameworks, and drag'n'drop is just a concrete gesture in a specific framework. This also might be in line with [1] where I'd prefer something like #itemText over handling shortcuts in the model and invoking the Clipboard manually. In the end, new models would not even need to maintain a derived string list but simply provide the ToolBuilder with a) the original list of domain entities and b) an optional string conversion selector. By the way, this is also how we deal with icons and help texts already. Then the only inconveniene remains that currently, the model is made responsible for looking up the item in the list (all the ugly #'...At:' selectors ...).<br class="">
<br class="">
tl;dr: Do you think it would it be a better idea to abstract from the concrete drag'n'drop gesture and just tell the ToolBuilder about the underlying object instances? We could still keep the existing drag/drop protocol on the pluggable classes for compatibilty reasons and Morphic-specific model implementations.<br class="">
<br class="">
Best,<br class="">
Christoph<br class="">
<br class="">
[1] <a href="http://lists.squeakfoundation.org/pipermail/squeak-dev/2022-January/218745.html" class="">http://lists.squeakfoundation.org/pipermail/squeak-dev/2022-January/218745.html </a><br class="">
<br class="">
<b class="">=============== Summary (genericDropSourceCode.2.cs) ===============</b><br class="">
<br class="">
Change Set:        genericDropSourceCode<br class="">
Date:            26 January 2022<br class="">
Author:            Christoph Thiede<br class="">
<br class="">
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.<br class="">
<br class="">
<b class="">=============== Postscript ===============</b><br class="">
<br class="">
<font class="">ChangeSorter</font><font class=""> </font><font color="#000080" class="">removeSelector:</font><font class=""> </font><font color="#000080" class="">#open</font><br class="">
<br class="">
<b class="">=============== Diff ===============</b><br class="">
<br class="">
<b class="">CodeHolder>>open {toolbuilder} · ct 1/31/2022 00:18</b><br class="">
<font color="#FF0000" class="">+ open<br class="">
+ <br class="">
+     ^ ToolBuilder open: self</font><br class="">
<br class="">
<b class="">CompiledMethod>>browseCompact {*Tools-Browsing} · ct 1/31/2022 00:15</b><br class="">
<font color="#FF0000" class="">+ browseCompact<br class="">
+ <br class="">
+     ^ ToolSet browseMethodCompact: self</font><br class="">
<br class="">
<b class="">MethodReference>>browse {*Tools-Browsing} · ct 9/21/2019 18:01 (changed)</b><br class="">
browse<br class="">
<br class="">
    ^ ToolSet browse: self actualClass selector: self selector<br class="">
<br class="">
<b class="">MethodReference>>browseCompact {*Tools-Browsing} · ct 1/31/2022 00:28</b><br class="">
<font color="#FF0000" class="">+ browseCompact<br class="">
+ <br class="">
+     ^ ToolSet browseCompact: self actualClass selector: self selector</font><br class="">
<br class="">
<b class="">Object>>browse {*Tools-Browsing} · ct 1/26/2022 21:54 (changed)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     ToolSet browseClass: self class<br class="">
</font></s><font color="#FF0000" class="">+     ^ ToolSet browseClass: self class</font><br class="">
<br class="">
<b class="">PasteUpMorph>>acceptDroppingMorph:event: {dropping/grabbing} · ct 1/27/2022 00:39 (changed)</b><br class="">
acceptDroppingMorph: dropped event: evt<br class="">
    "The supplied morph, known to be acceptable to the receiver, is now to be assimilated; the precipitating event is supplied"<br class="">
<br class="">
    | aMorph |<br class="">
    (self isWorldMorph and: [dropped isTransferMorph]) ifTrue: [<br class="">
        dropped dragTransferType = #filesAndDirectories<br class="">
            ifTrue: [^ self dropFiles: dropped passenger event: evt].<br class="">
        dropped dragTransferType = #sourceCode<br class="">
<s class=""><font color="#0000FF" class="">-             ifTrue: [^ self dropSourceCode: dropped passenger event: evt]].<br class="">
</font></s><font color="#FF0000" class="">+             ifTrue: [^ self dropSourceCode: dropped passenger event: evt].<br class="">
+         (dropped passenger isString or: [dropped passenger isText])<br class="">
+             ifTrue: [^ self dropEditable: dropped passenger event: evt]].<br class="">
</font>    <br class="">
    aMorph := self morphToDropFrom: dropped.<br class="">
    self isWorldMorph<br class="">
        ifFalse: [super acceptDroppingMorph: aMorph event: evt]<br class="">
        ifTrue: <br class="">
            ["Add the given morph to this world and start stepping it if it wants to be."<br class="">
            aMorph isInWorld ifFalse: [aMorph position: evt position].<br class="">
            self addMorphFront: aMorph.<br class="">
            (aMorph fullBounds intersects: self viewBox) ifFalse:<br class="">
                [Beeper beep.<br class="">
                aMorph position: self bounds center]].<br class="">
    <br class="">
    aMorph submorphsDo: [:m | (m isKindOf: HaloMorph) ifTrue: [m delete]].<br class="">
    aMorph allMorphsDo:  "Establish any penDown morphs in new world"<br class="">
        [:m | | tfm mm |<br class="">
        m player ifNotNil:<br class="">
            [m player getPenDown ifTrue:<br class="">
                [((mm := m player costume) notNil and: [(tfm := mm owner transformFrom: self) notNil])<br class="">
                    ifTrue: [self noteNewLocation: (tfm localPointToGlobal: mm referencePosition)<br class="">
                                    forPlayer: m player]]]].<br class="">
    <br class="">
    self isPartsBin<br class="">
        ifTrue:<br class="">
            [aMorph isPartsDonor: true.<br class="">
            aMorph stopSteppingSelfAndSubmorphs.<br class="">
            aMorph suspendEventHandler]<br class="">
        ifFalse:<br class="">
            [self world startSteppingSubmorphsOf: aMorph].<br class="">
    <br class="">
"    self presenter morph: aMorph droppedIntoPasteUpMorph: self."<br class="">
    self showingListView ifTrue:<br class="">
        [self sortSubmorphsBy: (self valueOfProperty: #sortOrder).<br class="">
        self currentWorld abandonAllHalos].<br class="">
    <br class="">
    self bringTopmostsToFront.<br class="">
<br class="">
<b class="">PasteUpMorph>>dropEditable:event: {event handling} · ct 1/27/2022 00:38</b><br class="">
<font color="#FF0000" class="">+ dropEditable: aStringOrText event: evt<br class="">
+ <br class="">
+     ^ self dropTool: aStringOrText edit event: evt</font><br class="">
<br class="">
<b class="">PasteUpMorph>>dropSourceCode:event: {event handling} · ct 1/31/2022 00:21 (changed)</b><br class="">
dropSourceCode: anObject event: evt<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     (anObject isMethodReference and: [anObject isValid])<br class="">
-         ifTrue: [^ self dropSourceCode: anObject compiledMethod event: evt].<br class="">
</font></s><font color="#FF0000" class="">+     | browser |<br class="">
+     browser := (anObject respondsTo: #browseCompact)<br class="">
+         ifTrue: [anObject browseCompact]<br class="">
+         ifFalse: [(anObject respondsTo: #browse)<br class="">
+             ifTrue: [anObject browse]].<br class="">
</font>    <br class="">
<s class=""><font color="#0000FF" class="">-     (anObject isBehavior or: [anObject isCompiledMethod])<br class="">
-         ifTrue: [<br class="">
-             | tool window |<br class="">
-             tool := anObject isBehavior<br class="">
-                 ifTrue: [Browser new<br class="">
-                     setClass: anObject]<br class="">
-                 ifFalse: [CodeHolder new<br class="">
-                     setClass: anObject methodClass<br class="">
-                     selector: anObject selector].<br class="">
-             window := ToolBuilder open: tool.<br class="">
-             window center: evt position.<br class="">
-             window bounds: (window bounds translatedToBeWithin: self bounds)].<br class="">
-     <br class="">
-     anObject isString<br class="">
-         ifTrue: [anObject edit].<br class="">
</font></s><font color="#FF0000" class="">+     ^ self dropTool: browser event: evt</font><br class="">
<br class="">
<b class="">PasteUpMorph>>dropTool:event: {event handling} · ct 1/27/2022 00:37</b><br class="">
<font color="#FF0000" class="">+ dropTool: tool event: evt<br class="">
+ <br class="">
+     | window |<br class="">
+     tool ifNil: [^ self].<br class="">
+     <br class="">
+     window := tool containingWindow ifNil: [ToolBuilder open: tool].<br class="">
+     window center: evt position.<br class="">
+     window bounds: (window bounds translatedToBeWithin: self bounds).<br class="">
+     ^ window</font><br class="">
<br class="">
<b class="">PasteUpMorph>>wantsDroppedTransferMorph: {dropping/grabbing} · ct 1/26/2022 22:11 (changed)</b><br class="">
wantsDroppedTransferMorph: transferMorph<br class="">
<br class="">
    ^ self hasTransferMorphConverter<br class="">
        or: [transferMorph dragTransferType = #filesAndDirectories]<br class="">
<s class=""><font color="#0000FF" class="">-         or: [transferMorph dragTransferType = #sourceCode]<br class="">
</font></s><font color="#FF0000" class="">+         or: [transferMorph dragTransferType = #sourceCode]<br class="">
+         or: [transferMorph passenger isString or: [transferMorph passenger isText]]</font><br class="">
<br class="">
<b class="">StandardToolSet class>>browseCompact:selector: {browsing} · ct 1/31/2022 00:18</b><br class="">
<font color="#FF0000" class="">+ browseCompact: aClass selector: aSymbol<br class="">
+ <br class="">
+     ^ CodeHolder new<br class="">
+         setClass: aClass<br class="">
+         selector: aSymbol;<br class="">
+         open</font><br class="">
<br class="">
<b class="">StandardToolSet class>>browseMethodCompact: {browsing} · ct 1/31/2022 00:17</b><br class="">
<font color="#FF0000" class="">+ browseMethodCompact: aCompiledMethod<br class="">
+     "Open the most convenient compact browser on aCompiledMethod, using a System Browser, a Versions Browser, or an Inspector."<br class="">
+ <br class="">
+     aCompiledMethod isInstalled<br class="">
+         ifTrue: [^ self browseCompact: aCompiledMethod methodClass selector: aCompiledMethod selector].<br class="">
+     ^ self browseMethod: aCompiledMethod</font><br class="">
<br class="">
<b class="">String>>edit {*toolbuilder-kernel} · ct 1/26/2022 22:13 (changed)</b><br class="">
edit<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     UIManager default edit: self.<br class="">
</font></s><font color="#FF0000" class="">+     ^ Project uiManager edit: self.</font><br class="">
<br class="">
<b class="">SystemWindow>>openAsTool {*ToolBuilder-Morphic-opening} · ct 1/26/2022 21:53 (changed)</b><br class="">
openAsTool<br class="">
    "Open this window as a tool, that is, honor the preferences such as #reuseWindows and #openToolsAttachedToMouseCursor."<br class="">
<s class=""><font color="#0000FF" class="">- <br class="">
</font></s><font color="#FF0000" class="">+     <br class="">
</font>    | meOrSimilarWindow |<br class="">
    meOrSimilarWindow := self openInWorldExtent: self extent.<br class="">
<s class=""><font color="#0000FF" class="">-     (Project uiManager openToolsAttachedToMouseCursor "and: [ | event |<br class="">
-         event := self currentEvent.<br class="">
-         event isMouse and: [event isMouseUp]]") ifTrue: [<br class="">
-         meOrSimilarWindow setProperty: #initialDrop toValue: true.<br class="">
-         meOrSimilarWindow hasDropShadow: false.<br class="">
-         self currentHand attachMorph: meOrSimilarWindow].<br class="">
</font></s><font color="#FF0000" class="">+     (Project uiManager openToolsAttachedToMouseCursor<br class="">
+         and: [ | event |<br class="">
+             event := self currentEvent.<br class="">
+             (event isMouse and: [event isMouseUp]) or: [event isDropEvent]])<br class="">
+                 ifTrue: [<br class="">
+                     meOrSimilarWindow setProperty: #initialDrop toValue: true.<br class="">
+                     meOrSimilarWindow hasDropShadow: false.<br class="">
+                     self currentHand attachMorph: meOrSimilarWindow].<br class="">
</font>    ^ meOrSimilarWindow<br class="">
<br class="">
<b class="">Text>>edit {*ToolBuilder-Kernel} · ct 1/26/2022 22:13 (changed)</b><br class="">
edit<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     UIManager default edit: self.<br class="">
</font></s><font color="#FF0000" class="">+     ^ Project uiManager edit: self.</font><br class="">
<br class="">
<b class="">ToolSet class>>browseMethod: {browsing} · ct 1/31/2022 00:16 (changed)</b><br class="">
browseMethod: aCompiledMethod<br class="">
    <br class="">
<s class=""><font color="#0000FF" class="">-     self default ifNil: [^ self inform: 'Cannot open Browser'].<br class="">
</font></s><font color="#FF0000" class="">+     self default ifNil: [^ self inform: 'Cannot open Browser' translated].<br class="">
</font>    ^ self default browseMethod: aCompiledMethod<br class="">
<br class="">
<b class="">ToolSet class>>browseMethodCompact: {browsing} · ct 1/31/2022 00:20</b><br class="">
<font color="#FF0000" class="">+ browseMethodCompact: aCompiledMethod<br class="">
+     <br class="">
+     self default ifNil: [^ self inform: 'Cannot open Browser' translated].<br class="">
+     ^ self default browseMethodCompact: aCompiledMethod</font><br class="">
<br class="">
<br class="">
<b class="">=============== Summary (browse&amp;drop-Monticello.2.cs) ===============</b><br class="">
<br class="">
Change Set:        browse&amp;drop-Monticello<br class="">
Date:            27 January 2022<br class="">
Author:            Christoph Thiede<br class="">
<br class="">
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.<br class="">
<br class="">
As an entrypoint to this changeset, please read: MCToolWindowBuilder>>#listMorph:selection:menu:keystroke:drag:<br class="">
<br class="">
<b class="">=============== Diff ===============</b><br class="">
<br class="">
<b class="">MCClassDefinition>>browseVersions {browsing} · ct 1/26/2022 22:59</b><br class="">
<font color="#FF0000" class="">+ browseVersions<br class="">
+ <br class="">
+     ^ self actualClass browse</font><br class="">
<br class="">
<b class="">MCConfiguration>>browse {actions} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
    | browser |<br class="">
    browser := MCConfigurationBrowser new configuration: self copyForEdit.<br class="">
    name ifNotNil: [:nm | browser label: browser defaultLabel , ' ' , nm].<br class="">
<s class=""><font color="#0000FF" class="">-     browser show<br class="">
</font></s><font color="#FF0000" class="">+     ^ browser show</font><br class="">
<br class="">
<b class="">MCDefinition>>browseVersions {browsing} · ct 1/26/2022 22:58</b><br class="">
<font color="#FF0000" class="">+ browseVersions<br class="">
+ <br class="">
+     ^ nil</font><br class="">
<br class="">
<b class="">MCFileBasedRepository>>morphicOpen: {user interface} · ct 1/26/2022 22:22 (changed)</b><br class="">
morphicOpen: aWorkingCopy<br class="">
<s class=""><font color="#0000FF" class="">-     (MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy)<br class="">
</font></s><font color="#FF0000" class="">+     ^ (MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy)<br class="">
</font>        show<br class="">
<br class="">
<b class="">MCMethodDefinition>>actualMethod {accessing} · ct 1/26/2022 22:39</b><br class="">
<font color="#FF0000" class="">+ actualMethod<br class="">
+     ^ self actualMethodIn: Environment current</font><br class="">
<br class="">
<b class="">MCMethodDefinition>>actualMethodIn: {accessing} · ct 1/27/2022 00:43</b><br class="">
<font color="#FF0000" class="">+ actualMethodIn: anEnvironment<br class="">
+     "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="">
+     | class method |<br class="">
+     class := (self actualClassIn: anEnvironment) ifNil: [^ nil].<br class="">
+     method := class compiledMethodAt: self selector ifAbsent: [nil].<br class="">
+     (method isNil or: [method timeStamp = self timeStamp])<br class="">
+         ifFalse: [method := (class changeRecordsAt: self selector)<br class="">
+             detect: [:record | record stamp = self timeStamp]<br class="">
+             ifNone: [nil]].<br class="">
+     ^ method</font><br class="">
<br class="">
<b class="">MCMethodDefinition>>browse {browsing} · ct 1/26/2022 23:00 (changed and recategorized)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     | browser |<br class="">
-     browser := MCSnapshotBrowser forSnapshot: (MCSnapshot fromDefinitions: {self}).<br class="">
-     browser<br class="">
-         categorySelection: 1;<br class="">
-         classSelection: 1.<br class="">
-     classIsMeta ifTrue: [browser switchBeClass].<br class="">
-     browser<br class="">
-         protocolSelection: 1;<br class="">
-         methodSelection: 1;<br class="">
-         showLabelled: 'Snapshot of ', self summary.<br class="">
-     ^ browser<br class="">
</font></s><font color="#FF0000" class="">+ <br class="">
+     ^ self actualMethod ifNotNil: [:method | method isCompiledMethod<br class="">
+         ifTrue: [method browse]<br class="">
+         ifFalse: [self browseVersions]]</font><br class="">
<br class="">
<b class="">MCMethodDefinition>>browseVersions {browsing} · ct 1/26/2022 23:00</b><br class="">
<font color="#FF0000" class="">+ browseVersions<br class="">
+ <br class="">
+     ^ ToolSet browseVersionsOf: self actualClass selector: self selector</font><br class="">
<br class="">
<b class="">MCOperationsBrowser>>methodAt: {accessing} · ct 1/26/2022 22:53</b><br class="">
<font color="#FF0000" class="">+ methodAt: index<br class="">
+ <br class="">
+     ^ self items at: index</font><br class="">
<br class="">
<b class="">MCOperationsBrowser>>widgetSpecs {ui} · ct 1/26/2022 22:51 (changed)</b><br class="">
widgetSpecs<br class="">
    Preferences annotationPanes ifFalse: [ ^#(<br class="">
<s class=""><font color="#0000FF" class="">-         ((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0))<br class="">
</font></s><font color="#FF0000" class="">+         ((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0))<br class="">
</font>        ((textMorph: text) (0 0.4 1 1))<br class="">
        ) ].<br class="">
<br class="">
    ^ #(<br class="">
<s class=""><font color="#0000FF" class="">-         ((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0))<br class="">
</font></s><font color="#FF0000" class="">+         ((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0))<br class="">
</font>        ((textMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultAnnotationPaneHeight))<br class="">
        ((textMorph: text) (0 0.4 1 1) (0 defaultAnnotationPaneHeight 0 0))<br class="">
    )<br class="">
<br class="">
<b class="">MCOperationsList>>browse {ui} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     (self browserClass items: operations) show<br class="">
</font></s><font color="#FF0000" class="">+     ^ (self browserClass items: operations) show</font><br class="">
<br class="">
<b class="">MCPatch>>browse {ui} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     (self browserClass forPatch: self) show<br class="">
</font></s><font color="#FF0000" class="">+     ^ (self browserClass forPatch: self) show</font><br class="">
<br class="">
<b class="">MCPatchOperation>>browse {browsing} · ct 1/26/2022 22:58</b><br class="">
<font color="#FF0000" class="">+ browse<br class="">
+ <br class="">
+     ^ self definition browseVersions</font><br class="">
<br class="">
<b class="">MCRepository>>browse {user interface} · ct 1/26/2022 22:21</b><br class="">
<font color="#FF0000" class="">+ browse<br class="">
+ <br class="">
+     ^ self morphicOpen</font><br class="">
<br class="">
<b class="">MCRepository>>morphicOpen {user interface} · ct 1/26/2022 22:21 (changed)</b><br class="">
morphicOpen<br class="">
<s class=""><font color="#0000FF" class="">-     self morphicOpen: nil<br class="">
</font></s><font color="#FF0000" class="">+     ^ self morphicOpen: nil</font><br class="">
<br class="">
<b class="">MCRepository>>morphicOpen: {user interface} · ct 1/26/2022 22:21 (changed)</b><br class="">
morphicOpen: aWorkingCopy<br class="">
<s class=""><font color="#0000FF" class="">-     (MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show<br class="">
</font></s><font color="#FF0000" class="">+     ^ (MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show</font><br class="">
<br class="">
<b class="">MCRepositoryInspector>>packageAt: {morphic ui} · ct 1/26/2022 22:24</b><br class="">
<font color="#FF0000" class="">+ packageAt: index<br class="">
+     ^ nil</font><br class="">
<br class="">
<b class="">MCRepositoryInspector>>versionAt: {morphic ui} · ct 1/26/2022 22:25</b><br class="">
<font color="#FF0000" class="">+ versionAt: index<br class="">
+ <br class="">
+     ^ repository versionNamed: (self versionNames at: index)</font><br class="">
<br class="">
<b class="">MCSnapshotBrowser>>categoryAt: {listing} · ct 1/26/2022 22:36</b><br class="">
<font color="#FF0000" class="">+ categoryAt: index<br class="">
+     ^ nil</font><br class="">
<br class="">
<b class="">MCSnapshotBrowser>>classAt: {listing} · ct 1/26/2022 22:37</b><br class="">
<font color="#FF0000" class="">+ classAt: index<br class="">
+     | className environment |<br class="">
+     className := self visibleClasses at: index.<br class="">
+     environment := self environmentInDisplayingImage.<br class="">
+     ^ environment at: className ifAbsent:<br class="">
+         [environment valueOf: className]</font><br class="">
<br class="">
<b class="">MCSnapshotBrowser>>methodAt: {listing} · ct 1/26/2022 22:34</b><br class="">
<font color="#FF0000" class="">+ methodAt: index<br class="">
+     ^ self visibleMethods at: index</font><br class="">
<br class="">
<b class="">MCSnapshotBrowser>>protocolAt: {listing} · ct 1/26/2022 22:35</b><br class="">
<font color="#FF0000" class="">+ protocolAt: index<br class="">
+     ^ nil</font><br class="">
<br class="">
<b class="">MCSnapshotBrowser>>widgetSpecs {morphic ui} · ct 1/27/2022 00:24 (changed)</b><br class="">
widgetSpecs<br class="">
<br class="">
    Preferences annotationPanes ifFalse: [ ^#(<br class="">
        ((listMorph: category) (0 0 0.25 0.4))<br class="">
        ((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30))<br class="">
        ((listMorph: protocol) (0.50 0 0.75 0.4))<br class="">
<s class=""><font color="#0000FF" class="">-         ((listMorph:selection:menu:keystroke:  methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4))<br class="">
</font></s><font color="#FF0000" class="">+         ((listMorph:selection:menu:keystroke:drag:  methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4))<br class="">
</font>        ((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0))<br class="">
        ((codePane: text) (0 0.4 1 1))<br class="">
        ) ].<br class="">
<br class="">
    ^#(<br class="">
        ((listMorph: category) (0 0 0.25 0.4))<br class="">
        ((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30))<br class="">
        ((listMorph: protocol) (0.50 0 0.75 0.4))<br class="">
<s class=""><font color="#0000FF" class="">-         ((listMorph:selection:menu:keystroke:  methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4))<br class="">
</font></s><font color="#FF0000" class="">+         ((listMorph:selection:menu:keystroke:drag:  methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4))<br class="">
</font><br class="">
        ((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0))<br class="">
<br class="">
        ((inputMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultInputFieldHeight))<br class="">
        ((codePane: text) (0 0.4 1 1) (0 defaultInputFieldHeight 0 0))<br class="">
        )<br class="">
<br class="">
<b class="">MCTool>>dragType: {morphic ui} · ct 1/26/2022 22:16</b><br class="">
<font color="#FF0000" class="">+ dragType: anObject<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">MCToolWindowBuilder>>listMorph: {building-parts} · ct 1/26/2022 22:19 (changed)</b><br class="">
listMorph: listSymbol<br class="">
    ^ self<br class="">
        listMorph: (listSymbol, 'List') asSymbol<br class="">
        selection: (listSymbol, 'Selection') asSymbol<br class="">
<s class=""><font color="#0000FF" class="">-         menu: (listSymbol, 'ListMenu:') asSymbol<br class="">
</font></s><font color="#FF0000" class="">+         menu: (listSymbol, 'ListMenu:') asSymbol<br class="">
+         keystroke: nil<br class="">
+         drag: (listSymbol, 'At:') asSymbol</font><br class="">
<br class="">
<b class="">MCToolWindowBuilder>>listMorph:selection: {building-parts} · ct 1/26/2022 22:27 (changed)</b><br class="">
listMorph: listSymbol selection: selectionSymbol<br class="">
<s class=""><font color="#0000FF" class="">-     self listMorph: listSymbol selection: selectionSymbol menu: nil<br class="">
</font></s><font color="#FF0000" class="">+     ^ self listMorph: listSymbol selection: selectionSymbol menu: nil</font><br class="">
<br class="">
<b class="">MCToolWindowBuilder>>listMorph:selection:menu: {building-parts} · ct 1/26/2022 22:17 (changed)</b><br class="">
listMorph: listSymbol selection: selectionSymbol menu: menuSymbol<br class="">
<s class=""><font color="#0000FF" class="">-     self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil<br class="">
</font></s><font color="#FF0000" class="">+     ^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil</font><br class="">
<br class="">
<b class="">MCToolWindowBuilder>>listMorph:selection:menu:keystroke: {building-parts} · ct 1/26/2022 22:17 (changed)</b><br class="">
listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol<br class="">
<s class=""><font color="#0000FF" class="">-     | list |<br class="">
-     list := builder pluggableListSpec new.<br class="">
-     list <br class="">
-         model: tool;<br class="">
-         list: listSymbol; <br class="">
-         getIndex: selectionSymbol; <br class="">
-         setIndex: (selectionSymbol, ':') asSymbol;<br class="">
-         frame: currentFrame.<br class="">
-     menuSymbol ifNotNil: [list menu: menuSymbol].<br class="">
-     keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol].<br class="">
-     window children add: list<br class="">
</font></s><font color="#FF0000" class="">+     ^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil drag: nil<br class="">
</font><br class="">
<br class="">
<b class="">MCToolWindowBuilder>>listMorph:selection:menu:keystroke:drag: {building-parts} · ct 1/26/2022 22:27</b><br class="">
<font color="#FF0000" class="">+ listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol drag: dragSymbol<br class="">
+     | list |<br class="">
+     list := builder pluggableListSpec new.<br class="">
+     list <br class="">
+         model: tool;<br class="">
+         list: listSymbol; <br class="">
+         getIndex: selectionSymbol; <br class="">
+         setIndex: (selectionSymbol, ':') asSymbol;<br class="">
+         frame: currentFrame;<br class="">
+         dragItem: dragSymbol;<br class="">
+         dragType: #dragType:.<br class="">
+     menuSymbol ifNotNil: [list menu: menuSymbol].<br class="">
+     keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol].<br class="">
+     window children add: list</font><br class="">
<br class="">
<b class="">MCVersion>>browse {actions} · ct 1/27/2022 00:24 (changed)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     (MCSnapshotBrowser forSnapshot: self snapshot)<br class="">
-         label: 'Snapshot of ', self fileName;<br class="">
</font></s><font color="#FF0000" class="">+     ^ (MCSnapshotBrowser forSnapshot: self snapshot)<br class="">
+         label: ('Snapshot of {1}' translated format: {self fileName});<br class="">
</font>        show<br class="">
<br class="">
<b class="">MCVersionHistoryBrowser>>versionAt: {accessing} · ct 1/27/2022 00:16</b><br class="">
<font color="#FF0000" class="">+ versionAt: index<br class="">
+     ^ self repositoryGroup versionWithInfo: (self infos at: index)</font><br class="">
<br class="">
<b class="">MCVersionHistoryBrowser>>widgetSpecs {morphic ui} · ct 1/27/2022 00:16 (changed)</b><br class="">
widgetSpecs<br class="">
    ^ #(<br class="">
<s class=""><font color="#0000FF" class="">-         ((listMorph:selection:menu: list selection getMenu:) (0 0 0.3 1))<br class="">
</font></s><font color="#FF0000" class="">+         ((listMorph:selection:menu:keystroke:drag: list selection getMenu: nil versionAt:) (0 0 0.3 1))<br class="">
</font>        ((textMorph: summary) (0.3 0 1 1))<br class="">
         )<br class="">
<br class="">
<b class="">MCVersionInspector>>browse {accessing} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
<s class=""><font color="#0000FF" class="">-     self version browse<br class="">
</font></s><font color="#FF0000" class="">+     ^ self version browse</font><br class="">
<br class="">
<b class="">MCWorkingCopy>>browse {ui} · ct 1/27/2022 00:25 (changed)</b><br class="">
browse<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     (MCSnapshotBrowser forSnapshot: self package snapshot)<br class="">
-             label: 'Snapshot Browser: ', self packageName;<br class="">
-             show.<br class="">
</font></s><font color="#FF0000" class="">+     ^ (MCSnapshotBrowser forSnapshot: self package snapshot)<br class="">
+             label: ('Snapshot Browser: {1}' translated format: {self packageName});<br class="">
+             show</font><br class="">
<br class="">
<b class="">MCWorkingCopyBrowser>>repositoryAt: {morphic ui} · ct 1/26/2022 22:20</b><br class="">
<font color="#FF0000" class="">+ repositoryAt: index<br class="">
+     ^ self repositories at: index</font><br class="">
<br class="">
<b class="">MCWorkingCopyBrowser>>workingCopyAt: {morphic ui} · ct 1/26/2022 22:19</b><br class="">
<font color="#FF0000" class="">+ workingCopyAt: index<br class="">
+     ^ self workingCopies at: index</font><br class="">
<br class="">
<br class="">
<b class="">=============== Summary (browse&amp;drag-Tools+System.2.cs) ===============</b><br class="">
<br class="">
Change Set:        browse&amp;drag-Tools+System<br class="">
Date:            27 January 2022<br class="">
Author:            Christoph Thiede<br class="">
<br class="">
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.<br class="">
<br class="">
All affected tools:<br class="">
- Change sorters (single + dual), change set browser<br class="">
- Dependency browser<br class="">
- Package browser<br class="">
- Preferences (no UI support yet, just follow the idiom to answer the browsing tool from #browse)<br class="">
<br class="">
<b class="">=============== Postscript ===============</b><br class="">
<br class="">
<font class="">(</font><font color="#800080" class="">'contents'</font><font class=""> </font><font color="#000080" class="">aboutToStyle:</font><font color="#FF0000" class=""> contents:notifying: defineMessageFrom:notifying: selectedMessage)<br class="">
('toolbuilder' buildClassDepsWith: buildClassListWith: buildMessageListWith: buildPackageDepsWith: buildPackageListWith: buildWith:)<br class="">
('class list' classList classListIndex classListIndex: classListMenu: classListSelection dragFromClassAt: dragTypeForClassAt: selectPackage: selectedClass selectedClassName selectedClassOrMetaClass)<br class="">
('package deps')<br class="">
('message list' dragFromMessageAt: dragTypeForMessageAt: messageList messageListIndex messageListIndex: messageListMenu: messageListSelection selectedMessageName)<br class="">
('package list' dragFromPackageAt: dragTypeForPackageAt: hasPackageSelected packageList packageList: packageListIndex packageListIndex: packageListKey:from: packageListMenu: packageListSelection selectedPackage selectedPackageName)<br class="">
('initialize-release' initialize)<br class="">
('accessing' autoSelectString autoSelectString: contentsSelection referencesToIt: selectedEnvironment windowTitle windowTitle:)<br class="">
('morphic ui' representsSameBrowseeAs:)<br class="">
('enumerating' depsForClassNamed:allSatisfy: depsForClassNamed:anySatisfy: depsForClassNamed:do: depsForPackageNamed:allSatisfy: depsForPackageNamed:anySatisfy: depsForPackageNamed:do:)<br class="">
('class dependencies' classDeps classDepsIndex classDepsIndex: classDepsKey:from: classDepsList classDepsMenu: classDepsSelection dragFromClassDepAt: dragTypeForClassDepAt:)<br class="">
('private - dependencies' computeClassDependenciesFor: computePackageAndClassDependencies: computePackageDependencies)<br class="">
('package dependencies' dragFromPackageDepAt: dragTypeForPackageDepAt: packageDeps packageDepsIndex packageDepsIndex: packageDepsList packageDepsMenu: packageDepsSelection)<br class="">
</font><br class="">
<br class="">
<b class="">=============== Diff ===============</b><br class="">
<br class="">
<b class="">ChangeSet>>browse {*Tools-Browsing} · ct 1/26/2022 22:03</b><br class="">
<font color="#FF0000" class="">+ browse<br class="">
+ <br class="">
+     ^ ChangeSetBrowser openOn: self</font><br class="">
<br class="">
<b class="">ChangeSorter>>buildChangeSetListWith: {toolbuilder} · ct 1/26/2022 22:04 (changed)</b><br class="">
buildChangeSetListWith: builder<br class="">
<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        list: #changeSetList; <br class="">
        getSelected: #currentCngSet; <br class="">
        setSelected: #showChangeSetNamed:; <br class="">
        menu: #changeSetMenu:shifted:; <br class="">
        keyPress: #changeSetListKey:from:;<br class="">
        dragItem: #dragChangeSet:;<br class="">
<font color="#FF0000" class="">+         dragType: #dragTypeForChangeSet:;<br class="">
</font>        autoDeselect: false.<br class="">
    ^ listSpec<br class="">
<br class="">
<b class="">ChangeSorter>>buildClassListWith: {toolbuilder} · ct 1/26/2022 22:06 (changed)</b><br class="">
buildClassListWith: builder<br class="">
<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        list: #classList; <br class="">
        getSelected: #currentClassName; <br class="">
        setSelected: #currentClassName:; <br class="">
        menu: #classListMenu:shifted:; <br class="">
        keyPress: #classListKey:from:;<br class="">
<s class=""><font color="#0000FF" class="">-         dragItem: #dragClass:.<br class="">
</font></s><font color="#FF0000" class="">+         dragItem: #dragClass:;<br class="">
+         dragType: #dragTypeForClass:.<br class="">
</font>    ^ listSpec<br class="">
<br class="">
<b class="">ChangeSorter>>buildMessageListWith: {toolbuilder} · ct 1/26/2022 22:07 (changed)</b><br class="">
buildMessageListWith: builder<br class="">
<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        list: #messageList; <br class="">
        getSelected: #currentSelector;<br class="">
        setSelected: #currentSelector:; <br class="">
        menu: #messageMenu:shifted:; <br class="">
        keyPress: #messageListKey:from:;<br class="">
<s class=""><font color="#0000FF" class="">-         dragItem: #dragMessage:.<br class="">
</font></s><font color="#FF0000" class="">+         dragItem: #dragMessage:;<br class="">
+         dragType: #dragTypeForMessage:.<br class="">
</font>    ^ listSpec<br class="">
<br class="">
<b class="">ChangeSorter>>dragTypeForChangeSet: {dragging} · ct 1/26/2022 22:04</b><br class="">
<font color="#FF0000" class="">+ dragTypeForChangeSet: anIndex<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">ChangeSorter>>dragTypeForClass: {dragging} · ct 1/26/2022 22:06</b><br class="">
<font color="#FF0000" class="">+ dragTypeForClass: anIndex<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">ChangeSorter>>dragTypeForMessage: {dragging} · ct 1/26/2022 22:06</b><br class="">
<font color="#FF0000" class="">+ dragTypeForMessage: anIndex<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">DependencyBrowser>>buildClassDepsWith: {toolbuilder} · ct 1/27/2022 00:03 (changed)</b><br class="">
buildClassDepsWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        name: 'Required Classes' ;<br class="">
        list: #classDepsList; <br class="">
        getIndex: #classDepsIndex; <br class="">
        setIndex: #classDepsIndex:; <br class="">
        menu: #classDepsMenu:; <br class="">
<s class=""><font color="#0000FF" class="">-         keyPress: #classDepsKey:from:.<br class="">
</font></s><font color="#FF0000" class="">+         keyPress: #classDepsKey:from:;<br class="">
+         dragItem: #dragFromClassDepAt:;<br class="">
+         dragType: #dragTypeForClassDepAt:.<br class="">
</font>    ^listSpec<br class="">
<br class="">
<br class="">
<b class="">DependencyBrowser>>buildClassListWith: {toolbuilder} · ct 1/27/2022 00:07 (changed)</b><br class="">
buildClassListWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        name: 'Client classes' ;<br class="">
        list: #classList; <br class="">
        getIndex: #classListIndex; <br class="">
        setIndex: #classListIndex:; <br class="">
        menu: #classListMenu:; <br class="">
<s class=""><font color="#0000FF" class="">-         keyPress: #classListKey:from:.<br class="">
</font></s><font color="#FF0000" class="">+         keyPress: #classListKey:from:;<br class="">
+         dragItem: #dragFromClassAt:;<br class="">
+         dragType: #dragTypeForClassAt:.<br class="">
</font>    ^listSpec<br class="">
<br class="">
<br class="">
<b class="">DependencyBrowser>>buildMessageListWith: {toolbuilder} · ct 1/27/2022 00:05 (changed)</b><br class="">
buildMessageListWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        name: 'Client methods' ;<br class="">
        list: #messageList; <br class="">
        getIndex: #messageListIndex; <br class="">
        setIndex: #messageListIndex:; <br class="">
        menu: #messageListMenu:; <br class="">
<s class=""><font color="#0000FF" class="">-         keyPress: #messageListKey:from:.<br class="">
</font></s><font color="#FF0000" class="">+         keyPress: #messageListKey:from:;<br class="">
+         dragItem: #dragFromMessageAt:;<br class="">
+         dragType: #dragTypeForMessageAt:.<br class="">
</font>    ^listSpec<br class="">
<br class="">
<br class="">
<b class="">DependencyBrowser>>buildPackageDepsWith: {toolbuilder} · ct 1/27/2022 00:05 (changed)</b><br class="">
buildPackageDepsWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
<s class=""><font color="#0000FF" class="">-     listSpec <br class="">
</font></s><font color="#FF0000" class="">+     listSpec<br class="">
</font>        model: self;<br class="">
<s class=""><font color="#0000FF" class="">-         name: 'Required Packages' ;<br class="">
-         list: #packageDepsList; <br class="">
-         getIndex: #packageDepsIndex; <br class="">
-         setIndex: #packageDepsIndex:; <br class="">
-         menu: #packageDepsMenu:; <br class="">
-         keyPress: #packageDepsKey:from:.<br class="">
-     ^listSpec<br class="">
</font></s><font color="#FF0000" class="">+         name: 'Required Packages';<br class="">
+         list: #packageDepsList;<br class="">
+         getIndex: #packageDepsIndex;<br class="">
+         setIndex: #packageDepsIndex:;<br class="">
+         menu: #packageDepsMenu:;<br class="">
+         keyPress: #packageDepsKey:from:;<br class="">
+         dragItem: #dragFromPackageDepAt:;<br class="">
+         dragType: #dragTypeForPackageDepAt:.<br class="">
+     ^ listSpec<br class="">
</font><br class="">
<br class="">
<b class="">DependencyBrowser>>buildPackageListWith: {toolbuilder} · ct 1/27/2022 00:06 (changed)</b><br class="">
buildPackageListWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        name: 'Packages' ;<br class="">
        list: #packageList; <br class="">
        getIndex: #packageListIndex; <br class="">
        setIndex: #packageListIndex:; <br class="">
        menu: #packageListMenu:; <br class="">
<s class=""><font color="#0000FF" class="">-         keyPress: #packageListKey:from:.<br class="">
</font></s><font color="#FF0000" class="">+         keyPress: #packageListKey:from:;<br class="">
+         dragItem: #dragFromPackageAt:;<br class="">
+         dragType: #dragTypeForPackageAt:.<br class="">
</font>    ^listSpec<br class="">
<br class="">
<br class="">
<b class="">DependencyBrowser>>dragFromClassAt: {class list} · ct 1/27/2022 00:08</b><br class="">
<font color="#FF0000" class="">+ dragFromClassAt: anInteger<br class="">
+ <br class="">
+     ^ self environment classNamed: (self classList at: anInteger)</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragFromClassDepAt: {class dependencies} · ct 1/27/2022 00:04</b><br class="">
<font color="#FF0000" class="">+ dragFromClassDepAt: anInteger<br class="">
+ <br class="">
+     ^ self environment classNamed: (self classDeps at: anInteger)</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragFromMessageAt: {message list} · ct 1/27/2022 00:08</b><br class="">
<font color="#FF0000" class="">+ dragFromMessageAt: anInteger<br class="">
+ <br class="">
+     ^ self selectedClass >> (self messageList at: anInteger)</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragFromPackageAt: {package list} · ct 1/27/2022 00:10</b><br class="">
<font color="#FF0000" class="">+ dragFromPackageAt: anInteger<br class="">
+ <br class="">
+     ^ PackageInfo named: (self packageList at: anInteger)</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragFromPackageDepAt: {package dependencies} · ct 1/27/2022 00:11</b><br class="">
<font color="#FF0000" class="">+ dragFromPackageDepAt: anInteger<br class="">
+ <br class="">
+     ^ PackageInfo named: (self packageDeps at: anInteger)</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragTypeForClassAt: {class list} · ct 1/27/2022 00:07</b><br class="">
<font color="#FF0000" class="">+ dragTypeForClassAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragTypeForClassDepAt: {class dependencies} · ct 1/27/2022 00:04</b><br class="">
<font color="#FF0000" class="">+ dragTypeForClassDepAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragTypeForMessageAt: {message list} · ct 1/27/2022 00:08</b><br class="">
<font color="#FF0000" class="">+ dragTypeForMessageAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragTypeForPackageAt: {package list} · ct 1/27/2022 00:10</b><br class="">
<font color="#FF0000" class="">+ dragTypeForPackageAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">DependencyBrowser>>dragTypeForPackageDepAt: {package dependencies} · ct 1/27/2022 00:09</b><br class="">
<font color="#FF0000" class="">+ dragTypeForPackageDepAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">PackagePaneBrowser>>buildPackageListWith: {toolbuilder} · ct 1/31/2022 00:24 (changed)</b><br class="">
buildPackageListWith: builder<br class="">
    | listSpec |<br class="">
    listSpec := builder pluggableListSpec new.<br class="">
    listSpec <br class="">
        model: self;<br class="">
        name: #packageList;<br class="">
        list: #packageList; <br class="">
        getIndex: #packageListIndex; <br class="">
        setIndex: #packageListIndex:; <br class="">
        menu: #packageMenu:; <br class="">
        keyPress: #packageListKey:from:.<br class="">
<s class=""><font color="#0000FF" class="">-     ^listSpec<br class="">
</font></s><font color="#FF0000" class="">+     Browser browseWithDragNDrop ifTrue: [<br class="">
+         listSpec<br class="">
+             dragItem: #dragFromPackageAt:;<br class="">
+             dragType: #dragTypeForPackageAt:].<br class="">
+     ^listSpec<br class="">
</font><br class="">
<br class="">
<b class="">PackagePaneBrowser>>dragFromPackageAt: {package list} · ct 1/27/2022 00:12</b><br class="">
<font color="#FF0000" class="">+ dragFromPackageAt: anInteger<br class="">
+ <br class="">
+     ^ PackageInfo named: (self packageList at: anInteger)</font><br class="">
<br class="">
<b class="">PackagePaneBrowser>>dragTypeForPackageAt: {package list} · ct 1/27/2022 00:11</b><br class="">
<font color="#FF0000" class="">+ dragTypeForPackageAt: anInteger<br class="">
+ <br class="">
+     ^ #sourceCode</font><br class="">
<br class="">
<b class="">PragmaPreference>>browse {browsing} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     ToolSet<br class="">
</font></s><font color="#FF0000" class="">+     ^ ToolSet<br class="">
</font>        browse: self provider class<br class="">
<s class=""><font color="#0000FF" class="">-         selector: self selectors first.<br class="">
</font></s><font color="#FF0000" class="">+         selector: self selectors first</font><br class="">
<br class="">
<b class="">Preference>>browse {browsing} · ct 1/26/2022 22:02 (changed)</b><br class="">
browse<br class="">
<br class="">
<s class=""><font color="#0000FF" class="">-     ToolSet<br class="">
</font></s><font color="#FF0000" class="">+     ^ ToolSet<br class="">
</font>        browse: Preferences class<br class="">
<s class=""><font color="#0000FF" class="">-         selector: self selectors first.<br class="">
</font></s><font color="#FF0000" class="">+         selector: self selectors first</font><br class="">
<br class="">
<font color="#808080" class="">---<br class="">
</font><font color="#808080" class=""><i class="">Sent from </i></font><font color="#808080" class=""><i class=""><a href="https://github.com/hpi-swa-lab/squeak-inbox-talk" class=""><u class=""><font color="#808080" class="">Squeak Inbox Talk</font></u></a></i></font><br class="">
<br class="">
On 2022-01-27T01:08:37+01:00, <a href="mailto:christoph.thiede@student.hpi.uni-potsdam.de" class="">christoph.thiede@student.hpi.uni-potsdam.de</a> wrote:<br class="">
<br class="">
> This review requests consists of 3 changesets, for each of which I am appending a summary below:<br class="">
> - genericDropSourceCode.cs<br class="">
> - browse&amp;drop-Monticello.cs<br class="">
> - browse&amp;drag-Tools+System.cs<br class="">
> 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 class="">
> <br class="">
> Screencast: <a href="https://shorturl.at/gkwC6" class="">https://shorturl.at/gkwC6</a><br class="">
> <br class="">
> Please review & let me know when I can merge it! :D<br class="">
> <br class="">
> Best,<br class="">
> Christoph<br class="">
> <br class="">
> =============== Summary (genericDropSourceCode.cs) ===============<br class="">
> <br class="">
> Change Set:????????genericDropSourceCode<br class="">
> Date:????????????26 January 2022<br class="">
> Author:????????????Christoph Thiede<br class="">
> <br class="">
> 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.<br class="">
> <br class="">
> =============== Diff ===============<br class="">
> <br class="">
> Object>>browse {*Tools-Browsing} ? ct 1/26/2022 21:54 (changed)<br class="">
> browse<br class="">
> - ????ToolSet browseClass: self class<br class="">
> + ????^ ToolSet browseClass: self class<br class="">
> <br class="">
> PasteUpMorph>>acceptDroppingMorph:event: {dropping/grabbing} ? ct 1/27/2022 00:39 (changed)<br class="">
> acceptDroppingMorph: dropped event: evt<br class="">
> ????"The supplied morph, known to be acceptable to the receiver, is now to be assimilated; the precipitating event is supplied"<br class="">
> <br class="">
> ????| aMorph |<br class="">
> ????(self isWorldMorph and: [dropped isTransferMorph]) ifTrue: [<br class="">
> ????????dropped dragTransferType = #filesAndDirectories<br class="">
> ????????????ifTrue: [^ self dropFiles: dropped passenger event: evt].<br class="">
> ????????dropped dragTransferType = #sourceCode<br class="">
> - ????????????ifTrue: [^ self dropSourceCode: dropped passenger event: evt]].<br class="">
> + ????????????ifTrue: [^ self dropSourceCode: dropped passenger event: evt].<br class="">
> + ????????(dropped passenger isString or: [dropped passenger isText])<br class="">
> + ????????????ifTrue: [^ self dropEditable: dropped passenger event: evt]].<br class="">
> ????<br class="">
> ????aMorph := self morphToDropFrom: dropped.<br class="">
> ????self isWorldMorph<br class="">
> ????????ifFalse: [super acceptDroppingMorph: aMorph event: evt]<br class="">
> ????????ifTrue: <br class="">
> ????????????["Add the given morph to this world and start stepping it if it wants to be."<br class="">
> ????????????aMorph isInWorld ifFalse: [aMorph position: evt position].<br class="">
> ????????????self addMorphFront: aMorph.<br class="">
> ????????????(aMorph fullBounds intersects: self viewBox) ifFalse:<br class="">
> ????????????????[Beeper beep.<br class="">
> ????????????????aMorph position: self bounds center]].<br class="">
> ????<br class="">
> ????aMorph submorphsDo: [:m | (m isKindOf: HaloMorph) ifTrue: [m delete]].<br class="">
> ????aMorph allMorphsDo:  "Establish any penDown morphs in new world"<br class="">
> ????????[:m | | tfm mm |<br class="">
> ????????m player ifNotNil:<br class="">
> ????????????[m player getPenDown ifTrue:<br class="">
> ????????????????[((mm := m player costume) notNil and: [(tfm := mm owner transformFrom: self) notNil])<br class="">
> ????????????????????ifTrue: [self noteNewLocation: (tfm localPointToGlobal: mm referencePosition)<br class="">
> ????????????????????????????????????forPlayer: m player]]]].<br class="">
> ????<br class="">
> ????self isPartsBin<br class="">
> ????????ifTrue:<br class="">
> ????????????[aMorph isPartsDonor: true.<br class="">
> ????????????aMorph stopSteppingSelfAndSubmorphs.<br class="">
> ????????????aMorph suspendEventHandler]<br class="">
> ????????ifFalse:<br class="">
> ????????????[self world startSteppingSubmorphsOf: aMorph].<br class="">
> ????<br class="">
> "????self presenter morph: aMorph droppedIntoPasteUpMorph: self."<br class="">
> ????self showingListView ifTrue:<br class="">
> ????????[self sortSubmorphsBy: (self valueOfProperty: #sortOrder).<br class="">
> ????????self currentWorld abandonAllHalos].<br class="">
> ????<br class="">
> ????self bringTopmostsToFront.<br class="">
> <br class="">
> PasteUpMorph>>dropEditable:event: {event handling} ? ct 1/27/2022 00:38<br class="">
> + dropEditable: aStringOrText event: evt<br class="">
> + <br class="">
> + ????^ self dropTool: aStringOrText edit event: evt<br class="">
> <br class="">
> PasteUpMorph>>dropSourceCode:event: {event handling} ? ct 1/27/2022 00:37 (changed)<br class="">
> dropSourceCode: anObject event: evt<br class="">
> <br class="">
> - ????(anObject isMethodReference and: [anObject isValid])<br class="">
> - ????????ifTrue: [^ self dropSourceCode: anObject compiledMethod event: evt].<br class="">
> - ????<br class="">
> - ????(anObject isBehavior or: [anObject isCompiledMethod])<br class="">
> - ????????ifTrue: [<br class="">
> - ????????????| tool window |<br class="">
> - ????????????tool := anObject isBehavior<br class="">
> - ????????????????ifTrue: [Browser new<br class="">
> - ????????????????????setClass: anObject]<br class="">
> - ????????????????ifFalse: [CodeHolder new<br class="">
> - ????????????????????setClass: anObject methodClass<br class="">
> - ????????????????????selector: anObject selector].<br class="">
> - ????????????window := ToolBuilder open: tool.<br class="">
> - ????????????window center: evt position.<br class="">
> - ????????????window bounds: (window bounds translatedToBeWithin: self bounds)].<br class="">
> - ????<br class="">
> - ????anObject isString<br class="">
> - ????????ifTrue: [anObject edit].<br class="">
> + ????^ self dropTool: anObject browse event: evt<br class="">
> <br class="">
> PasteUpMorph>>dropTool:event: {event handling} ? ct 1/27/2022 00:37<br class="">
> + dropTool: tool event: evt<br class="">
> + <br class="">
> + ????| window |<br class="">
> + ????tool ifNil: [^ self].<br class="">
> + ????<br class="">
> + ????window := tool containingWindow ifNil: [ToolBuilder open: tool].<br class="">
> + ????window center: evt position.<br class="">
> + ????window bounds: (window bounds translatedToBeWithin: self bounds).<br class="">
> + ????^ window<br class="">
> <br class="">
> PasteUpMorph>>wantsDroppedTransferMorph: {dropping/grabbing} ? ct 1/26/2022 22:11 (changed)<br class="">
> wantsDroppedTransferMorph: transferMorph<br class="">
> <br class="">
> ????^ self hasTransferMorphConverter<br class="">
> ????????or: [transferMorph dragTransferType = #filesAndDirectories]<br class="">
> - ????????or: [transferMorph dragTransferType = #sourceCode]<br class="">
> + ????????or: [transferMorph dragTransferType = #sourceCode]<br class="">
> + ????????or: [transferMorph passenger isString or: [transferMorph passenger isText]]<br class="">
> <br class="">
> String>>edit {*toolbuilder-kernel} ? ct 1/26/2022 22:13 (changed)<br class="">
> edit<br class="">
> <br class="">
> - ????UIManager default edit: self.<br class="">
> + ????^ Project uiManager edit: self.<br class="">
> <br class="">
> SystemWindow>>openAsTool {*ToolBuilder-Morphic-opening} ? ct 1/26/2022 21:53 (changed)<br class="">
> openAsTool<br class="">
> ????"Open this window as a tool, that is, honor the preferences such as #reuseWindows and #openToolsAttachedToMouseCursor."<br class="">
> - <br class="">
> + ????<br class="">
> ????| meOrSimilarWindow |<br class="">
> ????meOrSimilarWindow := self openInWorldExtent: self extent.<br class="">
> - ????(Project uiManager openToolsAttachedToMouseCursor "and: [ | event |<br class="">
> - ????????event := self currentEvent.<br class="">
> - ????????event isMouse and: [event isMouseUp]]") ifTrue: [<br class="">
> - ????????meOrSimilarWindow setProperty: #initialDrop toValue: true.<br class="">
> - ????????meOrSimilarWindow hasDropShadow: false.<br class="">
> - ????????self currentHand attachMorph: meOrSimilarWindow].<br class="">
> + ????(Project uiManager openToolsAttachedToMouseCursor<br class="">
> + ????????and: [ | event |<br class="">
> + ????????????event := self currentEvent.<br class="">
> + ????????????(event isMouse and: [event isMouseUp]) or: [event isDropEvent]])<br class="">
> + ????????????????ifTrue: [<br class="">
> + ????????????????????meOrSimilarWindow setProperty: #initialDrop toValue: true.<br class="">
> + ????????????????????meOrSimilarWindow hasDropShadow: false.<br class="">
> + ????????????????????self currentHand attachMorph: meOrSimilarWindow].<br class="">
> ????^ meOrSimilarWindow<br class="">
> <br class="">
> Text>>edit {*ToolBuilder-Kernel} ? ct 1/26/2022 22:13 (changed)<br class="">
> edit<br class="">
> <br class="">
> - ????UIManager default edit: self.<br class="">
> + ????^ Project uiManager edit: self.<br class="">
> <br class="">
> <br class="">
> =============== Summary (browse&amp;drop-Monticello.cs) ===============<br class="">
> <br class="">
> Change Set:????????browse&amp;drop-Monticello<br class="">
> Date:????????????27 January 2022<br class="">
> Author:????????????Christoph Thiede<br class="">
> <br class="">
> 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.<br class="">
> <br class="">
> As an entrypoint to this changeset, please read: MCToolWindowBuilder>>#listMorph:selection:menu:keystroke:drag:<br class="">
> <br class="">
> =============== Diff ===============<br class="">
> <br class="">
> MCClassDefinition>>browseVersions {browsing} ? ct 1/26/2022 22:59<br class="">
> + browseVersions<br class="">
> + <br class="">
> + ????^ self actualClass browse<br class="">
> <br class="">
> MCConfiguration>>browse {actions} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> ????| browser |<br class="">
> ????browser := MCConfigurationBrowser new configuration: self copyForEdit.<br class="">
> ????name ifNotNil: [:nm | browser label: browser defaultLabel , ' ' , nm].<br class="">
> - ????browser show<br class="">
> + ????^ browser show<br class="">
> <br class="">
> MCDefinition>>browseVersions {browsing} ? ct 1/26/2022 22:58<br class="">
> + browseVersions<br class="">
> + <br class="">
> + ????^ nil<br class="">
> <br class="">
> MCFileBasedRepository>>morphicOpen: {user interface} ? ct 1/26/2022 22:22 (changed)<br class="">
> morphicOpen: aWorkingCopy<br class="">
> - ????(MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy)<br class="">
> + ????^ (MCFileRepositoryInspector repository: self workingCopy: aWorkingCopy)<br class="">
> ????????show<br class="">
> <br class="">
> MCMethodDefinition>>actualMethod {accessing} ? ct 1/26/2022 22:39<br class="">
> + actualMethod<br class="">
> + ????^ self actualMethodIn: Environment current<br class="">
> <br class="">
> MCMethodDefinition>>actualMethodIn: {accessing} ? ct 1/27/2022 00:43<br class="">
> + actualMethodIn: anEnvironment<br class="">
> + ????"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="">
> + ????| class method |<br class="">
> + ????class := (self actualClassIn: anEnvironment) ifNil: [^ nil].<br class="">
> + ????method := class compiledMethodAt: self selector ifAbsent: [nil].<br class="">
> + ????(method isNil or: [method timeStamp = self timeStamp])<br class="">
> + ????????ifFalse: [method := (class changeRecordsAt: self selector)<br class="">
> + ????????????detect: [:record | record stamp = self timeStamp]<br class="">
> + ????????????ifNone: [nil]].<br class="">
> + ????^ method<br class="">
> <br class="">
> MCMethodDefinition>>browse {browsing} ? ct 1/26/2022 23:00 (changed and recategorized)<br class="">
> browse<br class="">
> - ????| browser |<br class="">
> - ????browser := MCSnapshotBrowser forSnapshot: (MCSnapshot fromDefinitions: {self}).<br class="">
> - ????browser<br class="">
> - ????????categorySelection: 1;<br class="">
> - ????????classSelection: 1.<br class="">
> - ????classIsMeta ifTrue: [browser switchBeClass].<br class="">
> - ????browser<br class="">
> - ????????protocolSelection: 1;<br class="">
> - ????????methodSelection: 1;<br class="">
> - ????????showLabelled: 'Snapshot of ', self summary.<br class="">
> - ????^ browser<br class="">
> + <br class="">
> + ????^ self actualMethod ifNotNil: [:method | method isCompiledMethod<br class="">
> + ????????ifTrue: [method browse]<br class="">
> + ????????ifFalse: [self browseVersions]]<br class="">
> <br class="">
> MCMethodDefinition>>browseVersions {browsing} ? ct 1/26/2022 23:00<br class="">
> + browseVersions<br class="">
> + <br class="">
> + ????^ ToolSet browseVersionsOf: self actualClass selector: self selector<br class="">
> <br class="">
> MCOperationsBrowser>>methodAt: {accessing} ? ct 1/26/2022 22:53<br class="">
> + methodAt: index<br class="">
> + <br class="">
> + ????^ self items at: index<br class="">
> <br class="">
> MCOperationsBrowser>>widgetSpecs {ui} ? ct 1/26/2022 22:51 (changed)<br class="">
> widgetSpecs<br class="">
> ????Preferences annotationPanes ifFalse: [ ^#(<br class="">
> - ????????((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0))<br class="">
> + ????????((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0))<br class="">
> ????????((textMorph: text) (0 0.4 1 1))<br class="">
> ????????) ].<br class="">
> <br class="">
> ????^ #(<br class="">
> - ????????((listMorph:selection:menu:keystroke: list selection methodListMenu: methodListKey:from:) (0 0 1 0.4) (0 0 0 0))<br class="">
> + ????????((listMorph:selection:menu:keystroke:drag: list selection methodListMenu: methodListKey:from: methodAt:) (0 0 1 0.4) (0 0 0 0))<br class="">
> ????????((textMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultAnnotationPaneHeight))<br class="">
> ????????((textMorph: text) (0 0.4 1 1) (0 defaultAnnotationPaneHeight 0 0))<br class="">
> ????)<br class="">
> <br class="">
> MCOperationsList>>browse {ui} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> - ????(self browserClass items: operations) show<br class="">
> + ????^ (self browserClass items: operations) show<br class="">
> <br class="">
> MCPatch>>browse {ui} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> - ????(self browserClass forPatch: self) show<br class="">
> + ????^ (self browserClass forPatch: self) show<br class="">
> <br class="">
> MCPatchOperation>>browse {browsing} ? ct 1/26/2022 22:58<br class="">
> + browse<br class="">
> + <br class="">
> + ????^ self definition browseVersions<br class="">
> <br class="">
> MCRepository>>browse {user interface} ? ct 1/26/2022 22:21<br class="">
> + browse<br class="">
> + <br class="">
> + ????^ self morphicOpen<br class="">
> <br class="">
> MCRepository>>morphicOpen {user interface} ? ct 1/26/2022 22:21 (changed)<br class="">
> morphicOpen<br class="">
> - ????self morphicOpen: nil<br class="">
> + ????^ self morphicOpen: nil<br class="">
> <br class="">
> MCRepository>>morphicOpen: {user interface} ? ct 1/26/2022 22:21 (changed)<br class="">
> morphicOpen: aWorkingCopy<br class="">
> - ????(MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show<br class="">
> + ????^ (MCRepositoryInspector repository: self workingCopy: aWorkingCopy) show<br class="">
> <br class="">
> MCRepositoryInspector>>packageAt: {morphic ui} ? ct 1/26/2022 22:24<br class="">
> + packageAt: index<br class="">
> + ????^ nil<br class="">
> <br class="">
> MCRepositoryInspector>>versionAt: {morphic ui} ? ct 1/26/2022 22:25<br class="">
> + versionAt: index<br class="">
> + <br class="">
> + ????^ repository versionNamed: (self versionNames at: index)<br class="">
> <br class="">
> MCSnapshotBrowser>>categoryAt: {listing} ? ct 1/26/2022 22:36<br class="">
> + categoryAt: index<br class="">
> + ????^ nil<br class="">
> <br class="">
> MCSnapshotBrowser>>classAt: {listing} ? ct 1/26/2022 22:37<br class="">
> + classAt: index<br class="">
> + ????| className environment |<br class="">
> + ????className := self visibleClasses at: index.<br class="">
> + ????environment := self environmentInDisplayingImage.<br class="">
> + ????^ environment at: className ifAbsent:<br class="">
> + ????????[environment valueOf: className]<br class="">
> <br class="">
> MCSnapshotBrowser>>methodAt: {listing} ? ct 1/26/2022 22:34<br class="">
> + methodAt: index<br class="">
> + ????^ self visibleMethods at: index<br class="">
> <br class="">
> MCSnapshotBrowser>>protocolAt: {listing} ? ct 1/26/2022 22:35<br class="">
> + protocolAt: index<br class="">
> + ????^ nil<br class="">
> <br class="">
> MCSnapshotBrowser>>widgetSpecs {morphic ui} ? ct 1/27/2022 00:24 (changed)<br class="">
> widgetSpecs<br class="">
> <br class="">
> ????Preferences annotationPanes ifFalse: [ ^#(<br class="">
> ????????((listMorph: category) (0 0 0.25 0.4))<br class="">
> ????????((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30))<br class="">
> ????????((listMorph: protocol) (0.50 0 0.75 0.4))<br class="">
> - ????????((listMorph:selection:menu:keystroke:  methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4))<br class="">
> + ????????((listMorph:selection:menu:keystroke:drag:  methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4))<br class="">
> ????????((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0))<br class="">
> ????????((codePane: text) (0 0.4 1 1))<br class="">
> ????????) ].<br class="">
> <br class="">
> ????^#(<br class="">
> ????????((listMorph: category) (0 0 0.25 0.4))<br class="">
> ????????((listMorph: class) (0.25 0 0.50 0.4) (0 0 0 -30))<br class="">
> ????????((listMorph: protocol) (0.50 0 0.75 0.4))<br class="">
> - ????????((listMorph:selection:menu:keystroke:  methodList methodSelection methodListMenu: methodListKey:from:) (0.75 0 1 0.4))<br class="">
> + ????????((listMorph:selection:menu:keystroke:drag:  methodList methodSelection methodListMenu: methodListKey:from: methodAt:) (0.75 0 1 0.4))<br class="">
> <br class="">
> ????????((buttonRow) (0.25 0.4 0.5 0.4) (0 -30 0 0))<br class="">
> <br class="">
> ????????((inputMorph: annotations) (0 0.4 1 0.4) (0 0 0 defaultInputFieldHeight))<br class="">
> ????????((codePane: text) (0 0.4 1 1) (0 defaultInputFieldHeight 0 0))<br class="">
> ????????)<br class="">
> <br class="">
> MCTool>>dragType: {morphic ui} ? ct 1/26/2022 22:16<br class="">
> + dragType: anObject<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> MCToolWindowBuilder>>listMorph: {building-parts} ? ct 1/26/2022 22:19 (changed)<br class="">
> listMorph: listSymbol<br class="">
> ????^ self<br class="">
> ????????listMorph: (listSymbol, 'List') asSymbol<br class="">
> ????????selection: (listSymbol, 'Selection') asSymbol<br class="">
> - ????????menu: (listSymbol, 'ListMenu:') asSymbol<br class="">
> + ????????menu: (listSymbol, 'ListMenu:') asSymbol<br class="">
> + ????????keystroke: nil<br class="">
> + ????????drag: (listSymbol, 'At:') asSymbol<br class="">
> <br class="">
> MCToolWindowBuilder>>listMorph:selection: {building-parts} ? ct 1/26/2022 22:27 (changed)<br class="">
> listMorph: listSymbol selection: selectionSymbol<br class="">
> - ????self listMorph: listSymbol selection: selectionSymbol menu: nil<br class="">
> + ????^ self listMorph: listSymbol selection: selectionSymbol menu: nil<br class="">
> <br class="">
> MCToolWindowBuilder>>listMorph:selection:menu: {building-parts} ? ct 1/26/2022 22:17 (changed)<br class="">
> listMorph: listSymbol selection: selectionSymbol menu: menuSymbol<br class="">
> - ????self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil<br class="">
> + ????^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil<br class="">
> <br class="">
> MCToolWindowBuilder>>listMorph:selection:menu:keystroke: {building-parts} ? ct 1/26/2022 22:17 (changed)<br class="">
> listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol<br class="">
> - ????| list |<br class="">
> - ????list := builder pluggableListSpec new.<br class="">
> - ????list <br class="">
> - ????????model: tool;<br class="">
> - ????????list: listSymbol; <br class="">
> - ????????getIndex: selectionSymbol; <br class="">
> - ????????setIndex: (selectionSymbol, ':') asSymbol;<br class="">
> - ????????frame: currentFrame.<br class="">
> - ????menuSymbol ifNotNil: [list menu: menuSymbol].<br class="">
> - ????keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol].<br class="">
> - ????window children add: list<br class="">
> + ????^ self listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: nil drag: nil<br class="">
> <br class="">
> <br class="">
> MCToolWindowBuilder>>listMorph:selection:menu:keystroke:drag: {building-parts} ? ct 1/26/2022 22:27<br class="">
> + listMorph: listSymbol selection: selectionSymbol menu: menuSymbol keystroke: keystrokeSymbol drag: dragSymbol<br class="">
> + ????| list |<br class="">
> + ????list := builder pluggableListSpec new.<br class="">
> + ????list <br class="">
> + ????????model: tool;<br class="">
> + ????????list: listSymbol; <br class="">
> + ????????getIndex: selectionSymbol; <br class="">
> + ????????setIndex: (selectionSymbol, ':') asSymbol;<br class="">
> + ????????frame: currentFrame;<br class="">
> + ????????dragItem: dragSymbol;<br class="">
> + ????????dragType: #dragType:.<br class="">
> + ????menuSymbol ifNotNil: [list menu: menuSymbol].<br class="">
> + ????keystrokeSymbol ifNotNil: [list keyPress: keystrokeSymbol].<br class="">
> + ????window children add: list<br class="">
> <br class="">
> MCVersion>>browse {actions} ? ct 1/27/2022 00:24 (changed)<br class="">
> browse<br class="">
> - ????(MCSnapshotBrowser forSnapshot: self snapshot)<br class="">
> - ????????label: 'Snapshot of ', self fileName;<br class="">
> + ????^ (MCSnapshotBrowser forSnapshot: self snapshot)<br class="">
> + ????????label: ('Snapshot of {1}' translated format: {self fileName});<br class="">
> ????????show<br class="">
> <br class="">
> MCVersionHistoryBrowser>>versionAt: {accessing} ? ct 1/27/2022 00:16<br class="">
> + versionAt: index<br class="">
> + ????^ self repositoryGroup versionWithInfo: (self infos at: index)<br class="">
> <br class="">
> MCVersionHistoryBrowser>>widgetSpecs {morphic ui} ? ct 1/27/2022 00:16 (changed)<br class="">
> widgetSpecs<br class="">
> ????^ #(<br class="">
> - ????????((listMorph:selection:menu: list selection getMenu:) (0 0 0.3 1))<br class="">
> + ????????((listMorph:selection:menu:keystroke:drag: list selection getMenu: nil versionAt:) (0 0 0.3 1))<br class="">
> ????????((textMorph: summary) (0.3 0 1 1))<br class="">
> ???? ????)<br class="">
> <br class="">
> MCVersionInspector>>browse {accessing} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> - ????self version browse<br class="">
> + ????^ self version browse<br class="">
> <br class="">
> MCWorkingCopy>>browse {ui} ? ct 1/27/2022 00:25 (changed)<br class="">
> browse<br class="">
> <br class="">
> - ????(MCSnapshotBrowser forSnapshot: self package snapshot)<br class="">
> - ????????????label: 'Snapshot Browser: ', self packageName;<br class="">
> - ????????????show.<br class="">
> + ????^ (MCSnapshotBrowser forSnapshot: self package snapshot)<br class="">
> + ????????????label: ('Snapshot Browser: {1}' translated format: {self packageName});<br class="">
> + ????????????show<br class="">
> <br class="">
> MCWorkingCopyBrowser>>repositoryAt: {morphic ui} ? ct 1/26/2022 22:20<br class="">
> + repositoryAt: index<br class="">
> + ????^ self repositories at: index<br class="">
> <br class="">
> MCWorkingCopyBrowser>>workingCopyAt: {morphic ui} ? ct 1/26/2022 22:19<br class="">
> + workingCopyAt: index<br class="">
> + ????^ self workingCopies at: index<br class="">
> <br class="">
> <br class="">
> =============== Summary (browse&amp;drag-Tools+System.cs) ===============<br class="">
> <br class="">
> Change Set:????????browse&amp;drag-Tools+System<br class="">
> Date:????????????27 January 2022<br class="">
> Author:????????????Christoph Thiede<br class="">
> <br class="">
> 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.<br class="">
> <br class="">
> All affected tools:<br class="">
> - Change sorters (single + dual), change set browser<br class="">
> - Dependency browser<br class="">
> - Package browser<br class="">
> - Preferences (no UI support yet, just follow the idiom to answer the browsing tool from #browse)<br class="">
> <br class="">
> =============== Postscript ===============<br class="">
> <br class="">
> ('accessing' author classChanges classRemoves editPostscript hasPostscript methodChanges methodInfoFromRemoval: name name: numberOfChanges postscriptHasDependents printOn: removePostscript structures superclasses)<br class="">
> ('change logging' addClass: changeClass:from: event: noteNewMethod:forClass:selector:priorMethod: removeSelector:class:priorMethod:lastMethodInfo: renameClass:from:to:)<br class="">
> ('class changes' changedClassNames changedClasses changedClassesDo: classChangeAt: commentClass: containsClass: fatDefForClass: noteClassForgotten: noteClassStructure: noteRemovalOf: reorganizeClass: trimHistory)<br class="">
> ('converting' convertApril2000:using: convertToCurrentVersion:refStream:)<br class="">
> ('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 class="">
> ('initialize-release' beIsolationSetFor: clear initialize isMoribund veryDeepCopyWith: wither zapHistory)<br class="">
> ('isolation layers' invoke isolatedProject isolationSet: revoke uninstall)<br class="">
> ('method changes' adoptSelector:forClass: atSelector:class:put: changedMessageList changedMessageListAugmented changedMethods changedMethodsDo: hasAnyChangeForSelector: messageListForChangesWhich:ifNone: methodChangesAtClass: removeSelectorChanges:class: selectorsInClass:)<br class="">
> ('moving changes' absorbClass:from: absorbMethod:class:from: absorbStructureOfClass:from: assimilateAllChangesFoundIn: editPreamble expungeEmptyClassChangeEntries expungeUniclasses forgetAllChangesFoundIn: forgetChangesForClass:in: hasPreamble methodsWithAnyInitialsOtherThan: methodsWithInitialsOtherThan: methodsWithoutComments removeClassAndMetaClassChanges: removeClassChanges: removePreamble)<br class="">
> ('testing' belongsToAProject containsMethodAtPosition: correspondingProject isEmpty methodsWithoutClassifications okayToRemove okayToRemoveInforming: projectsBelongedTo)<br class="">
> ('private' addCoherency: atClass:add: atClass:includes: atSelector:class: changed:with: changeRecorderFor: fileOutClassDefinition:on: oldNameFor:)<br class="">
> ('*Monticello-testing' isForPackageLoad)<br class="">
> ('*Etoys-Squeakland-fileIn/Out' checkForSUnit)<br class="">
> ('*Tools-Browsing' browse)<br class="">
> <br class="">
> <br class="">
> =============== Diff ===============<br class="">
> <br class="">
> ChangeSet>>browse {*Tools-Browsing} ? ct 1/26/2022 22:03<br class="">
> + browse<br class="">
> + <br class="">
> + ????^ ChangeSetBrowser openOn: self<br class="">
> <br class="">
> ChangeSorter>>buildChangeSetListWith: {toolbuilder} ? ct 1/26/2022 22:04 (changed)<br class="">
> buildChangeSetListWith: builder<br class="">
> <br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????list: #changeSetList; <br class="">
> ????????getSelected: #currentCngSet; <br class="">
> ????????setSelected: #showChangeSetNamed:; <br class="">
> ????????menu: #changeSetMenu:shifted:; <br class="">
> ????????keyPress: #changeSetListKey:from:;<br class="">
> ????????dragItem: #dragChangeSet:;<br class="">
> + ????????dragType: #dragTypeForChangeSet:;<br class="">
> ????????autoDeselect: false.<br class="">
> ????^ listSpec<br class="">
> <br class="">
> ChangeSorter>>buildClassListWith: {toolbuilder} ? ct 1/26/2022 22:06 (changed)<br class="">
> buildClassListWith: builder<br class="">
> <br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????list: #classList; <br class="">
> ????????getSelected: #currentClassName; <br class="">
> ????????setSelected: #currentClassName:; <br class="">
> ????????menu: #classListMenu:shifted:; <br class="">
> ????????keyPress: #classListKey:from:;<br class="">
> - ????????dragItem: #dragClass:.<br class="">
> + ????????dragItem: #dragClass:;<br class="">
> + ????????dragType: #dragTypeForClass:.<br class="">
> ????^ listSpec<br class="">
> <br class="">
> ChangeSorter>>buildMessageListWith: {toolbuilder} ? ct 1/26/2022 22:07 (changed)<br class="">
> buildMessageListWith: builder<br class="">
> <br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????list: #messageList; <br class="">
> ????????getSelected: #currentSelector;<br class="">
> ????????setSelected: #currentSelector:; <br class="">
> ????????menu: #messageMenu:shifted:; <br class="">
> ????????keyPress: #messageListKey:from:;<br class="">
> - ????????dragItem: #dragMessage:.<br class="">
> + ????????dragItem: #dragMessage:;<br class="">
> + ????????dragType: #dragTypeForMessage:.<br class="">
> ????^ listSpec<br class="">
> <br class="">
> ChangeSorter>>dragTypeForChangeSet: {dragging} ? ct 1/26/2022 22:04<br class="">
> + dragTypeForChangeSet: anIndex<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> ChangeSorter>>dragTypeForClass: {dragging} ? ct 1/26/2022 22:06<br class="">
> + dragTypeForClass: anIndex<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> ChangeSorter>>dragTypeForMessage: {dragging} ? ct 1/26/2022 22:06<br class="">
> + dragTypeForMessage: anIndex<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> DependencyBrowser>>buildClassDepsWith: {toolbuilder} ? ct 1/27/2022 00:03 (changed)<br class="">
> buildClassDepsWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????name: 'Required Classes' ;<br class="">
> ????????list: #classDepsList; <br class="">
> ????????getIndex: #classDepsIndex; <br class="">
> ????????setIndex: #classDepsIndex:; <br class="">
> ????????menu: #classDepsMenu:; <br class="">
> - ????????keyPress: #classDepsKey:from:.<br class="">
> + ????????keyPress: #classDepsKey:from:;<br class="">
> + ????????dragItem: #dragFromClassDepAt:;<br class="">
> + ????????dragType: #dragTypeForClassDepAt:.<br class="">
> ????^listSpec<br class="">
> <br class="">
> <br class="">
> DependencyBrowser>>buildClassListWith: {toolbuilder} ? ct 1/27/2022 00:07 (changed)<br class="">
> buildClassListWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????name: 'Client classes' ;<br class="">
> ????????list: #classList; <br class="">
> ????????getIndex: #classListIndex; <br class="">
> ????????setIndex: #classListIndex:; <br class="">
> ????????menu: #classListMenu:; <br class="">
> - ????????keyPress: #classListKey:from:.<br class="">
> + ????????keyPress: #classListKey:from:;<br class="">
> + ????????dragItem: #dragFromClassAt:;<br class="">
> + ????????dragType: #dragTypeForClassAt:.<br class="">
> ????^listSpec<br class="">
> <br class="">
> <br class="">
> DependencyBrowser>>buildMessageListWith: {toolbuilder} ? ct 1/27/2022 00:05 (changed)<br class="">
> buildMessageListWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????name: 'Client methods' ;<br class="">
> ????????list: #messageList; <br class="">
> ????????getIndex: #messageListIndex; <br class="">
> ????????setIndex: #messageListIndex:; <br class="">
> ????????menu: #messageListMenu:; <br class="">
> - ????????keyPress: #messageListKey:from:.<br class="">
> + ????????keyPress: #messageListKey:from:;<br class="">
> + ????????dragItem: #dragFromMessageAt:;<br class="">
> + ????????dragType: #dragTypeForMessageAt:.<br class="">
> ????^listSpec<br class="">
> <br class="">
> <br class="">
> DependencyBrowser>>buildPackageDepsWith: {toolbuilder} ? ct 1/27/2022 00:05 (changed)<br class="">
> buildPackageDepsWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> - ????listSpec <br class="">
> + ????listSpec<br class="">
> ????????model: self;<br class="">
> - ????????name: 'Required Packages' ;<br class="">
> - ????????list: #packageDepsList; <br class="">
> - ????????getIndex: #packageDepsIndex; <br class="">
> - ????????setIndex: #packageDepsIndex:; <br class="">
> - ????????menu: #packageDepsMenu:; <br class="">
> - ????????keyPress: #packageDepsKey:from:.<br class="">
> - ????^listSpec<br class="">
> + ????????name: 'Required Packages';<br class="">
> + ????????list: #packageDepsList;<br class="">
> + ????????getIndex: #packageDepsIndex;<br class="">
> + ????????setIndex: #packageDepsIndex:;<br class="">
> + ????????menu: #packageDepsMenu:;<br class="">
> + ????????keyPress: #packageDepsKey:from:;<br class="">
> + ????????dragItem: #dragFromPackageDepAt:;<br class="">
> + ????????dragType: #dragTypeForPackageDepAt:.<br class="">
> + ????^ listSpec<br class="">
> <br class="">
> <br class="">
> DependencyBrowser>>buildPackageListWith: {toolbuilder} ? ct 1/27/2022 00:06 (changed)<br class="">
> buildPackageListWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????name: 'Packages' ;<br class="">
> ????????list: #packageList; <br class="">
> ????????getIndex: #packageListIndex; <br class="">
> ????????setIndex: #packageListIndex:; <br class="">
> ????????menu: #packageListMenu:; <br class="">
> - ????????keyPress: #packageListKey:from:.<br class="">
> + ????????keyPress: #packageListKey:from:;<br class="">
> + ????????dragItem: #dragFromPackageAt:;<br class="">
> + ????????dragType: #dragTypeForPackageAt:.<br class="">
> ????^listSpec<br class="">
> <br class="">
> <br class="">
> DependencyBrowser>>dragFromClassAt: {class list} ? ct 1/27/2022 00:08<br class="">
> + dragFromClassAt: anInteger<br class="">
> + <br class="">
> + ????^ self environment classNamed: (self classList at: anInteger)<br class="">
> <br class="">
> DependencyBrowser>>dragFromClassDepAt: {class dependencies} ? ct 1/27/2022 00:04<br class="">
> + dragFromClassDepAt: anInteger<br class="">
> + <br class="">
> + ????^ self environment classNamed: (self classDeps at: anInteger)<br class="">
> <br class="">
> DependencyBrowser>>dragFromMessageAt: {message list} ? ct 1/27/2022 00:08<br class="">
> + dragFromMessageAt: anInteger<br class="">
> + <br class="">
> + ????^ self selectedClass >> (self messageList at: anInteger)<br class="">
> <br class="">
> DependencyBrowser>>dragFromPackageAt: {package list} ? ct 1/27/2022 00:10<br class="">
> + dragFromPackageAt: anInteger<br class="">
> + <br class="">
> + ????^ PackageInfo named: (self packageList at: anInteger)<br class="">
> <br class="">
> DependencyBrowser>>dragFromPackageDepAt: {package dependencies} ? ct 1/27/2022 00:11<br class="">
> + dragFromPackageDepAt: anInteger<br class="">
> + <br class="">
> + ????^ PackageInfo named: (self packageDeps at: anInteger)<br class="">
> <br class="">
> DependencyBrowser>>dragTypeForClassAt: {class list} ? ct 1/27/2022 00:07<br class="">
> + dragTypeForClassAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> DependencyBrowser>>dragTypeForClassDepAt: {class dependencies} ? ct 1/27/2022 00:04<br class="">
> + dragTypeForClassDepAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> DependencyBrowser>>dragTypeForMessageAt: {message list} ? ct 1/27/2022 00:08<br class="">
> + dragTypeForMessageAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> DependencyBrowser>>dragTypeForPackageAt: {package list} ? ct 1/27/2022 00:10<br class="">
> + dragTypeForPackageAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> DependencyBrowser>>dragTypeForPackageDepAt: {package dependencies} ? ct 1/27/2022 00:09<br class="">
> + dragTypeForPackageDepAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> PackagePaneBrowser>>buildPackageListWith: {toolbuilder} ? ct 1/27/2022 00:11 (changed)<br class="">
> buildPackageListWith: builder<br class="">
> ????| listSpec |<br class="">
> ????listSpec := builder pluggableListSpec new.<br class="">
> ????listSpec <br class="">
> ????????model: self;<br class="">
> ????????name: #packageList;<br class="">
> ????????list: #packageList; <br class="">
> ????????getIndex: #packageListIndex; <br class="">
> ????????setIndex: #packageListIndex:; <br class="">
> ????????menu: #packageMenu:; <br class="">
> - ????????keyPress: #packageListKey:from:.<br class="">
> + ????????keyPress: #packageListKey:from:;<br class="">
> + ????????dragItem: #dragFromPackageAt:;<br class="">
> + ????????dragType: #dragTypeForPackageAt:.<br class="">
> ????^listSpec<br class="">
> <br class="">
> <br class="">
> PackagePaneBrowser>>dragFromPackageAt: {package list} ? ct 1/27/2022 00:12<br class="">
> + dragFromPackageAt: anInteger<br class="">
> + <br class="">
> + ????^ PackageInfo named: (self packageList at: anInteger)<br class="">
> <br class="">
> PackagePaneBrowser>>dragTypeForPackageAt: {package list} ? ct 1/27/2022 00:11<br class="">
> + dragTypeForPackageAt: anInteger<br class="">
> + <br class="">
> + ????^ #sourceCode<br class="">
> <br class="">
> PragmaPreference>>browse {browsing} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> <br class="">
> - ????ToolSet<br class="">
> + ????^ ToolSet<br class="">
> ????????browse: self provider class<br class="">
> - ????????selector: self selectors first.<br class="">
> + ????????selector: self selectors first<br class="">
> <br class="">
> Preference>>browse {browsing} ? ct 1/26/2022 22:02 (changed)<br class="">
> browse<br class="">
> <br class="">
> - ????ToolSet<br class="">
> + ????^ ToolSet<br class="">
> ????????browse: Preferences class<br class="">
> - ????????selector: self selectors first.<br class="">
> + ????????selector: self selectors first<br class="">
> <br class="">
> <br class="">
> ---<br class="">
> Sent from Squeak Inbox Talk<br class="">
> ["genericDropSourceCode.1.cs"]<br class="">
> ["browse&amp;drop-Monticello.1.cs"]<br class="">
> ["browse&amp;drag-Tools+System.1.cs"]<br class="">
> -------------- next part --------------<br class="">
> An HTML attachment was scrubbed...<br class="">
> URL: <<a href="http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0001.html" class="">http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0001.html</a>><br class="">
> -------------- next part --------------<br class="">
> A non-text attachment was scrubbed...<br class="">
> Name: genericDropSourceCode.1.cs<br class="">
> Type: application/octet-stream<br class="">
> Size: 4644 bytes<br class="">
> Desc: not available<br class="">
> URL: <<a href="http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0003.obj" class="">http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0003.obj</a>><br class="">
> -------------- next part --------------<br class="">
> A non-text attachment was scrubbed...<br class="">
> Name: browse&amp;drop-Monticello.1.cs<br class="">
> Type: application/octet-stream<br class="">
> Size: 8497 bytes<br class="">
> Desc: not available<br class="">
> URL: <<a href="http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0004.obj" class="">http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0004.obj</a>><br class="">
> -------------- next part --------------<br class="">
> A non-text attachment was scrubbed...<br class="">
> Name: browse&amp;drag-Tools+System.1.cs<br class="">
> Type: application/octet-stream<br class="">
> Size: 11635 bytes<br class="">
> Desc: not available<br class="">
> URL: <<a href="http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0005.obj" class="">http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220127/4682941c/attachment-0005.obj</a>><br class="">
> <br class="">
> <br class="">
["browse&amp;drag-Tools+System.2.cs"]<br class="">
["browse&amp;drop-Monticello.2.cs"]<br class="">
["genericDropSourceCode.2.cs"]<span id="cid:09EFE9EC-9693-4790-A849-4E9096BC5BE0@gateway.sonic.net"><browse&amp;drag-Tools+System.2.cs></span><span id="cid:4256D304-5BB6-4131-83B2-C2FC391B2F44@gateway.sonic.net"><browse&amp;drop-Monticello.2.cs></span><span id="cid:B219A02C-0D6F-42D7-A439-F3987DF484C1@gateway.sonic.net"><genericDropSourceCode.2.cs></span><br class=""></div></blockquote></div><br class=""></div></body></html>