package org.rascalmpl.eclipse.refactoring;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.NullChange;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.text.edits.DeleteEdit;
import org.eclipse.text.edits.InsertEdit;
import org.eclipse.text.edits.MultiTextEdit;
import org.rascalmpl.eclipse.Activator;
import org.rascalmpl.eclipse.IRascalResources;
import org.rascalmpl.eclipse.util.ResourcesToModules;
public class MoveParticipant extends
org.eclipse.ltk.core.refactoring.participants.MoveParticipant {
private IFile file;
public MoveParticipant() {
}
@Override
protected boolean initialize(Object element) {
if (element instanceof IFile) {
file = (IFile) element;
return true;
}
return false;
}
@Override
public String getName() {
return "Rascal move refactoring";
}
@Override
public RefactoringStatus checkConditions(IProgressMonitor pm,
CheckConditionsContext context) throws OperationCanceledException {
return RefactoringStatus.create(Status.OK_STATUS);
}
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
try {
String moduleName = ResourcesToModules.moduleFromFile(file);
Object destination = getArguments().getDestination();
if (destination instanceof IFolder) {
IFolder folder = (IFolder) destination;
String lastName = moduleName;
int last;
if ((last = moduleName.lastIndexOf("::")) != -1) {
lastName = moduleName.substring(last + 2);
}
IFile newFile = folder.getFile(lastName + "." + IRascalResources.RASCAL_EXT);
String newModuleName = ResourcesToModules.moduleFromFile(newFile);
TextFileChange change = new TextFileChange("Move Rascal Module", file);
// somehow essential to make sure edit is done in the renamed resource instead of the old resource
change.setSaveMode(TextFileChange.LEAVE_DIRTY);
String content = change.getCurrentContent(pm);
int index = content.indexOf(moduleName);
if (index != -1) {
MultiTextEdit m = new MultiTextEdit();
m.addChild(new DeleteEdit(index, moduleName.length()));
m.addChild(new InsertEdit(index, newModuleName));
change.setEdit(m);
}
return change;
}
}
catch (CoreException e) {
Activator.getInstance().logException("error during renaming", e);
}
return new NullChange();
}
}