/*******************************************************************************
* Copyright (c) 2014, 2015 Google, Inc 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:
* Sergey Prigogin (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.util;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.resources.mapping.ResourceTraversal;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.AdapterUtil;
/**
* Base class for command handlers operating on resources.
*/
public abstract class AbstractResourceActionHandler extends AbstractHandler {
private IEvaluationContext evaluationContext;
private IStructuredSelection selection;
public void setSelection(ISelection selection) {
this.selection = convertSelection(null, selection);
}
@Override
public void setEnabled(Object evaluationContext) {
this.evaluationContext = (IEvaluationContext) evaluationContext;
selection = convertSelection(this.evaluationContext, null);
}
protected IStructuredSelection getSelection() {
if (selection == null) {
selection = convertSelection(evaluationContext, null);
}
return selection;
}
protected static IStructuredSelection getSelection(ExecutionEvent event) throws ExecutionException {
Object selection = HandlerUtil.getActiveMenuSelection(event);
if (selection == null) {
selection = HandlerUtil.getCurrentSelectionChecked(event);
}
if (selection instanceof ITextSelection) {
IEditorInput editorInput = HandlerUtil.getActiveEditorInputChecked(event);
IResource resource = ResourceUtil.getResource(editorInput);
if (resource != null) {
return new StructuredSelection(resource);
}
resource = ResourceUtil.getFile(editorInput);
if (resource != null) {
return new StructuredSelection(resource);
}
}
if (selection instanceof IStructuredSelection) {
return (IStructuredSelection) selection;
}
return StructuredSelection.EMPTY;
}
private static IStructuredSelection convertSelection(IEvaluationContext context,
Object selection) {
if (selection == null) {
if (context == null) {
return StructuredSelection.EMPTY;
}
selection = context.getVariable(ISources.ACTIVE_MENU_SELECTION_NAME);
if (!(selection instanceof ISelection)) {
selection = context.getVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME);
}
}
if (selection instanceof ITextSelection) {
if (context == null) {
context = getEvaluationContext();
}
IResource resource =
ResourceUtil.getResource(context.getVariable(ISources.ACTIVE_EDITOR_INPUT_NAME));
if (resource != null) {
return new StructuredSelection(resource);
}
}
if (selection instanceof IStructuredSelection) {
return (IStructuredSelection) selection;
}
return StructuredSelection.EMPTY;
}
private static IEvaluationContext getEvaluationContext() {
IWorkbenchWindow activeWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWindow == null) {
return null;
}
IHandlerService service = activeWindow.getService(IHandlerService.class);
return service.getCurrentState();
}
/**
* Returns the selected resources.
*/
protected Collection<IResource> getSelectedResources() {
return getSelectedResources(getSelection());
}
/**
* Returns the selected resources.
*/
protected static Collection<IResource> getSelectedResources(ExecutionEvent event) throws ExecutionException {
IStructuredSelection selection = getSelection(event);
return getSelectedResources(selection);
}
private static Collection<IResource> getSelectedResources(IStructuredSelection selection) {
Set<IResource> result = new LinkedHashSet<IResource>();
for (Object obj : selection.toList()) {
IResource resource = AdapterUtil.adapt(obj, IResource.class);
if (resource != null) {
result.add(resource);
} else {
result.addAll(extractResourcesFromMapping(obj));
}
}
return result;
}
/**
* Extracts resources associated with a {@link ResourceMapping}.
*
* @param obj an object adaptable to {@link ResourceMapping}
* @return a list of resources associated with the mapping
*/
private static List<IResource> extractResourcesFromMapping(Object obj) {
ResourceMapping mapping = AdapterUtil.adapt(obj, ResourceMapping.class);
if (mapping != null) {
try {
ResourceTraversal[] traversals = mapping.getTraversals(null, null);
for (ResourceTraversal traversal : traversals) {
return Arrays.asList(traversal.getResources());
}
} catch (CoreException e) {
CUIPlugin.log(e);
}
}
return Collections.emptyList();
}
}