[squeak-dev] {'Squeak Help' . a TheWorldMainDockingBar . #squeakHelp . nil}

Eduardo Ochs eduardoochs at gmail.com
Wed Feb 1 05:21:48 UTC 2023

Hi list,

I'm trying to port to Squeak an idea that use a lot in Emacs, that is
to use one-liners as hyperlinks. There's a page with a detailed
explanation of that idea in this link,


and here goes a short explanation, and a question.

I'm working on a class called "See", and my one-liners that work as
hyperlinks always start with "See". For example, these ones

  See class: HelpBrowser.
  See class: HelpBrowser method: #accept:.
  See class: See.
  See class: See classMethod: #item1ctsa:.
  See class: See classMethod: #class:method:.
  See class: See classMethod: #class:classMethod:.

make the SystemBrowser display different pieces of information, and
these one liners

  See fileList.
  See helpBrowser.
  See messageNames.
  See methodFinder.

are equivalent to running:

  Tools -> File List
  Apps -> Help Browser
  World -> open -> message names
  World -> open -> method finder

but there are LOTS of menu entries that I don't know how to implement
as one-liners, because their "targets" are objects that I don't know
how to access from "global code"... let me explain this.

When I run "See methodFinder" it runs this: "ECToolSet
openSelectorBrowser". I discovered that the "action" associated to
"World -> open -> method finder" is "ECToolSet openSelectorBrowser" by
using the halo to duplicate the entry "method finder" in the menu
"World -> open", and then I examined the "contents", the "target", the
"selector", and "arguments" of that first item of that menu with just
one entry. Here is a visual explanation in a screenshot,


and in that case my function that returns the fields "contents",
"target", "selector", and "arguments" of a menu item returns this:

   {'method finder' . ECToolSet . #openSelectorBrowser . #()}

When I try to do the same for "Help -> Squeak help" I get:

  {'Squeak Help' . a TheWorldMainDockingBar . #squeakHelp . nil}

note the "a"... =(

When I run this to try to find a global variable that holds an object
of the class TheWorldMainDockingBar,

  Smalltalk globals keysAndValuesDo: [:k :v |
   (v isKindOf: TheWorldMainDockingBar) ifTrue: [ Transcript show: k; cr. ]

it returns nothing. So I wrote these two methods in my class "See" to
help me find active morphs of a given class,

  !See class methodsFor: 'other links' stamp: 'Edrx 2/1/2023 00:55'!
    "Return an OrderCollection with all the morphs whose world is non-nil.
       See worldMorphs explore.
    ^ Morph allSubInstances select: [ :m | m world notNil ].
  ! !

  !See class methodsFor: 'other links' stamp: 'Edrx 2/1/2023 00:57'!
  worldMorphs: class
    "Return an OrderCollection with all the morphs whose world
     is non-nil, and that are objects of the given class.
       (See worldMorphs: DockingBarItemMorph) explore.
    ^ Morph allSubInstances
          select: [ :m | (m world notNil) and: [m isKindOf: class] ]
  ! !

but for the class TheWorldMainDockingBar this one-liner

  (See worldMorphs: TheWorldMainDockingBar) explore.

returned no instances...

Any suggestions?

  Thanks in advance,
    Eduardo Ochs

P.S.: I tried to send questions to the beginners mailing list, but
that list is kind of dead... so I tried to make my question a bit less
beginner-ish, and I am sending it here to squeak-dev...

More information about the Squeak-dev mailing list