001package gwt.material.design.addins.client.tree; 002 003/* 004 * #%L 005 * GwtMaterial 006 * %% 007 * Copyright (C) 2015 GwtMaterialDesign 008 * %% 009 * Licensed under the Apache License, Version 2.0 (the "License"); 010 * you may not use this file except in compliance with the License. 011 * You may obtain a copy of the License at 012 * 013 * http://www.apache.org/licenses/LICENSE-2.0 014 * 015 * Unless required by applicable law or agreed to in writing, software 016 * distributed under the License is distributed on an "AS IS" BASIS, 017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 018 * See the License for the specific language governing permissions and 019 * limitations under the License. 020 * #L% 021 */ 022 023import com.google.gwt.dom.client.Document; 024import com.google.gwt.dom.client.Element; 025import com.google.gwt.event.dom.client.ClickEvent; 026import com.google.gwt.event.dom.client.ClickHandler; 027import com.google.gwt.resources.client.ImageResource; 028import com.google.gwt.user.client.ui.Widget; 029import gwt.material.design.addins.client.tree.base.HasTreeItems; 030import gwt.material.design.addins.client.tree.base.mixin.TreeItemMixin; 031import gwt.material.design.client.base.AbstractIconButton; 032import gwt.material.design.client.base.HasImage; 033import gwt.material.design.client.base.MaterialWidget; 034import gwt.material.design.client.ui.MaterialImage; 035import gwt.material.design.client.ui.html.Span; 036 037import java.util.List; 038 039//@formatter:off 040/** 041 * MaterialTreeItem is a component that is needed by {@link MaterialTree} 042 * 043 * <h3>XML Namespace Declaration</h3> 044 * <pre> 045 * {@code 046 * xmlns:ma='urn:import:gwt.material.design.addins.client' 047 * } 048 * </pre> 049 * 050 * <h3>UiBinder Usage:</h3> 051 * <pre> 052 * {@code 053 * <-- Icon support --> 054 * <ma:tree.MaterialTreeItem text="Folder 1" iconType="FOLDER" /> 055 * <-- Image support --> 056 * <ma:tree.MaterialTreeItem text="Item 2.1" resource="{res.batman.png}" /> 057 * } 058 * </pre> 059 * 060 * 061 * @author kevzlou7979 062 * @see <a href="http://gwtmaterialdesign.github.io/gwt-material-demo/#treeview">Tree View</a> 063 */ 064// @formatter:on 065public class MaterialTreeItem extends AbstractIconButton implements HasImage, HasTreeItems { 066 067 private MaterialWidget divHeader = new MaterialWidget(Document.get().createDivElement()); 068 private Span span; 069 private MaterialImage image; 070 private final TreeItemMixin<MaterialTreeItem> treeItemMixin = new TreeItemMixin<>(this); 071 072 public MaterialTreeItem() { 073 setStyleName("tree-item"); 074 divHeader.setStyleName("tree-header"); 075 add(divHeader); 076 } 077 078 @Override 079 protected Element createElement() { 080 return Document.get().createDivElement(); 081 } 082 083 @Override 084 public void setText(String text) { 085 span = new Span(); 086 span.setText(text); 087 } 088 089 @Override 090 public String getText() { 091 return span.getText(); 092 } 093 094 @Override 095 public void add(Widget child) { 096 super.add(child); 097 if(child instanceof MaterialTreeItem){ 098 treeItemMixin.getTreeItems().add((MaterialTreeItem) child); 099 } 100 } 101 102 @Override 103 protected void onLoad() { 104 super.onLoad(); 105 if(image != null){ 106 divHeader.add(image); 107 } 108 divHeader.add(getIcon()); 109 divHeader.add(span); 110 divHeader.addDomHandler(new ClickHandler() { 111 @Override 112 public void onClick(ClickEvent event) { 113 initTreeItem(); 114 } 115 }, ClickEvent.getType()); 116 } 117 118 @Override 119 public void setUrl(String url) { 120 image = new MaterialImage(); 121 image.setUrl(url); 122 } 123 124 @Override 125 public String getUrl() { 126 return image.getUrl(); 127 } 128 129 @Override 130 public void setResource(ImageResource resource) { 131 image = new MaterialImage(); 132 image.setResource(resource); 133 add(image); 134 } 135 136 @Override 137 public ImageResource getResource() { 138 return image.getResource(); 139 } 140 141 public MaterialWidget getDivHeader() { 142 return divHeader; 143 } 144 145 public void setDivHeader(MaterialWidget divHeader) { 146 this.divHeader = divHeader; 147 } 148 149 @Override 150 public void initTreeItem() { 151 treeItemMixin.initTreeItem(); 152 } 153 154 @Override 155 public void setParentTree(MaterialTreeItem parentTree) { 156 treeItemMixin.setParentTree(parentTree); 157 } 158 159 @Override 160 public MaterialTreeItem getParentTree() { 161 return treeItemMixin.getParentTree(); 162 } 163 164 @Override 165 public void setTree(MaterialTree parentTree) { 166 treeItemMixin.setTree(parentTree); 167 } 168 169 @Override 170 public MaterialTree getTree() { 171 return treeItemMixin.getTree(); 172 } 173 174 @Override 175 public void setTreeItems(List<MaterialTreeItem> treeItems) { 176 treeItemMixin.setTreeItems(treeItems); 177 } 178 179 @Override 180 public List<MaterialTreeItem> getTreeItems() { 181 return treeItemMixin.getTreeItems(); 182 } 183 184 @Override 185 public void setObject(Object object) { 186 treeItemMixin.setObject(object); 187 } 188 189 @Override 190 public Object getObject() { 191 return treeItemMixin.getObject(); 192 } 193 194 @Override 195 public void expand() { 196 treeItemMixin.expand(); 197 } 198 199 @Override 200 public void collapse() { 201 treeItemMixin.collapse(); 202 } 203 204 @Override 205 public void setHide(boolean hide) { 206 treeItemMixin.setHide(hide); 207 } 208 209 @Override 210 public boolean isHide() { 211 return treeItemMixin.isHide(); 212 } 213 214 @Override 215 public void addItem(MaterialTreeItem item) { 216 treeItemMixin.addItem(item); 217 } 218 219 @Override 220 public void removeItem(MaterialTreeItem item) { 221 treeItemMixin.removeItem(item); 222 } 223 224 @Override 225 public void removeItem(int index) { 226 treeItemMixin.removeItem(index); 227 } 228 229 @Override 230 public void insertItem(MaterialTreeItem item, int index) { 231 treeItemMixin.insertItem(item, index); 232 } 233 234 @Override 235 public void removeFromTree() { 236 treeItemMixin.removeFromTree(); 237 } 238 239}