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