// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.client.workspace.outline; import com.google.collide.client.ui.tree.NodeRenderer; import com.google.collide.client.ui.tree.TreeNodeElement; import com.google.collide.client.util.CssUtils; import com.google.collide.client.util.Elements; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.ImageResource; import elemental.html.DivElement; import elemental.html.Element; import elemental.html.SpanElement; /** * Class used by tree component to produce visual elements. */ public class OutlineNodeRenderer implements NodeRenderer<OutlineNode> { private static final int LABEL_NODE_INDEX = 1; /** * Style names associated with elements in the outline node. */ public interface Css extends CssResource { String root(); String icon(); String clazz(); String function(); String cssClazz(); String jsField(); String label(); String disabled(); } /** * CSS and images used by the OutlineNodeRenderer. */ public interface Resources extends ClientBundle { @Source("clazz.png") ImageResource clazz(); @Source("function.png") ImageResource function(); @Source("css-clazz.png") ImageResource cssClazz(); @Source("js-field.png") ImageResource jsField(); @Source("OutlineNodeRenderer.css") Css workspaceNavigationOutlineNodeRendererCss(); } private final Css css; public OutlineNodeRenderer(Resources resources) { this.css = resources.workspaceNavigationOutlineNodeRendererCss(); } @Override public Element getNodeKeyTextContainer(SpanElement treeNodeLabel) { return (Element) treeNodeLabel.getChildNodes().item(LABEL_NODE_INDEX); } @Override public SpanElement renderNodeContents(OutlineNode data) { SpanElement root = Elements.createSpanElement(css.root()); DivElement icon = Elements.createDivElement(css.icon()); switch (data.getType()) { case CLASS: icon.addClassName(css.clazz()); break; case FUNCTION: icon.addClassName(css.function()); break; case FIELD: icon.addClassName(css.jsField()); break; case CSS_CLASS: icon.addClassName(css.cssClazz()); break; } SpanElement label = Elements.createSpanElement(css.label()); label.setTextContent(data.getName()); root.appendChild(icon); root.appendChild(label); CssUtils.setClassNameEnabled(label, css.disabled(), !data.isEnabled()); // TODO: replace with test case assert root.getChildNodes().item(LABEL_NODE_INDEX) == label; return root; } @Override public void updateNodeContents(TreeNodeElement<OutlineNode> treeNode) { // Not implemented. } }