package org.radrails.rails.internal.ui.console.commands; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.radrails.rails.internal.core.RailsPlugin; import org.radrails.rails.internal.ui.console.IRailsShellConstants; import org.radrails.rails.ui.console.RailsShellCommandProvider; import org.rubypeople.rdt.launching.ITerminal; public class SwitchProjectCommandProvider extends RailsShellCommandProvider { @Override public Set<String> commandsHandled() { Set<String> commands = new HashSet<String>(); commands.add(IRailsShellConstants.CD); commands.add(IRailsShellConstants.SWITCH); return commands; } @Override public List<ICompletionProposal> getCompletionProposals(String prefix, List<String> tokens, int offset) { List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); if (tokens.size() <= 1) { String token = ""; // if there's one token and no space, check token and provide cd/switch if prefix matches if (tokens.size() == 1 && !prefix.endsWith(" ")) { token = tokens.get(0); } proposals.add(createProposal(IRailsShellConstants.CD, "Alias for switch", offset, token)); proposals.add(createProposal(IRailsShellConstants.SWITCH, "Switch current project", offset, token)); } // if there's one token and no space, check token and provide cd/switch if prefix matches if (tokens.size() == 1 && !prefix.endsWith(" ")) { String token = tokens.get(0); } if (tokens.size() == 1 || (tokens.size() == 2 && !prefix.endsWith(" "))) { String token = getLastToken(prefix, tokens); Set<IProject> projects = RailsPlugin.getRailsProjects(); for (IProject project : projects) { proposals.add(createProposal(project.getName(), offset, token)); } } return proposals; } @Override public void run(ITerminal shell, String command) { StringTokenizer tokenizer = new StringTokenizer(command); tokenizer.nextToken(); // cd or switch try { String projectName = tokenizer.nextToken(); IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); if (newProject != null && newProject.exists()) { shell.setProject(newProject); shell.write(IDebugUIConstants.ID_STANDARD_OUTPUT_STREAM, "Switched current working project to " + projectName); } else { shell.write(IDebugUIConstants.ID_STANDARD_ERROR_STREAM, "No such project: " + projectName); } } catch (RuntimeException e) { shell.write(IDebugUIConstants.ID_STANDARD_ERROR_STREAM, "Must specify project name as second argument"); } finally { shell.write(IDebugUIConstants.ID_STANDARD_INPUT_STREAM, "\n" + IRailsShellConstants.PROMPT); } } }