package com.scc.treecolumn.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.gwtext.client.core.Connection;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.NameValuePair;
import com.gwtext.client.core.SortDir;
import com.gwtext.client.data.Node;
import com.gwtext.client.data.SimpleStore;
import com.gwtext.client.data.Store;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Viewport;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.TextField;
import com.gwtext.client.widgets.tree.AsyncTreeNode;
import com.gwtext.client.widgets.tree.ColumnNodeUI;
import com.gwtext.client.widgets.tree.ColumnTree;
import com.gwtext.client.widgets.tree.TreeLoader;
import com.gwtext.client.widgets.tree.TreeNode;
import com.gwtext.client.widgets.tree.TreeSorter;
import com.gwtext.client.widgets.tree.TreeSorterConfig;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class GWTExt_TreeColumn implements EntryPoint {

	int counter = 0;
	static Object hours[][] = null;
	static boolean sortedAsc = true;

	public static Object[][] getDuration() {
		if (hours == null) {
			hours = new Object[][] { new Object[] { "1h", "1 Hour" },
					new Object[] { "2h", "2 Hour" },
					new Object[] { "3h", "3 Hour" },
					new Object[] { "4h", "4 Hour" },
					new Object[] { "5h", "5 Hour" },
					new Object[] { "6h", "6 Hour" },
					new Object[] { "7h", "7 Hour" } };
		}
		return hours;
	}

	/**
	 * This is the entry point method.
	 */
	@Override
	public void onModuleLoad() {
		final Panel panel = new Panel();

		final ColumnTree coltree = new ColumnTree();
		coltree.setWidth(552);
		coltree.setHeight(400);
		// coltree.setAutoHeight(true);
		coltree.setRootVisible(true);
		coltree.setAutoScroll(true);
		coltree.setTitle("my Sample");
		coltree.setTitle("my Sample");

		final ColumnTree.Column cols[] = new ColumnTree.Column[3];
		cols[0] = coltree.new Column("Task", 350, "task");
		cols[1] = coltree.new Column("Duration", 100, "duration");
		cols[2] = coltree.new Column("Assigned To", 100, "user");

		coltree.setColumns(cols);

		final TreeLoader loader = new TreeLoader();
		loader.setPreloadChildren(true);
		final String dataUrl = GWT.getModuleBaseURL() + "data/column-data.json";
		loader.setDataUrl(dataUrl);
		loader.setMethod(Connection.GET);
		loader.setUiProviders(ColumnNodeUI.getUiProvider());

		final AsyncTreeNode root = new AsyncTreeNode("Tasks", loader);
		root.setTooltip("test tooltip");
		coltree.setRootNode(root);

		final Store store = new SimpleStore(
				new String[] { "abbr", "duration" }, getDuration());
		store.load();

		final ComboBox cb = new ComboBox();
		cb.setMinChars(1);
		cb.setFieldLabel("Duration");
		cb.setStore(store);
		cb.setDisplayField("duration");
		cb.setMode(ComboBox.LOCAL);
		cb.setTriggerAction(ComboBox.ALL);
		cb.setEmptyText("Select Duration");
		cb.setTypeAhead(true);
		cb.setSelectOnFocus(true);
		cb.setWidth(110);
		cb.setResizable(true);
		cb.setTitle("Duration");
		cb.setAllowBlank(false);

		new SccColumnTreeEditor(coltree, "duration", cb, true);
		new SccColumnTreeEditor(coltree, "task", new TextField(), true);
		new SccColumnTreeEditor(coltree, "user", new TextField(), true);

		cb.getStore().getById(cb.getValue());

		panel.add(coltree);

		final Button addNode = new Button("Add Node");
		addNode.addListener(new ButtonListenerAdapter() {

			@Override
			public void onClick(final Button button, final EventObject e) {
				Node rootNode = coltree.getRootNode();
				Node selNode = coltree.getSelectedNode();
				if (selNode == null) {
					selNode = rootNode;
				}

				final NameValuePair[] nodeData = new NameValuePair[] {
						new NameValuePair("task", "New Task " + counter),
						new NameValuePair("duration", counter + " Day"),
						new NameValuePair("user", "TBD " + counter), };
				counter++;
				final TreeNode tnode = ColumnNodeUI.getNewTreeNode(nodeData);
				// tnode.setIconCls("task");
				tnode.setLeaf(true);

				if (selNode.isLeaf()) {
					selNode.getParentNode().insertBefore(tnode,
							selNode.getNextSibling());
				} else {
					if (selNode.getFirstChild() != null)
						selNode.insertBefore(tnode, selNode.getFirstChild());
					else
						selNode.appendChild(tnode);
				}
			}
		});
		panel.add(addNode);

		final Button sort = new Button("Toggle Sort");
		sort.addListener(new ButtonListenerAdapter() {
			@Override
			public void onClick(final Button button, final EventObject e) {
				final TreeSorter sorter = new TreeSorter(coltree,
						new TreeSorterConfig() {
							{
								if (sortedAsc) {
									setDir(SortDir.DESC);
								} else {
									setDir(SortDir.ASC);
								}
								setProperty("task");
							}
						});
				sorter.sort(coltree.getRootNode());
				sortedAsc = !sortedAsc;
			}
		});
		panel.add(sort);

		// RootPanel.get().add(panel);

		new Viewport(panel);
	}
}

