src/Tools/jEdit/src/documentation_dockable.scala
author wenzelm
Wed, 20 May 2015 22:22:27 +0200
changeset 60292 ba3c716144dd
parent 59390 7cab7fdf6048
child 60847 239d7714392b
permissions -rw-r--r--
cell-specific row height based on its font, e.g. relevant for DPI scaling on Windows;
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}
57920
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    13
import java.awt.event.{KeyEvent, KeyAdapter, MouseEvent, MouseAdapter}
54687
795f8d3e06c9 no keyboard control -- avoid confusion about meaning of selection;
wenzelm
parents: 54686
diff changeset
    14
import javax.swing.{JTree, JScrollPane, JComponent}
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    15
import javax.swing.tree.{DefaultMutableTreeNode, TreeSelectionModel}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    16
import javax.swing.event.{TreeSelectionEvent, TreeSelectionListener}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    17
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    18
import org.gjt.sp.jedit.{View, OperatingSystem}
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    19
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    20
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    21
class Documentation_Dockable(view: View, position: String) extends Dockable(view, position)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    22
{
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    23
  private val docs = Doc.contents()
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    24
56422
7490555d7dff clarified Doc entry: more explicit path;
wenzelm
parents: 55877
diff changeset
    25
  private case class Documentation(name: String, title: String, path: Path)
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    26
  {
57912
wenzelm
parents: 56729
diff changeset
    27
    override def toString: String =
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    28
      "<html><b>" + HTML.encode(name) + "</b>:  " + HTML.encode(title) + "</html>"
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    29
  }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    30
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    31
  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
    32
  {
57912
wenzelm
parents: 56729
diff changeset
    33
    override def toString: String = name
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    34
  }
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    35
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    36
  private val root = new DefaultMutableTreeNode
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    37
  docs foreach {
56423
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
    38
    case Doc.Section(text, _) =>
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    39
      root.add(new DefaultMutableTreeNode(text))
56422
7490555d7dff clarified Doc entry: more explicit path;
wenzelm
parents: 55877
diff changeset
    40
    case Doc.Doc(name, title, path) =>
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    41
      root.getLastChild.asInstanceOf[DefaultMutableTreeNode]
56422
7490555d7dff clarified Doc entry: more explicit path;
wenzelm
parents: 55877
diff changeset
    42
        .add(new DefaultMutableTreeNode(Documentation(name, title, path)))
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    43
    case Doc.Text_File(name: String, path: Path) =>
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    44
      root.getLastChild.asInstanceOf[DefaultMutableTreeNode]
52542
19d674acb764 more release notes according to availability in proper release vs. repository clone;
wenzelm
parents: 52541
diff changeset
    45
        .add(new DefaultMutableTreeNode(Text_File(name, path.expand)))
52541
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    46
  }
97c950217d7f quick access to release notes (imitating website/documentation.html);
wenzelm
parents: 52447
diff changeset
    47
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    48
  private val tree = new JTree(root)
60292
ba3c716144dd cell-specific row height based on its font, e.g. relevant for DPI scaling on Windows;
wenzelm
parents: 59390
diff changeset
    49
  tree.setRowHeight(0)
54687
795f8d3e06c9 no keyboard control -- avoid confusion about meaning of selection;
wenzelm
parents: 54686
diff changeset
    50
57920
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    51
  override def focusOnDefaultComponent { tree.requestFocusInWindow }
54687
795f8d3e06c9 no keyboard control -- avoid confusion about meaning of selection;
wenzelm
parents: 54686
diff changeset
    52
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
    53
  tree.getSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION)
57920
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    54
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    55
  private def action(node: DefaultMutableTreeNode)
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    56
  {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    57
    node.getUserObject match {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    58
      case Text_File(_, path) =>
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    59
        PIDE.editor.goto_file(view, Isabelle_System.platform_path(path))
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    60
      case Documentation(_, _, path) =>
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    61
        if (path.is_file)
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    62
          PIDE.editor.goto_file(view, Isabelle_System.platform_path(path))
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    63
        else {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    64
          Future.fork {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    65
            try { Doc.view(path) }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    66
            catch {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    67
              case exn: Throwable =>
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    68
                GUI.error_dialog(view,
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    69
                  "Documentation error", GUI.scrollable_text(Exn.message(exn)))
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    70
            }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    71
          }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    72
        }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    73
      case _ =>
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    74
    }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    75
  }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    76
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    77
  tree.addKeyListener(new KeyAdapter {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    78
    override def keyPressed(e: KeyEvent)
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    79
    {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    80
      if (e.getKeyCode == KeyEvent.VK_ENTER) {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    81
        e.consume
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    82
        val path = tree.getSelectionPath
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    83
        if (path != null) {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    84
          path.getLastPathComponent match {
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    85
            case node: DefaultMutableTreeNode => action(node)
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    86
            case _ =>
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    87
          }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    88
        }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    89
      }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    90
    }
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    91
  })
54686
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
    92
  tree.addMouseListener(new MouseAdapter {
57920
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    93
    override def mouseClicked(e: MouseEvent)
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    94
    {
54686
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
    95
      val click = tree.getPathForLocation(e.getX, e.getY)
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
    96
      if (click != null && e.getClickCount == 1) {
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
    97
        (click.getLastPathComponent, tree.getLastSelectedPathComponent) match {
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
    98
          case (node: DefaultMutableTreeNode, node1: DefaultMutableTreeNode) if node == node1 =>
57920
c1953856cfca clarified focus and key handling -- more like SideKick;
wenzelm
parents: 57912
diff changeset
    99
            action(node)
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   100
          case _ =>
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   101
        }
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   102
      }
54686
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
   103
    }
070d5e856798 directly react on click, assuming that document view operation is mostly idempotent;
wenzelm
parents: 53177
diff changeset
   104
  })
56423
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   105
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   106
  {
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   107
    var expand = true
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   108
    var visible = 0
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   109
    def make_visible(row: Int) { visible += 1; tree.expandRow(row) }
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   110
    for ((entry, row) <- docs.zipWithIndex) {
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   111
      entry match {
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   112
        case Doc.Section(_, important) =>
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   113
          expand = important
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   114
          make_visible(row)
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   115
        case _ =>
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   116
          if (expand) make_visible(row)
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   117
      }
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   118
    }
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   119
    tree.setRootVisible(false)
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   120
    tree.setVisibleRowCount(visible)
c2f52824dbb2 explicit indication of important doc sections ("!"), which are expanded in the tree view;
wenzelm
parents: 56422
diff changeset
   121
  }
52445
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   122
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   123
  private val tree_view = new JScrollPane(tree)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   124
  tree_view.setMinimumSize(new Dimension(100, 50))
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   125
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   126
  set_content(tree_view)
18a720984855 dockable window for Isabelle documentation;
wenzelm
parents:
diff changeset
   127
}