src/Tools/jEdit/src/documentation_dockable.scala
author wenzelm
Mon, 12 Aug 2013 17:11:27 +0200
changeset 52980 28f59ca8ce78
parent 52543 6f5678b97c4e
child 53177 dcac8d837b9c
permissions -rw-r--r--
manage hyperlinks via PIDE editor interface;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/documentation_dockable.scala
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     3
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     4
Dockable window for Isabelle documentation.
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     5
*/
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     6
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     8
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
     9
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    10
import isabelle._
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    11
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    12
import java.awt.{Dimension, GridLayout}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    13
import javax.swing.{JTree, JScrollPane}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    14
import javax.swing.tree.{DefaultMutableTreeNode, TreeSelectionModel}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    15
import javax.swing.event.{TreeSelectionEvent, TreeSelectionListener}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    16
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    17
import org.gjt.sp.jedit.{View, OperatingSystem}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    18
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    19
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    20
class Documentation_Dockable(view: View, position: String) extends Dockable(view, position)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    21
{
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    22
  Swing_Thread.require()
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    23
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    24
  private val docs = Doc.contents()
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    25
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    26
  private case class Documentation(name: String, title: String)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    27
  {
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    28
    override def toString =
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    29
      "<html><b>" + HTML.encode(name) + "</b>:  " + HTML.encode(title) + "</html>"
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    30
  }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    31
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    32
  private case class Text_File(name: String, path: Path)
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    33
  {
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    34
    override def toString = name
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    35
  }
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    36
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    37
  private val root = new DefaultMutableTreeNode
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    38
  docs foreach {
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    39
    case Doc.Section(text) =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    40
      root.add(new DefaultMutableTreeNode(text))
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    41
    case Doc.Doc(name, title) =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    42
      root.getLastChild.asInstanceOf[DefaultMutableTreeNode]
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    43
        .add(new DefaultMutableTreeNode(Documentation(name, title)))
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    44
    case Doc.Text_File(name: String, path: Path) =>
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    45
      root.getLastChild.asInstanceOf[DefaultMutableTreeNode]
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    46
        .add(new DefaultMutableTreeNode(Text_File(name, path.expand)))
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    47
  }
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    48
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    49
  private val tree = new JTree(root)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    50
  if (!OperatingSystem.isMacOSLF)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    51
    tree.putClientProperty("JTree.lineStyle", "Angled")
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    52
  tree.getSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    53
  tree.addTreeSelectionListener(
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    54
    new TreeSelectionListener {
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    55
      override def valueChanged(e: TreeSelectionEvent)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    56
      {
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    57
        tree.getLastSelectedPathComponent match {
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    58
          case node: DefaultMutableTreeNode =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    59
            node.getUserObject match {
52447
9a74000426e2 more robust Doc.view invocation: avoid executing process on GUI thread, but show errors as dialog;
wenzelm
parents: 52445
diff changeset
    60
              case Documentation(name, _) =>
9a74000426e2 more robust Doc.view invocation: avoid executing process on GUI thread, but show errors as dialog;
wenzelm
parents: 52445
diff changeset
    61
                default_thread_pool.submit(() =>
9a74000426e2 more robust Doc.view invocation: avoid executing process on GUI thread, but show errors as dialog;
wenzelm
parents: 52445
diff changeset
    62
                  try { Doc.view(name) }
52543
6f5678b97c4e eliminated pointless catch of unlikely exceptions, which may occur in Doc.contents already;
wenzelm
parents: 52542
diff changeset
    63
                  catch {
6f5678b97c4e eliminated pointless catch of unlikely exceptions, which may occur in Doc.contents already;
wenzelm
parents: 52542
diff changeset
    64
                    case exn: Throwable =>
6f5678b97c4e eliminated pointless catch of unlikely exceptions, which may occur in Doc.contents already;
wenzelm
parents: 52542
diff changeset
    65
                      GUI.error_dialog(view,
6f5678b97c4e eliminated pointless catch of unlikely exceptions, which may occur in Doc.contents already;
wenzelm
parents: 52542
diff changeset
    66
                        "Documentation error", GUI.scrollable_text(Exn.message(exn)))
6f5678b97c4e eliminated pointless catch of unlikely exceptions, which may occur in Doc.contents already;
wenzelm
parents: 52542
diff changeset
    67
                  })
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    68
              case Text_File(_, path) =>
52980
28f59ca8ce78 manage hyperlinks via PIDE editor interface;
wenzelm
parents: 52543
diff changeset
    69
                PIDE.editor.goto(view, Isabelle_System.platform_path(path))
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    70
              case _ =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    71
            }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    72
          case _ =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    73
        }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    74
      }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    75
    })
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    76
  tree.setRootVisible(false)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    77
  tree.setVisibleRowCount(docs.length)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    78
  (0 until docs.length).foreach(tree.expandRow)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    79
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    80
  private val tree_view = new JScrollPane(tree)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    81
  tree_view.setMinimumSize(new Dimension(100, 50))
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    82
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    83
  set_content(tree_view)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    84
}