# HG changeset patch # User wenzelm # Date 1393166119 -3600 # Node ID 767edb2c1e4e5214ffa131e526d4d7a6e6412629 # Parent 78c83cd477c106e5ed5173d16eeeb42fb92f1fe3 some rendering of completion range; tuned; diff -r 78c83cd477c1 -r 767edb2c1e4e src/Tools/jEdit/src/rendering.scala --- a/src/Tools/jEdit/src/rendering.scala Sun Feb 23 14:39:51 2014 +0100 +++ b/src/Tools/jEdit/src/rendering.scala Sun Feb 23 15:35:19 2014 +0100 @@ -273,35 +273,39 @@ /* completion */ + def completion_range(caret: Text.Offset): Option[Text.Range] = + if (!snapshot.is_outdated) { + snapshot.select(Text.Range(caret - 1, caret + 1), Rendering.completion_names_elements, _ => + { + case Completion.Names.Info(names) => Some(names.range) + case _ => None + }).headOption.map(_.info) + } + else None + def completion_names(caret: Text.Offset): Option[Completion.Names] = if (caret > 0 && !snapshot.is_outdated) { - val result = - snapshot.select(Text.Range(caret - 1, caret + 1), - Rendering.completion_names_elements, _ => - { - case Completion.Names.Info(names) => Some(names) - case _ => None - }) - result.headOption.map(_.info) + snapshot.select(Text.Range(caret - 1, caret + 1), Rendering.completion_names_elements, _ => + { + case Completion.Names.Info(names) => Some(names) + case _ => None + }).headOption.map(_.info) } else None def completion_context(caret: Text.Offset): Option[Completion.Context] = if (caret > 0) { - val result = - snapshot.select(Text.Range(caret - 1, caret + 1), - Rendering.completion_context_elements, _ => - { - case Text.Info(_, elem) - if elem.name == Markup.ML_STRING || elem.name == Markup.ML_COMMENT => - Some(Completion.Context.ML_inner) - case Text.Info(_, XML.Elem(Markup.Language(language, symbols, antiquotes), _)) => - Some(Completion.Context(language, symbols, antiquotes)) - case Text.Info(_, _) => - Some(Completion.Context.inner) - }) - result.headOption.map(_.info) + snapshot.select(Text.Range(caret - 1, caret + 1), Rendering.completion_context_elements, _ => + { + case Text.Info(_, elem) + if elem.name == Markup.ML_STRING || elem.name == Markup.ML_COMMENT => + Some(Completion.Context.ML_inner) + case Text.Info(_, XML.Elem(Markup.Language(language, symbols, antiquotes), _)) => + Some(Completion.Context(language, symbols, antiquotes)) + case Text.Info(_, _) => + Some(Completion.Context.inner) + }).headOption.map(_.info) } else None diff -r 78c83cd477c1 -r 767edb2c1e4e src/Tools/jEdit/src/rich_text_area.scala --- a/src/Tools/jEdit/src/rich_text_area.scala Sun Feb 23 14:39:51 2014 +0100 +++ b/src/Tools/jEdit/src/rich_text_area.scala Sun Feb 23 15:35:19 2014 +0100 @@ -104,6 +104,7 @@ { private var the_text_info: Option[(String, Text.Info[A])] = None + def is_active: Boolean = the_text_info.isDefined def text_info: Option[(String, Text.Info[A])] = the_text_info def info: Option[Text.Info[A]] = the_text_info.map(_._2) @@ -223,6 +224,11 @@ /* text background */ + private def get_caret_range(): Text.Range = + if (caret_visible && text_area.isCaretVisible) + JEdit_Lib.point_range(buffer, text_area.getCaretPosition) + else Text.Range(-1) + private val background_painter = new TextAreaExtension { override def paintScreenLineRange(gfx: Graphics2D, @@ -300,6 +306,7 @@ val clip_rect = gfx.getClipBounds val painter = text_area.getPainter val font_context = painter.getFontRenderContext + val caret_range = get_caret_range() var w = 0.0f var chunk = head @@ -317,11 +324,6 @@ if (s.isEmpty) 0.0f else chunk_font.getStringBounds(s, font_context).getWidth.toFloat - val caret_range = - if (caret_visible && text_area.isCaretVisible) - JEdit_Lib.point_range(buffer, text_area.getCaretPosition) - else Text.Range(-1) - val markup = for { r1 <- rendering.text_color(chunk_range, chunk_color) @@ -441,6 +443,9 @@ start: Array[Int], end: Array[Int], y: Int, line_height: Int) { robust_rendering { rendering => + val painter = text_area.getPainter + val caret_range = get_caret_range() + for (i <- 0 until physical_lines.length) { if (physical_lines(i) != -1) { val line_range = Text.Range(start(i), end(i)) @@ -473,6 +478,17 @@ gfx.setColor(rendering.hyperlink_color) gfx.drawRect(r.x, y + i * line_height, r.length - 1, line_height - 1) } + + // completion range + for { + caret <- caret_range.try_restrict(line_range) + if !hyperlink_area.is_active + range <- rendering.completion_range(caret.start) + r <- JEdit_Lib.gfx_range(text_area, range) + } { + gfx.setColor(painter.getCaretColor) + gfx.drawRect(r.x, y + i * line_height, r.length - 1, line_height - 1) + } } } }