/*
CuckooChess - A java chess program.
Copyright (C) 2011 Peter Ă–sterlund, peterosterlund2@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gui;
import guibase.ChessController;
import guibase.GUIInterface;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import chess.ComputerPlayer;
import chess.Move;
import chess.Position;
/** The main class for the chess GUI. */
public class AppletGUI extends javax.swing.JApplet implements GUIInterface {
private static final long serialVersionUID = 7357610346389734323L;
ChessBoardPainter cbp;
ChessController ctrl;
final static int ttLogSize = 19; // Use 2^19 hash entries.
String moveListStr = "";
String thinkingStr = "";
/** Initializes the applet AppletGUI */
@Override
public void init() {
ctrl = new ChessController(this);
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
cbp = (ChessBoardPainter)ChessBoard;
ctrl.newGame(PlayerWhite.isSelected(), ttLogSize, true);
ctrl.startGame();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Entry point for the GUI version of the chess program.
*/
public static void main(String[] args) {
javax.swing.JApplet theApplet = new AppletGUI();
theApplet.init();
javax.swing.JFrame window = new javax.swing.JFrame(ComputerPlayer.engineName);
window.setContentPane(theApplet);
window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
}
/** This method is called from within the init() method to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {
PlayerColor = new javax.swing.ButtonGroup();
MainPanel = new javax.swing.JPanel();
ChessBoardPanel = new javax.swing.JPanel();
ChessBoard = new ChessBoardPainter();
jPanel1 = new javax.swing.JPanel();
NewGame = new javax.swing.JButton();
SettingsPanel = new javax.swing.JPanel();
PlayerWhite = new javax.swing.JRadioButton();
PlayerBlack = new javax.swing.JRadioButton();
TimeLabel = new javax.swing.JLabel();
TimeSlider = new javax.swing.JSlider();
ShowThinking = new javax.swing.JCheckBox();
FlipBoard = new javax.swing.JCheckBox();
jScrollPane1 = new javax.swing.JScrollPane();
LogTextArea = new javax.swing.JTextPane();
StatusLine = new javax.swing.JTextField();
Forward = new javax.swing.JButton();
Backward = new javax.swing.JButton();
ChessBoardPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
ChessBoardPanel.setPreferredSize(new java.awt.Dimension(500, 500));
ChessBoard.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
ChessBoardMousePressed(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
ChessBoardMouseReleased(evt);
}
});
ChessBoard.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(java.awt.event.MouseEvent evt) {
ChessBoardMouseDragged(evt);
}
});
javax.swing.GroupLayout ChessBoardPanelLayout = new javax.swing.GroupLayout(ChessBoardPanel);
ChessBoardPanel.setLayout(ChessBoardPanelLayout);
ChessBoardPanelLayout.setHorizontalGroup(
ChessBoardPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(ChessBoard, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
);
ChessBoardPanelLayout.setVerticalGroup(
ChessBoardPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(ChessBoard, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
);
jPanel1.setFocusable(false);
NewGame.setText("New Game");
NewGame.setFocusable(false);
NewGame.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
NewGameActionPerformed(evt);
}
});
SettingsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Settings"));
SettingsPanel.setFocusable(false);
PlayerColor.add(PlayerWhite);
PlayerWhite.setSelected(true);
PlayerWhite.setText("Play White");
PlayerWhite.setFocusable(false);
PlayerColor.add(PlayerBlack);
PlayerBlack.setText("Play Black");
PlayerBlack.setFocusable(false);
TimeLabel.setText("Thinking Time");
TimeSlider.setMajorTickSpacing(15);
TimeSlider.setMaximum(60);
TimeSlider.setMinorTickSpacing(5);
TimeSlider.setPaintLabels(true);
TimeSlider.setPaintTicks(true);
TimeSlider.setValue(5);
TimeSlider.setFocusable(false);
TimeSlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
TimeSliderStateChanged(evt);
}
});
ShowThinking.setText("Show Thinking");
ShowThinking.setFocusable(false);
ShowThinking.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
ShowThinkingStateChanged(evt);
}
});
FlipBoard.setText("Flip Board");
FlipBoard.setFocusable(false);
FlipBoard.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
FlipBoardStateChanged(evt);
}
});
javax.swing.GroupLayout SettingsPanelLayout = new javax.swing.GroupLayout(SettingsPanel);
SettingsPanel.setLayout(SettingsPanelLayout);
SettingsPanelLayout.setHorizontalGroup(
SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(ShowThinking, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addComponent(PlayerWhite)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 104, Short.MAX_VALUE)
.addComponent(FlipBoard)
.addContainerGap())
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addComponent(TimeLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(TimeSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(PlayerBlack)
);
SettingsPanelLayout.setVerticalGroup(
SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(SettingsPanelLayout.createSequentialGroup()
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(PlayerWhite)
.addComponent(FlipBoard))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(PlayerBlack)
.addGap(18, 18, 18)
.addGroup(SettingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(TimeLabel)
.addComponent(TimeSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ShowThinking)
.addContainerGap())
);
LogTextArea.setEditable(false);
LogTextArea.setVerifyInputWhenFocusTarget(false);
jScrollPane1.setViewportView(LogTextArea);
StatusLine.setEditable(false);
StatusLine.setFocusable(false);
Forward.setText("->");
Forward.setDefaultCapable(false);
Forward.setFocusPainted(false);
Forward.setFocusable(false);
Forward.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ForwardActionPerformed(evt);
}
});
Backward.setText("<-");
Backward.setDefaultCapable(false);
Backward.setFocusPainted(false);
Backward.setFocusable(false);
Backward.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
BackwardActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 319, Short.MAX_VALUE)
.addComponent(StatusLine, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 319, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(NewGame)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(Backward)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(Forward))
.addComponent(SettingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(SettingsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(NewGame)
.addComponent(Forward)
.addComponent(Backward))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 283, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(StatusLine, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
javax.swing.GroupLayout MainPanelLayout = new javax.swing.GroupLayout(MainPanel);
MainPanel.setLayout(MainPanelLayout);
MainPanelLayout.setHorizontalGroup(
MainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(MainPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(ChessBoardPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 502, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
MainPanelLayout.setVerticalGroup(
MainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, MainPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(MainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(ChessBoardPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 502, Short.MAX_VALUE))
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(MainPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(MainPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
private void ChessBoardMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ChessBoardMousePressed
if (ctrl.humansTurn()) {
int sq = cbp.eventToSquare(evt);
Move m = cbp.mousePressed(sq);
if (m != null) {
ctrl.humanMove(m);
}
}
}//GEN-LAST:event_ChessBoardMousePressed
private void FlipBoardStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_FlipBoardStateChanged
cbp.setFlipped(FlipBoard.isSelected());
}//GEN-LAST:event_FlipBoardStateChanged
private void NewGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_NewGameActionPerformed
ctrl.newGame(PlayerWhite.isSelected(), ttLogSize, true);
ctrl.startGame();
}//GEN-LAST:event_NewGameActionPerformed
private void ShowThinkingStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_ShowThinkingStateChanged
ctrl.setMoveList();
}//GEN-LAST:event_ShowThinkingStateChanged
private void BackwardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BackwardActionPerformed
ctrl.takeBackMove();
}//GEN-LAST:event_BackwardActionPerformed
private void ForwardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ForwardActionPerformed
ctrl.redoMove();
}//GEN-LAST:event_ForwardActionPerformed
private void TimeSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_TimeSliderStateChanged
ctrl.setTimeLimit();
}//GEN-LAST:event_TimeSliderStateChanged
private void ChessBoardMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ChessBoardMouseDragged
if (ctrl.humansTurn()) {
cbp.mouseDragged(evt);
}
}//GEN-LAST:event_ChessBoardMouseDragged
private void ChessBoardMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_ChessBoardMouseReleased
if (ctrl.humansTurn()) {
int sq = cbp.eventToSquare(evt);
Move m = cbp.mouseReleased(sq);
if (m != null) {
ctrl.humanMove(m);
}
}
}//GEN-LAST:event_ChessBoardMouseReleased
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton Backward;
private javax.swing.JLabel ChessBoard;
private javax.swing.JPanel ChessBoardPanel;
private javax.swing.JCheckBox FlipBoard;
private javax.swing.JButton Forward;
private javax.swing.JTextPane LogTextArea;
private javax.swing.JPanel MainPanel;
private javax.swing.JButton NewGame;
private javax.swing.JRadioButton PlayerBlack;
private javax.swing.ButtonGroup PlayerColor;
private javax.swing.JRadioButton PlayerWhite;
private javax.swing.JPanel SettingsPanel;
private javax.swing.JCheckBox ShowThinking;
private javax.swing.JTextField StatusLine;
private javax.swing.JLabel TimeLabel;
private javax.swing.JSlider TimeSlider;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration//GEN-END:variables
public void setPosition(Position pos) {
cbp.setPosition(pos);
}
public void setSelection(int sq) {
cbp.setSelection(sq);
}
public void setStatusString(String str) {
StatusLine.setText(str);
}
public void setMoveListString(String str) {
moveListStr = str;
str = moveListStr + "\n" + thinkingStr;
if (!str.equals(LogTextArea.getText())) {
LogTextArea.setText(str);
}
}
public void setThinkingString(String str) {
thinkingStr = str;
str = moveListStr + "\n" + thinkingStr;
if (!str.equals(LogTextArea.getText())) {
LogTextArea.setText(str);
}
}
public final int timeLimit() {
return Math.max(25, TimeSlider.getValue() * 1000);
}
public final boolean showThinking() {
return ShowThinking.isSelected();
}
public void requestPromotePiece() {
runOnUIThread(new Runnable() {
public void run() {
Object[] options = { "Queen", "Rook", "Bishop", "Knight" };
int choice = JOptionPane.showOptionDialog(
cbp, "Promote pawn to?", "Pawn Promotion",
0, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
ctrl.reportPromotePiece(choice);
}
});
}
public void runOnUIThread(Runnable runnable) {
SwingUtilities.invokeLater(runnable);
}
@Override
public boolean randomMode() {
return false;
}
@Override
public void reportInvalidMove(Move m) {
}
}