| author | wenzelm |
| Wed, 22 Oct 2025 21:23:01 +0200 | |
| changeset 83341 | b87ea73f8606 |
| parent 83032 | a29b383ad733 |
| permissions | -rw-r--r-- |
| 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 |
||
|
83032
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
9 |
import javax.accessibility.AccessibleContext |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
10 |
|
| 81323 | 11 |
import javax.swing.JTree |
| 81329 | 12 |
import javax.swing.tree.{MutableTreeNode, DefaultMutableTreeNode, DefaultTreeModel,
|
| 82142 | 13 |
TreeSelectionModel, DefaultTreeCellRenderer} |
| 81323 | 14 |
|
15 |
||
| 81329 | 16 |
object Tree_View {
|
17 |
type Node = DefaultMutableTreeNode |
|
18 |
||
19 |
object Node {
|
|
20 |
def apply(obj: AnyRef = null): Node = |
|
21 |
if (obj == null) new DefaultMutableTreeNode else new DefaultMutableTreeNode(obj) |
|
22 |
||
23 |
def unapply(tree_node: MutableTreeNode): Option[AnyRef] = |
|
24 |
tree_node match {
|
|
|
81380
83012fe97282
revert 1206400b9b48: proper Node.unapply for Node.apply(null);
wenzelm
parents:
81377
diff
changeset
|
25 |
case node: Node => Some(node.getUserObject) |
| 81329 | 26 |
case _ => None |
27 |
} |
|
28 |
} |
|
| 81496 | 29 |
|
| 81497 | 30 |
class Cell_Renderer extends DefaultTreeCellRenderer {
|
31 |
def setup(value: AnyRef): Unit = setIcon(null) |
|
32 |
||
33 |
override def getTreeCellRendererComponent( |
|
34 |
tree: JTree, |
|
35 |
value: AnyRef, |
|
36 |
selected: Boolean, |
|
37 |
expanded: Boolean, |
|
38 |
leaf: Boolean, |
|
39 |
row: Int, |
|
40 |
hasFocus: Boolean |
|
41 |
): java.awt.Component = {
|
|
42 |
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus) |
|
43 |
setup(value) |
|
44 |
this |
|
45 |
} |
|
| 81496 | 46 |
} |
| 81329 | 47 |
} |
48 |
||
| 81325 | 49 |
class Tree_View( |
| 81329 | 50 |
val root: Tree_View.Node = Tree_View.Node(), |
|
83032
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
51 |
single_selection_mode: Boolean = false, |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
52 |
accessible_name: String = "" |
| 81325 | 53 |
) extends JTree(root) {
|
|
83032
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
54 |
|
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
55 |
override def getAccessibleContext: AccessibleContext = {
|
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
56 |
if (accessibleContext == null) { accessibleContext = new Accessible_Context }
|
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
57 |
accessibleContext |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
58 |
} |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
59 |
class Accessible_Context extends AccessibleJTree {
|
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
60 |
override def getAccessibleName: String = |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
61 |
proper_string(accessible_name).getOrElse(proper_string(root.toString).orNull) |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
62 |
} |
|
a29b383ad733
more standard treatment of AccessibleContext, following existing Swing components;
wenzelm
parents:
83025
diff
changeset
|
63 |
|
| 81325 | 64 |
def get_selection[A](which: PartialFunction[AnyRef, A]): Option[A] = |
65 |
getLastSelectedPathComponent match {
|
|
|
81380
83012fe97282
revert 1206400b9b48: proper Node.unapply for Node.apply(null);
wenzelm
parents:
81377
diff
changeset
|
66 |
case Tree_View.Node(obj) if obj != null && which.isDefinedAt(obj) => Some(which(obj)) |
| 81325 | 67 |
case _ => None |
68 |
} |
|
| 81323 | 69 |
|
| 81483 | 70 |
def init_model(body: => Unit): Unit = {
|
| 81325 | 71 |
clearSelection() |
72 |
root.removeAllChildren() |
|
| 81483 | 73 |
body |
74 |
expandRow(0) |
|
75 |
reload_model() |
|
| 81325 | 76 |
} |
77 |
||
78 |
def reload_model(): Unit = |
|
| 81326 | 79 |
getModel match {
|
80 |
case model: DefaultTreeModel => model.reload(root) |
|
81 |
case _ => |
|
82 |
} |
|
| 81325 | 83 |
|
84 |
||
85 |
/* init */ |
|
86 |
||
| 81497 | 87 |
setCellRenderer(new Tree_View.Cell_Renderer) |
| 81494 | 88 |
|
| 81325 | 89 |
setRowHeight(0) |
| 81323 | 90 |
|
91 |
if (single_selection_mode) {
|
|
| 81325 | 92 |
getSelectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION) |
| 81323 | 93 |
} |
94 |
||
95 |
// follow jEdit |
|
| 82554 | 96 |
if (!GUI.is_macos_laf()) {
|
| 81325 | 97 |
putClientProperty("JTree.lineStyle", "Angled")
|
| 81323 | 98 |
} |
99 |
} |