package userInterface; import java.awt.Dimension; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridLayout; import java.awt.Insets; import java.io.FileReader; import java.io.BufferedReader; import java.io.File; import java.util.Set; import java.util.stream.Stream; import java.util.stream.Collectors; import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.net.URL; import universe.Universe; public class Window extends JFrame { private JPanel panel; private JMenuBar menuBar; private Grid grid; private Universe universe; public Window(Universe universe) { super("Laser Finder"); this.universe = universe; panel = new JPanel(); panel.setPreferredSize(new Dimension(1000,800)); panel.setBackground(Color.decode("#EBEBD3")); menuBar = new JMenuBar(); JMenu fichierMenu = new JMenu("File"); JMenu aideMenu = new JMenu("Help"); JMenu toolsMenu = new JMenu("Tools"); JMenu solveMenu = new JMenu("Solve"); JMenu displayMenu = new JMenu("Display"); JMenu refreshRate = new JMenu("Refresh Rate"); URL newUrl = getClass().getResource("../images/new.png"); URL openUrl = getClass().getResource("../images/open.png"); URL saveUrl = getClass().getResource("../images/save.png"); ImageIcon nouveauIcon = new ImageIcon(newUrl.getPath()); ImageIcon openIcon = new ImageIcon(openUrl.getPath()); ImageIcon saveIcon = new ImageIcon(saveUrl.getPath()); JMenuItem nouveauItem = new JMenuItem("New", nouveauIcon); JMenuItem ouvrirItem = new JMenuItem("Open", openIcon); JMenuItem enregistrerItem = new JMenuItem("Save", saveIcon); JMenuItem apropos = new JMenuItem("About"); JMenuItem regles = new JMenuItem("Rules"); JRadioButtonMenuItem radioWall = new JRadioButtonMenuItem("Wall"); JRadioButtonMenuItem radioStart = new JRadioButtonMenuItem("Start"); radioWall.setSelected(true); ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(radioWall); buttonGroup.add(radioStart); JMenuItem changeSize = new JMenuItem("Change Size"); JMenuItem reset = new JMenuItem("Reset"); JMenuItem solve = new JMenuItem("Start"); JMenuItem stop = new JMenuItem("Stop"); JRadioButtonMenuItem radio10ms = new JRadioButtonMenuItem("10ms"); JRadioButtonMenuItem radio200ms = new JRadioButtonMenuItem("200ms"); JRadioButtonMenuItem radio500ms = new JRadioButtonMenuItem("500ms"); JRadioButtonMenuItem radio1000ms = new JRadioButtonMenuItem("1000ms"); radio10ms.setSelected(true); ButtonGroup refreshRates = new ButtonGroup(); refreshRates.add(radio10ms); refreshRates.add(radio200ms); refreshRates.add(radio500ms); refreshRates.add(radio1000ms); fichierMenu.add(nouveauItem); fichierMenu.add(ouvrirItem); fichierMenu.add(enregistrerItem); aideMenu.add(apropos); aideMenu.add(regles); toolsMenu.add(radioWall); toolsMenu.add(radioStart); toolsMenu.addSeparator(); toolsMenu.add(changeSize); toolsMenu.addSeparator(); toolsMenu.add(reset); solveMenu.add(solve); solveMenu.add(stop); refreshRate.add(radio10ms); refreshRate.add(radio200ms); refreshRate.add(radio500ms); refreshRate.add(radio1000ms); displayMenu.add(refreshRate); menuBar.add(fichierMenu); menuBar.add(aideMenu); menuBar.add(toolsMenu); menuBar.add(solveMenu); menuBar.add(displayMenu); nouveauItem.addActionListener(e -> { this.universe.changeUniverseStart(1, 1, 11); this.universe.changeUniverseDim(5, 5); this.universe.resetUniverseObstacles(); this.panel.remove(this.grid); this.grid = new Grid(3, 3, this.universe, 10); this.panel.add(this.grid); super.pack(); super.repaint(); }); enregistrerItem.addActionListener(e -> { String name = JOptionPane.showInputDialog("Choose the universe name"); this.universe.save(name); }); ouvrirItem.addActionListener(e -> { String message = "Choose the universe among those : "; Set files = Stream.of(new File("./saves").listFiles()).filter(file -> !file.isDirectory()).map(File::getName).collect(Collectors.toSet()); for (String element : files) { message += "\n- " + element.replace(".txt", ""); } String name = JOptionPane.showInputDialog(message); try { BufferedReader reader = new BufferedReader(new FileReader("./saves/" + name + ".txt")); int universe_height = Integer.valueOf(reader.readLine()); int universe_width = Integer.valueOf(reader.readLine()); int start_dir = Integer.valueOf(reader.readLine()); int start_i = Integer.valueOf(reader.readLine()); int start_j = Integer.valueOf(reader.readLine()); this.universe.changeUniverseDim(universe_width + 2, universe_height + 2); this.universe.changeUniverseStart(start_i, start_j, start_dir); this.universe.resetUniverseObstacles(); while (true) { try { int pos1 = Integer.valueOf(reader.readLine()); int pos2 = Integer.valueOf(reader.readLine()); this.universe.addObstacle(pos1, pos2); } catch (Exception error) { break; } } this.panel.remove(this.grid); this.grid = new Grid(universe_width, universe_height, this.universe, 10); this.panel.add(this.grid); super.pack(); super.repaint(); } catch (Exception error) {} }); regles.addActionListener(e -> { JOptionPane.showMessageDialog(this, "Définissez la taille du plateau ainsi que l'orientation du laser, enfin ajoutez des obstacles et laissez le programme trouver le bon chemin !"); }); changeSize.addActionListener(e -> { int width = Integer.valueOf(JOptionPane.showInputDialog("Choose the width")); int height = Integer.valueOf(JOptionPane.showInputDialog("Choose the height")); this.universe.changeUniverseDim(width + 2, height + 2); this.panel.remove(this.grid); this.grid = new Grid(width, height, this.universe, 10); this.panel.add(this.grid); super.pack(); super.repaint(); }); radioWall.addActionListener(e -> { this.grid.setSelected(0); }); radioStart.addActionListener(e -> { this.grid.setSelected(1); }); solve.addActionListener(e -> { this.grid.solve(); }); stop.addActionListener(e -> { this.grid.setSolving(false); }); reset.addActionListener(e -> { this.grid.reset(); }); radio200ms.addActionListener(e -> { this.grid.setRefreshRate(200); }); radio500ms.addActionListener(e -> { this.grid.setRefreshRate(500); }); radio1000ms.addActionListener(e -> { this.grid.setRefreshRate(1000); }); this.grid = new Grid(this.universe.getHeight() - 2, this.universe.getWidth() - 2, this.universe, 10); this.panel.add(grid, BorderLayout.CENTER); super.setJMenuBar(menuBar); super.setContentPane(this.panel); super.setLocationRelativeTo(null); super.setLocation(1000, 400); super.pack(); super.setVisible(true); super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }