package com.sandwich.koan.cmdline.behavior;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import com.sandwich.koan.constant.ArgumentType;
import com.sandwich.koan.constant.KoanConstants;
import com.sandwich.koan.util.ApplicationUtils;
public class Help extends AbstractArgumentBehavior {
public void run(String...values) {
StringBuilder sb = new StringBuilder(
"Java Koans - HELP").append(KoanConstants.EOL);
line(sb, "-----------------");
line(sb, "the following options are available:");
ArrayList<ArgumentType> argTypes = new ArrayList<ArgumentType>(Arrays.asList(getArgumentTypes()));
Collections.reverse(argTypes);
for(ArgumentType argType : argTypes){
StringBuilder stringArgs = new StringBuilder();
for(String arg : argType.args()){
stringArgs.append(arg);
if(argType.args().indexOf(arg) < (argType.args().size() - 1)){
stringArgs.append(", ");
}
}
String args = stringArgs.toString();
String fiveSpaces = spaces(5);
sb.append(args).append(KoanConstants.EOL);
sb.append(fiveSpaces).append(argType.name()).append(": ").append(
makeCharWidth(70, getPositionOnCurrentLine(sb), argType.description()))
.append(KoanConstants.EOL);
}
ApplicationUtils.getPresenter().displayMessage(sb.toString());
}
private String makeCharWidth(int width, int positionOnCurrentLine, String text) {
int upperIndexForLine = width - positionOnCurrentLine;
if(upperIndexForLine > text.length()){
upperIndexForLine = text.length();
}
StringBuilder sb = new StringBuilder(text.substring(0, upperIndexForLine)).append(
KoanConstants.EOL);
for(int i = upperIndexForLine; i < text.length(); i += width){
upperIndexForLine += width;
if(upperIndexForLine > text.length()){
upperIndexForLine = text.length();
}
sb.append(text.substring(i,upperIndexForLine))
.append(KoanConstants.EOL);
}
return sb.toString();
}
private int getPositionOnCurrentLine(StringBuilder sb) {
return getTextOnCurrentLine(sb).length();
}
private String getTextOnCurrentLine(StringBuilder sb) {
return sb.substring(sb.lastIndexOf(KoanConstants.EOL), sb.length());
}
protected ArgumentType[] getArgumentTypes() {
return ArgumentType.values();
}
private String spaces(int i) {
StringBuilder spaces = new StringBuilder(i);
while(spaces.length() < i){
spaces.append(" ");
}
return spaces.toString();
}
public void line(StringBuilder builder, String text){
builder.append(text).append(KoanConstants.EOL);
}
}