src/Tools/jEdit/src/isabelle_navigator.scala
author wenzelm
Fri, 04 Apr 2025 15:18:04 +0200
changeset 82430 84d5590b40c1
parent 82428 70d3ef51db66
permissions -rw-r--r--
clarified history: eliminate pointless var _current;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/isabelle_navigator.scala
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     3
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     4
Navigate history of notable source positions.
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     5
*/
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     6
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     8
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
     9
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    10
import org.gjt.sp.jedit.{View, Buffer, EditPane}
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    11
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    12
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    13
import isabelle._
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    14
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    15
object Isabelle_Navigator {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    16
  object Pos {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    17
    val none: Pos = new Pos(Document_ID.none, "", 0)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    18
    def make(name: String, offset: Int): Pos = new Pos(Document_ID.make(), name, offset)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    19
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    20
    def apply(buffer: Buffer): Pos =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    21
      if (buffer == null) Pos.none else make(JEdit_Lib.buffer_name(buffer), 0)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    22
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    23
    def apply(edit_pane: EditPane): Pos =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    24
      if (edit_pane == null) none
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    25
      else {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    26
        val buffer = edit_pane.getBuffer
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    27
        if (buffer != null && buffer.isLoaded && !buffer.isUntitled) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    28
          make(JEdit_Lib.buffer_name(buffer), edit_pane.getTextArea.getCaretPosition)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    29
        }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    30
        else none
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    31
      }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    32
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    33
    def apply(view: View): Pos =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    34
      if (view == null) none else apply(view.getEditPane)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    35
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    36
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    37
  final class Pos private(
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    38
    val id: Document_ID.Generic,
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    39
    val name: String,
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    40
    val offset: Int
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    41
  ) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    42
    def defined: Boolean = id != Document_ID.none
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    43
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    44
    override def toString: String =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    45
      if (defined) "(offset " + offset + " of " + quote(name) + ")" else "Pos.none"
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    46
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    47
    override def hashCode: Int = id.hashCode
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    48
    override def equals(other: Any): Boolean =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    49
      other match {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    50
        case that: Pos => id == that.id
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    51
        case _ => false
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    52
      }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    53
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    54
    def equiv(that: Pos): Boolean = name == that.name && offset == that.offset
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    55
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    56
    def convert(edit_name: String, edit: Text.Edit): Pos = {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    57
      if (name == edit_name) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    58
        val offset1 = edit.convert(offset)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    59
        if (offset == offset1) this else Pos.make(name, offset1)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    60
      }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    61
      else this
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    62
    }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    63
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    64
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    65
  object History {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    66
    val limit: Int = 500
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    67
    val empty: History = new History(Linear_Set.empty)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    68
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    69
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    70
  class History(hist: Linear_Set[Pos]) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    71
    override def toString: String =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    72
      size match {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    73
        case 0 => "History.empty"
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    74
        case n => "History(" + n + ")"
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    75
      }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    76
    def is_empty: Boolean = hist.isEmpty
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    77
    def size: Int = hist.size
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    78
    def iterator: Iterator[Pos] = hist.iterator
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    79
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    80
    def top: Pos = if (hist.isEmpty) Pos.none else hist.head
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    81
    def pop: History = if (hist.isEmpty) this else new History(hist.delete_after(None))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    82
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    83
    def push(pos: Pos): History =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    84
      if (!pos.defined || pos.equiv(top)) this
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    85
      else {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    86
        val hist1 =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    87
          if (hist.size < History.limit) hist
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    88
          else hist.delete_after(hist.prev(hist.last))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    89
        new History(hist1.insert_after(None, pos))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    90
      }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    91
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    92
    def convert(name: String, edit: Text.Edit): History =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    93
      new History(
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    94
        hist.foldLeft(hist) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    95
          case (h, pos) =>
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    96
            val prev = h.prev(pos)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    97
            val pos0 = prev.getOrElse(Pos.none)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    98
            val pos1 = pos.convert(name, edit)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
    99
            if (pos1.equiv(pos0)) h.delete_after(prev)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   100
            else if (pos1.equiv(pos)) h
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   101
            else h.delete_after(prev).insert_after(prev, pos1)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   102
        }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   103
      )
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   104
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   105
    def close(names: Set[String]): History =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   106
      new History(
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   107
        hist.foldLeft(hist) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   108
          case (h, pos) =>
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   109
            val prev = h.prev(pos)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   110
            val pos0 = prev.getOrElse(Pos.none)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   111
            if (names.contains(pos.name) || pos.equiv(pos0)) h.delete_after(prev)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   112
            else h
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   113
        }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   114
      )
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   115
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   116
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   117
  final class State private[Isabelle_Navigator](view: View) {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   118
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   119
}
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   120
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   121
class Isabelle_Navigator {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   122
  import Isabelle_Navigator.{Pos, History}
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   123
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   124
  // owned by GUI thread
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   125
  private var _bypass = false
82425
20f79e12ad20 tuned signature: proper private vars;
wenzelm
parents: 82424
diff changeset
   126
  private var _backward = History.empty
20f79e12ad20 tuned signature: proper private vars;
wenzelm
parents: 82424
diff changeset
   127
  private var _forward = History.empty
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   128
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   129
  def current: Pos = _backward.top
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   130
  def recurrent: Pos = _forward.top
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   131
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   132
  override def toString: String = {
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   133
    val size = _backward.size + _forward.size
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   134
    "Isabelle_Navigator(" + (if (size == 0) "" else size.toString) + ")"
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   135
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   136
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   137
  private def convert(name: String, edit: Text.Edit): Unit = GUI_Thread.require {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   138
    _backward = _backward.convert(name, edit)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   139
    _forward = _forward.convert(name, edit)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   140
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   141
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   142
  private def close(names: Set[String]): Unit = GUI_Thread.require {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   143
    _backward = _backward.close(names)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   144
    _forward = _forward.close(names)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   145
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   146
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   147
  private val buffer_listener =
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   148
    JEdit_Lib.buffer_listener((buffer, edit) => convert(JEdit_Lib.buffer_name(buffer), edit))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   149
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   150
  def exit(buffers: IterableOnce[Buffer]): Unit = GUI_Thread.require {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   151
    buffers.iterator.foreach(_.removeBufferListener(buffer_listener))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   152
    close(buffers.iterator.map(JEdit_Lib.buffer_name).toSet)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   153
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   154
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   155
  def init(buffers: IterableOnce[Buffer]): Unit = GUI_Thread.require {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   156
    exit(buffers)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   157
    buffers.iterator.foreach(_.addBufferListener(buffer_listener))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   158
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   159
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   160
  def record(pos: Pos): Unit = GUI_Thread.require {
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   161
    if (!_bypass && pos.defined && !pos.equiv(current)) {
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   162
      _backward = _backward.push(pos)
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   163
      _forward = History.empty
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   164
    }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   165
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   166
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   167
  def record(buffer: Buffer): Unit = record(Pos(buffer))
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   168
  def record(edit_pane: EditPane): Unit = record(Pos(edit_pane))
82413
a6046b6d23b4 more accurate navigator position;
wenzelm
parents: 82410
diff changeset
   169
  def record(view: View): Unit = record(Pos(view))
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   170
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   171
  def goto_current(view: View): Unit = GUI_Thread.require {
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   172
    if (current.defined) {
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   173
      val b = _bypass
82424
7fe17f5d1524 tuned signature;
wenzelm
parents: 82423
diff changeset
   174
      try {
7fe17f5d1524 tuned signature;
wenzelm
parents: 82423
diff changeset
   175
        _bypass = true
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   176
        PIDE.editor.goto_file(true, view, current.name, offset = current.offset)
82424
7fe17f5d1524 tuned signature;
wenzelm
parents: 82423
diff changeset
   177
      }
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   178
      finally { _bypass = b }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   179
    }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   180
  }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   181
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   182
  def backward(view: View): Unit = GUI_Thread.require {
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   183
    if (!_backward.is_empty) {
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   184
      _forward = _forward.push(current).push(Pos(view))
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   185
      _backward = _backward.pop
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   186
      goto_current(view)
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   187
    }
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   188
  }
82428
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   189
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   190
  def forward(view: View): Unit = GUI_Thread.require {
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   191
    if (!_forward.is_empty) {
82430
84d5590b40c1 clarified history: eliminate pointless var _current;
wenzelm
parents: 82428
diff changeset
   192
      _backward = _backward.push(recurrent)
82428
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   193
      _forward = _forward.pop
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   194
      goto_current(view)
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   195
    }
70d3ef51db66 tuned source structure;
wenzelm
parents: 82425
diff changeset
   196
  }
82410
4ca84abb16ef support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff changeset
   197
}