processing.app.syntax.PdeTextArea Maven / Gradle / Ivy
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
Part of the Processing project - http://processing.org
Copyright (c) 2012-16 The Processing Foundation
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package processing.app.syntax;
import java.awt.Cursor;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.HashMap;
import java.util.Map;
import processing.app.Mode;
import processing.app.ui.Editor;
/**
* Extensions to JEditTextArea to for the PDE. These were moved out of
* JavaTextArea because they were not Java-specific and would be helpful
* for other Mode implementations.
*/
public class PdeTextArea extends JEditTextArea {
protected final Editor editor;
protected Image gutterGradient;
/// the text marker for highlighting breakpoints in the gutter
static public final String BREAK_MARKER = "<>";
/// the text marker for highlighting the current line in the gutter
static public final String STEP_MARKER = "->";
/// maps line index to gutter text
protected final Map gutterText = new HashMap<>();
public PdeTextArea(TextAreaDefaults defaults, InputHandler inputHandler,
Editor editor) {
super(defaults, inputHandler);
this.editor = editor;
// change cursor to pointer in the gutter area
painter.addMouseMotionListener(gutterCursorMouseAdapter);
add(CENTER, painter);
// load settings from theme.txt
Mode mode = editor.getMode();
gutterGradient = mode.makeGradient("editor", Editor.LEFT_GUTTER, 500);
}
@Override
protected TextAreaPainter createPainter(final TextAreaDefaults defaults) {
return new PdeTextAreaPainter(this, defaults);
}
public Image getGutterGradient() {
return gutterGradient;
}
public void setMode(Mode mode) {
((PdeTextAreaPainter) painter).setMode(mode);
}
/**
* Set the gutter text of a specific line.
*
* @param lineIdx
* the line index (0-based)
* @param text
* the text
*/
public void setGutterText(int lineIdx, String text) {
gutterText.put(lineIdx, text);
painter.invalidateLine(lineIdx);
}
/**
* Clear the gutter text of a specific line.
*
* @param lineIdx
* the line index (0-based)
*/
public void clearGutterText(int lineIdx) {
gutterText.remove(lineIdx);
painter.invalidateLine(lineIdx);
}
/**
* Clear all gutter text.
*/
public void clearGutterText() {
for (int lineIdx : gutterText.keySet()) {
painter.invalidateLine(lineIdx);
}
gutterText.clear();
}
/**
* Retrieve the gutter text of a specific line.
* @param lineIdx the line index (0-based)
* @return the gutter text
*/
public String getGutterText(int lineIdx) {
return gutterText.get(lineIdx);
}
/**
* Convert a character offset to a horizontal pixel position inside
* the text area. Overridden to take gutter width into account.
* @param line the 0-based line number
* @param offset the character offset (0 is the first character on a line)
* @return the horizontal position
*/
@Override
public int _offsetToX(int line, int offset) {
return super._offsetToX(line, offset) + Editor.LEFT_GUTTER;
}
/**
* Convert a horizontal pixel position to a character offset. Overridden to
* take gutter width into account.
* @param line the 0-based line number
* @param x the horizontal pixel position
* @return he character offset (0 is the first character on a line)
*/
@Override
public int xToOffset(int line, int x) {
return super.xToOffset(line, x - Editor.LEFT_GUTTER);
}
/**
* Sets default cursor (instead of text cursor) in the gutter area.
*/
protected final MouseMotionAdapter gutterCursorMouseAdapter = new MouseMotionAdapter() {
private int lastX; // previous horizontal position of the mouse cursor
@Override
public void mouseMoved(MouseEvent me) {
if (me.getX() < Editor.LEFT_GUTTER) {
if (lastX >= Editor.LEFT_GUTTER) {
painter.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
} else {
if (lastX < Editor.LEFT_GUTTER) {
painter.setCursor(new Cursor(Cursor.TEXT_CURSOR));
}
}
lastX = me.getX();
}
};
public Editor getEditor() {
return editor;
}
}