/******************************************************************************* * Copyright (c) 2000, 2015 IBM Corporation 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: * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River) - [296800] UI build actions should not lock the workspace * Broadcom Corporation - [335960] Update BuildAction to use new Workspace Build Configurations API * Andrey Loskutov <loskutov@gmx.de> - generified interface, bug 462760 *******************************************************************************/ package melnorme.lang.ide.ui.utils; import java.util.Collection; import java.util.HashSet; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.mapping.ResourceMapping; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.BuildAction; import org.eclipse.ui.ide.ResourceUtil; import melnorme.utilbox.collections.Indexable; // Copied from org.eclipse.ui.internal.ide.actions /** * This class contains convenience methods used by the various build commands * to determine enablement. These utilities cannot be factored into a common * class because some build actions are API and some are not. * * @since 3.1 */ @SuppressWarnings("unused") public class BuildUtilities { // /** // * Extracts the selected projects from a selection. // * // * @param selection The selection to analyze // * @return The selected projects // */ // public static IProject[] extractProjects(Object[] selection) { // HashSet projects = new HashSet(); // for (int i = 0; i < selection.length; i++) { // Object element = selection[i]; // IResource resource = ResourceUtil.getResource(element); // if (resource != null) { // projects.add(resource.getProject()); // } else { // ResourceMapping mapping = ResourceUtil.getResourceMapping(element); // if (mapping != null) { // IProject[] theProjects = mapping.getProjects(); // for (int j = 0; j < theProjects.length; j++) { // projects.add(theProjects[j]); // } // } else { // Object marker = ResourceUtil.getAdapter(element, IMarker.class, false); // if (marker instanceof IMarker) { // IProject project = ((IMarker) marker).getResource().getProject(); // if (project != null) { // projects.add(project); // } // } // } // } // } // return (IProject[]) projects.toArray(new IProject[projects.size()]); // } // // /** // * Finds and returns the selected projects in the given window // * // * @param window The window to find the selection in // * @return The selected projects, or an empty array if no selection could be found. // */ // public static IProject[] findSelectedProjects(IWorkbenchWindow window) { // if (window == null) { // return new IProject[0]; // } // // IWorkbenchPage activePage= window.getActivePage(); // if (activePage == null) { // return new IProject[0]; // } // // IWorkbenchPart activePart= activePage.getActivePart(); // if (activePart == null) { // return new IProject[0]; // } // // ISelection selection= window.getSelectionService().getSelection(activePart.getSite().getId()); // IProject[] selected = null; // if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { // selected = extractProjects(((IStructuredSelection) selection).toArray()); // } else { // //see if we can extract a selected project from the active editor // if (activePart instanceof IEditorPart) { // IEditorPart editor= (IEditorPart)activePart; // IFile file = ResourceUtil.getFile(editor.getEditorInput()); // if (file != null) { // selected = new IProject[] {file.getProject()}; // } // } // } // if (selected == null) { // selected = new IProject[0]; // } // return selected; // } // // /** // * Returns whether a build command with the given trigger should // * be enabled for the given selection. // * @param projects The projects to use to determine enablement // * @param trigger The build trigger (<code>IncrementalProjectBuilder.*_BUILD</code> constants). // * @return <code>true</code> if the action should be enabled, and // * <code>false</code> otherwise. // */ // public static boolean isEnabled(IProject[] projects, int trigger) { // //incremental build is only enabled if all projects are not autobuilding // if (trigger == IncrementalProjectBuilder.INCREMENTAL_BUILD && ResourcesPlugin.getWorkspace().isAutoBuilding()) { // if (!matchingTrigger(projects, IncrementalProjectBuilder.AUTO_BUILD, false)) { // return false; // } // } // //finally we are building only if there is a builder that accepts the trigger // return matchingTrigger(projects, trigger, true); // } // // /** // * Returns whether one of the projects has a builder whose trigger setting // * for the given trigger matches the given value. // * // * @param projects The projects to check // * @param trigger The trigger to look for // * @param value The trigger value to look for // * @return <code>true</code> if one of the projects has a builder whose // * trigger activation matches the provided value, and <code>false</code> otherwise. // */ // private static boolean matchingTrigger(IProject[] projects, int trigger, boolean value) { // for (int i = 0; i < projects.length; i++) { // if (!projects[i].isAccessible()) { // continue; // } // try { // IProjectDescription description = projects[i].getDescription(); // ICommand[] buildSpec = description.getBuildSpec(); // for (int j = 0; j < buildSpec.length; j++) { // if (buildSpec[j].isBuilding(trigger) == value) { // return true; // } // } // } catch (CoreException e) { // //ignore projects that are not available // } // } // return false; // } /** * Causes all editors to save any modified resources in the provided collection * of projects depending on the user's preference. * @param projects The projects in which to save editors, or <code>null</code> * to save editors in all projects. */ public static void saveEditors(Indexable<IProject> projects) { if (!BuildAction.isSaveAllSet()) { return; } IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); for (int i = 0; i < windows.length; i++) { IWorkbenchPage[] pages = windows[i].getPages(); for (int j = 0; j < pages.length; j++) { IWorkbenchPage page = pages[j]; if (projects == null) { page.saveAllEditors(false); } else { IEditorPart[] editors = page.getDirtyEditors(); for (int k = 0; k < editors.length; k++) { IEditorPart editor = editors[k]; IFile inputFile = ResourceUtil.getFile(editor.getEditorInput()); if (inputFile != null) { if (projects.contains(inputFile.getProject())) { page.saveEditor(editor, false); } } } } } } } /** * Doesn't need to be instantiated */ private BuildUtilities() { } }