diff -r f1d7de36b01e -r 5179eff8a9b6 src/de/uapcore/sudoku/SudokuTextField.java --- a/src/de/uapcore/sudoku/SudokuTextField.java Sat Jan 26 15:48:59 2013 +0100 +++ b/src/de/uapcore/sudoku/SudokuTextField.java Sat Jan 26 17:42:07 2013 +0100 @@ -13,7 +13,9 @@ * * @author mike */ -public class SudokuTextField extends JTextField { +public final class SudokuTextField extends JTextField { + + private boolean modified; public SudokuTextField() { setBorder(null); @@ -29,7 +31,7 @@ addKeyListener(new KeyAdapter() { private void handle(KeyEvent e) { - if (getText().length() > 0) { + if (getText().length() > 0 && getSelectedText() == null) { int c = e.getKeyCode(); if (c != KeyEvent.VK_DELETE && c != KeyEvent.VK_BACK_SPACE && @@ -40,6 +42,8 @@ char c = e.getKeyChar(); if (c < '0' || c > '9') { e.consume(); + } else { + setModified(true); } } } @@ -68,4 +72,31 @@ }); } + public int getValue() { + if (getText().length() > 0) { + return Integer.valueOf(getText()); + } else { + return 0; + } + } + + public void setValue(int v) { + if (v == 0) { + setText(""); + } else if (v < 10) { + setText(String.valueOf(v)); + } else { + throw new IllegalArgumentException( + "Sudoku numbers must be in range 0-9 (0 means 'not set')"); + } + } + + public void setModified(boolean modified) { + this.modified = modified; + setForeground(modified?Color.BLUE:Color.BLACK); + } + + public boolean isModified() { + return modified; + } }