package bluej.stride.framedjava.elements;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import bluej.stride.generic.InteractionManager;
import bluej.utility.Utility;
import nu.xom.Element;
import bluej.stride.framedjava.ast.FilledExpressionSlotFragment;
import bluej.stride.framedjava.ast.HighlightedBreakpoint;
import bluej.stride.framedjava.ast.JavaContainerDebugHandler;
import bluej.stride.framedjava.ast.JavaSingleLineDebugHandler;
import bluej.stride.framedjava.ast.JavaSource;
import bluej.stride.framedjava.ast.Loader;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.frames.DebugInfo;
import bluej.stride.framedjava.frames.SwitchFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;
import threadchecker.OnThread;
import threadchecker.Tag;
public class SwitchElement
extends ContainerCodeElement implements JavaSingleLineDebugHandler{
public static final String ELEMENT = "switch";
private final FilledExpressionSlotFragment expression;
private final List<CodeElement> casesContents;
private final List<CodeElement> defaultContents;
private SwitchFrame frame;
public SwitchElement(SwitchFrame frame, FilledExpressionSlotFragment expression, List<? extends CodeElement> casesContents,
List<CodeElement> defaultContents, boolean enabled)
{
this.frame = frame;
this.expression = expression;
this.casesContents = new ArrayList<>(casesContents);
this.casesContents.forEach(c -> c.setParent(this));
this.defaultContents = defaultContents;
if (this.defaultContents != null) {
this.defaultContents.forEach(c -> c.setParent(this));
}
this.enable = enabled;
}
@Override
public List childrenUpTo(CodeElement c)
{
if (casesContents.contains(c)) {
return casesContents.subList(0, casesContents.indexOf(c));
}
else if (defaultContents != null && defaultContents.contains(c)) {
return defaultContents.subList(0, defaultContents.indexOf(c));
}
else {
throw new IllegalArgumentException();
}
}
@Override
public JavaSource toJavaSource()
{
List<JavaSource> contentsJavaSource = CodeElement.toJavaCodes(casesContents);
if (defaultContents != null) {
JavaContainerDebugHandler defaultHandler = debug -> { return frame.getDefaultDebug().showDebugAtEnd(debug);
};
contentsJavaSource.add(JavaSource.createCompoundStatement(frame, this, this, defaultHandler, Arrays.asList(f(frame, "default :")),
CodeElement.toJavaCodes(defaultContents)));
}
JavaContainerDebugHandler casesHandler = debug -> { return frame.getCasesDebug().showDebugAtEnd(debug);
};
return JavaSource.createCompoundStatement(frame, this, this, casesHandler, Arrays.asList(f(frame, "switch ("),
expression, f(frame, ")")), contentsJavaSource);
}
@Override
public LocatableElement toXML()
{
LocatableElement switchEl = new LocatableElement(this, ELEMENT);
switchEl.addAttributeStructured("expression", expression);
addEnableAttribute(switchEl);
Element casesEl = new Element("cases");
casesContents.forEach(c -> casesEl.appendChild(c.toXML()));
switchEl.appendChild(casesEl);
if (defaultContents != null) {
Element defaultEl = new Element("default");
defaultContents.forEach(c -> defaultEl.appendChild(c.toXML()));
switchEl.appendChild(defaultEl);
}
return switchEl;
}
public SwitchElement(Element el)
{
expression = new FilledExpressionSlotFragment(el.getAttributeValue("expression"), el.getAttributeValue("expression-java"));
casesContents = new ArrayList<>();
Element casesEl = el.getChildElements("cases").get(0);
for (int i = 0; i < casesEl.getChildElements().size(); i++) {
final Element child = casesEl.getChildElements().get(i);
CodeElement member = Loader.loadElement(child);
casesContents.add(member);
member.setParent(this);
}
if (el.getChildElements("default").size() == 1) {
defaultContents = new ArrayList<>();
Element defaultEl = el.getChildElements("default").get(0);
for (int i = 0; i < defaultEl.getChildElements().size(); i++) {
final Element child = defaultEl.getChildElements().get(i);
CodeElement member = Loader.loadElement(child);
defaultContents.add(member);
member.setParent(this);
}
}
else if (el.getChildElements("default").size() == 0) {
defaultContents = null;
}
else {
throw new IllegalArgumentException();
}
enable = Boolean.valueOf(el.getAttributeValue("enable"));
}
@Override
public Frame createFrame(InteractionManager editor)
{
frame = new SwitchFrame(editor, expression, isEnable());
casesContents.forEach(c -> frame.getCasesCanvas().insertBlockAfter(c.createFrame(editor), null));
if (defaultContents != null) {
frame.addDefault();
defaultContents.forEach(c -> frame.getDefaultCanvas().insertBlockAfter(c.createFrame(editor), null));
}
return frame;
}
@Override
public HighlightedBreakpoint showDebugBefore(DebugInfo debug)
{
return frame.showDebugBefore(debug);
}
@Override
public void show(ShowReason reason)
{
frame.show(reason);
}
@Override
public Stream streamContained()
{
return Utility.concat(streamContained(casesContents), streamContained(defaultContents));
}
@Override
protected Stream getDirectSlotFragments()
{
return Stream.of(expression);
}
}
top,
use,
map,
class SwitchElement
. SwitchElement
. childrenUpTo
. toJavaSource
. toXML
. SwitchElement
. createFrame
. showDebugBefore
. show
. streamContained
. getDirectSlotFragments
211 neLoCode
+ 0 LoComm