From a634c6a5dbadb1ceed77ca412bbe808f77176af2 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Mon, 23 Nov 2009 09:56:59 +0000 Subject: [PATCH] fixes #3070, implemented item style generator for tree svn changeset:9958/svn branch:6.2 --- .../vaadin/terminal/gwt/client/ui/VTree.java | 8 +++ src/com/vaadin/ui/Tree.java | 48 +++++++++++++++ .../components/tree/ItemStyleGenerator.java | 59 +++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 tests/src/com/vaadin/tests/components/tree/ItemStyleGenerator.java diff --git a/src/com/vaadin/terminal/gwt/client/ui/VTree.java b/src/com/vaadin/terminal/gwt/client/ui/VTree.java index 87b98526c5..87d27caa55 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VTree.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VTree.java @@ -15,6 +15,7 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.BrowserInfo; import com.vaadin.terminal.gwt.client.MouseEventDetails; @@ -296,6 +297,13 @@ public class VTree extends FlowPanel implements Paintable { addStyleName(CLASSNAME + "-leaf"); } addStyleName(CLASSNAME); + if (uidl.hasAttribute("style")) { + addStyleName(CLASSNAME + "-" + uidl.getStringAttribute("style")); + Widget.setStyleName(nodeCaptionDiv, CLASSNAME + "-caption-" + + uidl.getStringAttribute("style"), true); + childNodeContainer.addStyleName(CLASSNAME + "-children-" + + uidl.getStringAttribute("style")); + } if (uidl.getBooleanAttribute("expanded") && !getState()) { setState(true, false); diff --git a/src/com/vaadin/ui/Tree.java b/src/com/vaadin/ui/Tree.java index 082b9f4624..825318f32b 100644 --- a/src/com/vaadin/ui/Tree.java +++ b/src/com/vaadin/ui/Tree.java @@ -487,6 +487,13 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, target.startTag("leaf"); } + if (itemStyleGenerator != null) { + String stylename = itemStyleGenerator.getStyle(itemId); + if (stylename != null) { + target.addAttribute("style", stylename); + } + } + // Adds the attributes target.addAttribute("caption", getItemCaption(itemId)); final Resource icon = getItemIcon(itemId); @@ -1003,6 +1010,8 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, private int clickListenerCount = 0; + private ItemStyleGenerator itemStyleGenerator; + public void addListener(ItemClickListener listener) { addListener(ItemClickEvent.class, listener, ItemClickEvent.ITEM_CLICK_METHOD); @@ -1024,4 +1033,43 @@ public class Tree extends AbstractSelect implements Container.Hierarchical, } } + /** + * Sets the {@link ItemStyleGenerator} to be used with this tree. + * + * @param itemStyleGenerator + * item style generator or null to remove generator + */ + public void setItemStyleGenerator(ItemStyleGenerator itemStyleGenerator) { + if (this.itemStyleGenerator != itemStyleGenerator) { + this.itemStyleGenerator = itemStyleGenerator; + requestRepaint(); + } + } + + /** + * @return the current {@link ItemStyleGenerator} for this tree. Null if + * {@link ItemStyleGenerator} is not set. + */ + public ItemStyleGenerator getItemStyleGenerator() { + return itemStyleGenerator; + } + + /** + * ItemStyleGenerator can be used to add custom styles to tree items. The + * CSS class name that will be added to the cell content is + * v-tree-node-[style name]. + */ + public interface ItemStyleGenerator extends Serializable { + + /** + * Called by Tree when an item is painted. + * + * @param itemId + * The itemId of the item to be painted + * @return The style name to add to this item. (the CSS class name will + * be v-tree-node-[style name] + */ + public abstract String getStyle(Object itemId); + } + } diff --git a/tests/src/com/vaadin/tests/components/tree/ItemStyleGenerator.java b/tests/src/com/vaadin/tests/components/tree/ItemStyleGenerator.java new file mode 100644 index 0000000000..c4299ec939 --- /dev/null +++ b/tests/src/com/vaadin/tests/components/tree/ItemStyleGenerator.java @@ -0,0 +1,59 @@ +package com.vaadin.tests.components.tree; + +import java.io.IOException; +import java.io.StringBufferInputStream; + +import com.vaadin.tests.components.TestBase; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomLayout; +import com.vaadin.ui.Tree; + +public class ItemStyleGenerator extends TestBase { + + private Component styles; + private String css = ""; + + @Override + protected String getDescription() { + return "Item Style generator can be used to style items."; + } + + @Override + protected Integer getTicketNumber() { + return 3070; + } + + @Override + protected void setup() { + try { + styles = new CustomLayout(new StringBufferInputStream(css)); + } catch (IOException e) { + e.printStackTrace(); + } + addComponent(styles); + + Tree tree = new Tree(); + + tree.setItemStyleGenerator(new Tree.ItemStyleGenerator() { + public String getStyle(Object itemId) { + // simple return itemId as css style name + return itemId.toString(); + } + }); + + tree.addItem("red"); + tree.setChildrenAllowed("red", false); + tree.addItem("green"); + tree.addItem("green children"); + tree.setParent("green children", "green"); + tree.addItem("blue"); + tree.addItem("non-blue-childnode"); + tree.setParent("non-blue-childnode", "blue"); + + addComponent(tree); + } +} -- 2.39.5