[Pharo-users] How to programatically select an item in a Spec TreeModel ?

Thierry Goubier thierry.goubier at gmail.com
Fri Oct 23 15:13:55 EDT 2015


Le 23/10/2015 21:01, Peter Uhnák a écrit :
> It's also possible that it is simply bugged.
>
> PackageRemotesManager doesn't use TreeModel, it uses different widget
> (whose API looks cleaner).
>
> I'll try to look at this tomorrow (unless someone else beats me to it)
> how this could be done (and maybe even take a stab at cleaning the API a
> bit...).

I wrote my own API to be able to that properly with MorphTreeMorph. 
Fastest/easiest way to do that is to directly get the items morphs 
inside the tree and select them.

Cleaning that up is ... well, good luck with that. I wouldn't bother. 
Waiting for the FT-based rewrite is the thing to do. Will make the 
application code dealing with that a lot leaner and cleaner to boot.

Thierry

> Peter
>
> On Fri, Oct 23, 2015 at 5:17 PM, Edouard KLEIN <edouardklein at gmail.com
> <mailto:edouardklein at gmail.com>> wrote:
>
>     Hi !
>
>     I've been playing with Pharo again. In the application I'm building, I
>     need to load a file from disk, and depending on what is inside this
>     file, select an item in a tree that is displayed on the main window.
>
>     The SearchableTree subclass I use is copied at the end of the email. It
>     is nothing fancy, just creating the nodes from a fixed tree structure.
>
>     The method selectedItemFRomPathArray (e.g. #('a' 'a1')) is the one that
>     should be responsible for selecting the node, but for now it just
>     returns the array of TreeNodeModel that correspond to the strings in the
>     'PathArray' given in argument.
>
>     I tried the following in a PlayGround :
>
>     w := CRPJCategories2 new. w openWithSpec.
>     "Taken from packageRemotesManager without understanding it."
>     w tree selectedItem:(
>              (w roots) first  "This line can also be :
>              ((w selectedItemFromPathArray:#('a')) last)"
>              selected:true;
>              takeHighlight;
>              yourself).
>
>     Which works, but when I try to select something that is not a root node,
>     then it does not work, and I've been pulling my hair trying to
>     understand why.
>
>     w := CRPJCategories2 new. w openWithSpec.
>     "Taken from packageRemotesManager without understanding it."
>     w tree selectedItem:(
>     ((w selectedItemFromPathArray:#('a' 'a1')) last) "<- DOES NOT WORK"
>     selected:true;
>     takeHighlight;
>     yourself).
>
>
>     Any pointer would be very much appreciated.
>
>     Thenks in advance.
>
>     Edouard.
>
>
>
>
>     -------------------------------------------------------
>     'From Pharo4.0 of 18 March 2013 [Latest update: #40623] on 23 October
>     2015 at 4:55:07.823126 pm'!
>     SearchableTree subclass: #CRPJCategories2
>              instanceVariableNames: 'structure'
>              classVariableNames: ''
>              poolDictionaries: ''
>              category: 'CRPJ'!
>
>     !CRPJCategories2 methodsFor: 'as yet unclassified' stamp: 'EdouardKlein
>     10/23/2015 15:29'!
>     nodeFromTreeStructure: anArray
>              ^ (anArray collect:[:x| TreeNodeModel new
>                      content: (x at:1);
>                      children: [((x size = 1) ifTrue:[#()] ifFalse:[self
>     nodeFromTreeStructure:(x at:2)])];
>                      hasChildren:[x size > 1]]) asOrderedCollection.! !
>
>     !CRPJCategories2 methodsFor: 'as yet unclassified' stamp: 'EdouardKlein
>     10/23/2015 15:10'!
>     initialize
>              |  |
>              super initialize.
>              structure := {
>                      {'a' . {
>                              {'a1'}.
>                              {'a2'}}}.
>                      {'b' . {
>                              {'b1' . {
>                                      {'b1A'}.
>                                      {'b1B'}}}.
>                              {'b2'}.
>                              {'b3' . {
>                                      {'b3A'}.
>                                      {'b3B'}}}}}.
>                      {'c' . {
>                              {'c1'}.
>                              {'c2'}.
>                              {'c3'}}}}.
>              self roots:(self nodeFromTreeStructure: structure).! !
>
>     !CRPJCategories2 methodsFor: 'as yet unclassified' stamp: 'EdouardKlein
>     10/23/2015 16:54'!
>     selectedItemFromPathArray:aPathArray
>              "a string description of the currently selected item"
>              | recurse |
>              recurse := [:path :nodes|
>                      |nextNode|
>                      nextNode := (nodes select:[:n| n content = path
>     first]) first.
>                      (path size = 1) ifTrue:[{nextNode}] ifFalse:[
>                              {nextNode},(recurse value:(path
>     allButFirst)value:(nextNode children
>     value))]].
>              ^(recurse value: aPathArray value:(self roots)).! !
>
>     !CRPJCategories2 methodsFor: 'as yet unclassified' stamp: 'EdouardKlein
>     10/23/2015 16:53'!
>     selectedItemAsPathArray
>              "an array of the path to the currently selected item"
>              | recurse |
>              recurse := [:node| node ifNil:[{}]
>                                      ifNotNil:[(recurse value:(node
>     parentNode)),{node}]].
>              ^(recurse value:self selectedItem) collect:[:node| node
>     content].! !
>
>





More information about the Pharo-users mailing list