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