//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.ui.views;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor;
import org.eclipse.epf.library.configuration.ConfigurationClosure;
import org.eclipse.epf.library.configuration.ElementDependencyError;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;


/**
 * The Message view.
 * <p>
 * Displays the Method Library error and warning messages
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class MessageView extends ViewPart implements ISelectionProvider,
		IPartListener {

	/**
	 * The view ID.
	 */
	public static final String VIEW_ID = MessageView.class.getName();

	public static final int ERROR_MESSAGE_COLUMN = 0;

	public static final int ERROR_ELEMENT_COLUMN = 1;

	public static final int CAUSE_ELEMENT_COLUMN = 2;

	protected MessageViewer tableViewer;

	protected Collection selectionChangedListeners = new ArrayList();

	private ISelectionChangedListener selectionChangedListener = null;

	protected ISelection currentSelection = StructuredSelection.EMPTY;

	private ConfigurationClosure closure = null;

	public MessageView() {
	}

	/**
	 * updates View when configurationFactory changes
	 * @param closure
	 */
	public void configurationFactoryChanged(ConfigurationClosure closure) {
		this.closure = closure;

		ComposedAdapterFactory adapterFactory = null;
		if (closure != null) {
			adapterFactory = (ComposedAdapterFactory) closure
					.getConfigurationManager().getAdapterFactory();
			tableViewer.setLabelProvider(new MessageLabelProvider(
					adapterFactory));
		}
		tableViewer.setContentProvider(new MessageContentProvider(closure));

		updateMessage();
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 */
	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		selectionChangedListeners.add(listener);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 */
	public void removeSelectionChangedListener(
			ISelectionChangedListener listener) {
		selectionChangedListeners.remove(listener);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
	 */
	public ISelection getSelection() {
		return currentSelection;
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
	 */
	public void setSelection(ISelection selection) {
		currentSelection = selection;

		for (Iterator listeners = new ArrayList(selectionChangedListeners)
				.iterator(); listeners.hasNext();) {
			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
					.next();
			listener
					.selectionChanged(new SelectionChangedEvent(this, selection));
		}
	}

	private void createViewer(Composite composite) {
		tableViewer = new MessageViewer(composite);

		IViewSite site = (IViewSite) this.getSite();
		site.setSelectionProvider(this);

		if (selectionChangedListener == null) {
			// Create the listener
			selectionChangedListener = new ISelectionChangedListener() {
				// This just notifies those things that are affected by the
				// section.
				public void selectionChanged(SelectionChangedEvent event) {
//					System.out
//							.println(AuthoringUIResources.MessageView_selected_text + event.getSelection()); //$NON-NLS-1$
					setSelection(event.getSelection());
				}
			};

			tableViewer.addSelectionChangedListener(selectionChangedListener);
		}

		// Set column info.
		setColumns();
	}

	private void setColumns() {
		Tree table = tableViewer.getTree();
		table.setHeaderVisible(true);
		table.setLinesVisible(true);

		TreeColumn column;

		column = new TreeColumn(table, SWT.NONE, ERROR_MESSAGE_COLUMN);
		column.setText(AuthoringUIResources.MessageView_errmsg_text); 
		column.setWidth(450);

		column = new TreeColumn(table, SWT.NONE, ERROR_ELEMENT_COLUMN);
		column.setText(AuthoringUIResources.MessageView_errelement_text); 
		column.setWidth(200);

		column = new TreeColumn(table, SWT.NONE, CAUSE_ELEMENT_COLUMN);
		column.setText(AuthoringUIResources.MessageView_refelement_text); 
		column.setWidth(200);

	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createPartControl(Composite parent) {
		createViewer(parent);

		IWorkbenchWindow workbenchWindow = getSite().getWorkbenchWindow();
		workbenchWindow.getPartService().addPartListener(this);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
	 */
	public void setFocus() {
	}

	/**
	 * @return the MessageView object
	 */
	public static MessageView getView() {
		try {
			IWorkbenchPage activePage = PlatformUI.getWorkbench()
					.getActiveWorkbenchWindow().getActivePage();
			if (activePage != null) {
				IViewPart view = activePage.findView(VIEW_ID);
				if (view == null) {
					view = activePage.showView(VIEW_ID);
				}
				return (MessageView) view;
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}

		return null;
	}

	/**
	 * update Message View according to the configuration closure state
	 *
	 */
	public void updateMessage() {
		if (closure != null) {
			tableViewer.setInput(closure);
		} else {
			tableViewer.setInput(new Object());
		}
	}

	/**
	 * @return if viewer has input
	 */
	public boolean isDisposed() {
		return (closure == null);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
	 */
	public void dispose() {
		super.dispose();

		IWorkbenchWindow workbenchWindow = getSite().getWorkbenchWindow();
		workbenchWindow.getPartService().removePartListener(this);

		selectionChangedListeners.clear();
		closure = null;
	}

	/**
	 * Show the error for the element.
	 */
	public void showError(Object e) {
		ElementDependencyError error = closure.getError(e);
		if (error != null) {
			tableViewer.setSelection(error);
		}
	}

	/**
	 * The Viewer class underlying this view 
	 *
	 */
	public class MessageViewer extends TreeViewer {

		public MessageViewer(Composite parent) {
			this(parent, SWT.FULL_SELECTION);
		}

		public MessageViewer(Composite parent, int style) {
			super(parent, style);

			Tree tree = getTree();
			tree.setHeaderVisible(true);
			tree.setLinesVisible(true);

		}

		public void setSelection(Object element) {
			super.expandToLevel(element, 1);
			Widget ctrl = super.findItem(element);
			if (ctrl != null) {
				List items = new ArrayList();
				items.add(ctrl);
				super.setSelection(items);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
	 */
	public void partActivated(IWorkbenchPart part) {
		if (part instanceof ConfigurationEditor) {
			ConfigurationClosure c = ((ConfigurationEditor) part).getClosure();
			if (c != closure) {
				configurationFactoryChanged(c);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
	 */
	public void partBroughtToTop(IWorkbenchPart part) {
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
	 */
	public void partClosed(IWorkbenchPart part) {
		if (part instanceof ConfigurationEditor) {
			ConfigurationClosure c = ((ConfigurationEditor) part).getClosure();
			if (c == closure) {
				configurationFactoryChanged(null);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
	 */
	public void partDeactivated(IWorkbenchPart part) {
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
	 */
	public void partOpened(IWorkbenchPart part) {
	}

}
