Thursday, November 01, 2007

I posted a question to the Wicket users group a few days ago on how to best deal with frames, in particular how to pass arguments between a tree view in one frame and a list view in another. I didn't get any takers.

I finally determined that there was no good way other than to use plain-old javascript to push values from the tree up to the parent frame, where they are dispersed to the other frames.

I wanted to use LinkTree, but really didn't need most of the features other than the look and feel. I just needed to be able to insert an onclick link that would pass a value to my parent frame.

After a lot of digging I came up with a solution that worked, but seems verbose for the job I'm attempting. My question for the reader is this: Can you propose a more concise solution?


public class CategoryTree extends LinkTree
{
@Override
protected Component newNodeComponent(String id, IModel model)
{
return new LinkIconPanel(id, model, CategoryTree.this)
{
private static final long serialVersionUID = 1L;

protected void onNodeLinkClicked(TreeNode node, BaseTree tree, AjaxRequestTarget target)
{
super.onNodeLinkClicked(node, tree, target);
CategoryTree.this.onNodeLinkClicked(node, tree, target);
}

protected Component newContentComponent(String componentId, BaseTree tree, IModel model)
{
Label l = new Label(componentId, model)
{
private static final long serialVersionUID = 1L;

@Override
protected void onComponentTag(ComponentTag tag)
{
super.onComponentTag(tag);
tag.put("onclick", "parent.notifyViews(this.getAttribute('catalogid'))");

}
};

DefaultMutableTreeNode n = (DefaultMutableTreeNode)model.getObject();

if (n.getUserObject() instanceof EcCategoryTreeNode)
{
EcCategoryTreeNode ec = (EcCategoryTreeNode)n.getUserObject();
l.add(new SimpleAttributeModifier("catalogid", "" + ec.getId()));
}

return l;
};
};
}

public CategoryTree(String s, TreeModel tm)
{
super(s,tm);
this.setLinkType(LinkType.REGULAR);
}

}

No comments: