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 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