//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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;

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

import org.eclipse.epf.authoring.ui.dialogs.ContributionSelection;
import org.eclipse.epf.authoring.ui.editors.EditorChooser;
import org.eclipse.epf.authoring.ui.views.ConfigurationView;
import org.eclipse.epf.authoring.ui.views.LibraryView;
import org.eclipse.epf.common.ui.util.PerspectiveUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.VariabilityElement;
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.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * Handles UI actions in the workbench.
 * 
 * @author Jinhua Xi
 * @author Kelvin Low
 * @author Shilpa Toraskar
 * @since 1.0
 */
public class UIActionDispatcher implements ISelectionProvider {

	private static UIActionDispatcher instance = null;

	protected List<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();

	protected List<IDoubleClickListener> doubleClickListeners = new ArrayList<IDoubleClickListener>();

	private CurrentSelection currentSelection = new CurrentSelection();

	private IDoubleClickListener doubleClickListener = null;

	/**
	 * Returns the singleton instance.
	 */
	public static UIActionDispatcher getInstance() {
		if (instance == null) {
			synchronized (UIActionDispatcher.class) {
				if (instance == null) {
					instance = new UIActionDispatcher();
				}
			}
		}
		return instance;
	}

	/**
	 * Private default constructor.
	 */
	private UIActionDispatcher() {
		this(null);
	}

	/**
	 * create an action dispatcher of my own
	 * 
	 * @param owner
	 */
	public UIActionDispatcher(Object owner) {
		// Create the double click listener used for launching the Method
		// editors.
		doubleClickListener = new IDoubleClickListener() {
			public void doubleClick(DoubleClickEvent e) {
				ISelection selection = e.getSelection();
				if (selection != null) {
					IWorkbenchWindow window = PlatformUI.getWorkbench()
							.getActiveWorkbenchWindow();
					IWorkbenchPartSite site = window.getActivePage()
							.getActivePart().getSite();

					IStructuredSelection sel = (IStructuredSelection) selection;
					Object[] selObjs = sel.toArray();
					Object selectedObject = null;

					if ((selObjs != null) && (selObjs.length > 0)) {
						// Open the Authoring persepective.
						UIActionDispatcher.openAuthoringPerspective();

						// Locate the selected Method element.
						Object obj = TngUtil.unwrap(selObjs[0]);
						ConfigurationView view = ConfigurationView.getView();						
						if ((view != null ) && site.equals(view.getSite()) ) {
							// Double-click orginated from the Configuration
							// view.
							if (obj instanceof VariabilityElement) {
								VariabilityElement element = (VariabilityElement) obj;
								ContributionSelection contribSelection = new ContributionSelection();
								selectedObject = contribSelection
										.getSelectedContributor(element);
							}
							else if (obj instanceof Milestone) {
								selectedObject = TngUtil.getOwningProcess((BreakdownElement) obj);
							}
						} else {
							selectedObject = obj;
						}

						if (selectedObject != null) {
							
							EditorChooser.getInstance().openEditor(
									selectedObject);
						}
					}
				}
			}
		};

		// Add a perspective listener to enable/disable double-click listening.
		IWorkbenchWindow activeWorkbenchWindow = AuthoringUIPlugin.getDefault()
				.getWorkbench().getActiveWorkbenchWindow();
		if (activeWorkbenchWindow != null) {
			activeWorkbenchWindow
					.addPerspectiveListener(new IPerspectiveListener() {
						public void perspectiveActivated(IWorkbenchPage page,
								IPerspectiveDescriptor desc) {
							if (desc.getId().equals(
									AuthoringPerspective.PERSPECTIVE_ID)) {
								addDoubleClickListener(doubleClickListener);
								LibraryView.getViewInstance().registerChangeListeners();
							} else {
								removeDoubleClickListener(doubleClickListener);
							}
						}

						public void perspectiveChanged(IWorkbenchPage page,
								IPerspectiveDescriptor desc, String id) {
						}
					});
		}

		if (PerspectiveUtil
				.isActivePerspective(AuthoringPerspective.PERSPECTIVE_ID)) {
			addDoubleClickListener(doubleClickListener);
		}
	}

	public static void editConfiguration(String configName) {
	}

	/**
	 * Open library perspective
	 * 
	 */
	public static void openLibraryPerspective() {
		PerspectiveUtil.openPerspective(BrowsingPerspective.PERSPECTIVE_ID);
		IWorkbenchPage wkbPage = PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getActivePage();
		IViewPart viewPart = wkbPage.findView(LibraryView.VIEW_ID);
		if (viewPart != null)
			wkbPage.hideView(viewPart);
		viewPart = wkbPage.findView(ConfigurationView.VIEW_ID);
		wkbPage.activate(viewPart);
	}

	/**
	 * Open authoring perspective
	 * 
	 */
	public static void openAuthoringPerspective() {
		PerspectiveUtil.openPerspective(AuthoringPerspective.PERSPECTIVE_ID);
		IWorkbenchPage wkbPage = PlatformUI.getWorkbench()
				.getActiveWorkbenchWindow().getActivePage();
		IViewPart viewPart = wkbPage.findView(LibraryView.VIEW_ID);
		wkbPage.activate(viewPart);
	}

	/**
	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 */
	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		if (!selectionChangedListeners.contains(listener)) {
			selectionChangedListeners.add(listener);
		}
	}

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

	/**
	 * Return current selection
	 */
	public ISelection getSelection() {
		return currentSelection.selection;
	}

	public ISelectionProvider getSelectionSource() {
		return currentSelection.source;
	}

	/**
	 * Sets current selection
	 */
	public void setSelection(ISelection selection) {
		setSelection(this, selection);
	}

	/**
	 * Sets current selection
	 */
	public void setSelection(ISelectionProvider source, ISelection selection) {
		synchronized (this) {
			currentSelection.selection = selection;
			currentSelection.source = source;

			SelectionChangedEvent event = new SelectionChangedEvent(source,
					selection);

			// Avoid concurrent error.
			List<ISelectionChangedListener> processedItems = new ArrayList<ISelectionChangedListener>();
			while (selectionChangedListeners.size() > 0) {
				ISelectionChangedListener listener = (ISelectionChangedListener) selectionChangedListeners
						.remove(0);
				if (listener != null) {
					try {
						listener.selectionChanged(event);
					} catch (Exception e) {
						AuthoringUIPlugin.getDefault().getLogger().logError(e);
					}
					processedItems.add(listener);
				}
			}

			selectionChangedListeners.addAll(processedItems);
		}
	}

	/**
	 * Add double click listener
	 * 
	 * @param listener
	 */
	public void addDoubleClickListener(IDoubleClickListener listener) {
		if (!doubleClickListeners.contains(listener)) {
			doubleClickListeners.add(listener);
		}
	}

	/**
	 * Remove double click listener
	 * 
	 * @param listener
	 */
	public void removeDoubleClickListener(IDoubleClickListener listener) {
		doubleClickListeners.remove(listener);
	}

	/**
	 * Handle double click event
	 * 
	 * @param event
	 */
	public void handleDoubleClickEvent(DoubleClickEvent event) {
		synchronized (this) {
			// Avoid concurrent error.
			List<IDoubleClickListener> processedItems = new ArrayList<IDoubleClickListener>();
			while (doubleClickListeners.size() > 0) {
				IDoubleClickListener listener = (IDoubleClickListener) doubleClickListeners
						.remove(0);
				try {
					listener.doubleClick(event);
				} catch (Exception e) {
					AuthoringUIPlugin.getDefault().getLogger().logError(e);
				}
				processedItems.add(listener);
			}
			doubleClickListeners.addAll(processedItems);
		}
	}

	public class CurrentSelection {

		public ISelectionProvider source = null;

		public ISelection selection = StructuredSelection.EMPTY;

	}

}
