001package gwt.material.design.addins.client.tree.base.mixin;
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.core.client.GWT;
024import com.google.gwt.event.logical.shared.CloseEvent;
025import com.google.gwt.event.logical.shared.OpenEvent;
026import com.google.gwt.event.logical.shared.SelectionEvent;
027import com.google.gwt.user.client.ui.Widget;
028import gwt.material.design.addins.client.stepper.base.mixin.AbstractMixin;
029import gwt.material.design.addins.client.tree.base.HasTreeItems;
030import gwt.material.design.addins.client.tree.MaterialTree;
031import gwt.material.design.addins.client.tree.MaterialTreeItem;
032import gwt.material.design.client.base.HasFontSize;
033
034import java.util.ArrayList;
035import java.util.List;
036
037/**
038 * @author kevzlou7979
039 */
040public class TreeItemMixin<T extends Widget & HasFontSize> extends AbstractMixin<T> implements HasTreeItems {
041
042    private boolean hide = true;
043    private List<MaterialTreeItem> treeItems = new ArrayList<>();
044    private MaterialTree tree;
045    private MaterialTreeItem parentTree;
046    private Object object;
047    public TreeItemMixin(final T widget) {
048        super(widget);
049    }
050
051
052    @Override
053    public void initTreeItem() {
054        MaterialTreeItem item = (MaterialTreeItem) uiObject;
055        // Fire selection event
056        SelectionEvent.fire(getTree(), item);
057        if(!getTreeItems().isEmpty()) {
058            for (MaterialTreeItem treeItem : getTreeItems()) {
059                if (hide) {
060                    treeItem.setVisible(false);
061                } else {
062                    treeItem.setVisible(true);
063                }
064            }
065            // Firing of events based on the status of the tree item
066            if (hide) {
067                CloseEvent.fire(getTree(), item);
068                hide = false;
069            } else {
070                OpenEvent.fire(getTree(), item);
071                hide = true;
072            }
073        }
074    }
075
076    @Override
077    public void setParentTree(MaterialTreeItem parentTree) {
078        this.parentTree = parentTree;
079    }
080
081    @Override
082    public MaterialTreeItem getParentTree() {
083        return parentTree;
084    }
085
086    @Override
087    public void setTree(MaterialTree tree) {
088        this.tree = tree;
089    }
090
091    @Override
092    public MaterialTree getTree() {
093        return tree;
094    }
095
096    @Override
097    public void setTreeItems(List<MaterialTreeItem> treeItems) {
098        this.treeItems = treeItems;
099    }
100
101    @Override
102    public List<MaterialTreeItem> getTreeItems() {
103        return treeItems;
104    }
105
106    @Override
107    public void setObject(Object object) {
108        this.object = object;
109    }
110
111    @Override
112    public Object getObject() {
113        return object;
114    }
115
116    @Override
117    public void expand() {
118        for(MaterialTreeItem item : getTreeItems()){
119            item.setVisible(true);
120        }
121    }
122
123    @Override
124    public void collapse() {
125        for(MaterialTreeItem item : getTreeItems()){
126            item.setVisible(false);
127        }
128    }
129
130    public boolean isHide() {
131        return hide;
132    }
133
134    @Override
135    public void addItem(MaterialTreeItem item) {
136        getMaterialTreeItem().add(item);
137        getMaterialTreeItem().expand();
138        getMaterialTreeItem().getTree().initTree(getMaterialTreeItem());
139    }
140
141    @Override
142    public void removeItem(MaterialTreeItem item) {
143        getMaterialTreeItem().remove(item);
144        getMaterialTreeItem().getTree().initTree(getMaterialTreeItem());
145    }
146
147    @Override
148    public void removeItem(int index) {
149        getMaterialTreeItem().remove(getMaterialTreeItem().getWidget(index));
150        getMaterialTreeItem().getTree().initTree(getMaterialTreeItem());
151    }
152
153    @Override
154    public void insertItem(MaterialTreeItem item, int index) {
155        getMaterialTreeItem().insert(item, index);
156        getMaterialTreeItem().expand();
157        getMaterialTreeItem().getTree().initTree(getMaterialTreeItem());
158    }
159
160    @Override
161    public void removeFromTree() {
162        getMaterialTreeItem().removeFromParent();
163        getMaterialTreeItem().getTree().initTree(getMaterialTreeItem());
164    }
165
166    public void setHide(boolean hide) {
167        this.hide = hide;
168    }
169
170    protected MaterialTreeItem getMaterialTreeItem(){
171        if(uiObject instanceof MaterialTreeItem){
172            return (MaterialTreeItem)uiObject;
173        }else{
174            GWT.log("Widget is not instanceof MaterialTreeItem");
175            return null;
176        }
177    }
178}