package org.radrails.rails.internal.ui.actions.mvc;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.action.IAction;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.radrails.rails.core.RailsConventions;
import org.radrails.rails.ui.RailsUILog;
import org.rubypeople.rdt.ui.RubyUI;
public class TestEditorActionDelegate extends MVCEditorActionDelegate
{
/*
* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action)
{
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
IFile original = ((FileEditorInput) part.getEditorInput()).getFile();
IProject project = original.getProject();
String filename = original.getProjectRelativePath().toString();
if (attemptToOpenMvcRelatedFile(project, filename, "app/controllers", "", "test/functional", "_test"))
return;
if (attemptToOpenMvcRelatedFile(project, filename, "app/models", "", "test/unit", "_test"))
return;
if (attemptToOpenMvcRelatedFile(project, filename, "app/helpers", "_helper", "test/functional",
"_controller_test"))
return;
if (attemptToOpenMvcRelatedFile(project, filename, "test/functional", "_test", "app/controllers", ""))
return;
if (attemptToOpenMvcRelatedFile(project, filename, "test/unit", "_test", "app/models", ""))
return;
openFile(RailsConventions.getFunctionalTestFromView(original));
}
private boolean attemptToOpenMvcRelatedFile(IProject project, String filename, String srcDir, String srcSuffix,
String destDir, String destSuffix)
{
Matcher m = Pattern.compile("^((?:.+?/)?)" + srcDir + "/(.+)" + srcSuffix + "\\.rb$").matcher(filename);
if (!m.matches())
return false;
IPath thePath = project.getProjectRelativePath().append(
project.getName() + (m.group(1).length() == 0 ? "" : "/") + m.group(1) + "/" + destDir + "/"
+ m.group(2) + destSuffix + ".rb");
IFile fileHandle = ResourcesPlugin.getWorkspace().getRoot().getFile(thePath);
return openFile(fileHandle);
}
private boolean openFile(IFile fileHandle)
{
IEditorInput editorInput = new FileEditorInput(fileHandle);
try
{
if (fileHandle.exists())
{
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(editorInput,
RubyUI.ID_RUBY_EDITOR);
return true;
}
}
catch (PartInitException e)
{
RailsUILog.logError("Error creating editor", e);
}
return false;
}
@Override
protected boolean isEnabled()
{
IFile currentFile = getCurrentFile();
return RailsConventions.looksLikeController(currentFile) || RailsConventions.looksLikeHelper(currentFile)
|| RailsConventions.looksLikeModel(currentFile) || RailsConventions.looksLikeView(currentFile);
}
}