diff options
author | Sergey Prigogin | 2014-07-30 22:58:06 +0000 |
---|---|---|
committer | Sergey Prigogin | 2014-07-30 23:47:55 +0000 |
commit | 31f37f5b63cc75cbf8d39b14ab05019607c462b6 (patch) | |
tree | 1ad467aa4da30f6ee9c89f3bc55e2515c05f32a9 /build | |
parent | 6a94e17ca785a27daf909dbddc6c401be9c38d50 (diff) | |
download | org.eclipse.cdt-31f37f5b63cc75cbf8d39b14ab05019607c462b6.tar.gz org.eclipse.cdt-31f37f5b63cc75cbf8d39b14ab05019607c462b6.tar.xz org.eclipse.cdt-31f37f5b63cc75cbf8d39b14ab05019607c462b6.zip |
Proper enablement/disablement of Clean/Build Selected Files commands.
Change-Id: I6f56eeb111759ccf7a0bc8fbbfd57ffd8689bf01
Diffstat (limited to 'build')
9 files changed, 519 insertions, 803 deletions
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index cc2297c59a5..73ed1a76769 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -1447,7 +1447,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { OutputStream stdout = buildRunnerHelper.getOutputStream(); OutputStream stderr = buildRunnerHelper.getErrorStream(); - buildRunnerHelper.greeting(ManagedMakeMessages.getResourceString("BuildFilesAction.buildingSelectedFiles"), cfgName, toolchainName, isSupported); //$NON-NLS-1$ + buildRunnerHelper.greeting(ManagedMakeMessages.getResourceString("BuildFilesHandler.buildingSelectedFiles"), cfgName, toolchainName, isSupported); //$NON-NLS-1$ buildRunnerHelper.printLine(ManagedMakeMessages.getResourceString("ManagedMakeBuilder.message.internal.builder.header.note")); //$NON-NLS-1$ // Build artifacts for each file in the project @@ -1574,7 +1574,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { ErrorParserManager epm = new ErrorParserManager(project, des.getDefaultBuildDirLocationURI(), this, errorParsers); buildRunnerHelper.prepareStreams(epm, null , console, new SubProgressMonitor(monitor, TICKS_STREAM_PROGRESS_MONITOR)); - buildRunnerHelper.greeting(ManagedMakeMessages.getResourceString("CleanFilesAction.cleanSelectedFiles"), cfgName, toolchainName, isSupported); //$NON-NLS-1$ + buildRunnerHelper.greeting(ManagedMakeMessages.getResourceString("CleanFilesHandler.cleanSelectedFiles"), cfgName, toolchainName, isSupported); //$NON-NLS-1$ buildRunnerHelper.printLine(ManagedMakeMessages.getResourceString("ManagedMakeBuilder.message.internal.builder.header.note")); //$NON-NLS-1$ for (IFile file : files) { diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties index 7cbc02775af..458e8f3806b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties @@ -49,7 +49,7 @@ ManagedBuildManager.error.owner_not_null=addTarget: owner not null ManagedBuildManager.error.null_owner=addTarget: null owner ManagedBuildManager.error.owner_not_project=addTarget: owner not project ManagedBuildManager.error.manifest_load_failed_title=Managed Build System Version Error -ManagedBuildManager.error.manifest.version.error=The version number defined in the plugin manifest file\n{0}\nis greater than the version of the Managed Build System.\nThe definitions in the manifest file will not be loaded. +ManagedBuildManager.error.manifest.version.error=The version number defined in the plug-in manifest file\n{0}\nis greater than the version of the Managed Build System.\nThe definitions in the manifest file will not be loaded. ManagedBuildManager.error.manifest.header=Managed Build system manifest file error: ManagedBuildManager.error.manifest.resolving=Unable to resolve the {0} identifier {1} in the {2} {3}. ManagedBuildManager.error.manifest.duplicate=Duplicate identifier {1} for element type {0}. @@ -115,7 +115,7 @@ UserDefinedMacroSupplier.storeOutputStream.wrong.arguments=Failed to persist mac # BuildMacroStatus messages BuildMacroStatus.status.macro.undefined=Macro {0} is undefined -BuildFilesAction.buildingSelectedFiles=Building Selected Files +BuildFilesHandler.buildingSelectedFiles=Building Selected Files BuildDescriptionGnuMakefileGenerator.0=IO exception occurred: BuildDescriptionGnuMakefileGenerator.1=IO exception occurred: BuildMacroStatus.status.reference.eachother=Macros {0} and {1} reference each other @@ -133,7 +133,7 @@ ResourceChangeHandler.buildInfoSerializationJob=Build Info Serialization GeneratedMakefileBuilder.buildingProject=Building project {0} GeneratedMakefileBuilder.cleaningProject=Cleaning project {0} GeneratedMakefileBuilder.removingResourceMarkers=Removing problem markers for {0} -GeneratedMakefileBuilder.refreshingArtifacts=Refreshing build artefacts for {0} +GeneratedMakefileBuilder.refreshingArtifacts=Refreshing build artifacts for {0} GeneratedMakefileBuilder.fileDeleted={0} deleted. GeneratedMakefileBuilder.nothingToClean=Nothing to clean. GenerateMakefileWithBuildDescription.0=info is null @@ -144,9 +144,8 @@ ManagedBuilderCorePlugin.resourceChangeHandlingInitializationJob=Initializing Re InternalBuilder.msg.header=Internal Builder: {0} InternalBuilder.nothing.todo=Nothing to be done for project {0} CfgScannerConfigUtil_ErrorNotSupported=Only type {0} is supported in this method. -CleanFilesAction.cleanFiles=Clean File(s) -CleanFilesAction.cleanSelectedFiles=Cleaning Selected Files -CleanFilesAction.cleaningFiles=Cleaning files +CleanFilesHandler.cleanSelectedFiles=Cleaning Selected Files +CleanFilesHandler.cleaningFiles=Cleaning files BuilderFactory.1=can not find builder with the specified id FolderInfo.4=converter invocation failed MbsMacroSupplier.1=tool parent must be one of configuration, toolchain, or resource configuration diff --git a/build/org.eclipse.cdt.managedbuilder.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.managedbuilder.ui/META-INF/MANIFEST.MF index 7f784796624..ff182a48d1d 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.managedbuilder.ui/META-INF/MANIFEST.MF @@ -11,19 +11,18 @@ Export-Package: org.eclipse.cdt.managedbuilder.ui.preferences, org.eclipse.cdt.managedbuilder.ui.wizards, org.eclipse.cdt.managedbuilder.internal.ui.actions;x-internal:=true, org.eclipse.cdt.managedbuilder.internal.ui.workingsets;x-internal:=true -Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)", - org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ui;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ui.console;bundle-version="[3.5.100,4.0.0)", - org.eclipse.cdt.core;bundle-version="[5.0.0,6.0.0)", - org.eclipse.cdt.ui;bundle-version="[5.0.0,6.0.0)", - org.eclipse.cdt.managedbuilder.core;bundle-version="[8.1.0,9.0.0)", +Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.variables;bundle-version="[3.1.100,4.0.0)", - org.eclipse.ui.navigator;bundle-version="[3.2.0,4.0.0)";resolution:=optional, + org.eclipse.cdt.core;bundle-version="[5.0.0,6.0.0)", org.eclipse.cdt.make.core, org.eclipse.cdt.make.ui, - org.eclipse.core.filesystem + org.eclipse.cdt.managedbuilder.core;bundle-version="[8.1.0,9.0.0)", + org.eclipse.cdt.ui;bundle-version="[5.0.0,6.0.0)", + org.eclipse.ui;bundle-version="[3.2.0,4.0.0)", + org.eclipse.ui.console;bundle-version="[3.5.100,4.0.0)", + org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)", + org.eclipse.ui.navigator;bundle-version="[3.2.0,4.0.0)";resolution:=optional Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: com.ibm.icu.text diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties index c6927370e8a..6d22cd22fa1 100755 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.properties @@ -7,21 +7,25 @@ # # Contributors: # IBM Corporation - initial API and implementation +# Sergey Prigogin (Google) ############################################################################### pluginName=C/C++ Managed Builder UI providerName=Eclipse CDT +category.build.name=C/C++ Build +category.build.description= C/C++ Build Actions + # The Wizards MngCWizard.name=Managed Make C Project MngCWizard.description=Create a new C project and let Eclipse create and manage the makefile MngCCWizard.name=Managed Make C++ Project MngCCWizard.description=Create a new C++ project and let Eclipse create and manage the makefile -#The property pages +# The property pages MngBuildProp.name=C/C++ Build MngOtherProp.name= Error/Binary Parsers -#The preference pages +# The preference pages MakeBuildPref.name=Makefile Project MngBuildPref.name=Managed Build NewCDTWizardPref.name=New C/C++ Project Wizard @@ -29,20 +33,21 @@ varsPrefName=Build Variables envPrefName=Environment propSettingsPrefName=Property Pages Settings -#The Resource Property page +# The Resource Property page MngResourceProp.name=C/C++ Build -#The Project Converter page +# The Project Converter page ConvertTargetAction.label=Convert To... # Build/clean selected files actions BuildSelectedFiles.label=Build Selected &File(s) +command.buildFiles.name=Build Selected File(s) +command.buildFiles.description=Rebuilds the selected source files CleanSelectedFiles.label=C&lean Selected File(s) -BuildSelectedFilesActionSet.label=Build/Clean Selected File(s) -BuildSelectedFiles.tooltip=Rebuilds the selected file(s) -CleanSelectedFiles.tooltip=Cleans the output file(s) for the selected file(s) +command.cleanFiles.name=Clean Selected File(s) +command.cleanFiles.description=Deletes build output files for the selected source files -## New CDT project model - property pages names +# New CDT project model - property pages names page.c.build=C/C++ Build CDTPathSymbolsProperty.name=Paths and Symbols CDTExpPathSymbolsProperty.name=Export Settings diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml index ba312a5b556..32606262601 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml @@ -2,8 +2,160 @@ <?eclipse version="3.0"?> <plugin> - <extension-point id="buildDefinitionsUI" name="%buildDefinitionsUI.ep.name" schema="schema/buildDefinitionsUI.exsd"/> - <extension-point id="newWizardPages" name="%extension-point.name" schema="schema/newWizardPages.exsd"/> + <extension-point id="buildDefinitionsUI" name="%buildDefinitionsUI.ep.name" schema="schema/buildDefinitionsUI.exsd"/> + <extension-point id="newWizardPages" name="%extension-point.name" schema="schema/newWizardPages.exsd"/> + + <extension + point="org.eclipse.core.expressions.definitions"> + <definition + id="org.eclipse.cdt.managedbuilder.ui.isBuildableFileOpenInEditor"> + <and> + <with variable="selection"> + <not> + <instanceof value="org.eclipse.jface.viewers.IStructuredSelection"/> + </not> + </with> + <with variable="activeEditorInput"> + <reference definitionId="org.eclipse.cdt.managedbuilder.ui.isBuildableFile"/> + </with> + </and> + </definition> + <definition + id="org.eclipse.cdt.managedbuilder.ui.isBuildableFile"> + <adapt type="org.eclipse.core.resources.IFile"> + <and> + <test property="org.eclipse.core.resources.projectNature" + value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> + <test property="org.eclipse.cdt.ui.projectBuilder" + value="org.eclipse.cdt.managedbuilder.core.genmakebuilder"/> + <test property="org.eclipse.cdt.ui.isSource"/> + </and> + </adapt> + </definition> + </extension> + + <extension + point="org.eclipse.ui.commands"> + <category + name="%category.build.name" + description="%category.build.description" + id="org.eclipse.cdt.managedbuilder.ui.category.build"/> + <command + name="%command.cleanFiles.name" + description="%command.cleanFiles.description" + categoryId="org.eclipse.cdt.managedbuilder.ui.category.build" + id="org.eclipse.cdt.managedbuilder.ui.cleanFiles"/> + <command + name="%command.buildFiles.name" + description="%command.buildFiles.description" + categoryId="org.eclipse.cdt.managedbuilder.ui.category.build" + id="org.eclipse.cdt.managedbuilder.ui.buildFiles"/> + </extension> + + <extension + point="org.eclipse.ui.handlers"> + <handler + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanFilesHandler" + commandId="org.eclipse.cdt.managedbuilder.ui.cleanFiles"/> + <handler + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.BuildFilesHandler" + commandId="org.eclipse.cdt.managedbuilder.ui.buildFiles"/> + </extension> + + <extension + point="org.eclipse.ui.menus"> + <menuContribution + locationURI="popup:org.eclipse.ui.popup.any?before=additions"> + <command + commandId="org.eclipse.cdt.managedbuilder.ui.cleanFiles" + label="%CleanSelectedFiles.label" + style="push"> + <visibleWhen checkEnabled="false"> + <and> + <test property="org.eclipse.cdt.ui.checkPreference" + value="org.eclipse.core.resources/description.autobuilding=false"/> + <or> + <reference + definitionId="org.eclipse.cdt.managedbuilder.ui.isBuildableFileOpenInEditor"/> + <with variable="selection"> + <iterate ifEmpty="false"> + <reference + definitionId="org.eclipse.cdt.managedbuilder.ui.isBuildableFile"/> + </iterate> + </with> + </or> + </and> + </visibleWhen> + </command> + <command + commandId="org.eclipse.cdt.managedbuilder.ui.buildFiles" + label="%BuildSelectedFiles.label" + style="push"> + <visibleWhen checkEnabled="false"> + <and> + <test property="org.eclipse.cdt.ui.checkPreference" + value="org.eclipse.core.resources/description.autobuilding=false"/> + <or> + <reference + definitionId="org.eclipse.cdt.managedbuilder.ui.isBuildableFileOpenInEditor"/> + <with variable="selection"> + <iterate ifEmpty="false"> + <reference + definitionId="org.eclipse.cdt.managedbuilder.ui.isBuildableFile"/> + </iterate> + </with> + </or> + </and> + </visibleWhen> + </command> + </menuContribution> + </extension> + + <extension + point="org.eclipse.ui.popupMenus"> + <objectContribution + objectClass="org.eclipse.core.resources.IProject" + adaptable="true" + id="org.eclipse.cdt.managedbuilder.ui.popupMenu.ConvertTargetContribution"> + <action + label="%ConvertTargetAction.label" + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.ConvertTargetAction" + menubarPath="additions" + enablesFor="1" + id="org.eclipse.cdt.managedbuilder.ui.ConvertTargetAction"/> + <filter + name="projectNature" + value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> + </objectContribution> + <objectContribution + objectClass="org.eclipse.core.resources.IProject" + adaptable="true" + id="org.eclipse.cdt.managedbuilder.ui.popupMenu.BuildAll"> + <action + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanAndBuildAction" + enablesFor="+" + id="org.eclipse.cdt.managedbuilder.ui.rebuildConfigurationsAction" + label="%RebuildConfigurationsMenu.label" + menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> + <action + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanAllConfigurationsAction" + enablesFor="+" + id="org.eclipse.cdt.managedbuilder.ui.cleanAllConfigurationsAction" + label="%CleanAllConfigurationsMenu.label" + menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> + <action + class="org.eclipse.cdt.managedbuilder.internal.ui.actions.BuildAllConfigurationsAction" + enablesFor="+" + id="org.eclipse.cdt.managedbuilder.ui.buildAllConfigurationsAction" + label="%BuildAllConfigurationsMenu.label" + menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> + <visibility> + <objectState + name="projectNature" + value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> + </visibility> + </objectContribution> + </extension> <extension point="org.eclipse.ui.newWizards"> @@ -89,83 +241,6 @@ <!-- Action for Project Converter in context menu --> <extension - point="org.eclipse.ui.popupMenus"> - <objectContribution - objectClass="org.eclipse.core.resources.IProject" - adaptable="true" - id="org.eclipse.cdt.managedbuilder.ui.popupMenu.ConvertTargetContribution"> - <action - label="%ConvertTargetAction.label" - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.ConvertTargetAction" - menubarPath="additions" - enablesFor="1" - id="org.eclipse.cdt.managedbuilder.ui.ConvertTargetAction"> - </action> - <filter - name="projectNature" - value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"> - </filter> - </objectContribution> - <objectContribution - objectClass="org.eclipse.core.resources.IProject" - adaptable="true" - id="org.eclipse.cdt.managedbuilder.ui.popupMenu.BuildAll"> - <action - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanAndBuildAction" - enablesFor="+" - id="org.eclipse.cdt.managedbuilder.ui.rebuildConfigurationsAction" - label="%RebuildConfigurationsMenu.label" - menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> - <action - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanAllConfigurationsAction" - enablesFor="+" - id="org.eclipse.cdt.managedbuilder.ui.cleanAllConfigurationsAction" - label="%CleanAllConfigurationsMenu.label" - menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> - <action - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.BuildAllConfigurationsAction" - enablesFor="+" - id="org.eclipse.cdt.managedbuilder.ui.buildAllConfigurationsAction" - label="%BuildAllConfigurationsMenu.label" - menubarPath="org.eclipse.cdt.ui.cfgmenu/build"/> - <visibility> - <objectState - name="projectNature" - value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> - </visibility> - </objectContribution> - <objectContribution - adaptable="true" - id="org.eclipse.cdt.managedbuilder.ui.BuildSelectedFilesContribution" - objectClass="org.eclipse.core.resources.IResource"> - <action - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.BuildFilesAction" - enablesFor="+" - id="org.eclipse.cdt.managedbuilder.ui.popups.buildFilesAction" - label="%BuildSelectedFiles.label" - menubarPath="additions"/> - <action - class="org.eclipse.cdt.managedbuilder.internal.ui.actions.CleanFilesAction" - enablesFor="+" - id="org.eclipse.cdt.managedbuilder.ui.popups.cleanFilesAction" - label="%CleanSelectedFiles.label" - menubarPath="additions"/> - <visibility> - <and> - <not> - <objectClass name="org.eclipse.core.resources.IProject"/> - </not> - <not> - <objectClass name="org.eclipse.core.resources.IFolder"/> - </not> - <objectState - name="projectNature" - value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> - </and> - </visibility> - </objectContribution> - </extension> - <extension point="org.eclipse.ui.perspectiveExtensions"> <perspectiveExtension targetID="org.eclipse.cdt.ui.CPerspective"> </perspectiveExtension> @@ -553,7 +628,8 @@ <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> </adapt> - <test property="org.eclipse.cdt.ui.checkPreference" value="org.eclipse.cdt.ui:properties.export.page.enable=true"/> + <test property="org.eclipse.cdt.ui.checkPreference" + value="org.eclipse.cdt.ui/properties.export.page.enable=true"/> </and> </enabledWhen> </page> @@ -589,7 +665,8 @@ <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> </adapt> - <test property="org.eclipse.cdt.ui.checkPreference" value="org.eclipse.cdt.ui:properties.toolchain.modification.disable=false"/> + <test property="org.eclipse.cdt.ui.checkPreference" + value="org.eclipse.cdt.ui/properties.toolchain.modification.disable=false"/> </and> </enabledWhen> <keywordReference @@ -610,7 +687,8 @@ <adapt type="org.eclipse.core.resources.IProject"> <and> <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.cdt.managedbuilder.core.managedBuildNature"/> - <test property="org.eclipse.cdt.ui.checkPreference" value="org.eclipse.cdt.ui:properties.sd.page.enable=true"/> + <test property="org.eclipse.cdt.ui.checkPreference" + value="org.eclipse.cdt.ui/properties.sd.page.enable=true"/> </and> </adapt> </enabledWhen> diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesAction.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesAction.java deleted file mode 100644 index 6983bcc43c6..00000000000 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesAction.java +++ /dev/null @@ -1,381 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 Texas Instruments Incorporated 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: - * Texas Instruments - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.managedbuilder.internal.ui.actions; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; -import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; -import org.eclipse.core.resources.ICommand; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Preferences; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.IWorkbenchWindowActionDelegate; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.actions.ActionDelegate; -import org.eclipse.ui.internal.ide.actions.BuildUtilities; - -/** - * Action to build selected files. - */ -public class BuildFilesAction extends ActionDelegate implements - IWorkbenchWindowActionDelegate { - - /** - * The workbench window; or <code>null</code> if this action has been - * <code>dispose</code>d. - */ - private IWorkbenchWindow workbenchWindow = null; - - private IAction action = null; - - /** - * - */ - public BuildFilesAction() { - this(PlatformUI.getWorkbench().getActiveWorkbenchWindow()); - } - - /** - * Creates an instance of this action, for use in the given window. - */ - public BuildFilesAction(IWorkbenchWindow window) { - if (window == null) { - throw new IllegalArgumentException(); - } - this.workbenchWindow = window; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() - */ - @Override - public void dispose() { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see org.eclipse.ui.actions.ActionDelegate#init(org.eclipse.jface.action.IAction) - */ - @Override - public void init(IAction action) { - this.action = action; - update(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void init(IWorkbenchWindow window) { - workbenchWindow = window; - - } - - /** - * Helper method that converts an object to the <code>IFile</code> - * interface. The conversion is a bare cast operation (if the object is - * instance of <code>IFile</code>, or an adaptation (if the object is - * instance of <code>IAdaptable</code>). - * - * @param object - * the object to be cast to <code>IFile</code> - * @return a reference to an IFile corresponding to the object provided, or - * null if it is not possible to convert the provided object to - * <code>IFile</code>. - */ - private IFile convertToIFile(Object object) { - - if (object instanceof IFile) { - return (IFile) object; - } - - if (object instanceof IAdaptable) { - IAdaptable adaptable = (IAdaptable) object; - IFile file = (IFile) adaptable.getAdapter(IFile.class); - - if (file != null) { - return file; - } - } - - // this *should* be redundant now that I've made CElement adaptable to IFile but we'll leave - // it just to be safe - if (object instanceof ITranslationUnit) { - IResource resource = ((ITranslationUnit) object).getResource(); - - // should be safe to cast to IFile (can't really have a non-file - // translation unit), but check anyway - if (resource instanceof IFile) { - return (IFile) resource; - } - - } - - return null; - } - - /** - * Returns a list of resources currently selected. - * "Buildable" means buildable by MBS. - * - * @return a list of resources - */ - private List<IFile> getSelectedBuildableFiles() { - - List<IFile> files = new LinkedList<IFile>(); - - ISelectionService selectionService = workbenchWindow - .getSelectionService(); - ISelection selection = selectionService.getSelection(); - - if (selection instanceof IStructuredSelection) { - IStructuredSelection structuredSelection = (IStructuredSelection) selection; - for (Iterator<?> elements = structuredSelection.iterator(); elements - .hasNext();) { - IFile file = convertToIFile(elements.next()); - if (file != null) { - // we only add files that we can actually build - IManagedBuildInfo buildInfo = ManagedBuildManager - .getBuildInfo(file.getProject()); - - if ((buildInfo != null) && buildInfo.isValid() - && buildInfo - .buildsFileType(file.getFileExtension())) { - files.add(file); - } - } - } - - // since we don't allow building folders, there can be no - // redundancies - // eliminateRedundancies(resources); - } - - return files; - } - - private static final class BuildFilesJob extends Job { - private final List<IFile> files; - - BuildFilesJob(List<IFile> filesToBuild) { - super(ManagedMakeMessages.getResourceString("BuildFilesAction.buildingSelectedFiles")); //$NON-NLS-1$ - files = filesToBuild; - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) - */ - @Override - protected IStatus run(IProgressMonitor monitor) { - GeneratedMakefileBuilder builder = new GeneratedMakefileBuilder(); - return builder.invokeInternalBuilder(files, monitor); - } - - /* (non-Javadoc) - * @see org.eclipse.core.runtime.jobs.Job#belongsTo(java.lang.Object) - */ - @Override - public boolean belongsTo(Object family) { - return ResourcesPlugin.FAMILY_MANUAL_BUILD == family; - } - - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) - */ - @Override - public void run(IAction action) { - List<IFile> selectedFiles = getSelectedBuildableFiles(); - Job buildFilesJob = new BuildFilesJob(selectedFiles); - - List<IProject> projects = getProjectsToBuild(selectedFiles); - if (projects != null && !projects.isEmpty()) { - // Save all resources prior to doing build - BuildUtilities.saveEditors(projects); - } - - buildFilesJob.schedule(); - - } - - private boolean shouldBeEnabled() { - - // fix for bug 139663 - // if build automatically is turned on, then this menu should be turned off as - // it will trigger the auto build - Preferences preferences = ResourcesPlugin.getPlugin().getPluginPreferences(); - - if(preferences.getBoolean(ResourcesPlugin.PREF_AUTO_BUILDING)) - { - // auto building is on... do not enable the menu - return false; - } - - ISelectionService selectionService = workbenchWindow - .getSelectionService(); - ISelection selection = selectionService.getSelection(); - - if (selection instanceof IStructuredSelection) { - IStructuredSelection structuredSelection = (IStructuredSelection) selection; - - if (structuredSelection.size() <= 0) { - return false; - } - - for (Iterator<?> elements = structuredSelection.iterator(); elements - .hasNext();) { - IFile file = convertToIFile(elements.next()); - if (file != null) { - // we only add files that we can actually build - if (!ManagedBuildManager.manages(file.getProject())) { - return false; - } - - IManagedBuildInfo buildInfo = ManagedBuildManager - .getBuildInfo(file.getProject()); - - if (buildInfo == null || !buildInfo.isValid() - || buildInfo.getDefaultConfiguration() == null - || !buildInfo.getDefaultConfiguration().isManagedBuildOn()) { - return false; - } - - IManagedBuilderMakefileGenerator buildfileGenerator = ManagedBuildManager - .getBuildfileGenerator(buildInfo - .getDefaultConfiguration()); - - if (buildfileGenerator == null) { - return false; - } - - // make sure build file generator is initialized - buildfileGenerator.initialize(file.getProject(), buildInfo, - new NullProgressMonitor()); - - // if we have no build info or we can't build the file, then - // disable the action - if (!buildInfo.buildsFileType(file.getFileExtension()) - || buildfileGenerator.isGeneratedResource(file)) { - - return false; - - } - } - - else { - return false; - } - } - return true; - } - - return false; - - } - - /* - * Updates the enablement state for the action based upon the selection. If - * the selection corresponds to files buildable by MBS, then the action will - * be enabled. - */ - private void update() { - if (action != null) { - action.setEnabled(shouldBeEnabled()); - } - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, - * org.eclipse.jface.viewers.ISelection) - */ - @Override - public void selectionChanged(IAction action, ISelection selection) { - // update state - update(); - } - - - /* - * Returns the projects to build. - * This contains the set of projects which have builders, across all selected resources. - */ - private List<IProject> getProjectsToBuild(List<IFile> selectedFiles) { - List<IProject> projectsToBuild = new LinkedList<IProject>(); - for (Iterator<IFile> i = selectedFiles.iterator(); i.hasNext();) { - IFile file = i.next(); - IProject project = file.getProject(); - if (project != null) { - if (!projectsToBuild.contains(project)) { - if (hasBuilder(project)) { - projectsToBuild.add(project); - } - } - } - } - - return projectsToBuild; - } - - /* - * Returns whether there are builders configured on the given project. - * - * @return <code>true</code> if it has builders, - * <code>false</code> if not, or if this couldn't be determined - */ - private boolean hasBuilder(IProject project) { - if (!project.isAccessible()) - return false; - try { - ICommand[] commands = project.getDescription().getBuildSpec(); - if (commands.length > 0) { - return true; - } - } catch (CoreException e) { - // this method is called when selection changes, so - // just fall through if it fails. - // this shouldn't happen anyway, since the list of selected resources - // has already been checked for accessibility before this is called - } - return false; - } - - -} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesHandler.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesHandler.java new file mode 100644 index 00000000000..7e7b87583e4 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/BuildFilesHandler.java @@ -0,0 +1,186 @@ +/******************************************************************************* + * Copyright (c) 2006, 2014 Texas Instruments Incorporated 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: + * Texas Instruments - initial API and implementation + * Sergey Prigogin (Google) + *******************************************************************************/ +package org.eclipse.cdt.managedbuilder.internal.ui.actions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.eclipse.cdt.internal.core.AdapterUtil; +import org.eclipse.cdt.internal.ui.util.AbstractResourceActionHandler; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; +import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.preferences.IPreferencesService; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.internal.ide.actions.BuildUtilities; + +public class BuildFilesHandler extends AbstractResourceActionHandler { + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + List<IFile> selectedFiles = getSelectedFiles(event); + if (selectedFiles.isEmpty()) + return null; + + Job buildFilesJob = new BuildFilesJob(selectedFiles); + + Collection<IProject> projects = getProjectsToBuild(selectedFiles); + BuildUtilities.saveEditors(projects); // Save all resources prior to doing build. + buildFilesJob.schedule(); + return null; + } + + @Override + public void setEnabled(Object evaluationContext) { + super.setEnabled(evaluationContext); + setBaseEnabled(shouldBeEnabled()); + } + + private boolean shouldBeEnabled() { + // Fix for bug 139663. + // If build automatically is turned on, then this command should be turned off as + // it will trigger the auto build. + IPreferencesService preferences = Platform.getPreferencesService(); + + if (preferences.getBoolean(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PREF_AUTO_BUILDING, + false, null)) { + // Auto building is on - do not enable the command. + return false; + } + + IStructuredSelection selection = getSelection(); + if (selection.isEmpty()) + return false; + + for (Iterator<?> elements = selection.iterator(); elements.hasNext();) { + IFile file = AdapterUtil.adapt(elements.next(), IFile.class); + if (file == null) + return false; + + // We only add files that we can actually build. + if (!ManagedBuildManager.manages(file.getProject())) + return false; + + IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(file.getProject()); + + if (buildInfo == null || !buildInfo.isValid() + || buildInfo.getDefaultConfiguration() == null + || !buildInfo.getDefaultConfiguration().isManagedBuildOn()) { + return false; + } + + IManagedBuilderMakefileGenerator buildfileGenerator = + ManagedBuildManager.getBuildfileGenerator(buildInfo.getDefaultConfiguration()); + + if (buildfileGenerator == null) + return false; + + // Make sure build file generator is initialized. + buildfileGenerator.initialize(file.getProject(), buildInfo, new NullProgressMonitor()); + + // If we have no build info or we can't build the file, then disable the command. + if (!buildInfo.buildsFileType(file.getFileExtension()) + || buildfileGenerator.isGeneratedResource(file)) { + return false; + } + } + return true; + } + + private List<IFile> getSelectedFiles(ExecutionEvent event) throws ExecutionException { + Collection<IResource> selectedResources = getSelectedResources(event); + List<IFile> files = new ArrayList<>(selectedResources.size()); + for (IResource resource : selectedResources) { + if (resource instanceof IFile) + files.add((IFile) resource); + } + return files; + } + + /* + * Returns the projects to build. These are the projects which have builders, + * across all selected resources. + */ + private Collection<IProject> getProjectsToBuild(List<IFile> selectedFiles) { + Set<IProject> projectsToBuild = new HashSet<IProject>(); + for (IFile file : selectedFiles) { + IProject project = file.getProject(); + if (!projectsToBuild.contains(project)) { + if (hasBuilder(project)) { + projectsToBuild.add(project); + } + } + } + + return projectsToBuild; + } + + /* + * Checks whether there are builders configured on the given project. + * + * @return {@code true} if it has builders, {@code false} if not, or if this couldn't be + * determined + */ + private boolean hasBuilder(IProject project) { + if (!project.isAccessible()) + return false; + + try { + ICommand[] commands = project.getDescription().getBuildSpec(); + if (commands.length > 0) + return true; + } catch (CoreException e) { + // This method is called when selection changes, so just fall through if it + // fails. This shouldn't happen anyway, since the list of selected resources + // has already been checked for accessibility before this is called. + } + return false; + } + + private static class BuildFilesJob extends Job { + private final List<IFile> files; + + BuildFilesJob(List<IFile> filesToBuild) { + super(ManagedMakeMessages.getResourceString("BuildFilesHandler.buildingSelectedFiles")); //$NON-NLS-1$ + files = filesToBuild; + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + GeneratedMakefileBuilder builder = new GeneratedMakefileBuilder(); + return builder.invokeInternalBuilder(files, monitor); + } + + @Override + public boolean belongsTo(Object family) { + return ResourcesPlugin.FAMILY_MANUAL_BUILD == family; + } + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesAction.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesAction.java deleted file mode 100644 index 91d33ec1d8b..00000000000 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesAction.java +++ /dev/null @@ -1,315 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 Texas Instruments Incorporated 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: - * Texas Instruments - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.managedbuilder.internal.ui.actions; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; -import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; -import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder; -import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Preferences; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.ISelectionService; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.IWorkbenchWindowActionDelegate; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.actions.ActionDelegate; - -/** - * Action to clean build output for selected files - */ -public class CleanFilesAction extends ActionDelegate implements - IWorkbenchWindowActionDelegate { - /** - * The workbench window; or <code>null</code> if this action has been - * <code>dispose</code>d. - */ - private IWorkbenchWindow workbenchWindow = null; - - private IAction action = null; - - /** - * - */ - public CleanFilesAction() { - this(PlatformUI.getWorkbench().getActiveWorkbenchWindow()); - } - - /** - * Creates an instance of this action, for use in the given window. - */ - public CleanFilesAction(IWorkbenchWindow window) { - if (window == null) { - throw new IllegalArgumentException(); - } - this.workbenchWindow = window; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() - */ - @Override - public void dispose() { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see org.eclipse.ui.actions.ActionDelegate#init(org.eclipse.jface.action.IAction) - */ - @Override - public void init(IAction action) { - this.action = action; - update(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow) - */ - @Override - public void init(IWorkbenchWindow window) { - workbenchWindow = window; - - } - - /** - * Helper method that converts an object to the <code>IFile</code> - * interface. The conversion is a bare cast operation (if the object is - * instance of <code>IFile</code>, or an adaptation (if the object is - * instance of <code>IAdaptable</code>). - * - * @param object - * the object to be cast to <code>IFile</code> - * @return a reference to an IFile corresponding to the object provided, or - * null if it is not possible to convert the provided object to - * <code>IFile</code>. - */ - private IFile convertToIFile(Object object) { - - if (object instanceof IFile) { - return (IFile) object; - } - - if (object instanceof IAdaptable) { - IAdaptable adaptable = (IAdaptable) object; - IFile file = (IFile) adaptable.getAdapter(IFile.class); - - if (file != null) { - return file; - } - } - - // this *should* be redundant now that I've made CElement adaptable to IFile but we'll leave - // it just to be safe - if (object instanceof ITranslationUnit) { - IResource resource = ((ITranslationUnit) object).getResource(); - - // should be safe to cast to IFile (can't really have a non-file - // translation unit), but check anyway - if (resource instanceof IFile) { - return (IFile) resource; - } - - } - - return null; - } - - /** - * Returns a list of buildable resources currently selected. - * "Buildable" means buildable by MBS. - * - * @return a list of resources - */ - private List<IFile> getSelectedBuildableFiles() { - - List<IFile> files = new LinkedList<IFile>(); - - ISelectionService selectionService = workbenchWindow - .getSelectionService(); - ISelection selection = selectionService.getSelection(); - - if (selection instanceof IStructuredSelection) { - IStructuredSelection structuredSelection = (IStructuredSelection) selection; - for (Iterator<?> elements = structuredSelection.iterator(); elements - .hasNext();) { - IFile file = convertToIFile(elements.next()); - if (file != null) { - // we only add files that we can actually build - IManagedBuildInfo buildInfo = ManagedBuildManager - .getBuildInfo(file.getProject()); - - if (buildInfo.buildsFileType(file.getFileExtension())) { - files.add(file); - } - } - } - - // since we don't allow building folders, there can be no - // redundancies - // eliminateRedundancies(resources); - } - - return files; - } - - private static final class CleanFilesJob extends Job { - private final List<IFile> files; - - private CleanFilesJob(List<IFile> filesToBuild) { - super(ManagedMakeMessages.getResourceString("CleanFilesAction.cleaningFiles")); //$NON-NLS-1$ - files = filesToBuild; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor) - */ - @Override - protected IStatus run(IProgressMonitor monitor) { - synchronized (getClass()) { - if (monitor.isCanceled()) { - return Status.CANCEL_STATUS; - } - Job[] buildJobs = Job.getJobManager().find( - ResourcesPlugin.FAMILY_MANUAL_BUILD); - for (int i = 0; i < buildJobs.length; i++) { - Job curr = buildJobs[i]; - if ((curr != this) && (curr instanceof CleanFilesJob)) { - curr.cancel(); // cancel all other build jobs of our - // kind - - } - } - } - - GeneratedMakefileBuilder builder = new GeneratedMakefileBuilder(); - return builder.cleanFiles(files, monitor); - } - - @Override - public boolean belongsTo(Object family) { - return ResourcesPlugin.FAMILY_MANUAL_BUILD == family; - } - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) - */ - @Override - public void run(IAction action) { - List<IFile> selectedFiles = getSelectedBuildableFiles(); - CleanFilesJob job = new CleanFilesJob(selectedFiles); - job.schedule(); - } - - private boolean shouldBeEnabled() { - - - // fix for Bugzilla 139663 - // if build automatically is turned on, then this menu should be turned off as - // it will trigger the auto build - Preferences preferences = ResourcesPlugin.getPlugin().getPluginPreferences(); - - if(preferences.getBoolean(ResourcesPlugin.PREF_AUTO_BUILDING)) - { - // auto building is on... do not enable the menu - return false; - } - - ISelectionService selectionService = workbenchWindow - .getSelectionService(); - ISelection selection = selectionService.getSelection(); - - if (selection instanceof IStructuredSelection) { - IStructuredSelection structuredSelection = (IStructuredSelection) selection; - - if (structuredSelection.size() <= 0) { - return false; - } - - for (Iterator<?> elements = structuredSelection.iterator(); elements - .hasNext();) { - IFile file = convertToIFile(elements.next()); - if (file != null) { - // we only add files that we can actually build - if (!ManagedBuildManager.manages(file.getProject())) { - return false; - } - - IManagedBuildInfo buildInfo = ManagedBuildManager - .getBuildInfo(file.getProject()); - - // if we have no build info or we can't build the file, then - // disable the action - if ((buildInfo == null) || !buildInfo.isValid() - || !buildInfo.buildsFileType(file - .getFileExtension())) { - return false; - } - } - - else { - return false; - } - - } - - return true; - } - - return false; - } - - /* - * Updates the enablement state for the action based upon the selection. If - * the selection corresponds to files buildable by MBS, then the action will - * be enabled. - */ - private void update() { - if (action != null) { - action.setEnabled(shouldBeEnabled()); - } - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, - * org.eclipse.jface.viewers.ISelection) - */ - @Override - public void selectionChanged(IAction action, ISelection selection) { - update(); - } - -} diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesHandler.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesHandler.java new file mode 100644 index 00000000000..5e12e8bf17c --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/actions/CleanFilesHandler.java @@ -0,0 +1,145 @@ +/******************************************************************************* + * Copyright (c) 2006, 2014 Texas Instruments Incorporated 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: + * Texas Instruments - initial API and implementation + * Sergey Prigogin (Google) + *******************************************************************************/ +package org.eclipse.cdt.managedbuilder.internal.ui.actions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.internal.core.AdapterUtil; +import org.eclipse.cdt.internal.ui.util.AbstractResourceActionHandler; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.GeneratedMakefileBuilder; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.preferences.IPreferencesService; +import org.eclipse.jface.viewers.IStructuredSelection; + +/** + * Action to clean build output for selected files + */ +public class CleanFilesHandler extends AbstractResourceActionHandler { + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + List<IFile> selectedFiles = getSelectedBuildableFiles(event); + if (selectedFiles.isEmpty()) + return null; + + CleanFilesJob job = new CleanFilesJob(selectedFiles); + job.schedule(); + return null; + } + + /** + * Returns a list of buildable resources currently selected. + * "Buildable" means buildable by MBS. + */ + private List<IFile> getSelectedBuildableFiles(ExecutionEvent event) throws ExecutionException { + Collection<IResource> selectedResources = getSelectedResources(event); + List<IFile> files = new ArrayList<>(selectedResources.size()); + for (IResource resource : selectedResources) { + // We only add files that we can actually build. + if (resource instanceof IFile && isBuildable(resource)) { + files.add((IFile) resource); + } + } + return files; + } + + @Override + public void setEnabled(Object evaluationContext) { + super.setEnabled(evaluationContext); + setBaseEnabled(shouldBeEnabled()); + } + + private boolean shouldBeEnabled() { + // Fix for bug 139663. + // If build automatically is turned on, then this command should be turned off as + // it will trigger the auto build. + IPreferencesService preferences = Platform.getPreferencesService(); + + if (preferences.getBoolean(ResourcesPlugin.PI_RESOURCES, ResourcesPlugin.PREF_AUTO_BUILDING, + false, null)) { + // Auto building is on - do not enable the command. + return false; + } + + IStructuredSelection selection = getSelection(); + if (selection.isEmpty()) + return false; + + for (Iterator<?> elements = selection.iterator(); elements.hasNext();) { + IFile file = AdapterUtil.adapt(elements.next(), IFile.class); + if (file == null) + return false; + + // We only add files that we can actually build. + if (!isBuildable(file)) + return false; + } + + return true; + } + + private static boolean isBuildable(IResource resource) { + IProject project = resource.getProject(); + if (!ManagedBuildManager.manages(project)) + return false; + IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(project); + return buildInfo != null && buildInfo.isValid() + && buildInfo.buildsFileType(resource.getFileExtension()); + } + + private static class CleanFilesJob extends Job { + private final List<IFile> files; + + private CleanFilesJob(List<IFile> filesToBuild) { + super(ManagedMakeMessages.getResourceString("CleanFilesHandler.cleaningFiles")); //$NON-NLS-1$ + files = filesToBuild; + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + synchronized (getClass()) { + if (monitor.isCanceled()) { + return Status.CANCEL_STATUS; + } + Job[] buildJobs = Job.getJobManager().find(ResourcesPlugin.FAMILY_MANUAL_BUILD); + for (Job job : buildJobs) { + if ((job != this) && (job instanceof CleanFilesJob)) { + job.cancel(); // Cancel all other build jobs of our kind. + } + } + } + + GeneratedMakefileBuilder builder = new GeneratedMakefileBuilder(); + return builder.cleanFiles(files, monitor); + } + + @Override + public boolean belongsTo(Object family) { + return ResourcesPlugin.FAMILY_MANUAL_BUILD == family; + } + } +} |