package net.sf.colossus.gui; import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import java.util.Set; import net.sf.colossus.common.IOptions; import net.sf.colossus.game.Legion; import net.sf.colossus.game.Player; import net.sf.colossus.guiutil.KDialog; import net.sf.colossus.guiutil.SaveWindow; /** * Class PickMarker allows a player to pick a legion marker, * either as initial marker or for splitting a legion. * * @author David Ripton * @author Clemens Katzer */ final class PickMarker extends KDialog { private final ClientGUI gui; private final Set<String> markerIds; private final SaveWindow saveWindow; // if null, it's pick initial marker, otherwise it's for split legion private final Legion parent; PickMarker(ClientGUI gui, Set<String> markerIds, Legion parent) { super(gui.getBoard().getFrame(), "dummy title", true); this.gui = gui; this.parent = parent; this.markerIds = markerIds; IOptions options = gui.getOptions(); Player owner = gui.getClient().getOwningPlayer(); if (parent == null) { setTitle(owner.getName() + ": Pick initial Legion Marker!"); } else { setTitle(owner.getName() + ": Pick Marker for new Legion!"); } List<Marker> markers = new ArrayList<Marker>(); if (markerIds.isEmpty()) { cleanup(null); } addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { cleanup(null); } }); Container contentPane = getContentPane(); int numAvailable = markerIds.size(); contentPane.setLayout(new GridLayout(0, Math.min(numAvailable, 6))); pack(); setBackground(Color.lightGray); MouseAdapter mouseListener = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { Marker marker = (Marker)e.getComponent(); cleanup(marker.getId()); } }; for (String markerId : markerIds) { Marker marker = new Marker(null, 4 * Scale.get(), markerId + "-" + owner.getColor().getName()); markers.add(marker); contentPane.add(marker); marker.addMouseListener(mouseListener); } pack(); saveWindow = new SaveWindow(options, "PickMarker"); Point location = saveWindow.loadLocation(); if (location == null) { centerOnScreen(); } else { setLocation(location); } setVisible(true); } /** * If parent != null, it's about split. Make the GUI initiate the * dialog where user chooses creatures to split into new marker. * * If parent is null, it's about the initial split, thus we insist * on getting one, and once one is selected, make the client send * the assignFirstMarker to server. * * @param pickedMarkerId The markerId the user has choosen, or null * if dialog was closed without choosing. * */ private void cleanup(String pickedMarkerId) { saveWindow.saveLocation(getLocation()); dispose(); if (parent != null) { // CLient will either initiate the split, or if pickedMarkerId // is null, just forget about it :) gui.getClient().doTheSplitting(parent, pickedMarkerId); } else { if (pickedMarkerId == null) { new PickMarker(gui, markerIds, parent); } else { gui.getClient().assignFirstMarker(pickedMarkerId); } } } }