package com.baselet.plugin.refactoring;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.eclipse.ltk.core.refactoring.resource.RenameResourceChange;
import com.baselet.plugin.UmletPluginUtils;
/**
* Participant updating img tags in JavaDocs when diagram resources are renamed
*/
public class RenameFileParticipant extends RenameParticipant {
UmletRefactoringProcessorManager mgr = new UmletRefactoringProcessorManager();
private IFile origFile;
@Override
protected boolean initialize(Object element) {
if (!(element instanceof IFile)) {
return false;
}
origFile = (IFile) element;
if (!origFile.exists()) {
return false;
}
IJavaProject javaProject = UmletPluginUtils.getJavaProject(origFile.getProject());
if (javaProject == null) {
return false;
}
if ("uxf".equals(origFile.getFileExtension())) {
mgr.add(new UpdateImgReferencesProcessor(javaProject) {
@Override
protected IFile calculateImgDestination(IFile img, ICompilationUnit referencingCompilationUnit) {
IFile uxfFile = UmletPluginUtils.getUxfDiagramForImgFile(img);
if (origFile.equals(uxfFile)) {
return origFile.getParent().getFile(new Path(getArguments().getNewName()).removeFileExtension().addFileExtension(img.getFileExtension()));
}
return null;
}
});
mgr.add(new RenamePngProcessor(origFile) {
@Override
protected String getTargetname(IFile pngFile, IFile affectedDiagram) {
return new Path(getArguments().getNewName()).removeFileExtension().addFileExtension(pngFile.getFileExtension()).lastSegment();
}
});
return true;
}
if ("png".equals(origFile.getFileExtension())) {
IFile correspondingUxf = UmletPluginUtils.getUxfDiagramForImgFile(origFile);
if (!correspondingUxf.exists()) {
// only refactor if uxf file exists
return false;
}
// update references to the renamed png
mgr.add(new UpdateImgReferencesProcessor(javaProject) {
@Override
protected IFile calculateImgDestination(IFile img, ICompilationUnit referencingCompilationUnit) {
if (origFile.equals(img)) {
return origFile.getParent().getFile(new Path(getArguments().getNewName()));
}
return null;
}
});
// update the corresponding .uxf file
mgr.add(new RenameResourceChange(correspondingUxf.getFullPath(),
new Path(getArguments().getNewName()).removeFileExtension().addFileExtension(correspondingUxf.getFileExtension()).lastSegment()));
return true;
}
return false;
}
@Override
public String getName() {
return "Umlet rename resouce participant";
}
@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 {
return mgr.createChange(pm);
}
}