Skip to content

Commit 6b5a595

Browse files
committed
update menu app and add global key binding for file searching
1 parent e1df488 commit 6b5a595

2 files changed

Lines changed: 118 additions & 23 deletions

File tree

src/main/java/gr/sqlbrowserfx/SqlBrowserFXApp.java

Lines changed: 105 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import org.dockfx.DockPane;
1616
import org.dockfx.DockPos;
1717
import org.dockfx.DockWeights;
18+
import org.fxmisc.wellbehaved.event.EventPattern;
19+
import org.fxmisc.wellbehaved.event.InputMap;
20+
import org.fxmisc.wellbehaved.event.Nodes;
1821
import org.slf4j.LoggerFactory;
1922

2023
import com.kodedu.terminalfx.TerminalBuilder;
@@ -35,10 +38,13 @@
3538
import gr.sqlbrowserfx.nodes.CustomVBox;
3639
import gr.sqlbrowserfx.nodes.DBTreeView;
3740
import gr.sqlbrowserfx.nodes.DbConfigBox;
41+
import gr.sqlbrowserfx.nodes.FileSearchPopOver;
42+
import gr.sqlbrowserfx.nodes.FilesTabPane;
3843
import gr.sqlbrowserfx.nodes.FilesTreeView;
3944
import gr.sqlbrowserfx.nodes.HelpTabPane;
4045
import gr.sqlbrowserfx.nodes.MySqlConfigBox;
4146
import gr.sqlbrowserfx.nodes.PostgreSqlConfigBox;
47+
import gr.sqlbrowserfx.nodes.SearchInFilesPopOver;
4248
import gr.sqlbrowserfx.nodes.SqlConnectorType;
4349
import gr.sqlbrowserfx.nodes.SqlConsolePane;
4450
import gr.sqlbrowserfx.nodes.SqlServerConfigBox;
@@ -57,6 +63,7 @@
5763
import javafx.event.ActionEvent;
5864
import javafx.geometry.Insets;
5965
import javafx.geometry.Pos;
66+
import javafx.scene.Node;
6067
import javafx.scene.Scene;
6168
import javafx.scene.control.Button;
6269
import javafx.scene.control.ContextMenu;
@@ -70,10 +77,10 @@
7077
import javafx.scene.control.TabPane;
7178
import javafx.scene.control.TextField;
7279
import javafx.scene.input.KeyCode;
80+
import javafx.scene.input.KeyCombination;
7381
import javafx.scene.input.KeyEvent;
7482
import javafx.scene.layout.BorderPane;
7583
import javafx.scene.paint.Color;
76-
import javafx.scene.text.Font;
7784
import javafx.scene.text.TextAlignment;
7885
import javafx.stage.DirectoryChooser;
7986
import 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
}

src/main/java/gr/sqlbrowserfx/SqlBrowserFXAppManager.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import gr.sqlbrowserfx.dock.nodes.DDBTreeView;
1111
import gr.sqlbrowserfx.dock.nodes.DSqlConsolePane;
1212
import gr.sqlbrowserfx.dock.nodes.DSqlPane;
13+
import gr.sqlbrowserfx.nodes.FilesTabPane;
1314
import gr.sqlbrowserfx.nodes.sqlpane.SqlPane;
1415

1516
public class SqlBrowserFXAppManager {
@@ -19,6 +20,7 @@ public class SqlBrowserFXAppManager {
1920
private static final SqlConnector SQL_CONNECTOR = new SqliteConnector(INTERNAL_DB_PATH);
2021
private static final List<DSqlPane> DSQL_PANES = new ArrayList<>();
2122
private static final List<SqlPane> SQL_PANES = new ArrayList<>();
23+
private static final List<FilesTabPane> FILES_TAB_PANES = new ArrayList<>();
2224
private static final List<DDBTreeView> DB_TREE_VIEWS = new ArrayList<>();
2325
private static String DB_TYPE = "sqlite";
2426

@@ -31,6 +33,10 @@ public static void registerDSqlPane(DSqlPane sqlPane) {
3133
DB_TREE_VIEWS.forEach(DDBTreeView::populateSqlPanesMenu);
3234
}
3335

36+
public static void registerFilesTabPane(FilesTabPane tabPane) {
37+
FILES_TAB_PANES.add(tabPane);
38+
}
39+
3440
public static void registerSqlPane(SqlPane sqlPane) {
3541
SQL_PANES.add(sqlPane);
3642
DB_TREE_VIEWS.forEach(DDBTreeView::populateSqlPanesMenu);
@@ -47,7 +53,7 @@ public static long getActiveSqlCodeAreasNum() {
4753
}
4854

4955
public static DSqlConsolePane getFirstActiveDSqlConsolePane() {
50-
DSqlPane activeSqlPane = DSQL_PANES.stream()
56+
var activeSqlPane = DSQL_PANES.stream()
5157
.filter(sqlPane -> sqlPane.getSqlConsolePane() != null)
5258
.findFirst()
5359
.orElse(null);
@@ -59,6 +65,12 @@ public static DSqlConsolePane getFirstActiveDSqlConsolePane() {
5965
return null;
6066
}
6167

68+
public static FilesTabPane getFirstActiveFilesTabPane() {
69+
return FILES_TAB_PANES.stream()
70+
.findFirst()
71+
.orElse(null);
72+
}
73+
6274
public static void unregisterDSqlPane(DSqlPane sqlPane) {
6375
DSQL_PANES.remove(sqlPane);
6476
DB_TREE_VIEWS.forEach(DDBTreeView::populateSqlPanesMenu);

0 commit comments

Comments
 (0)