/**
* 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.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
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.Player;
import net.sf.freecol.common.model.TradeRoute;
import net.sf.freecol.common.model.Unit;
/**
* Allows the user to edit trade routes.
*/
public final class TradeRouteDialog extends FreeColDialog<Boolean>
implements ActionListener {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(TradeRouteDialog.class.getName());
private static enum Action { OK, CANCEL, DEASSIGN, DELETE }
private final JButton editRouteButton
= new JButton(Messages.message("traderouteDialog.editRoute"));
private final JButton newRouteButton
= new JButton(Messages.message("traderouteDialog.newRoute"));
private final JButton removeRouteButton
= new JButton(Messages.message("traderouteDialog.removeRoute"));
private final JButton deassignRouteButton
= new JButton(Messages.message("traderouteDialog.deassignRoute"));
private final DefaultListModel listModel = new DefaultListModel();
@SuppressWarnings("unchecked") // FIXME in Java7
private final JList tradeRoutes = new JList(listModel);
private final JScrollPane tradeRouteView = new JScrollPane(tradeRoutes);
private static final Comparator<TradeRoute> tradeRouteComparator
= new Comparator<TradeRoute>() {
public int compare(TradeRoute r1, TradeRoute r2) {
return r1.getName().compareTo(r2.getName());
}
};
/** The unit to assign/deassign trade routes for. */
private Unit unit = null;
/**
* The constructor that will add the items to this panel.
* @param freeColClient The <code>FreeColClient</code> controlling the
* trade routes.
* @param gui The <code>GUI</code> to display in.
* @param unit The optional <code>Unit</code> to operate on.
*/
@SuppressWarnings("unchecked") // FIXME in Java7
public TradeRouteDialog(FreeColClient freeColClient, final GUI gui,
Unit unit) {
super(freeColClient, gui);
this.unit = unit;
deassignRouteButton.addActionListener(this);
deassignRouteButton.setToolTipText(Messages.message("traderouteDialog.deassign.tooltip"));
deassignRouteButton.setActionCommand(Action.DEASSIGN.toString());
enterPressesWhenFocused(deassignRouteButton);
tradeRoutes.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
updateButtons();
}
});
// button for adding new TradeRoute
newRouteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Player player = getMyPlayer();
TradeRoute newRoute = getController().getNewTradeRoute(player);
newRoute.setName(Messages.message("traderouteDialog.newRoute"));
if (getGUI().showTradeRouteInputDialog(newRoute)) {
listModel.addElement(newRoute);
tradeRoutes.setSelectedValue(newRoute, true);
}
}
});
// button for editing TradeRoute
editRouteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
getGUI().showTradeRouteInputDialog((TradeRoute) tradeRoutes.getSelectedValue());
}
});
// button for deleting TradeRoute
removeRouteButton.addActionListener(this);
removeRouteButton.setActionCommand(Action.DELETE.toString());
Player player = getMyPlayer();
List<TradeRoute> theRoutes
= new ArrayList<TradeRoute>(player.getTradeRoutes());
for (TradeRoute tradeRoute : theRoutes) tradeRoute.setCount(0);
for (Unit u : player.getUnits()) {
TradeRoute tradeRoute = u.getTradeRoute();
if (tradeRoute != null) {
tradeRoute.setCount(1 + tradeRoute.getCount());
}
}
Collections.sort(theRoutes, tradeRouteComparator);
for (TradeRoute route : theRoutes) {
listModel.addElement(route);
}
tradeRoutes.setCellRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean selected,
boolean focus) {
Component ret = super.getListCellRendererComponent(list,
value, index, selected, focus);
TradeRoute tradeRoute = (TradeRoute) value;
String name = tradeRoute.getName();
int n = tradeRoute.getCount();
if (n > 0) {
setText(name + " (" + String.valueOf(n) + ")");
} else {
setText(name);
}
return ret;
}
});
if (unit != null && unit.getTradeRoute() != null) {
tradeRoutes.setSelectedValue(unit.getTradeRoute(), true);
}
updateButtons();
setLayout(new MigLayout("wrap 2", "[fill][fill]"));
add(getDefaultHeader(Messages.message("traderouteDialog.name")),
"span, align center");
add(tradeRouteView, "height 360:400, width 250:");
add(newRouteButton, "split 4, flowy, growx");
add(editRouteButton, "growx");
add(removeRouteButton, "growx");
add(deassignRouteButton);
add(okButton, "newline 20, span, split 2, tag ok");
add(cancelButton, "tag cancel");
restoreSavedSize(getPreferredSize());
}
public void updateButtons() {
if (tradeRoutes.getSelectedIndex() < 0) {
editRouteButton.setEnabled(false);
removeRouteButton.setEnabled(false);
deassignRouteButton.setEnabled(false);
} else {
editRouteButton.setEnabled(true);
removeRouteButton.setEnabled(true);
deassignRouteButton.setEnabled(unit != null);
}
}
/**
* This function analyses an event and calls the right methods to take
* care of the user's requests.
*
* @param event The incoming ActionEvent.
*/
public void actionPerformed(ActionEvent event) {
Action action = Enum.valueOf(Action.class, event.getActionCommand());
TradeRoute route = (TradeRoute)tradeRoutes.getSelectedValue();
boolean ret = false;
if (route != null) {
switch (action) {
case OK:
ArrayList<TradeRoute> routes = new ArrayList<TradeRoute>();
for (int index = 0; index < listModel.getSize(); index++) {
routes.add((TradeRoute) listModel.getElementAt(index));
}
getController().setTradeRoutes(routes);
if (unit != null) unit.setTradeRoute(route);
ret = true;
break;
case DEASSIGN:
if (unit != null && route == unit.getTradeRoute()) {
unit.setTradeRoute(null);
ret = true;
}
break;
case DELETE:
for (Unit u : route.getAssignedUnits()) {
getController().clearOrders(u);
}
listModel.removeElementAt(tradeRoutes.getSelectedIndex());
Player player = getMyPlayer();
player.getTradeRoutes().remove(route);
getController().setTradeRoutes(player.getTradeRoutes());
return; // Continue, do not set response
case CANCEL: default:
ret = false;
break;
}
}
getGUI().removeFromCanvas(this);
setResponse(ret);
}
}