[Pharo-dev] Spec menu extensibility (epicea)

Stephane Ducasse stepharo.self at gmail.com
Thu Aug 10 15:06:33 EDT 2017


Tx eliot for sharing your experience with us.
I will keep that in mind (I decided that I should not start something
new before finishing something)
So frustrating to have many not finished items.

Stef

On Thu, Aug 10, 2017 at 7:39 PM, Eliot Miranda <eliot.miranda at gmail.com> wrote:
> Hi Peter,
>
> On Thu, Aug 10, 2017 at 12:48 AM, Peter Uhnak <i.uhnak at gmail.com> wrote:
>>
>> Hi Stef,
>>
>> I use both a variant with an argument and without, however I have slightly
>> modified PragmaMenuBuilder to support this.
>>
>> e.g. I have
>>
>> <opEditorToolbarMenu> which always adds entries to a particular menu.
>> <opEditorToolbarMenu: #OPUmlClassEditorPlugin> which adds entries only
>> when some particular context is active (here it would mean that the items
>> are added only when ClassEditor plugin is active)
>>
>> (The second case can be done with a local if condition, but I found this
>> to be more practical.)
>>
>> I don't see a benefit in having 'order' as part of the pragma, because you
>> can specify the order for the menu items themselves.
>>
>> What I am still wondering is whether it is better to have a different
>> pragma for each menu, or have the menu name as an argument. The same goes
>> for differentiating pragmas between different tools.
>>
>> e.g.
>>
>> <opEditorToolBarMenu: #OPUmlClassEditorPlugin> vs <menu: #EditorToolbar
>> tool: #OP context: #OPUmlClassEditorPlugin>
>
>
> I very strongly recommend the latter.  Why?  If designed appropriately the
> second form is used as a selector in *building* the menu.  So the idea is to
> have the menu builder perform the pragma to add that item to it.  Then there
> are many menu items in the system that use the same pragma and one can see
> both senders of the pragma (which are examples of menu extensions) /and/ the
> implementor(s) (which is an example of how to actually extend a menu).
>
> With the former one has to have somewhere that relates a specific menu to
> the pragma that extends only that menu, a way of extracting that information
> form that pragma, and finally a way of extending the menu.  With the latter
> there needs be only one version of the code that collects the pragmas for
> any menu and extends that menu.  It becomes a standard library feature.
>
>
>>
>> the latter seems like it's adding more complexity.
>
>
> But when used in a real system it actually reduces complexity, and provides
> examples to the user of how to define menu extensions and to implementors of
> how to extend menus.  VisualWorks works like this and has since 1998 when
> Steve Dahl and I designed the pragma system for just this case.
>
> We /did/ add a grouping facility based on floating point numbers, a hack,
> but a reasonable one.  If you look at, say, the standard programming text
> menu, which at its simplest might be
>
>     again
>     undo
>     -----------
>     cut
>     copy
>     paste
>     -----------
>     do it
>     print it
>     debug it
>     -----------
>     accept
>     cancel
>     -----------
>     format
>     spawn
>     explain
>
> the grouping of related items is quite important in the menu being easy to
> navigate.  But if we want to extend it we wan to be able to add groups to
> it.  In VW we number the groups in the base menu in tens, so again/undo is
> 10.0, cut/copy/paste is 20.0, etc.  Then anyone can define a new group
> relative to the base groups by providing a group number such as 35.0 to add
> between do it/print it/debug it and accept/cancel
>
>
>
>>
>> Peter
>>
>>
>> On Wed, Aug 09, 2017 at 09:58:54PM +0200, Stephane Ducasse wrote:
>> > Hi Peter
>> >
>> > Yes I was thinking about it.
>> > Now from your experience what kind of pragma should we provide?
>> >
>> > <group: 'name' order: 10>
>> >
>> > Not sure that we need the argument to the group.
>> >
>> > <menusForGroup: 'name'>
>> >
>> > <menuForGroup: 'name' order: 10>
>> >
>> > Stef
>> >
>> >
>> >
>> >
>> > On Sun, Aug 6, 2017 at 12:09 AM, Peter Uhnak <i.uhnak at gmail.com> wrote:
>> > > Hi Stef,
>> > >
>> > > I faced similar issue and then I've found out that PragmaMenuBuilder
>> > > is compatible with Spec.
>> > >
>> > > Something like...
>> > >
>> > > builder := PragmaMenuBuilder pragmaKeyword: 'myPragma' model: self.
>> > > menu := MenuModel new.
>> > > menu fromSpec: builder menuSpec.
>> > >
>> > > Peter
>> > >
>> > >
>> > > On Sat, Aug 05, 2017 at 06:26:45PM +0200, Stephane Ducasse wrote:
>> > >> Hi guys
>> > >>
>> > >> I would like to know if there is a pattern to build extensible menu
>> > >> in Spec.
>> > >> For example, I extending Epicea to support pillar fileout so that I
>> > >> can turn a coding section into a pillar steps of action.
>> > >>
>> > >> I wanted to extend the epicea browser to get my menu in:
>> > >> But the code is like that:
>> > >>
>> > >> EPLogBrowserModel >> addMenuItemsForSelectedItemsIn: aMenu
>> > >>
>> > >>   aMenu addGroup: [ :aGroup |
>> > >>     self menuActionsForSelectedItems do: [ :oldStyleMenuItemArray |
>> > >>          aGroup addItem: [ :anItem |
>> > >>             anItem
>> > >>                name: oldStyleMenuItemArray first;
>> > >>                description: oldStyleMenuItemArray third;
>> > >>                icon: (self iconNamed: oldStyleMenuItemArray fourth);
>> > >>                action: [ self perform: oldStyleMenuItemArray second ]
>> > >> ] ] ].
>> > >>
>> > >>   aMenu addGroup: [ :aGroup |
>> > >>      aGroup addItem: [ :anItem |
>> > >>             anItem
>> > >>               name: 'Filters';
>> > >>               icon: (self iconNamed: #smallFindIcon);
>> > >>               subMenu: self filtersSubMenu ] ].
>> > >>
>> > >>   aMenu addGroup: [ :aGroup |
>> > >>         aGroup addItem: [ :anItem |
>> > >>             anItem
>> > >>              name: 'File Out';
>> > >>              description: 'Write selected entries to an Ombu file';
>> > >>              icon: (self iconNamed: #smallSaveAsIcon);
>> > >>              action: [ self fileOutSelection ] ] ].
>> > >>
>> > >>
>> > >> EPLogBrowserModel >> menuMorphForSelectedItems
>> > >>
>> > >>          | aMenu |
>> > >>          aMenu := MenuModel new.
>> > >>          showEntryItemMenu ifTrue: [ self
>> > >> addMenuItemsForSelectedItemsIn: aMenu ].
>> > >>          ^ aMenu buildWithSpecAsPopup
>> > >>
>> > >>
>> > >> So I would like to improve Epicea but I face the problem of the
>> > >> limits
>> > >> of Spec (presumably).
>> > >> I'm thinking to add a <specMenu: 10> pragma to handle this case.
>> > >> Any thought.
>> > >>
>> > >> Stef
>> > >>
>> > >
>> >
>>
>
>
>
> --
> _,,,^..^,,,_
> best, Eliot



More information about the Pharo-dev mailing list