package bluej.stride.framedjava.frames;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import bluej.stride.framedjava.ast.NameDefSlotFragment;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.ast.TypeSlotFragment;
import bluej.stride.framedjava.canvases.JavaCanvas;
import bluej.stride.framedjava.elements.CodeElement;
import bluej.stride.framedjava.elements.SandwichCanvasesElement;
import bluej.stride.framedjava.elements.TryElement;
import bluej.stride.framedjava.slots.TypeSlot;
import bluej.stride.generic.Frame;
import bluej.stride.generic.FrameCanvas;
import bluej.stride.generic.FrameContentItem;
import bluej.stride.generic.FrameContentRow;
import bluej.stride.generic.FrameFactory;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.SandwichCanvasesFrame;
import bluej.stride.slots.EditableSlot;
import bluej.stride.slots.FocusParent;
import bluej.stride.slots.HeaderItem;
import bluej.stride.slots.SlotLabel;
import bluej.stride.slots.SlotTraversalChars;
import bluej.stride.slots.SlotValueListener;
import bluej.stride.slots.TypeCompletionCalculator;
import bluej.stride.slots.VariableNameDefTextSlot;
import bluej.utility.Debug;
import bluej.utility.Utility;
import threadchecker.OnThread;
import threadchecker.Tag;


| Container-block representing a try-catch statement. | @author Fraser McKay | public class TryFrame extends SandwichCanvasesFrame{ private static final String TRY_STYLE_PREFIX = "try-"; private final List<TypeSlot> catchTypes = new ArrayList<>(); private final List<VariableNameDefTextSlot> catchVars = new ArrayList<>();
| Default constructor. | private TryFrame(InteractionManager editor) { super(editor, "try", "catch", "finally", TRY_STYLE_PREFIX); }
| Construct an TryFrame by wrapping the given frames | public TryFrame(InteractionManager editor, List<Frame> contents) { this(editor); getFirstCanvas().getFirstCursor().insertFramesAfter(contents); }
| | @param editor | @param tryContents | @param catchTypes Same length as catchContents | @param catchNames Same length as catchContents | @param catchContents If empty, no catches. Cannot be null. | @param finallyContents If null, no finally. | public TryFrame(InteractionManager editor, List<Frame> tryContents, List<TypeSlotFragment> catchTypes, List<NameDefSlotFragment> catchNames, List<List<Frame>> catchContents, List<Frame> finallyContents, boolean enabled) { this(editor, tryContents); for (int i = 0; i < catchContents.size(); i++) { addIntermediateCanvas(Arrays.asList(catchTypes.get(i), catchNames.get(i)), catchContents.get(i)); } if (finallyContents != null) { addTailCanvas(); finallyContents.forEach(f -> getTailCanvas().insertBlockAfter(f, null)); } frameEnabledProperty.set(enabled); } @Override protected FrameContentRow getFrameContentRow(List<SlotFragment> slots, JavaCanvas canvas, int at) { FrameContentRow row = new FrameContentRow(this, "catch-"); TypeSlot type = new TypeSlot(editor, this, this, row, TypeSlot.Role.THROWS_CATCH, "catch-type-"); type.setSimplePromptText("type"); type.addClosingChar(' '); VariableNameDefTextSlot var = new VariableNameDefTextSlot(editor, this, this, row, "catch-var-"); var.setPromptText("name"); var.addValueListener(new SlotValueListener() { @Override public boolean valueChanged(HeaderItem slot, String oldValue, String newValue, FocusParent<HeaderItem> parent) { if (newValue.contains(",")) { return false; } if (newValue.contains(")")) { if (newValue.endsWith(")")) { parent.focusRight(var); } return false; } return true; } @Override public void backSpacePressedAtStart(HeaderItem slot) { row.focusLeft(slot); } }); if (slots != null) { if (slots.size() != 2) { Debug.printCallStack("slots has to include the exception type and var name, but the size is " + slots.size()); } type.setText((TypeSlotFragment) slots.get(0)); var.setText((NameDefSlotFragment) slots.get(1)); } row.setHeaderItems(Arrays.asList(new SlotLabel("catch", "catch-caption", "caption"), new SlotLabel(" (", "if-bracket-opening"), type, var, new SlotLabel(")"))); catchTypes.add(at, type); catchVars.add(at, var); return row; } @Override public @OnThread(Tag.FXPlatform) boolean backspaceAtStart(FrameContentItem srcRow, HeaderItem src) { if (catchTypes.contains(src)) { if (((FrameContentRow)srcRow).getSlotsDirect().allMatch(EditableSlot::isAlmostBlank)) { FrameCanvas canvas = getCanvases().collect(Collectors.toList()).get(1 + catchTypes.indexOf(src)); pullUpCanvasContents(canvas.getFirstCursor().getUp(), canvas); } } return super.backspaceAtStart(srcRow, src); } public static FrameFactory getFactory() { return new FrameFactory<TryFrame>() { @Override public TryFrame createBlock(InteractionManager editor) { TryFrame tryFrame = new TryFrame(editor); tryFrame.addIntermediateCanvas(); tryFrame.getFirstCanvas().getFirstCursor().requestFocus(); return tryFrame; } @Override public TryFrame createBlock(InteractionManager editor, List<Frame> contents) { final TryFrame tryFrame = new TryFrame(editor, contents); tryFrame.addIntermediateCanvas(); tryFrame.getFirstCanvas().getFirstCursor().requestFocus(); return tryFrame; } @Override public Class getBlockClass() { return TryFrame.class; } }; } @Override protected SandwichCanvasesElement regenerateCodeElement(List<CodeElement> firstCanvasContents, List<List<CodeElement>> intermediateCanvasesContents, List<CodeElement> tailCanvasContents, boolean enabled) { return new TryElement(this, firstCanvasContents, Utility.mapList(catchTypes, TypeSlot::getSlotElement), Utility.mapList(catchVars, VariableNameDefTextSlot::getSlotElement), intermediateCanvasesContents, tailCanvasContents, enabled); } }
top, use, map, class TryFrame

.   TryFrame
.   TryFrame
.   TryFrame
.   getFrameContentRow
.   valueChanged
.   backSpacePressedAtStart
.   getFactory
.   createBlock
.   createBlock
.   getBlockClass
.   regenerateCodeElement




219 neLoCode + 10 LoComm