Skip to content

Commit d5bcaf5

Browse files
author
pkolovos
committed
update code area tabs context menus + add rename tab
1 parent 623c849 commit d5bcaf5

1 file changed

Lines changed: 74 additions & 25 deletions

File tree

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

Lines changed: 74 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
package gr.sqlbrowserfx.nodes;
22

3+
import java.io.File;
4+
import java.sql.ResultSet;
5+
import java.sql.ResultSetMetaData;
6+
import java.sql.SQLException;
7+
import java.util.ArrayList;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import java.util.concurrent.atomic.AtomicBoolean;
11+
import java.util.concurrent.atomic.AtomicLong;
12+
13+
import org.fxmisc.flowless.VirtualizedScrollPane;
14+
import org.fxmisc.richtext.CodeArea;
15+
import org.fxmisc.wellbehaved.event.EventPattern;
16+
import org.fxmisc.wellbehaved.event.InputMap;
17+
import org.fxmisc.wellbehaved.event.Nodes;
18+
import org.slf4j.LoggerFactory;
19+
320
import gr.sqlbrowserfx.LoggerConf;
421
import gr.sqlbrowserfx.SqlBrowserFXAppManager;
522
import gr.sqlbrowserfx.conn.SqlConnector;
@@ -18,10 +35,19 @@
1835
import gr.sqlbrowserfx.nodes.sqlpane.DraggingTabPaneSupport;
1936
import gr.sqlbrowserfx.utils.JavaFXUtils;
2037
import javafx.application.Platform;
21-
import javafx.geometry.Bounds;
2238
import javafx.geometry.Orientation;
23-
import javafx.scene.control.*;
24-
import javafx.scene.input.Dragboard;
39+
import javafx.scene.control.Button;
40+
import javafx.scene.control.CheckBox;
41+
import javafx.scene.control.ContextMenu;
42+
import javafx.scene.control.Label;
43+
import javafx.scene.control.MenuItem;
44+
import javafx.scene.control.ProgressIndicator;
45+
import javafx.scene.control.SplitPane;
46+
import javafx.scene.control.Tab;
47+
import javafx.scene.control.TabPane;
48+
import javafx.scene.control.TextArea;
49+
import javafx.scene.control.TextField;
50+
import javafx.scene.control.Tooltip;
2551
import javafx.scene.input.KeyCode;
2652
import javafx.scene.input.KeyCombination;
2753
import javafx.scene.input.TransferMode;
@@ -30,22 +56,6 @@
3056
import javafx.scene.layout.StackPane;
3157
import javafx.scene.layout.VBox;
3258
import javafx.stage.FileChooser;
33-
import org.fxmisc.flowless.VirtualizedScrollPane;
34-
import org.fxmisc.richtext.CodeArea;
35-
import org.fxmisc.wellbehaved.event.EventPattern;
36-
import org.fxmisc.wellbehaved.event.InputMap;
37-
import org.fxmisc.wellbehaved.event.Nodes;
38-
import org.slf4j.LoggerFactory;
39-
40-
import java.io.File;
41-
import java.sql.ResultSet;
42-
import java.sql.ResultSetMetaData;
43-
import java.sql.SQLException;
44-
import java.util.ArrayList;
45-
import java.util.Arrays;
46-
import java.util.List;
47-
import java.util.concurrent.atomic.AtomicBoolean;
48-
import java.util.concurrent.atomic.AtomicLong;
4959

5060
public class SqlConsolePane extends BorderPane implements ToolbarOwner, SimpleObservable<String> {
5161

@@ -202,6 +212,35 @@ private void showFileSearchPopOver() {
202212
boundsInScene.getMinY());
203213
}
204214

215+
private void addTabContextMenu(Tab tab) {
216+
var closeTabItem = new MenuItem("Close Tab", JavaFXUtils.createIcon("/icons/minus.png"));
217+
closeTabItem.setOnAction(event -> tab.getTabPane().getTabs().remove(tab));
218+
219+
var renameTabItem = new MenuItem("Rename Tab", JavaFXUtils.createIcon("/icons/edit.png"));
220+
renameTabItem.setOnAction(event -> {
221+
var tabGraphic = tab.getGraphic();
222+
var textField = new TextField();
223+
textField.setPromptText("Enter new name");
224+
textField.setOnKeyPressed(keyEvent -> {
225+
if (keyEvent.getCode() == KeyCode.ENTER) {
226+
// graphic is label because we are using DragTabPaneSupport util
227+
var label = (Label) tabGraphic;
228+
label.setText(textField.getText());
229+
tab.setGraphic(tabGraphic);
230+
}
231+
if (keyEvent.getCode() == KeyCode.ESCAPE) {
232+
tab.setGraphic(tabGraphic);
233+
}
234+
235+
keyEvent.consume();
236+
});
237+
tab.setGraphic(textField);
238+
textField.requestFocus();
239+
});
240+
241+
tab.setContextMenu(new ContextMenu(closeTabItem, renameTabItem));
242+
}
243+
205244
private void openNewSqlConsoleTab() {
206245
var sqlCodeArea = new CSqlCodeArea();
207246
sqlCodeArea.wrapTextProperty().bind(this.wrapTextCheckBox.selectedProperty());
@@ -213,11 +252,7 @@ private void openNewSqlConsoleTab() {
213252

214253
var scrollPane = new VirtualizedScrollPane<>(sqlCodeArea);
215254
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));
255+
addTabContextMenu(newTab);
221256
newTab.setOnClosed(event -> sqlCodeArea.stopTextAnalyzerDaemon());
222257

223258
queryTabPane.getTabs().add(newTab);
@@ -246,7 +281,6 @@ public void openNewFileTab(File selectedFile) {
246281

247282
Tab tab = new Tab(selectedFile.getName(), vsp);
248283
tab.setOnCloseRequest((event) -> {
249-
250284
if (fileCodeArea.isTextDirty()) {
251285
event.consume();
252286

@@ -258,6 +292,21 @@ public void openNewFileTab(File selectedFile) {
258292
}
259293
}
260294
});
295+
var closeTabItem = new MenuItem("Close Tab", JavaFXUtils.createIcon("/icons/minus.png"));
296+
closeTabItem.setOnAction(event -> {
297+
if (fileCodeArea.isTextDirty()) {
298+
event.consume();
299+
300+
if (DialogFactory.createConfirmationDialog(
301+
"Unsaved work",
302+
"Do you want to discard changes ?")
303+
) {
304+
queryTabPane.getTabs().remove(tab);
305+
}
306+
}
307+
});
308+
tab.setContextMenu(new ContextMenu(closeTabItem));
309+
261310
tab.setGraphic(JavaFXUtils.createIcon("/icons/code-file.png"));
262311
queryTabPane.getTabs().add(tab);
263312
queryTabPane.getSelectionModel().select(tab);

0 commit comments

Comments
 (0)