/**
* 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.Iterator;
import java.util.List;
import org.freecolandroid.repackaged.java.awt.Color;
import org.freecolandroid.repackaged.java.awt.Dimension;
import org.freecolandroid.repackaged.javax.swing.JButton;
import org.freecolandroid.repackaged.javax.swing.JLabel;
import org.freecolandroid.repackaged.javax.swing.JPanel;
import org.freecolandroid.repackaged.javax.swing.SwingConstants;
import org.freecolandroid.repackaged.javax.swing.border.Border;
import org.freecolandroid.repackaged.javax.swing.border.EmptyBorder;
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.Ability;
import net.sf.freecol.common.model.Colony;
import net.sf.freecol.common.model.Goods;
import net.sf.freecol.common.model.GoodsType;
import net.sf.freecol.common.model.Market;
import net.sf.freecol.common.model.Player;
import net.sf.freecol.common.model.StringTemplate;
import net.sf.freecol.common.model.TypeCountMap;
import net.sf.freecol.common.model.Unit;
/**
* This panel displays the Trade Report.
*/
public final class ReportTradePanel extends ReportPanel {
/**
* Storable goods types.
*/
private List<GoodsType> storableGoods = new ArrayList<GoodsType>();
private List<Colony> colonies;
private final JPanel goodsHeader = new JPanel() {
@Override
public String getUIClassID() {
return "ReportPanelUI";
}
};
/**
* The constructor that will add the items to this panel.
* @param freeColClient
*
* @param gui The parent of this panel.
*/
public ReportTradePanel(FreeColClient freeColClient, GUI gui) {
super(freeColClient, gui, Messages.message("reportTradeAction.name"));
setSize(getMinimumSize());
Player player = getMyPlayer();
colonies = getSortedColonies();
goodsHeader.setBorder(new EmptyBorder(20, 20, 0, 20));
scrollPane.setColumnHeaderView(goodsHeader);
for (GoodsType goodsType : getSpecification().getGoodsTypeList()) {
if (goodsType.isStorable()) {
storableGoods.add(goodsType);
}
}
Market market = player.getMarket();
// Display Panel
reportPanel.removeAll();
goodsHeader.removeAll();
String layoutConstraints = "insets 0, gap 0 0";
String columnConstraints = "[170!, fill][42!, fill]";
String rowConstraints = "[fill]";
reportPanel.setLayout(new MigLayout(layoutConstraints, columnConstraints, rowConstraints));
goodsHeader.setLayout(new MigLayout(layoutConstraints, columnConstraints, rowConstraints));
goodsHeader.setOpaque(true);
JLabel emptyLabel = new JLabel();
emptyLabel.setBorder(FreeColPanel.TOPLEFTCELLBORDER);
goodsHeader.add(emptyLabel, "cell 0 0");
reportPanel.add(createLeftLabel("report.trade.unitsSold"), "cell 0 0");
reportPanel.add(createLeftLabel("report.trade.beforeTaxes"), "cell 0 1");
reportPanel.add(createLeftLabel("report.trade.afterTaxes"), "cell 0 2");
reportPanel.add(createLeftLabel("report.trade.cargoUnits"), "cell 0 3");
reportPanel.add(createLeftLabel("report.trade.totalUnits"), "cell 0 4");
reportPanel.add(createLeftLabel("report.trade.totalDelta"), "cell 0 5");
TypeCountMap<GoodsType> totalUnits = new TypeCountMap<GoodsType>();
TypeCountMap<GoodsType> deltaUnits = new TypeCountMap<GoodsType>();
TypeCountMap<GoodsType> cargoUnits = new TypeCountMap<GoodsType>();
for (Iterator<Unit> iterator = player.getUnitIterator(); iterator.hasNext();) {
Unit unit = iterator.next();
if (unit.isCarrier()) {
for (Goods goods : unit.getGoodsContainer().getCompactGoods()) {
cargoUnits.incrementCount(goods.getType(), goods.getAmount());
totalUnits.incrementCount(goods.getType(), goods.getAmount());
}
}
}
int column = 0;
for (GoodsType goodsType : storableGoods) {
column++;
int sales = player.getSales(goodsType);
int beforeTaxes = player.getIncomeBeforeTaxes(goodsType);
int afterTaxes = player.getIncomeAfterTaxes(goodsType);
MarketLabel marketLabel = new MarketLabel(goodsType, market, getGUI());
marketLabel.setBorder(FreeColPanel.TOPCELLBORDER);
marketLabel.setVerticalTextPosition(JLabel.BOTTOM);
marketLabel.setHorizontalTextPosition(JLabel.CENTER);
goodsHeader.add(marketLabel);
reportPanel.add(createNumberLabel(sales), "cell " + column + " 0");
reportPanel.add(createNumberLabel(beforeTaxes), "cell " + column + " 1");
reportPanel.add(createNumberLabel(afterTaxes), "cell " + column + " 2");
reportPanel.add(createNumberLabel(cargoUnits.getCount(goodsType)), "cell " + column + " 3");
}
int row = 6;
for (int colonyIndex = 0; colonyIndex < colonies.size(); colonyIndex++) {
Colony colony = colonies.get(colonyIndex);
for (GoodsType goodsType : getSpecification().getGoodsTypeList()) {
deltaUnits.incrementCount(goodsType, colony.getNetProductionOf(goodsType));
}
for (Goods goods : colony.getGoodsContainer().getCompactGoods()) {
totalUnits.incrementCount(goods.getType(), goods.getAmount());
}
JButton colonyButton = createColonyButton(colony, colonyIndex);
reportPanel.add(colonyButton, "cell 0 " + row + " 1 2");
column = 0;
for (GoodsType goodsType : storableGoods) {
column++;
int amount = colony.getGoodsCount(goodsType);
JLabel goodsLabel = new JLabel(String.valueOf(amount), JLabel.TRAILING);
goodsLabel.setBorder(colonyIndex == 0 ? FreeColPanel.TOPCELLBORDER : FreeColPanel.CELLBORDER);
if (colony.getExportData(goodsType).isExported()) {
goodsLabel.setText("*" + String.valueOf(amount));
}
reportPanel.add(goodsLabel, "cell " + column + " " + row);
int production = colony.getNetProductionOf(goodsType);
JLabel productionLabel = createNumberLabel(production, true);
StringBuffer toolTip = new StringBuffer();
for (StringTemplate warning : colony.getWarnings(goodsType, amount, production)) {
if (toolTip.length() > 0) {
toolTip.append(" - ");
}
toolTip.append(Messages.message(warning));
productionLabel.setForeground(Color.MAGENTA);
productionLabel.setToolTipText(toolTip.toString());
}
reportPanel.add(productionLabel, "cell " + column + " " + (row + 1));
}
row += 2;
}
row++;
reportPanel.add(new JLabel(Messages.message("report.trade.hasCustomHouse")),
"cell 0 " + row + ", span");
column = 0;
for (GoodsType goodsType : storableGoods) {
column++;
reportPanel.add(createNumberLabel(totalUnits.getCount(goodsType)),
"cell " + column + " 4");
reportPanel.add(createNumberLabel(deltaUnits.getCount(goodsType), true),
"cell " + column + " 5, wrap 20");
}
}
private JLabel createLeftLabel(String key) {
JLabel result = new JLabel(Messages.message(key), JLabel.TRAILING);
result.setBorder(FreeColPanel.LEFTCELLBORDER);
return result;
}
private JLabel createNumberLabel(int value) {
return createNumberLabel(value, false);
}
private JLabel createNumberLabel(int value, boolean alwaysAddSign) {
JLabel result = new JLabel(String.valueOf(value), JLabel.TRAILING);
result.setBorder(FreeColPanel.CELLBORDER);
if (value < 0) {
result.setForeground(Color.RED);
} else if (alwaysAddSign && value > 0) {
result.setText("+" + value);
}
return result;
}
private JButton createColonyButton(Colony colony, int index) {
JButton button = new JButton();
String name = colony.getName();
if (colonies.get(index).hasAbility(Ability.EXPORT)) {
name += "*";
}
button.setText(name);
button.setOpaque(false);
button.setForeground(LINK_COLOR);
button.setHorizontalAlignment(SwingConstants.LEADING);
button.setAlignmentY(0.8f);
if (index == 0) {
button.setBorder(FreeColPanel.TOPLEFTCELLBORDER);
} else {
button.setBorder(FreeColPanel.LEFTCELLBORDER);
}
button.setActionCommand(colony.getId());
button.addActionListener(this);
return button;
}
@Override
public Dimension getMinimumSize() {
return new Dimension(900, 750);
}
@Override
protected Border createBorder() {
return new EmptyBorder(0, 20, 20, 20);
}
}