Pay close attention to the example for Class PackageTreeExample it uses: method #rootNodeClassFromItem: to display its children derived from #rootItems It picks up each of the node to display through: thereafter from the various node classes it uses: All Nodes class should be a subclass of PackageAbstractNodeExample #childNodeClassFromItem: and #childrenItems It is a beautiful nearly perfect tree morph, I have every used across all UI from VC++/ VW/ VA / Java.. study the abstract super class.. a bit and debug through the example a bit more.. On 3/6/12, Alexis Parseghian <a.parseg@gmail.com> wrote:
I've been playing with MorphTree et al. for the past few days, trying to understand how they work. Reading the example code in Morphic-MorphTreeWidget-Examples helped. I've also been trying to figure out the Settings Browser, but this one I have a hard time following :(
Anyway, I think I've got the basics now : I instantiate a MorphTreeMorph when building my window in an subclass of a MorphTreeModel. The contents of my model's list get wrapped in the appropriate MorphTreeNodeModel subclasses.
I can get the tree to display *what* I want. My problem is with the *how* ; more specifically, how to get the columns right.
* the first column always displays correctly, with or without an expander (and in the latter case, expanded or not). * the following columns have the text overlapping their left-side resizer by about half a character. * subsequent columns display off their vertical boundaries (to the right), seemingly depending on the length of the preceeding column. Same as if there were no columns but just morphs abutted to one another. Manually resizing the previous column to contain the longest text gets me back to the previous case (half a char too much to the left). In other words, if I'm guessing right, the column clips its contents /visually/, but not in relation to their /reported width/.
I'm pretty sure there's something really basic I've missed in the layout, but I can't figure it out from the example code nor the classes' protocols.
Any hints ?
Thanks.
My code:
* the root list is a collection of associations 'string' -> article instance * I'm building a view with the category (expandable) in the first column. Once expanded, it shows the article's properties in columns.
CategoriesAndArticlesTree(MorphTreeModel)>>buildTree | treeMorph | treeMorph := (self treeMorphClass on: self) columns: { MorphTreeColumn new rowMorphGetSelector: #categoryOrAuthor. MorphTreeColumn new rowMorphGetSelector: #title; headerButtonLabel: 'Title' font: nil. MorphTreeColumn new rowMorphGetSelector: #issue. MorphTreeColumn new rowMorphGetSelector: #foo }. treeMorph hResizing: #spaceFill; vResizing: #spaceFill; withHLines: true; makeLastColumnUnbounded; resizerWidth: 1. ^ (treeMorph buildContents ) CategoriesAndArticlesTree>>rootNodeClassFromItem: anItem ^ CategoriesTreeNode
CategoriesTreeNode(MorphTreeNodeModel)>>categoryOrAuthor ^ self theme builder newLabel: item key CategoriesTreeNode>>childNodeClassFromItem: anItem ^ ArticlesTreeNode CategoriesTreeNode>>childrenItems ^ item value the other column-related selectors are implemented and return a nil.
ArticlesTreeNode(MorphTreeNodeModel) implements the column-related selectors by returning the appropriate article property wrapped in a label. ArticlesTreeNode>>categoryOrAuthor ^ self theme builder newLabel: item author ArticlesTreeNode>>foo ^ self theme builder newLabel: 'foo'