/*
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Florian Pirchner - Initial implementation
 *     Loetz GmbH&Co.KG                               
 * 
 */
package org.eclipse.osbp.vaadin.emf.views;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider;
import org.eclipse.osbp.runtime.web.vaadin.common.resource.IResourceProvider;
import org.eclipse.osbp.vaadin.emf.api.IModelingContext;
import org.eclipse.osbp.vaadin.emf.data.JvmTypePropertiesTreeContainer;

import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Tree;
import com.vaadin.ui.Tree.TreeDragMode;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

// TODO: Auto-generated Javadoc
/**
 * Shows any {@link JvmGenericType} in a tree viewer style. Only properties
 * (getter and setter available) are shown as details.
 * <p>
 * ATTENTION: This viewer MUST be disposed!
 */
@SuppressWarnings({ "serial", "restriction" })
public class JvmTypePropertiesTreeViewer extends CustomComponent {

	/** The tree. */
	private Tree tree;
	
	/** The container. */
	private JvmTypePropertiesTreeContainer container;
	
	/** The type provider. */
	private IJvmTypeProvider typeProvider;

	/**
	 * Instantiates a new jvm type properties tree viewer.
	 *
	 * @param modelingContext
	 *            the modeling context
	 * @param resourceProvider
	 *            the resource provider
	 * @param typeProvider
	 *            the type provider
	 */
	public JvmTypePropertiesTreeViewer(IModelingContext modelingContext,
			IResourceProvider resourceProvider, IJvmTypeProvider typeProvider) {
		this.typeProvider = typeProvider;
		Panel mainLayout = new Panel();
		mainLayout.setSizeFull();
		setCompositionRoot(mainLayout);

		VerticalLayout scrollArea = new VerticalLayout();
		scrollArea.setMargin(true);
		mainLayout.setContent(scrollArea);

		tree = new Tree();
		tree.setSizeFull();

		tree.setDragMode(TreeDragMode.NODE);
		// tree.setDropHandler(new EmfTreeDndHandler(modelingContext, tree));

		// tree.addActionHandler(new EObjectActionHandler(modelingContext,
		// resourceProvider));
		// resolve by ui request. Otherwise exception
		tree.addExpandListener(e -> container.resolveChildren(e.getItemId()));
		scrollArea.addComponent(tree);

		container = new JvmTypePropertiesTreeContainer(modelingContext,
				resourceProvider, new UiSync(UI.getCurrent()));
		tree.setContainerDataSource(container);

		tree.setItemCaptionPropertyId("label");
		tree.setItemIconPropertyId("icon");
	}

	// private void contextMenuOpens(ContextMenuOpenEvent event) {
	// event.getContextClickEvent().getComponent();
	// }

	/**
	 * Adds the item click listener.
	 *
	 * @param listener
	 *            the listener
	 */
	public void addItemClickListener(ItemClickListener listener) {
		tree.addItemClickListener(listener);
	}

	/**
	 * Removes the item click listener.
	 *
	 * @param listener
	 *            the listener
	 */
	public void removeItemClickListener(ItemClickListener listener) {
		tree.removeItemClickListener(listener);
	}

	/**
	 * Gets the selection.
	 *
	 * @return the selection
	 */
	public EObject getSelection() {
		return (EObject) tree.getValue();
	}

	/**
	 * Sets the value.
	 *
	 * @param selection
	 *            the new value
	 */
	public void setValue(EObject selection) {
		tree.setValue(selection);
	}

	/**
	 * Gets the root element.
	 *
	 * @return the root element
	 */
	public JvmGenericType getRootElement() {
		return (JvmGenericType) container.getRootElement();
	}

	/**
	 * Sets the root element.
	 *
	 * @param rootElement
	 *            the new root element
	 */
	public void setRootElement(JvmGenericType rootElement) {
		container.setRootElement(rootElement);
	}

	/**
	 * Sets the root element.
	 *
	 * @param rootElement
	 *            the new root element
	 */
	public void setRootElement(Class<?> rootElement) {
		container.setRootElement((JvmGenericType) typeProvider
				.findTypeByName(rootElement.getName()));
	}

	/**
	 * Sets the root element.
	 *
	 * @param className
	 *            the new root element
	 */
	public void setRootElement(String className) {
		container.setRootElement((JvmGenericType) typeProvider
				.findTypeByName(className));
	}

	/**
	 * Expand.
	 *
	 * @param element
	 *            the element
	 */
	public void expand(EObject element) {
		if (tree.containsId(element)) {
			tree.expandItem(element);

			// expand parent up to the root
			if (!tree.isRoot(element)) {
				expand(element.eContainer());
			}
		} else if (element.eContainer() != null) {
			// expand parent
			expand(element.eContainer());

			// now expand child
			if (tree.containsId(element)) {
				tree.expandItem(element);
			}
		}
	}

	/**
	 * Is required to be called.
	 */
	public void dispose() {
		tree = null;
		container.dispose();
		container = null;
	}

}
