org.yah.tools.warningcleaner.plugin.ui.WarningCleanerPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for org.yah.tools.warningcleaner.plugin.ui.WarningCleanerPropertyPage.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Marc Flament.
 * 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:
 *     Marc Flament - initial API and implementation
 ******************************************************************************/
package org.yah.tools.warningcleaner.plugin.ui;

import java.util.HashSet;
import java.util.Iterator;
import java.util.ResourceBundle;
import java.util.Set;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.dialogs.PropertyPage;
import org.yah.tools.warningcleaner.plugin.WarningCleanerNature;
import org.yah.tools.warningcleaner.plugin.WarningCleanerPlugin;

public class WarningCleanerPropertyPage extends PropertyPage {

    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
            .getBundle(WarningCleanerPropertyPage.class.getName());

    private CheckboxTableViewer viewer;

    /**
     * Constructor for SamplePropertyPage.
     */
    public WarningCleanerPropertyPage() {
        super();
    }

    private IJavaProject getJavaProject() {
        return (IJavaProject) getElement();
    }

    private IProject getProject() {
        return getJavaProject().getProject();
    }

    /**
     * @see PreferencePage#createContents(Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);

        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        composite.setLayout(layout);

        GridData data = new GridData(GridData.FILL, GridData.FILL, false, false);
        composite.setLayoutData(data);

        addLabel(composite);

        addSourceFolderSelection(composite);

        return composite;
    }

    private void addLabel(Composite parent) {
        // Label for path field
        Label pathLabel = new Label(parent, SWT.NONE);
        pathLabel.setText(RESOURCE_BUNDLE.getString("selectedsourcefolders.label"));
    }

    private void addSourceFolderSelection(Composite parent) {
        WarningCleanerPlugin plugin = WarningCleanerPlugin.getInstance();

        Table table = new Table(parent, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK);

        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
        gridData.heightHint = 100;
        table.setLayoutData(gridData);

        IJavaProject javaProject = getJavaProject();
        Image icon = plugin.getImageRegistry().get(WarningCleanerPlugin.SOURCE_FOLDER_IMAGE);
        IClasspathEntry[] rawClasspath;
        try {
            rawClasspath = javaProject.getRawClasspath();
        } catch (JavaModelException e) {
            plugin.error("Error loading raw classpath for project " + getProject().getName(), e);
            rawClasspath = new IClasspathEntry[0];
        }

        Set<IPath> sourceFolders = new HashSet<IPath>();
        for (int i = 0; i < rawClasspath.length; i++) {
            if (rawClasspath[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                IPath rawPath = rawClasspath[i].getPath();
                IFolder sourceFolder = getProject().getWorkspace().getRoot().getFolder(rawPath);
                sourceFolders.add(sourceFolder.getProjectRelativePath());

                TableItem item = new TableItem(table, SWT.NONE);
                item.setData(sourceFolder);
                item.setText(0, getSourceFolderPath(sourceFolder));
                item.setImage(0, icon);
            }
        }

        viewer = new CheckboxTableViewer(table);
        IFolder[] selectedFolders;
        try {
            selectedFolders = loadSelectedFolders(sourceFolders);
        } catch (CoreException e) {
            plugin.error("Error loading selected source folders of project " + getProject().getName(), e);
            selectedFolders = null;
        }

        if (selectedFolders != null && selectedFolders.length > 0)
            viewer.setCheckedElements(selectedFolders);
    }

    private String getSourceFolderPath(IFolder sourceFolder) {
        return sourceFolder.getProjectRelativePath().toString();
    }

    private IFolder[] loadSelectedFolders(Set<IPath> sourceFolders) throws CoreException {
        WarningCleanerNature nature = getNature();
        if (nature == null)
            return null;
        Set<IFolder> selectedFolders = new HashSet<IFolder>(nature.getSelectedSourceFolders());
        boolean update = false;
        Iterator<IFolder> iter = selectedFolders.iterator();
        while (iter.hasNext()) {
            IFolder folder = iter.next();
            if (!sourceFolders.contains(folder.getProjectRelativePath())) {
                iter.remove();
                update = true;
            }
        }

        IFolder[] res = selectedFolders.toArray(new IFolder[selectedFolders.size()]);
        if (update)
            saveSelectedFolders(res);

        return res;
    }

    private boolean saveSelectedFolders(IFolder[] folders) throws CoreException {
        WarningCleanerNature nature = getNature();
        if (nature != null)
            return nature.saveSelectedFolders(folders);
        return false;
    }

    private WarningCleanerNature getNature() throws CoreException {
        return (WarningCleanerNature) getProject().getNature(WarningCleanerNature.ID);
    }

    @Override
    protected void performDefaults() {
        viewer.setAllChecked(false);
        saveSelectedFolders();
        super.performDefaults();
    }

    @Override
    public boolean performOk() {
        saveSelectedFolders();
        return super.performOk();
    }

    private void saveSelectedFolders() {
        IFolder[] selectedFolders = getSelectedFolders();
        try {
            if (saveSelectedFolders(selectedFolders))
                rebuildProject();
        } catch (CoreException e) {
            WarningCleanerPlugin.getInstance().error("Error saving selected folders", e);
        }
    }

    private IFolder[] getSelectedFolders() {
        Object[] checkedElements = viewer.getCheckedElements();
        IFolder[] res = new IFolder[checkedElements.length];
        for (int i = 0; i < checkedElements.length; i++)
            res[i] = (IFolder) checkedElements[i];
        return res;
    }

    private void rebuildProject() {
        Job job = new Job("Cleaning " + getProject().getName()) {
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                try {
                    getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
                } catch (CoreException e) {
                    return new Status(IStatus.ERROR, WarningCleanerPlugin.ID, "Error rebuilding project");
                }
                return new Status(IStatus.OK, WarningCleanerPlugin.ID, "Ok");
            }
        };
        job.schedule();
    }
}