package jetbrains.mps.debugger.java.runtime.state.customViewers;
/*Generated by MPS */
import jetbrains.mps.debugger.java.api.state.proxy.ValueWrapperFactory;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.debugger.java.api.evaluation.proxies.IValueProxy;
import jetbrains.mps.debugger.java.api.evaluation.proxies.IArrayValueProxy;
import jetbrains.mps.debugger.java.api.evaluation.proxies.INullValueProxy;
import jetbrains.mps.debugger.java.api.evaluation.EvaluationUtils;
import jetbrains.mps.debugger.java.api.state.proxy.ValueWrapper;
import com.sun.jdi.ThreadReference;
import java.util.List;
import jetbrains.mps.debug.api.programState.IWatchable;
import java.util.ArrayList;
import com.sun.jdi.ArrayReference;
import jetbrains.mps.debugger.java.api.state.watchables.JavaWatchable;
import jetbrains.mps.debugger.java.api.state.proxy.JavaValue;
import jetbrains.mps.debugger.java.api.state.customViewers.CustomViewersManager;
import jetbrains.mps.debug.api.programState.IValue;
import javax.swing.Icon;
import jetbrains.mps.debug.api.programState.WatchablesCategory;
public class ArrayWrapperFactory extends ValueWrapperFactory {
@Override
public boolean canWrapValue(@NotNull IValueProxy value) {
return value instanceof IArrayValueProxy && !(value instanceof INullValueProxy);
}
@Override
public String getWrappedType() {
return "[" + EvaluationUtils.JAVA_LANG_OBJECT;
}
public ValueWrapper createValueWrapper(IValueProxy value, ThreadReference threadReference) {
return new ArrayWrapperFactory.JavaArrayValue((IArrayValueProxy) value, threadReference);
}
@Override
public String getName() {
return "Array";
}
private static class JavaArrayValue extends ValueWrapper<IArrayValueProxy> {
private static final int MAX_ARRAY_VALUES = 100;
private final boolean myIsStructure;
public JavaArrayValue(IArrayValueProxy value, ThreadReference threadReference) {
super(value, threadReference);
myIsStructure = myValue.getLength() > 0;
}
@Override
public boolean isStructure() {
return myIsStructure;
}
@Override
public List<IWatchable> getSubvaluesImpl() {
List<IWatchable> watchables = new ArrayList<IWatchable>();
ArrayReference arrayRef = (ArrayReference) myValue.getJDIValue();
if (arrayRef != null) {
if (arrayRef.length() > 0) {
int len = arrayRef.length();
if (len > MAX_ARRAY_VALUES) {
len = MAX_ARRAY_VALUES;
}
for (int i = 0; i < len; i++) {
watchables.add(new ArrayWrapperFactory.JavaArrayItemWatchable(arrayRef, i, myThreadReference));
}
}
}
return watchables;
}
}
private static class JavaArrayItemWatchable extends JavaWatchable implements IWatchable {
private final ArrayReference myArray;
private final int myIndex;
private final JavaValue myValue;
public JavaArrayItemWatchable(ArrayReference arrayReference, int index, ThreadReference threadReference) {
super(threadReference);
myArray = arrayReference;
myIndex = index;
myValue = CustomViewersManager.getInstance().fromJdi(myArray.getValue(myIndex), myThreadReference);
}
public ArrayReference getArray() {
return myArray;
}
@Override
public String getName() {
return "[" + myIndex + "]";
}
@Override
public IValue getValue() {
return myValue;
}
@Override
public Icon getPresentationIcon() {
return myValue.getPresentationIcon();
}
@Override
public WatchablesCategory getCategory() {
return WatchablesCategory.NONE;
}
}
}