CHESSIoT_Dev_old-master/org.polarsys.chess.service/src/org/polarsys/chess/service/gui/utils/SelectionUtil.java
/*******************************************************************************
 * Copyright (C) 2017 Fondazione Bruno Kessler.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors:
 *     Alberto Debiasi - initial API and implementation
 ******************************************************************************/
package org.polarsys.chess.service.gui.utils;

import java.util.List;

import org.apache.log4j.Logger;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.uml.tools.model.UmlModel;
import org.eclipse.papyrus.uml.tools.model.UmlUtils;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Property;
import org.polarsys.chess.contracts.profile.chesscontract.util.ContractEntityUtil;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.service.core.exceptions.NoComponentException;





/**
 * Util class that provides methods for the object that are selected in the GUI
 * by the user.
 *
 */
public class SelectionUtil {
	
	private static final Logger logger = Logger.getLogger(SelectionUtil.class);
	
	private static SelectionUtil selectionUtil;

	private ContractEntityUtil contractEntityUtil = ContractEntityUtil.getInstance();
	private EntityUtil entityUtil = EntityUtil.getInstance();

	public static SelectionUtil getInstance() {
		if (selectionUtil == null) {
			selectionUtil = new SelectionUtil();
		}
		return selectionUtil;
	}

	public Object getUmlSelectedObject(ExecutionEvent event) {
		ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
		return getUmlSelectedObject(selection);
	}
	
	public Object getUmlSelectedObject(Object selection) {

		Object selectedObject = selection;

		if ((selectedObject instanceof IStructuredSelection)) {

			List<?> selectionList = ((IStructuredSelection) selectedObject).toList();
			if (selectionList.size() == 1) {
				selectedObject = selectionList.get(0);
			}
		}
		EObject selectedEObject = EMFHelper.getEObject(selectedObject);
		if (selectedEObject != null) {
			selectedObject = selectedEObject;
		}
		if (selectedObject instanceof GraphicalEditPart) {
			selectedObject = (((GraphicalEditPart) selectedObject).resolveSemanticElement());
		}

		return selectedObject;
	}

	public GraphicalEditPart getSelectedGraphicalObject(ExecutionEvent event) {
		
		logger.debug("ExecutionEvent: "+event);
		
	ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage()
			.getSelection();
	
	logger.debug("selection: "+selection);
	return getSelectedGraphicalObject(selection);
	}

	
	private GraphicalEditPart getSelectedGraphicalObject(Object selection) {

		logger.debug("selection: " + selection);

		Object selectedObject = selection;

		EditPart editPart = (GraphicalEditPart) ((IStructuredSelection) selectedObject).getFirstElement();
		

		return (GraphicalEditPart) editPart;
	}


	
	public Class getUmlComponentFromSelectedObject(ExecutionEvent event) throws NoComponentException {

		
		ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();

		logger.debug("current selection: " + selection);

		Object selectedUmlElement = getUmlSelectedObject(selection);
		
		logger.debug("selectedUmlElement: "+selectedUmlElement);
		
		if (selectedUmlElement instanceof Property) {
			if (entityUtil.isComponentInstance((Property) selectedUmlElement)) {
				selectedUmlElement = entityUtil.getUmlType((Property) selectedUmlElement);
			}
		}

		if (selectedUmlElement instanceof Class) {
			if (!contractEntityUtil.isContract((Element) selectedUmlElement)) {
				return (Class) selectedUmlElement;
			}
		}
		
		throw new NoComponentException();

	
	}

	public Resource getSelectedModelResource() {
		UmlModel umlModel = getSelectedUmlModel();
		return getSelectedModelResource(umlModel);
	}

	public UmlModel getSelectedUmlModel() {
		return UmlUtils.getUmlModel();
	}
	
	public Resource getSelectedModelResource(UmlModel umlModel) {		
		if (umlModel != null) {
			return umlModel.getResource();
		}
		return null;
	}
}
