<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        Hmm... there is already ObjectExplorer and InspectorBrowser. I like these ideas but they should manifest in a *new* tool. :-) Less interference with existing working habits that way.<div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div><blockquote class="history_container" type="cite" style="border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 07.10.2019 20:24:04 schrieb Chris Muller <asqueaker@gmail.com>:</p><div style="font-family:Arial,Helvetica,sans-serif">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><div dir="ltr">Christoph, this is very nice, but I actually have (had?) plans to do a similar enhancement, only:<div><br></div><div>  - instead of the source code, show the result of evaluating the selected message.<div>  - The pane would show the printString of the result, but prefixed by a small embedded Morph (via TextAnchor) as the first character which, itself, can:</div></div><div><br></div><div>        - be clicked to open a new InspectorBrowser on that object, OR</div><div>        - dragged, (just as inspector variables can) as an argument to another binary or keyword selector in the messages pane of the same or other InspectorBrowser (enabling that result to be displayed and used, likewise)</div><div><br></div><div></div><div>I've always wanted Smalltalk's Inspector to be better at *working* with objects, instead of only inspecting their physical state and only allowing access via their API by typing expressions.  Smalltalk is overdue to have an "Object browser" for users that presents its API properly and usably.<br></div><div><br></div><div>Best,</div><div>  Chris</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 2, 2019 at 4:21 PM Thiede, Christoph <<a href="mailto:Christoph.Thiede@student.hpi.uni-potsdam.de" target="_blank">Christoph.Thiede@student.hpi.uni-potsdam.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div>


<div dir="ltr">
<div id="gmail-m_5375414188418717374gmail-m_-1903156331565911634gmail-m_3336679119978266041gmail-m_-3257173024483139022x_divtagdefaultwrapper" dir="ltr" style="font-size: 12pt;color: rgb(0,0,0);font-family: Calibri,Helvetica,sans-serif">
<p>Should all the removed methods here be to moved into *60Deprecated, or would you consider them an implementation detail?</p>
<div id="gmail-m_5375414188418717374gmail-m_-1903156331565911634gmail-m_3336679119978266041gmail-m_-3257173024483139022x_Signature">
<div name="x_divtagdefaultwrapper">
<div><span style="font-size: 10pt;color: #808080"></span></div>
</div>
</div>
</div>
<hr style="display:inline-block;width:98%">
<div id="gmail-m_5375414188418717374gmail-m_-1903156331565911634gmail-m_3336679119978266041gmail-m_-3257173024483139022x_divRplyFwdMsg" dir="ltr"><span style="font-family: Calibri, sans-serif;color: #000000"><b>Von:</b> Squeak-dev <<a href="mailto:squeak-dev-bounces@lists.squeakfoundation.org" target="_blank">squeak-dev-bounces@lists.squeakfoundation.org</a>> im Auftrag von <a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a> <<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>><br>
<b>Gesendet:</b> Mittwoch, 2. Oktober 2019 23:19:38<br>
<b>An:</b> <a href="mailto:squeak-dev@lists.squeakfoundation.org" target="_blank">squeak-dev@lists.squeakfoundation.org</a><br>
<b>Betreff:</b> [squeak-dev] The Inbox: Tools-ct.901.mcz</span>
<div> </div>
</div>
</div>
<span style="font-size: 10pt"><span style="font-size: 10pt">
<div>A new version of Tools was added to project The Inbox:<br>
<a href="http://source.squeak.org/inbox/Tools-ct.901.mcz" target="_blank">http://source.squeak.org/inbox/Tools-ct.901.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: Tools-ct.901<br>
Author: ct<br>
Time: 2 October 2019, 11:19:39.149682 pm<br>
UUID: 2641031f-a660-7642-8fae-5f415cf51f6d<br>
Ancestors: Tools-ul.899<br>
<br>
Deduplicates the InspectorBrowser by adapting to a real Browser and respecting to super. This also enhances look + functionality noticeably. Increases initialExtent for a nicer sight.<br>
<br>
You can open an InspectorBrowser by doing:<br>
InspectorBrowser openOn: Morph new.<br>
<br>
=============== Diff against Tools-ul.899 ===============<br>
<br>
Item was changed:<br>
  Inspector subclass: #InspectorBrowser<br>
+        instanceVariableNames: 'browser'<br>
-        instanceVariableNames: 'fieldList msgList msgListIndex'<br>
         classVariableNames: ''<br>
         poolDictionaries: ''<br>
         category: 'Tools-Inspector'!<br>
  <br>
  !InspectorBrowser commentStamp: 'tcj 3/12/2018 07:55' prior: 0!<br>
  I am an inspector that also shows all messages the inspected objects can understand. I combine inspector and code browser.<br>
  <br>
  InspectorBrowser openOn: Smalltalk!<br>
<br>
Item was added:<br>
+ ----- Method: InspectorBrowser>>browser (in category 'initialize-release') -----<br>
+ browser<br>
+ <br>
+        ^ browser ifNil: [browser := Browser new]!<br>
<br>
Item was changed:<br>
+ ----- Method: InspectorBrowser>>buildWith: (in category 'toolbuilder') -----<br>
- ----- Method: InspectorBrowser>>buildWith: (in category 'tool builder') -----<br>
  buildWith: builder<br>
  <br>
+        | windowSpec |<br>
+        windowSpec := self buildWindowWith: builder specs: {<br>
+                (0@0 corner: 0.3@0.3) -> [self buildFieldListWith: builder].<br>
+                (0.3@0 corner: 1.0@0.3) -> [self buildValuePaneWith: builder].<br>
+                (0@0.3 corner: 0.3@1.0) -> [browser buildMessageListWith: builder].<br>
+                (0.3@0.3 corner: 1.0@1.0) -> [browser buildCodePaneWith: builder].<br>
+        }.<br>
+        ^ builder build: windowSpec!<br>
-        | window fieldSpec valueSpec msgSpec codeSpec |<br>
-        <br>
-        window := builder pluggableWindowSpec new<br>
-                model: self;<br>
-                children: OrderedCollection new;<br>
-                yourself.<br>
-                <br>
-        fieldSpec := builder pluggableListSpec new<br>
-                model: self;<br>
-                list: #fieldList;<br>
-                getIndex: #selectionIndex;<br>
-                setIndex: #toggleIndex:;<br>
-                menu: #fieldListMenu:;<br>
-                frame: (0@0 corner: 0.3@0.5).<br>
-        <br>
-        valueSpec := builder pluggableTextSpec new<br>
-                model: self;<br>
-                getText: #contents;<br>
-                setText: #accept:;<br>
-                menu: #codePaneMenu:shifted:;<br>
-                frame: (0.3@0 corner: 1.0@0.5).<br>
- <br>
-        msgSpec := builder pluggableListSpec new<br>
-                model: self;<br>
-                list: #msgList;<br>
-                getIndex: #msgListIndex;<br>
-                setIndex: #msgListIndex:;<br>
-                menu: #msgListMenu;<br>
-                frame: (0@0.5 corner: 0.3@1.0).<br>
-                <br>
-        codeSpec := builder pluggableTextSpec new<br>
-                model: self;<br>
-                getText: #msgText;<br>
-                setText: #msgAccept:from:;<br>
-                menu: #msgPaneMenu:shifted:;<br>
-                frame: (0.3@0.5 corner: 1.0@1.0).<br>
-        <br>
-        window children addAll: {fieldSpec. valueSpec. msgSpec. codeSpec}.<br>
-        ^ builder build: window!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>fieldList (in category 'accessing') -----<br>
- fieldList<br>
-        fieldList ifNotNil: [^ fieldList].<br>
-        ^ (fieldList := super fieldList)!<br>
<br>
Item was added:<br>
+ ----- Method: InspectorBrowser>>initialExtent (in category 'toolbuilder') -----<br>
+ initialExtent<br>
+ <br>
+        ^ super initialExtent * 3/2!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>initialize (in category 'initialize-release') -----<br>
- initialize<br>
- <br>
-        super initialize.<br>
-        fieldList := nil.<br>
-        msgListIndex := 0.<br>
-        self changed: #msgText<br>
- !<br>
<br>
Item was changed:<br>
  ----- Method: InspectorBrowser>>inspect: (in category 'initialize-release') -----<br>
  inspect: anObject <br>
         "Initialize the receiver so that it is inspecting anObject. There is no current selection.<br>
         Overriden so that my class is not changed to 'anObject inspectorClass'."<br>
         <br>
         object := anObject.<br>
+        self browser selectClass: anObject class.<br>
         self initialize<br>
  !<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgAccept:from: (in category 'messages') -----<br>
- msgAccept: newText from: editor<br>
-        | category |<br>
-        category := msgListIndex = 0<br>
-                ifTrue: [ClassOrganizer default]<br>
-                ifFalse: [object class organization categoryOfElement: (msgList at: msgListIndex)].<br>
-        ^ (object class compile: newText classified: category notifying: editor) ~~ nil!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgList (in category 'messages') -----<br>
- msgList<br>
- <br>
-        ^msgList ifNil: [ msgList := object class selectors sort ]!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgListIndex (in category 'messages') -----<br>
- msgListIndex <br>
-        ^msgListIndex!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgListIndex: (in category 'messages') -----<br>
- msgListIndex: anInteger<br>
-        "A selection has been made in the message pane"<br>
- <br>
-        msgListIndex := anInteger.<br>
-        self changed: #msgText.!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgListMenu: (in category 'messages') -----<br>
- msgListMenu: aMenu <br>
-        ^ aMenu labels: 'Not yet implemented' lines: #(0) selections: #(flash)!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgPaneMenu:shifted: (in category 'messages') -----<br>
- msgPaneMenu: aMenu shifted: shifted<br>
-        ^ aMenu labels: <br>
- 'find... (f)<br>
- find again (g)<br>
- find and replace...<br>
- do/replace again (j)<br>
- undo (z)<br>
- redo (Z)<br>
- copy (c)<br>
- cut (x)<br>
- paste (v)<br>
- do it (d)<br>
- print it (p)<br>
- inspect it (i)<br>
- accept (s)<br>
- cancel (l)' <br>
-                lines: #(0 4 6 9 12)<br>
-                selections: #(find findAgain findReplace again undo redo copySelection cut paste doIt printIt inspectIt accept cancel)!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>msgText (in category 'messages') -----<br>
- msgText<br>
-        msgListIndex = 0 ifTrue: [^ nil].<br>
-        ^ object class sourceCodeAt: (msgList at: msgListIndex)!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>step (in category 'stepping and presenter') -----<br>
- step<br>
-        | list fieldString msg |<br>
-        (list := super fieldList) = fieldList ifFalse:<br>
-                [fieldString := selectionIndex > 0 ifTrue: [fieldList at: selectionIndex] ifFalse: [nil].<br>
-                fieldList := list.<br>
-                selectionIndex := fieldList indexOf: fieldString.<br>
-                self changed: #fieldList.<br>
-                self changed: #selectionIndex].<br>
-        list := msgList.  msgList := nil.  "force recomputation"<br>
-                list = self msgList ifFalse:<br>
-                [msg := msgListIndex > 0 ifTrue: [list at: msgListIndex] ifFalse: [nil].<br>
-                msgListIndex := msgList indexOf: msg.<br>
-                self changed: #msgList.<br>
-                self changed: #msgListIndex].<br>
-        super step!<br>
<br>
Item was added:<br>
+ ----- Method: InspectorBrowser>>stepAt:in: (in category 'stepping and presenter') -----<br>
+ stepAt: millisecondClockValue in: aWindow<br>
+        <br>
+        super stepAt: millisecondClockValue in: aWindow.<br>
+        browser stepAt: millisecondClockValue in: aWindow.!<br>
<br>
Item was removed:<br>
- ----- Method: InspectorBrowser>>wantsSteps (in category 'accessing') -----<br>
- wantsSteps<br>
-        ^ true!<br>
<br>
<br>
</div>
</span></span>
</div>

<br>
</blockquote></div>
</div></blockquote>
                                        </div></body>