Java tutorial
/******************************************************************************* * 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(); } }