/*******************************************************************************
* Copyright (c) 2012 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.ui.wizard.service;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISources;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jboss.tools.common.ui.CommonUIPlugin;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class RegisterAsServiceHandler extends AbstractHandler {
public RegisterAsServiceHandler() {
}
@Override
public void setEnabled(Object evaluationContext) {
setBaseEnabled(computeEnabled(evaluationContext));
}
@Override
public Object execute(ExecutionEvent event) throws org.eclipse.core.commands.ExecutionException {
ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event).getSelectionService().getSelection();
Shell shell = HandlerUtil.getActiveShell(event);
invokeWizard(selection, shell);
return null;
}
private boolean computeEnabled(Object evaluationContext) {
if(evaluationContext instanceof IEvaluationContext) {
IEvaluationContext c = (IEvaluationContext)evaluationContext;
ISelection selection = (ISelection)c.getVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME);
return getSelectedType(selection) != null;
}
return false;
}
/**
* Returns the first IType from selection which is a concrete class.
* @param selection
* @return
*/
public static IType getSelectedType(ISelection selection) {
if(selection != null && !selection.isEmpty() && (selection instanceof IStructuredSelection)) {
for (Object selected: ((IStructuredSelection)selection).toList()) {
try {
if(selected instanceof ICompilationUnit) {
ICompilationUnit u = (ICompilationUnit)selected;
for(IType type: u.getTypes()) {
if(accept(type)) {
return type;
}
}
} else if(selected instanceof IType) {
IType type = (IType)selected;
if(accept(type)) {
return type;
}
}
} catch (CoreException e) {
CommonUIPlugin.getDefault().logError(e);
}
}
}
return null;
}
private static boolean accept(IType type) throws CoreException {
return !type.isInterface() && !type.isAnnotation() && !Flags.isAbstract(type.getFlags());
}
public static void invokeWizard(ISelection selection, Shell shell) {
IType type = getSelectedType(selection);
if(type == null) {
return;
}
RegisterAsServiceDialog dialog = new RegisterAsServiceDialog(shell, type);
try {
if(dialog.open() == IDialogConstants.OK_ID) {
RegisterServiceUtil.registerService(type, dialog.getResult());
}
} catch (CoreException e) {
CommonUIPlugin.getDefault().logError(e);
}
}
}