Sun, 27 Jan 2013 15:03:57 +0100
file IO
1.1 --- a/src/de/uapcore/sudoku/ActionHandler.java Sat Jan 26 19:34:31 2013 +0100 1.2 +++ b/src/de/uapcore/sudoku/ActionHandler.java Sun Jan 27 15:03:57 2013 +0100 1.3 @@ -28,6 +28,9 @@ 1.4 1.5 import java.awt.event.ActionEvent; 1.6 import java.awt.event.ActionListener; 1.7 +import java.io.File; 1.8 +import java.io.IOException; 1.9 +import javax.swing.JFileChooser; 1.10 import javax.swing.JOptionPane; 1.11 1.12 /** 1.13 @@ -57,19 +60,60 @@ 1.14 } 1.15 1.16 private boolean chooseSaveFilename() { 1.17 - // TODO: fileselector 1.18 - return false; 1.19 + JFileChooser fc = new JFileChooser("."); 1.20 + fc.setMultiSelectionEnabled(false); 1.21 + if (fc.showSaveDialog(field) == JFileChooser.APPROVE_OPTION) { 1.22 + File f = fc.getSelectedFile(); 1.23 + if (f.exists()) { 1.24 + int result = JOptionPane.showConfirmDialog(field, 1.25 + "Bereits existierende Datei überschreiben?", "Sudoku", 1.26 + JOptionPane.YES_NO_OPTION); 1.27 + if (result == JOptionPane.YES_OPTION) { 1.28 + doc.setFilename(f.getAbsolutePath()); 1.29 + return true; 1.30 + } else { 1.31 + return false; 1.32 + } 1.33 + } else { 1.34 + doc.setFilename(f.getAbsolutePath()); 1.35 + return true; 1.36 + } 1.37 + } else { 1.38 + return false; 1.39 + } 1.40 } 1.41 1.42 - private boolean save() { 1.43 - if (!doc.isFilenameSet()) { 1.44 + private void open() { 1.45 + JFileChooser fc = new JFileChooser("."); 1.46 + fc.setMultiSelectionEnabled(false); 1.47 + if (fc.showOpenDialog(field) == JFileChooser.APPROVE_OPTION) { 1.48 + File f = fc.getSelectedFile(); 1.49 + doc.setFilename(f.getAbsolutePath()); 1.50 + try { 1.51 + doc.load(field); 1.52 + } catch (IOException e) { 1.53 + JOptionPane.showMessageDialog(field, 1.54 + "Datei konnte nicht geladen werden: "+e.getMessage(), 1.55 + "Sudoku", JOptionPane.ERROR_MESSAGE); 1.56 + } 1.57 + } 1.58 + } 1.59 + 1.60 + private boolean save(boolean rename) { 1.61 + if (!doc.isFilenameSet() || rename) { 1.62 if (!chooseSaveFilename()) { 1.63 return false; 1.64 } 1.65 } 1.66 if (solver.check(field)) { 1.67 field.setAllCellsModified(false); 1.68 - // TODO: save to file 1.69 + try { 1.70 + doc.save(field); 1.71 + } catch (IOException e) { 1.72 + JOptionPane.showMessageDialog(field, 1.73 + "Datei konnte nicht gespeichert werden: "+e.getMessage(), 1.74 + "Sudoku", JOptionPane.ERROR_MESSAGE); 1.75 + } 1.76 return true; 1.77 } else { 1.78 JOptionPane.showMessageDialog(field, 1.79 @@ -100,7 +144,7 @@ 1.80 "Das Feld ist ungespeichert - jetzt speichern?", 1.81 "Sudoku", JOptionPane.YES_NO_CANCEL_OPTION); 1.82 if (result == JOptionPane.YES_OPTION) { 1.83 - if (save()) { 1.84 + if (save(false)) { 1.85 proceed = true; 1.86 } 1.87 } else if (result == JOptionPane.NO_OPTION) { 1.88 @@ -121,8 +165,14 @@ 1.89 field.clear(); 1.90 } 1.91 break; 1.92 + case OPEN: 1.93 + open(); 1.94 + break; 1.95 case SAVE: 1.96 - save(); 1.97 + save(false); 1.98 + break; 1.99 + case SAVE_AS: 1.100 + save(true); 1.101 break; 1.102 case CHECK: 1.103 check();
2.1 --- a/src/de/uapcore/sudoku/DocumentHandler.java Sat Jan 26 19:34:31 2013 +0100 2.2 +++ b/src/de/uapcore/sudoku/DocumentHandler.java Sun Jan 27 15:03:57 2013 +0100 2.3 @@ -26,10 +26,15 @@ 2.4 2.5 package de.uapcore.sudoku; 2.6 2.7 +import java.io.BufferedReader; 2.8 import java.io.BufferedWriter; 2.9 +import java.io.FileInputStream; 2.10 import java.io.FileOutputStream; 2.11 import java.io.IOException; 2.12 +import java.io.InputStreamReader; 2.13 import java.io.OutputStreamWriter; 2.14 +import java.util.regex.Matcher; 2.15 +import java.util.regex.Pattern; 2.16 2.17 /** 2.18 * 2.19 @@ -43,7 +48,34 @@ 2.20 if (!isFilenameSet()) { 2.21 throw new IOException("no filename supplied"); 2.22 } 2.23 - // TODO: implement 2.24 + int row = 0; 2.25 + try (BufferedReader in = new BufferedReader( 2.26 + new InputStreamReader(new FileInputStream(filename)))) { 2.27 + Pattern pat = Pattern.compile("^\\s*(?:[1-9_] ){8}[1-9_]\\s*$"); 2.28 + String line; 2.29 + while ((line = in.readLine()) != null) { 2.30 + if (line.matches("^\\s*$")) { 2.31 + continue; 2.32 + } 2.33 + Matcher m = pat.matcher(line); 2.34 + if (m.matches()) { 2.35 + String c[] = line.trim().split(" "); 2.36 + if (c.length != 9) { 2.37 + break; 2.38 + } 2.39 + for (int i = 0 ; i < 9 ; i++) { 2.40 + field.setCellValue(i, row, 2.41 + c[i].equals("_") ? 0 : Integer.valueOf(c[i])); 2.42 + } 2.43 + row++; 2.44 + } else { 2.45 + break; 2.46 + } 2.47 + } 2.48 + if (row != 9) { 2.49 + throw new IOException("Kein Sudoku-Feld enthalten!"); 2.50 + } 2.51 + } 2.52 } 2.53 2.54 public void save(Field field) throws IOException {
3.1 --- a/src/de/uapcore/sudoku/SudokuTextField.java Sat Jan 26 19:34:31 2013 +0100 3.2 +++ b/src/de/uapcore/sudoku/SudokuTextField.java Sun Jan 27 15:03:57 2013 +0100 3.3 @@ -59,10 +59,12 @@ 3.4 private void handle(KeyEvent e) { 3.5 char c = e.getKeyChar(); 3.6 if (!e.isAltDown() && !e.isControlDown() && 3.7 - Character.isLetterOrDigit(c)) { 3.8 + !Character.isISOControl(c)) { 3.9 // Perform clean input check 3.10 if (getText().length() > 0 && getSelectedText() == null) { 3.11 - e.consume(); 3.12 + if (c != KeyEvent.CHAR_UNDEFINED) { 3.13 + e.consume(); 3.14 + } 3.15 } else { 3.16 if (c < '1' || c > '9') { 3.17 e.consume();