Skip to content

Commit e5ed4f1

Browse files
committed
add context menus to tabs with close option
1 parent 8edf783 commit e5ed4f1

2 files changed

Lines changed: 45 additions & 15 deletions

File tree

src/main/java/gr/sqlbrowserfx/nodes/SqlConsolePane.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public SqlConsolePane(SqlConnector sqlConnector) {
8282
listeners = new ArrayList<>();
8383

8484
queryTabPane = new TabPane();
85-
DraggingTabPaneSupport draggingSupport = new DraggingTabPaneSupport("/icons/thunder.png");
85+
var draggingSupport = new DraggingTabPaneSupport("/icons/thunder.png");
8686
draggingSupport.addSupport(queryTabPane);
8787
newConsoleTab = new Tab("");
8888
newConsoleTab.setGraphic(JavaFXUtils.createIcon("/icons/add.png"));
@@ -118,7 +118,7 @@ public SqlConsolePane(SqlConnector sqlConnector) {
118118
queryTabPane.getSelectionModel().selectedItemProperty().addListener(
119119
(ov, oldTab, newTab) -> {
120120
if (newTab.getContent() != null) {
121-
CodeArea codeArea = (oldTab.getContent() != null) ? ((VirtualizedScrollPane<CodeArea>) oldTab.getContent()).getContent()
121+
var codeArea = (oldTab.getContent() != null) ? ((VirtualizedScrollPane<CodeArea>) oldTab.getContent()).getContent()
122122
: null;
123123

124124
if (codeArea instanceof TextAnalyzer) {
@@ -153,10 +153,10 @@ public SqlConsolePane(SqlConnector sqlConnector) {
153153
});
154154

155155
this.setOnDragDropped(event -> {
156-
Dragboard db = event.getDragboard();
157-
boolean success = false;
156+
var db = event.getDragboard();
157+
var success = false;
158158
if (db.hasFiles()) {
159-
File file = db.getFiles().get(0);
159+
var file = db.getFiles().get(0);
160160
SqlConsolePane.this.openNewFileTab(file);
161161
success = true;
162162
}
@@ -175,11 +175,11 @@ public void destroySplitPane() {
175175

176176
@SuppressWarnings("unchecked")
177177
private void addTab() {
178-
Tab selectedTab = queryTabPane.getSelectionModel().getSelectedItem();
178+
var selectedTab = queryTabPane.getSelectionModel().getSelectedItem();
179179
if (selectedTab == newConsoleTab) {
180180
this.openNewSqlConsoleTab();
181181
} else {
182-
CodeArea codeArea = ((VirtualizedScrollPane<CodeArea>) selectedTab.getContent()).getContent();
182+
var codeArea = ((VirtualizedScrollPane<CodeArea>) selectedTab.getContent()).getContent();
183183
if (codeArea instanceof CSqlCodeArea) {
184184
codeAreaRef = (CSqlCodeArea) codeArea;
185185
}
@@ -197,23 +197,28 @@ private void showFileSearchPopOver() {
197197

198198
createFileSearchPopover();
199199

200-
Bounds boundsInScene = this.localToScreen(this.getBoundsInLocal());
200+
var boundsInScene = this.localToScreen(this.getBoundsInLocal());
201201
fileSearchPopOver.show(toolbar, boundsInScene.getMaxX() - 620,
202202
boundsInScene.getMinY());
203203
}
204204

205205
private void openNewSqlConsoleTab() {
206-
CSqlCodeArea sqlCodeArea = new CSqlCodeArea();
206+
var sqlCodeArea = new CSqlCodeArea();
207207
sqlCodeArea.wrapTextProperty().bind(this.wrapTextCheckBox.selectedProperty());
208208
sqlCodeArea.showLinesProperty().bind(this.showLinesCheckBox.selectedProperty());
209209
sqlCodeArea.autoCompleteProperty().bind(this.autoCompleteOnTypeCheckBox.selectedProperty());
210210

211211
sqlCodeArea.setRunAction(this::executeButtonAction);
212212
sqlCodeArea.addEventHandler(SimpleEvent.EVENT_TYPE, simpleEvent -> SqlConsolePane.this.changed());
213213

214-
VirtualizedScrollPane<CodeArea> scrollPane = new VirtualizedScrollPane<>(sqlCodeArea);
215-
Tab newTab = new Tab("query " + queryTabPane.getTabs().size(), scrollPane);
216-
newTab.setOnClosed(event -> sqlCodeArea.stopTextAnalyzerDaemon());
214+
var scrollPane = new VirtualizedScrollPane<>(sqlCodeArea);
215+
var newTab = new Tab("query " + queryTabPane.getTabs().size(), scrollPane);
216+
217+
var closeTabItem = new MenuItem("Close Tab", JavaFXUtils.createIcon("/icons/minus.png"));
218+
closeTabItem.setOnAction(event -> newTab.getTabPane().getTabs().remove(newTab));
219+
220+
newTab.setContextMenu(new ContextMenu(closeTabItem));
221+
newTab.setOnClosed(event -> sqlCodeArea.stopTextAnalyzerDaemon());
217222

218223
queryTabPane.getTabs().add(newTab);
219224
queryTabPane.getSelectionModel().select(newTab);

src/main/java/gr/sqlbrowserfx/nodes/sqlpane/SqlTableTab.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package gr.sqlbrowserfx.nodes.sqlpane;
22

3+
import gr.sqlbrowserfx.nodes.ContextMenuOwner;
34
import gr.sqlbrowserfx.nodes.tableviews.SqlTableView;
45
import gr.sqlbrowserfx.utils.JavaFXUtils;
56
import javafx.beans.property.StringProperty;
67
import javafx.scene.Node;
8+
import javafx.scene.control.ContextMenu;
79
import javafx.scene.control.Label;
10+
import javafx.scene.control.MenuItem;
811
import javafx.scene.control.ProgressIndicator;
912
import javafx.scene.control.Tab;
1013
import javafx.scene.control.TabPane;
14+
import javafx.scene.input.Clipboard;
15+
import javafx.scene.input.ClipboardContent;
1116
import javafx.scene.layout.StackPane;
1217

13-
public class SqlTableTab extends Tab {
18+
public class SqlTableTab extends Tab implements ContextMenuOwner {
1419

1520
private SqlTableView sqlTableView;
1621
private TabPane recordsTabPane;
@@ -25,7 +30,7 @@ public SqlTableTab(String text, final SqlTableView sqlTableView) {
2530
super(text, sqlTableView);
2631
this.sqlTableView = sqlTableView;
2732

28-
Node graphic = JavaFXUtils.createIcon("/icons/table-e.png");
33+
var graphic = JavaFXUtils.createIcon("/icons/table-e.png");
2934
label = new Label(text, graphic);
3035
label.textProperty().bind(this.getSqlTableView().titleProperty());
3136
this.setText(null);
@@ -34,6 +39,7 @@ public SqlTableTab(String text, final SqlTableView sqlTableView) {
3439
this.sqlTableView = null;
3540
System.gc();
3641
});
42+
this.setContextMenu(this.createContextMenu());
3743
}
3844

3945
public SqlTableView getSqlTableView() {
@@ -61,7 +67,7 @@ public void setCustomGraphic(Node graphic) {
6167
}
6268

6369
public void startLoading() {
64-
ProgressIndicator progressIndicator = new ProgressIndicator();
70+
var progressIndicator = new ProgressIndicator();
6571
progressIndicator.setMaxHeight(40);
6672
progressIndicator.setMaxWidth(40);
6773
this.setContent(new StackPane(progressIndicator));
@@ -71,4 +77,23 @@ public void load() {
7177
this.setContent(sqlTableView);
7278
}
7379

80+
@Override
81+
public ContextMenu createContextMenu() {
82+
var showQuery = new MenuItem("Show Query", JavaFXUtils.createIcon("/icons/thunder.png"));
83+
showQuery.setOnAction(event -> {
84+
new CustomPopOver(new Label(this.sqlTableView.getQuery())).show(this.getGraphic());
85+
});
86+
var copyQuery = new MenuItem("Copy Query", JavaFXUtils.createIcon("/icons/copy.png"));
87+
copyQuery.setOnAction(event -> {
88+
var content = new ClipboardContent();
89+
content.putString(this.sqlTableView.getQuery());
90+
Clipboard.getSystemClipboard().setContent(content);
91+
});
92+
var closeTab = new MenuItem("Close Tab", JavaFXUtils.createIcon("/icons/minus.png"));
93+
closeTab.setOnAction(event -> {
94+
this.getTabPane().getTabs().remove(this);
95+
});
96+
return new ContextMenu(showQuery, copyQuery, closeTab);
97+
}
98+
7499
}

0 commit comments

Comments
 (0)