/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.roo.ui.internal.actions;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.springframework.ide.eclipse.core.SpringCoreUtils;
import org.springframework.ide.eclipse.roo.core.RooCoreActivator;
import org.springframework.ide.eclipse.roo.core.model.IRooInstall;
import org.springframework.ide.eclipse.roo.ui.RooUiActivator;
import org.springframework.ide.eclipse.roo.ui.internal.RooShellView;
/**
* An action to open a Roo Shell tab for a group of projects
* @author Christian Dupuis
* @since 2.1.0
*/
public class OpenRooShellForProjectsAction extends Action {
private final RooShellView view;
public OpenRooShellForProjectsAction(RooShellView view) {
super("Open Roo Shell", RooUiActivator.getImageDescriptor("icons/full/obj16/new_console_obj.gif"));
this.view = view;
}
@Override
public void run() {
RooProjectSelectionDialog dialog = new RooProjectSelectionDialog(view.getSite().getShell());
if (dialog.open() == Dialog.OK) {
for (IProject project : dialog.getSelectedProjects()) {
view.openShell(project);
}
}
}
private class RooProjectSelectionDialog extends CheckedTreeSelectionDialog {
public RooProjectSelectionDialog(Shell parent) {
super(parent, new DecoratingLabelProvider(new RooProjectLabelProvider(), PlatformUI.getWorkbench()
.getDecoratorManager().getLabelDecorator()), new RooProjectTreeContentProvider());
setTitle("Roo Shell Project Selection");
setMessage("Open Roo Shells for the following projects:");
setInput(ResourcesPlugin.getWorkspace().getRoot());
}
public IProject[] getSelectedProjects() {
Object[] result = getResult();
ArrayList<IProject> projects = new ArrayList<IProject>();
for (Object project : result) {
projects.add((IProject) project);
}
return projects.toArray(new IProject[0]);
}
}
private class RooProjectTreeContentProvider implements ITreeContentProvider {
public void dispose() {
}
public Object[] getChildren(Object parentElement) {
return new Object[0];
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IWorkspaceRoot) {
Set<IProject> projects = new HashSet<IProject>();
for (IProject project : ((IWorkspaceRoot) inputElement).getProjects()) {
if (!view.getOpenProjects().contains(project) && project.isAccessible() && project.isOpen()
&& SpringCoreUtils.hasNature(project, RooCoreActivator.NATURE_ID)) {
projects.add(project);
}
}
return projects.toArray(new IProject[projects.size()]);
}
return new Object[0];
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private class RooProjectLabelProvider extends WorkbenchLabelProvider {
@Override
protected String decorateText(String input, Object element) {
if (element instanceof IProject) {
IRooInstall install = RooCoreActivator.getDefault().getInstallManager()
.getRooInstall((IProject) element);
if (install != null) {
return input + " [" + install.getName() + "]";
}
}
return super.decorateText(input, element);
}
}
}