src/main/java/de/uapcore/sudoku/ActionHandler.java

Sat, 25 Jul 2020 14:01:28 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 25 Jul 2020 14:01:28 +0200
changeset 9
576e7a2861ae
parent 7
src/de/uapcore/sudoku/ActionHandler.java@2c0a2766461c
child 10
369903afbb29
permissions
-rw-r--r--

converts to maven project

universe@3 1 /*
universe@3 2 * Copyright 2013 Mike Becker. All rights reserved.
universe@3 3 *
universe@3 4 * Redistribution and use in source and binary forms, with or without
universe@3 5 * modification, are permitted provided that the following conditions are met:
universe@3 6 *
universe@3 7 * 1. Redistributions of source code must retain the above copyright
universe@3 8 * notice, this list of conditions and the following disclaimer.
universe@3 9 *
universe@3 10 * 2. Redistributions in binary form must reproduce the above copyright
universe@3 11 * notice, this list of conditions and the following disclaimer in the
universe@3 12 * documentation and/or other materials provided with the distribution.
universe@3 13 *
universe@3 14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@3 15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@3 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@3 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@3 18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@3 19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@3 20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@3 21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@3 22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@3 23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@3 24 * POSSIBILITY OF SUCH DAMAGE.
universe@3 25 */
universe@3 26
universe@2 27 package de.uapcore.sudoku;
universe@2 28
universe@9 29 import javax.swing.*;
universe@2 30 import java.awt.event.ActionEvent;
universe@2 31 import java.awt.event.ActionListener;
universe@6 32 import java.io.File;
universe@6 33 import java.io.IOException;
universe@2 34
universe@2 35 /**
universe@2 36 *
universe@2 37 * @author mike
universe@2 38 */
universe@2 39 public final class ActionHandler implements ActionListener {
universe@2 40
universe@2 41 public static final String SAVE = "save";
universe@2 42 public static final String CHECK = "check";
universe@2 43 public static final String SOLVE = "solve";
universe@2 44
universe@3 45 public static final String NEW = "new";
universe@3 46 public static final String OPEN = "open";
universe@3 47 public static final String SAVE_AS = "save as";
universe@3 48 public static final String QUIT = "quit";
universe@3 49 public static final String ABOUT = "about";
universe@3 50
universe@2 51 private Field field;
universe@2 52 private Solver solver;
universe@5 53 private DocumentHandler doc;
universe@2 54
universe@2 55 public ActionHandler(Field f) {
universe@2 56 field = f;
universe@2 57 solver = new Solver();
universe@5 58 doc = new DocumentHandler();
universe@5 59 }
universe@5 60
universe@5 61 private boolean chooseSaveFilename() {
universe@6 62 JFileChooser fc = new JFileChooser(".");
universe@6 63 fc.setMultiSelectionEnabled(false);
universe@6 64 if (fc.showSaveDialog(field) == JFileChooser.APPROVE_OPTION) {
universe@6 65 File f = fc.getSelectedFile();
universe@6 66 if (f.exists()) {
universe@6 67 int result = JOptionPane.showConfirmDialog(field,
universe@6 68 "Bereits existierende Datei überschreiben?", "Sudoku",
universe@6 69 JOptionPane.YES_NO_OPTION);
universe@6 70 if (result == JOptionPane.YES_OPTION) {
universe@6 71 doc.setFilename(f.getAbsolutePath());
universe@6 72 return true;
universe@6 73 } else {
universe@6 74 return false;
universe@6 75 }
universe@6 76 } else {
universe@6 77 doc.setFilename(f.getAbsolutePath());
universe@6 78 return true;
universe@6 79 }
universe@6 80 } else {
universe@6 81 return false;
universe@6 82 }
universe@2 83 }
universe@2 84
universe@6 85 private void open() {
universe@6 86 JFileChooser fc = new JFileChooser(".");
universe@6 87 fc.setMultiSelectionEnabled(false);
universe@6 88 if (fc.showOpenDialog(field) == JFileChooser.APPROVE_OPTION) {
universe@6 89 File f = fc.getSelectedFile();
universe@6 90 doc.setFilename(f.getAbsolutePath());
universe@6 91 try {
universe@6 92 doc.load(field);
universe@6 93 } catch (IOException e) {
universe@6 94 JOptionPane.showMessageDialog(field,
universe@6 95 "Datei konnte nicht geladen werden: "+e.getMessage(),
universe@6 96 "Sudoku", JOptionPane.ERROR_MESSAGE);
universe@6 97 }
universe@6 98 }
universe@6 99 }
universe@6 100
universe@6 101 private boolean save(boolean rename) {
universe@6 102 if (!doc.isFilenameSet() || rename) {
universe@5 103 if (!chooseSaveFilename()) {
universe@5 104 return false;
universe@5 105 }
universe@5 106 }
universe@2 107 if (solver.check(field)) {
universe@2 108 field.setAllCellsModified(false);
universe@6 109 try {
universe@6 110 doc.save(field);
universe@6 111 } catch (IOException e) {
universe@6 112 JOptionPane.showMessageDialog(field,
universe@6 113 "Datei konnte nicht gespeichert werden: "+e.getMessage(),
universe@6 114 "Sudoku", JOptionPane.ERROR_MESSAGE);
universe@6 115 }
universe@3 116 return true;
universe@2 117 } else {
universe@2 118 JOptionPane.showMessageDialog(field,
universe@2 119 "Das Feld kann mit Fehlern nicht gespeichert werden!",
universe@2 120 "Sudoku", JOptionPane.ERROR_MESSAGE);
universe@3 121 return false;
universe@2 122 }
universe@2 123 }
universe@2 124
universe@2 125 private void check() {
universe@2 126 if (solver.check(field)) {
universe@2 127 JOptionPane.showMessageDialog(field, "Überprüfung erfolgreich!",
universe@2 128 "Sudoku", JOptionPane.INFORMATION_MESSAGE);
universe@2 129 } else {
universe@2 130 JOptionPane.showMessageDialog(field, "Das Feld enthält Fehler!",
universe@2 131 "Sudoku", JOptionPane.WARNING_MESSAGE);
universe@2 132 }
universe@2 133 }
universe@2 134
universe@2 135 private void solve() {
universe@7 136 if (!solver.check(field) || !solver.solve(field)) {
universe@7 137 JOptionPane.showMessageDialog(field, "Das Feld ist nicht lösbar!",
universe@7 138 "Sudoku", JOptionPane.WARNING_MESSAGE);
universe@7 139 }
universe@2 140 }
universe@4 141
universe@4 142 private boolean saveUnsaved() {
universe@4 143 boolean proceed = false;
universe@4 144 if (field.isAnyCellModified()) {
universe@4 145 int result = JOptionPane.showConfirmDialog(field,
universe@4 146 "Das Feld ist ungespeichert - jetzt speichern?",
universe@4 147 "Sudoku", JOptionPane.YES_NO_CANCEL_OPTION);
universe@4 148 if (result == JOptionPane.YES_OPTION) {
universe@6 149 if (save(false)) {
universe@4 150 proceed = true;
universe@4 151 }
universe@4 152 } else if (result == JOptionPane.NO_OPTION) {
universe@4 153 proceed = true;
universe@4 154 }
universe@4 155 } else {
universe@4 156 proceed = true;
universe@4 157 }
universe@4 158
universe@4 159 return proceed;
universe@4 160 }
universe@2 161
universe@2 162 @Override
universe@2 163 public void actionPerformed(ActionEvent e) {
universe@2 164 switch (e.getActionCommand()) {
universe@4 165 case NEW:
universe@4 166 if (saveUnsaved()) {
universe@7 167 doc.clearFilename();
universe@4 168 field.clear();
universe@4 169 }
universe@4 170 break;
universe@6 171 case OPEN:
universe@6 172 open();
universe@6 173 break;
universe@3 174 case SAVE:
universe@6 175 save(false);
universe@6 176 break;
universe@6 177 case SAVE_AS:
universe@6 178 save(true);
universe@2 179 break;
universe@3 180 case CHECK:
universe@2 181 check();
universe@2 182 break;
universe@3 183 case SOLVE:
universe@2 184 solve();
universe@2 185 break;
universe@3 186 case QUIT:
universe@4 187 if (saveUnsaved()) {
universe@3 188 System.exit(0);
universe@3 189 }
universe@3 190 break;
universe@3 191 case ABOUT:
universe@3 192 JOptionPane.showMessageDialog(field,
universe@3 193 "Sudoku - Copyright (c) 2013 Mike Becker\nwww.uap-core.de"+
universe@3 194 "\nPublished under the BSD License",
universe@3 195 "Sudoku", JOptionPane.INFORMATION_MESSAGE);
universe@3 196 break;
universe@2 197 default:
universe@2 198 throw new UnsupportedOperationException(
universe@2 199 "unknown action: "+e.getActionCommand());
universe@2 200 }
universe@2 201 }
universe@2 202
universe@2 203 }

mercurial