package net.sf.colossus.gui;
import java.awt.Color;
import java.awt.Container;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.sf.colossus.common.Options;
import net.sf.colossus.game.Legion;
import net.sf.colossus.game.Proposal;
import net.sf.colossus.guiutil.KDialog;
import net.sf.colossus.guiutil.SaveWindow;
/**
* ReplyToProposal allows responding to a negotiation proposal.
*
* @author David Ripton
*/
final class ReplyToProposal extends KDialog implements ActionListener
{
private final Legion attacker;
private final Legion defender;
private final List<Chit> attackerChits = new ArrayList<Chit>();
private final List<Chit> defenderChits = new ArrayList<Chit>();
private final Marker attackerMarker;
private final Marker defenderMarker;
private final ClientGUI gui;
private Proposal proposal;
private Point location;
private final SaveWindow saveWindow;
ReplyToProposal(JFrame parentframe, ClientGUI gui, String playerName,
Options options, Proposal proposal)
{
super(parentframe, playerName + ": Reply to Proposal", false);
this.proposal = proposal;
this.gui = gui;
attacker = proposal.getAttacker();
defender = proposal.getDefender();
Container contentPane = getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
setBackground(Color.lightGray);
int scale = 4 * Scale.get();
JPanel attackerPane = new JPanel();
contentPane.add(attackerPane);
attackerMarker = new Marker(attacker, scale,
attacker.getLongMarkerId(), gui.getClient(), true);
attackerPane.add(attackerMarker);
List<String> attackerImageNames = gui.getOracle().getLegionImageNames(
attacker);
Iterator<String> it = attackerImageNames.iterator();
while (it.hasNext())
{
String imageName = it.next();
Chit chit = Chit.newCreatureChit(scale, imageName);
attackerChits.add(chit);
attackerPane.add(chit);
}
JPanel defenderPane = new JPanel();
contentPane.add(defenderPane);
defenderMarker = new Marker(defender, scale,
defender.getLongMarkerId(), gui.getClient(), true);
defenderPane.add(defenderMarker);
List<String> defenderImageNames = gui.getOracle().getLegionImageNames(
defender);
it = defenderImageNames.iterator();
while (it.hasNext())
{
String imageName = it.next();
Chit chit = Chit.newCreatureChit(scale, imageName);
defenderChits.add(chit);
defenderPane.add(chit);
}
if (proposal.isMutual())
{
markAllDead(attacker);
markAllDead(defender);
}
else if (attacker.equals(proposal.getWinner()))
{
markAllDead(defender);
markSomeDead(attacker, proposal.getWinnerLosses());
}
else if (defender.equals(proposal.getWinner()))
{
markAllDead(attacker);
markSomeDead(defender, proposal.getWinnerLosses());
}
JPanel buttonPane = new JPanel();
contentPane.add(buttonPane);
JButton button1 = new JButton("Accept");
button1.setMnemonic(KeyEvent.VK_A);
JButton button2 = new JButton("Decline");
button2.setMnemonic(KeyEvent.VK_D);
JButton button3 = new JButton("Fight");
button3.setMnemonic(KeyEvent.VK_F);
buttonPane.add(button1);
button1.addActionListener(this);
buttonPane.add(button2);
button2.addActionListener(this);
pack();
saveWindow = new SaveWindow(options, "ReplyToProposal");
location = saveWindow.loadLocation();
if (location == null)
{
centerOnScreen();
location = getLocation();
}
else
{
setLocation(location);
}
setVisible(true);
repaint();
}
private void markAllDead(Legion legion)
{
Iterator<Chit> it = null;
if (legion.equals(attacker))
{
it = attackerChits.iterator();
}
else
{
it = defenderChits.iterator();
}
while (it.hasNext())
{
Chit chit = it.next();
chit.setDead(true);
}
}
private void markSomeDead(Legion legion, List<String> losses)
{
// Don't mess with the original list.
List<String> creatures = new ArrayList<String>(losses);
Iterator<Chit> it = null;
if (legion.equals(attacker))
{
it = attackerChits.iterator();
}
else
{
it = defenderChits.iterator();
}
while (it.hasNext())
{
Chit chit = it.next();
Iterator<String> it2 = creatures.iterator();
while (it2.hasNext())
{
String creatureName = it2.next();
if (creatureName.equals(chit.getId()))
{
chit.setDead(true);
it2.remove();
break;
}
}
}
}
private void cleanup()
{
location = getLocation();
saveWindow.saveLocation(location);
dispose();
// Accept or Fight, the Negotiate dialog in which one could make
// further proposals is not needed any more
if (proposal != null)
{
gui.cleanupNegotiationDialogs();
}
gui.negotiateCallback(proposal, false);
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Accept"))
{
// Leave proposal as-is.
cleanup();
}
else if (e.getActionCommand().equals("Decline"))
{
proposal = null;
cleanup();
}
else if (e.getActionCommand().equals("Fight"))
{
proposal = new Proposal(attacker, defender, true, false, null,
null);
// Exit this dialog.
cleanup();
}
}
}