This repository has been archived on 2021-02-18. You can view files and clone it, but cannot push or open issues or pull requests.
chess/src/main/java/dev/kske/chess/ui/MenuBar.java

175 lines
4.4 KiB
Java

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: <strong>Chess</strong><br>
* File: <strong>MenuBar.java</strong><br>
* Created: <strong>16.07.2019</strong><br>
*
* @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);
}
}