1 package com.jsql.view.swing.tree;
2
3 import com.jsql.model.bean.database.AbstractElementDatabase;
4 import com.jsql.model.bean.database.Column;
5 import com.jsql.model.bean.database.Database;
6 import com.jsql.model.bean.database.Table;
7 import com.jsql.util.LogLevelUtil;
8 import com.jsql.view.swing.tree.model.AbstractNodeModel;
9 import com.jsql.view.swing.tree.model.NodeModelColumn;
10 import com.jsql.view.swing.tree.model.NodeModelDatabase;
11 import com.jsql.view.swing.tree.model.NodeModelTable;
12 import com.jsql.view.swing.util.MediatorHelper;
13 import org.apache.logging.log4j.LogManager;
14 import org.apache.logging.log4j.Logger;
15
16 import javax.swing.*;
17 import javax.swing.tree.DefaultMutableTreeNode;
18 import javax.swing.tree.DefaultTreeModel;
19 import javax.swing.tree.TreePath;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 public class TreeDatabase extends JTree {
25
26 private static final Logger LOGGER = LogManager.getRootLogger();
27
28
29
30
31
32
33 private final transient Map<AbstractElementDatabase, DefaultMutableTreeNode> mapNodes = new HashMap<>();
34
35 public TreeDatabase(DefaultMutableTreeNode root) {
36 super(root);
37 }
38
39 public void reloadNodes() {
40 if (this.isRootVisible()) {
41 DefaultTreeModel model = (DefaultTreeModel) this.getModel();
42 DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
43 model.reload(root);
44 this.revalidate();
45 }
46 }
47
48 public void reset() {
49 this.getTreeNodeModels().clear();
50
51 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
52 DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
53
54 root.removeAllChildren();
55 treeModel.nodeChanged(root);
56 treeModel.reload();
57
58 this.setRootVisible(true);
59 }
60
61 public void addColumns(List<Column> columns) {
62 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
63 DefaultMutableTreeNode tableNode = null;
64
65
66 for (Column column: columns) {
67 AbstractNodeModel newTreeNodeModel = new NodeModelColumn(column);
68 var newNode = new DefaultMutableTreeNode(newTreeNodeModel);
69 tableNode = this.getTreeNodeModels().get(column.getParent());
70
71
72 if (tableNode != null) {
73 treeModel.insertNodeInto(newNode, tableNode, tableNode.getChildCount());
74 }
75 }
76
77 if (tableNode != null) {
78 this.expandPath(new TreePath(tableNode.getPath()));
79 ((AbstractNodeModel) tableNode.getUserObject()).setLoaded(true);
80 }
81 }
82
83 public void addDatabases(List<Database> databases) {
84 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
85 DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
86
87
88 for (Database database: databases) {
89 AbstractNodeModel newTreeNodeModel = new NodeModelDatabase(database);
90 var newNode = new DefaultMutableTreeNode(newTreeNodeModel);
91 this.getTreeNodeModels().put(database, newNode);
92 root.add(newNode);
93 }
94
95
96 treeModel.reload(root);
97
98
99 this.expandPath(new TreePath(root.getPath()));
100 this.setRootVisible(false);
101 }
102
103 public void addTables(List<Table> tables) {
104 DefaultMutableTreeNode databaseNode = null;
105
106 for (Table table: tables) {
107 AbstractNodeModel newTreeNodeModel = new NodeModelTable(table);
108 var newNode = new DefaultMutableTreeNode(newTreeNodeModel);
109 this.getTreeNodeModels().put(table, newNode);
110 databaseNode = this.getTreeNodeModels().get(table.getParent());
111
112
113 if (databaseNode != null) {
114 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
115 treeModel.insertNodeInto(newNode, databaseNode, databaseNode.getChildCount());
116 } else {
117 LOGGER.log(LogLevelUtil.CONSOLE_ERROR, "Missing database for table {}.", () -> table);
118 }
119 }
120
121 if (databaseNode != null) {
122 this.expandPath(new TreePath(databaseNode.getPath()));
123 ((AbstractNodeModel) databaseNode.getUserObject()).setLoaded(true);
124 }
125 }
126
127 public void createValuesTab(String[][] data, String[] columnNames, AbstractElementDatabase table) {
128 MediatorHelper.frame().getSplitNS().invokeLaterWithSplitOrientation(() -> {
129
130 DefaultMutableTreeNode node = this.getTreeNodeModels().get(table);
131 if (node != null) {
132 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
133 progressingTreeNodeModel.setIndexProgress(table.getChildCount());
134 progressingTreeNodeModel.setRunning(false);
135 MediatorHelper.tabResults().addTabValues(data, columnNames, table);
136 }
137 });
138 }
139
140 public void endIndeterminateProgress(AbstractElementDatabase dataElementDatabase) {
141 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
142
143 if (node != null) {
144 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
145 progressingTreeNodeModel.setProgressing(false);
146 progressingTreeNodeModel.setRunning(false);
147 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
148 treeModel.nodeChanged(node);
149 }
150 }
151
152 public void endProgress(AbstractElementDatabase dataElementDatabase) {
153
154 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
155 if (node != null) {
156 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
157 progressingTreeNodeModel.setLoading(false);
158 progressingTreeNodeModel.setRunning(false);
159 progressingTreeNodeModel.setIndexProgress(0);
160 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
161 treeModel.nodeChanged(node);
162 }
163 }
164
165 public void startIndeterminateProgress(AbstractElementDatabase dataElementDatabase) {
166 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
167
168 if (node != null) {
169 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
170 progressingTreeNodeModel.setProgressing(true);
171 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
172 treeModel.nodeChanged(node);
173 }
174 }
175
176 public void startProgress(AbstractElementDatabase dataElementDatabase) {
177 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
178
179 if (node != null) {
180 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
181
182 if (progressingTreeNodeModel != null) {
183 progressingTreeNodeModel.setLoading(true);
184 }
185 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
186 treeModel.nodeChanged(node);
187 }
188 }
189
190 public void updateProgress(AbstractElementDatabase dataElementDatabase, int dataCount) {
191 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
192
193 if (node != null) {
194 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
195 progressingTreeNodeModel.setIndexProgress(dataCount);
196 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
197 treeModel.nodeChanged(node);
198 }
199 }
200
201 public final Map<AbstractElementDatabase, DefaultMutableTreeNode> getTreeNodeModels() {
202 return this.mapNodes;
203 }
204 }