/*
-----------------------------------------------------------------------
--          			CHESS editor plugin							 --
--                                                                   --
--                    Copyright (C) 2011-2012                        --
--                 University of Padova, ITALY                       --
--                                                                   --
-- Author: Alessandro Zovi         azovi@math.unipd.it 		         --
--                                                                   --
-- 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-v20.html                         --
-----------------------------------------------------------------------
*/

package org.polarsys.chess.service.internal.service;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.impl.EObjectTreeElementImpl;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.services.ISourceProviderService;
import org.eclipse.ui.views.properties.PropertySheet;
import org.polarsys.chess.core.resourcelistener.SelectionListenerExtra;
import org.polarsys.chess.core.views.DiagramStatus;
import org.polarsys.chess.service.core.exceptions.NoDiagramStatusException;
import org.polarsys.chess.service.gui.utils.CHESSEditorUtils;
import org.polarsys.chess.service.internal.Activator;
import org.polarsys.chess.service.internal.commands.switchers.SwitchSourceProvider;
import org.polarsys.chess.service.internal.palette.PaletteManager;

public class SelectionListener extends SelectionListenerExtra {

	DiagramStatus diagramStatus = null;
	
	private void retrieveDiagramStatus() throws NoDiagramStatusException{
		// lazy association
		if (diagramStatus == null)
			diagramStatus = CHESSEditorUtils.getDiagramStatus(getRegistry());
		
		if (diagramStatus == null) {
			throw new NoDiagramStatusException();
		}
	}
	
	private void processPart(IWorkbenchPart part, ISelection selection){
		if (part instanceof PropertySheet) {
			/*get the actual active editor*/
			part = ((PropertySheet) part).getSite().getWorkbenchWindow()
					.getActivePage().getActiveEditor();
		} else if (part instanceof PapyrusMultiDiagramEditor && 
				CHESSEditorUtils.isCHESSProject((IEditorPart)part)) {
			// listens to sash page change events in the editor and
			// modify the view
			PapyrusMultiDiagramEditor editor = (PapyrusMultiDiagramEditor) part;
			IPage activePage = (editor).getISashWindowsContainer()
					.getActiveSashWindowsPage();

			diagramStatus.setActualView(activePage);			
			// enable/disable palette according to current view
			PaletteManager.setPaletteVisibility(editor, diagramStatus);
			
		} else if (part instanceof ModelExplorerPageBookView
				&& selection instanceof TreeSelection && !selection.isEmpty()) {
			// listens to model element selection in Model Explorer
			TreeSelection tSelection = (TreeSelection) selection;
			Object fElement = tSelection.getFirstElement();
			if (fElement instanceof EObjectTreeElementImpl) {
				diagramStatus.setActualView(tSelection);
			}
		}
	}

	@Override
	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
		try {
			retrieveDiagramStatus();

			diagramStatus.setUserAction(true);
			processPart(part, selection);

			IWorkbenchWindow window = part.getSite().getWorkbenchWindow();

			if (window.getActivePage() != null) {
				
				updateStatus(window);
			}
		} catch (NoDiagramStatusException e1) {
			Activator.error(null, e1);
		} catch (Exception e2) {
			Activator.error(null, e2);
		}
	}

	/**
	 *  Enable/disable the switch to extra-functional view command
	 *  Enable when the current view is the functional view
	 */
	private void updateStatus(IWorkbenchWindow window) {
		ISourceProviderService spService = (ISourceProviderService) window
				.getService(ISourceProviderService.class);
		SwitchSourceProvider sp = (SwitchSourceProvider) spService
				.getSourceProvider(SwitchSourceProvider.SWITCH);

		sp.updateStatus(window.getActivePage().getActiveEditor());
	}
	
}
