11
22package gr .sqlbrowserfx ;
33
4- import java .awt .Toolkit ;
5- import java .awt .datatransfer .StringSelection ;
64import java .io .File ;
75import java .io .FileNotFoundException ;
86import java .nio .file .Files ;
1715import org .dockfx .DockPane ;
1816import org .dockfx .DockPos ;
1917import org .dockfx .DockWeights ;
20- import org .json .JSONArray ;
2118import org .slf4j .LoggerFactory ;
2219
2320import gr .sqlbrowserfx .conn .MysqlConnector ;
3027import gr .sqlbrowserfx .dock .nodes .DLogConsolePane ;
3128import gr .sqlbrowserfx .dock .nodes .DSqlPane ;
3229import gr .sqlbrowserfx .factories .DialogFactory ;
30+ import gr .sqlbrowserfx .nodes .ChatGptWebView ;
3331import gr .sqlbrowserfx .nodes .DBTreeView ;
3432import gr .sqlbrowserfx .nodes .DbConfigBox ;
3533import gr .sqlbrowserfx .nodes .FilesTreeView ;
4644import gr .sqlbrowserfx .nodes .queriesmenu .QueriesMenu ;
4745import gr .sqlbrowserfx .nodes .sqlpane .SqlPane ;
4846import gr .sqlbrowserfx .nodes .tableviews .HistorySqlTableView ;
49- import gr .sqlbrowserfx .nodes .tableviews .JSONTableView ;
50- import gr .sqlbrowserfx .nodes .tableviews .MapTableViewRow ;
5147import gr .sqlbrowserfx .rest .RESTfulService ;
5248import gr .sqlbrowserfx .rest .RESTfulServiceConfig ;
53- import gr .sqlbrowserfx .utils .HttpClient ;
5449import gr .sqlbrowserfx .utils .JavaFXUtils ;
5550import gr .sqlbrowserfx .utils .PropertiesLoader ;
5651import javafx .application .Application ;
7065import javafx .scene .control .Tab ;
7166import javafx .scene .control .TabPane ;
7267import javafx .scene .control .TextField ;
73- import javafx .scene .input .Clipboard ;
74- import javafx .scene .input .ClipboardContent ;
7568import javafx .scene .input .KeyCode ;
7669import javafx .scene .input .KeyEvent ;
77- import javafx .scene .input .MouseButton ;
78- import javafx .scene .input .MouseEvent ;
7970import javafx .scene .layout .BorderPane ;
8071import javafx .scene .layout .HBox ;
8172import javafx .scene .layout .Priority ;
8273import javafx .scene .layout .VBox ;
8374import javafx .scene .text .Font ;
8475import javafx .scene .text .TextAlignment ;
85- import javafx .scene .web .WebView ;
8676import javafx .stage .DirectoryChooser ;
8777import javafx .stage .FileChooser ;
8878import 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" ));
0 commit comments