/*******************************************************************************
 * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
 * 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:
 *     Soyatec - initial API and implementation
 *******************************************************************************/
package org.eclipse.xwt.tools.ui.designer.databinding.ui;

import java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.xwt.tools.ui.designer.XWTDesignerPlugin;
import org.eclipse.xwt.tools.ui.designer.databinding.BindingContext;
import org.eclipse.xwt.tools.ui.designer.databinding.BindingInfo;
import org.eclipse.xwt.tools.ui.designer.databinding.IObservable;
import org.eclipse.xwt.tools.ui.designer.databinding.Property;
import org.eclipse.xwt.tools.ui.designer.editor.XWTDesigner;
import org.eclipse.xwt.tools.ui.designer.resources.ImageShop;
import org.eclipse.xwt.tools.ui.xaml.XamlElement;
import org.eclipse.xwt.tools.ui.xaml.XamlNode;

public class BindingTableGroup implements IGroup {

	private static final String[] COLUMNS = new String[] { "Target", "Target Properties", "Model", "Model Properties" };
	private TableViewer viewer;
	private ToolItem editAction;
	private ToolItem deleteAction;
	private ToolItem deleteAllAction;
	private ToolItem gotoAction;

	private CommandStack commandStack;

	public BindingTableGroup(CommandStack commandStack) {
		this.commandStack = commandStack;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.xwt.tools.ui.designer.databinding.ui.IGroup#createGroup(org.eclipse.swt.widgets.Composite, int)
	 */
	public Composite createGroup(final Composite parent, int style) {
		Composite group = new Composite(parent, style);
		group.setLayout(new GridLayout(2, false));
		Composite tableComp = new Composite(group, SWT.NONE);
		GridData layoutData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
		tableComp.setLayoutData(layoutData);
		TableColumnLayout layout = new TableColumnLayout();
		tableComp.setLayout(layout);
		viewer = new TableViewer(tableComp, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL);
		viewer.setColumnProperties(COLUMNS);
		viewer.setLabelProvider(new LabelProvider());
		viewer.setContentProvider(new ContentProvider());

		Table table = viewer.getTable();
		for (String columnName : COLUMNS) {
			TableColumn column = new TableColumn(table, SWT.CENTER);
			column.setText(columnName);
			layout.setColumnData(column, new ColumnWeightData(columnName.length()));
		}

		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				enableActions();
			}
		});
		viewer.addDoubleClickListener(new IDoubleClickListener() {
			public void doubleClick(DoubleClickEvent event) {
				edit();
			}
		});

		Composite toolsComp = new Composite(group, SWT.NONE);
		toolsComp.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL));
		toolsComp.setLayout(new FillLayout());

		ToolBar toolBar = new ToolBar(toolsComp, SWT.VERTICAL | SWT.FLAT);

		Listener listener = new Listener() {
			public void handleEvent(Event event) {
				if (SWT.Selection != event.type) {
					return;
				}
				if (event.widget == editAction) {
					edit();
				} else if (event.widget == deleteAction) {
					delete();
				} else if (event.widget == deleteAllAction) {
					deleteAll();
				} else if (event.widget == gotoAction) {
					goTo();
					parent.getShell().setMinimized(true);
				}
			}
		};

		editAction = new ToolItem(toolBar, SWT.PUSH);
		editAction.setImage(ImageShop.get(ImageShop.IMG_BINDING_EDIT));
		editAction.setToolTipText("Edit");
		editAction.setEnabled(false);
		editAction.addListener(SWT.Selection, listener);
		new ToolItem(toolBar, SWT.SEPARATOR | SWT.HORIZONTAL);

		deleteAction = new ToolItem(toolBar, SWT.PUSH);
		deleteAction.setToolTipText("Delete");
		deleteAction.setImage(ImageShop.get(ImageShop.IMG_BINDING_DELETE));
		deleteAction.setEnabled(false);
		deleteAction.addListener(SWT.Selection, listener);

		deleteAllAction = new ToolItem(toolBar, SWT.PUSH);
		deleteAllAction.setToolTipText("Delete All");
		deleteAllAction.setImage(ImageShop.get(ImageShop.IMG_BINDING_REMOVE_ALL));
		deleteAllAction.addListener(SWT.Selection, listener);
		deleteAllAction.setEnabled(false);
		new ToolItem(toolBar, SWT.SEPARATOR | SWT.HORIZONTAL);

		gotoAction = new ToolItem(toolBar, SWT.PUSH);
		gotoAction.setImage(ImageShop.get(ImageShop.IMG_GOTO_DEFINITION));
		gotoAction.setEnabled(false);
		gotoAction.setToolTipText("Go to definition");
		gotoAction.addListener(SWT.Selection, listener);

		Point size = toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
		layoutData.heightHint = size.y;
		layoutData.minimumHeight = size.y;
		return group;
	}

	private void executeCommand(Command command) {
		if (command == null || !command.canExecute()) {
			return;
		}
		if (commandStack == null) {
			command.execute();
		} else {
			commandStack.execute(command);
		}
	}

	protected void edit() {
		BindingInfo binding = getSelection();
		AdvancedBindingDialog dialog = new AdvancedBindingDialog(new Shell(), binding);
		if (dialog.open() == Window.OK) {
			executeCommand(binding.bindWithCommand());
		}
	}

	protected void delete() {
		BindingInfo binding = getSelection();
		executeCommand(computeDeleteCommand(binding));
		viewer.remove(binding);
	}

	private Command computeDeleteCommand(final BindingInfo binding) {
		XamlElement bindingNode = binding.getBindingNode();
		if (bindingNode == null) {
			return null;
		}
		final XamlNode parent = bindingNode.getParent();
		if (parent == null) {
			return null;
		}
		parent.eContainer().eAdapters().add(new AdapterImpl() {
			public void notifyChanged(Notification msg) {
				if (msg.getEventType() == Notification.ADD && parent == msg.getNewValue()) {
					viewer.add(binding);
				}
			}
		});
		return binding.deleteWithCommand();
	}

	protected void deleteAll() {
		Object input = viewer.getInput();
		if (input instanceof BindingInfo[]) {
			CompoundCommand cmd = new CompoundCommand("Delete All");
			for (BindingInfo binding : (BindingInfo[]) input) {
				Command deleteCmd = computeDeleteCommand(binding);
				if (deleteCmd == null || !deleteCmd.canExecute()) {
					continue;
				}
				cmd.add(deleteCmd);
			}
			executeCommand(cmd.unwrap());
		}
		viewer.setInput(null);
	}

	protected void goTo() {
		BindingInfo binding = getSelection();
		if (binding == null) {
			return;
		}
		XamlElement bindingNode = binding.getBindingNode();
		if (bindingNode != null && bindingNode.eContainer() != null) {
			XWTDesigner designer = XWTDesignerPlugin.getDefault().getActiveDesigner();
			if (designer != null) {
				designer.gotoDefinition((XamlNode) bindingNode.eContainer());
			}
		}
	}

	public TableViewer getViewer() {
		return viewer;
	}

	protected void enableActions() {
		ISelection selection = viewer.getSelection();
		boolean enabled = !selection.isEmpty();
		if (editAction != null) {
			editAction.setEnabled(enabled);
		}
		if (deleteAction != null) {
			deleteAction.setEnabled(enabled);
		}
		if (gotoAction != null) {
			gotoAction.setEnabled(enabled);
		}
	}

	public BindingInfo getSelection() {
		IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
		if (selection != null)
			return (BindingInfo) selection.getFirstElement();
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.xwt.tools.ui.designer.databinding.ui.IGroup#setInput(java.lang.Object)
	 */
	public void setInput(Object input) {
		if (viewer != null) {
			viewer.setInput(input);
			if (deleteAllAction != null) {
				deleteAllAction.setEnabled(true);
			}
		}
	}

	private static class LabelProvider extends
			org.eclipse.jface.viewers.LabelProvider implements
			ITableLabelProvider {

		public String getColumnText(Object element, int columnIndex) {
			if (element == null)
				return "";
			if (element instanceof BindingInfo) {
				BindingInfo binding = (BindingInfo) element;
				BindingContext bindingContext = binding.getBindingContext();
				IObservable target = bindingContext.getTarget();
				IObservable model = bindingContext.getModel();
				Property targetProperty = bindingContext.getTargetProperty();
				Property modelProperty = bindingContext.getModelProperty();
				switch (columnIndex) {
				case 0:
					return target.getDisplayName();
				case 1:
					return targetProperty == null ? "" : targetProperty.toString();
				case 2:
					return model.getDisplayName();

				case 3:
					return modelProperty == null ? "" : modelProperty.toString();
				}
			}
			return "";
		}

		public Image getColumnImage(Object element, int columnIndex) {
			return null;
		}

	}

	private static class ContentProvider implements IStructuredContentProvider {

		public Object[] getElements(Object inputElement) {
			if (inputElement == null)
				return new Object[0];
			if (inputElement.getClass().isArray()) {
				return (Object[]) inputElement;
			} else if (inputElement instanceof Collection) {
				return ((Collection) inputElement).toArray(new Object[0]);
			}
			return new Object[0];
		}

		public void dispose() {

		}

		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

		}
	}

}
