11package 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+
320import gr .sqlbrowserfx .LoggerConf ;
421import gr .sqlbrowserfx .SqlBrowserFXAppManager ;
522import gr .sqlbrowserfx .conn .SqlConnector ;
1835import gr .sqlbrowserfx .nodes .sqlpane .DraggingTabPaneSupport ;
1936import gr .sqlbrowserfx .utils .JavaFXUtils ;
2037import javafx .application .Platform ;
21- import javafx .geometry .Bounds ;
2238import 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 ;
2551import javafx .scene .input .KeyCode ;
2652import javafx .scene .input .KeyCombination ;
2753import javafx .scene .input .TransferMode ;
3056import javafx .scene .layout .StackPane ;
3157import javafx .scene .layout .VBox ;
3258import 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
5060public 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