implemented links to other files
authorimmler@in.tum.de
Fri, 22 May 2009 16:47:11 +0200
changeset 3457215abc5f5f40a
parent 34571 b517d0607297
child 34573 c3bdaea2dd6a
implemented links to other files
src/Tools/jEdit/src/jedit/IsabelleHyperlinkSource.scala
     1.1 --- a/src/Tools/jEdit/src/jedit/IsabelleHyperlinkSource.scala	Fri May 22 14:47:57 2009 +0200
     1.2 +++ b/src/Tools/jEdit/src/jedit/IsabelleHyperlinkSource.scala	Fri May 22 16:47:11 2009 +0200
     1.3 @@ -6,6 +6,9 @@
     1.4   */
     1.5  
     1.6  package isabelle.jedit
     1.7 +
     1.8 +import java.io.File
     1.9 +
    1.10  import gatchan.jedit.hyperlinks.Hyperlink
    1.11  import gatchan.jedit.hyperlinks.HyperlinkSource
    1.12  import gatchan.jedit.hyperlinks.AbstractHyperlink
    1.13 @@ -18,13 +21,40 @@
    1.14  import isabelle.prover.RefInfo
    1.15  
    1.16  class InternalHyperlink(start: Int, end: Int, line: Int, ref_offset: Int)
    1.17 -  extends AbstractHyperlink(start, end, line, "tooltip")
    1.18 +  extends AbstractHyperlink(start, end, line, "")
    1.19  {
    1.20    override def click(view: View) = {
    1.21      view.getTextArea.moveCaretPosition(ref_offset)
    1.22    }
    1.23  }
    1.24  
    1.25 +class ExternalHyperlink(start: Int, end: Int, line: Int, ref_file: String, ref_line: Int)
    1.26 +  extends AbstractHyperlink(start, end, line, "")
    1.27 +{
    1.28 +  val srcs = List(new File(Isabelle.system.getenv("ISABELLE_HOME"), "src"),
    1.29 +                  new File(Isabelle.system.getenv("ML_SOURCES")))
    1.30 +
    1.31 +  def find_file(file: File, filename: String): Option[File] =
    1.32 +  {
    1.33 +    if (file.getName == new File(filename).getName) Some(file)
    1.34 +    else if (file.isDirectory) file.listFiles.map(find_file(_, filename)).find(_.isDefined).getOrElse(None)
    1.35 +    else None
    1.36 +  }
    1.37 +
    1.38 +  override def click(view: View) = {
    1.39 +    srcs.find(src =>
    1.40 +      find_file(src, ref_file) match {
    1.41 +        case None => false
    1.42 +        case Some(file) =>
    1.43 +          jEdit.openFiles(view, file.getParent, Array(file.getName, "+line:" + ref_line))
    1.44 +          true})
    1.45 +      match {
    1.46 +        case None => System.err.println("Could not find file " + ref_file)
    1.47 +        case _ =>
    1.48 +      }
    1.49 +  }
    1.50 +}
    1.51 +
    1.52  class IsabelleHyperlinkSource extends HyperlinkSource
    1.53  {
    1.54  	def getHyperlink(buffer: Buffer, original_offset: Int): Hyperlink = {
    1.55 @@ -46,8 +76,8 @@
    1.56            val line = buffer.getLineOfOffset(start)
    1.57            val end = theory_view.to_current(document, ref.abs_stop(document))
    1.58            ref.info match {
    1.59 -            case RefInfo(Some(file), Some(ref_line), _, _) =>
    1.60 -              null
    1.61 +            case RefInfo(Some(ref_file), Some(ref_line), _, _) =>
    1.62 +              new ExternalHyperlink(start, end, line, ref_file, ref_line)
    1.63              case RefInfo(_, _, Some(id), Some(offset)) =>
    1.64                prover.get.command(id) match {
    1.65                  case Some(ref_cmd) =>