package gui;
import gui.PieceMakerPanel.PieceListChangedListener;
import gui.PieceMenuPanel.PieceMenuManager;
import gui.PreferenceUtility.PieceToolTipPreferenceChangedListener;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import logic.GameBuilder;
import logic.PieceBuilder;
import models.Board;
import models.Game;
import models.Piece;
import models.Rules;
import models.Square;
import rules.EndOfGame;
import rules.ObjectivePiece;
import rules.ObjectivePiece.ObjectivePieceTypes;
import utility.FileUtility;
import utility.GuiUtility;
import utility.PieceIconUtility;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import dragNdrop.AbstractDropManager;
import dragNdrop.DropAdapter;
import dragNdrop.DropEvent;
import dragNdrop.GlassPane;
import dragNdrop.MotionAdapter;
public class VariantCreationPanel extends ChessPanel implements PieceMenuManager, PieceListChangedListener
{
public VariantCreationPanel(String variantName)
{
mDropManager = new DropManager();
mGlobalGlassPane = new GlassPane();
mGlobalGlassPane.setOpaque(false);
Driver.getInstance().setGlassPane(mGlobalGlassPane);
m_motionAdapter = new MotionAdapter(mGlobalGlassPane);
mPieceListPanel = new JPanel();
mPieceListPanel.setOpaque(false);
Game gameToEdit = null;
if (variantName != null)
{
// FIXME: we shouldn't be constructing an actual Game object here;
// we should be able to get everything we need from the GameBuilder
gameToEdit = GameBuilder.newGame(variantName);
mWhiteTeam = gameToEdit.getWhiteTeam();
mBlackTeam = gameToEdit.getBlackTeam();
mWhiteRules = gameToEdit.getWhiteRules();
mBlackRules = gameToEdit.getBlackRules();
mWhitePromotionMap = gameToEdit.getWhitePromotionMap();
if (mWhitePromotionMap == null)
mWhitePromotionMap = Maps.newHashMap();
mBlackPromotionMap = gameToEdit.getBlackPromotionMap();
if (mBlackPromotionMap == null)
mBlackPromotionMap = Maps.newHashMap();
mBoardPanels = new JPanel[gameToEdit.getBoards().length];
for (int i = 0; i < mBoardPanels.length; i++)
mBoardPanels[i] = new JPanel();
mBuilder = new GameBuilder(variantName, gameToEdit.getBoards(), mWhiteTeam, mBlackTeam, mWhiteRules, mBlackRules);
}
else
{
mBuilder = new GameBuilder(Messages.getString("VariantCreationPanel.newVariant")); //$NON-NLS-1$
mWhiteTeam = Lists.newArrayList();
mBlackTeam = Lists.newArrayList();
mWhiteRules = new Rules(false);
mBlackRules = new Rules(true);
mWhitePromotionMap = Maps.newHashMap();
mBlackPromotionMap = Maps.newHashMap();
mBoardPanels = new JPanel[] { new JPanel(), new JPanel() };
mBuilder.setBlackTeam(mBlackTeam);
mBuilder.setWhiteTeam(mWhiteTeam);
}
mDisplayBoard = new Board(2, 1, false);
mPieceDisplaySquares[WHITE_INDEX] = new SquareJLabel(mDisplayBoard.getSquare(1, 1));
mPieceDisplaySquares[BLACK_INDEX] = new SquareJLabel(mDisplayBoard.getSquare(2, 1));
mOptionsFrame = new JFrame();
mOptionsFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
mScrollPane.setPreferredSize(new Dimension(200, 200));
initGUIComponents(gameToEdit, variantName);
}
private void initGUIComponents(final Game game, String variantName)
{
setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
setBorder(BorderFactory.createLoweredBevelBorder());
final JPanel showPiecePanel = new JPanel();
showPiecePanel.setLayout(new GridLayout(2, 1));
showPiecePanel.setPreferredSize(new Dimension(50, 100));
showPiecePanel.setOpaque(false);
for (SquareJLabel squareLabel : mPieceDisplaySquares)
showPiecePanel.add(squareLabel);
constraints.gridx = 5;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.insets = new Insets(0, 10, 100, 0);
add(showPiecePanel, constraints);
setupPiecesList();
for (SquareJLabel squareLabel : mPieceDisplaySquares)
{
squareLabel.addMouseListener(new PieceDisplayBoardListener(squareLabel));
squareLabel.addMouseMotionListener(m_motionAdapter);
}
mPieceDisplaySquares[WHITE_INDEX].setBackgroundColor(Color.LIGHT_GRAY);
mPieceDisplaySquares[BLACK_INDEX].setBackgroundColor(Color.getHSBColor(30, 70, 70));
if (game == null)
{
mWhiteRules.addEndOfGame(EndOfGame.CLASSIC.init(0, Messages.getString("VariantCreationPanel.empty"), false)); //$NON-NLS-1$
mBlackRules.addEndOfGame(EndOfGame.CLASSIC.init(0, Messages.getString("VariantCreationPanel.empty"), true)); //$NON-NLS-1$
mWhiteRules.setObjectivePiece(new ObjectivePiece(ObjectivePieceTypes.CLASSIC));
mBlackRules.setObjectivePiece(new ObjectivePiece(ObjectivePieceTypes.CLASSIC));
}
constraints.gridx = 1;
constraints.gridy = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.insets = new Insets(10, 10, 10, 5);
constraints.anchor = GridBagConstraints.CENTER;
add(GuiUtility.createJLabel(Messages.getString("VariantCreationPanel.variantName")), constraints); //$NON-NLS-1$
final JTextField variantNameField = new JTextField(25);
constraints.gridx = 2;
constraints.gridy = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.insets = new Insets(0, 0, 0, 0);
add(variantNameField, constraints);
Board[] temp = new Board[game == null ? 1 : game.getBoards().length];
if (game == null)
{
GuiUtility.requestFocus(variantNameField);
temp[0] = new Board(8, 8, false);
}
else
{
variantNameField.setText(variantName);
for (int i = 0; i < game.getBoards().length; i++)
{
temp[i] = game.getBoards()[i];
}
}
drawBoards(temp);
// main menu button
JButton returnToMainButton = new JButton(Messages.getString("VariantCreationPanel.returnToMainMenu")); //$NON-NLS-1$
// returnToMainButton.setToolTipText("Press to return to the Main Menu");
returnToMainButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
PreferenceUtility.clearTooltipListeners();
Driver.getInstance().revertToMainPanel();
}
});
// Create button and add ActionListener
JButton submitButton = new JButton(Messages.getString("VariantCreationPanel.saveAndQuit")); //$NON-NLS-1$
// submitButton.setToolTipText("Save a finished variant");
submitButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
if (variantNameField.getText().trim().isEmpty())
{
JOptionPane.showMessageDialog(
VariantCreationPanel.this,
Messages.getString("VariantCreationPanel.enterAName"), Messages.getString("VariantCreationPanel.enterName"), //$NON-NLS-1$ //$NON-NLS-2$
JOptionPane.PLAIN_MESSAGE);
return;
}
mWhiteRules.setGame(game);
mBlackRules.setGame(game);
mBuilder.setName(variantNameField.getText());
for (Piece piece : mWhiteTeam)
piece.setPromotesTo(mWhitePromotionMap.get(piece.getName()));
for (Piece piece : mBlackTeam)
piece.setPromotesTo(mBlackPromotionMap.get(piece.getName()));
int numberOfObjectives = 0;
if (mWhiteRules.getObjectiveName() != null && !mWhiteRules.getObjectiveName().isEmpty())
{
for (Piece piece : mWhiteTeam)
{
if (piece.getName().equals(mWhiteRules.getObjectiveName()))
numberOfObjectives++;
}
if (numberOfObjectives != 1)
{
JOptionPane.showMessageDialog(Driver.getInstance(),
Messages.getString("VariantCreationPanel.placeOneWhiteObjective"), //$NON-NLS-1$
Messages.getString("VariantCreationPanel.objectiveMissing"), JOptionPane.PLAIN_MESSAGE); //$NON-NLS-1$
return;
}
}
numberOfObjectives = 0;
if (mBlackRules.getObjectiveName() != null && !mBlackRules.getObjectiveName().isEmpty())
{
for (Piece piece : mBlackTeam)
{
if (piece.getName().equals(mBlackRules.getObjectiveName()))
numberOfObjectives++;
}
if (numberOfObjectives != 1)
{
JOptionPane.showMessageDialog(Driver.getInstance(),
Messages.getString("VariantCreationPanel.placeOneBlackObjective"), //$NON-NLS-1$
Messages.getString("VariantCreationPanel.objectiveMissing"), JOptionPane.PLAIN_MESSAGE); //$NON-NLS-1$
return;
}
}
mBuilder.setWhiteTeam(mWhiteTeam);
if (mWhiteRules.getObjectiveName() == null)
mWhiteRules.setObjectivePiece(new ObjectivePiece(ObjectivePieceTypes.CLASSIC));
mBuilder.setBlackTeam(mBlackTeam);
if (mBlackRules.getObjectiveName() == null)
mBlackRules.setObjectivePiece(new ObjectivePiece(ObjectivePieceTypes.CLASSIC));
mBuilder.writeFile(mWhiteRules, mBlackRules);
PreferenceUtility.clearTooltipListeners();
Driver.getInstance().revertToMainPanel();
}
});
mChangePromotionButton = new JButton(Messages.getString("VariantCreationPanel.promoteThisPiece")); //$NON-NLS-1$
mChangePromotionButton.setToolTipText(Messages.getString("VariantCreationPanel.pressToSetUpPromotion")); //$NON-NLS-1$
mChangePromotionButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
mOptionsFrame.dispose();
mOptionsFrame = new JFrame(Messages.getString("VariantCreationPanel.piecePromotion")); //$NON-NLS-1$
new PiecePromotionPanel((String) mPieceTypeList.getSelectedValue(), VariantCreationPanel.this, mOptionsFrame);
}
});
JButton boardSetupButton = new JButton(Messages.getString("VariantCreationPanel.customizeGameBoard")); //$NON-NLS-1$
boardSetupButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
mOptionsFrame.dispose();
mOptionsFrame = new JFrame(Messages.getString("VariantCreationPanel.customBoardSetup")); //$NON-NLS-1$
new CustomBoardPanel(VariantCreationPanel.this, mOptionsFrame);
}
});
JButton ruleSetupButton = new JButton(Messages.getString("VariantCreationPanel.setUpGameRules")); //$NON-NLS-1$
ruleSetupButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
mOptionsFrame.dispose();
mOptionsFrame = new JFrame();
new RuleMakerPanel(VariantCreationPanel.this, mOptionsFrame);
}
});
JButton playerSetupButton = new JButton(Messages.getString("VariantCreationPanel.setUpPlayerRules")); //$NON-NLS-1$
playerSetupButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
mOptionsFrame.dispose();
mOptionsFrame = new JFrame();
new CustomPlayerPanel(VariantCreationPanel.this, mOptionsFrame);
}
});
JButton pieceSetupButton = new JButton(Messages.getString("VariantCreationPanel.pieceEditor")); //$NON-NLS-1$
pieceSetupButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
mOptionsFrame.dispose();
mOptionsFrame = new JFrame();
mOptionsFrame.setLayout(new FlowLayout());
mOptionsFrame.add(new PieceMenuPanel(VariantCreationPanel.this));
mOptionsFrame.pack();
mOptionsFrame.setVisible(true);
Driver.centerFrame(mOptionsFrame);
}
});
GridBagConstraints mainPanelConstraints = new GridBagConstraints();
mPieceListPanel.setLayout(new GridBagLayout());
mainPanelConstraints.gridx = 0;
mainPanelConstraints.gridy = 0;
mainPanelConstraints.gridwidth = 2;
mPieceListPanel.add(mScrollPane, mainPanelConstraints);
mainPanelConstraints.fill = GridBagConstraints.HORIZONTAL;
mainPanelConstraints.gridx = 0;
mainPanelConstraints.gridy = 1;
mainPanelConstraints.gridwidth = 1;
mainPanelConstraints.insets = new Insets(5, 3, 3, 3);
mPieceListPanel.add(mChangePromotionButton, mainPanelConstraints);
mainPanelConstraints.gridx = 1;
mainPanelConstraints.gridy = 1;
mPieceListPanel.add(pieceSetupButton, mainPanelConstraints);
mainPanelConstraints.gridx = 0;
mainPanelConstraints.gridy = 2;
mPieceListPanel.add(boardSetupButton, mainPanelConstraints);
mainPanelConstraints.gridx = 1;
mainPanelConstraints.gridy = 2;
mPieceListPanel.add(playerSetupButton, mainPanelConstraints);
mainPanelConstraints.gridx = 0;
mainPanelConstraints.gridy = 3;
mainPanelConstraints.gridwidth = 2;
mPieceListPanel.add(ruleSetupButton, mainPanelConstraints);
JPanel optionsPanel = new JPanel();
optionsPanel.setOpaque(false);
optionsPanel.setLayout(new GridBagLayout());
mainPanelConstraints.fill = GridBagConstraints.CENTER;
mainPanelConstraints.gridx = 0;
mainPanelConstraints.gridy = 1;
mainPanelConstraints.gridwidth = 1;
optionsPanel.add(submitButton, mainPanelConstraints);
mainPanelConstraints.fill = GridBagConstraints.HORIZONTAL;
mainPanelConstraints.gridx = 1;
mainPanelConstraints.gridy = 1;
optionsPanel.add(returnToMainButton, mainPanelConstraints);
constraints.gridy = 2;
constraints.gridx = 1;
constraints.gridwidth = 2;
constraints.insets = new Insets(10, 0, 10, 5);
add(optionsPanel, constraints);
mainPanelConstraints.fill = GridBagConstraints.NONE;
mainPanelConstraints.insets = new Insets(0, 0, 0, 0);
mainPanelConstraints.gridwidth = 1;
mainPanelConstraints.gridx = 6;
mainPanelConstraints.gridy = 1;
add(mPieceListPanel, mainPanelConstraints);
}
public void drawBoards(Board[] boards)
{
// Get the set the board into the builder.
mBuilder.setBoards(boards);
mGameBoards = boards;
for (JPanel panel : mBoardPanels)
{
panel.removeAll();
remove(panel);
}
mBoardPanels = new JPanel[boards.length];
GridBagConstraints constraints = new GridBagConstraints();
List<SquareJLabel> squareLabelList = Lists.newArrayListWithExpectedSize(boards[0].getMaxRow() * boards[0].getMaxCol() * 2);
for (int boardIndex = 0, gridxConstraint = 1; boardIndex < boards.length; boardIndex++, gridxConstraint += 2)
{
// create a JPanel to hold the grid and set the layout to the number
// of squares in the board
mBoardPanels[boardIndex] = new JPanel();
mBoardPanels[boardIndex].setLayout(new GridLayout(boards[boardIndex].numRows(), boards[boardIndex].numCols()));
int numberOfRows = boards[boardIndex].numRows();
int numberOfColumns = boards[boardIndex].numCols();
for (int row = numberOfRows; row > 0; row--)
{
for (int column = 1; column <= numberOfColumns; column++)
{
Square square = boards[boardIndex].getSquare(row, column);
SquareJLabel squareLabel = new SquareJLabel(square);
if (square.isOccupied())
{
for (int i = 0; i < mPieceTypeList.getModel().getSize(); i++)
{
if (!mPieceTypeList.getModel().getElementAt(i).toString().equals(square.getPiece().getName()))
continue;
Piece platonicIdeal = null;
try
{
platonicIdeal = PieceBuilder.makePiece(mPieceTypeList.getModel().getElementAt(i).toString(), square
.getPiece().isBlack(), square, boards[boardIndex]);
}
catch (IOException e)
{
e.printStackTrace();
}
if (!square.getPiece().equals(platonicIdeal))
square.setPiece(platonicIdeal);
}
squareLabel.addMouseListener(new PieceNormalBoardListener(squareLabel));
squareLabel.addMouseMotionListener(m_motionAdapter);
}
else
{
squareLabel.addMouseListener(new SquareSetupMouseListener(squareLabel));
}
squareLabelList.add(squareLabel);
mBoardPanels[boardIndex].add(squareLabel);
squareLabel.refresh();
}
}
mBoardPanels[boardIndex].setBorder(BorderFactory.createEtchedBorder(Color.BLACK, Color.GRAY));
mBoardPanels[boardIndex].setLayout(new GridLayout(boards[boardIndex].numRows(), boards[boardIndex].numCols()));
// set the size of the grid to the number of rows and columns,
// scaled by 48, the size of the images
mBoardPanels[boardIndex].setPreferredSize(new Dimension(boards[boardIndex].numCols() * 48,
boards[boardIndex].numRows() * 48));
constraints.insets = new Insets(3, 5, 3, 10);
constraints.gridx = gridxConstraint;
constraints.gridy = 1;
constraints.gridwidth = 2;
add(mBoardPanels[boardIndex], constraints);
}
mDropManager.setComponentList(squareLabelList);
for (JPanel panel : mBoardPanels)
{
panel.revalidate();
panel.repaint();
}
Driver.getInstance().pack();
}
public void setupPiecesList()
{
// create a List with a vertical ScrollBar
final DefaultListModel list = new DefaultListModel();
Object[] standardPieces = PieceBuilder.getSet().toArray();
for (int i = 0; i < standardPieces.length; i++)
if (!list.contains(standardPieces[i]))
list.addElement(standardPieces[i]);
String[] customPieces = FileUtility.getCustomPieceArray();
for (int i = 0; i < customPieces.length; i++)
if (!list.contains(customPieces[i]))
list.addElement(customPieces[i]);
mPieceTypeList = new JList(list);
mPieceTypeList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
mPieceTypeList.setLayoutOrientation(JList.VERTICAL);
mPieceTypeList.setVisibleRowCount(-1);
mPieceTypeList.setSelectedIndex(0);
updateDisplaySquares();
ListSelectionModel selectList = mPieceTypeList.getSelectionModel();
mScrollPane.getViewport().add(mPieceTypeList, null);
selectList.addListSelectionListener(new ListSelectionListener()
{
@Override
public void valueChanged(ListSelectionEvent event)
{
updateDisplaySquares();
}
});
mPieceListPanel.revalidate();
mPieceListPanel.repaint();
Driver.getInstance().pack();
}
public GameBuilder getBuilder()
{
return mBuilder;
}
public void setBuilder(GameBuilder builder)
{
mBuilder = builder;
}
public void setWhiteRules(Rules whiteRules)
{
mWhiteRules = whiteRules;
}
public void setBlackRules(Rules blackRules)
{
mBlackRules = blackRules;
}
private final class SquareSetupMouseListener extends MouseAdapter
{
public SquareSetupMouseListener(SquareJLabel squareLabel)
{
mSquareLabel = squareLabel;
if (mSquareLabel.getSquare().isOccupied())
mSquareLabel.refresh();
}
@Override
public void mouseClicked(MouseEvent event)
{
if (mSquareLabel.getSquare().isOccupied())
{
Piece toRemove = mSquareLabel.getSquare().setPiece(null);
(toRemove.isBlack() ? mBlackTeam : mWhiteTeam).remove(toRemove);
mSquareLabel.refresh();
}
else
{
showSquareOptions();
}
}
private void showSquareOptions()
{
final JFrame popupFrame = new JFrame(Messages.getString("VariantCreationPanel.squareOptions")); //$NON-NLS-1$
popupFrame.setLocationRelativeTo(Driver.getInstance());
popupFrame.setLayout(new FlowLayout());
final ChessPanel popupPanel = new ChessPanel();
popupPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
final JButton colorChooserButton = new JButton(Messages.getString("VariantCreationPanel.setSquareColor")); //$NON-NLS-1$
colorChooserButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
Color color = JColorChooser.showDialog(popupFrame,
Messages.getString("VariantCreationPanel.chooseColor"), mSquareLabel.getColor()); //$NON-NLS-1$
if (color == null)
return;
// TODO: verify that this can be removed
// can't let them pick exactly the highlight color, or they
// could move to that space from anywhere
if (color != SquareJLabel.HIGHLIGHT_COLOR)
{
mSquareLabel.setBackgroundColor(color);
colorChooserButton.setBackground(color);
}
else
{
// the chances of this happening is EXTREMELY small...
JOptionPane.showMessageDialog(
popupFrame,
Messages.getString("VariantCreationPanel.colorCannotBeSelected"), Messages.getString("VariantCreationPanel.invalidColor"), //$NON-NLS-1$ //$NON-NLS-2$
JOptionPane.PLAIN_MESSAGE);
}
}
});
constraints.gridx = 0;
constraints.gridy = 0;
constraints.insets = new Insets(5, 5, 5, 5);
popupPanel.add(colorChooserButton, constraints);
final JCheckBox uninhabitableButton =
new JCheckBox(
"<html><font color=#FFFFFF>" + Messages.getString("VariantCreationPanel.uninhabited") + "</font></html>", !mSquareLabel.getSquare().isHabitable()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
uninhabitableButton.setOpaque(false);
constraints.gridy = 1;
popupPanel.add(uninhabitableButton, constraints);
final JButton doneButton = new JButton(Messages.getString("VariantCreationPanel.done")); //$NON-NLS-1$
doneButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent event)
{
if (uninhabitableButton.isSelected())
mSquareLabel.getSquare().setIsHabitable(false);
else
mSquareLabel.getSquare().setIsHabitable(true);
popupFrame.dispose();
}
});
constraints.gridy = 2;
constraints.insets = new Insets(10, 5, 10, 5);
popupPanel.add(doneButton, constraints);
popupFrame.add(popupPanel);
popupFrame.pack();
popupFrame.setVisible(true);
}
private SquareJLabel mSquareLabel;
}
public void putPromotionMap(String pieceName, List<String> promotesTo, int colorCode)
{
if (colorCode == GameBuilder.BLACK || colorCode == GameBuilder.BOTH)
{
mBlackPromotionMap.put(pieceName, promotesTo);
if (mBuilder.getBlackPromotionMap() == null)
mBuilder.setBlackPromotionMap(mBlackPromotionMap);
mBuilder.addToPromotionMap(pieceName, promotesTo, colorCode);
}
if (colorCode == GameBuilder.WHITE || colorCode == GameBuilder.BOTH)
{
mWhitePromotionMap.put(pieceName, promotesTo);
if (mBuilder.getWhitePromotionMap() == null)
mBuilder.setWhitePromotionMap(mWhitePromotionMap);
mBuilder.addToPromotionMap(pieceName, promotesTo, colorCode);
}
}
public Map<String, List<String>> getWhitePromotionMap()
{
return mWhitePromotionMap;
}
public Map<String, List<String>> getBlackPromotionMap()
{
return mBlackPromotionMap;
}
private final class PieceDisplayBoardListener extends DropAdapter implements MouseListener, PieceToolTipPreferenceChangedListener
{
public PieceDisplayBoardListener(SquareJLabel squareLabel)
{
super(mGlobalGlassPane);
mSquareLabel = squareLabel;
addDropListener(mDropManager);
PreferenceUtility.addPieceToolTipListener(this);
}
public void onPieceSelectionChanged()
{
mSquareLabel.refresh();
}
@Override
public void mousePressed(MouseEvent event)
{
mGlassPane.setVisible(true);
Point point = (Point) event.getPoint().clone();
SwingUtilities.convertPointToScreen(point, event.getComponent());
SwingUtilities.convertPointFromScreen(point, mGlassPane);
mGlassPane.setPoint(point);
BufferedImage image = null;
Piece piece = mSquareLabel.getSquare().getPiece();
ImageIcon imageIcon = PieceIconUtility.getPieceIcon(piece.getName(), piece.isBlack());
int width = imageIcon.getIconWidth();
int height = imageIcon.getIconHeight();
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics2D = (Graphics2D) image.getGraphics();
imageIcon.paintIcon(null, graphics2D, 0, 0);
graphics2D.dispose();
mGlassPane.setImage(image);
mGlassPane.repaint();
}
@Override
public void mouseReleased(MouseEvent event)
{
Point point = (Point) event.getPoint().clone();
SwingUtilities.convertPointToScreen(point, event.getComponent());
mGlassPane.setImage(null);
mGlassPane.setVisible(false);
fireDropEvent(new DropEvent(point, mSquareLabel), true);
}
@Override
public void mouseExited(MouseEvent event)
{
}
@Override
public void mouseEntered(MouseEvent event)
{
}
@Override
public void mouseClicked(MouseEvent event)
{
}
private final SquareJLabel mSquareLabel;
@Override
public void onPieceToolTipPreferenceChanged()
{
mSquareLabel.refresh();
}
};
private final class PieceNormalBoardListener extends DropAdapter implements MouseListener, PieceToolTipPreferenceChangedListener
{
public PieceNormalBoardListener(SquareJLabel squareLabel)
{
super(mGlobalGlassPane);
mSquareLabel = squareLabel;
addDropListener(mDropManager);
if (mSquareLabel.getSquare().getPiece() != null && PreferenceUtility.getPreference().showPieceToolTips())
mSquareLabel.setToolTipText(mSquareLabel.getSquare().getPiece().getToolTipText());
PreferenceUtility.addPieceToolTipListener(this);
}
@Override
public void mousePressed(MouseEvent event)
{
mGlassPane.setVisible(true);
Point point = (Point) event.getPoint().clone();
SwingUtilities.convertPointToScreen(point, event.getComponent());
SwingUtilities.convertPointFromScreen(point, mGlassPane);
mGlassPane.setPoint(point);
BufferedImage image = null;
String pieceName = mSquareLabel.getSquare().getPiece().getName();
FileUtility.getPieceFile(pieceName);
Piece piece = mSquareLabel.getSquare().getPiece();
ImageIcon imageIcon = PieceIconUtility.getPieceIcon(piece.getName(), piece.isBlack());
int width = imageIcon.getIconWidth();
int height = imageIcon.getIconHeight();
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics2D = (Graphics2D) image.getGraphics();
imageIcon.paintIcon(null, graphics2D, 0, 0);
graphics2D.dispose();
mGlassPane.setImage(image);
mSquareLabel.setIcon(null);
mGlassPane.repaint();
}
@Override
public void mouseReleased(MouseEvent event)
{
Point point = (Point) event.getPoint().clone();
SwingUtilities.convertPointToScreen(point, event.getComponent());
mGlassPane.setImage(null);
mGlassPane.setVisible(false);
fireDropEvent(new DropEvent(point, mSquareLabel), false);
}
public void onPieceSelectionChanged()
{
if (mSquareLabel.getSquare().getPiece() != null)
mSquareLabel.setToolTipText(mSquareLabel.getSquare().getPiece().getToolTipText());
}
@Override
public void mouseExited(MouseEvent event)
{
}
@Override
public void mouseEntered(MouseEvent event)
{
}
@Override
public void mouseClicked(MouseEvent event)
{
}
@Override
public void onPieceToolTipPreferenceChanged()
{
if (mSquareLabel.getSquare().getPiece() != null && PreferenceUtility.getPreference().showPieceToolTips())
mSquareLabel.setToolTipText(mSquareLabel.getSquare().getPiece().getToolTipText());
else
mSquareLabel.setToolTipText(null);
}
private final SquareJLabel mSquareLabel;
};
private final class DropManager extends AbstractDropManager
{
@Override
public void dropped(DropEvent event, boolean fromDisplayBoard)
{
SquareJLabel originSquareLabel = (SquareJLabel) event.getOriginComponent();
SquareJLabel destinationSquareLabel = (SquareJLabel) isInTarget(event.getDropLocation());
Piece originPiece = originSquareLabel.getSquare().getPiece();
if (originPiece == null)
return;
if (!fromDisplayBoard)
{
(originPiece.isBlack() ? mBlackTeam : mWhiteTeam).remove(originPiece);
// drag piece off board to remove it
if (destinationSquareLabel == null)
{
originSquareLabel.getSquare().setPiece(null);
for (MouseListener listener : originSquareLabel.getMouseListeners())
originSquareLabel.removeMouseListener(listener);
originSquareLabel.addMouseListener(new SquareSetupMouseListener(originSquareLabel));
originSquareLabel.refresh();
return;
}
}
if (destinationSquareLabel != null && destinationSquareLabel.getSquare().isHabitable())
{
Piece oldPiece = destinationSquareLabel.getSquare().getPiece();
if (oldPiece != null)
(oldPiece.isBlack() ? mBlackTeam : mWhiteTeam).remove(oldPiece);
int boardNumber = event.getDropLocation().getX() < mBoardPanels[0].getLocationOnScreen().getX()
+ mBoardPanels[0].getWidth() ? 0 : 1;
Piece piece = null;
try
{
piece = PieceBuilder.makePiece(originPiece.getName(), originPiece.isBlack(), destinationSquareLabel.getSquare(),
mBuilder.getBoards()[boardNumber]);
}
catch (IOException e)
{
JOptionPane.showMessageDialog(Driver.getInstance(),
Messages.getString("VariantCreationPanel.errorCouldNotLoadPiece")); //$NON-NLS-1$
e.printStackTrace();
return;
}
if (originPiece.isBlack())
mBlackTeam.add(piece);
else
mWhiteTeam.add(piece);
if (!fromDisplayBoard)
{
originSquareLabel.getSquare().setPiece(null);
originSquareLabel.refresh();
// why is there no "clear listeners"?
for (MouseListener mouseListener : originSquareLabel.getMouseListeners())
{
originSquareLabel.removeMouseListener(mouseListener);
}
originSquareLabel.addMouseListener(new SquareSetupMouseListener(originSquareLabel));
}
for (MouseListener mouseListener : destinationSquareLabel.getMouseListeners())
{
destinationSquareLabel.removeMouseListener(mouseListener);
}
destinationSquareLabel.addMouseListener(new PieceNormalBoardListener(destinationSquareLabel));
destinationSquareLabel.addMouseMotionListener(m_motionAdapter);
destinationSquareLabel.getSquare().setPiece(piece);
destinationSquareLabel.refresh();
}
else if (destinationSquareLabel != null)
{
JOptionPane
.showMessageDialog(
Driver.getInstance(),
Messages.getString("VariantCreationPanel.squareIsUninhabitable"), Messages.getString("VariantCreationPanel.warning"), //$NON-NLS-1$ //$NON-NLS-2$
JOptionPane.PLAIN_MESSAGE);
}
}
};
@Override
public void onPieceListChanged()
{
setupPiecesList();
drawBoards(mGameBoards);
updateDisplaySquares();
mOptionsFrame.pack();
Driver.centerFrame(mOptionsFrame);
}
private void updateDisplaySquares()
{
Piece whitePieceBeingDisplayed = null;
Piece blackPieceBeingDisplayed = null;
try
{
whitePieceBeingDisplayed = PieceBuilder.makePiece(mPieceTypeList.getSelectedValue().toString(), false,
mPieceDisplaySquares[WHITE_INDEX].getSquare(), mDisplayBoard);
blackPieceBeingDisplayed = PieceBuilder.makePiece(mPieceTypeList.getSelectedValue().toString(), true,
mPieceDisplaySquares[BLACK_INDEX].getSquare(), mDisplayBoard);
}
catch (IOException e)
{
JOptionPane.showMessageDialog(Driver.getInstance(), Messages.getString("VariantCreationPanel.errorCouldNotLoadPiece")); //$NON-NLS-1$
e.printStackTrace();
return;
}
mPieceDisplaySquares[WHITE_INDEX].getSquare().setPiece(whitePieceBeingDisplayed);
mPieceDisplaySquares[BLACK_INDEX].getSquare().setPiece(blackPieceBeingDisplayed);
for (SquareJLabel squareLabel : mPieceDisplaySquares)
{
squareLabel.resetColor();
squareLabel.refresh();
for (MouseListener listener : squareLabel.getMouseListeners())
{
if (listener instanceof PieceDisplayBoardListener)
((PieceDisplayBoardListener) listener).onPieceSelectionChanged();
else if (listener instanceof PieceNormalBoardListener)
((PieceNormalBoardListener) listener).onPieceSelectionChanged();
}
}
}
private static final long serialVersionUID = 7830479492072657640L;
private static final int WHITE_INDEX = 0;
private static final int BLACK_INDEX = 1;
private final GlassPane mGlobalGlassPane;
private final DropManager mDropManager;
private final SquareJLabel[] mPieceDisplaySquares = new SquareJLabel[2];
public Rules mWhiteRules;
public Rules mBlackRules;
private JPanel[] mBoardPanels;
private JPanel mPieceListPanel;
private Map<String, List<String>> mWhitePromotionMap;
private Map<String, List<String>> mBlackPromotionMap;
public GameBuilder mBuilder;
private List<Piece> mWhiteTeam;
private List<Piece> mBlackTeam;
private JButton mChangePromotionButton;
private JList mPieceTypeList;
private JFrame mOptionsFrame;
private JScrollPane mScrollPane = new JScrollPane();
private MotionAdapter m_motionAdapter;
private Board mDisplayBoard;
private Board[] mGameBoards;
@Override
public void onPieceMenuClosed()
{
mOptionsFrame.dispose();
}
@Override
public void openPieceMakerPanel(String pieceName, PieceMenuPanel panel)
{
mOptionsFrame.remove(panel);
mOptionsFrame.add(new PieceMakerPanel(pieceName, panel, mOptionsFrame));
mOptionsFrame.pack();
Driver.centerFrame(mOptionsFrame);
}
@Override
public void openPieceMakerPanel(PieceMenuPanel panel)
{
openPieceMakerPanel(null, panel);
}
@Override
public String getReturnButtonText()
{
return Messages.getString("PieceMenuPanel.returnToVariant"); //$NON-NLS-1$
}
}