Could you possibly use TreeView#getNodeAt() and getNodeIndent() instead of
looking at the style values?
On Jun 15, 2011, at 12:52 PM, Edvin Syse wrote:
> Den 15.06.2011 18:35, skrev Greg Brown:
>> Why might you need to know what type of skin is installed on a component?
>> Maybe there is another alternative that might address your use case?
>
> My use case is to avoid the problem described in the subject. I don't want to
> edit when I double click the branch controls (double clicking happens when
> you collapse and expand in rapid succession). I wrote a utility class that I
> install on the TreeView like this:
>
> getComponentMouseButtonListeners().add(new DoubleClickTreeAdapter(this) {
> public void doubleClicked(TreeNode node) {
> editNode(node);
> }
> });
>
> The doubleClicked() callback is invoked when an actual double click occured.
> editNode() opens my editor for the current node, this is _not_ an inline
> editor, it opens a BoxPane with a Form and some other stuff inside a TabPane
> to the right of the TreeView.
>
> The DoubleClickTreeAdapter.java looks like this:
>
> public abstract class DoubleClickTreeAdapter implements
> ComponentMouseButtonListener {
> private TreeView treeView;
>
> public DoubleClickTreeAdapter(TreeView treeView) {
> this.treeView = treeView;
> }
>
> public boolean mouseClick(Component component, Mouse.Button button, int x,
> int y, int count) {
> if (count == 2 && button == Mouse.Button.LEFT) {
> Sequence.Tree.Path path = treeView.getNodeAt(y);
> if (path != null) {
> TreeNode node = (TreeNode)
> Sequence.Tree.get(treeView.getTreeData(), path);
> if (node instanceof TreeBranch) {
> if
> (Theme.getTheme().getSkinClass(TreeView.class).isAssignableFrom(TerraTreeViewSkin.class))
> {
> Integer indent = (Integer)
> treeView.getStyles().get("indent");
> Integer spacing = (Integer)
> treeView.getStyles().get("spacing");
> int baseNodeX = path.getLength() * (indent + spacing);
> if (x > baseNodeX)
> doubleClicked(node);
> } else {
> // Add support for other skins here, default to allow
> double click anywhere for unknown skins
> doubleClicked(node);
> }
> } else {
> doubleClicked(node);
> }
> }
> } else if (count == 1 && treeView.getNodeAt(y) == null)
> treeView.clearSelection();
> return true;
> }
>
> public abstract void doubleClicked(TreeNode node);
> }
>
> As you can see, I check that the TreeViewSkin is infact TerraTreeViewSkin, so
> that I know I can relay on the indent and spacing to determine if I clicked
> on or to the left of a branch control, or on the actual node icon/text.
>
> I will default to call doubleClicked() if there is a non-standard skin
> installed, but I can easily add more checks for different skins.
>
> (I removed the empty mouseDown/mouseUp calls from the code above).
>
> -- Edvin