diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java | 657 |
1 files changed, 0 insertions, 657 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java deleted file mode 100644 index 90b956e32..000000000 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintViewPart.java +++ /dev/null @@ -1,657 +0,0 @@ -/* - * 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_JAVA; -import static com.android.SdkConstants.DOT_XML; - -import com.android.ide.eclipse.adt.AdtPlugin; -import com.android.ide.eclipse.adt.internal.editors.IconFactory; -import com.android.ide.eclipse.adt.internal.preferences.LintPreferencePage; -import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper; -import com.android.tools.lint.detector.api.LintUtils; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.preference.IPreferenceNode; -import org.eclipse.jface.preference.PreferenceDialog; -import org.eclipse.jface.preference.PreferenceManager; -import org.eclipse.jface.preference.PreferenceNode; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.Region; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.SashForm; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IMemento; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.editors.text.TextFileDocumentProvider; -import org.eclipse.ui.part.ViewPart; -import org.eclipse.ui.texteditor.IDocumentProvider; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Eclipse View which shows lint warnings for the current project - */ -public class LintViewPart extends ViewPart implements SelectionListener, IJobChangeListener { - /** The view id for this view part */ - public static final String ID = "com.android.ide.eclipse.adt.internal.lint.LintViewPart"; //$NON-NLS-1$ - private static final String QUICKFIX_DISABLED_ICON = "quickfix-disabled"; //$NON-NLS-1$ - private static final String QUICKFIX_ICON = "quickfix"; //$NON-NLS-1$ - private static final String REFRESH_ICON = "refresh"; //$NON-NLS-1$ - private static final String EXPAND_DISABLED_ICON = "expandall-disabled"; //$NON-NLS-1$ - private static final String EXPAND_ICON = "expandall"; //$NON-NLS-1$ - private static final String COLUMNS_ICON = "columns"; //$NON-NLS-1$ - private static final String OPTIONS_ICON = "options"; //$NON-NLS-1$ - private static final String IGNORE_THIS_ICON = "ignore-this"; //$NON-NLS-1$ - private static final String IGNORE_THIS_DISABLED_ICON = "ignore-this-disabled"; //$NON-NLS-1$ - private static final String IGNORE_FILE_ICON = "ignore-file"; //$NON-NLS-1$ - private static final String IGNORE_FILE_DISABLED_ICON = "ignore-file-disabled"; //$NON-NLS-1$ - private static final String IGNORE_PRJ_ICON = "ignore-project"; //$NON-NLS-1$ - private static final String IGNORE_PRJ_DISABLED_ICON = "ignore-project-disabled"; //$NON-NLS-1$ - private static final String IGNORE_ALL_ICON = "ignore-all"; //$NON-NLS-1$ - private static final String IGNORE_ALL_DISABLED_ICON = "ignore-all-disabled"; //$NON-NLS-1$ - private IMemento mMemento; - private LintList mLintView; - private Text mDetailsText; - private Label mErrorLabel; - private SashForm mSashForm; - private Action mFixAction; - private Action mRemoveAction; - private Action mIgnoreAction; - private Action mAlwaysIgnoreAction; - private Action mIgnoreFileAction; - private Action mIgnoreProjectAction; - private Action mRemoveAllAction; - private Action mRefreshAction; - private Action mExpandAll; - private Action mCollapseAll; - private Action mConfigureColumns; - private Action mOptions; - - /** - * Initial projects to show: this field is only briefly not null during the - * construction initiated by {@link #show(List)} - */ - private static List<? extends IResource> sInitialResources; - - /** - * Constructs a new {@link LintViewPart} - */ - public LintViewPart() { - } - - @Override - public void init(IViewSite site, IMemento memento) throws PartInitException { - super.init(site, memento); - mMemento = memento; - } - - @Override - public void saveState(IMemento memento) { - super.saveState(memento); - - mLintView.saveState(memento); - } - - @Override - public void dispose() { - if (mLintView != null) { - mLintView.dispose(); - mLintView = null; - } - super.dispose(); - } - - @Override - public void createPartControl(Composite parent) { - GridLayout gridLayout = new GridLayout(1, false); - gridLayout.verticalSpacing = 0; - gridLayout.marginWidth = 0; - gridLayout.marginHeight = 0; - parent.setLayout(gridLayout); - - mErrorLabel = new Label(parent, SWT.NONE); - mErrorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); - - mSashForm = new SashForm(parent, SWT.NONE); - mSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); - mLintView = new LintList(getSite(), mSashForm, mMemento, false /*singleFile*/); - - mDetailsText = new Text(mSashForm, - SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); - Display display = parent.getDisplay(); - mDetailsText.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND)); - mDetailsText.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND)); - - mLintView.addSelectionListener(this); - mSashForm.setWeights(new int[] {8, 2}); - - createActions(); - initializeToolBar(); - - // If there are currently running jobs, listen for them such that we can update the - // button state - refreshStopIcon(); - - if (sInitialResources != null) { - mLintView.setResources(sInitialResources); - sInitialResources = null; - } else { - // No supplied context: show lint warnings for all projects - IJavaProject[] androidProjects = BaseProjectHelper.getAndroidProjects(null); - if (androidProjects.length > 0) { - List<IResource> projects = new ArrayList<IResource>(); - for (IJavaProject project : androidProjects) { - projects.add(project.getProject()); - } - mLintView.setResources(projects); - } - } - - updateIssueCount(); - } - - /** - * Create the actions. - */ - private void createActions() { - ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); - IconFactory iconFactory = IconFactory.getInstance(); - mFixAction = new LintViewAction("Fix", ACTION_FIX, - iconFactory.getImageDescriptor(QUICKFIX_ICON), - iconFactory.getImageDescriptor(QUICKFIX_DISABLED_ICON)); - - mIgnoreAction = new LintViewAction("Suppress this error with an annotation/attribute", - ACTION_IGNORE_THIS, - iconFactory.getImageDescriptor(IGNORE_THIS_ICON), - iconFactory.getImageDescriptor(IGNORE_THIS_DISABLED_ICON)); - mIgnoreFileAction = new LintViewAction("Ignore in this file", ACTION_IGNORE_FILE, - iconFactory.getImageDescriptor(IGNORE_FILE_ICON), - iconFactory.getImageDescriptor(IGNORE_FILE_DISABLED_ICON)); - mIgnoreProjectAction = new LintViewAction("Ignore in this project", ACTION_IGNORE_TYPE, - iconFactory.getImageDescriptor(IGNORE_PRJ_ICON), - iconFactory.getImageDescriptor(IGNORE_PRJ_DISABLED_ICON)); - mAlwaysIgnoreAction = new LintViewAction("Always Ignore", ACTION_IGNORE_ALL, - iconFactory.getImageDescriptor(IGNORE_ALL_ICON), - iconFactory.getImageDescriptor(IGNORE_ALL_DISABLED_ICON)); - - mRemoveAction = new LintViewAction("Remove", ACTION_REMOVE, - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVE), - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVE_DISABLED)); - mRemoveAllAction = new LintViewAction("Remove All", ACTION_REMOVE_ALL, - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL), - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_REMOVEALL_DISABLED)); - mRefreshAction = new LintViewAction("Refresh (& Save Files)", ACTION_REFRESH, - iconFactory.getImageDescriptor(REFRESH_ICON), null); - mRemoveAllAction.setEnabled(true); - mCollapseAll = new LintViewAction("Collapse All", ACTION_COLLAPSE, - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL), - sharedImages.getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL_DISABLED)); - mCollapseAll.setEnabled(true); - mExpandAll = new LintViewAction("Expand All", ACTION_EXPAND, - iconFactory.getImageDescriptor(EXPAND_ICON), - iconFactory.getImageDescriptor(EXPAND_DISABLED_ICON)); - mExpandAll.setEnabled(true); - - mConfigureColumns = new LintViewAction("Configure Columns...", ACTION_COLUMNS, - iconFactory.getImageDescriptor(COLUMNS_ICON), - null); - - mOptions = new LintViewAction("Options...", ACTION_OPTIONS, - iconFactory.getImageDescriptor(OPTIONS_ICON), - null); - - enableActions(Collections.<IMarker>emptyList(), false /*updateWidgets*/); - } - - /** - * Initialize the toolbar. - */ - private void initializeToolBar() { - IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager(); - toolbarManager.add(mRefreshAction); - toolbarManager.add(mFixAction); - toolbarManager.add(mIgnoreAction); - toolbarManager.add(mIgnoreFileAction); - toolbarManager.add(mIgnoreProjectAction); - toolbarManager.add(mAlwaysIgnoreAction); - toolbarManager.add(new Separator()); - toolbarManager.add(mRemoveAction); - toolbarManager.add(mRemoveAllAction); - toolbarManager.add(new Separator()); - toolbarManager.add(mExpandAll); - toolbarManager.add(mCollapseAll); - toolbarManager.add(mConfigureColumns); - toolbarManager.add(mOptions); - } - - @Override - public void setFocus() { - mLintView.setFocus(); - } - - /** - * Sets the resource associated with the lint view - * - * @param resources the associated resources - */ - public void setResources(List<? extends IResource> resources) { - mLintView.setResources(resources); - - // Refresh the stop/refresh icon status - refreshStopIcon(); - } - - private void refreshStopIcon() { - Job[] currentJobs = LintJob.getCurrentJobs(); - if (currentJobs.length > 0) { - ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); - mRefreshAction.setImageDescriptor(sharedImages.getImageDescriptor( - ISharedImages.IMG_ELCL_STOP)); - for (Job job : currentJobs) { - job.addJobChangeListener(this); - } - } else { - mRefreshAction.setImageDescriptor( - IconFactory.getInstance().getImageDescriptor(REFRESH_ICON)); - - } - } - - // ---- Implements SelectionListener ---- - - @Override - public void widgetSelected(SelectionEvent e) { - List<IMarker> markers = mLintView.getSelectedMarkers(); - if (markers.size() != 1) { - mDetailsText.setText(""); //$NON-NLS-1$ - } else { - mDetailsText.setText(EclipseLintClient.describe(markers.get(0))); - } - - IStatusLineManager status = getViewSite().getActionBars().getStatusLineManager(); - status.setMessage(mDetailsText.getText()); - - updateIssueCount(); - - enableActions(markers, true /* updateWidgets */); - } - - private void enableActions(List<IMarker> markers, boolean updateWidgets) { - // Update enabled state of actions - boolean hasSelection = markers.size() > 0; - boolean canFix = hasSelection; - for (IMarker marker : markers) { - if (!LintFix.hasFix(EclipseLintClient.getId(marker))) { - canFix = false; - break; - } - - // Some fixes cannot be run in bulk - if (markers.size() > 1) { - List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker), marker); - if (fixes == null || !fixes.get(0).isBulkCapable()) { - canFix = false; - break; - } - } - } - - boolean haveFile = false; - boolean isJavaOrXml = true; - for (IMarker marker : markers) { - IResource resource = marker.getResource(); - if (resource instanceof IFile || resource instanceof IFolder) { - haveFile = true; - String name = resource.getName(); - if (!LintUtils.endsWith(name, DOT_XML) && !LintUtils.endsWith(name, DOT_JAVA)) { - isJavaOrXml = false; - } - break; - } - } - - mFixAction.setEnabled(canFix); - mIgnoreAction.setEnabled(hasSelection && haveFile && isJavaOrXml); - mIgnoreFileAction.setEnabled(hasSelection && haveFile); - mIgnoreProjectAction.setEnabled(hasSelection); - mAlwaysIgnoreAction.setEnabled(hasSelection); - mRemoveAction.setEnabled(hasSelection); - - if (updateWidgets) { - getViewSite().getActionBars().getToolBarManager().update(false); - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) { - Object source = e.getSource(); - if (source == mLintView.getTreeViewer().getControl()) { - // Jump to editor - List<IMarker> selection = mLintView.getSelectedMarkers(); - if (selection.size() > 0) { - EclipseLintClient.showMarker(selection.get(0)); - } - } - } - - // --- Implements IJobChangeListener ---- - - @Override - public void done(IJobChangeEvent event) { - mRefreshAction.setImageDescriptor( - IconFactory.getInstance().getImageDescriptor(REFRESH_ICON)); - - if (!mLintView.isDisposed()) { - mLintView.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - if (!mLintView.isDisposed()) { - updateIssueCount(); - } - } - }); - } - } - - private void updateIssueCount() { - int errors = mLintView.getErrorCount(); - int warnings = mLintView.getWarningCount(); - mErrorLabel.setText(String.format("%1$d errors, %2$d warnings", errors, warnings)); - } - - @Override - public void aboutToRun(IJobChangeEvent event) { - } - - @Override - public void awake(IJobChangeEvent event) { - } - - @Override - public void running(IJobChangeEvent event) { - } - - @Override - public void scheduled(IJobChangeEvent event) { - } - - @Override - public void sleeping(IJobChangeEvent event) { - } - - // ---- Actions ---- - - private static final int ACTION_REFRESH = 1; - private static final int ACTION_FIX = 2; - private static final int ACTION_IGNORE_THIS = 3; - private static final int ACTION_IGNORE_FILE = 4; - private static final int ACTION_IGNORE_TYPE = 5; - private static final int ACTION_IGNORE_ALL = 6; - private static final int ACTION_REMOVE = 7; - private static final int ACTION_REMOVE_ALL = 8; - private static final int ACTION_COLLAPSE = 9; - private static final int ACTION_EXPAND = 10; - private static final int ACTION_COLUMNS = 11; - private static final int ACTION_OPTIONS = 12; - - private class LintViewAction extends Action { - - private final int mAction; - - private LintViewAction(String label, int action, - ImageDescriptor imageDesc, ImageDescriptor disabledImageDesc) { - super(label); - mAction = action; - setImageDescriptor(imageDesc); - if (disabledImageDesc != null) { - setDisabledImageDescriptor(disabledImageDesc); - } - } - - @Override - public void run() { - switch (mAction) { - case ACTION_REFRESH: { - IWorkbench workbench = PlatformUI.getWorkbench(); - if (workbench != null) { - workbench.saveAllEditors(false /*confirm*/); - } - - Job[] jobs = LintJob.getCurrentJobs(); - if (jobs.length > 0) { - EclipseLintRunner.cancelCurrentJobs(false); - } else { - List<? extends IResource> resources = mLintView.getResources(); - if (resources == null) { - return; - } - Job job = EclipseLintRunner.startLint(resources, null, null, - false /*fatalOnly*/, false /*show*/); - if (job != null && workbench != null) { - job.addJobChangeListener(LintViewPart.this); - ISharedImages sharedImages = workbench.getSharedImages(); - setImageDescriptor(sharedImages.getImageDescriptor( - ISharedImages.IMG_ELCL_STOP)); - } - } - break; - } - case ACTION_FIX: { - List<IMarker> markers = mLintView.getSelectedMarkers(); - for (IMarker marker : markers) { - List<LintFix> fixes = LintFix.getFixes(EclipseLintClient.getId(marker), - marker); - if (fixes == null) { - continue; - } - LintFix fix = fixes.get(0); - IResource resource = marker.getResource(); - if (fix.needsFocus() && resource instanceof IFile) { - IRegion region = null; - try { - int start = marker.getAttribute(IMarker.CHAR_START, -1); - int end = marker.getAttribute(IMarker.CHAR_END, -1); - if (start != -1) { - region = new Region(start, end - start); - } - AdtPlugin.openFile((IFile) resource, region); - } catch (PartInitException e) { - AdtPlugin.log(e, "Can't open file %1$s", resource); - } - } - IDocumentProvider provider = new TextFileDocumentProvider(); - try { - provider.connect(resource); - IDocument document = provider.getDocument(resource); - if (document != null) { - fix.apply(document); - if (!fix.needsFocus()) { - provider.saveDocument(new NullProgressMonitor(), resource, - document, true /*overwrite*/); - } - } - } catch (Exception e) { - AdtPlugin.log(e, "Did not find associated editor to apply fix: %1$s", - resource.getName()); - } finally { - provider.disconnect(resource); - } - } - break; - } - case ACTION_REMOVE: { - for (IMarker marker : mLintView.getSelectedMarkers()) { - try { - marker.delete(); - } catch (CoreException e) { - AdtPlugin.log(e, null); - } - } - break; - } - case ACTION_REMOVE_ALL: { - List<? extends IResource> resources = mLintView.getResources(); - if (resources != null) { - for (IResource resource : resources) { - EclipseLintClient.clearMarkers(resource); - } - } - break; - } - case ACTION_IGNORE_ALL: - assert false; - break; - case ACTION_IGNORE_TYPE: - case ACTION_IGNORE_FILE: { - boolean ignoreInFile = mAction == ACTION_IGNORE_FILE; - for (IMarker marker : mLintView.getSelectedMarkers()) { - String id = EclipseLintClient.getId(marker); - if (id != null) { - IResource resource = marker.getResource(); - LintFixGenerator.suppressDetector(id, true, - ignoreInFile ? resource : resource.getProject(), - ignoreInFile); - } - } - break; - } - case ACTION_IGNORE_THIS: { - for (IMarker marker : mLintView.getSelectedMarkers()) { - LintFixGenerator.addSuppressAnnotation(marker); - } - break; - } - case ACTION_COLLAPSE: { - mLintView.collapseAll(); - break; - } - case ACTION_EXPAND: { - mLintView.expandAll(); - break; - } - case ACTION_COLUMNS: { - mLintView.configureColumns(); - break; - } - case ACTION_OPTIONS: { - PreferenceManager manager = new PreferenceManager(); - - LintPreferencePage page = new LintPreferencePage(); - String title = "Default/Global Settings"; - page.setTitle(title); - IPreferenceNode node = new PreferenceNode(title, page); - manager.addToRoot(node); - - - List<? extends IResource> resources = mLintView.getResources(); - if (resources != null) { - Set<IProject> projects = new HashSet<IProject>(); - for (IResource resource : resources) { - projects.add(resource.getProject()); - } - if (projects.size() > 0) { - for (IProject project : projects) { - page = new LintPreferencePage(); - page.setTitle(String.format("Settings for %1$s", - project.getName())); - page.setElement(project); - node = new PreferenceNode(project.getName(), page); - manager.addToRoot(node); - } - } - } - - Shell shell = LintViewPart.this.getSite().getShell(); - PreferenceDialog dialog = new PreferenceDialog(shell, manager); - dialog.create(); - dialog.setSelectedNode(title); - dialog.open(); - break; - } - default: - assert false : mAction; - } - updateIssueCount(); - } - } - - /** - * Shows or reconfigures the LintView to show the lint warnings for the - * given project - * - * @param projects the projects to show lint warnings for - */ - public static void show(List<? extends IResource> projects) { - IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - if (window != null) { - IWorkbenchPage page = window.getActivePage(); - if (page != null) { - try { - // Pass initial project context via static field read by constructor - sInitialResources = projects; - IViewPart view = page.showView(LintViewPart.ID, null, - IWorkbenchPage.VIEW_ACTIVATE); - if (sInitialResources != null && view instanceof LintViewPart) { - // The view must be showing already since the constructor was not - // run, so reconfigure the view instead - LintViewPart lintView = (LintViewPart) view; - lintView.setResources(projects); - } - } catch (PartInitException e) { - AdtPlugin.log(e, "Cannot open Lint View"); - } finally { - sInitialResources = null; - } - } - } - } -} |