diff --git a/src/Nav.java b/src/Nav.java index 8bbede3..da0a414 100644 --- a/src/Nav.java +++ b/src/Nav.java @@ -3,10 +3,11 @@ import java.io.File; import java.io.FileNotFoundException; import javax.swing.JPanel; -import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JButton; +import gui.ComboBox; +import gui.FileChooser; /** * The Nav class represents the Navigation bar at the top of the JFrame window. * @@ -85,26 +86,52 @@ public class Nav extends JPanel { * debugging purposes. */ private void createGUI() { - JComboBox fileOptions = new JComboBox(); - fileOptions.addItem("New"); - fileOptions.addItem("Open"); - fileOptions.addItem("Save"); - fileOptions.addItem("Exit"); - JLabel elapsedTime = new JLabel("Elapsed Time: 00:00:00"); - JButton solve = new JButton("Solve"); - add(fileOptions); + add(createFileOptions()); add(elapsedTime); add(solve); } + /** + * Create the ComboBox for the file options. + * + * @return ComboBox + */ + private ComboBox createFileOptions() { + ComboBox fileOptions = new ComboBox<>(); + fileOptions.addItem("New"); + fileOptions.addItem("Open"); + fileOptions.addItem("Save"); + fileOptions.addItem("Exit"); + + fileOptions.addActionListener(e -> { + String selected = (String) fileOptions.getSelectedItem(); + switch(selected) { + case "New": + newFile(); + break; + case "Open": + openFile(); + break; + case "Save": + saveFile(); + break; + case "Exit": + System.exit(0); + break; + default: + System.out.println("Invalid selection."); + } + }); + + return fileOptions; + } + /** * Given the user's selection from the JComboBox, perform the appropriate * action. - * - * @param String */ private void newFile() { int defaultOption = s.getNewFileProperties(); @@ -120,8 +147,30 @@ public class Nav extends JPanel { // TODO: Create a new .sdku file in the default directory. } + /** + * Open an existing .sdku file in the user's file system, using a GUI. + */ + private void openFile() { + File defaultDirectory = new File(s.getDefaultDirectory()); + if(defaultDirectory != null || !defaultDirectory.isDirectory()) { + defaultDirectory.mkdirs(); + } + + FileChooser fc = new FileChooser(defaultDirectory); + int result = fc.showOpenDialog(this); + + if(result == FileChooser.APPROVE_OPTION) { + f = fc.getSelectedFile(); + createGrid(f); + } else { + System.out.println("No file was selected."); + } + } + /** * Given an input filename, open the file and populate the grid. + * + * This implementation is for use only in the command-line interface. * * @param String */ @@ -140,6 +189,7 @@ public class Nav extends JPanel { return; } + System.out.println("Opening the file " + filename + ".sdku."); createGrid(f); } diff --git a/src/Settings.java b/src/Settings.java index 4490228..fcefba6 100644 --- a/src/Settings.java +++ b/src/Settings.java @@ -1,3 +1,4 @@ + import java.util.Scanner; import java.io.File; @@ -20,7 +21,7 @@ public class Settings { // settings, effectively toggles. If the file does not exist, // populate it with the following values (possibly in .json). newFileProperties = 0; - defaultDirectory = "~/AppData/Local/sudoku/"; + defaultDirectory = "C:\\Users\\jashton\\AppData\\Local\\Sudoku"; // TODO: This is a Windows default. Need OS detection. } /** diff --git a/src/gui/ComboBox.java b/src/gui/ComboBox.java new file mode 100644 index 0000000..95e8c0d --- /dev/null +++ b/src/gui/ComboBox.java @@ -0,0 +1,25 @@ +package gui; + +import javax.swing.JComboBox; + +/** + * A custom JComboBox with the appropriate styling for the Sudoku app. + */ +public class ComboBox extends JComboBox { + + /** + * Create a new ComboBox with the default styling and without initial items. + */ + public ComboBox() { + super(); + style(); + } + + /** + * Set up the ComboBox with the appropriate styling. + */ + private void style() { + // TODO: Style the ComboBox. + System.out.println("TODO: Style the ComboBox."); + } +} diff --git a/src/gui/FileChooser.java b/src/gui/FileChooser.java new file mode 100644 index 0000000..7066527 --- /dev/null +++ b/src/gui/FileChooser.java @@ -0,0 +1,62 @@ +package gui; + +import java.io.File; +import javax.swing.filechooser.FileFilter; +import javax.swing.JFileChooser; + +/** + * A custom FileChooser with the appropriate styling for the Sudoku app. + * Additionally, this FileChooser only allows .sdku files to be selected. + */ +public class FileChooser extends JFileChooser { + + /** + * Create a new FileChooser with the default directory set to the user's + * Sudoku directory. + * + * @param defaultDirectory + */ + public FileChooser(File defaultDirectory) { + super(defaultDirectory); + for (File f: defaultDirectory.listFiles()) { + ensureFileIsVisible(f); + } + style(); + setupSettings(); + } + + /** + * Set up the FileChooser with the appropriate styling. + */ + private void style() { + // TODO: Style the FileChooser. + System.out.println("TODO: Style the FileChooser."); + } + + /** + * Set up the FileChooser with the appropriate settings. + */ + private void setupSettings() { + setFileHidingEnabled(false); + setFileSelectionMode(JFileChooser.FILES_ONLY); + rescanCurrentDirectory(); + setFileFilter(new Filter()); + } + + /** + * A custom FileFilter to only allow .sdku files to be selected. + */ + private class Filter extends FileFilter { + public boolean accept(File f) { + String name = f.getName().toLowerCase(); + if(name.length() > 5) { + return name.substring(name.length() - 5).equals(".sdku") || !f.isDirectory(); + } + return false; + } + + public String getDescription() { + return "Sudoku Puzzle Files (*.sdku)"; + } + } +} diff --git a/src/run.ps1 b/src/run.ps1 index 28ea8b4..9ef6518 100644 --- a/src/run.ps1 +++ b/src/run.ps1 @@ -5,6 +5,7 @@ function Run { javac *.java java App $flag rm *.class + rm gui/*.class } if ($args.Length -eq 1) {