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
129 DefaultMutableTreeNode node = this.getTreeNodeModels().get(table);
130 if (node != null) {
131 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
132 progressingTreeNodeModel.setIndexProgress(table.getChildCount());
133 progressingTreeNodeModel.setRunning(false);
134 MediatorHelper.tabResults().addTabValues(data, columnNames, table);
135 }
136 }
137
138 public void endIndeterminateProgress(AbstractElementDatabase dataElementDatabase) {
139 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
140
141 if (node != null) {
142 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
143 progressingTreeNodeModel.setProgressing(false);
144 progressingTreeNodeModel.setRunning(false);
145 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
146 treeModel.nodeChanged(node);
147 }
148 }
149
150 public void endProgress(AbstractElementDatabase dataElementDatabase) {
151
152 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
153 if (node != null) {
154 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
155 progressingTreeNodeModel.setLoading(false);
156 progressingTreeNodeModel.setRunning(false);
157 progressingTreeNodeModel.setIndexProgress(0);
158 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
159 treeModel.nodeChanged(node);
160 }
161 }
162
163 public void startIndeterminateProgress(AbstractElementDatabase dataElementDatabase) {
164 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
165
166 if (node != null) {
167 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
168 progressingTreeNodeModel.setProgressing(true);
169 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
170 treeModel.nodeChanged(node);
171 }
172 }
173
174 public void startProgress(AbstractElementDatabase dataElementDatabase) {
175 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
176
177 if (node != null) {
178 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
179
180 if (progressingTreeNodeModel != null) {
181 progressingTreeNodeModel.setLoading(true);
182 }
183 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
184 treeModel.nodeChanged(node);
185 }
186 }
187
188 public void updateProgress(AbstractElementDatabase dataElementDatabase, int dataCount) {
189 DefaultMutableTreeNode node = this.getTreeNodeModels().get(dataElementDatabase);
190
191 if (node != null) {
192 AbstractNodeModel progressingTreeNodeModel = (AbstractNodeModel) node.getUserObject();
193 progressingTreeNodeModel.setIndexProgress(dataCount);
194 DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel();
195 treeModel.nodeChanged(node);
196 }
197 }
198
199 public final Map<AbstractElementDatabase, DefaultMutableTreeNode> getTreeNodeModels() {
200 return this.mapNodes;
201 }
202 }