// ScoreDialog.java
package net.sf.gogui.gui;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import net.sf.gogui.go.CountScore;
import net.sf.gogui.go.Komi;
import net.sf.gogui.go.Score;
import net.sf.gogui.go.Score.ScoringMethod;
import static net.sf.gogui.go.Score.ScoringMethod.AREA;
import static net.sf.gogui.go.Score.ScoringMethod.TERRITORY;
import static net.sf.gogui.gui.I18n.i18n;
/** Dialog for displaying the game score and result. */
public class ScoreDialog
extends JDialog
{
/** Callback to be called when a score was computed and accepted. */
public interface Listener
{
void actionScoreDone(Score score);
}
public ScoreDialog(Frame owner, final Listener listener,
ScoringMethod initialRules)
{
super(owner, i18n("TIT_SCORE"));
m_initialRules = initialRules;
WindowAdapter windowAdapter = new WindowAdapter() {
public void windowClosing(WindowEvent event) {
listener.actionScoreDone(null);
dispose();
}
};
addWindowListener(windowAdapter);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
setResizable(false);
Box outerBox = Box.createVerticalBox();
Box box = Box.createHorizontalBox();
outerBox.add(box);
JPanel labels = new JPanel(new GridLayout(0, 1, 0, GuiUtil.PAD));
box.add(labels);
box.add(GuiUtil.createSmallFiller());
JPanel values = new JPanel(new GridLayout(0, 1, 0, GuiUtil.PAD));
box.add(values);
m_area = createColorEntry("LB_SCORE_AREA", 3,
"TT_SCORE_AREA_BLACK",
"TT_SCORE_AREA_WHITE", labels, values);
m_territory = createColorEntry("LB_SCORE_TERRITORY", 3,
"TT_SCORE_TERRITORY_BLACK",
"TT_SCORE_TERRITORY_WHITE", labels,
values);
m_prisoners = createColorEntry("LB_SCORE_PRISONERS", 3,
"TT_SCORE_PRISONERS_BLACK",
"TT_SCORE_PRISONERS_WHITE", labels,
values);
m_komi = createKomiEntry(3, labels, values);
m_resultArea = createEntry("LB_SCORE_RESULT_AREA", 8,
"TT_SCORE_RESULT_AREA", labels, values);
m_resultTerritory = createEntry("LB_SCORE_RESULT_TERRITORY", 8,
"TT_SCORE_RESULT_TERRITORY",
labels, values);
createRulesEntry(labels, values);
m_result = createEntry("LB_SCORE_RESULT", 8,
"TT_SCORE_RESULT", labels, values);
JButton okButton = new JButton(i18n("LB_OK"));
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
listener.actionScoreDone(m_score);
} });
m_cancelButton = new JButton(i18n("LB_CANCEL"));
m_cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
listener.actionScoreDone(null);
} });
Object options[] = { okButton, m_cancelButton };
JOptionPane optionPane = new JOptionPane(outerBox,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null, options, options[0]);
setContentPane(optionPane);
pack();
}
public void showScore(CountScore countScore, Komi komi)
{
ScoringMethod rules = m_initialRules;
if (m_score != null)
rules = m_score.m_rules;
m_score = countScore.getScore(komi, rules);
showScore();
}
private static class ColorFields
{
public JTextField m_black;
public JTextField m_white;
}
private final ScoringMethod m_initialRules;
private final JButton m_cancelButton;
private final ColorFields m_territory;
private final ColorFields m_area;
private final ColorFields m_prisoners;
private final JTextField m_komi;
private final JTextField m_resultArea;
private final JTextField m_resultTerritory;
private JRadioButton m_useArea;
private JRadioButton m_useTerritory;
private final JTextField m_result;
private Score m_score;
private static final ImageIcon ICON_BLACK =
GuiUtil.getIcon("gogui-black-16x16", i18n("LB_BLACK"));
private static final ImageIcon ICON_WHITE =
GuiUtil.getIcon("gogui-white-16x16", i18n("LB_WHITE"));
private JComponent createEntryLabel(String text)
{
Box box = Box.createHorizontalBox();
box.add(Box.createHorizontalGlue());
JLabel label = new JLabel(i18n(text));
label.setAlignmentY(Component.CENTER_ALIGNMENT);
box.add(label);
return box;
}
private JTextField createEntry(String labelText, int cols, String toolTip,
JComponent labels, JComponent values)
{
labels.add(createEntryLabel(labelText));
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
JTextField field = new JTextField(cols);
GuiUtil.setEditableFalse(field);
field.setHorizontalAlignment(JTextField.CENTER);
field.setToolTipText(i18n(toolTip));
panel.add(field);
values.add(panel);
return field;
}
private ColorFields createColorEntry(String labelText, int cols,
String toolTipBlack,
String toolTipWhite,
JComponent labels,
JComponent values)
{
labels.add(createEntryLabel(labelText));
ColorFields colorFields = new ColorFields();
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
panel.add(new JLabel(ICON_BLACK));
panel.add(GuiUtil.createSmallFiller());
JTextField black = new JTextField(cols);
black.setHorizontalAlignment(JTextField.CENTER);
colorFields.m_black = black;
GuiUtil.setEditableFalse(black);
if (toolTipBlack != null)
black.setToolTipText(i18n(toolTipBlack));
panel.add(black);
panel.add(GuiUtil.createFiller());
panel.add(new JLabel(ICON_WHITE));
panel.add(GuiUtil.createSmallFiller());
JTextField white = new JTextField(cols);
white.setHorizontalAlignment(JTextField.CENTER);
colorFields.m_white = white;
GuiUtil.setEditableFalse(white);
if (toolTipWhite != null)
white.setToolTipText(i18n(toolTipWhite));
panel.add(white);
values.add(panel);
return colorFields;
}
private JTextField createKomiEntry(int cols, JComponent labels,
JComponent values)
{
labels.add(createEntryLabel("LB_SCORE_KOMI"));
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
panel.add(new JLabel(ICON_WHITE));
panel.add(GuiUtil.createSmallFiller());
JTextField field = new JTextField(cols);
field.setHorizontalAlignment(JTextField.CENTER);
GuiUtil.setEditableFalse(field);
field.setToolTipText(i18n("TT_SCORE_KOMI"));
panel.add(field);
values.add(panel);
return field;
}
private void createRulesEntry(JComponent labels, JComponent values)
{
labels.add(createEntryLabel("LB_SCORE_METHOD"));
JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
ButtonGroup group = new ButtonGroup();
m_useArea = new JRadioButton(i18n("LB_SCORE_METHOD_AREA"));
m_useArea.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_score != null)
{
m_score.updateRules(AREA);
showScore();
}
}
});
m_useArea.setToolTipText(i18n("TT_SCORE_METHOD_AREA"));
group.add(m_useArea);
panel.add(m_useArea);
panel.add(GuiUtil.createFiller());
m_useTerritory = new JRadioButton(i18n("LB_SCORE_METHOD_TERRITORY"));
m_useTerritory.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (m_score != null)
{
m_score.updateRules(TERRITORY);
showScore();
}
}
});
m_useTerritory.setToolTipText(i18n("TT_SCORE_METHOD_TERRITORY"));
group.add(m_useTerritory);
panel.add(m_useTerritory);
values.add(panel);
}
private static void setTextInteger(JTextField field, int value)
{
field.setText(Integer.toString(value));
}
private void showScore()
{
if (m_score == null)
return;
setTextInteger(m_territory.m_black, m_score.m_territoryBlack);
setTextInteger(m_territory.m_white, m_score.m_territoryWhite);
setTextInteger(m_area.m_black, m_score.m_areaBlack);
setTextInteger(m_area.m_white, m_score.m_areaWhite);
setTextInteger(m_prisoners.m_black, m_score.m_capturedWhite);
setTextInteger(m_prisoners.m_white, m_score.m_capturedBlack);
if (m_score.m_komi != null)
m_komi.setText(m_score.m_komi.toString());
double resultArea = m_score.m_resultArea;
m_resultArea.setText(Score.formatResult(resultArea));
double resultTerritory = m_score.m_resultTerritory;
m_resultTerritory.setText(Score.formatResult(resultTerritory));
if (m_score.m_rules == TERRITORY)
m_useTerritory.setSelected(true);
else
{
assert m_score.m_rules == AREA;
m_useArea.setSelected(true);
}
m_result.setText(m_score.formatResult());
}
}