/**
*
*/
package org.korsakow.ide.ui.components.code;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextField;
import org.korsakow.ide.code.RuleParserException;
import org.korsakow.ide.code.k5.K5Code;
import org.korsakow.ide.code.k5.K5RuleParser2;
import org.korsakow.ide.ui.components.cell.DefaultAdvancedCellEditor;
import org.korsakow.ide.util.UIUtil;
public class CodeCellEditor extends DefaultAdvancedCellEditor
{
private final K5RuleParser2 parser = new K5RuleParser2();
private boolean valid = false;
public static Color SELECTION_BACKGROUND = new Color(0x214ca1);
public CodeCellEditor()
{
setClickCountToStart(1);
// we used to have a focus listener here to stop cell editing. replaced by terminateEditOnFocusLost (see CodeTable ctor)
}
public void requestFocus()
{
editorComponent.requestFocus();
// set cursor to end, no selection
UIUtil.runUITaskLater(new Runnable() {
public void run() {
((JTextField)editorComponent).setSelectionStart(((JTextField)editorComponent).getText().length());
((JTextField)editorComponent).setSelectionEnd(((JTextField)editorComponent).getText().length());
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column)
{
K5Code code = (K5Code)value;
delegate.setValue(code.getRawCode());
UIUtil.runUITaskLater(new Runnable() {
public void run() {
editorComponent.requestFocus();
// set cursor to end, no selection
UIUtil.runUITaskLater(new Runnable() {
public void run() {
((JTextField)editorComponent).setSelectionStart(((JTextField)editorComponent).getText().length());
((JTextField)editorComponent).setSelectionEnd(((JTextField)editorComponent).getText().length());
}
});
}
});
editorComponent.setBackground(SELECTION_BACKGROUND);
editorComponent.setForeground(Color.white);
((JTextField)editorComponent).setCaretColor(Color.white);
return editorComponent;
}
@Override
public boolean doStopCellEditing()
{
try {
parser.parse(super.getCellEditorValue().toString());
valid = true;
} catch (RuleParserException e) {
valid = false;
}
return super.doStopCellEditing();
}
@Override
public Object getCellEditorValue()
{
String value = super.getCellEditorValue().toString().trim();
K5Code code = new K5Code(value);
code.setValid(valid);
return code;
}
}