階層の取得についてはromさんの取得方法で大きな問題はないと思います。
e.kouさんのサンプルにもあるように、
クラスの継承だけでなく、tree-item-creation-proc を使うことで、
いろいろな実装方法が考えられそうですね。
個人的には、ExTreeNode に「階層情報」のフィールドを持たせたのであれば、
ExTreeNode の責任範囲をかんがえたときには、
自分自身で階層情報を取得したほうが、よりシンプルかなと思いました。
また、ツリー生成のタイミングと、表示のタイミングが異なるケースはあまりなさそうですが、
サンプルのように、TreeItem の位置が変更されることも考えて、
一応、ゲッターの中で再取得するようにしてみました。
(サンプルでは、ExTreeItem を利用して、ドラッグでツリーを移動することができます)
Code:
||++ TreeNode拡張
||++ TreeNodeに階層フィールドを追加
{define-class public ExTreeNode {inherits DefaultTreeNode}
||現在の階層を返すゲッター
{getter public {node-level}:int
let rank:int = 1
let rank_node:#TreeNode=self
{while rank_node.parent != null do
{set rank_node = rank_node.parent}
{inc rank}
}
{return rank}
}
{constructor public {default ... }
{construct-super {splice ...} }
}
}
||ドラッグで移動可能なTreeItem
||※実用には「もとに戻す」機能が必要
{define-class public ExTreeItem {inherits DefaultTreeItem }
{constructor public {default ...}
{construct-super {splice ...}}
set self.dragee = {ImageDragee}
{self.add-event-handler
{on e:DragOver do
{e.will-accept-drop?
{proc {type:Type, x:Distance, y:Distance,
effect:#DragEffect}:DragEffect
{return drag-effect-copy}
}
}
}
}
{self.add-event-handler
{on e:Drop do
{e.accept-drop
{proc {a:any, x:Distance, y:Distance,
effect:#DragEffect}:DropResult
{return
{DropResultCopy
action =
{proc {}:void
{type-switch a
case ti:DefaultTreeItem do
{self.node.append ti.node}
{if not self.expanded? then
{self.toggle-node}
}
}
}
}
}
}
}
}
}
}
}
||++ TreeControl生成
{TreeControl
data-model =
{TreeModel
root =
{ExTreeNode node-data="Food",
{ExTreeNode node-data="Fruit",
{ExTreeNode node-data="Apples",
{ExTreeNode node-data="Macintosh"},
{ExTreeNode node-data="Cortland"},
{ExTreeNode node-data="Gala"},
{ExTreeNode node-data="Delicious"}
},
{ExTreeNode node-data="Oranges"}
},
{ExTreeNode node-data="Vegetables",
{ExTreeNode node-data="Squash"},
{ExTreeNode node-data="Tomatoes"},
{ExTreeNode node-data="Cucumbers"}
}
}
},
tree-item-creation-proc ={proc {node:TreeNode}:TreeItem
{return {ExTreeItem node}}
},
||++ アクションイベント
{on Action at tc:TreeControl do
{type-switch tc.current-node
case et:ExTreeNode do
{popup-message et.node-level&"階層です。"}
}
}
}