author | wenzelm |
Fri, 04 Apr 2025 15:18:04 +0200 | |
changeset 82430 | 84d5590b40c1 |
parent 82428 | 70d3ef51db66 |
permissions | -rw-r--r-- |
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 | 126 |
private var _backward = History.empty |
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 | 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 | 174 |
try { |
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 | 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 | 189 |
|
190 |
def forward(view: View): Unit = GUI_Thread.require { |
|
191 |
if (!_forward.is_empty) { |
|
82430
84d5590b40c1
clarified history: eliminate pointless var _current;
wenzelm
parents:
82428
diff
changeset
|
192 |
_backward = _backward.push(recurrent) |
82428 | 193 |
_forward = _forward.pop |
194 |
goto_current(view) |
|
195 |
} |
|
196 |
} |
|
82410
4ca84abb16ef
support for navigation, independently of Navigator plugin;
wenzelm
parents:
diff
changeset
|
197 |
} |