Skip to content

Commit 865eace

Browse files
authored
UX improvements (#122)
* Go to query Graph and Table results from Log * Open Table results when executing metadata actions if Console window is not open
1 parent 0485378 commit 865eace

File tree

6 files changed

+134
-4
lines changed

6 files changed

+134
-4
lines changed

platform/src/main/java/com/neueda/jetbrains/plugin/graphdb/platform/GraphConstants.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ public final class GraphConstants {
99

1010
public static class ToolWindow {
1111
public static final String CONSOLE_TOOL_WINDOW = "Graph Database Console";
12+
13+
public static class Tabs {
14+
public static final String LOG = "Log";
15+
public static final String GRAPH = "Graph";
16+
public static final String TABLE = "Table";
17+
public static final String PARAMETERS = "Parameters";
18+
}
1219
}
1320

1421
public static class Actions {

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.intellij.util.ui.UIUtil;
2525
import com.neueda.jetbrains.plugin.graphdb.database.api.query.GraphQueryResult;
2626
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.analytics.Analytics;
27+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.OpenTabEvent;
2728
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.QueryPlanEvent;
2829
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.graph.GraphPanel;
2930
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.log.LogPanel;
@@ -32,6 +33,7 @@
3233
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.status.ExecutionStatusBarWidget;
3334
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.table.TablePanel;
3435
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants;
36+
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants.ToolWindow.Tabs;
3537
import com.neueda.jetbrains.plugin.graphdb.visualization.services.LookAndFeelService;
3638

3739
import javax.swing.*;
@@ -117,20 +119,22 @@ public void initToolWindow(Project project, ToolWindow toolWindow) {
117119
// Tabs
118120
consoleTabs.setFirstTabOffset(0);
119121
consoleTabs.addTab(new TabInfo(logTab)
120-
.setText("Log"));
122+
.setText(Tabs.LOG));
121123
consoleTabs.addTab(new TabInfo(graphTab)
122-
.setText("Graph"));
124+
.setText(Tabs.GRAPH));
123125
consoleTabs.addTab(new TabInfo(tableScrollPane)
124-
.setText("Table"));
126+
.setText(Tabs.TABLE));
125127
consoleTabs.addTab(new TabInfo(parametersTab)
126-
.setText("Parameters"));
128+
.setText(Tabs.PARAMETERS));
127129
consoleTabs.setSelectionChangeHandler((info, requestFocus, doChangeSelection) -> {
128130
Analytics.event("console", "openTab[" + info.getText() + "]");
129131
ActionCallback callback = doChangeSelection.run();
130132
graphPanel.resetPan();
131133
return callback;
132134
});
133135

136+
project.getMessageBus().connect().subscribe(OpenTabEvent.OPEN_TAB_TOPIC, this::selectTab);
137+
134138
AtomicInteger tabId = new AtomicInteger(0);
135139
project.getMessageBus().connect().subscribe(QueryPlanEvent.QUERY_PLAN_EVENT,
136140
(query, result) -> createNewQueryPlanTab(query, result, tabId.incrementAndGet()));
@@ -147,6 +151,17 @@ public void initToolWindow(Project project, ToolWindow toolWindow) {
147151
}
148152
}
149153

154+
private void selectTab(String name) {
155+
for (TabInfo tab : consoleTabs.getTabs()) {
156+
if (name.equals(tab.getText())) {
157+
consoleTabs.select(tab, true);
158+
return;
159+
}
160+
}
161+
162+
throw new IllegalArgumentException("No tab found with name: " + name);
163+
}
164+
150165
private void createUIComponents() {
151166
graphCanvas = new JPanel(new GridLayout(0, 1));
152167
consoleTabsPane = new JBTabsPaneImpl(null, SwingConstants.TOP, this);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event;
2+
3+
import com.intellij.util.messages.Topic;
4+
5+
public interface OpenTabEvent {
6+
7+
Topic<OpenTabEvent> OPEN_TAB_TOPIC = Topic.create("GraphDatabaseConsole.OpenTabTopic", OpenTabEvent.class);
8+
9+
void openTab(String graph);
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.log;
2+
3+
import com.intellij.execution.filters.Filter;
4+
import com.intellij.execution.filters.HyperlinkInfo;
5+
import com.intellij.execution.ui.ConsoleView;
6+
import com.intellij.icons.AllIcons;
7+
import com.intellij.openapi.ui.popup.JBPopupFactory;
8+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.OpenTabEvent;
9+
import com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants.ToolWindow.Tabs;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import javax.swing.*;
14+
import java.util.List;
15+
import java.util.Optional;
16+
import java.util.stream.Collectors;
17+
import java.util.stream.Stream;
18+
19+
public class GoToTabFilter implements Filter {
20+
static final String GRAPH_TAB_LINK = "as Graph";
21+
static final String TABLE_TAB_LINK = "as Table";
22+
23+
private ConsoleView log;
24+
25+
GoToTabFilter(ConsoleView log) {
26+
this.log = log;
27+
}
28+
29+
@Nullable
30+
@Override
31+
public Result applyFilter(@NotNull String textLine, int endPoint) {
32+
List<ResultItem> links = Stream.of(
33+
createLink(textLine, endPoint, GRAPH_TAB_LINK, Tabs.GRAPH),
34+
createLink(textLine, endPoint, TABLE_TAB_LINK, Tabs.TABLE))
35+
.filter(Optional::isPresent)
36+
.map(Optional::get)
37+
.collect(Collectors.toList());
38+
39+
return new Result(links);
40+
}
41+
42+
private Optional<Result> createLink(String textLine, int endPoint, String linkText, String tabName) {
43+
int startPoint = endPoint - textLine.length();
44+
45+
int tabLinkPos = textLine.lastIndexOf(linkText);
46+
if (tabLinkPos > -1) {
47+
HyperlinkInfo gotoTab = e -> {
48+
if (log.getContentSize() - 1 == endPoint) {
49+
e.getMessageBus().syncPublisher(OpenTabEvent.OPEN_TAB_TOPIC).openTab(tabName);
50+
} else {
51+
showPopup("Query results outdated", "Please run query again");
52+
}
53+
};
54+
55+
Result graphTabLink = new Result(
56+
startPoint + tabLinkPos,
57+
startPoint + tabLinkPos + linkText.length(),
58+
gotoTab);
59+
60+
return Optional.of(graphTabLink);
61+
}
62+
return Optional.empty();
63+
}
64+
65+
private void showPopup(String title, String text) {
66+
JBPopupFactory.getInstance()
67+
.createComponentPopupBuilder(
68+
new JLabel(text,
69+
AllIcons.General.BalloonInformation,
70+
JLabel.LEFT),
71+
log.getComponent())
72+
.setTitle(title)
73+
.createPopup()
74+
.showInFocusCenter();
75+
}
76+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public void initialize(GraphConsoleView graphConsoleView, Project project) {
3030
log = TextConsoleBuilderFactory.getInstance()
3131
.createBuilder(project)
3232
.getConsole();
33+
log.addMessageFilter(new GoToTabFilter(log));
34+
3335
Disposer.register(graphConsoleView, log);
3436
graphConsoleView.getLogTab().add(log.getComponent(), BorderLayout.CENTER);
3537

@@ -56,6 +58,14 @@ public void executionStarted(DataSourceApi dataSource, ExecuteQueryPayload paylo
5658
@Override
5759
public void resultReceived(ExecuteQueryPayload payload, GraphQueryResult result) {
5860
info(String.format("Query executed in %sms. %s", result.getExecutionTimeMs(), result.getResultSummary()));
61+
if (result.getRows().isEmpty()) {
62+
info("No results.");
63+
} else {
64+
info(String.format("Got %s rows. View results: %s, %s",
65+
result.getRows().size(),
66+
GoToTabFilter.GRAPH_TAB_LINK,
67+
GoToTabFilter.TABLE_TAB_LINK));
68+
}
5969
newLine();
6070
}
6171

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/datasource/metadata/actions/MetadataAction.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@
33
import com.intellij.openapi.actionSystem.AnAction;
44
import com.intellij.openapi.actionSystem.AnActionEvent;
55
import com.intellij.openapi.project.Project;
6+
import com.intellij.openapi.wm.ToolWindow;
7+
import com.intellij.openapi.wm.ToolWindowManager;
68
import com.intellij.util.messages.MessageBus;
79
import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.execute.ExecuteQueryEvent;
810
import com.neueda.jetbrains.plugin.graphdb.jetbrains.actions.execute.ExecuteQueryPayload;
911
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.DataSourcesComponent;
1012
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
13+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.ConsoleToolWindow;
14+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.console.event.OpenTabEvent;
1115

1216
import javax.swing.*;
1317
import java.util.Optional;
1418

19+
import static com.neueda.jetbrains.plugin.graphdb.platform.GraphConstants.ToolWindow.*;
20+
1521
public abstract class MetadataAction extends AnAction {
1622

1723
private String data;
@@ -38,5 +44,11 @@ public void actionPerformed(AnActionEvent e) {
3844
Optional<DataSourceApi> dataSource = dataSourcesComponent.getDataSourceContainer().findDataSource(dataSourceUuid);
3945

4046
dataSource.ifPresent(dataSourceApi -> executeQueryEvent.executeQuery(dataSourceApi, payload));
47+
48+
ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(CONSOLE_TOOL_WINDOW);
49+
if (!toolWindow.isVisible()) {
50+
ConsoleToolWindow.ensureOpen(project);
51+
messageBus.syncPublisher(OpenTabEvent.OPEN_TAB_TOPIC).openTab(Tabs.TABLE);
52+
}
4153
}
4254
}

0 commit comments

Comments
 (0)