/*******************************************************************************
* Copyright (c) 2008 Scott Stanchfield
* 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
*******************************************************************************/
package com.javadude.antxr.eclipse.ui;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
public class PluginUtil {
private ILog log_;
private String pluginName_;
public PluginUtil(String pluginName, ILog log) {
pluginName_ = pluginName;
log_ = log;
}
/**
* Log an error.
* @param message the message
*/
public void error(int code, String message) {
error(code, message, null);
}
/**
* Log a warning.
* @param message the message
*/
public void warning(int code, String message) {
warning(code, message, null);
}
/**
* Log an info message.
* @param message the message
*/
public void info(int code, String message) {
info(code, message, null);
}
/**
* Log an error.
* @param message the message
* @param throwable an optional exception
*/
public void error(int code, final String message, Throwable throwable) {
IStatus status = new Status(IStatus.ERROR, pluginName_, code, message, throwable);
log_.log(status);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openWarning(null, "Error: " + message, message);
}});
}
/**
* Log a warning.
* @param message the message
* @param throwable an optional exception
*/
public void warning(int code, final String message, Throwable throwable) {
IStatus status = new Status(IStatus.WARNING, pluginName_, code, message, throwable);
log_.log(status);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
MessageDialog.openWarning(null, "Warning: " + message, message);
}});
}
/**
* Log an info message.
* @param message the message
* @param throwable an optional exception
*/
public void info(int code, String message, Throwable throwable) {
IStatus status = new Status(IStatus.INFO, pluginName_, code, message, throwable);
log_.log(status);
}
@SuppressWarnings("unchecked")
public void toggleNature(String natureId, ISelection selection) {
if (selection instanceof IStructuredSelection) {
List<String> readOnlyProblemFiles = new ArrayList<String>();
for (Iterator<Object> it = ((IStructuredSelection) selection).iterator(); it.hasNext();) {
Object element = it.next();
IProject project = null;
if (element instanceof IProject) {
project = (IProject) element;
} else if (element instanceof IAdaptable) {
project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
}
if (project != null) {
toggleNature(natureId, project, readOnlyProblemFiles);
}
}
if (!readOnlyProblemFiles.isEmpty()) {
String message = "The following files are read-only or do not exist and their projects cannot be converted:";
for (String readOnlyFile : readOnlyProblemFiles) {
message += '\n' + readOnlyFile;
}
error(1001, message);
}
}
}
private void toggleNature(String natureId, IProject project, List<String> readOnlyProblemFiles) {
try {
// check if the project's .classpath and .project files are writeable
IFile file = project.getFile(".classpath");
if (!file.exists() || file.isReadOnly()) {
readOnlyProblemFiles.add(file.getLocation().toOSString());
}
file = project.getFile(".project");
if (!file.exists() || file.isReadOnly()) {
readOnlyProblemFiles.add(file.getLocation().toOSString());
}
IProjectDescription description = project.getDescription();
String[] natures = description.getNatureIds();
for (int i = 0; i < natures.length; ++i) {
if (natureId.equals(natures[i])) {
// Remove the nature
String[] newNatures = new String[natures.length - 1];
System.arraycopy(natures, 0, newNatures, 0, i);
System.arraycopy(natures, i + 1, newNatures, i,
natures.length - i - 1);
description.setNatureIds(newNatures);
project.setDescription(description, null);
return;
}
}
// Add the nature
String[] newNatures = new String[natures.length + 1];
System.arraycopy(natures, 0, newNatures, 1, natures.length);
newNatures[0] = natureId;
description.setNatureIds(newNatures);
project.setDescription(description, null);
// PlatformUI.getWorkbench().getDecoratorManager().update("com.hcrest.classpath.decorator");
} catch (CoreException e) {
// do nothing
}
}
public boolean hasNature(Object resource, String natureId) {
if (resource instanceof IJavaProject) {
resource = ((IJavaProject) resource).getProject();
}
if (resource instanceof IProject) {
return hasNature((IProject) resource, natureId);
}
return false;
}
public boolean hasNature(IProject aProject, String natureId) {
boolean hasNature;
try {
hasNature = aProject.isOpen() && aProject.hasNature(natureId);
} catch (CoreException e) {
error(1002, "Error checking nature", e);
hasNature = false;
}
return hasNature;
}
}