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

Reply via email to