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; } } }