blob: 1de903e23883ac85ebcd31aef2861f40e4fe571f [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.eclipse.org/org/documents/epl-v10.php
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ide.eclipse.adt.internal.lint;
import static com.android.SdkConstants.DOT_XML;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.tools.lint.detector.api.LintUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.ITextEditor;
import java.util.ArrayList;
import java.util.List;
/**
* Action which runs Lint on the currently projects (and also provides a
* pulldown menu in the toolbar for selecting specifically which projects to
* check)
*/
public class RunLintAction implements IObjectActionDelegate, IMenuCreator,
IWorkbenchWindowPulldownDelegate {
private ISelection mSelection;
private Menu mMenu;
@Override
public void selectionChanged(IAction action, ISelection selection) {
mSelection = selection;
}
@Override
public void run(IAction action) {
List<IProject> projects = getProjects(mSelection, true /* warn */);
if (!projects.isEmpty()) {
EclipseLintRunner.startLint(projects, null, null, false /*fatalOnly*/, true /*show*/);
}
}
/** Returns the Android project(s) to apply a lint run to. */
static List<IProject> getProjects(ISelection selection, boolean warn) {
List<IProject> projects = AdtUtils.getSelectedProjects(selection);
if (projects.isEmpty() && warn) {
MessageDialog.openWarning(AdtPlugin.getShell(), "Lint",
"Could not run Lint: Select an Android project first.");
}
return projects;
}
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
}
@Override
public void dispose() {
if (mMenu != null) {
mMenu.dispose();
}
}
@Override
public void init(IWorkbenchWindow window) {
}
// ---- IMenuCreator ----
@Override
public Menu getMenu(Control parent) {
mMenu = new Menu(parent);
IconFactory iconFactory = IconFactory.getInstance();
ImageDescriptor allIcon = iconFactory.getImageDescriptor("lintrun"); //$NON-NLS-1$
LintMenuAction allAction = new LintMenuAction("Check All Projects", allIcon,
ACTION_RUN, null);
addAction(allAction);
addSeparator();
IJavaProject[] projects = AdtUtils.getOpenAndroidProjects();
ILabelProvider provider = new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT);
for (IJavaProject project : projects) {
IProject p = project.getProject();
ImageDescriptor icon = ImageDescriptor.createFromImage(provider.getImage(p));
String label = String.format("Check %1$s", p.getName());
LintMenuAction projectAction = new LintMenuAction(label, icon, ACTION_RUN, p);
addAction(projectAction);
}
ITextEditor textEditor = AdtUtils.getActiveTextEditor();
if (textEditor != null) {
IFile file = AdtUtils.getActiveFile();
// Currently only supported for XML files
if (file != null && LintUtils.endsWith(file.getName(), DOT_XML)) {
ImageDescriptor icon = ImageDescriptor.createFromImage(provider.getImage(file));
IAction fileAction = new LintMenuAction("Check Current File", icon, ACTION_RUN,
file);
addSeparator();
addAction(fileAction);
}
}
ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
ImageDescriptor clear = images.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL);
LintMenuAction clearAction = new LintMenuAction("Clear Lint Warnings", clear, ACTION_CLEAR,
null);
addSeparator();
addAction(clearAction);
LintMenuAction excludeAction = new LintMenuAction("Skip Library Project Dependencies",
allIcon, ACTION_TOGGLE_EXCLUDE, null);
addSeparator();
addAction(excludeAction);
excludeAction.setChecked(AdtPrefs.getPrefs().getSkipLibrariesFromLint());
return mMenu;
}
private void addAction(IAction action) {
ActionContributionItem item = new ActionContributionItem(action);
item.fill(mMenu, -1);
}
private void addSeparator() {
new Separator().fill(mMenu, -1);
}
@Override
public Menu getMenu(Menu parent) {
return null;
}
private static final int ACTION_RUN = 1;
private static final int ACTION_CLEAR = 2;
private static final int ACTION_TOGGLE_EXCLUDE = 3;
/**
* Actions in the pulldown context menu: run lint or clear lint markers on
* the given resource
*/
private static class LintMenuAction extends Action {
private final IResource mResource;
private final int mAction;
/**
* Creates a new context menu action
*
* @param text the label
* @param descriptor the icon
* @param action the action to run: run lint, clear, or toggle exclude libraries
* @param resource the resource to check or clear markers for, where
* null means all projects
*/
private LintMenuAction(String text, ImageDescriptor descriptor, int action,
IResource resource) {
super(text, action == ACTION_TOGGLE_EXCLUDE ? AS_CHECK_BOX : AS_PUSH_BUTTON);
if (descriptor != null) {
setImageDescriptor(descriptor);
}
mAction = action;
mResource = resource;
}
@Override
public void run() {
if (mAction == ACTION_TOGGLE_EXCLUDE) {
AdtPrefs prefs = AdtPrefs.getPrefs();
prefs.setSkipLibrariesFromLint(!prefs.getSkipLibrariesFromLint());
return;
}
List<IResource> resources = new ArrayList<IResource>();
if (mResource == null) {
// All projects
IJavaProject[] open = AdtUtils.getOpenAndroidProjects();
for (IJavaProject project : open) {
resources.add(project.getProject());
}
} else {
resources.add(mResource);
}
EclipseLintRunner.cancelCurrentJobs(false);
if (mAction == ACTION_CLEAR) {
EclipseLintClient.clearMarkers(resources);
} else {
assert mAction == ACTION_RUN;
EclipseLintRunner.startLint(resources, null, null, false /*fatalOnly*/,
true /*show*/);
}
}
}
}