package abbot.editor.editors;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.KeyStroke;
import java.util.Collection;
import abbot.i18n.Strings;
import abbot.script.Expression;
import abbot.editor.widgets.TextFormat;
/** A Expression only has its description available for editing. */
public class ExpressionEditor extends StepEditor {
private Expression step;
private JTextArea expr;
private JButton run;
private Color DEFAULT_FG;
private JTextArea status;
public ExpressionEditor(Expression step) {
super(step);
this.step = step;
remove(getComponentCount()-1);
expr = addTextArea(null, step.getExpression());
expr.setName("expression.text");
expr.setColumns(80);
expr.setToolTipText(Strings.get("expression.text.tip"));
expr.setLineWrap(false);
run = addButton(Strings.get("expression.eval"));
run.setToolTipText(Strings.get("expression.eval.tip"));
DEFAULT_FG = expr.getForeground();
expr.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER
&& (e.getModifiers() & InputEvent.SHIFT_MASK) != 0) {
run.doClick();
}
}
});
// TODO: properly format for readability
status = new JTextArea();
status.setBorder(null);
status.setForeground(Color.red);
status.setBackground(getBackground());
status.setLineWrap(true);
status.setEditable(false);
add(status);
}
public Dimension getPreferredSize() {
Insets insets = getInsets();
Dimension size = super.getPreferredSize();
size.width = expr.getPreferredSize().width;
if (insets != null) {
size.width += insets.left + insets.right;
}
return size;
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource() == expr) {
expr.setForeground(DEFAULT_FG);
expr.setToolTipText(Strings.get("expression.text.tip"));
step.setExpression(expr.getText());
status.setText("");
fireStepChanged();
}
else if (ev.getSource() == run) {
expr.setForeground(DEFAULT_FG);
expr.setToolTipText(Strings.get("expression.text.tip"));
status.setText("");
new Thread("expression runner") {
public void run() {
try {
step.run();
}
catch(Throwable e) {
// if (e instanceof bsh.EvalError)
// expr.setForeground(Color.red);
status.setText(e.getMessage());
}
fireStepChanged();
}
}.start();
}
else {
super.actionPerformed(ev);
}
}
}