package net.bitpot.railways.models.routes;
import com.intellij.openapi.module.Module;
import net.bitpot.railways.gui.RailwaysIcons;
import net.bitpot.railways.models.RailsActionInfo;
import net.bitpot.railways.models.Route;
import net.bitpot.railways.models.requestMethods.RequestMethod;
import net.bitpot.railways.utils.RailwaysPsiUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.ruby.rails.model.RailsApp;
import org.jetbrains.plugins.ruby.ruby.lang.psi.controlStructures.classes.RClass;
import javax.swing.*;
/**
* @author Basil Gren
* on 14.12.2014.
*/
public class SimpleRoute extends Route {
private String controllerName;
private String actionName;
@NotNull
private RailsActionInfo actionInfo = new RailsActionInfo();
public SimpleRoute(Module myModule, RequestMethod requestMethod,
String routePath, String routeName,
String controllerName, String actionName) {
super(myModule, requestMethod, routePath, routeName);
this.controllerName = controllerName;
this.actionName = actionName;
}
@Override
public String getActionTitle() {
if (!controllerName.isEmpty())
return String.format("%s#%s", controllerName, actionName);
return actionName;
}
@Override
public String getQualifiedActionTitle() {
// Return unqualified action title in case controller is specified as
// parameter (ex. :controller#:action)
if (controllerName.contains(":"))
return getActionTitle();
String ctrlClassName;
RClass ctrlClass = getActionInfo().getPsiClass();
if (ctrlClass != null)
ctrlClassName = ctrlClass.getQualifiedName();
else
ctrlClassName = RailwaysPsiUtils.getControllerClassNameByShortName(controllerName);
return String.format("%s#%s", ctrlClassName, actionName);
}
@Override
public Icon getActionIcon() {
RailsActionInfo action = getActionInfo();
if (action.getPsiMethod() != null)
return action.getIcon();
else if (action.getPsiClass() != null)
return RailwaysIcons.NODE_CONTROLLER;
return RailwaysIcons.NODE_UNKNOWN;
}
@NotNull
public RailsActionInfo getActionInfo() {
return actionInfo;
}
@Override
public void navigate(boolean requestFocus) {
getActionInfo().update(getModule(), controllerName, actionName);
if (getActionInfo().getPsiMethod() != null)
getActionInfo().getPsiMethod().navigate(requestFocus);
else if (getActionInfo().getPsiClass() != null)
getActionInfo().getPsiClass().navigate(requestFocus);
}
@Override
public boolean canNavigate() {
return getActionInfo().getPsiMethod() != null ||
getActionInfo().getPsiClass() != null;
}
/**
* Checks route action status and sets isActionDeclarationFound flag.
*
* @param app Rails application which will be checked for controller action.
*/
@Override
public void updateActionStatus(RailsApp app) {
getActionInfo().update(app, controllerName, actionName);
}
}