/*******************************************************************************
 * Copyright (c) 2006, 2009 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.ui.internal.selection;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.jpt.common.utility.internal.iterators.CloneIterator;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;

/**
 * A {@link JpaSelectionManager} stores the current {@link JpaSelection} and 
 * notifies <code>ISelectionListener</code>s when the selection changes.
 */
public class DefaultJpaSelectionManager
	implements JpaSelectionManager
{
	/* The window for which this object manages selections */
	private IWorkbenchWindow window;
	
	/* The set of pages for which this object is managing selections */
	private Set<IWorkbenchPage> pages;
	
	/* The active editor part */
	private IEditorPart activeEditor;
	
	private JpaSelection currentSelection;
	
	/* The map of <code>IJpaSelectionParticipant</code>s (keyed by part) */
	private Map<IWorkbenchPart, JpaSelectionParticipant> selectionParticipants;
	
	private IPageListener pageListener;
	
	private IPartListener2 partListener;
	
	
	public DefaultJpaSelectionManager() {
		super();
		pages = Collections.synchronizedSet(new HashSet<IWorkbenchPage>());
		selectionParticipants = Collections.synchronizedMap(new HashMap<IWorkbenchPart, JpaSelectionParticipant>());
		pageListener = new PageListener();
		partListener = new PartListener();
		currentSelection = DefaultJpaSelection.NULL_SELECTION;
	}
	
	void init(IWorkbenchWindow aWindow) {
		window = aWindow;
		aWindow.addPageListener(pageListener);
		initPage(aWindow.getActivePage());
	}
	
	private void initPage(IWorkbenchPage page) {
		if ((page != null) && (! pages.contains(page))) {
			page.addPartListener(partListener);
			pages.add(page);
			activateEditor(page.getActiveEditor());
		}
	}
	
	private void disposePage(IWorkbenchPage page) {
		if ((page != null) && (pages.contains(page))) {
			page.removePartListener(partListener);
			pages.remove(page);
		}
	}
	
	private void activateEditor(IEditorPart editor) {
		if (editor == activeEditor) {
			return;
		}
		if (activeEditor != null) {
			inactivateEditor(activeEditor);
		}
		initPart(editor);
		activeEditor = editor;
		selectEditor(activeEditor);
	}
	
	private void inactivateEditor(IEditorPart editor) {
		
	}
	
	void initPart(IWorkbenchPart part) {
		if (part != null) {
			if (selectionParticipants.get(part) == null) {
				JpaSelectionParticipant selectionParticipant = 
					(JpaSelectionParticipant) part.getAdapter(JpaSelectionParticipant.class);
				if (selectionParticipant != null) {
					selectionParticipants.put(part, selectionParticipant);
				}
			}
		}
	}
	
	private void selectEditor(IEditorPart editor) {
		selectPart(editor);
	}
	
	void selectPart(IWorkbenchPart part) {
		JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
		if (selectionParticipant != null) {
			select(selectionParticipant.getSelection(), selectionParticipant);
		}
	}
	
	void hidePart(IWorkbenchPart part) {
		JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
		if ((selectionParticipant != null) && (selectionParticipant.disposeOnHide())) {
			closePart(part);
		}
	}
	
	void closePart(IWorkbenchPart part) {
		JpaSelectionParticipant selectionParticipant = getSelectionParticipant(part);
		if (selectionParticipant != null) {
			disposePart(part);
			checkForNoEditors();
		}
	}
	
	void disposePart(IWorkbenchPart part) {
		if ((part != null) && (selectionParticipants.containsKey(part))) {
			selectionParticipants.remove(part).dispose();
		}
	}
	
	void checkForNoEditors() {
		IWorkbenchPage activePage = window.getActivePage();
		if ((activePage == null)
				|| (activePage.getEditorReferences().length == 0)) {
			select(DefaultJpaSelection.NULL_SELECTION, null);
		}
	}
	
	public void register(IWorkbenchPart part) {
		initPart(part);
	}
	
	public boolean isRegistered(IWorkbenchPart part) {
		return selectionParticipants.get(part) != null;
	}
	
	public void select(JpaSelection newSelection, JpaSelectionParticipant source) {
		if (currentSelection.equals(newSelection)) {
			return;
		}
		
		currentSelection = newSelection;
		Object nonNullSource = (source == null) ? this : source;
		fireSelectionChange(
			new JpaSelectionEvent(newSelection, JpaSelectionEvent.SELECTION, nonNullSource)
		);
	}
	
	public void deselect(JpaSelection oldSelection, JpaSelectionParticipant source) {
		if (currentSelection.equals(oldSelection)) {
			currentSelection = DefaultJpaSelection.NULL_SELECTION;
			Object nonNullSource = (source == null) ? this : source;
			fireSelectionChange(
				new JpaSelectionEvent(oldSelection, JpaSelectionEvent.DESELECTION, nonNullSource)
			);
		}
	}
	
	private void fireSelectionChange(JpaSelectionEvent event) {
		for (JpaSelectionParticipant sp : selectionParticipants.values()) {
			sp.selectionChanged(event);
		}
	}
	
	private JpaSelectionParticipant getSelectionParticipant(IWorkbenchPart part) {
		return selectionParticipants.get(part);
	}
		
	public JpaSelection getCurrentSelection() {
		return currentSelection;
	}
	
	public void dispose() {
		window.removePageListener(pageListener);
		selectionParticipants.clear();
		
		for (Iterator<IWorkbenchPage> stream = new CloneIterator<IWorkbenchPage>(this.pages); stream.hasNext(); ) {
			this.disposePage(stream.next());
		}

		for (Iterator<IWorkbenchPart> stream = new CloneIterator<IWorkbenchPart>(selectionParticipants.keySet()); stream.hasNext(); ) {
			this.disposePart(stream.next());
		}
	}
	
	
	private class PageListener implements IPageListener
	{
		public void pageActivated(IWorkbenchPage page) {
			// nop
		}
		
		PageListener() {
			super();
		}
		
		public void pageClosed(IWorkbenchPage page) {
			DefaultJpaSelectionManager.this.disposePage(page);
		}
		
		public void pageOpened(IWorkbenchPage page) {
			DefaultJpaSelectionManager.this.initPage(page);
		}
	}
	
	
	private class PartListener implements IPartListener2
	{
		PartListener() {
			super();
		}
		
		public void partActivated(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				DefaultJpaSelectionManager.this.initPart(part);
				DefaultJpaSelectionManager.this.selectPart(part);
			}
		}
		
		public void partBroughtToTop(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				initPart(part);
			}
		}
		
		public void partClosed(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				DefaultJpaSelectionManager.this.closePart(part);
				DefaultJpaSelectionManager.this.disposePart(part);
				DefaultJpaSelectionManager.this.checkForNoEditors();
			}
		}
		
		public void partDeactivated(IWorkbenchPartReference partRef) {
			// nop
		}
		
		public void partHidden(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				DefaultJpaSelectionManager.this.hidePart(part);
			}
		}
		
		public void partInputChanged(IWorkbenchPartReference partRef) {
			// nop
		}
		
		public void partOpened(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				initPart(part);
			}
		}
		
		public void partVisible(IWorkbenchPartReference partRef) {
			IWorkbenchPart part = partRef.getPart(false);
			if (part != null) {
				initPart(part);
			}
		}
	}
}
