package bluej.stride.framedjava.frames;

import javafx.util.Duration;

import bluej.stride.framedjava.ast.CallExpressionSlotFragment;
import bluej.stride.framedjava.ast.ExpressionSlotFragment;
import bluej.stride.framedjava.elements.CallElement;
import bluej.stride.framedjava.slots.CallExpressionSlot;
import bluej.stride.framedjava.slots.ExpressionSlot;
import bluej.stride.framedjava.slots.StructuredSlot.SplitInfo;
import bluej.stride.generic.FrameCanvas;
import bluej.stride.generic.FrameContentItem;
import bluej.stride.generic.FrameCursor;
import bluej.stride.generic.FrameFactory;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.SingleLineFrame;
import bluej.stride.slots.HeaderItem;
import bluej.utility.javafx.JavaFXUtil;
import threadchecker.OnThread;
import threadchecker.Tag;


| A method call, e.g. "do x(param y)" |* @author Fraser McKay */ public class CallFrame extends SingleLineFrame implements CodeFrame<CallElement>, DebuggableFrame{ private final ExpressionSlot<CallExpressionSlotFragment> content; | |private CallElement element; | |/** | Default constructor. | @param editor | private CallFrame(InteractionManager editor) { super(editor, null, "do-"); content = new CallExpressionSlot(editor, this, this, getHeaderRow(), "do-method-name-", CallExpressionSlot.CALL_HINTS); content.setText("()"); content.setMethodCallPromptText("method-name"); setHeaderRow(content, previewSemi); content.onTextPropertyChange(s -> checkForTopLevelEquals()); content.addFocusListener(this); } @OnThread(Tag.FXPlatform) public CallFrame(InteractionManager editor, String beforeCursor, String afterCursor) { this(editor); this.content.setSplitText(beforeCursor, afterCursor); } public CallFrame(InteractionManager editor, ExpressionSlotFragment e, boolean enabled) { this(editor); this.content.setText(e); frameEnabledProperty.set(enabled); } @Override public void regenerateCode() { element = new CallElement(this, content.getSlotElement(), frameEnabledProperty.get()); } @Override public CallElement getCode() { return element; } public static FrameFactory getFactory() { return new FrameFactory<CallFrame>() { @Override public CallFrame createBlock(InteractionManager editor) { return new CallFrame(editor); } @Override public Class getBlockClass() { return CallFrame.class; } }; } private void checkForTopLevelEquals() { SplitInfo info = content.trySplitOnEquals(); if (info != null && getParentCanvas() != null) { getParentCanvas().replaceBlock(this, new AssignFrame(getEditor(), info.lhs, info.rhs)); } } @Override public void setParentCanvas(FrameCanvas parentCanvas) { super.setParentCanvas(parentCanvas); checkForTopLevelEquals(); } @Override public boolean deleteAtEnd(FrameContentItem row, HeaderItem src) { if (contents.size() > 0 && (src == contents.get(0) || row == contents.get(0))) { if (isAlmostBlank()) { deleteOurselves(); return true; } } return false; } @Override public void checkForEmptySlot() { if (content.isEmpty()) { deleteOurselves(); } } private void deleteOurselves() { FrameCanvas parentCanvas = getParentCanvas(); FrameCursor cursorBefore = getCursorBefore(); parentCanvas.removeBlock(this); cursorBefore.requestFocus(); } @Override @OnThread(Tag.FXPlatform) public void insertedWithCtrl() { JavaFXUtil.runAfter(Duration.millis(100), content::showSuggestion); } }

.   CallFrame
.   CallFrame
.   CallFrame
.   regenerateCode
.   getCode
.   getFactory
.   createBlock
.   getBlockClass
.   checkForTopLevelEquals
.   setParentCanvas
.   deleteAtEnd
.   checkForEmptySlot
.   deleteOurselves
.   insertedWithCtrl




172 neLoCode + 5 LoComm