package games.strategy.triplea.delegate;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.changefactory.ChangeFactory;
import games.strategy.engine.delegate.IDelegateBridge;
import games.strategy.engine.gamePlayer.IRemotePlayer;
import games.strategy.engine.history.Event;
import games.strategy.engine.history.EventChild;
import games.strategy.engine.history.HistoryNode;
import games.strategy.engine.history.Step;
import games.strategy.triplea.Constants;
public abstract class BaseEditDelegate extends BasePersistentDelegate {
public static String EDITMODE_ON = "Turning on Edit Mode";
public static String EDITMODE_OFF = "Turning off Edit Mode";
/**
* Called before the delegate will run, AND before "start" is called.
*/
@Override
public void setDelegateBridgeAndPlayer(final IDelegateBridge iDelegateBridge) {
super.setDelegateBridgeAndPlayer(new GameDelegateBridge(iDelegateBridge));
}
/**
* Called before the delegate will run.
*/
@Override
public void start() {
super.start();
}
@Override
public void end() {}
@Override
public boolean delegateCurrentlyRequiresUserInput() {
return true;
}
public static boolean getEditMode(final GameData data) {
final Object editMode = data.getProperties().get(Constants.EDIT_MODE);
if (editMode == null) {
return false;
}
if (!(editMode instanceof Boolean)) {
return false;
}
return (Boolean) editMode;
}
protected String checkPlayerID() {
final IRemotePlayer remotePlayer = getRemotePlayer();
if (!m_bridge.getPlayerID().equals(remotePlayer.getPlayerID())) {
return "Edit actions can only be performed during players turn";
}
return null;
}
protected String checkEditMode() {
final String result = checkPlayerID();
if (null != result) {
return result;
}
if (!getEditMode(getData())) {
return "Edit mode is not enabled";
}
return null;
}
public String setEditMode(final boolean editMode) {
final IRemotePlayer remotePlayer = getRemotePlayer();
if (!m_bridge.getPlayerID().equals(remotePlayer.getPlayerID())) {
return "Edit Mode can only be toggled during players turn";
}
logEvent((editMode ? EDITMODE_ON : EDITMODE_OFF), null);
m_bridge.addChange(ChangeFactory.setProperty(Constants.EDIT_MODE, editMode, getData()));
return null;
}
public boolean getEditMode() {
return getEditMode(getData());
}
public String addComment(final String message) {
String result = null;
if (null != (result = checkPlayerID())) {
return result;
}
logEvent("COMMENT: " + message, null);
return null;
}
// We don't know the current context, so we need to figure
// out whether it makes more sense to log a new event or a child.
// If any child events came before us, then we'll log a child event.
// Otherwise, we'll log a new event.
protected void logEvent(final String message, final Object renderingObject) {
// find last event node
boolean foundChild = false;
final GameData game_data = getData();
game_data.acquireReadLock();
try {
HistoryNode curNode = game_data.getHistory().getLastNode();
while (!(curNode instanceof Step) && !(curNode instanceof Event)) {
if (curNode instanceof EventChild) {
foundChild = true;
break;
}
curNode = (HistoryNode) curNode.getPreviousNode();
}
} finally {
game_data.releaseReadLock();
}
if (foundChild) {
m_bridge.getHistoryWriter().addChildToEvent(message, renderingObject);
} else {
m_bridge.getHistoryWriter().startEvent(message, renderingObject);
}
}
}