Skip to content

Commit 7ffa813

Browse files
dwitrySergejs Muromcevs
authored and
Sergejs Muromcevs
committed
Context menu for tables (#126)
* `Copy` and `Copy value` actions * Part of #74
1 parent 36ecefc commit 7ffa813

File tree

6 files changed

+53
-35
lines changed

6 files changed

+53
-35
lines changed
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.intellij.openapi.actionSystem.AnAction;
44
import com.intellij.openapi.actionSystem.AnActionEvent;
5-
import com.neueda.jetbrains.plugin.graphdb.database.api.data.NoIdGraphEntity;
65
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.SerialisationHelper;
76
import org.jetbrains.annotations.NotNull;
87

@@ -11,17 +10,17 @@
1110
import java.awt.datatransfer.Clipboard;
1211
import java.awt.datatransfer.StringSelection;
1312

14-
public class EntityCopyToClipboardAction extends AnAction {
15-
private Object node;
13+
public class CopyToClipboardAction extends AnAction {
14+
private Object object;
1615

17-
EntityCopyToClipboardAction(String title, String description, Icon icon, NoIdGraphEntity node) {
16+
CopyToClipboardAction(String title, String description, Icon icon, Object object) {
1817
super(title, description, icon);
19-
this.node = node;
18+
this.object = object;
2019
}
2120

2221
@Override
2322
public void actionPerformed(@NotNull AnActionEvent e) {
24-
StringSelection selection = new StringSelection(SerialisationHelper.convertToCsv(node));
23+
StringSelection selection = new StringSelection(SerialisationHelper.convertToCsv(object));
2524
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
2625
clipboard.setContents(selection, selection);
2726
}

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.neueda.jetbrains.plugin.graphdb.database.api.data.GraphRelationship;
88
import com.neueda.jetbrains.plugin.graphdb.database.api.data.NoIdGraphEntity;
99
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
10+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.ObjectModel;
1011
import org.jetbrains.annotations.NotNull;
1112
import org.jetbrains.annotations.Nullable;
1213

@@ -17,19 +18,24 @@ public class EntityActionGroup extends ActionGroup {
1718
public EntityActionGroup(DataSourceApi dataSourceApi, NoIdGraphEntity entity) {
1819
if (entity instanceof GraphNode) {
1920
actions = new AnAction[]{
20-
new EntityCopyToClipboardAction("Copy node", "", null, entity),
21+
new CopyToClipboardAction("Copy node", "", null, entity),
2122
new NodeEditAction("Edit node", "", null, dataSourceApi, (GraphNode) entity),
2223
new NodeDeleteAction("Delete node", "", null, dataSourceApi, (GraphNode) entity),
2324
};
2425
} else if (entity instanceof GraphRelationship) {
2526
actions = new AnAction[]{
26-
new EntityCopyToClipboardAction("Copy relationship", "", null, entity),
27+
new CopyToClipboardAction("Copy relationship", "", null, entity),
2728
new RelationshipEditAction("Edit relationship", "", null, dataSourceApi, (GraphRelationship) entity),
2829
new RelationshipDeleteAction("Delete relationship", "", null, dataSourceApi, (GraphRelationship) entity)
2930
};
31+
} else if (entity instanceof ObjectModel) {
32+
actions = new AnAction[] {
33+
new CopyToClipboardAction("Copy " + entity.getRepresentation().toLowerCase(), "", null, entity),
34+
new CopyToClipboardAction("Copy value", "", null, ((ObjectModel) entity).getValue().orElse(null))
35+
};
3036
} else {
3137
actions = new AnAction[]{
32-
new EntityCopyToClipboardAction("Copy " + entity.getRepresentation().toLowerCase(), "", null, entity)
38+
new CopyToClipboardAction("Copy " + entity.getRepresentation().toLowerCase(), "", null, entity)
3339
};
3440
}
3541
}

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

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
import com.intellij.openapi.actionSystem.DataContext;
55
import com.intellij.ui.table.JBTable;
66
import com.intellij.ui.treeStructure.Tree;
7+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.ObjectModel;
78

89
import javax.swing.*;
910
import javax.swing.tree.TreePath;
1011
import java.awt.event.MouseAdapter;
1112
import java.awt.event.MouseEvent;
13+
import java.util.Optional;
14+
15+
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.cast;
1216

1317
public class TableContextMenuMouseAdapter extends MouseAdapter {
1418

@@ -23,16 +27,28 @@ public void mouseClicked(MouseEvent e) {
2327
int selectedColumn = table.columnAtPoint(e.getPoint());
2428

2529
Object value = table.getModel().getValueAt(selectedRow, selectedColumn);
26-
if (Tree.class.isAssignableFrom(value.getClass())) {
27-
Tree tree = (Tree) value;
28-
29-
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
30-
DataContext dataContext = DataManager.getInstance()
31-
.getDataContext(table, e.getX(), e.getY());
3230

33-
contextMenuService.getContextMenu(path)
34-
.ifPresent(dto -> dto.showPopup(dataContext));
35-
}
31+
DataContext dataContext = DataManager.getInstance()
32+
.getDataContext(table, e.getX(), e.getY());
33+
34+
cast(value, Tree.class)
35+
.map(tree -> {
36+
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
37+
return contextMenuService.getContextMenu(path);
38+
})
39+
.orElseGet(() -> {
40+
String columnName = table.getModel().getColumnName(selectedColumn);
41+
return new ObjectModel(trim(value), columnName, String.valueOf(value), null, value)
42+
.getContextMenu();
43+
})
44+
.ifPresent(c -> c.showPopup(dataContext));
3645
}
3746
}
47+
48+
private Object trim(Object value) {
49+
return Optional.ofNullable(value)
50+
.flatMap(e -> cast(e, String.class))
51+
.map(s -> s.replaceAll("^\"|\"$", ""))
52+
.orElse(null);
53+
}
3854
}

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import java.awt.event.MouseEvent;
1313
import java.util.Optional;
1414

15+
import static com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.helpers.UiHelper.cast;
16+
1517
public class TreeMouseAdapter extends MouseAdapter {
1618

1719
private ContextMenuService contextMenuService = new ContextMenuService();
@@ -32,13 +34,4 @@ public void mouseClicked(MouseEvent e) {
3234
.ifPresent(dto -> dto.showPopup(dataContext));
3335
}
3436
}
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-
}
4437
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public Optional<Icon> getIcon() {
3535

3636
@Override
3737
public Optional<String> getText() {
38-
return Optional.of(text);
38+
return Optional.ofNullable(text);
3939
}
4040

4141
@Override

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/ui/helpers/UiHelper.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,12 @@
77
import com.neueda.jetbrains.plugin.graphdb.database.api.data.GraphRelationship;
88
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.datasource.state.DataSourceApi;
99
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.TreeNodeModelApi;
10-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.LabelsModel;
11-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.ListModel;
12-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.MapModel;
13-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.NodeModel;
14-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.ObjectModel;
15-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.PropertiesModel;
16-
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.RelationshipModel;
10+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.ui.datasource.tree.model.*;
1711

1812
import java.util.List;
1913
import java.util.Map;
2014
import java.util.Objects;
15+
import java.util.Optional;
2116

2217
import static java.lang.String.format;
2318

@@ -162,4 +157,13 @@ private static TreeNodeModelApi modelOf(Object value, String key, String descrip
162157
public static String representUiString(String value) {
163158
return format("\"%s\"", Objects.toString(value));
164159
}
160+
161+
@SuppressWarnings("unchecked")
162+
public static <T> Optional<T> cast(Object o, Class<T> clazz) {
163+
if (clazz.isInstance(o)) {
164+
return Optional.of((T) o);
165+
} else {
166+
return Optional.empty();
167+
}
168+
}
165169
}

0 commit comments

Comments
 (0)