// TimeLeftDialog.java
package net.sf.gogui.gui;
import java.awt.Component;
import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import static net.sf.gogui.gui.I18n.i18n;
import net.sf.gogui.game.Clock;
import net.sf.gogui.game.ConstClock;
import net.sf.gogui.game.ConstGameInfo;
import net.sf.gogui.game.ConstNode;
import net.sf.gogui.game.Game;
import net.sf.gogui.game.NodeUtil;
import net.sf.gogui.game.TimeSettings;
import net.sf.gogui.go.GoColor;
import static net.sf.gogui.go.GoColor.BLACK;
import static net.sf.gogui.go.GoColor.WHITE;
import static net.sf.gogui.go.GoColor.BLACK_WHITE;
public final class TimeLeftDialog
extends JOptionPane
{
public static void show(Component parent, Game game, ConstNode node,
MessageDialogs messageDialogs)
{
ConstGameInfo info = game.getGameInfoNode(node).getGameInfoConst();
Clock clock = null;
TimeSettings timeSettings = info.getTimeSettings();
if (timeSettings != null)
{
clock = new Clock();
clock.setTimeSettings(timeSettings);
NodeUtil.restoreClock(node, clock);
}
TimeLeftDialog timeLeftDialog = new TimeLeftDialog(clock);
JDialog dialog = timeLeftDialog.createDialog(parent,
i18n("TIT_TIME_LEFT"));
boolean done = false;
while (! done)
{
dialog.setVisible(true);
Object value = timeLeftDialog.getValue();
if (! (value instanceof Integer)
|| ((Integer)value).intValue() != JOptionPane.OK_OPTION)
return;
done = timeLeftDialog.validate(parent, messageDialogs);
}
for (GoColor c : BLACK_WHITE)
{
long timeLeft = timeLeftDialog.getTimeLeft(c);
game.setTimeLeft(node, c, timeLeft / 1000L);
int movesLeft = timeLeftDialog.getMovesLeft(c);
if (movesLeft >= 0)
game.setMovesLeft(node, c, movesLeft);
game.restoreClock();
}
dialog.dispose();
}
private static class PlayerTime
{
public Box m_box;
public JTextField m_timeLeft;
public JTextField m_movesLeft;
}
private final PlayerTime m_black;
private final PlayerTime m_white;
private TimeLeftDialog(ConstClock clock)
{
Box box = Box.createVerticalBox();
m_white = createPlayerTime(WHITE, clock);
m_white.m_box.setAlignmentX(Component.LEFT_ALIGNMENT);
box.add(m_white.m_box);
box.add(GuiUtil.createFiller());
m_black = createPlayerTime(BLACK, clock);
m_black.m_box.setAlignmentX(Component.LEFT_ALIGNMENT);
box.add(m_black.m_box);
setMessage(box);
setOptionType(OK_CANCEL_OPTION);
}
private PlayerTime createPlayerTime(GoColor c, ConstClock clock)
{
assert c.isBlackWhite();
PlayerTime playerInfo = new PlayerTime();
Box box = Box.createHorizontalBox();
JLabel label;
String tooltipTimeLeft;
String tooltipMovesLeft;
if (c == BLACK)
{
label = new JLabel(GuiUtil.getIcon("gogui-black-16x16",
i18n("LB_BLACK")));
tooltipTimeLeft = "TT_TIMELEFT_TIME_BLACK";
tooltipMovesLeft = "TT_TIMELEFT_MOVES_BLACK";
}
else
{
label = new JLabel(GuiUtil.getIcon("gogui-white-16x16",
i18n("LB_WHITE")));
tooltipTimeLeft = "TT_TIMELEFT_TIME_WHITE";
tooltipMovesLeft = "TT_TIMELEFT_MOVES_WHITE";
}
label.setAlignmentY(Component.CENTER_ALIGNMENT);
box.add(label);
box.add(GuiUtil.createFiller());
playerInfo.m_box = box;
playerInfo.m_timeLeft = new JTextField(9);
playerInfo.m_timeLeft.setToolTipText(i18n(tooltipTimeLeft));
box.add(playerInfo.m_timeLeft);
playerInfo.m_timeLeft.setHorizontalAlignment(JTextField.CENTER);
box.add(GuiUtil.createFiller());
playerInfo.m_movesLeft = new JTextField(3);
playerInfo.m_movesLeft.setHorizontalAlignment(JTextField.CENTER);
playerInfo.m_movesLeft.setToolTipText(i18n(tooltipMovesLeft));
box.add(playerInfo.m_movesLeft);
if (clock != null)
{
String timeLeft =
Clock.getTimeString(clock.getTimeLeft(c) / 1000L, -1);
playerInfo.m_timeLeft.setText(timeLeft);
if (clock.getUseByoyomi() && clock.isInByoyomi(c))
{
String movesLeft = Integer.toString(clock.getMovesLeft(c));
playerInfo.m_movesLeft.setText(movesLeft);
}
}
box.setAlignmentY(Component.CENTER_ALIGNMENT);
return playerInfo;
}
private int getMovesLeft(GoColor c)
{
JTextField textField =
(c == BLACK ? m_black.m_movesLeft : m_white.m_movesLeft);
if (isEmpty(textField))
return -1;
return Integer.parseInt(getTextFieldContent(textField));
}
private static String getTextFieldContent(JTextField textField)
{
return textField.getText().trim();
}
private long getTimeLeft(GoColor c)
{
JTextField textField =
(c == BLACK ? m_black.m_timeLeft : m_white.m_timeLeft);
long timeLeft = Clock.parseTimeString(getTextFieldContent(textField));
assert timeLeft >= 0;
return timeLeft;
}
private boolean isEmpty(JTextField textField)
{
return getTextFieldContent(textField).equals("");
}
private boolean validate(Component parent, MessageDialogs messageDialogs)
{
return (validatePosIntOrEmpty(parent, m_black.m_movesLeft,
"MSG_TIMELEFT_INVALID_MOVESLEFT",
messageDialogs)
&& validatePosIntOrEmpty(parent, m_white.m_movesLeft,
"MSG_TIMELEFT_INVALID_MOVESLEFT",
messageDialogs)
&& validateTime(parent, m_black.m_timeLeft,
"MSG_TIMELEFT_INVALID_TIMELEFT",
messageDialogs)
&& validateTime(parent, m_white.m_timeLeft,
"MSG_TIMELEFT_INVALID_TIMELEFT",
messageDialogs));
}
private boolean validatePosIntOrEmpty(Component parent,
JTextField textField,
String errorMessage,
MessageDialogs messageDialogs)
{
try
{
String content = getTextFieldContent(textField);
if (content.trim().equals(""))
return true;
int value = Integer.parseInt(content);
if (value < 0)
{
messageDialogs.showError(parent, i18n(errorMessage),
i18n("MSG_TIMELEFT_NEGATIVE_NUMBER"),
false);
return false;
}
}
catch (NumberFormatException e)
{
messageDialogs.showError(parent, i18n(errorMessage),
i18n("MSG_TIMELEFT_NO_NUMBER"),
false);
return false;
}
return true;
}
private boolean validateTime(Component parent,
JTextField textField,
String errorMessage,
MessageDialogs messageDialogs)
{
long timeLeft = Clock.parseTimeString(getTextFieldContent(textField));
if (timeLeft < 0)
{
messageDialogs.showError(parent, i18n(errorMessage),
i18n("MSG_TIMELEFT_NO_TIME"),
false);
return false;
}
return true;
}
}