/** * 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.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.freecolandroid.repackaged.java.awt.Dimension; import org.freecolandroid.repackaged.java.awt.Graphics; import org.freecolandroid.repackaged.java.awt.Graphics2D; import org.freecolandroid.repackaged.java.awt.Image; import org.freecolandroid.repackaged.java.awt.image.BufferedImage; import org.freecolandroid.repackaged.java.awt.image.RescaleOp; import org.freecolandroid.repackaged.javax.swing.JLabel; import org.freecolandroid.repackaged.javax.swing.JPanel; import org.freecolandroid.repackaged.javax.swing.JToolTip; import net.miginfocom.swing.MigLayout; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractGoods; import net.sf.freecol.common.model.Building; import net.sf.freecol.common.model.ProductionInfo; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.resources.ResourceManager; /** * This panel represents a single building in a Colony. */ public class BuildingPanel extends JPanel implements PropertyChangeListener { private static Logger logger = Logger.getLogger(BuildingPanel.class.getName()); private final Building building; private ProductionLabel productionOutput = null; private List<UnitLabel> unitLabels = new ArrayList<UnitLabel>(); private FreeColClient freeColClient; private GUI gui; /** * Creates this BuildingPanel. * * @param building The building to display information from. * @param parent a <code>Canvas</code> value */ public BuildingPanel(FreeColClient freeColClient, Building building, GUI gui) { this.freeColClient = freeColClient; this.gui = gui; this.building = building; addPropertyChangeListeners(); setToolTipText(" "); setLayout(new MigLayout("", "[32][32][32]", "[32][44]")); initialize(); } public void initialize() { removeAll(); unitLabels.clear(); ProductionInfo info = building.getProductionInfo(); if (info == null || info.getProduction().isEmpty()) { add(new JLabel(), "span"); } else { AbstractGoods output = info.getProduction().get(0); if (output.getAmount() > 0) { if (building.hasAbility(Ability.AVOID_EXCESS_PRODUCTION)) { int stored = building.getColony().getGoodsCount(output.getType()); int capacity = building.getColony().getWarehouseCapacity(); if (output.getAmount() + stored > capacity) { output = new AbstractGoods(output.getType(), capacity - stored); } } AbstractGoods maximum = info.getMaximumProduction().isEmpty() ? output : info.getMaximumProduction().get(0); productionOutput = new ProductionLabel(freeColClient, gui, output, maximum); add(productionOutput, "span, align center"); } } for (Unit unit : building.getUnitList()) { UnitLabel unitLabel = new UnitLabel(freeColClient, unit, gui, true); unitLabels.add(unitLabel); add(unitLabel); } setSize(new Dimension(96,76)); revalidate(); repaint(); } /** * Paints this component. * * @param g The graphics context in which to paint. */ @Override public void paintComponent(Graphics g) { BufferedImage bgImage = fadeImage(ResourceManager.getImage(building.getType().getId() + ".image"), 0.6f, 192.0f); g.drawImage(bgImage, 0, 0, this); } public BufferedImage fadeImage(Image img, float fade, float target) { int w = img.getWidth(null); int h = img.getHeight(null); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); Graphics g = bi.getGraphics(); g.drawImage(img, 0, 0, null); float offset = target * (1.0f - fade); float[] scales = { fade, fade, fade, 1.0f }; float[] offsets = { offset, offset, offset, 0.0f }; RescaleOp rop = new RescaleOp(scales, offsets, null); Graphics2D g2d = (Graphics2D) g; g2d.drawImage(bi, rop, 0, 0); return bi; } public Building getBuilding() { return building; } public void updateProductionLabel() { initialize(); } public List<UnitLabel> getUnitLabels() { return unitLabels; } @Override public JToolTip createToolTip() { return new BuildingToolTip(freeColClient, building, gui); } public void addPropertyChangeListeners() { building.addPropertyChangeListener(this); } public void removePropertyChangeListeners() { building.removePropertyChangeListener(this); } public void propertyChange(PropertyChangeEvent event) { String property = event.getPropertyName(); logger.finest(building.getId() + " change " + property + ": " + event.getOldValue() + " -> " + event.getNewValue()); initialize(); } }