package com.technophobia.eclipse.project.nature;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.ui.IPackagesViewPart;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import com.technophobia.substeps.FeatureEditorPlugin;
public class ProjectNatureUpdater {
private final String natureId;
public ProjectNatureUpdater(final String natureId) {
this.natureId = natureId;
}
public void ensureProjectHasNature(final IProject project) {
final IProjectDescription description = getDescription(project);
if (description != null) {
final String[] originalNatureIds = description.getNatureIds();
if (!isNaturePresent(natureId, originalNatureIds)) {
description.setNatureIds(addNatureIdTo(natureId, originalNatureIds));
updateDescription(project, description);
}
updatePackageExplorer();
FeatureEditorPlugin.instance().getProjectObserver().projectChanged(project);
} else {
FeatureEditorPlugin.instance().error(
"Could not add nature " + natureId + " to current selection, as it is not a valid project");
}
}
public void ensureProjectDoesNotHaveNature(final IProject project) {
final IProjectDescription description = getDescription(project);
if (description != null) {
final String[] originalNatureIds = description.getNatureIds();
if (isNaturePresent(natureId, originalNatureIds)) {
description.setNatureIds(removeNatureIdFrom(natureId, originalNatureIds));
updateDescription(project, description);
}
updatePackageExplorer();
FeatureEditorPlugin.instance().getProjectObserver().projectChanged(project);
} else {
FeatureEditorPlugin.instance().error(
"Could not remove nature " + natureId + " from current selection, as it is not a valid project");
}
}
private IProjectDescription getDescription(final IProject project) {
try {
return project.getDescription();
} catch (final CoreException ex) {
FeatureEditorPlugin.instance().error("Could not get description for project " + project.getName(), ex);
return null;
}
}
private void updatePackageExplorer() {
final IViewPart foundView = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.findView(JavaUI.ID_PACKAGES);
if (foundView instanceof IPackagesViewPart) {
final IPackagesViewPart packageExplorerView = (IPackagesViewPart) foundView;
final TreeViewer treeViewer = packageExplorerView.getTreeViewer();
treeViewer.refresh();
}
}
private void updateDescription(final IProject project, final IProjectDescription description) {
try {
final NullProgressMonitor monitor = new NullProgressMonitor();
project.setDescription(description, monitor);
} catch (final CoreException ex) {
FeatureEditorPlugin.instance().error("Could not update project " + project.getName(), ex);
}
}
private boolean isNaturePresent(final String natureId, final String[] natureIds) {
for (final String nId : natureIds) {
if (nId.equals(natureId)) {
return true;
}
}
return false;
}
private String[] addNatureIdTo(final String natureId, final String[] oldNatureIds) {
final String[] newNatureIds = new String[oldNatureIds.length + 1];
System.arraycopy(oldNatureIds, 0, newNatureIds, 1, oldNatureIds.length);
newNatureIds[0] = natureId;
return newNatureIds;
}
private String[] removeNatureIdFrom(final String natureId, final String[] oldNatureIds) {
final String[] newNatureIds = new String[oldNatureIds.length - 1];
int i = 0;
for (final String oldNatureId : oldNatureIds) {
if (!oldNatureId.equals(natureId)) {
newNatureIds[i++] = oldNatureId;
}
}
return newNatureIds;
}
}