Skip to content

Commit 766f91e

Browse files
authored
Graph Database Console result UX improvements (#123)
* Make clear when Graph tab is empty, but results are available on Table tab
1 parent 865eace commit 766f91e

File tree

7 files changed

+73
-43
lines changed

7 files changed

+73
-43
lines changed

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/graph/GraphPanel.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.intellij.ui.ColorUtil;
77
import com.intellij.ui.awt.RelativePoint;
88
import com.intellij.ui.components.JBLabel;
9+
import com.intellij.ui.components.labels.LinkLabel;
10+
import com.intellij.ui.components.labels.LinkListener;
911
import com.intellij.ui.popup.BalloonPopupBuilderImpl;
1012
import com.intellij.ui.treeStructure.PatchedDefaultMutableTreeNode;
1113
import com.intellij.ui.treeStructure.Tree;
@@ -18,9 +20,10 @@
1820
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
1921
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.GraphConsoleView;
2022
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryExecutionProcessEvent;
21-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeContextMenuMouseAdapter;
23+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeMouseAdapter;
2224
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper;
2325
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.renderes.tree.PropertyTreeCellRenderer;
26+
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants.ToolWindow.Tabs;
2427
import com.neueda.jetbrains.plugin.graphdb.visualization.PrefuseVisualization;
2528
import com.neueda.jetbrains.plugin.graphdb.visualization.services.LookAndFeelService;
2629
import prefuse.visual.VisualItem;
@@ -31,6 +34,7 @@
3134
import java.awt.event.MouseEvent;
3235
import java.util.Enumeration;
3336

37+
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.OpenTabEvent.*;
3438
import static com.neueda.jetbrains.plugin.graphdb.visualization.util.DisplayUtil.*;
3539

3640
public class GraphPanel {
@@ -53,7 +57,7 @@ public void initialize(GraphConsoleView graphConsoleView, Project project) {
5357
MessageBus messageBus = project.getMessageBus();
5458
this.lookAndFeelService = graphConsoleView.getLookAndFeelService();
5559
this.entityDetailsTree = graphConsoleView.getEntityDetailsTree();
56-
entityDetailsTree.addMouseListener(new TreeContextMenuMouseAdapter());
60+
entityDetailsTree.addMouseListener(new TreeMouseAdapter());
5761

5862
// Bootstrap visualisation
5963
visualization = new PrefuseVisualization(lookAndFeelService);
@@ -71,8 +75,12 @@ public void executionStarted(DataSourceApi dataSource, ExecuteQueryPayload paylo
7175

7276
@Override
7377
public void resultReceived(ExecuteQueryPayload payload, GraphQueryResult result) {
74-
if (result.getNodes().isEmpty()) {
75-
entityDetailsTreeModel.setRoot(null);
78+
if (result.getNodes().isEmpty() && !result.getRows().isEmpty()) {
79+
LinkListener<?> openTableTab = (l, s) -> messageBus.syncPublisher(OPEN_TAB_TOPIC).openTab(Tabs.TABLE);
80+
LinkLabel<?> link = new LinkLabel<>("Nothing to display in Graph. Click to view results as Table.", null, openTableTab);
81+
entityDetailsTreeModel.setRoot(new PatchedDefaultMutableTreeNode(link));
82+
} else if (result.getNodes().isEmpty()) {
83+
entityDetailsTreeModel.setRoot(new PatchedDefaultMutableTreeNode("Query returned no results."));
7684
} else {
7785
entityDetailsTreeModel.setRoot(new PatchedDefaultMutableTreeNode("Select an item in the graph to view details..."));
7886
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/log/LogPanel.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,15 @@ public void resultReceived(ExecuteQueryPayload payload, GraphQueryResult result)
6060
info(String.format("Query executed in %sms. %s", result.getExecutionTimeMs(), result.getResultSummary()));
6161
if (result.getRows().isEmpty()) {
6262
info("No results.");
63+
} else if (result.getNodes().isEmpty()) {
64+
info(String.format("Got %s rows. View results: %s",
65+
result.getRows().size(),
66+
GoToTabFilter.TABLE_TAB_LINK));
6367
} else {
6468
info(String.format("Got %s rows. View results: %s, %s",
65-
result.getRows().size(),
66-
GoToTabFilter.GRAPH_TAB_LINK,
67-
GoToTabFilter.TABLE_TAB_LINK));
69+
result.getRows().size(),
70+
GoToTabFilter.GRAPH_TAB_LINK,
71+
GoToTabFilter.TABLE_TAB_LINK));
6872
}
6973
newLine();
7074
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/console/table/ValueConverter.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@
33
import com.intellij.ui.treeStructure.PatchedDefaultMutableTreeNode;
44
import com.intellij.ui.treeStructure.Tree;
55
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
6-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeContextMenuMouseAdapter;
6+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeMouseAdapter;
77
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.renderes.tree.PropertyTreeCellRenderer;
88

99
import javax.swing.event.TreeExpansionEvent;
1010
import javax.swing.event.TreeExpansionListener;
1111
import javax.swing.tree.DefaultTreeModel;
1212
import java.util.Objects;
1313

14-
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.canBeTree;
15-
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.keyValueToTreeNode;
16-
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.representUiString;
14+
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.*;
1715

1816
public class ValueConverter {
1917

@@ -50,7 +48,7 @@ public void treeCollapsed(TreeExpansionEvent event) {
5048
}
5149
});
5250

53-
tree.addMouseListener(new TreeContextMenuMouseAdapter());
51+
tree.addMouseListener(new TreeMouseAdapter());
5452

5553
treeModel.reload();
5654
return tree;

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/datasource/DataSourcesView.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,10 @@
2222
import com.neueda.jetbrains.plugin.graphdb.jetbrains.util.FileUtil;
2323
import com.neueda.jetbrains.plugin.graphdb.language.cypher.completion.metadata.CypherMetadataProviderService;
2424

25-
import javax.swing.BorderFactory;
26-
import javax.swing.JPanel;
25+
import javax.swing.*;
2726
import javax.swing.tree.DefaultMutableTreeNode;
2827
import javax.swing.tree.DefaultTreeModel;
29-
import java.awt.GridLayout;
28+
import java.awt.*;
3029
import java.io.IOException;
3130
import java.util.Enumeration;
3231
import java.util.List;
@@ -111,7 +110,7 @@ private void configureDataSourceTree() {
111110
dataSourceTree.setModel(treeModel);
112111
dataSourceTree.setRootVisible(false);
113112
dataSourceTree.setToggleClickCount(0);
114-
dataSourceTree.addMouseListener(new TreeContextMenuMouseAdapter());
113+
dataSourceTree.addMouseListener(new TreeMouseAdapter());
115114
}
116115

117116
private void decorateDataSourceTree() {

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/datasource/tree/TreeContextMenuMouseAdapter.java

Lines changed: 0 additions & 27 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree;
2+
3+
import com.intellij.ide.DataManager;
4+
import com.intellij.openapi.actionSystem.DataContext;
5+
import com.intellij.ui.components.labels.LinkLabel;
6+
import com.intellij.ui.treeStructure.PatchedDefaultMutableTreeNode;
7+
import com.intellij.ui.treeStructure.Tree;
8+
9+
import javax.swing.*;
10+
import javax.swing.tree.TreePath;
11+
import java.awt.event.MouseAdapter;
12+
import java.awt.event.MouseEvent;
13+
import java.util.Optional;
14+
15+
public class TreeMouseAdapter extends MouseAdapter {
16+
17+
private ContextMenuService contextMenuService = new ContextMenuService();
18+
19+
@Override
20+
public void mouseClicked(MouseEvent e) {
21+
Tree tree = (Tree) e.getComponent();
22+
TreePath pathForLocation = tree.getPathForLocation(e.getX(), e.getY());
23+
24+
if (SwingUtilities.isLeftMouseButton(e)) {
25+
Optional.ofNullable(pathForLocation)
26+
.flatMap(p -> cast(p.getLastPathComponent(), PatchedDefaultMutableTreeNode.class))
27+
.flatMap(n -> cast(n.getUserObject(), LinkLabel.class))
28+
.ifPresent(LinkLabel::doClick);
29+
} else if (SwingUtilities.isRightMouseButton(e)) {
30+
DataContext dataContext = DataManager.getInstance().getDataContext(tree);
31+
contextMenuService.getContextMenu(pathForLocation)
32+
.ifPresent(dto -> dto.showPopup(dataContext));
33+
}
34+
}
35+
36+
@SuppressWarnings("unchecked")
37+
private <T> Optional<T> cast(Object o, Class<T> clazz) {
38+
if (clazz.isInstance(o)) {
39+
return Optional.of((T) o);
40+
} else {
41+
return Optional.empty();
42+
}
43+
}
44+
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/renderes/tree/PropertyTreeCellRenderer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.intellij.ui.ColoredTreeCellRenderer;
44
import com.intellij.ui.SimpleTextAttributes;
5+
import com.intellij.ui.components.labels.LinkLabel;
56
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeNodeModelApi;
67
import org.jetbrains.annotations.NotNull;
78

@@ -25,6 +26,9 @@ public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean sel
2526
append(model.getValue().get().toString());
2627
}
2728
}
29+
} else if (userObject instanceof LinkLabel) {
30+
String text = ((LinkLabel) userObject).getText();
31+
append(text, SimpleTextAttributes.LINK_ATTRIBUTES);
2832
} else if (userObject != null) {
2933
append(userObject.toString());
3034
}

0 commit comments

Comments
 (0)