Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import java.util.List;

public interface ContextMenuContributor {

boolean supports(TreeNode node);

void contribute(TreeNode node);

List<TreeContextAction> getActions(TreeNode node);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import java.util.ArrayList;
import java.util.List;

public class ContextMenuRegistry {

private final List<ContextMenuContributor> contributors = new ArrayList<>();

public void register(ContextMenuContributor contributor) {
contributors.add(contributor);
}

public List<TreeContextAction> getActions(TreeNode node) {
return contributors.stream()
.filter(c -> c.supports(node))
.flatMap(c -> c.getActions(node).stream())
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

public enum DefaultNodeTypes implements TreeNodeType {
PROJECT,
DATABASES,
DATABASE,
TABLES,
TABLE,
COLUMNS,
COLUMN,
INDICES,
INDEX,
VIEWS,
VIEW,
JOB_AGENT;

@Override
public String getId() {
return this.name();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import java.util.ArrayList;
import java.util.List;

public class ExplorerEventBus {

private final List<TreeListener> listeners = new ArrayList<>();

public void register(TreeListener listener) {
listeners.add(listener);
}

public void fireSelected(TreeNode node) {
listeners.forEach(l -> l.onNodeSelected(node));
}

public void fireDoubleClick(TreeNode node) {
listeners.forEach(l -> l.onNodeDoubleClicked(node));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import javax.swing.*;

public interface IconProvider {
Icon getIcon(TreeNode node);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import java.util.List;

public interface NodeChildrenProvider {

boolean supports(TreeNode node);

List<TreeNode> loadChildren(TreeNode node);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import java.util.ArrayList;
import java.util.List;

public class NodeStructureRegistry {

private final List<NodeChildrenProvider> providers = new ArrayList<>();

private final List<ContextMenuContributor> contributors = new ArrayList<>();

public void register(NodeChildrenProvider provider) {
providers.add(provider);
}

public List<TreeNode> loadChildren(TreeNode node) {
return providers.stream()
.filter(p -> p.supports(node))
.flatMap(p -> p.loadChildren(node).stream())
.toList();
}


public void loadAdditionalChildren(TreeNode node) {
for (ContextMenuContributor c : contributors) {
if (c.supports(node)) {
c.contribute(node);
}

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import de.julianweinelt.databench.dbx.database.ADatabase;

public class ProjectTreeBuilder {

private final ADatabase database;
private final NodeStructureRegistry structureRegistry;

public ProjectTreeBuilder(ADatabase database,
NodeStructureRegistry structureRegistry) {
this.database = database;
this.structureRegistry = structureRegistry;
}

public TreeNode build() {

TreeNode root = new TreeNode(
DefaultNodeTypes.PROJECT,
"Project",
null
);

TreeNode dbRoot = new TreeNode(
DefaultNodeTypes.DATABASES,
"Databases",
null
);

root.addChild(dbRoot);

for (String dbName : database.getDatabases()) {

TreeNode dbNode = new TreeNode(
DefaultNodeTypes.DATABASE,
dbName,
dbName
);

dbRoot.addChild(dbNode);

loadDatabaseChildren(dbNode, dbName);
}

return root;
}

private void loadDatabaseChildren(TreeNode dbNode, String dbName) {

TreeNode tablesFolder = new TreeNode(
DefaultNodeTypes.TABLES,
"Tables",
null
);

dbNode.addChild(tablesFolder);

for (String table : database.getTables(dbName)) {
tablesFolder.addChild(
new TreeNode(DefaultNodeTypes.TABLE, table, table)
);
}

structureRegistry.loadAdditionalChildren(dbNode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import javax.swing.tree.DefaultMutableTreeNode;

public class SwingTreeAdapter {
public DefaultMutableTreeNode toSwingNode(TreeNode node) {
DefaultMutableTreeNode swing =
new DefaultMutableTreeNode(node);

for (TreeNode child : node.getChildren()) {
swing.add(toSwingNode(child));
}

return swing;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import javax.swing.*;

public interface TreeContextAction {

String getName();

Icon getIcon();

void execute(TreeNode node);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

public interface TreeListener {

void onNodeSelected(TreeNode node);

void onNodeDoubleClicked(TreeNode node);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

@Getter
public class TreeNode {

private final TreeNodeType type;
private final String label;
private final Object value;
private final List<TreeNode> children = new ArrayList<>();

public TreeNode(TreeNodeType type, String label, Object value) {
this.type = type;
this.label = label;
this.value = value;
}

public void addChild(TreeNode node) {
children.add(node);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

public interface TreeNodeType {
String getId();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package de.julianweinelt.datacat.dbx.api.ui.tree;

import javax.swing.*;
import java.util.HashMap;
import java.util.Map;

public class TreeUIRegistry {

private final Map<TreeNodeType, IconProvider> iconProviders = new HashMap<>();

public void registerIcon(TreeNodeType type, IconProvider provider) {
iconProviders.put(type, provider);
}

public Icon resolveIcon(TreeNode node) {
return iconProviders.getOrDefault(node.getType(), n -> null).getIcon(node);
}
}
Loading