file IO

Sun, 27 Jan 2013 15:03:57 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 27 Jan 2013 15:03:57 +0100
changeset 6
5bab2e971333
parent 5
8ddf4af937d7
child 7
2c0a2766461c

file IO

src/de/uapcore/sudoku/ActionHandler.java file | annotate | diff | comparison | revisions
src/de/uapcore/sudoku/DocumentHandler.java file | annotate | diff | comparison | revisions
src/de/uapcore/sudoku/SudokuTextField.java file | annotate | diff | comparison | revisions
     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();

mercurial