175 lines
4.4 KiB
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);
|
|
}
|
|
}
|