Skip to content

Commit 9c08c1d

Browse files
committed
add copy last code block menu item
1 parent 4451166 commit 9c08c1d

2 files changed

Lines changed: 50 additions & 5 deletions

File tree

src/main/java/gr/sqlbrowserfx/nodes/ChatGptWebView.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import gr.sqlbrowserfx.utils.JavaFXUtils;
88
import javafx.scene.control.ContextMenu;
99
import javafx.scene.control.MenuItem;
10+
import javafx.scene.control.SeparatorMenuItem;
1011
import javafx.scene.input.Clipboard;
1112
import javafx.scene.input.ClipboardContent;
1213
import javafx.scene.input.KeyCode;
@@ -77,8 +78,16 @@ public class ChatGptWebView extends BorderPane implements ContextMenuOwner, Inpu
7778
btn.click();
7879
})();
7980
""";
80-
81-
private final WebView webView = new WebView();;
81+
82+
private final String getLastCodeJs = """
83+
(function() {
84+
const codeElements = document.querySelectorAll('code');
85+
const lastCode = codeElements[codeElements.length - 1];
86+
return lastCode.textContent;
87+
})();
88+
""";
89+
90+
private final WebView webView = new WebView();
8291

8392
public ChatGptWebView() {
8493
var webEngine = webView.getEngine();
@@ -92,6 +101,7 @@ public ChatGptWebView() {
92101

93102
this.setContextMenu();
94103
this.setInputMap();
104+
95105
this.setCenter(webView);
96106
}
97107

@@ -152,6 +162,10 @@ private void clickAskButton() {
152162
this.getEngine().executeScript(this.clickAskButtonJs);
153163
}
154164

165+
public String getAiGeneratedCode() {
166+
return (String) this.getEngine().executeScript(this.getLastCodeJs);
167+
}
168+
155169
private void copySelectedTextToClipoboard() {
156170
var text = (String) webView.getEngine().executeScript(this.selectedTextJs);
157171
var clipboard = Clipboard.getSystemClipboard();
@@ -160,15 +174,26 @@ private void copySelectedTextToClipoboard() {
160174
clipboard.setContent(content);
161175
}
162176

177+
private void copyLastCodeBlockToClipboard() {
178+
var text = (String) webView.getEngine().executeScript(this.getLastCodeJs);
179+
var clipboard = Clipboard.getSystemClipboard();
180+
var content = new ClipboardContent();
181+
content.putString(text);
182+
clipboard.setContent(content);
183+
}
184+
163185
@Override
164186
public ContextMenu createContextMenu() {
165187
var copySelectedHtmlText = new MenuItem("Copy Selected Text", JavaFXUtils.createIcon("/icons/copy.png"));
166188
copySelectedHtmlText.setOnAction(copyAction -> this.copySelectedTextToClipoboard());
167189

190+
var copyLastCodeBlock = new MenuItem("Copy Last Code Block", JavaFXUtils.createIcon("/icons/var.png"));
191+
copyLastCodeBlock.setOnAction(copyAction -> this.copyLastCodeBlockToClipboard());
192+
168193
var refresh = new MenuItem("Refresh", JavaFXUtils.createIcon("/icons/refresh.png"));
169194
refresh.setOnAction(copyAction -> this.getEngine().reload());
170195

171-
return new ContextMenu(copySelectedHtmlText, refresh);
196+
return new ContextMenu(copySelectedHtmlText, copyLastCodeBlock, new SeparatorMenuItem(), refresh);
172197
}
173198

174199
}

src/test/java/sqlbrowserfx/ChatGptWebViewTestGui.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import java.io.IOException;
44

5+
import org.fxmisc.richtext.CodeArea;
6+
57
import gr.sqlbrowserfx.nodes.ChatGptWebView;
68
import javafx.application.Application;
9+
import javafx.application.Platform;
710
import javafx.scene.Scene;
811
import javafx.scene.control.Button;
912
import javafx.scene.layout.VBox;
@@ -15,8 +18,13 @@ public class ChatGptWebViewTestGui extends Application {
1518
public void start(Stage primaryStage) throws IOException {
1619
var chatGptWebView = new ChatGptWebView();
1720
var pasteButton = new Button("test");
21+
var codeButton = new Button("code");
22+
var codeArea = new CodeArea();
23+
codeButton.setOnAction(event -> {
24+
System.out.println(chatGptWebView.getAiGeneratedCode());
25+
});
1826
pasteButton.setOnAction(event -> {
19-
String safeText = "This is a test text pasted from java"
27+
String safeText = "Generate only code and only one code block. Generate an sql query"
2028
.replace("\\", "\\\\")
2129
.replace("\"", "\\\"")
2230
.replace("\n", "\\n")
@@ -35,9 +43,21 @@ public void start(Stage primaryStage) throws IOException {
3543
""".formatted(safeText);
3644

3745
chatGptWebView.getEngine().executeScript(js);
46+
new Thread(() -> {
47+
try {
48+
Thread.sleep(3000);
49+
System.out.println("Getting code");
50+
Platform.runLater(() -> {
51+
codeArea.appendText(chatGptWebView.getAiGeneratedCode());
52+
});
53+
} catch(Exception e) {
54+
// Ignore
55+
}
56+
}).start();
57+
3858
});
3959
Scene scene = new Scene(
40-
new VBox(pasteButton, chatGptWebView)
60+
new VBox(pasteButton, codeButton, chatGptWebView, codeArea)
4161
);
4262
scene.getStylesheets().add("/styles/flat-dark.css");
4363
primaryStage.setScene(scene);

0 commit comments

Comments
 (0)