/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 ******************************************************************************/
package org.eclipse.emf.ecp.navigator.commands;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecp.common.util.UiUtil;
import org.eclipse.emf.ecp.common.utilities.ActionHelper;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * listener ActionClass for the DoublclickAction and the ALT Key.
 * 
 * @author helming .
 */
public class AltKeyDoubleClickAction extends Action implements IDoubleClickListener, Listener {

	private ColumnViewer viewer;
	private boolean isAltKeyPressed;
	private String classname;
	private static String meeditorid = "org.eclipse.emf.ecp.editor";

	/**
	 * <pre>
	 *  1- Adds the listener to the collection of listeners who will be notified when
	 *  an event of the - given type occurs anywhere in a widget. The event type is (SWT.Alt) 
	 *  one of the event constants defined in class SWT. When the event does occur, the listener
	 *  is notified by sending it the handleEvent() message.
	 * </pre>
	 */
	public AltKeyDoubleClickAction() {

		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getDisplay().addFilter(SWT.KeyDown, this);
	}

	/**
	 * <pre>
	 * 1- Adds the listener to the collection of listeners who will be notified when
	 *  an event of the - given type occurs anywhere in a widget. The event type is (SWT.Alt) 
	 *  one of the event constants defined in class SWT. When the event
	 *  does occur, the listener is notified by sending it the handleEvent() message.
	 * 
	 * </pre>
	 * 
	 * @param sourceView the view that requested the open model element.
	 */
	public AltKeyDoubleClickAction(final String sourceView) {
		this();
		this.classname = sourceView;

	}

	/**
	 * <pre>
	 * 1- Adds the listener to the collection of listeners who will be notified when
	 *  an event of the - given type occurs anywhere in a widget. The event type is (SWT.Alt) 
	 *  one of the event constants defined in class SWT. When the event
	 *  does occur, the listener is notified by sending it the handleEvent() message.
	 * 
	 * 2- Adds a listener for double-clicks in this viewer. Has no effect if an identical
	 *  listener is already registered.
	 * 
	 * </pre>
	 * 
	 * @param viewer ColumnViewer the Viewer of the sourceView.
	 * @param sourceView the view that requested the open model element.
	 */
	public AltKeyDoubleClickAction(ColumnViewer viewer, final String sourceView) {
		this(sourceView);
		this.viewer = viewer;
		this.viewer.addDoubleClickListener(this);
	}

	/**
	 * This opens the selected model element.
	 * 
	 * @see org.eclipse.jface.action.Action#run()
	 * @see org.eclipse.emf.ecp.navigator.commands.AltKeyDoubleClickAction#openSelectedModelelement()
	 */
	@Override
	public void run() {
		// This method opens a model regardless of a pressed Alt-Key.
		openSelectedModelelement();
	}

	/**
	 * This method opens a model regardless of a pressed Alt-Key.
	 */
	private void openSelectedModelelement() {
		// the selected Object or null if selection is not an IStructuredSelection

		EObject me = UiUtil.getSelectedModelelement();
		if (me == null) {
			return;
		}
		if (classname == null || classname.equals("")) {
			return;
		}
		ActionHelper.openModelElement(me, classname);
	}

	/**
	 * @param event {@link Event}.
	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
	 */
	public void handleEvent(Event event) {

		// check keyCode for Alt.
		if (event.keyCode == SWT.ALT) {
			isAltKeyPressed = true;
		}
	}

	/**
	 * @param event {@link DoubleClickEvent} .
	 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick (org.eclipse.jface.viewers.DoubleClickEvent).
	 */
	public void doubleClick(DoubleClickEvent event) {
		if (isAltKeyPressed) {
			closeActiveMEEditor();
		}
		isAltKeyPressed = false;
		// open selected modelelment.
		run();

	}

	/**
	 * this method closes an active MEEditor.
	 */
	private void closeActiveMEEditor() {

		IWorkbenchWindow workbenchwindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

		if (workbenchwindow != null) {

			IWorkbenchPage page = workbenchwindow.getActivePage();

			if (page != null) {

				IEditorPart editor = page.getActiveEditor();

				if (editor != null && editor.getSite().getId().equals(meeditorid)) {

					page.closeEditor(editor, true);

				}

			}

		}

	}

}