1515import org .dockfx .DockPane ;
1616import org .dockfx .DockPos ;
1717import org .dockfx .DockWeights ;
18+ import org .fxmisc .wellbehaved .event .EventPattern ;
19+ import org .fxmisc .wellbehaved .event .InputMap ;
20+ import org .fxmisc .wellbehaved .event .Nodes ;
1821import org .slf4j .LoggerFactory ;
1922
2023import com .kodedu .terminalfx .TerminalBuilder ;
3538import gr .sqlbrowserfx .nodes .CustomVBox ;
3639import gr .sqlbrowserfx .nodes .DBTreeView ;
3740import gr .sqlbrowserfx .nodes .DbConfigBox ;
41+ import gr .sqlbrowserfx .nodes .FileSearchPopOver ;
42+ import gr .sqlbrowserfx .nodes .FilesTabPane ;
3843import gr .sqlbrowserfx .nodes .FilesTreeView ;
3944import gr .sqlbrowserfx .nodes .HelpTabPane ;
4045import gr .sqlbrowserfx .nodes .MySqlConfigBox ;
4146import gr .sqlbrowserfx .nodes .PostgreSqlConfigBox ;
47+ import gr .sqlbrowserfx .nodes .SearchInFilesPopOver ;
4248import gr .sqlbrowserfx .nodes .SqlConnectorType ;
4349import gr .sqlbrowserfx .nodes .SqlConsolePane ;
4450import gr .sqlbrowserfx .nodes .SqlServerConfigBox ;
5763import javafx .event .ActionEvent ;
5864import javafx .geometry .Insets ;
5965import javafx .geometry .Pos ;
66+ import javafx .scene .Node ;
6067import javafx .scene .Scene ;
6168import javafx .scene .control .Button ;
6269import javafx .scene .control .ContextMenu ;
7077import javafx .scene .control .TabPane ;
7178import javafx .scene .control .TextField ;
7279import javafx .scene .input .KeyCode ;
80+ import javafx .scene .input .KeyCombination ;
7381import javafx .scene .input .KeyEvent ;
7482import javafx .scene .layout .BorderPane ;
7583import javafx .scene .paint .Color ;
76- import javafx .scene .text .Font ;
7784import javafx .scene .text .TextAlignment ;
7885import javafx .stage .DirectoryChooser ;
7986import javafx .stage .FileChooser ;
@@ -86,20 +93,18 @@ public class SqlBrowserFXApp extends Application {
8693
8794 private static String DB ;
8895 private static RESTfulServiceConfig restServiceConfig ;
89- private boolean restServiceStarted ;
96+ private boolean restServiceStarted = false ;
9097 private boolean isRestConfigurationShowing = false ;
98+ private boolean isInternalDBShowing = false ;
99+
91100
92101 private Scene primaryScene ;
93- public static Stage STAGE ;
94- private DSqlPane mainSqlPane ;
102+ private Stage primaryStage ;
95103
96104 private SqlConnector sqlConnector ;
97- private DDBTreePane ddbTreePane ;
98- private boolean isInternalDBShowing = false ;
99- private QueriesMenu queriesMenu ;
105+ private SearchInFilesPopOver searchInFilesPopOver ;
106+ private FileSearchPopOver fileSearchpopOver ;
100107
101- @ SuppressWarnings ("unused" )
102- private double fontSize ;
103108
104109 public static void main (String [] args ) {
105110 PropertiesLoader .setLogger (LoggerFactory .getLogger (LoggerConf .LOGGER_NAME ));
@@ -110,9 +115,7 @@ public static void main(String[] args) {
110115
111116 @ Override
112117 public void start (Stage primaryStage ) {
113- var defaultFont = Font .getDefault ();
114- fontSize = defaultFont .getSize ();
115- SqlBrowserFXApp .STAGE = primaryStage ;
118+ this .primaryStage = primaryStage ;
116119 primaryStage .setTitle ("SqlBrowserFX" );
117120
118121 if (DB == null )
@@ -263,7 +266,7 @@ private void dbSelectionAction(String dbPath) {
263266 SqlCodeAreaSyntaxProvider .init (SqlBrowserFXAppManager .getDBtype ());
264267 primaryScene .setRoot (new SqlConsolePane (sqliteConnector ));
265268 JavaFXUtils .addZoomInOutSupport (primaryScene .getRoot ());
266- STAGE .setScene (primaryScene );
269+ primaryStage .setScene (primaryScene );
267270 }
268271 else
269272 createAppView (sqliteConnector );
@@ -305,7 +308,7 @@ else if (configBox.getSqlConnectorType().equalsIgnoreCase(SqlConnectorType.SQLSE
305308 SqlCodeAreaSyntaxProvider .init (SqlBrowserFXAppManager .getDBtype ());
306309 primaryScene .setRoot (new SqlConsolePane (sqlConnector ));
307310 JavaFXUtils .addZoomInOutSupport (primaryScene .getRoot ());
308- STAGE .setScene (primaryScene );
311+ primaryStage .setScene (primaryScene );
309312 }
310313 else {
311314 createAppView (sqlConnector );
@@ -330,20 +333,20 @@ private void createAppView(SqlConnector sqlConnector) {
330333 SqlBrowserFXAppManager .setDBtype (determineDBType (sqlConnector ));
331334 SqlCodeAreaSyntaxProvider .init (SqlBrowserFXAppManager .getDBtype ());
332335
333- STAGE .setMaximized (true );
336+ primaryStage .setMaximized (true );
334337 var dockPane = new DockPane ();
335338 var menuBar = createMenu (dockPane );
336339
337340 dockPane .getStylesheets ().add (CSS_THEME );
338341
339- mainSqlPane = new DSqlPane (sqlConnector );
342+ var mainSqlPane = new DSqlPane (sqlConnector );
340343 SqlBrowserFXAppManager .registerDSqlPane (mainSqlPane );
341344 mainSqlPane .asDockNode ().setTitle (mainSqlPane .asDockNode ().getTitle () + " " + SqlBrowserFXAppManager .getActiveSqlPanes ().size ());
342345 mainSqlPane .asDockNode ().dock (dockPane , DockPos .CENTER , DockWeights .asDoubleArrray (0.8f ));
343346 mainSqlPane .asDockNode ().setClosable (false );
344347 mainSqlPane .showConsole ();
345348
346- ddbTreePane = new DDBTreePane (DB , sqlConnector );
349+ var ddbTreePane = new DDBTreePane (DB , sqlConnector );
347350 SqlBrowserFXAppManager .registerDDBTreeView (ddbTreePane .getDBTreeView ());
348351 ddbTreePane .getDBTreeView ().asDockNode ().setOnClose (() -> SqlBrowserFXAppManager .unregisterDDBTreeView (ddbTreePane .getDBTreeView ()));
349352
@@ -359,23 +362,34 @@ private void createAppView(SqlConnector sqlConnector) {
359362 mainPane .setCenter (dockPane );
360363
361364 JavaFXUtils .addZoomInOutSupport (mainPane );
365+ Nodes .addInputMap (mainPane ,
366+ InputMap .consume (EventPattern .keyPressed (KeyCode .H , KeyCombination .CONTROL_DOWN , KeyCombination .SHIFT_DOWN ), action -> {
367+ showSearchInFilesPopup (mainPane );
368+ })
369+ );
370+
371+ Nodes .addInputMap (mainPane ,
372+ InputMap .consume (EventPattern .keyPressed (KeyCode .R , KeyCombination .CONTROL_DOWN , KeyCombination .SHIFT_DOWN ), action -> {
373+ showFileSearchPopOver (mainPane );
374+ })
375+ );
362376
363377 if (primaryScene == null ) {
364378 primaryScene = new Scene (mainPane );
365- STAGE .setScene (primaryScene );
379+ primaryStage .setScene (primaryScene );
366380 primaryScene .getStylesheets ().add (CSS_THEME );
367381 }
368382
369383 primaryScene .setRoot (mainPane );
370- STAGE .heightProperty ().addListener ((obs , oldVal , newVal ) -> {
384+ primaryStage .heightProperty ().addListener ((obs , oldVal , newVal ) -> {
371385 SplitPane .setResizableWithParent (ddbTreePane .asDockNode (), Boolean .TRUE );
372386 for (SplitPane split : dockPane .getSplitPanes ()) {
373387 double [] positions = split .getDividerPositions (); // record the current ratio
374388 Platform .runLater (() -> split .setDividerPositions (positions )); // apply the now former ratio
375389 }
376390 SplitPane .setResizableWithParent (ddbTreePane .asDockNode (), Boolean .FALSE );
377391 });
378-
392+ DialogFactory . setStage ( primaryStage );
379393 }
380394
381395 private MenuBar createMenu (DockPane dockPane ) {
@@ -428,6 +442,13 @@ private MenuBar createMenu(DockPane dockPane) {
428442 new DockNode (dockPane , filesTreeView , "File Explorer : " + selectedDir .getName (), JavaFXUtils .createIcon ("/icons/folder.png" )));
429443 });
430444
445+ var filesTabViewItem = new MenuItem ("Open Files Tabs View" , JavaFXUtils .createIcon ("/icons/code-file.png" ));
446+ filesTabViewItem .setOnAction (event -> {
447+ var tabs = new FilesTabPane ();
448+ SqlBrowserFXAppManager .registerFilesTabPane (tabs );
449+ JavaFXUtils .zoomToCurrentFactor (
450+ new DockNode (dockPane , tabs , "Files" , JavaFXUtils .createIcon ("/icons/code-file.png" )));
451+ });
431452
432453 var logViewItem = new MenuItem ("Open Log View" , JavaFXUtils .createIcon ("/icons/monitor.png" ));
433454 logViewItem .setOnAction (actionEvent -> JavaFXUtils .zoomToCurrentFactor (new DLogConsolePane (dockPane ).asDockNode ()));
@@ -443,7 +464,8 @@ private MenuBar createMenu(DockPane dockPane) {
443464 sqlPaneViewItem ,
444465 dbDiagramViewItem ,
445466 new SeparatorMenuItem (),
446- filesTreeViewItem ,
467+ filesTreeViewItem ,
468+ filesTabViewItem ,
447469 new SeparatorMenuItem (),
448470 terminalViewItem ,
449471 logViewItem );
@@ -528,7 +550,7 @@ private MenuBar createMenu(DockPane dockPane) {
528550 });
529551
530552 var menuBar = new MenuBar ();
531- queriesMenu = new QueriesMenu ();
553+ var queriesMenu = new QueriesMenu ();
532554 menuBar .getMenus ().addAll (menu1 , menu2 , queriesMenu , menu4 , menu3 , menu5 );
533555
534556 return menuBar ;
@@ -576,5 +598,66 @@ private void saveConnectionToHistory() {
576598 }
577599 });
578600 }
601+
602+ private void showSearchInFilesPopup (Node node ) {
603+ if (searchInFilesPopOver != null && searchInFilesPopOver .isShowing ()) {
604+ return ;
605+ }
606+
607+ if (searchInFilesPopOver == null ) {
608+ searchInFilesPopOver = new SearchInFilesPopOver ();
609+ }
610+
611+ var scene = node .getScene ();
612+ var centerX = scene .getWindow ().getX () + scene .getX () + scene .getWidth () / 2 ;
613+ var centerY = scene .getWindow ().getY () + scene .getHeight () / 2 ;
614+
615+ // Show off-screen first
616+ searchInFilesPopOver .show (node , -10000 , -10000 );
617+
618+ Platform .runLater (() -> {
619+ double popOverWidth = searchInFilesPopOver .getWidth ();
620+ double popOverHeight = searchInFilesPopOver .getHeight ();
621+ double adjustedX = centerX - popOverWidth / 2 ;
622+ double adjustedY = centerY - popOverHeight / 2 ;
623+ searchInFilesPopOver .setX (adjustedX );
624+ searchInFilesPopOver .setY (adjustedY );
625+ });
626+ }
627+
628+ private void showFileSearchPopOver (Node node ) {
629+ if (fileSearchpopOver != null && fileSearchpopOver .isShowing ()) {
630+ return ;
631+ }
632+
633+ if (fileSearchpopOver == null ) {
634+ fileSearchpopOver = new FileSearchPopOver (file -> {
635+ var filesTabsPane = SqlBrowserFXAppManager .getFirstActiveFilesTabPane ();
636+ if (filesTabsPane != null ) {
637+ filesTabsPane .openNewFileTab (file );
638+ }
639+ var sqlConsolePane = SqlBrowserFXAppManager .getFirstActiveDSqlConsolePane ();
640+ if (sqlConsolePane != null ) {
641+ sqlConsolePane .openNewFileTab (file );
642+ }
643+ });
644+ }
645+
646+ var scene = node .getScene ();
647+ var centerX = scene .getWindow ().getX () + scene .getX () + scene .getWidth () / 2 ;
648+ var centerY = scene .getWindow ().getY () + scene .getHeight () / 2 ;
649+
650+ // Show off-screen first
651+ fileSearchpopOver .show (node , -10000 , -10000 );
652+
653+ Platform .runLater (() -> {
654+ double popOverWidth = fileSearchpopOver .getWidth ();
655+ double popOverHeight = fileSearchpopOver .getHeight ();
656+ double adjustedX = centerX - popOverWidth / 2 ;
657+ double adjustedY = centerY - popOverHeight / 2 ;
658+ fileSearchpopOver .setX (adjustedX );
659+ fileSearchpopOver .setY (adjustedY );
660+ });
661+ }
579662
580663}
0 commit comments