package commands.logic;
import util.Log;
import util.Wrapper;
import util.Wrapper.Type;
import worldData.Obj;
import commands.undoable.UndoableCommand;
public class CommandSetWrapperToValue extends UndoableCommand {
private final Wrapper myW;
private Wrapper.Type mode = Wrapper.Type.None;
private String mySValue;
private String mySBackup;
private boolean myBValue;
private boolean myBBackup;
private int myIValue;
private int myIBackup;
private Wrapper mySource;
private Object myOBackup;
private Object myOValue;
private boolean ignorePassedObject;
public CommandSetWrapperToValue(Wrapper w) {
myW = w;
}
public CommandSetWrapperToValue(Wrapper w, String stringValue) {
mode = Wrapper.Type.String;
myW = w;
mySValue = stringValue;
}
public CommandSetWrapperToValue(Wrapper w, int integerValue) {
mode = Wrapper.Type.Int;
myW = w;
myIValue = integerValue;
}
public CommandSetWrapperToValue(Wrapper w, Object o) {
mode = Wrapper.Type.Object;
myW = w;
myOValue = o;
}
public CommandSetWrapperToValue(Wrapper w, boolean booleanValue) {
mode = Wrapper.Type.Bool;
myW = w;
myBValue = booleanValue;
}
public CommandSetWrapperToValue(Wrapper target, Wrapper source) {
mode = Wrapper.Type.Wrapper;
myW = target;
mySource = source;
}
public CommandSetWrapperToValue(Wrapper targetWrapper,
Obj objectToPutIntoWrapper, boolean ignorePassedObject) {
this(targetWrapper, objectToPutIntoWrapper);
this.ignorePassedObject = ignorePassedObject;
}
@Override
public boolean override_do() {
if (myW == null) {
Log.e("Command Error",
"CommandSetWrapperToValue.doMethod: wrapper object is null!");
return false;
}
switch (mode) {
case String:
mySBackup = myW.getStringValue();
myW.setTo(mySValue);
return true;
case Bool:
myBBackup = myW.getBooleanValue();
myW.setTo(myBValue);
return true;
case Int:
myIBackup = myW.getIntValue();
myW.setTo(myIValue);
return true;
case Object:
myOBackup = myW.getObject();
myW.setTo(myOValue);
return true;
case Wrapper:
myOBackup = myW.getObject();
myW.setTo(mySource.getObject());
return true;
}
Log.e("Command Error",
"CommandSetWrapperToValue.doMethod: mode wasn't set correctly!");
return false;
}
@Override
public boolean override_do(Object o) {
if (ignorePassedObject) {
Log.d("Commands Wrapper", "Ignoring passed object " + o.getClass());
return false;
}
Log.d("Commands Wrapper", "Setting Wrapper(mode=" + mode
+ ") to value (object=" + o.getClass() + ")");
if (o instanceof String) {
if (mode == Type.None || mode == Type.String) {
Log.d("Commands", " -> Setting string-wrapper to value=" + o);
myW.setTo((String) o);
return true;
}
}
if (o instanceof Wrapper) {
if (mode == Type.None || mode == Type.Wrapper) {
Log.d("Commands", " -> Setting 'wrapper'-wrapper to value="
+ o);
myW.setTo(((Wrapper) o));
return true;
}
}
if (o != null) {
if (mode == Type.None || mode == Type.Wrapper
|| mode == Type.Object) {
/*
* special case: if the transfered object itself is a wrapper,
* extract the object inside the wrapper and use it istead of
* the wrapper itself:
*/
if (o instanceof Wrapper) {
Object o2 = ((Wrapper) o).getObject();
Log.d("Commands", " -> Setting object-wrapper to value="
+ o2 + "(type=" + o2.getClass() + ")");
myOBackup = myW.getObject();
myW.setTo(o2);
return true;
}
Log.d("Commands", " -> Setting object-wrapper to value=" + o
+ "(type=" + o.getClass() + ")");
myW.setTo(o);
return true;
} else {
Log.d("Commands", " -> wrapper doesnt want" + o
+ ", because it does not have the type " + mode);
}
}
// TODO check for other types
return false;
}
@Override
public boolean override_undo() {
switch (mode) {
case String:
myW.setTo(mySBackup);
return true;
case Bool:
myW.setTo(myBBackup);
return true;
case Int:
myW.setTo(myIBackup);
return true;
case Wrapper:
myW.setTo(myOBackup);
return true;
case Object:
myW.setTo(myOBackup);
return true;
}
Log.e("Command Error",
"CommandSetWrapperToValue.undoMethod: mode wasn't set correctly!");
return false;
}
}