2023年10月9日10:19:52

master
zhangmeng 2023-10-09 10:20:20 +08:00
parent bc5629b251
commit c078f31fd5
7 changed files with 337 additions and 69 deletions

View File

@ -1,6 +1,7 @@
package com.zhangmeng.tools.controller;
import com.zhangmeng.tools.editors.ace.AceEditor;
import com.zhangmeng.tools.editors.codemirr.CodeMirrWebView;
import com.zhangmeng.tools.editors.monaco.*;
import com.zhangmeng.tools.utils.AlertUtils;
import com.zhangmeng.tools.utils.ClipboardUtils;
@ -57,6 +58,7 @@ public class EditListController {
private AceEditor acJsEditor;
private AnchorPane monacoEdit;
private AnchorPane codemirror;
public static final String color_cell = "#f4f4f4";
@ -251,6 +253,13 @@ public class EditListController {
}
monacoEdit(flag);
}
if (newValue.getIndex() == 2) {
if (codemirror != null){
flag = true;
}
codemirror(flag);
}
}
});
}
@ -259,6 +268,7 @@ public class EditListController {
return switch (player){
case Ace_JS -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5));
case Monaco_JS -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5));
case CodeMirror_JS -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5));
};
}
@ -349,6 +359,19 @@ public class EditListController {
common_method();
}
private void codemirror(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(2);
if (!flag){
root = new CodeMirrWebView();
codemirror = root;
}else {
root = codemirror;
}
common_method();
}
private void common_method() {
splitPane.getItems().remove(1);
@ -618,4 +641,8 @@ public class EditListController {
}
monacoEdit(flag);
}
public void codemirror_js_menu_item(ActionEvent actionEvent) {
}
}

View File

@ -641,4 +641,8 @@ public class HomeController implements Serializable {
public void monaco_js_menu_item(ActionEvent actionEvent) {
js_edit_list(1);
}
public void codemirror_js_menu_item(ActionEvent actionEvent) {
js_edit_list(2);
}
}

View File

@ -0,0 +1,234 @@
package com.zhangmeng.tools.editors.codemirr;
import com.zhangmeng.tools.utils.AlertUtils;
import com.zhangmeng.tools.utils.ClipboardUtils;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import lombok.extern.slf4j.Slf4j;
import netscape.javascript.JSObject;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
/**
* @author zhangmeng
* @date 202310909:06:29
* @version 1.0
*
*/
@Slf4j
public class CodeMirrWebView extends AnchorPane {
public SimpleStringProperty text_code = new SimpleStringProperty("");
public void setText(String text){
log.info("text:" + text);
text_code.setValue(text);
}
private JSObject window;
public CodeMirrWebView() {
init();
}
private File file;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public WebView getView() {
return view;
}
public void setView(WebView view) {
this.view = view;
}
private WebView view = new WebView();
public void init() {
WebEngine engine = view.getEngine();
String url = this.getClass().getResource("/static/editors/code-mirror.html").toExternalForm();
engine.getLoadWorker().stateProperty().addListener(
(ObservableValue<? extends Worker.State> ov, Worker.State oldState, Worker.State newState) -> {
if (newState == Worker.State.SUCCEEDED) {
window = (JSObject) engine.executeScript("window");
window.setMember("text_code",text_code);
}
}
);
engine.load(url);
AnchorPane.setTopAnchor(view, 0.0);
AnchorPane.setBottomAnchor(view, 0.0);
AnchorPane.setLeftAnchor(view, 0.0);
AnchorPane.setRightAnchor(view, 0.0);
getChildren().add(view);
view.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
log.info("event.getCode:" + event.getCode());
if (event.isControlDown() && event.getCode() == KeyCode.C) {
event.consume();
JSObject editor = (JSObject) engine.executeScript("window");
//获取所选文本
String text= editor.call("getSelected").toString();
ClipboardUtils.setString(text);
}
if (event.isControlDown() && event.getCode() == KeyCode.X) {
event.consume();
JSObject editor = (JSObject) engine.executeScript("window");
//获取所选文本
String text= editor.call("getSelected").toString();
ClipboardUtils.setString(text);
//删除所选文本
editor.call("removeSelectText"); // 删除选中的内容
}
if (event.isControlDown() && event.getCode() == KeyCode.S) {//保存
event.consume();
if (file != null){
try {
FileWriter writer = new FileWriter(file);
writer.write(text_code.getValue());
writer.flush();
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}else {
//
}
AlertUtils.alert_warning("保存成功!");
}
if (event.isControlDown() && event.getCode() == KeyCode.DIVIDE) {//注释
event.consume();
window.call("commentLine");
}
if (event.isControlDown() && event.getCode() == KeyCode.O) {
event.consume();
//打开文件
Stage stage = new Stage();
FileChooser dc = new FileChooser();
dc.setTitle("文件选择");
dc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("文件类型", "*.java", "*.go", "*.txt", "*.json", "*.sql"));
File file = dc.showOpenDialog(stage);
String file_content = null;
try {
file_content = Files.readString(file.toPath(), StandardCharsets.UTF_8);
} catch (IOException e) {
try {
file_content = Files.readString(file.toPath(), Charset.forName("GBK"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
this.file = file;
JSObject editor = (JSObject) engine.executeScript("window");
editor.call("setValue",file_content);
}
});
}
public static String getText() {
return """
package com.zhangmeng.tools.editors.monaco;
import com.zhangmeng.tools.utils.AlertUtils;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
public class MonacoWebView extends AnchorPane {
\s
private File file;
private WebView view = new WebView();
public void init(){
\s
WebEngine engine = view.getEngine();
String url = this.getClass().getResource("/static/editors/index2.html").toExternalForm();
engine.load(url);
AnchorPane.setTopAnchor(view,0.0);
AnchorPane.setBottomAnchor(view,0.0);
AnchorPane.setLeftAnchor(view,0.0);
AnchorPane.setRightAnchor(view,0.0);
getChildren().add(view);
view.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
if (event.isControlDown() && event.getCode() == KeyCode.S){//保存
event.consume();
AlertUtils.alert_warning("保存成功!");
}
if (event.isControlDown() && event.getCode() == KeyCode.O){
event.consume();
//打开文件
Stage stage = new Stage();
FileChooser dc = new FileChooser();
dc.setTitle("文件选择");
dc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("文件类型", "*.java", "*.go", "*.txt", "*.json", "*.sql"));
File file = dc.showOpenDialog(stage);
String file_content = null;
try {
file_content = Files.readString(file.toPath(), StandardCharsets.UTF_8);
} catch (IOException e) {
try {
file_content = Files.readString(file.toPath(), Charset.forName("GBK"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
this.file = file;
engine.executeScript("setValue('" + getText() +"')");
}
});
}
\s
public static String getText(){
return ""\"
""\";
}
}
""";
}
}

View File

@ -363,6 +363,8 @@ public class ResourcesUtils {
Ace_JS("ace.js 编辑器", 0),
Monaco_JS("monaco.js 编辑器", 1),
CodeMirror_JS("codemirror.js 编辑器", 2),
;
EditorList(String title, int index) {

View File

@ -107,6 +107,7 @@
<items>
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
</items>
</Menu>
</menus>

View File

@ -107,6 +107,7 @@
<items>
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
</items>
</Menu>

View File

@ -105,7 +105,7 @@
<style type="text/css">
.CodeMirror {
height: auto;
height: 100%;
}
*{
font-family: consolas,"courier new",monospace;
@ -147,74 +147,73 @@ public class Class<T, V> implements MyInterface {
</textarea>
选择主题
<select onchange="selectTheme()" id=select>
<option selected="">default</option>
<option>3024-day</option>
<option>3024-night</option>
<option>abbott</option>
<option>abcdef</option>
<option>ambiance</option>
<option>ayu-dark</option>
<option>ayu-mirage</option>
<option>base16-dark</option>
<option>base16-light</option>
<option>bespin</option>
<option>blackboard</option>
<option>cobalt</option>
<option>colorforth</option>
<option>darcula</option>
<option>dracula</option>
<option>duotone-dark</option>
<option>duotone-light</option>
<option>eclipse</option>
<option>elegant</option>
<option>erlang-dark</option>
<option>gruvbox-dark</option>
<option>hopscotch</option>
<option>icecoder</option>
<option>idea</option>
<option>isotope</option>
<option>juejin</option>
<option>lesser-dark</option>
<option>liquibyte</option>
<option>lucario</option>
<option>material</option>
<option>material-darker</option>
<option>material-palenight</option>
<option>material-ocean</option>
<option>mbo</option>
<option>mdn-like</option>
<option>midnight</option>
<option>monokai</option>
<option>moxer</option>
<option>neat</option>
<option>neo</option>
<option>night</option>
<option>nord</option>
<option>oceanic-next</option>
<option>panda-syntax</option>
<option>paraiso-dark</option>
<option>paraiso-light</option>
<option>pastel-on-dark</option>
<option>railscasts</option>
<option>rubyblue</option>
<option>seti</option>
<option>shadowfox</option>
<option>solarized dark</option>
<option>solarized light</option>
<option>the-matrix</option>
<option>tomorrow-night-bright</option>
<option>tomorrow-night-eighties</option>
<option>ttcn</option>
<option>twilight</option>
<option>vibrant-ink</option>
<option>xq-dark</option>
<option>xq-light</option>
<option>yeti</option>
<option>yonce</option>
<option>zenburn</option>
</select>
<!--<select onchange="selectTheme()" id=select style="display: none">-->
<!-- <option selected="">default</option>-->
<!-- <option>3024-day</option>-->
<!-- <option>3024-night</option>-->
<!-- <option>abbott</option>-->
<!-- <option>abcdef</option>-->
<!-- <option>ambiance</option>-->
<!-- <option>ayu-dark</option>-->
<!-- <option>ayu-mirage</option>-->
<!-- <option>base16-dark</option>-->
<!-- <option>base16-light</option>-->
<!-- <option>bespin</option>-->
<!-- <option>blackboard</option>-->
<!-- <option>cobalt</option>-->
<!-- <option>colorforth</option>-->
<!-- <option>darcula</option>-->
<!-- <option>dracula</option>-->
<!-- <option>duotone-dark</option>-->
<!-- <option>duotone-light</option>-->
<!-- <option>eclipse</option>-->
<!-- <option>elegant</option>-->
<!-- <option>erlang-dark</option>-->
<!-- <option>gruvbox-dark</option>-->
<!-- <option>hopscotch</option>-->
<!-- <option>icecoder</option>-->
<!-- <option>idea</option>-->
<!-- <option>isotope</option>-->
<!-- <option>juejin</option>-->
<!-- <option>lesser-dark</option>-->
<!-- <option>liquibyte</option>-->
<!-- <option>lucario</option>-->
<!-- <option>material</option>-->
<!-- <option>material-darker</option>-->
<!-- <option>material-palenight</option>-->
<!-- <option>material-ocean</option>-->
<!-- <option>mbo</option>-->
<!-- <option>mdn-like</option>-->
<!-- <option>midnight</option>-->
<!-- <option>monokai</option>-->
<!-- <option>moxer</option>-->
<!-- <option>neat</option>-->
<!-- <option>neo</option>-->
<!-- <option>night</option>-->
<!-- <option>nord</option>-->
<!-- <option>oceanic-next</option>-->
<!-- <option>panda-syntax</option>-->
<!-- <option>paraiso-dark</option>-->
<!-- <option>paraiso-light</option>-->
<!-- <option>pastel-on-dark</option>-->
<!-- <option>railscasts</option>-->
<!-- <option>rubyblue</option>-->
<!-- <option>seti</option>-->
<!-- <option>shadowfox</option>-->
<!-- <option>solarized dark</option>-->
<!-- <option>solarized light</option>-->
<!-- <option>the-matrix</option>-->
<!-- <option>tomorrow-night-bright</option>-->
<!-- <option>tomorrow-night-eighties</option>-->
<!-- <option>ttcn</option>-->
<!-- <option>twilight</option>-->
<!-- <option>vibrant-ink</option>-->
<!-- <option>xq-dark</option>-->
<!-- <option>xq-light</option>-->
<!-- <option>yeti</option>-->
<!-- <option>yonce</option>-->
<!-- <option>zenburn</option>-->
<!--</select>-->
</body>
<script>