package bluej.stride.generic;
import java.util.ArrayList;
import java.util.List;
import bluej.stride.operations.FrameOperation;
import bluej.stride.operations.PullUpContentsOperation;
import javafx.geometry.Bounds;
import javafx.scene.Node;
import bluej.utility.javafx.FXConsumer;
import threadchecker.OnThread;
import threadchecker.Tag;
public abstract class MultiCanvasFrame
extends Frame implements CanvasParent{
protected final List<FrameCanvas> canvases = new ArrayList<FrameCanvas>();
protected final List<FrameContentItem> dividers = new ArrayList<>();
protected final Sidebar sidebar;
| @param caption
| @param stylePrefix
|
protected MultiCanvasFrame(final InteractionManager editor, String caption, String stylePrefix)
{
super(editor, caption, stylePrefix);
sidebar = Sidebar.addSidebar(editor, getSidebarContainer(), getNode().layoutBoundsProperty(), stylePrefix);
}
|
| @param divider Divider to go above the canvas. Can be null.
| @param canvas The canvas to add.
|
protected void addCanvas(FrameContentItem divider, FrameCanvas canvas, int at)
{
canvases.add(at, canvas);
dividers.add(at, divider);
updateDisplay();
}
protected void addCanvas(FrameContentItem divider, FrameCanvas canvas)
{
addCanvas(divider, canvas, canvases.size());
}
protected void removeCanvas(FrameCanvas canvas)
{
int index = canvases.indexOf(canvas);
dividers.remove(index);
canvases.remove(index);
updateDisplay();
}
private void updateDisplay()
{
List<FrameContentItem> updatedChildren = new ArrayList<>();
updatedChildren.add(header);
for (int i = 0; i < canvases.size(); i++) {
if (dividers.get(i) != null) {
updatedChildren.add(dividers.get(i));
}
updatedChildren.add(canvases.get(i));
canvases.get(i).setLastInMulti(i == canvases.size() - 1);
}
modifyChildren(updatedChildren);
contents.setAll(updatedChildren);
}
protected void modifyChildren(List<FrameContentItem> updatedChildren)
{
}
@Override
@OnThread(Tag.FXPlatform)
public List getContextOperations()
{
List<FrameOperation> r = super.getContextOperations();
r.add(new PullUpContentsOperation(getEditor()));
return r;
}
protected final FrameCanvas getLastCanvas()
{
return canvases.get(canvases.size() - 1);
}
@Override
public double lowestCursorY()
{
Bounds canvasBounds = getLastCanvas().getSceneBounds();
return canvasBounds.getMaxY();
}
| Gets an update function for the sidebar.
| (Curried refers to functional programming term, meaning a function that
| takes one argument and returns a function which consumes the next)
|
protected FXConsumer updateSidebarCurried(String prefix)
{
return content -> sidebar.textProperty().set(prefix + "(" + content + ")");
}
@Override
protected List extends Node> calculateContents(List<Node> normalContent)
{
ArrayList<Node> content = new ArrayList<>(super.calculateContents(normalContent));
if (sidebar != null)
content.add(0, sidebar.getNode());
return content;
}
@Override
public Frame getFrame()
{
return this;
}
}
top,
use,
map,
abstract class MultiCanvasFrame
. MultiCanvasFrame
. addCanvas
. addCanvas
. removeCanvas
. updateDisplay
. modifyChildren
. getContextOperations
. getLastCanvas
. lowestCursorY
. updateSidebarCurried
. calculateContents
. getFrame
150 neLoCode
+ 7 LoComm