clarified target position: line start + offset (or column);
authorwenzelm
Fri, 04 Apr 2025 15:02:49 +0200
changeset 82429 d37f279ae3bf
parent 82428 70d3ef51db66
child 82430 84d5590b40c1
clarified target position: line start + offset (or column); more uniform treatment of open buffer vs. loaded file;
src/Tools/jEdit/src/jedit_editor.scala
--- a/src/Tools/jEdit/src/jedit_editor.scala	Fri Apr 04 14:46:38 2025 +0200
+++ b/src/Tools/jEdit/src/jedit_editor.scala	Fri Apr 04 15:02:49 2025 +0200
@@ -116,30 +116,20 @@
     view: View,
     name: String,
     offset: Text.Offset = -1,
-    line: Int = -1,
-    column: Int = -1
+    line: Int = -1
   ): Unit = {
     GUI_Thread.require {}
 
     PIDE.plugin.navigator.record(view)
 
+    def buffer_offset(buffer: Buffer): Text.Offset =
+      ((if (line < 0) 0 else buffer.getLineStartOffset(line min buffer.getLineCount)) +
+        (if (offset < 0) 0 else offset)) min buffer.getLength
+
     JEdit_Lib.jedit_buffer(name) match {
       case Some(buffer) =>
         if (focus) view.goToBuffer(buffer) else view.showBuffer(buffer)
-        val text_area = view.getTextArea
-
-        try {
-          if (offset >= 0) text_area.moveCaretPosition(offset)
-          else if (line >= 0) {
-            val line_start = text_area.getBuffer.getLineStartOffset(line)
-            text_area.moveCaretPosition(line_start)
-            if (column > 0) text_area.moveCaretPosition(line_start + column)
-          }
-        }
-        catch {
-          case _: ArrayIndexOutOfBoundsException =>
-          case _: IllegalArgumentException =>
-        }
+        view.getTextArea.moveCaretPosition(buffer_offset(buffer))
 
       case None =>
         val is_dir =
@@ -153,28 +143,20 @@
         if (is_dir) VFSBrowser.browseDirectory(view, name)
         else if (!Isabelle_System.open_external_file(name)) {
           val buffer = jEdit.openFile(view, name)
-          if (buffer != null) {
-            if (offset < 0) {
-              val marker =
-                if (line <= 0) ""
-                else if (column <= 0) "+line:" + (line + 1)
-                else "+line:" + (line + 1) + "," + (column + 1)
-              if (marker.nonEmpty) jEdit.gotoMarker(view, buffer, marker)
-            }
-            else {
-              AwtRunnableQueue.INSTANCE.runAfterIoTasks(() =>
-                if (view.getBuffer == buffer) {
-                  view.getTextArea.setCaretPosition(offset)
-                  buffer.setIntegerProperty(Buffer.CARET, offset)
-                  buffer.setBooleanProperty(Buffer.CARET_POSITIONED, true)
-                }
-                else {
-                  buffer.setIntegerProperty(Buffer.CARET, offset)
-                  buffer.setBooleanProperty(Buffer.CARET_POSITIONED, true)
-                  buffer.unsetProperty(Buffer.SCROLL_VERT)
-                }
-              )
-            }
+          if (buffer != null && (line >= 0 || offset >= 0)) {
+            AwtRunnableQueue.INSTANCE.runAfterIoTasks({ () =>
+              val target = buffer_offset(buffer)
+              if (view.getBuffer == buffer) {
+                view.getTextArea.setCaretPosition(target)
+                buffer.setIntegerProperty(Buffer.CARET, target)
+                buffer.setBooleanProperty(Buffer.CARET_POSITIONED, true)
+              }
+              else {
+                buffer.setIntegerProperty(Buffer.CARET, target)
+                buffer.setBooleanProperty(Buffer.CARET_POSITIONED, true)
+                buffer.unsetProperty(Buffer.SCROLL_VERT)
+              }
+            })
           }
         }
     }
@@ -215,13 +197,11 @@
   def hyperlink_file(
     focus: Boolean,
     name: String,
-    offset: Text.Offset = -1,
     line: Int = -1,
-    column: Int = -1
+    offset: Text.Offset = -1
   ): Hyperlink =
     new Hyperlink {
-      def follow(view: View): Unit =
-        goto_file(focus, view, name, offset = offset, line = line, column = column)
+      def follow(view: View): Unit = goto_file(focus, view, name, line = line, offset = offset)
       override def toString: String = "file " + quote(name)
     }
 
@@ -233,7 +213,7 @@
   ) : Option[Hyperlink] = {
     for (platform_path <- PIDE.resources.source_file(source_name)) yield {
       def hyperlink(pos: Line.Position) =
-        hyperlink_file(focus, platform_path, line = pos.line, column = pos.column)
+        hyperlink_file(focus, platform_path, line = pos.line, offset = pos.column)
 
       if (offset > 0) {
         PIDE.resources.get_file_content(PIDE.resources.node_name(platform_path)) match {