/* * $Id$ * * Copyright (c) 2000-2003 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.build.module.map.boardPicker; import java.awt.Component; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.OverlayLayout; import VASSAL.build.module.map.BoardPicker; import VASSAL.i18n.Resources; public class BoardSlot extends JPanel implements Icon, ActionListener { private static final long serialVersionUID = 1L; private String prompt = Resources.getString("BoardPicker.select_board"); //$NON-NLS-1$ protected BoardPicker picker; protected Board board = null; protected JComboBox boards; protected JCheckBox reverseCheckBox; public BoardSlot(BoardPicker bp) { this(bp,Resources.getString("BoardPicker.select_board")); //$NON-NLS-1$ } public BoardSlot(BoardPicker bp, String prompt) { this.prompt = prompt; picker = bp; boards = new JComboBox(); boards.addItem(prompt); final String lbn[] = picker.getAllowableLocalizedBoardNames(); for (String s : lbn) { boards.addItem(s); } boards.setSelectedIndex(lbn.length == 1 ? 1 : 0); boards.addActionListener(this); reverseCheckBox = new JCheckBox(Resources.getString("BoardPicker.flip")); //$NON-NLS-1$ reverseCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (getBoard() != null) { getBoard().setReversed(reverseCheckBox.isSelected()); picker.repaint(); } } }); reverseCheckBox.setVisible(false); setLayout(new OverlayLayout(this)); final JPanel p = new JPanel(); final Box b = Box.createHorizontalBox(); b.add(boards); b.add(reverseCheckBox); p.add(b); p.setOpaque(false); p.setAlignmentX(0.5F); final JLabel l = new JLabel(this); l.setAlignmentX(0.5F); add(p); add(l); actionPerformed(null); } public void actionPerformed(ActionEvent e) { if (prompt.equals(boards.getSelectedItem())) { setBoard(null); } else { String selectedBoard = (String) boards.getSelectedItem(); if (selectedBoard != null) { Board b = picker.getLocalizedBoard(selectedBoard); if (picker.getBoardsFromControls().contains(b)) { b = b.copy(); } setBoard(b); } } } public Board getBoard() { return board; } public void setBoard(final Board b) { board = b; if (b != null) { reverseCheckBox.setVisible("true".equals( b.getAttributeValueString(Board.REVERSIBLE))); //$NON-NLS-1$ reverseCheckBox.setSelected(b.isReversed()); board = b; setSize(getPreferredSize()); revalidate(); repaint(); // FIXME: do something in case the image fails to load /* picker.warn(Resources.getString("BoardPicker.loading", b.getLocalizedName())); //$NON-NLS-1$ final javax.swing.Timer t = new javax.swing.Timer(1000, new ActionListener() { boolean toggle = false; public void actionPerformed(ActionEvent evt) { if (toggle) { picker.warn(Resources.getString("BoardPicker.loading", b.getLocalizedName())); //$NON-NLS-1$ } else { picker.warn(Resources.getString("BoardPicker.loading2", b.getLocalizedName())); //$NON-NLS-1$ } toggle = !toggle; } }); new BackgroundTask() { public void doFirst() { // if (board != null) { // board.fixImage(); // } } public void doLater() { picker.warn(Resources.getString("BoardPicker.loaded", b.getLocalizedName())); //$NON-NLS-1$ t.stop(); setSize(getPreferredSize()); revalidate(); repaint(); } }.start(); t.start(); */ } else { reverseCheckBox.setVisible(false); // FIXME: does the order of these three matter? They're not the same above? revalidate(); setSize(getPreferredSize()); repaint(); } } // FIXME: This is confusing. The Icon should be an internal object. public int getIconHeight() { if (board != null) { return (int)(picker.getSlotScale() * board.bounds().height); } else if (this == picker.getSlot(0) || picker.getSlot(0) == null) { return picker.getDefaultSlotSize().height; } else { return picker.getSlot(0).getIconHeight(); } } public int getIconWidth() { if (board != null) { return (int)(picker.getSlotScale() * board.bounds().width); } else if (this == picker.getSlot(0) || picker.getSlot(0) == null) { return picker.getDefaultSlotSize().width; } else { return picker.getSlot(0).getIconWidth(); } } public void paintIcon(Component c, Graphics g, int x, int y) { if (board != null) { board.draw(g,x,y,picker.getSlotScale(), c); } else { g.clearRect(x,y,getIconWidth(),getIconHeight()); } } }