/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Mathew A. Nelson
* - Initial API and implementation
* Flemming N. Larsen
* - Renamed 'enum' variables to allow compiling with Java 1.5
* - Replaced RobotPeerVector with plain Vector
* - Ported to Java 5.0
* - Fixed possible ConcurrentModificationException issues
* - Bugfixed setActiveBattle() and reset() which removed dialogs via
* remove(dialog) instead of remove(name)
* Robert D. Maupin
* - Replaced old collection types like Vector and Hashtable with
* synchronized List and HashMap
*******************************************************************************/
package net.sf.robocode.ui;
import net.sf.robocode.core.Container;
import net.sf.robocode.ui.dialog.*;
import robocode.control.snapshot.IRobotSnapshot;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Mathew A. Nelson (orinal)
* @author Flemming N. Larsen (contributor)
* @author Robert D. Maupin (contributor)
*/
public class RobotDialogManager implements IRobotDialogManager {
public static final int MAX_PRE_ATTACHED = 25;
private final Map<String, RobotDialog> robotDialogMap = new ConcurrentHashMap<String, RobotDialog>();
private BattleDialog battleDialog = null;
public RobotDialogManager() {
super();
}
public void trim(List<IRobotSnapshot> robots) {
// new ArrayList in order to prevent ConcurrentModificationException
for (String name : new ArrayList<String>(robotDialogMap.keySet())) {
boolean found = false;
for (IRobotSnapshot robot : robots) {
if (robot.getName().equals(name)) {
found = true;
break;
}
}
if (!found) {
RobotDialog dialog = robotDialogMap.get(name);
robotDialogMap.remove(name);
dialog.dispose();
dialog.detach();
}
}
}
public void reset() {
for (String name : robotDialogMap.keySet()) {
RobotDialog dialog = robotDialogMap.get(name);
if (!dialog.isVisible()) {
robotDialogMap.remove(name);
dialog.detach();
dialog.dispose();
}
}
}
public RobotDialog getRobotDialog(RobotButton robotButton, String name, boolean create) {
RobotDialog robotDialog = robotDialogMap.get(name);
if (create && robotDialog == null) {
if (robotDialogMap.size() > MAX_PRE_ATTACHED) {
reset();
}
robotDialog = Container.createComponent(RobotDialog.class);
robotDialog.setup(robotButton);
robotDialog.pack();
WindowUtil.place(robotDialog);
robotDialogMap.put(name, robotDialog);
}
return robotDialog;
}
public BattleDialog getBattleDialog(BattleButton battleButton, boolean create) {
if (create && battleDialog == null) {
battleDialog = Container.getComponent(BattleDialog.class);
battleDialog.pack();
WindowUtil.place(battleDialog);
}
return battleDialog;
}
}