package tk.amberide.ide.gui.misc;
import java.io.PrintStream;
import java.util.ArrayList;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.jruby.Ruby;
import org.jruby.RubyInstanceConfig;
import org.jruby.demo.TextAreaReadline;
import org.jruby.internal.runtime.ValueAccessor;
public class RubyConsole extends RSyntaxTextArea {
private TextAreaReadline tar;
private Ruby runtime;
public RubyConsole() {
tar = new TextAreaReadline(this);
runtime = Ruby.newInstance(new RubyInstanceConfig() {
{
setInput(tar.getInputStream());
setOutput(new PrintStream(tar.getOutputStream()));
setError(new PrintStream(tar.getOutputStream()));
setObjectSpaceEnabled(true); // useful for code completion inside the IRB
}
});
runtime.getGlobalVariables().defineReadonly("$$", new ValueAccessor(runtime.newFixnum(System.identityHashCode(runtime))));
runtime.getLoadService().init(new ArrayList());
tar.hookIntoRuntime(runtime);
setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_RUBY);
setAnimateBracketMatching(false);
setAntiAliasingEnabled(true);
setCodeFoldingEnabled(true);
}
public Ruby getRuntime() {
return runtime;
}
public void eval(final String scriptlet) {
Thread proc = new Thread() {
@Override
public void run() {
runtime.evalScriptlet(scriptlet);
}
};
proc.start();
try {
proc.join();
} catch (InterruptedException e) {
}
}
@Override
public void removeNotify() {
tar.shutdown();
}
}