package gwt.material.design.demo.client.application.addins.treeview;

/*
 * #%L
 * GwtMaterial
 * %%
 * Copyright (C) 2015 - 2016 GwtMaterialDesign
 * %%
 * 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.
 * #L%
 */


import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.*;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Widget;
import com.gwtplatform.mvp.client.ViewImpl;
import gwt.material.design.addins.client.overlay.MaterialOverlay;
import gwt.material.design.addins.client.pathanimator.MaterialPathAnimator;
import gwt.material.design.addins.client.tree.MaterialTree;
import gwt.material.design.addins.client.tree.MaterialTreeItem;
import gwt.material.design.client.constants.Color;
import gwt.material.design.client.constants.IconType;
import gwt.material.design.client.ui.MaterialIcon;
import gwt.material.design.client.ui.MaterialPanel;
import gwt.material.design.client.ui.MaterialTextBox;
import gwt.material.design.client.ui.MaterialToast;
import gwt.material.design.demo.client.ThemeManager;

import javax.inject.Inject;


public class TreeView extends ViewImpl implements TreeViewPresenter.MyView {
    interface Binder extends UiBinder<Widget, TreeView> {
    }

    @UiField
    MaterialTree docTree;

    @UiField
    MaterialOverlay addOverlay;

    @UiField
    MaterialTextBox txtName;

    @UiField
    MaterialIcon btnAdd, btnDelete;

    @UiField
    MaterialPanel titlePanel;

    @Inject
    TreeView(Binder uiBinder) {
        initWidget(uiBinder.createAndBindUi(this));
        ThemeManager.register(titlePanel);
        docTree.addCloseHandler(new CloseHandler<MaterialTreeItem>() {
            @Override
            public void onClose(CloseEvent<MaterialTreeItem> event) {
                MaterialToast.fireToast("Closed : " + event.getTarget().getText());
            }
        });

        docTree.addOpenHandler(new OpenHandler<MaterialTreeItem>() {
            @Override
            public void onOpen(OpenEvent<MaterialTreeItem> event) {
                MaterialToast.fireToast("Opened : " + event.getTarget().getText());
            }
        });

        docTree.addSelectionHandler(new SelectionHandler<MaterialTreeItem>() {
            @Override
            public void onSelection(SelectionEvent<MaterialTreeItem> event) {
                btnAdd.setVisible(true);
                btnDelete.setVisible(true);
                MaterialToast.fireToast("Selected : " + event.getSelectedItem().getText());
            }
        });
    }

    @UiHandler("btnCollapse")
    void onCollapseTree(ClickEvent e) {
        docTree.collapse();
    }

    @UiHandler("btnExpand")
    void onExpandTree(ClickEvent e) {
        docTree.expand();
    }

    @UiHandler("btnAdd")
    void onAddDialog(ClickEvent e) {
        MaterialPathAnimator.animate(btnAdd.getElement(), addOverlay.getElement());
    }

    @UiHandler("btnDelete")
    void onDeleteDialog(ClickEvent e) {
        docTree.getSelectedItem().removeFromTree();
        MaterialPathAnimator.reverseAnimate(btnAdd.getElement(), addOverlay.getElement());
    }

    @UiHandler("btnDeselectItem")
    void onDeselectItem(ClickEvent e) {
        if (docTree.getSelectedItem() == null) {
            MaterialToast.fireToast("You must select an item first.");
        } else {
            MaterialToast.fireToast("Item " + docTree.getSelectedItem().getText() + " was deselected.");
            docTree.deselectSelectedItem();
        }
    }

    @UiHandler("btnFinish")
    void onFinishDialog(ClickEvent e) {
        MaterialTreeItem item = new MaterialTreeItem();
        item.setText(txtName.getText());
        item.setIconType(IconType.FOLDER);
        item.setIconColor(Color.BLUE);
        docTree.getSelectedItem().addItem(item);
        MaterialPathAnimator.reverseAnimate(btnAdd.getElement(), addOverlay.getElement());
    }

    @UiHandler("btnCancel")
    void onCancelDialog(ClickEvent e) {
        MaterialPathAnimator.reverseAnimate(btnAdd.getElement(), addOverlay.getElement());
    }
}