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 * &lt;-- Icon support -->
054 * <ma:tree.MaterialTreeItem text="Folder 1" iconType="FOLDER" />
055 * &lt;-- 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}