Skip to content

Commit a384e3c

Browse files
committed
polish main app menu and chatgpt dock view
1 parent 37618c6 commit a384e3c

3 files changed

Lines changed: 14 additions & 133 deletions

File tree

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

Lines changed: 13 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11

22
package gr.sqlbrowserfx;
33

4-
import java.awt.Toolkit;
5-
import java.awt.datatransfer.StringSelection;
64
import java.io.File;
75
import java.io.FileNotFoundException;
86
import java.nio.file.Files;
@@ -17,7 +15,6 @@
1715
import org.dockfx.DockPane;
1816
import org.dockfx.DockPos;
1917
import org.dockfx.DockWeights;
20-
import org.json.JSONArray;
2118
import org.slf4j.LoggerFactory;
2219

2320
import gr.sqlbrowserfx.conn.MysqlConnector;
@@ -30,6 +27,7 @@
3027
import gr.sqlbrowserfx.dock.nodes.DLogConsolePane;
3128
import gr.sqlbrowserfx.dock.nodes.DSqlPane;
3229
import gr.sqlbrowserfx.factories.DialogFactory;
30+
import gr.sqlbrowserfx.nodes.ChatGptWebView;
3331
import gr.sqlbrowserfx.nodes.DBTreeView;
3432
import gr.sqlbrowserfx.nodes.DbConfigBox;
3533
import gr.sqlbrowserfx.nodes.FilesTreeView;
@@ -46,11 +44,8 @@
4644
import gr.sqlbrowserfx.nodes.queriesmenu.QueriesMenu;
4745
import gr.sqlbrowserfx.nodes.sqlpane.SqlPane;
4846
import gr.sqlbrowserfx.nodes.tableviews.HistorySqlTableView;
49-
import gr.sqlbrowserfx.nodes.tableviews.JSONTableView;
50-
import gr.sqlbrowserfx.nodes.tableviews.MapTableViewRow;
5147
import gr.sqlbrowserfx.rest.RESTfulService;
5248
import gr.sqlbrowserfx.rest.RESTfulServiceConfig;
53-
import gr.sqlbrowserfx.utils.HttpClient;
5449
import gr.sqlbrowserfx.utils.JavaFXUtils;
5550
import gr.sqlbrowserfx.utils.PropertiesLoader;
5651
import javafx.application.Application;
@@ -70,19 +65,14 @@
7065
import javafx.scene.control.Tab;
7166
import javafx.scene.control.TabPane;
7267
import javafx.scene.control.TextField;
73-
import javafx.scene.input.Clipboard;
74-
import javafx.scene.input.ClipboardContent;
7568
import javafx.scene.input.KeyCode;
7669
import javafx.scene.input.KeyEvent;
77-
import javafx.scene.input.MouseButton;
78-
import javafx.scene.input.MouseEvent;
7970
import javafx.scene.layout.BorderPane;
8071
import javafx.scene.layout.HBox;
8172
import javafx.scene.layout.Priority;
8273
import javafx.scene.layout.VBox;
8374
import javafx.scene.text.Font;
8475
import javafx.scene.text.TextAlignment;
85-
import javafx.scene.web.WebView;
8676
import javafx.stage.DirectoryChooser;
8777
import javafx.stage.FileChooser;
8878
import javafx.stage.Stage;
@@ -324,46 +314,6 @@ else if (configBox.getSqlConnectorType().equalsIgnoreCase(SqlConnectorType.SQLSE
324314
});
325315
}
326316

327-
private VBox createJsonTableView() {
328-
var tableView = new JSONTableView();
329-
330-
var requestField = new TextField();
331-
requestField.setPromptText("Enter url...");
332-
final var executor = Executors.newSingleThreadExecutor();
333-
requestField.setOnKeyPressed(keyEvent -> {
334-
if (keyEvent.getCode() == KeyCode.ENTER) {
335-
executor.execute(() -> {
336-
try {
337-
338-
var jsonArray = new JSONArray(HttpClient.GET(requestField.getText()));
339-
tableView.setItemsLater(jsonArray);
340-
} catch (Throwable e) {
341-
DialogFactory.createErrorNotification(e);
342-
}
343-
});
344-
}
345-
});
346-
tableView.setOnKeyPressed(keyEvent -> {
347-
if (keyEvent.isControlDown() && keyEvent.getCode() == KeyCode.C) {
348-
var content = new StringBuilder();
349-
for (MapTableViewRow row :tableView.getSelectionModel().getSelectedItems()) {
350-
content.append(row.toString());
351-
}
352-
353-
var stringSelection = new StringSelection(content.toString());
354-
var clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
355-
clipboard.setContents(stringSelection, null);
356-
}
357-
else if (keyEvent.isControlDown() && keyEvent.getCode() == KeyCode.F) {
358-
requestField.requestFocus();
359-
requestField.selectAll();
360-
}
361-
});
362-
var vbox = new VBox(requestField, tableView);
363-
VBox.setVgrow(tableView, Priority.ALWAYS);
364-
return vbox;
365-
}
366-
367317
private String determineDBType(SqlConnector sqlConnector) {
368318
String dbType = null;
369319
if (sqlConnector instanceof SqliteConnector)
@@ -444,12 +394,6 @@ private MenuBar createMenu(DockPane dockPane) {
444394
});
445395
});
446396

447-
var sqlConsoleViewItem = new MenuItem("Open Simple Console View", JavaFXUtils.createIcon("/icons/console.png"));
448-
sqlConsoleViewItem.setOnAction(event -> {
449-
JavaFXUtils.zoomToCurrentFactor(new DockNode(dockPane, new SqlConsolePane(sqlConnector),
450-
"Simple SqlConsole", JavaFXUtils.createIcon("/icons/console.png")));
451-
});
452-
453397
var terminalViewItem = new MenuItem("Open Simple Terminal View", JavaFXUtils.createIcon("/icons/console.png"));
454398
terminalViewItem.setOnAction(event -> {
455399
JavaFXUtils.zoomToCurrentFactor(new DockNode(dockPane, new SimpleTerminalPane(),
@@ -463,82 +407,16 @@ private MenuBar createMenu(DockPane dockPane) {
463407
dockNode.dock(dockPane, DockPos.RIGHT);
464408
});
465409

466-
var chatGPTMenuItem = new MenuItem("Open ChatGPT", JavaFXUtils.createIcon("/icons/web.png"));
410+
var chatGPTMenuItem = new MenuItem("Open ChatGPT", JavaFXUtils.createIcon("/icons/chatgpt.png"));
467411
chatGPTMenuItem.setOnAction(event -> {
468-
var webView = new WebView();
469-
var webEngine = webView.getEngine();
470-
// Force dark color scheme via CSS injection
471-
String darkModeCSS = """
472-
(function() {
473-
const style = document.createElement('style');
474-
style.textContent = `
475-
:root {
476-
color-scheme: dark;
477-
background-color: #222222 !important;
478-
color: #e0e0e0 !important;
479-
}
480-
html, body *:not(pre):not(pre *) {
481-
background-color: #222222 !important;
482-
color: #e0e0e0 !important;
483-
margin: 0 !important;
484-
485-
}
486-
`;
487-
document.documentElement.appendChild(style);
488-
})();
489-
""";
490-
491-
// Load ChatGPT and then apply dark mode styling
492-
webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
493-
if (newState == javafx.concurrent.Worker.State.SUCCEEDED) {
494-
webEngine.executeScript(darkModeCSS);
495-
}
496-
});
497-
webEngine.load("https://chatgpt.com/");
498-
499-
var copySelectedHtmlText = new MenuItem("Copy Selected Text");
500-
copySelectedHtmlText.setOnAction(_ -> {
501-
var text = (String) webView.getEngine().executeScript("""
502-
(function() {
503-
let text = "";
504-
505-
if (window.getSelection) {
506-
text = window.getSelection().toString();
507-
} else if (document.selection && document.selection.type != "Control") {
508-
text = document.selection.createRange().text;
509-
}
510-
511-
return text;
512-
})();
513-
""");
514-
var clipboard = Clipboard.getSystemClipboard();
515-
var content = new ClipboardContent();
516-
content.putString(text);
517-
clipboard.setContent(content);
518-
});
519-
var contextMenu = new ContextMenu(copySelectedHtmlText);
520-
webView.setContextMenuEnabled(false); // disable native WebView menu
521-
webView.addEventFilter(MouseEvent.MOUSE_PRESSED, mouseEvent -> {
522-
if (mouseEvent.getButton() == MouseButton.SECONDARY) { // right-click
523-
contextMenu.show(webView, mouseEvent.getScreenX(), mouseEvent.getScreenY());
524-
mouseEvent.consume(); // prevent default
525-
} else {
526-
contextMenu.hide();
527-
}
528-
});
529-
530-
SqlBrowserFXAppManager.setChatGptWebEngine(webEngine);
531-
new DockNode(dockPane, webView, "ChatGPT", JavaFXUtils.createIcon("/icons/web.png"));
412+
var chatGptWebView = new ChatGptWebView();
413+
SqlBrowserFXAppManager.registerChatGpt(chatGptWebView);
414+
var dockNode = new DockNode(chatGptWebView, "ChatGPT", JavaFXUtils.createIcon("/icons/chatgpt.png"));
415+
dockNode.dock(dockPane, DockPos.RIGHT);
416+
dockNode.setOnClose(() -> SqlBrowserFXAppManager.unregisterChatGpt());
532417

533418
});
534419

535-
var jsonTableViewItem = new MenuItem("Open JSON Table View", JavaFXUtils.createIcon("/icons/web.png"));
536-
jsonTableViewItem.setOnAction(event -> {
537-
var jsonTableView = this.createJsonTableView();
538-
JavaFXUtils.zoomToCurrentFactor(
539-
new DockNode(dockPane, jsonTableView, "JSON Data Explorer", JavaFXUtils.createIcon("/icons/web.png")));
540-
});
541-
542420
var filesTreeViewItem = new MenuItem("Open Files Tree View", JavaFXUtils.createIcon("/icons/folder.png"));
543421
filesTreeViewItem.setOnAction(event -> {
544422
var chooser = new DirectoryChooser();
@@ -562,9 +440,12 @@ private MenuBar createMenu(DockPane dockPane) {
562440
dbDiagramPane.asDockNode().setFloating(true);
563441
});
564442

565-
menu1.getItems().addAll(sqlPaneViewItem, dbDiagramItem, new SeparatorMenuItem(),
566-
filesTreeViewItem, jsonTableViewItem, new SeparatorMenuItem(),
567-
sqlConsoleViewItem, logItem, chatGPTMenuItem);
443+
menu1.getItems().addAll(
444+
sqlPaneViewItem, dbDiagramItem,
445+
new SeparatorMenuItem(),
446+
filesTreeViewItem,
447+
new SeparatorMenuItem(),
448+
logItem, chatGPTMenuItem);
568449

569450
final var menu2 = new Menu("Restful Service", JavaFXUtils.createIcon("/icons/web.png"));
570451
var restServiceStartItem = new MenuItem("Start Restful Service", JavaFXUtils.createIcon("/icons/play.png"));

src/main/resources/styles/flat-dark.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
-fx-control-inner-background: -fx-primary-color;
1212
-fx-control-inner-background-alt: -fx-control-inner-background;
1313
-fx-faint-focus-color: transparent;
14-
-fx-font-size: 13.0pt;
14+
-fx-font-size: 12.0pt;
1515
/*-fx-selection-bar-non-focused: derive(-fx-accent,30%);*/
1616
-fx-selection-bar-non-focused: derive(-fx-base, 90.0%);
1717
-fx-background: derive(-fx-base, 10%);
789 Bytes
Loading

0 commit comments

Comments
 (0)