package bluej.stride.framedjava.frames;

import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import bluej.stride.generic.CanvasParent;
import bluej.stride.generic.DocumentationTextArea;
import bluej.stride.framedjava.elements.CommentElement;
import bluej.stride.generic.Frame;
import bluej.stride.generic.FrameCanvas;
import bluej.stride.generic.FrameFactory;
import bluej.stride.generic.InteractionManager;
import bluej.stride.generic.RecallableFocus;
import bluej.stride.generic.SingleLineFrame;
import bluej.stride.operations.FrameOperation;
import bluej.stride.slots.EditableSlot;
import bluej.utility.Debug;
import bluej.utility.javafx.JavaFXUtil;
import bluej.utility.javafx.SharedTransition;
import threadchecker.OnThread;
import threadchecker.Tag;

import javafx.scene.Node;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;


| A statement with // for comments | @author Fraser McKay | public class CommentFrame extends SingleLineFrame implements CodeFrame<CommentElement>{ private static final String COMMENT_STYLE_PREFIX = "comment-"; private DocumentationTextArea comment; private CommentElement element; private Canvas diagonalLinesCanvas;
| Default constructor. | private CommentFrame(InteractionManager editor) { super(editor, null, COMMENT_STYLE_PREFIX); comment = new DocumentationTextArea(editor, this, getHeaderRow(), COMMENT_STYLE_PREFIX, () -> focusEnter(getHeaderRow())); comment.setDocComment(false); comment.setPromptText("Comment..."); comment.bindPrefMaxWidth(getHeaderRow().flowPaneWidth().subtract(1.0)); setHeaderRow(comment); JavaFXUtil.onceInScene(comment.getNode(), comment::hackFixSizing); comment.addEventFilter(KeyEvent.KEY_PRESSED, event -> { switch (event.getCode()) { case BACK_SPACE: backspaceAtStart(getHeaderRow(), comment); break; case DELETE: backspaceAtStart(getHeaderRow(), comment); break; case ESCAPE: escape(null, null); break; } }); getDiagonalLineCanvas(); }
| Creates a comment with a specific message. | @param comment Text of the comment | public CommentFrame(InteractionManager editor, String comment) { this(editor); } public static FrameFactory getFactory() { return new FrameFactory<CommentFrame>() { @Override public CommentFrame createBlock(InteractionManager editor) { return new CommentFrame(editor); } @Override public Class getBlockClass() { return CommentFrame.class; } }; } private Canvas getDiagonalLineCanvas() { if (diagonalLinesCanvas == null) { diagonalLinesCanvas = new Canvas(16, 16); diagonalLinesCanvas.setManaged(false); GraphicsContext gc = diagonalLinesCanvas.getGraphicsContext2D(); gc.setStroke(Color.rgb(180, 180, 180)); gc.strokeLine(6, 0, 0, 10); gc.strokeLine(9, 0, 0, 15); header.addOverlay(diagonalLinesCanvas); } return diagonalLinesCanvas; } @Override public void updateAppearance(FrameCanvas parentCanvas) { super.updateAppearance(parentCanvas); if (parentCanvas == null) { return; } JavaFXUtil.setPseudoclass("bj-fields", !isField(parentCanvas), getNode()); JavaFXUtil.setPseudoclass("bj-before-local-var",!isField(parentCanvas) && isBeforeVarFrame(parentCanvas), getNode()); if (Arrays.asList(CanvasParent.CanvasKind.FIELDS, CanvasParent.CanvasKind.CONSTRUCTORS, CanvasParent.CanvasKind.METHODS) .contains(parentCanvas.getParent().getChildKind(parentCanvas))) { addStyleClass(isInInterface(parentCanvas) ? "interface-comment-frame" : "class-comment-frame"); } else { removeStyleClass(isInInterface(parentCanvas) ? "interface-comment-frame" : "class-comment-frame"); } } private boolean isField(FrameCanvas parentCanvas) { if (parentCanvas == null) { bluej.utility.Debug.printCallStack("parentCanvas shouldn't be null"); return false; } return parentCanvas.getParent().getChildKind(parentCanvas) == CanvasParent.CanvasKind.FIELDS; } private boolean isBeforeVarFrame(FrameCanvas parentCanvas) { Frame frameAfter = parentCanvas.getFrameAfter(getCursorAfter()); int counter = 0; while ( frameAfter != null && !frameAfter.isEffectiveFrame() && counter < 2){ counter++; frameAfter = parentCanvas.getFrameAfter(frameAfter.getCursorAfter()); } return frameAfter instanceof VarFrame; } @Override public void setElementEnabled(boolean enabled) { } @Override public boolean canHaveEnabledState(boolean enabled) { return enabled; } public String getComment() { return comment.getText(); } @Override public void regenerateCode() { element = new CommentElement(this); } @Override public CommentElement getCode() { return element; } public RecallableFocus getFocusable() { return comment; } @Override public EditableSlot getErrorShowRedirect() { return null; } @Override @OnThread(Tag.FXPlatform) public void setView(View oldView, View newView, SharedTransition animation) { super.setView(oldView, newView, animation); if (newView == View.JAVA_PREVIEW) { getDiagonalLineCanvas().opacityProperty().bind(animation.getOppositeProgress()); animation.addOnStopped(getDiagonalLineCanvas().opacityProperty()::unbind); } else { getDiagonalLineCanvas().opacityProperty().bind(animation.getProgress()); animation.addOnStopped(getDiagonalLineCanvas().opacityProperty()::unbind); } if (newView == View.BIRDSEYE_NODOC) { getDiagonalLineCanvas().setVisible(false); comment.getNode().setManaged(false); } else { getDiagonalLineCanvas().setVisible(true); comment.getNode().setManaged(true); } } public boolean isEffectiveFrame() { return false; } }

.   CommentFrame
.   CommentFrame
.   getFactory
.   createBlock
.   getBlockClass
.   getDiagonalLineCanvas
.   updateAppearance
.   isField
.   isBeforeVarFrame
.   setElementEnabled
.   canHaveEnabledState
.   getComment
.   regenerateCode
.   getCode
.   getFocusable
.   getErrorShowRedirect
.   setView
.   isEffectiveFrame




289 neLoCode + 5 LoComm