package gui; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.URL; import java.util.Set; import javax.imageio.ImageIO; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.filechooser.FileFilter; import logic.BidirectionalMovement; import logic.GameBuilder; import logic.PieceBuilder; import logic.PieceMovements; import logic.PieceMovements.MovementDirection; import models.Piece; import utility.FileUtility; import utility.GuiUtility; import utility.ImageUtility; public class PieceMakerPanel extends ChessPanel { public interface PieceListChangedListener { public void onPieceListChanged(); } public PieceMakerPanel(PieceMenuPanel menuPanel, JFrame frame) { mLeaperCheckBox = new JCheckBox(Messages.getString("PieceMakerPanel.canJump"), false); //$NON-NLS-1$ mPieceNameField = new JTextField(15); mNorthField = new JTextField(4); mNorthEastField = new JTextField(4); mEastField = new JTextField(4); mSouthEastField = new JTextField(4); mSouthField = new JTextField(4); mSouthWestField = new JTextField(4); mWestField = new JTextField(4); mNorthWestField = new JTextField(4); mRowMovementField = new JTextField(4); mColMovementField = new JTextField(4); mBidirectionalMovementComboBox = new JComboBox(); mDefaultComboBoxModel = new DefaultComboBoxModel(); mBidirectionalMovementComboBox.setModel(mDefaultComboBoxModel); mDefaultComboBoxModel.addListDataListener(mBidirectionalMovementComboBox); mAddBidirectionalMoveButton = new JButton(Messages.getString("PieceMakerPanel.add")); //$NON-NLS-1$ mRemoveBidirectionalMoveButton = new JButton(Messages.getString("PieceMakerPanel.remove")); //$NON-NLS-1$ new PieceMakerPanel(null, menuPanel, frame); } public PieceMakerPanel(String pieceName, PieceMenuPanel menuPanel, JFrame frame) { mFrame = frame; mPieceMenuPanel = menuPanel; mLeaperCheckBox = new JCheckBox(Messages.getString("PieceMakerPanel.canJump"), false); //$NON-NLS-1$ mLeaperCheckBox.setOpaque(false); mLeaperCheckBox.setForeground(Color.white); mPieceNameField = new JTextField(15); mNorthField = new JTextField(4); mNorthEastField = new JTextField(4); mEastField = new JTextField(4); mSouthEastField = new JTextField(4); mSouthField = new JTextField(4); mSouthWestField = new JTextField(4); mWestField = new JTextField(4); mNorthWestField = new JTextField(4); mRowMovementField = new JTextField(4); mColMovementField = new JTextField(4); mAddBidirectionalMoveButton = new JButton(Messages.getString("PieceMakerPanel.add")); //$NON-NLS-1$ mRemoveBidirectionalMoveButton = new JButton(Messages.getString("PieceMakerPanel.remove")); //$NON-NLS-1$ PieceBuilder.initPieceTypes(); PieceBuilder builder = null; if (pieceName != null) builder = PieceBuilder.loadFromDisk(pieceName); mBidirectionalMovementComboBox = new JComboBox(); mDefaultComboBoxModel = new DefaultComboBoxModel(); mBidirectionalMovementComboBox.setModel(mDefaultComboBoxModel); mDefaultComboBoxModel.addListDataListener(mBidirectionalMovementComboBox); if (builder != null) { Set<BidirectionalMovement> bidirectionalMovements = builder.getPieceMovements().getBidirectionalMovements(); for (BidirectionalMovement movement : bidirectionalMovements) mBidirectionalMovementComboBox.addItem(movement); if (mBidirectionalMovementComboBox.getItemCount() != 0) mBidirectionalMovementComboBox.setSelectedIndex(0); else mBidirectionalMovementComboBox.setEnabled(false); } else { mBidirectionalMovementComboBox.setEnabled(false); } initGUIComponents(builder); } private void initGUIComponents(PieceBuilder builder) { if (builder == null) mBuilder = new PieceBuilder(); else mBuilder = builder; setSize(550, 875); setLayout(new GridBagLayout()); GridBagConstraints constraints = new GridBagConstraints(); JPanel pieceCreationPanel = new JPanel(); pieceCreationPanel.setOpaque(false); pieceCreationPanel.setLayout(new GridBagLayout()); JPanel namePanel = new JPanel(); namePanel.setOpaque(false); namePanel.setLayout(new FlowLayout()); namePanel.add(GuiUtility.createJLabel(Messages.getString("PieceMakerPanel.pieceName"))); //$NON-NLS-1$ mPieceNameField.setToolTipText(Messages.getString("PieceMakerPanel.enterNameOfNewPiece")); //$NON-NLS-1$ if (builder != null) mPieceNameField.setText(builder.getName()); GuiUtility.requestFocus(mPieceNameField); namePanel.add(mPieceNameField); constraints.gridx = 0; constraints.gridy = 0; pieceCreationPanel.add(namePanel, constraints); ImageIcon blankSquare = null; try { blankSquare = GuiUtility.createImageIcon(48, 48, "/WhiteSquare.png"); //$NON-NLS-1$ } catch (IOException e4) { e4.printStackTrace(); } blankSquare.setImage(blankSquare.getImage().getScaledInstance(48, 48, Image.SCALE_SMOOTH)); final JPanel lightIconPanel = new JPanel(); lightIconPanel.setLayout(new FlowLayout()); lightIconPanel.setOpaque(false); final JLabel lightIconLabel = GuiUtility.createJLabel(""); //$NON-NLS-1$ lightIconLabel.setSize(48, 48); try { lightIconLabel.setIcon(builder == null ? blankSquare : ImageUtility.getLightImage(builder.getName())); } catch (IOException e3) { e3.printStackTrace(); } if (builder != null) { try { mLightImage = GuiUtility.createBufferedImage(48, 48, "l_" + builder.getName() + ".png"); //$NON-NLS-1$ //$NON-NLS-2$ mDarkImage = GuiUtility.createBufferedImage(48, 48, "d_" + builder.getName() + ".png"); //$NON-NLS-1$ //$NON-NLS-2$ } catch (IOException e1) { e1.printStackTrace(); } } final JButton lightImageButton = new JButton(Messages.getString("PieceMakerPanel.chooseLightImage")); //$NON-NLS-1$ lightImageButton.setToolTipText(Messages.getString("PieceMakerPanel.clickForLight")); //$NON-NLS-1$ lightImageButton.addActionListener(new ImageButtonActionListener(lightIconLabel, false)); lightIconPanel.add(lightImageButton); lightIconPanel.add(lightIconLabel); constraints.gridx = 0; constraints.gridy = 3; pieceCreationPanel.add(lightIconPanel, constraints); final JPanel darkIconPanel = new JPanel(); darkIconPanel.setLayout(new FlowLayout()); darkIconPanel.setOpaque(false); final JLabel darkIconLabel = GuiUtility.createJLabel(""); //$NON-NLS-1$ darkIconLabel.setSize(48, 48); try { darkIconLabel.setIcon(builder == null ? blankSquare : ImageUtility.getDarkImage(builder.getName())); } catch (IOException e2) { e2.printStackTrace(); } final JButton darkImageButton = new JButton(Messages.getString("PieceMakerPanel.chooseDark")); //$NON-NLS-1$ darkImageButton.setToolTipText(Messages.getString("PieceMakerPanel.clickForDark")); //$NON-NLS-1$ darkImageButton.addActionListener(new ImageButtonActionListener(darkIconLabel, true)); darkIconPanel.add(darkImageButton); darkIconPanel.add(darkIconLabel); constraints.gridx = 0; constraints.gridy = 2; pieceCreationPanel.add(darkIconPanel, constraints); PieceMovements movements = builder == null ? null : builder.getPieceMovements(); mNorthField.setToolTipText(Messages.getString("PieceMakerPanel.north")); //$NON-NLS-1$ mNorthField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.NORTH)); //$NON-NLS-1$ //$NON-NLS-2$ mNorthEastField.setToolTipText(Messages.getString("PieceMakerPanel.northEast")); //$NON-NLS-1$ mNorthEastField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.NORTHEAST)); //$NON-NLS-1$ //$NON-NLS-2$ mNorthWestField.setToolTipText(Messages.getString("PieceMakerPanel.northwest")); //$NON-NLS-1$ mNorthWestField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.NORTHWEST)); //$NON-NLS-1$ //$NON-NLS-2$ mEastField.setToolTipText(Messages.getString("PieceMakerPanel.east")); //$NON-NLS-1$ mEastField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.EAST)); //$NON-NLS-1$ //$NON-NLS-2$ mSouthEastField.setToolTipText(Messages.getString("PieceMakerPanel.southEast")); //$NON-NLS-1$ mSouthEastField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.SOUTHEAST)); //$NON-NLS-1$ //$NON-NLS-2$ mSouthField.setToolTipText(Messages.getString("PieceMakerPanel.south")); //$NON-NLS-1$ mSouthField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.SOUTH)); //$NON-NLS-1$ //$NON-NLS-2$ mSouthWestField.setToolTipText(Messages.getString("PieceMakerPanel.southWest")); //$NON-NLS-1$ mSouthWestField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.SOUTHWEST)); //$NON-NLS-1$ //$NON-NLS-2$ mWestField.setToolTipText(Messages.getString("PieceMakerPanel.west")); //$NON-NLS-1$ mWestField.setText(builder == null ? "0" : "" + movements.getDistance(MovementDirection.WEST)); //$NON-NLS-1$ //$NON-NLS-2$ JLabel movementPictureHolder = null; try { movementPictureHolder = GuiUtility.createJLabel(GuiUtility.createImageIcon(130, 130, "/movement_directions.png")); //$NON-NLS-1$ } catch (IOException e1) { e1.printStackTrace(); } JPanel movement = new JPanel(); movement.setLayout(new GridBagLayout()); movement.setOpaque(false); constraints.gridx = 0; constraints.gridy = 0; constraints.weightx = 1; constraints.anchor = GridBagConstraints.EAST; movement.add(mNorthWestField, constraints); constraints.gridx = 1; constraints.anchor = GridBagConstraints.CENTER; movement.add(mNorthField, constraints); constraints.gridx = 2; constraints.anchor = GridBagConstraints.WEST; movement.add(mNorthEastField, constraints); constraints.gridx = 0; constraints.gridy = 1; constraints.anchor = GridBagConstraints.EAST; movement.add(mWestField, constraints); constraints.gridx = 1; constraints.anchor = GridBagConstraints.CENTER; movement.add(movementPictureHolder, constraints); constraints.gridx = 2; constraints.anchor = GridBagConstraints.WEST; movement.add(mEastField, constraints); constraints.gridx = 0; constraints.gridy = 2; constraints.anchor = GridBagConstraints.EAST; movement.add(mSouthWestField, constraints); constraints.gridx = 1; constraints.anchor = GridBagConstraints.CENTER; movement.add(mSouthField, constraints); constraints.gridx = 2; constraints.anchor = GridBagConstraints.WEST; movement.add(mSouthEastField, constraints); final JTextField distanceField = new JTextField(3); distanceField.setToolTipText(Messages.getString("PieceMakerPanel.greatestSpaces")); //$NON-NLS-1$ mRowMovementField.setToolTipText(Messages.getString("PieceMakerPanel.enterKnightLike")); //$NON-NLS-1$ mColMovementField.setToolTipText(Messages.getString("PieceMakerPanel.enterOtherDirection")); //$NON-NLS-1$ mRowMovementField.addKeyListener(getBidirectionalFieldKeyListener()); mColMovementField.addKeyListener(getBidirectionalFieldKeyListener()); mAddBidirectionalMoveButton.setEnabled(false); mAddBidirectionalMoveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { mBidirectionalMovementComboBox.setEnabled(true); mRemoveBidirectionalMoveButton.setEnabled(true); BidirectionalMovement toAdd = new BidirectionalMovement(Integer.parseInt(mRowMovementField.getText()), Integer.parseInt(mColMovementField.getText())); if (mDefaultComboBoxModel.getIndexOf(toAdd) == -1) { mDefaultComboBoxModel.addElement(toAdd); } mRowMovementField.setText(""); //$NON-NLS-1$ mColMovementField.setText(""); //$NON-NLS-1$ mAddBidirectionalMoveButton.setEnabled(false); } }); mRemoveBidirectionalMoveButton.setEnabled(mDefaultComboBoxModel.getSize() != 0); mRemoveBidirectionalMoveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mDefaultComboBoxModel.removeElement(mDefaultComboBoxModel.getSelectedItem()); mBidirectionalMovementComboBox.setEnabled(mDefaultComboBoxModel.getSize() != 0); mRemoveBidirectionalMoveButton.setEnabled(mDefaultComboBoxModel.getSize() != 0); } }); mLeaperCheckBox.setToolTipText(Messages.getString("PieceMakerPanel.pressForJump")); //$NON-NLS-1$ if (builder != null) mLeaperCheckBox.setSelected(builder.canJump()); final JPanel bidirectionalMovementPanel = new JPanel(); bidirectionalMovementPanel.setOpaque(false); bidirectionalMovementPanel.setToolTipText(Messages.getString("PieceMakerPanel.useForKnight")); //$NON-NLS-1$ bidirectionalMovementPanel.setLayout(new GridBagLayout()); constraints.anchor = GridBagConstraints.CENTER; constraints.insets = new Insets(1, 1, 1, 1); constraints.gridx = 0; constraints.gridy = 0; constraints.gridheight = 1; constraints.gridwidth = 1; bidirectionalMovementPanel.add(mBidirectionalMovementComboBox, constraints); final JPanel inputPanel = new JPanel(); inputPanel.setOpaque(false); inputPanel.setLayout(new GridBagLayout()); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 0; constraints.gridy = 0; constraints.gridheight = 1; constraints.gridwidth = 1; inputPanel.add(mRowMovementField, constraints); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 1; constraints.gridy = 0; constraints.gridheight = 1; constraints.gridwidth = 1; inputPanel.add(GuiUtility.createJLabel(Messages.getString("PieceMakerPanel.51")), constraints); //$NON-NLS-1$ constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 2; constraints.gridy = 0; constraints.gridheight = 1; constraints.gridwidth = 1; inputPanel.add(mColMovementField, constraints); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 1; constraints.gridy = 0; constraints.gridheight = 1; constraints.gridwidth = 1; bidirectionalMovementPanel.add(inputPanel, constraints); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 0; constraints.gridy = 1; constraints.gridheight = 1; constraints.gridwidth = 1; constraints.insets = new Insets(10, 0, 10, 0); bidirectionalMovementPanel.add(mRemoveBidirectionalMoveButton, constraints); constraints.anchor = GridBagConstraints.CENTER; constraints.gridx = 1; constraints.gridy = 1; constraints.gridheight = 1; constraints.gridwidth = 1; bidirectionalMovementPanel.add(mAddBidirectionalMoveButton, constraints); JPanel movementPanel = new JPanel(); movementPanel.setOpaque(false); movementPanel.setLayout(new BoxLayout(movementPanel, BoxLayout.Y_AXIS)); movementPanel.setLayout(new GridBagLayout()); constraints.insets = new Insets(5, 0, 5, 0); constraints.gridx = 0; constraints.gridy = 0; constraints.anchor = GridBagConstraints.CENTER; movementPanel.add(GuiUtility.createJLabel(Messages.getString("PieceMakerPanel.normalMovementHTML")), constraints); //$NON-NLS-1$ constraints.insets = new Insets(5, 0, 0, 0); constraints.gridx = 0; constraints.gridy = 1; constraints.gridwidth = 2; movementPanel.add(movement, constraints); constraints.insets = new Insets(5, 0, 0, 0); constraints.gridx = 0; constraints.gridy = 5; movementPanel.add(mLeaperCheckBox, constraints); constraints.insets = new Insets(5, 0, 0, 0); constraints.insets = new Insets(5, 0, 5, 0); constraints.gridx = 0; constraints.gridy = 6; movementPanel.add(GuiUtility.createJLabel(Messages.getString("PieceMakerPanel.knightLikeMovementHTML")), constraints); //$NON-NLS-1$ constraints.gridx = 0; constraints.gridy = 7; movementPanel.add(bidirectionalMovementPanel, constraints); constraints.gridx = 0; constraints.gridy = 5; pieceCreationPanel.add(movementPanel, constraints); final JButton savePieceButton = new JButton(Messages.getString("PieceMakerPanel.saveAndReturn")); //$NON-NLS-1$ savePieceButton.setToolTipText(Messages.getString("PieceMakerPanel.pressToSave")); //$NON-NLS-1$ savePieceButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { String pieceName = mPieceNameField.getText().trim(); if (pieceName.isEmpty() || PieceBuilder.isPieceType(mPieceNameField.getText())) { JOptionPane.showMessageDialog( PieceMakerPanel.this, Messages.getString("PieceMakerPanel.enterUniqueName"), Messages.getString("PieceMakerPanel.invalidPieceName"), //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.PLAIN_MESSAGE); return; } if (isIntegerDistance(mNorthField) && isIntegerDistance(mNorthEastField) && isIntegerDistance(mNorthWestField) && isIntegerDistance(mEastField) && isIntegerDistance(mWestField) && isIntegerDistance(mSouthField) && isIntegerDistance(mSouthEastField) && isIntegerDistance(mSouthWestField)) { mBuilder.addMovement(MovementDirection.NORTH, Integer.parseInt(mNorthField.getText())); mBuilder.addMovement(MovementDirection.NORTHEAST, Integer.parseInt(mNorthEastField.getText())); mBuilder.addMovement(MovementDirection.NORTHWEST, Integer.parseInt(mNorthWestField.getText())); mBuilder.addMovement(MovementDirection.EAST, Integer.parseInt(mEastField.getText())); mBuilder.addMovement(MovementDirection.WEST, Integer.parseInt(mWestField.getText())); mBuilder.addMovement(MovementDirection.SOUTH, Integer.parseInt(mSouthField.getText())); mBuilder.addMovement(MovementDirection.SOUTHEAST, Integer.parseInt(mSouthEastField.getText())); mBuilder.addMovement(MovementDirection.SOUTHWEST, Integer.parseInt(mSouthWestField.getText())); } if (mDefaultComboBoxModel.getSize() != 0) { for (int i = 0; i < mBidirectionalMovementComboBox.getItemCount(); i++) { mBuilder.addBidirectionalMovement((BidirectionalMovement) mBidirectionalMovementComboBox.getItemAt(i)); } } try { ImageUtility.writeLightImage(pieceName, mLightImage); ImageUtility.writeDarkImage(pieceName, mDarkImage); } catch (Exception e) { JOptionPane.showMessageDialog( PieceMakerPanel.this, Messages.getString("PieceMakerPanel.cannotWriteImageFiles"), Messages.getString("PieceMakerPanel.ImageError"), JOptionPane.PLAIN_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ return; } mBuilder.setName(pieceName); mBuilder.setCanJump(mLeaperCheckBox.isSelected()); PieceBuilder.savePieceType(mBuilder); PieceBuilder.writeToDisk(mBuilder); refreshVariants(); mPieceMenuPanel.refreshList(); if (mFrame instanceof Driver) Driver.getInstance().popPanel(); else { mFrame.remove(PieceMakerPanel.this); mFrame.add(mPieceMenuPanel); mFrame.pack(); Driver.centerFrame(mFrame); } } }); final JButton cancelButton = new JButton(Messages.getString("PieceMakerPanel.cancel")); //$NON-NLS-1$ cancelButton.setToolTipText(Messages.getString("PieceMakerPanel.pressToReturn")); //$NON-NLS-1$ cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { if (mPieceNameField.getText().trim().isEmpty()) { if (mFrame instanceof Driver) Driver.getInstance().popPanel(); else { mFrame.remove(PieceMakerPanel.this); mFrame.add(mPieceMenuPanel); mFrame.pack(); Driver.centerFrame(mFrame); } } else { switch (JOptionPane.showConfirmDialog(PieceMakerPanel.this, Messages.getString("PieceMakerPanel.ifYouContinue"), Messages.getString("PieceMakerPanel.pieceMaker"), //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE)) { case JOptionPane.YES_OPTION: mFrame.remove(PieceMakerPanel.this); mFrame.add(mPieceMenuPanel); mFrame.pack(); Driver.centerFrame(mFrame); break; case JOptionPane.NO_OPTION: break; } } } }); constraints.gridx = 0; constraints.gridy = 0; add(pieceCreationPanel, constraints); constraints.gridwidth = 1; constraints.gridx = 0; constraints.gridy = 7; add(cancelButton, constraints); constraints.gridx = 1; constraints.gridy = 7; add(savePieceButton, constraints); mFrame.pack(); mFrame.setVisible(true); } /** * Once a piece has been changed, we need to update any variants that use * this piece to use the new version. */ private void refreshVariants() { String[] vars = FileUtility.getVariantsFileArray(); for (String s : vars) { try { File variantFile = FileUtility.getVariantsFile(s); ObjectInputStream in = new ObjectInputStream(new FileInputStream(variantFile)); GameBuilder builder = (GameBuilder) in.readObject(); for (Piece piece : builder.getWhiteTeam()) { if (piece.getName().equals(mPieceNameField.getText())) piece = PieceBuilder.makePiece(piece.getName(), false, piece.getOriginalSquare(), piece.getBoard()); } for (Piece piece : builder.getBlackTeam()) { if (piece.getName().equals(mPieceNameField.getText())) piece = PieceBuilder.makePiece(piece.getName(), true, piece.getOriginalSquare(), piece.getBoard()); } in.close(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(variantFile)); out.writeObject(builder); out.close(); } catch (Exception e) { e.printStackTrace(); } } } private boolean isIntegerDistance(JTextField textField) { if (textField.getText().equals("")) //$NON-NLS-1$ return false; try { Integer.parseInt(textField.getText()); return true; } catch (Exception e) { JOptionPane .showMessageDialog( PieceMakerPanel.this, Messages.getString("PieceMakerPanel.allMovementDist") + textField.getToolTipText() //$NON-NLS-1$ + Messages.getString("PieceMakerPanel.directionBox"), Messages.getString("PieceMakerPanel.error"), JOptionPane.PLAIN_MESSAGE); //$NON-NLS-1$ //$NON-NLS-2$ return false; } } private KeyListener getBidirectionalFieldKeyListener() { return new KeyListener() { @Override public void keyTyped(KeyEvent arg0) { } @Override public void keyReleased(KeyEvent arg0) { mAddBidirectionalMoveButton.setEnabled(isIntegerDistance(mRowMovementField) && isIntegerDistance(mColMovementField)); } @Override public void keyPressed(KeyEvent arg0) { } }; } private final class ImageButtonActionListener implements ActionListener { public ImageButtonActionListener(JLabel imageLabel, boolean isDarkImage) { m_imageLabel = imageLabel; m_isDarkImage = isDarkImage; } @Override public void actionPerformed(ActionEvent event) { Object[] options = new String[] { Messages.getString("PieceMakerPanel.browseComputer"), Messages.getString("PieceMakerPanel.imageFromInternet"), Messages.getString("PieceMakerPanel.cancel") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ switch (JOptionPane.showOptionDialog(PieceMakerPanel.this, Messages.getString("PieceMakerPanel.whereFrom"), Messages.getString("PieceMakerPanel.chooseImage"), //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0])) { case JOptionPane.YES_OPTION: JFileChooser fileChooser = new JFileChooser("~/"); //$NON-NLS-1$ fileChooser.setFileFilter(new FileFilter() { @Override public String getDescription() { return "PNG Files"; //$NON-NLS-1$ } @Override public boolean accept(File f) { if (f.isDirectory() || f.getName().endsWith(".png")) //$NON-NLS-1$ return true; else return false; } }); if (fileChooser.showOpenDialog(PieceMakerPanel.this) == JFileChooser.APPROVE_OPTION) { try { if (m_isDarkImage) { mDarkImage = ImageIO.read(fileChooser.getSelectedFile()); m_imageLabel.setIcon(new ImageIcon(mDarkImage.getScaledInstance(48, 48, Image.SCALE_SMOOTH))); } else { mLightImage = ImageIO.read(fileChooser.getSelectedFile()); m_imageLabel.setIcon(new ImageIcon(mLightImage.getScaledInstance(48, 48, Image.SCALE_SMOOTH))); } } catch (IOException e) { // TODO we should show the user an error message if this // fails e.printStackTrace(); } } break; case JOptionPane.NO_OPTION: String url = JOptionPane.showInputDialog(PieceMakerPanel.this, Messages.getString("PieceMakerPanel.enterURL"), Messages.getString("PieceMakerPanel.inputURL"), //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.PLAIN_MESSAGE); try { if (m_isDarkImage) { mDarkImage = ImageIO.read(new URL(url)); m_imageLabel.setIcon(new ImageIcon(mDarkImage.getScaledInstance(48, 48, Image.SCALE_SMOOTH))); } else { mLightImage = ImageIO.read(new URL(url)); m_imageLabel.setIcon(new ImageIcon(mLightImage.getScaledInstance(48, 48, Image.SCALE_SMOOTH))); } } catch (Exception e) { e.printStackTrace(); } break; case JOptionPane.CANCEL_OPTION: break; } } private final boolean m_isDarkImage; private JLabel m_imageLabel; } private static final long serialVersionUID = -6530771731937840358L; private final JTextField mPieceNameField; private final JCheckBox mLeaperCheckBox; private final JTextField mNorthField; private final JTextField mNorthEastField; private final JTextField mEastField; private final JTextField mSouthEastField; private final JTextField mSouthField; private final JTextField mSouthWestField; private final JTextField mWestField; private final JTextField mNorthWestField; private final JTextField mRowMovementField; private final JTextField mColMovementField; private final JComboBox mBidirectionalMovementComboBox; private final JButton mAddBidirectionalMoveButton; private final JButton mRemoveBidirectionalMoveButton; private final DefaultComboBoxModel mDefaultComboBoxModel; private PieceBuilder mBuilder; private PieceMenuPanel mPieceMenuPanel; private BufferedImage mLightImage; private BufferedImage mDarkImage; private JFrame mFrame; }