privatedef get_character(offset: Text.Offset, inc: Int = 0): Option[Text.Info[String]] =
JEdit_Lib.buffer_lock(buffer) { if (offset < 0 || offset >= buffer.getLength) None else { val breaker = new TextArea_JEdit.LineCharacterBreaker(text_area, offset) val i = if (breaker.offsetIsBoundary(offset)) offset else breaker.previousOf(offset) val range = if (inc == 0) Text.Range(i, breaker.nextOf(i)) elseif (inc < 0) Text.Range(breaker.previousOf(i), i) else { val j = breaker.nextOf(i)
Text.Range(j, breaker.nextOf(j))
}
get_text(range)
}
}
privatedef get_word(offset: Text.Offset, inc: Int = 0): Option[String] =
JEdit_Lib.buffer_lock(buffer) { if (offset < 0 || offset >= buffer.getLength) None else { val line = text_area.getLineOfOffset(offset) val line1 = if (line > 0) line - 1 else line val line2 = if (line < text_area.getLineCount - 1) line + 1 else line
val text_start = text_area.getLineStartOffset(line1) val text_stop = text_area.getLineEndOffset(line2) val text = text_area.getText(text_start, text_stop - text_start)
def word_range(pos: Int): Text.Range = { val a = buffer.getStringProperty("noWordSep") val b = text_area.getJoinNonWordChars val start = TextUtilities.findWordStart(text, pos - text_start, a, b, false, false) val stop = TextUtilities.findWordEnd(text, pos - text_start + 1, a, b, false, false)
Text.Range(start + text_start, stop + text_start)
}
val range = word_range(offset) val result = if (inc == 0) get_text(range) elseif (inc < 0 && range.start > 0) get_text(word_range(range.start - 1)) elseif (inc > 0 && range.stop > 0 && range.stop < buffer.getLength - 1) {
get_text(word_range(range.stop))
} else None
result.map(info =>
cat_lines(
split_lines(info.info)
.reverse.dropWhile(_.isEmpty)
.reverse.dropWhile(_.isEmpty)))
}
}
overridedef getIndexAtPoint(p: Point): Int = { val q = SwingUtilities.convertPoint(text_area, p, painter)
text_area.xyToOffset(q.x, q.y)
}
overridedef getCharacterBounds(index: Int): Rectangle =
(for {
info <- get_character(index)
gfx <- JEdit_Lib.gfx_range(text_area)(info.range)
} yield { val r = new Rectangle(gfx.x, gfx.y, gfx.length, painter.getLineHeight)
SwingUtilities.convertRectangle(painter, r, text_area)
}).getOrElse(new Rectangle())
overridedef getCharCount: Int = text_area.getBufferLength
overridedef getCaretPosition: Int = text_area.getCaretPosition
overridedef getAtIndex(part: Int, index: Int): String =
part match { case AccessibleText.CHARACTER => get_character(index).map(_.info).orNull case AccessibleText.WORD => get_word(index).orNull case _ => null
}
overridedef getAfterIndex(part: Int, index: Int): String =
part match { case AccessibleText.CHARACTER => get_character(index, inc = 1).map(_.info).orNull case AccessibleText.WORD => get_word(index, inc = 1).orNull case _ => null
}
overridedef getBeforeIndex(part: Int, index: Int): String =
part match { case AccessibleText.CHARACTER => get_character(index, inc = -1).map(_.info).orNull case AccessibleText.WORD => get_word(index, inc = -1).orNull case _ => null
}
overridedef getTextRange(start: Int, stop: Int): String =
JEdit_Lib.get_text(buffer, Text.Range(start min stop, start max stop)).orNull
overridedef setAttributes(start: Int, stop: Int, att: AttributeSet): Unit = if (!buffer.isReadOnly) {} // FIXME
overridedef getSelectionStart: Int = if (text_area.getSelectionCount == 1) text_area.getSelection(0).getStart else -1
overridedef getSelectionEnd: Int = if (text_area.getSelectionCount == 1) text_area.getSelection(0).getEnd else -1
overridedef getSelectedText: String = if (text_area.getSelectionCount == 1) { val start = getSelectionStart val stop = getSelectionEnd
buffer.getText(start, stop - start)
} else""
overridedef selectText(start: Int, stop: Int): Unit = if (!buffer.isReadOnly) {
text_area.selectNone()
text_area.addToSelection(new Selection.Range(start min stop, start max stop))
}
overridedef cut(start: Int, stop: Int): Unit = if (!buffer.isReadOnly) {
selectText(start, stop)
Registers.cut(text_area, '$')
}
overridedef paste(start: Int): Unit = if (!buffer.isReadOnly) {
selectText(start, start)
Registers.paste(text_area, '$')
}
overridedef delete(start: Int, stop: Int): Unit = if (!buffer.isReadOnly) {
selectText(start, stop)
buffer.remove(start min stop, (stop - start).abs)
}
overridedef setTextContents(s: String): Unit = if (!buffer.isReadOnly) {
JEdit_Lib.buffer_edit(buffer) {
text_area.selectNone()
buffer.remove(0, buffer.getLength)
buffer.insert(0, s)
}
}
overridedef insertTextAtIndex(start: Int, s: String): Unit = if (!buffer.isReadOnly) {
JEdit_Lib.buffer_edit(buffer) {
selectText(start, start)
buffer.insert(start, s)
}
}
overridedef replaceText(start: Int, stop: Int, s: String): Unit = if (!buffer.isReadOnly) {
JEdit_Lib.buffer_edit(buffer) {
selectText(start, stop)
buffer.remove(start min stop, (start - stop).abs)
buffer.insert(start min stop, s)
}
}
}
}
/* text area painter */
class Painter_Factory extends TextAreaPainterFactory { overridedef create(text_area: TextArea_JEdit): TextAreaPainter = new Painter(text_area)
}
class Painter(text_area: TextArea_JEdit) extends TextAreaPainter(text_area) { overridedef getAccessibleContext: AccessibleContext = { if (accessibleContext == null) {
accessibleContext = new Accessible_Context
}
accessibleContext
}
class Accessible_Context extends AccessibleJComponent {
}
}
}
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.