<body><div id="__MailbirdStyleContent" style="font-size: 12pt;font-family: calibri;color: #000000">
                                        Hi Hannes,<div><br></div><div>just open SystemWindow >> #filterEvent:for: and add your tabbing logic. Access the currently focused morph via "anEvent hand keyboardFocus", compute a list of focus targets in the window via "self paneMorphs", unpack pluggable panels, choose the next focus holder, set the focus via "anEvent hand newKeyboardFocus: ...", and cancel event handling via "anEvent ignore".</div><div><br></div><div>Of course we need PluggablePanelMorph for layout composition. The entire lower area in the browser is a panel. :)</div><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 08.11.2017 10:40:08 schrieb H. Hirzel <hannes.hirzel@gmail.com>:</p>On 11/7/17, Marcel Taeumel <marcel.taeumel@hpi.de> wrote:<br>> At the level of ToolBuilder, one would rather have to specify a "tab order"<br>> and whether such a feature is enabled for a particular view or not. It would<br>> be like one or two additional fields in PluggableWidgetSpec. No need to talk<br>> about implementation details such as "siblings" at that abstract spec<br>> level.<br><br>Good idea to capture (filter out) the TAB event at a higher level.<br>Let's do more analysis on how this could be done.<br><br>We could rely on a default TAB order which is just the order in which<br>the elements were added<br>(not including the switches) [4]<br><br><br>> Considering the actual implementation: there has been a "tabAmongFields",<br>> which might origin from Etoys. In the MorphicToolBuilder, I would simply add<br>> event filters for keyboard events at the level of PluggablePanelMorph and/or<br>> SystemWindow.<br><br>PluggablePanelMorph does not seem to be used at all. In particular not<br>in the Browser which is the most interesting tool to have the TAB key<br>cycling through the panes. [5]<br><br>So it is probably rather the SystemWindow class which is to be used.<br><br>> You do not have to deal with implementation details in<br>> TextMorphs etc. If "tab" would be the key, "tab" would just not reach the<br>> TextMorph anymore. :-) ... off the top of my hat ... maybe like half a day<br>> work including tests. Not many new lines of code...<br><br>How is the method called to be used to filter out the TAB event?<br><br>specialKeyPressed: as well?<br><br>Regards<br><br>Hannes<br><br>><br>> Best,<br>> Marcel<br>> Am 07.11.2017 09:24:12 schrieb H. Hirzel <hannes.hirzel@gmail.com>:<br>> A modest but very useful enhancements would be to have the TAB key<br>> changing between panes in the Browser [1] as it is an often used tool.<br>><br>> The method<br>> PluggableListMorph specialKeyPressed: asciiValue [3]<br>><br>> shows what is currently interpreted. However all the keystrokes apply<br>> only locally to the list.<br>><br>> Next thing to find out is if it is possible in tools built with the<br>> ToolBuilder [2] framework how to get access to a sibling lists....<br>><br>><br>> --Hannes<br>><br><br><br>[4] Browser<br>buildDefaultBrowserWith: builder<br>      "assemble the spec for a full system browser, build it and return the<br>built but not opened morph"<br>  "this build-but-don't-open phase is factored out to support the<br>prototypicalToolWindow facility"<br><br> | max windowSpec |<br>    max := self wantsOptionalButtons ifTrue:[0.42] ifFalse:[0.5].<br><br>       windowSpec := self buildWindowWith: builder specs: {<br>          (0@0 corner: 0.25@max) -> [self buildSystemCategoryListWith: builder].<br>             (self classListFrame: max) -> [self buildClassListWith: builder].<br>          (self switchesFrame: max) -> [self buildSwitchesWith: builder].<br>            (0.5@0 corner: 0.75@max) -> [self buildMessageCategoryListWith: builder].<br>          (0.75@0 corner: 1@max) -> [self buildMessageListWith: builder].<br>            (0@max corner: 1@1) -> [self buildCodePaneWith: builder].<br>  }.<br>    self setMultiWindowFor:windowSpec.<br><br>  ^builder build: windowSpec<br><br><br><br>[5] PluggablePanelMorph   http://wiki.squeak.org/squeak/2748<br><br></hannes.hirzel@gmail.com></marcel.taeumel@hpi.de>
                        </blockquote>
                                        </div></body>