package bluej.stride.framedjava.frames;
import java.util.List;
import java.util.stream.Stream;
import bluej.stride.slots.EditableSlot;
import javafx.beans.binding.BooleanExpression;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Cursor;
import bluej.stride.framedjava.ast.ExpressionSlotFragment;
import bluej.stride.framedjava.ast.HighlightedBreakpoint;
import bluej.stride.framedjava.canvases.JavaCanvas;
import bluej.stride.framedjava.elements.ReturnElement;
import bluej.stride.framedjava.slots.OptionalExpressionSlot;
import bluej.stride.generic.Frame;
import bluej.stride.generic.FrameCanvas;
import bluej.stride.generic.FrameFactory;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.SingleLineFrame;
import bluej.stride.operations.FrameOperation;
import bluej.stride.slots.HeaderItem;
import bluej.stride.slots.SlotLabel;
import bluej.utility.javafx.FXRunnable;
import bluej.utility.javafx.JavaFXUtil;
| A return statement
| @author Fraser McKay
|
public class ReturnFrame extends SingleLineFrame
implements CodeFrame<ReturnElement>, DebuggableFrame{
private final OptionalExpressionSlot value;
private ReturnElement element;
private final SimpleStringProperty returnType = new SimpleStringProperty();
private final SimpleBooleanProperty showingValue = new SimpleBooleanProperty(true);
private final BooleanExpression notShowingValue = showingValue.not();
| Default constructor.
| @param editor
|
private ReturnFrame(InteractionManager editor)
{
super(editor, "return", "return-");
SlotLabel spacer = new SlotLabel(" ");
spacer.setOpacity(0.0);
spacer.setCursor(Cursor.TEXT);
value = new OptionalExpressionSlot(editor, this, this, getHeaderRow(), "return-");
value.setSimplePromptText("expression");
value.bindTargetType(returnType);
JavaFXUtil.addChangeListener(showingValue, showing -> {
if (!showing)
value.cleanup();
});
spacer.setOnMouseClicked(e -> {
showingValue.set(true);
value.requestFocus();
e.consume();
});
getHeaderRow().bindContentsConcat(FXCollections.<ObservableList<? extends HeaderItem>>observableArrayList(
FXCollections.observableArrayList(headerCaptionLabel),
JavaFXUtil.listBool(notShowingValue, spacer),
JavaFXUtil.listBool(showingValue, value),
FXCollections.observableArrayList(previewSemi)
));
value.onLostFocus(() -> {
if ("void".equals(returnType.get()) && value.getText().isEmpty())
showingValue.set(false);
} );
}
public ReturnFrame(InteractionManager editor, ExpressionSlotFragment val, boolean enabled)
{
this(editor);
if (val != null)
{
showingValue.set(true);
value.setText(val);
}
else
{
showingValue.set(false);
}
frameEnabledProperty.set(enabled);
}
@Override
public void regenerateCode()
{
final boolean generateReturnValue = showingValue.get() && (!value.getText().isEmpty() || value.isCurrentlyCompleting());
element = new ReturnElement(this, generateReturnValue ? value.getSlotElement() : null, frameEnabledProperty.get());
}
@Override
public ReturnElement getCode()
{
return element;
}
public static FrameFactory getFactory()
{
return new FrameFactory<ReturnFrame>() {
@Override
public ReturnFrame createBlock(InteractionManager editor)
{
return new ReturnFrame(editor);
}
@Override
public Class getBlockClass()
{
return ReturnFrame.class;
}
};
}
@Override
public void updateAppearance(FrameCanvas parentCanvas)
{
super.updateAppearance(parentCanvas);
for (Frame f = parentCanvas == null ? null : parentCanvas.getParent().getFrame(); f != null; f = f.getParentCanvas() == null ? null : f.getParentCanvas().getParent().getFrame())
{
if (f instanceof NormalMethodFrame)
{
NormalMethodFrame mf = (NormalMethodFrame)f;
returnType.unbind();
returnType.bind(mf.returnTypeProperty());
if (!"void".equals(returnType.get()))
showingValue.set(true);
return;
}
}
returnType.unbind();
returnType.set(null);
showingValue.set(false);
}
public FXRunnable getRemoveFilledValueAction()
{
if (value.getText().equals(""))
{
showingValue.set(false);
return null;
}
else if (showingValue.get())
return () -> showingValue.set(false);
else{ return null;
}
}
@Override
public Stream getPossiblyHiddenSlotsDirect()
{
return Stream.of(value);
}
public void showValue()
{
showingValue.set(true);
}
}
. ReturnFrame
. HeaderItem>>observableArrayList
. ReturnFrame
. regenerateCode
. getCode
. getFactory
. createBlock
. getBlockClass
. updateAppearance
. getRemoveFilledValueAction
. getPossiblyHiddenSlotsDirect
. showValue
220 neLoCode
+ 4 LoComm