/*******************************************************************************
 * Copyright (c) 2004, 2005 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.snippets.internal.ui;


import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wst.common.snippets.core.ISnippetVariable;
import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;


/**
 * Not ready yet.
 */

public class SnippetVariableTableViewer {
	protected List fLibraryVariables;
	protected ISnippetVariable fSelection;

	protected List fSelectionChangedListeners;


	protected TableViewer fTableViewer = null;
	protected List fValueChangedListeners;
	protected Hashtable fValues = null;

	/**
	 * Constructor for VariableInsertionDialog.
	 * 
	 * @param parentShell
	 */
	public SnippetVariableTableViewer(Composite parent) {
		super();
		createContents(parent);
	}

	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		getSelectionChangedListeners().add(listener);
	}

	public void addValueChangedListener(ValueChangedListener listener) {
		getValueChangeListeners().add(listener);
	}

	public Control createContents(Composite parent) {
		// pity we can't just use a PropertySheetPage, but the column headers
		// aren't customizable
		fTableViewer = new TableViewer(new Table(parent, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER));

		// GridData data = new GridData(GridData.FILL_BOTH);
		// fTableViewer.getTable().setLayoutData(data);

		fTableViewer.getTable().setHeaderVisible(true);
		fTableViewer.getTable().setLinesVisible(true);

		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				ISelection sel = event.getSelection();
				if (sel != null && !sel.isEmpty() && sel instanceof IStructuredSelection)
					fSelection = (ISnippetVariable) ((IStructuredSelection) sel).getFirstElement();
				else
					fSelection = null;
				fireSelectionChanged(event);
			}
		});

		fTableViewer.setContentProvider(new ArrayContentProvider());

		fTableViewer.setLabelProvider(new ITableLabelProvider() {

			public void addListener(ILabelProviderListener listener) {
			}

			public void dispose() {
			}

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

			public String getColumnText(Object element, int columnIndex) {
				if (element == null)
					return null;
				SnippetVariable var = (SnippetVariable) element;
				if (columnIndex == 0)
					return var.getId();
				else if (columnIndex == 1)
					return (String) fValues.get(var.getId());
				return ""; //$NON-NLS-1$
			}

			public boolean isLabelProperty(Object element, String property) {
				return false;
			}

			public void removeListener(ILabelProviderListener listener) {
			}
		});

		TableLayout tlayout = new TableLayout();
		tlayout.addColumnData(new ColumnWeightData(35, true));
		tlayout.addColumnData(new ColumnWeightData(65, true));
		fTableViewer.getTable().setLayout(tlayout); // Create the Host column
		TableColumn tc1 = new TableColumn(fTableViewer.getTable(), SWT.NONE);
		tc1.setText("Variable ID"); //$NON-NLS-1$
		tc1.setResizable(true);
		tc1.setWidth(40);
		TableColumn tc2 = new TableColumn(fTableViewer.getTable(), SWT.NONE);
		tc2.setText("Value"); //$NON-NLS-1$
		tc2.setResizable(true);
		tc2.setWidth(40);

		fTableViewer.setCellEditors(new CellEditor[]{new TextCellEditor(fTableViewer.getTable()), new TextCellEditor(fTableViewer.getTable())});

		fTableViewer.setColumnProperties(new String[]{"id", "value"}); //$NON-NLS-1$ //$NON-NLS-2$
		ICellModifier cellmodifier = new ICellModifier() {
			public boolean canModify(Object element, String property) {
				return property.equals("value"); //$NON-NLS-1$
			}

			public Object getValue(Object element, String property) {
				if (property.equals("id")) //$NON-NLS-1$
					return ((SnippetVariable) element).getId();
				else if (property.equals("value")) //$NON-NLS-1$
					return fValues.get(((SnippetVariable) element).getId());
				return ""; //$NON-NLS-1$
			}

			public void modify(Object element, String property, Object value) {
				TableItem item = (TableItem) element;
				SnippetVariable var = (SnippetVariable) item.getData();
				if (property.equals("value")) { //$NON-NLS-1$
					String oldValue = (String) fValues.get(var.getId());
					fValues.put(var.getId(), value);
					item.setText(1, (String) value);
					fireValueChanged(new String(var.getId()), property, oldValue, new String((String) value));
				}
			}
		};
		fTableViewer.setCellModifier(cellmodifier);
		fTableViewer.setInput(getLibraryVariables());
		refresh();
		return getControl();
	}

	protected void fireSelectionChanged(SelectionChangedEvent event) {
		ISelectionChangedListener[] listeners = new ISelectionChangedListener[getSelectionChangedListeners().size()];
		getSelectionChangedListeners().toArray(listeners);
		for (int i = 0; i < listeners.length; i++)
			listeners[i].selectionChanged(event);
	}

	protected void fireValueChanged(String key, String property, String oldValue, String newValue) {
		ValueChangedListener[] listeners = new ValueChangedListener[getValueChangeListeners().size()];
		getValueChangeListeners().toArray(listeners);
		for (int i = 0; i < listeners.length; i++)
			listeners[i].valueChanged(key, property, oldValue, newValue);
	}

	public Control getControl() {

		return getTable();
	}

	/**
	 * Gets the libraryVariables.
	 * 
	 * @return Returns a List
	 */
	public List getLibraryVariables() {
		if (fLibraryVariables == null)
			fLibraryVariables = new ArrayList();
		return fLibraryVariables;
	}

	public ISnippetVariable getSelectedVariable() {
		return fSelection;
	}

	protected List getSelectionChangedListeners() {
		if (fSelectionChangedListeners == null)
			fSelectionChangedListeners = new ArrayList();
		return fSelectionChangedListeners;
	}

	/**
	 * Gets the tableViewer.
	 * 
	 * @return Returns a TableViewer
	 */
	public Table getTable() {
		if (fTableViewer == null)
			return null;
		return fTableViewer.getTable();
	}

	public String getValue(ISnippetVariable var) {
		return getValue(((SnippetVariable) var).getId());
	}

	public String getValue(String id) {
		if (getValues().containsKey(id))
			return (String) getValues().get(id);
		return ""; //$NON-NLS-1$
	}

	protected List getValueChangeListeners() {
		if (fValueChangedListeners == null)
			fValueChangedListeners = new ArrayList();
		return fValueChangedListeners;
	}

	/**
	 * Gets the values.
	 * 
	 * @return Returns a Hashtable
	 */
	public Hashtable getValues() {
		if (fValues == null)
			fValues = new Hashtable();
		return fValues;
	}

	protected void refresh() {
		if (fLibraryVariables != null) {
			fValues = null;
			for (int i = 0; i < fLibraryVariables.size(); i++) {
				SnippetVariable var = (SnippetVariable) fLibraryVariables.get(i);
				getValues().put(var.getId(), var.getDefaultValue());
			}
		}
		if (fTableViewer != null) {
			fTableViewer.setInput(fLibraryVariables);
		}
	}

	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
		getSelectionChangedListeners().remove(listener);
	}

	public void removeValueChangedListener(ValueChangedListener listener) {
		getValueChangeListeners().remove(listener);
	}

	/**
	 * Sets the libraryVariables.
	 * 
	 * @param libraryVariables
	 *            The libraryVariables to set
	 */
	public void setLibraryVariables(List libraryVariables) {
		fLibraryVariables = libraryVariables;
		refresh();
	}

}
