/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.client.gui.panel; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.List; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.DefaultListModel; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.ListCellRenderer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.PanelUI; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.client.gui.i18n.Messages; import net.sf.freecol.client.gui.plaf.FreeColSelectedPanelUI; import net.sf.freecol.common.model.StringTemplate; import net.sf.freecol.common.model.Unit; /** * Centers the map on a known settlement or colony. Pressing ENTER * opens a panel if appropriate. */ public final class EndTurnDialog extends FreeColDialog<Boolean> implements ListSelectionListener { @SuppressWarnings("unused") private static final Logger logger = Logger.getLogger(FindSettlementDialog.class.getName()); private JList unitList; /** * We need to wrap the Unit class in order to make the JList * support keystroke navigation. JList.getNextMatch uses the * toString() method, but the toString() method of FreeCol objects * provides debugging information rather than a searchable name. */ public class UnitWrapper { public Unit unit; public String name; public String location; public UnitWrapper(Unit unit) { this.unit = unit; name = Messages.message(Messages.getLabel(unit)); location = Messages.message(unit.getLocation().getLocationName()); } public Unit getUnit() { return unit; } public String toString() { return name; } } /** * The constructor to use. */ @SuppressWarnings("unchecked") // FIXME in Java7 public EndTurnDialog(FreeColClient freeColClient, GUI gui, List<Unit> units) { super(freeColClient, gui); setLayout(new MigLayout("wrap 1", "[align center]")); JLabel header = new JLabel(Messages.message("endTurnDialog.name")); header.setFont(smallHeaderFont); StringTemplate t = StringTemplate.template("endTurnDialog.areYouSure") .addAmount("%number%", units.size()); DefaultListModel model = new DefaultListModel(); for (Unit unit : units) { model.addElement(new UnitWrapper(unit)); } unitList = new JList(model); unitList.setCellRenderer(new UnitCellRenderer()); unitList.setFixedCellHeight(48); JScrollPane listScroller = new JScrollPane(unitList); listScroller.setPreferredSize(new Dimension(250, 250)); unitList.addListSelectionListener(this); Action selectAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { selectUnit(); } }; Action quitAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { EndTurnDialog.this.setResponse(Boolean.FALSE); } }; unitList.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "select"); unitList.getActionMap().put("select", selectAction); unitList.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), "quit"); unitList.getActionMap().put("quit", quitAction); MouseListener mouseListener = new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { selectUnit(); } } }; unitList.addMouseListener(mouseListener); add(header); add(getDefaultTextArea(Messages.message(t)), "newline 30"); add(listScroller, "width max(200, 100%), height max(300, 100%), newline 20"); add(cancelButton, "newline 20, span, split 2, tag cancel"); add(okButton, "tag ok"); restoreSavedSize(getPreferredSize()); } private void selectUnit() { UnitWrapper wrapper = (UnitWrapper) unitList.getSelectedValue(); if (wrapper != null && wrapper.getUnit() != null) { Unit unit = wrapper.getUnit(); if (unit.getColony() != null) { getGUI().showColonyPanel(unit.getColony()); } else if (unit.isInEurope()) { getGUI().showEuropePanel(); } } } /** * {@inheritDoc} */ @Override public void requestFocus() { unitList.requestFocus(); } /** * This function analyses an event and calls the right methods to take care * of the user's requests. * * @param e a <code>ListSelectionEvent</code> value */ public void valueChanged(ListSelectionEvent e) { Unit unit = ((UnitWrapper) unitList.getSelectedValue()).unit; if (unit != null && unit.getTile() != null) { getGUI().setFocus(unit.getTile()); } } /** * {@inheritDoc} */ @Override public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if (OK.equals(command)) { setResponse(Boolean.TRUE); } else if (CANCEL.equals(command)) { setResponse(Boolean.FALSE); } else { super.actionPerformed(event); } } private class UnitCellRenderer implements ListCellRenderer { JPanel itemPanel = new JPanel(); JPanel selectedPanel = new JPanel(); JLabel imageLabel = new JLabel(); JLabel nameLabel = new JLabel(); JLabel locationLabel = new JLabel(); public UnitCellRenderer() { itemPanel.setOpaque(false); itemPanel.setLayout(new MigLayout("", "[60]")); selectedPanel.setOpaque(false); selectedPanel.setLayout(new MigLayout("", "[60]")); selectedPanel.setUI((PanelUI) FreeColSelectedPanelUI.createUI(selectedPanel)); locationLabel.setFont(locationLabel.getFont().deriveFont(Font.ITALIC)); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { UnitWrapper unit = (UnitWrapper) value; JPanel panel = isSelected ? selectedPanel : itemPanel; panel.removeAll(); imageLabel.setIcon(getLibrary().getUnitImageIcon(unit.unit, 0.5)); nameLabel.setText(unit.name); locationLabel.setText(unit.location); panel.add(imageLabel, "center"); panel.add(nameLabel, "split 2, flowy"); panel.add(locationLabel); return panel; } } }