/**
* 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.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import org.freecolandroid.repackaged.java.awt.Component;
import org.freecolandroid.repackaged.java.awt.event.ActionEvent;
import org.freecolandroid.repackaged.java.awt.event.ActionListener;
import org.freecolandroid.repackaged.java.awt.event.MouseAdapter;
import org.freecolandroid.repackaged.java.awt.event.MouseEvent;
import org.freecolandroid.repackaged.javax.swing.JButton;
import org.freecolandroid.repackaged.javax.swing.JCheckBox;
import org.freecolandroid.repackaged.javax.swing.JLabel;
import org.freecolandroid.repackaged.javax.swing.JList;
import org.freecolandroid.repackaged.javax.swing.ListCellRenderer;
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.common.model.Goods;
import net.sf.freecol.common.model.StringTemplate;
import net.sf.freecol.common.model.Unit;
/**
* Panel for choosing the goods to capture.
*/
public final class CaptureGoodsDialog extends FreeColDialog<List<Goods>>
implements ActionListener {
private static final Logger logger = Logger.getLogger(CaptureGoodsDialog.class.getName());
static final String ALL = "All";
static final String NONE = "None";
private JButton allButton;
private JButton noneButton;
private JList goodsList;
private int maxCargo;
/**
* Creates a new CaptureGoodsDialog.
* @param freeColClient
*
* @param parent The parent <code>Canvas</code>.
* @param winner The <code>Unit</code> that is looting.
* @param loot The <code>Goods</code> to loot.
*/
public CaptureGoodsDialog(FreeColClient freeColClient, GUI gui, Unit winner, List<Goods> loot) {
super(freeColClient, gui);
maxCargo = winner.getSpaceLeft();
setLayout(new MigLayout("wrap 1", "[center]", "[]20[]20[]"));
JLabel header = new JLabel(Messages.message("lootCargo.header"));
header.setFont(mediumHeaderFont);
add(header);
goodsList = new JList();
GoodsItem[] goods = new GoodsItem[loot.size()];
for (int i = 0; i < loot.size(); i++) {
goods[i] = new GoodsItem(loot.get(i));
}
goodsList.setListData(goods);
goodsList.setCellRenderer(new CheckBoxRenderer());
goodsList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
int index = goodsList.locationToIndex(me.getPoint());
if (index < 0) return;
GoodsItem item = (GoodsItem) goodsList.getModel().getElementAt(index);
if (item.isEnabled()) item.setSelected(!item.isSelected());
updateComponents();
}
});
add(goodsList);
allButton = new JButton(Messages.message(ALL));
allButton.addActionListener(this);
enterPressesWhenFocused(allButton);
allButton.setMnemonic('a');
allButton.setActionCommand(ALL);
noneButton = new JButton(Messages.message(NONE));
noneButton.addActionListener(this);
enterPressesWhenFocused(noneButton);
noneButton.setMnemonic('n');
noneButton.setActionCommand(NONE);
add(allButton, "span, split 3");
add(noneButton, "tag cancel");
add(okButton, "tag ok");
setSize(getPreferredSize());
}
private void updateComponents() {
int selectedCount = 0;
for (int i = 0; i < goodsList.getModel().getSize(); i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
if (gi.isSelected()) selectedCount++;
}
if (selectedCount >= maxCargo) {
allButton.setEnabled(false);
for (int i = 0; i < goodsList.getModel().getSize(); i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
if (!gi.isSelected()) gi.setEnabled(false);
}
} else {
allButton.setEnabled(true);
for (int i = 0; i < goodsList.getModel().getSize(); i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
if (!gi.isSelected()) gi.setEnabled(true);
}
}
goodsList.repaint();
}
/**
* This function analyses an event and calls the right methods to take
* care of the user's requests. The response is an ArrayList of Goods.
*
* @param e The incoming ActionEvent.
*/
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (ALL.equals(command)) {
for (int i = 0; i < goodsList.getModel().getSize() && i < maxCargo;
i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
gi.setSelected(true);
updateComponents();
}
} else if (NONE.equals(command)) {
for (int i = 0; i < goodsList.getModel().getSize(); i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
gi.setSelected(false);
updateComponents();
}
} else if (OK.equals(command)) {
ArrayList<Goods> list = new ArrayList<Goods>();
for (int i = 0; i < goodsList.getModel().getSize(); i++) {
GoodsItem gi = (GoodsItem) goodsList.getModel().getElementAt(i);
if (gi.isSelected()) list.add(gi.getGoods());
}
setResponse(list);
} else {
logger.warning("Invalid action command: " + command);
}
}
private class CheckBoxRenderer extends JCheckBox
implements ListCellRenderer {
public CheckBoxRenderer() {
//setBackground(UIManager.getColor("List.textBackground"));
//setForeground(UIManager.getColor("List.textForeground"));
}
public Component getListCellRendererComponent(JList listBox, Object obj,
int currentindex,
boolean isChecked,
boolean hasFocus) {
GoodsItem item = (GoodsItem) obj;
setSelected(item.isSelected());
setText(item.toString());
setEnabled(item.isEnabled());
return this;
}
}
private class GoodsItem extends JCheckBox {
private Goods good;
public GoodsItem(Goods good) {
this.good = good;
}
public Goods getGoods() {
return good;
}
@Override
public String toString() {
StringTemplate template
= StringTemplate.template("model.goods.goodsAmount")
.add("%goods%", good.getNameKey())
.addAmount("%amount%", good.getAmount());
return Messages.message(template);
}
}
}