81323
|
1 |
/* Title: Pure/GUI/tree_view.scala
|
|
2 |
Author: Makarius
|
|
3 |
|
81330
|
4 |
Tree view with sensible defaults.
|
81323
|
5 |
*/
|
|
6 |
|
|
7 |
package isabelle
|
|
8 |
|
|
9 |
import javax.swing.JTree
|
81329
|
10 |
import javax.swing.tree.{MutableTreeNode, DefaultMutableTreeNode, DefaultTreeModel,
|
|
11 |
TreeSelectionModel}
|
81323
|
12 |
|
|
13 |
|
81329
|
14 |
object Tree_View {
|
|
15 |
type Node = DefaultMutableTreeNode
|
|
16 |
|
|
17 |
object Node {
|
|
18 |
def apply(obj: AnyRef = null): Node =
|
|
19 |
if (obj == null) new DefaultMutableTreeNode else new DefaultMutableTreeNode(obj)
|
|
20 |
|
|
21 |
def unapply(tree_node: MutableTreeNode): Option[AnyRef] =
|
|
22 |
tree_node match {
|
|
23 |
case node: Node => Some(node.getUserObject)
|
|
24 |
case _ => None
|
|
25 |
}
|
|
26 |
}
|
|
27 |
}
|
|
28 |
|
81325
|
29 |
class Tree_View(
|
81329
|
30 |
val root: Tree_View.Node = Tree_View.Node(),
|
81325
|
31 |
single_selection_mode: Boolean = false
|
|
32 |
) extends JTree(root) {
|
|
33 |
def get_selection[A](which: PartialFunction[AnyRef, A]): Option[A] =
|
|
34 |
getLastSelectedPathComponent match {
|
81329
|
35 |
case Tree_View.Node(obj) if obj != null && which.isDefinedAt(obj) => Some(which(obj))
|
81325
|
36 |
case _ => None
|
|
37 |
}
|
81323
|
38 |
|
81325
|
39 |
def clear(): Unit = {
|
|
40 |
clearSelection()
|
|
41 |
root.removeAllChildren()
|
|
42 |
}
|
|
43 |
|
|
44 |
def reload_model(): Unit =
|
81326
|
45 |
getModel match {
|
|
46 |
case model: DefaultTreeModel => model.reload(root)
|
|
47 |
case _ =>
|
|
48 |
}
|
81325
|
49 |
|
|
50 |
|
|
51 |
/* init */
|
|
52 |
|
|
53 |
setRowHeight(0)
|
81323
|
54 |
|
|
55 |
if (single_selection_mode) {
|
81325
|
56 |
getSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION)
|
81323
|
57 |
}
|
|
58 |
|
|
59 |
// follow jEdit
|
|
60 |
if (!GUI.is_macos_laf) {
|
81325
|
61 |
putClientProperty("JTree.lineStyle", "Angled")
|
81323
|
62 |
}
|
|
63 |
}
|