package dev.kske.chess.ui; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; import java.util.Arrays; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import dev.kske.chess.board.FENString; import dev.kske.chess.exception.ChessException; import dev.kske.chess.game.Game; import dev.kske.chess.io.EngineUtil; /** * Project: Chess
* File: MenuBar.java
* Created: 16.07.2019
* * @since Chess v0.1-alpha * @author Kai S. K. Engelbart */ public class MenuBar extends JMenuBar { private static final long serialVersionUID = -7221583703531248228L; private final MainWindow mainWindow; /** * Creates an instance of {@link MenuBar}. * * @param mainWindow the main window inside which this menu bar is contained */ public MenuBar(MainWindow mainWindow) { this.mainWindow = mainWindow; initGameMenu(); initEngineMenu(); initToolsMenu(); } private void initGameMenu() { JMenu gameMenu = new JMenu("Game"); JMenuItem newGameMenuItem = new JMenuItem("New Game"); newGameMenuItem.addActionListener( evt -> DialogUtil.showGameConfigurationDialog( mainWindow, (whiteName, blackName) -> { GamePane gamePane = mainWindow.addGamePane(); Game game = new Game( gamePane.getBoardPane(), whiteName, blackName ); gamePane.setGame(game); game.start(); } ) ); gameMenu.add(newGameMenuItem); JMenuItem loadFileMenu = new JMenuItem("Load game file"); loadFileMenu.addActionListener( evt -> DialogUtil .showFileSelectionDialog( mainWindow, mainWindow::loadFiles, Arrays.asList( new FileNameExtensionFilter( "FEN and PGN files", "fen", "pgn" ) ) ) ); gameMenu.add(loadFileMenu); JMenuItem saveFileMenu = new JMenuItem("Save game file"); saveFileMenu .addActionListener( evt -> DialogUtil .showFileSaveDialog( mainWindow, mainWindow::saveFile, Arrays.asList( new FileNameExtensionFilter("PGN file", "pgn") ) ) ); gameMenu.add(saveFileMenu); add(gameMenu); newGameMenuItem.doClick(); } private void initEngineMenu() { JMenu engineMenu = new JMenu("Engine"); JMenuItem addEngineMenuItem = new JMenuItem("Add engine"); addEngineMenuItem.addActionListener(evt -> { String enginePath = JOptionPane .showInputDialog( getParent(), "Enter the path to a UCI-compatible chess engine:", "Engine selection", JOptionPane.QUESTION_MESSAGE ); if (enginePath != null) EngineUtil.addEngine(enginePath); }); JMenuItem showInfoMenuItem = new JMenuItem("Show engine info"); engineMenu.add(addEngineMenuItem); engineMenu.add(showInfoMenuItem); add(engineMenu); } private void initToolsMenu() { JMenu toolsMenu = new JMenu("Tools"); JMenuItem exportFENMenuItem = new JMenuItem("Export board to FEN"); exportFENMenuItem.addActionListener(evt -> { final String fen = new FENString( mainWindow.getSelectedGamePane().getGame().getBoard() ).toString(); Toolkit.getDefaultToolkit() .getSystemClipboard() .setContents(new StringSelection(fen), null); JOptionPane.showMessageDialog( mainWindow, String.format("FEN-string copied to clipboard!%n%s", fen) ); }); toolsMenu.add(exportFENMenuItem); JMenuItem loadFromFENMenuItem = new JMenuItem("Load board from FEN"); loadFromFENMenuItem.addActionListener(evt -> { final GamePane gamePane = mainWindow.addGamePane(); final String fen = JOptionPane.showInputDialog("Enter a FEN string: "); DialogUtil.showGameConfigurationDialog( mainWindow, (whiteName, blackName) -> { Game game; try { game = new Game( gamePane.getBoardPane(), whiteName, blackName, new FENString(fen).getBoard() ); gamePane.setGame(game); game.start(); } catch (ChessException e) { e.printStackTrace(); JOptionPane .showMessageDialog( mainWindow, "Failed to load FEN string: " + e.toString(), "FEN loading error", JOptionPane.ERROR_MESSAGE ); } } ); }); toolsMenu.add(loadFromFENMenuItem); add(toolsMenu); } }