src/Tools/jEdit/src/jedit/isabelle_hyperlinks.scala
author wenzelm
Sun, 22 Aug 2010 20:25:15 +0200
changeset 38582 3a6ce43d99b1
parent 38580 881c362d48e4
child 38640 105d1f112da5
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36760
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     1
/*  Title:      Tools/jEdit/src/jedit/isabelle_hyperlinks.scala
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     2
    Author:     Fabian Immler, TU Munich
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     3
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     4
Hyperlink setup for Isabelle proof documents.
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     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
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
     8
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
     9
36015
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34871
diff changeset
    10
import isabelle._
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34871
diff changeset
    11
34569
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    12
import java.io.File
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    13
34791
b97d5b38dea4 explicit object Session.Global_Settings;
wenzelm
parents: 34788
diff changeset
    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
b97d5b38dea4 explicit object Session.Global_Settings;
wenzelm
parents: 34788
diff changeset
    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
e8ac8794971f superficial tuning;
wenzelm
parents: 34582
diff changeset
    18
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    19
private class Internal_Hyperlink(start: Int, end: Int, line: Int, ref_offset: Int)
34569
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    20
  extends AbstractHyperlink(start, end, line, "")
34568
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    21
{
34582
5d5d253c7c29 superficial tuning;
wenzelm
parents: 34573
diff changeset
    22
  override def click(view: View) {
34568
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    23
    view.getTextArea.moveCaretPosition(ref_offset)
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    24
  }
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    25
}
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    26
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    27
class External_Hyperlink(start: Int, end: Int, line: Int, ref_file: String, ref_line: Int)
34569
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    28
  extends AbstractHyperlink(start, end, line, "")
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    29
{
34602
782b1948aca9 ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents: 34588
diff changeset
    30
  override def click(view: View) = {
782b1948aca9 ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents: 34588
diff changeset
    31
    Isabelle.system.source_file(ref_file) match {
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    32
      case None => System.err.println("Could not find source file " + ref_file)  // FIXME ??
34602
782b1948aca9 ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents: 34588
diff changeset
    33
      case Some(file) =>
34573
daa397b6401c changed handling of subdirectories
immler@in.tum.de
parents: 34569
diff changeset
    34
        jEdit.openFiles(view, file.getParent, Array(file.getName, "+line:" + ref_line))
daa397b6401c changed handling of subdirectories
immler@in.tum.de
parents: 34569
diff changeset
    35
    }
34602
782b1948aca9 ExternalHyperlink.click: use IsabelleSystem.source_file provided in http://isabelle.in.tum.de/repos/isabelle/rev/dde1b4d1c95b
wenzelm
parents: 34588
diff changeset
    36
  }
34569
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    37
}
15abc5f5f40a implemented links to other files
immler@in.tum.de
parents: 34568
diff changeset
    38
34760
dc7f5e0d9d27 misc modernization of names;
wenzelm
parents: 34759
diff changeset
    39
class Isabelle_Hyperlinks extends HyperlinkSource
34568
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    40
{
38575
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    41
  def getHyperlink(buffer: Buffer, buffer_offset: Int): Hyperlink =
37175
be764a7adb10 eliminated hard tabs;
wenzelm
parents: 36990
diff changeset
    42
  {
38223
2a368e8e0a80 more explicit treatment of Swing thread context;
wenzelm
parents: 38153
diff changeset
    43
    Swing_Thread.assert()
34788
3779c54a2d21 direct apply for Document_Model and Document_View;
wenzelm
parents: 34784
diff changeset
    44
    Document_Model(buffer) match {
34784
02959dcea756 split Theory_View into Document_Model (connected to Buffer) and Document_View (connected to JEditTextArea);
wenzelm
parents: 34777
diff changeset
    45
      case Some(model) =>
38151
2837c952ca31 explicit Change.Snapshot and Document.Node;
wenzelm
parents: 38150
diff changeset
    46
        val snapshot = model.snapshot()
38575
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    47
        val offset = snapshot.revert(buffer_offset)
38152
eab0d1c2e46e Change.Snapshot: include from_current/to_current here, with precomputed changes;
wenzelm
parents: 38151
diff changeset
    48
        snapshot.node.command_at(offset) match {
34855
81d0410dc3ac iterators for ranges of commands/starts -- avoid extra array per document;
wenzelm
parents: 34832
diff changeset
    49
          case Some((command, command_start)) =>
38582
3a6ce43d99b1 tuned signature;
wenzelm
parents: 38580
diff changeset
    50
            (snapshot.state(command).markup.select(Text.Range(offset) - command_start) {
38580
881c362d48e4 proper range for hyperlinks and tooltips, using original markup information;
wenzelm
parents: 38577
diff changeset
    51
              case Text.Info(info_range, XML.Elem(Markup(Markup.ML_REF, _),
38577
4e4d3ea3725a renamed Markup_Tree.Node to Text.Info;
wenzelm
parents: 38575
diff changeset
    52
                  List(XML.Elem(Markup(Markup.ML_DEF, props), _)))) =>
4e4d3ea3725a renamed Markup_Tree.Node to Text.Info;
wenzelm
parents: 38575
diff changeset
    53
                val Text.Range(begin, end) = snapshot.convert(info_range + command_start)
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    54
                val line = buffer.getLineOfOffset(begin)
38575
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    55
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    56
                (Position.get_file(props), Position.get_line(props)) match {
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    57
                  case (Some(ref_file), Some(ref_line)) =>
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    58
                    new External_Hyperlink(begin, end, line, ref_file, ref_line)
38575
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    59
                  case _ =>
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    60
                    (Position.get_id(props), Position.get_offset(props)) match {
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    61
                      case (Some(ref_id), Some(ref_offset)) =>
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    62
                        snapshot.lookup_command(ref_id) match {
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    63
                          case Some(ref_cmd) =>
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    64
                            snapshot.node.command_start(ref_cmd) match {
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    65
                              case Some(ref_cmd_start) =>
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    66
                                new Internal_Hyperlink(begin, end, line,
38580
881c362d48e4 proper range for hyperlinks and tooltips, using original markup information;
wenzelm
parents: 38577
diff changeset
    67
                                  snapshot.convert(ref_cmd_start + ref_cmd.decode(ref_offset)))
38575
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    68
                              case None => null
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    69
                            }
80d962964216 Isabelle_Hyperlinks: select relevant information directly from Markup_Tree, without intermediate RefInfo;
wenzelm
parents: 38427
diff changeset
    70
                          case None => null
34858
ad486bd8abf3 further tuning of command_start;
wenzelm
parents: 34855
diff changeset
    71
                        }
34816
d33312514220 maintain generic session entities -- cover commands, states, etc. (but not yet documents);
wenzelm
parents: 34791
diff changeset
    72
                      case _ => null
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    73
                    }
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    74
                }
38582
3a6ce43d99b1 tuned signature;
wenzelm
parents: 38580
diff changeset
    75
            } { null }).head.info
34777
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    76
          case None => null
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    77
        }
91d6089cef88 class Session models full session, with or without prover process (cf. heaps, browser_info);
wenzelm
parents: 34760
diff changeset
    78
      case None => null
34568
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    79
    }
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    80
  }
b517d0607297 implemented IsabelleHyperlinkSource (only links inside the current buffer)
immler@in.tum.de
parents:
diff changeset
    81
}