author | wenzelm |
Tue, 29 Nov 2011 20:18:02 +0100 | |
changeset 45672 | a497c5d4a523 |
parent 45666 | d83797ef0d2d |
child 45709 | 87017fcbad83 |
permissions | -rw-r--r-- |
43282
5d294220ca43
moved sources -- eliminated Netbeans artifact of jedit package directory;
wenzelm
parents:
42327
diff
changeset
|
1 |
/* Title: Tools/jEdit/src/isabelle_hyperlinks.scala |
36760 | 2 |
Author: Fabian Immler, TU Munich |
3 |
||
4 |
Hyperlink setup for Isabelle proof documents. |
|
5 |
*/ |
|
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
6 |
|
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
7 |
package isabelle.jedit |
34569 | 8 |
|
34760 | 9 |
|
36015 | 10 |
import isabelle._ |
11 |
||
34569 | 12 |
import java.io.File |
13 |
||
34791 | 14 |
import gatchan.jedit.hyperlinks.{Hyperlink, HyperlinkSource, AbstractHyperlink} |
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
15 |
|
34791 | 16 |
import org.gjt.sp.jedit.{View, jEdit, Buffer, TextUtilities} |
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
17 |
|
34588 | 18 |
|
44580
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
19 |
private class Internal_Hyperlink(name: String, start: Int, end: Int, line: Int, offset: Int) |
34569 | 20 |
extends AbstractHyperlink(start, end, line, "") |
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
21 |
{ |
44580
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
22 |
override def click(view: View) |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
23 |
{ |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
24 |
val text_area = view.getTextArea |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
25 |
if (Isabelle.buffer_name(view.getBuffer) == name) |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
26 |
text_area.moveCaretPosition(offset) |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
27 |
else |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
28 |
Isabelle.jedit_buffer(name) match { |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
29 |
case Some(buffer) => |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
30 |
view.setBuffer(buffer) |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
31 |
text_area.moveCaretPosition(offset) |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
32 |
case None => |
3bc9a215a56d
some support for hyperlinks between different buffers;
wenzelm
parents:
43661
diff
changeset
|
33 |
} |
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
34 |
} |
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
35 |
} |
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
36 |
|
42327
7c7cc7590eb3
Name_Space.entry_markup: keep def position as separate properties;
wenzelm
parents:
39177
diff
changeset
|
37 |
class External_Hyperlink(start: Int, end: Int, line: Int, def_file: String, def_line: Int) |
34569 | 38 |
extends AbstractHyperlink(start, end, line, "") |
39 |
{ |
|
34602
782b1948aca9
ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents:
34588
diff
changeset
|
40 |
override def click(view: View) = { |
43661
39fdbd814c7f
quasi-static Isabelle_System -- reduced tendency towards "functorial style";
wenzelm
parents:
43606
diff
changeset
|
41 |
Isabelle_System.source_file(Path.explode(def_file)) match { |
38853 | 42 |
case None => |
42327
7c7cc7590eb3
Name_Space.entry_markup: keep def position as separate properties;
wenzelm
parents:
39177
diff
changeset
|
43 |
Library.error_dialog(view, "File not found", "Could not find source file " + def_file) |
34602
782b1948aca9
ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents:
34588
diff
changeset
|
44 |
case Some(file) => |
42327
7c7cc7590eb3
Name_Space.entry_markup: keep def position as separate properties;
wenzelm
parents:
39177
diff
changeset
|
45 |
jEdit.openFiles(view, file.getParent, Array(file.getName, "+line:" + def_line)) |
34573 | 46 |
} |
34602
782b1948aca9
ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents:
34588
diff
changeset
|
47 |
} |
34569 | 48 |
} |
49 |
||
34760 | 50 |
class Isabelle_Hyperlinks extends HyperlinkSource |
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
51 |
{ |
38575
80d962964216
Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents:
38427
diff
changeset
|
52 |
def getHyperlink(buffer: Buffer, buffer_offset: Int): Hyperlink = |
37175 | 53 |
{ |
38223 | 54 |
Swing_Thread.assert() |
38843 | 55 |
Isabelle.buffer_lock(buffer) { |
56 |
Document_Model(buffer) match { |
|
57 |
case Some(model) => |
|
58 |
val snapshot = model.snapshot() |
|
38845
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
59 |
val markup = |
45468 | 60 |
snapshot.select_markup(Text.Range(buffer_offset, buffer_offset + 1))( |
61 |
Markup_Tree.Select[Hyperlink]( |
|
62 |
{ |
|
45672 | 63 |
// FIXME Isabelle_Document.Hyperlink extractor |
45468 | 64 |
case Text.Info(info_range, |
45666 | 65 |
XML.Elem(Markup(Isabelle_Markup.ENTITY, props), _)) |
45468 | 66 |
if (props.find( |
45666 | 67 |
{ case (Markup.KIND, Isabelle_Markup.ML_OPEN) => true |
68 |
case (Markup.KIND, Isabelle_Markup.ML_STRUCT) => true |
|
45468 | 69 |
case _ => false }).isEmpty) => |
70 |
val Text.Range(begin, end) = info_range |
|
71 |
val line = buffer.getLineOfOffset(begin) |
|
72 |
(Position.File.unapply(props), Position.Line.unapply(props)) match { |
|
73 |
case (Some(def_file), Some(def_line)) => |
|
74 |
new External_Hyperlink(begin, end, line, def_file, def_line) |
|
75 |
case _ if !snapshot.is_outdated => |
|
76 |
(props, props) match { |
|
77 |
case (Position.Id(def_id), Position.Offset(def_offset)) => |
|
78 |
snapshot.state.find_command(snapshot.version, def_id) match { |
|
79 |
case Some((def_node, def_cmd)) => |
|
80 |
def_node.command_start(def_cmd) match { |
|
81 |
case Some(def_cmd_start) => |
|
82 |
new Internal_Hyperlink(def_cmd.node_name.node, begin, end, line, |
|
83 |
def_cmd_start + def_cmd.decode(def_offset)) |
|
84 |
case None => null |
|
85 |
} |
|
38845
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
86 |
case None => null |
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
87 |
} |
45468 | 88 |
case _ => null |
38845
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
89 |
} |
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
90 |
case _ => null |
a9e37daf5bd0
added Document.Snapshot.select_markup, which includes command iteration, range conversion etc.;
wenzelm
parents:
38843
diff
changeset
|
91 |
} |
45474
f793dd5d84b2
index markup elements for more efficient cumulate/select operations;
wenzelm
parents:
45468
diff
changeset
|
92 |
}, |
45666 | 93 |
Some(Set(Isabelle_Markup.ENTITY)))) |
39177
0468964aec11
simplified Markup_Tree.select: Stream instead of Iterator (again), explicit Option instead of default;
wenzelm
parents:
38853
diff
changeset
|
94 |
markup match { |
0468964aec11
simplified Markup_Tree.select: Stream instead of Iterator (again), explicit Option instead of default;
wenzelm
parents:
38853
diff
changeset
|
95 |
case Text.Info(_, Some(link)) #:: _ => link |
0468964aec11
simplified Markup_Tree.select: Stream instead of Iterator (again), explicit Option instead of default;
wenzelm
parents:
38853
diff
changeset
|
96 |
case _ => null |
0468964aec11
simplified Markup_Tree.select: Stream instead of Iterator (again), explicit Option instead of default;
wenzelm
parents:
38853
diff
changeset
|
97 |
} |
38843 | 98 |
case None => null |
99 |
} |
|
34568
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
100 |
} |
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
101 |
} |
b517d0607297
implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff
changeset
|
102 |
} |