2023年10月9日10:19:52
parent
bc5629b251
commit
c078f31fd5
|
|
@ -1,6 +1,7 @@
|
||||||
package com.zhangmeng.tools.controller;
|
package com.zhangmeng.tools.controller;
|
||||||
|
|
||||||
import com.zhangmeng.tools.editors.ace.AceEditor;
|
import com.zhangmeng.tools.editors.ace.AceEditor;
|
||||||
|
import com.zhangmeng.tools.editors.codemirr.CodeMirrWebView;
|
||||||
import com.zhangmeng.tools.editors.monaco.*;
|
import com.zhangmeng.tools.editors.monaco.*;
|
||||||
import com.zhangmeng.tools.utils.AlertUtils;
|
import com.zhangmeng.tools.utils.AlertUtils;
|
||||||
import com.zhangmeng.tools.utils.ClipboardUtils;
|
import com.zhangmeng.tools.utils.ClipboardUtils;
|
||||||
|
|
@ -57,6 +58,7 @@ public class EditListController {
|
||||||
|
|
||||||
private AceEditor acJsEditor;
|
private AceEditor acJsEditor;
|
||||||
private AnchorPane monacoEdit;
|
private AnchorPane monacoEdit;
|
||||||
|
private AnchorPane codemirror;
|
||||||
|
|
||||||
public static final String color_cell = "#f4f4f4";
|
public static final String color_cell = "#f4f4f4";
|
||||||
|
|
||||||
|
|
@ -251,6 +253,13 @@ public class EditListController {
|
||||||
}
|
}
|
||||||
monacoEdit(flag);
|
monacoEdit(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newValue.getIndex() == 2) {
|
||||||
|
if (codemirror != null){
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
codemirror(flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -259,6 +268,7 @@ public class EditListController {
|
||||||
return switch (player){
|
return switch (player){
|
||||||
case Ace_JS -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5));
|
case Ace_JS -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5));
|
||||||
case Monaco_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();
|
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() {
|
private void common_method() {
|
||||||
splitPane.getItems().remove(1);
|
splitPane.getItems().remove(1);
|
||||||
|
|
@ -618,4 +641,8 @@ public class EditListController {
|
||||||
}
|
}
|
||||||
monacoEdit(flag);
|
monacoEdit(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void codemirror_js_menu_item(ActionEvent actionEvent) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -641,4 +641,8 @@ public class HomeController implements Serializable {
|
||||||
public void monaco_js_menu_item(ActionEvent actionEvent) {
|
public void monaco_js_menu_item(ActionEvent actionEvent) {
|
||||||
js_edit_list(1);
|
js_edit_list(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void codemirror_js_menu_item(ActionEvent actionEvent) {
|
||||||
|
js_edit_list(2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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 2023年10月9日09: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 ""\"
|
||||||
|
""\";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -363,6 +363,8 @@ public class ResourcesUtils {
|
||||||
|
|
||||||
Ace_JS("ace.js 编辑器", 0),
|
Ace_JS("ace.js 编辑器", 0),
|
||||||
Monaco_JS("monaco.js 编辑器", 1),
|
Monaco_JS("monaco.js 编辑器", 1),
|
||||||
|
CodeMirror_JS("codemirror.js 编辑器", 2),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
EditorList(String title, int index) {
|
EditorList(String title, int index) {
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
|
<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="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
|
||||||
|
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
</menus>
|
</menus>
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
|
<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="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
|
||||||
|
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@
|
||||||
|
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
.CodeMirror {
|
.CodeMirror {
|
||||||
height: auto;
|
height: 100%;
|
||||||
}
|
}
|
||||||
*{
|
*{
|
||||||
font-family: consolas,"courier new",monospace;
|
font-family: consolas,"courier new",monospace;
|
||||||
|
|
@ -147,74 +147,73 @@ public class Class<T, V> implements MyInterface {
|
||||||
|
|
||||||
</textarea>
|
</textarea>
|
||||||
|
|
||||||
选择主题
|
<!--<select onchange="selectTheme()" id=select style="display: none">-->
|
||||||
<select onchange="selectTheme()" id=select>
|
<!-- <option selected="">default</option>-->
|
||||||
<option selected="">default</option>
|
<!-- <option>3024-day</option>-->
|
||||||
<option>3024-day</option>
|
<!-- <option>3024-night</option>-->
|
||||||
<option>3024-night</option>
|
<!-- <option>abbott</option>-->
|
||||||
<option>abbott</option>
|
<!-- <option>abcdef</option>-->
|
||||||
<option>abcdef</option>
|
<!-- <option>ambiance</option>-->
|
||||||
<option>ambiance</option>
|
<!-- <option>ayu-dark</option>-->
|
||||||
<option>ayu-dark</option>
|
<!-- <option>ayu-mirage</option>-->
|
||||||
<option>ayu-mirage</option>
|
<!-- <option>base16-dark</option>-->
|
||||||
<option>base16-dark</option>
|
<!-- <option>base16-light</option>-->
|
||||||
<option>base16-light</option>
|
<!-- <option>bespin</option>-->
|
||||||
<option>bespin</option>
|
<!-- <option>blackboard</option>-->
|
||||||
<option>blackboard</option>
|
<!-- <option>cobalt</option>-->
|
||||||
<option>cobalt</option>
|
<!-- <option>colorforth</option>-->
|
||||||
<option>colorforth</option>
|
<!-- <option>darcula</option>-->
|
||||||
<option>darcula</option>
|
<!-- <option>dracula</option>-->
|
||||||
<option>dracula</option>
|
<!-- <option>duotone-dark</option>-->
|
||||||
<option>duotone-dark</option>
|
<!-- <option>duotone-light</option>-->
|
||||||
<option>duotone-light</option>
|
<!-- <option>eclipse</option>-->
|
||||||
<option>eclipse</option>
|
<!-- <option>elegant</option>-->
|
||||||
<option>elegant</option>
|
<!-- <option>erlang-dark</option>-->
|
||||||
<option>erlang-dark</option>
|
<!-- <option>gruvbox-dark</option>-->
|
||||||
<option>gruvbox-dark</option>
|
<!-- <option>hopscotch</option>-->
|
||||||
<option>hopscotch</option>
|
<!-- <option>icecoder</option>-->
|
||||||
<option>icecoder</option>
|
<!-- <option>idea</option>-->
|
||||||
<option>idea</option>
|
<!-- <option>isotope</option>-->
|
||||||
<option>isotope</option>
|
<!-- <option>juejin</option>-->
|
||||||
<option>juejin</option>
|
<!-- <option>lesser-dark</option>-->
|
||||||
<option>lesser-dark</option>
|
<!-- <option>liquibyte</option>-->
|
||||||
<option>liquibyte</option>
|
<!-- <option>lucario</option>-->
|
||||||
<option>lucario</option>
|
<!-- <option>material</option>-->
|
||||||
<option>material</option>
|
<!-- <option>material-darker</option>-->
|
||||||
<option>material-darker</option>
|
<!-- <option>material-palenight</option>-->
|
||||||
<option>material-palenight</option>
|
<!-- <option>material-ocean</option>-->
|
||||||
<option>material-ocean</option>
|
<!-- <option>mbo</option>-->
|
||||||
<option>mbo</option>
|
<!-- <option>mdn-like</option>-->
|
||||||
<option>mdn-like</option>
|
<!-- <option>midnight</option>-->
|
||||||
<option>midnight</option>
|
<!-- <option>monokai</option>-->
|
||||||
<option>monokai</option>
|
<!-- <option>moxer</option>-->
|
||||||
<option>moxer</option>
|
<!-- <option>neat</option>-->
|
||||||
<option>neat</option>
|
<!-- <option>neo</option>-->
|
||||||
<option>neo</option>
|
<!-- <option>night</option>-->
|
||||||
<option>night</option>
|
<!-- <option>nord</option>-->
|
||||||
<option>nord</option>
|
<!-- <option>oceanic-next</option>-->
|
||||||
<option>oceanic-next</option>
|
<!-- <option>panda-syntax</option>-->
|
||||||
<option>panda-syntax</option>
|
<!-- <option>paraiso-dark</option>-->
|
||||||
<option>paraiso-dark</option>
|
<!-- <option>paraiso-light</option>-->
|
||||||
<option>paraiso-light</option>
|
<!-- <option>pastel-on-dark</option>-->
|
||||||
<option>pastel-on-dark</option>
|
<!-- <option>railscasts</option>-->
|
||||||
<option>railscasts</option>
|
<!-- <option>rubyblue</option>-->
|
||||||
<option>rubyblue</option>
|
<!-- <option>seti</option>-->
|
||||||
<option>seti</option>
|
<!-- <option>shadowfox</option>-->
|
||||||
<option>shadowfox</option>
|
<!-- <option>solarized dark</option>-->
|
||||||
<option>solarized dark</option>
|
<!-- <option>solarized light</option>-->
|
||||||
<option>solarized light</option>
|
<!-- <option>the-matrix</option>-->
|
||||||
<option>the-matrix</option>
|
<!-- <option>tomorrow-night-bright</option>-->
|
||||||
<option>tomorrow-night-bright</option>
|
<!-- <option>tomorrow-night-eighties</option>-->
|
||||||
<option>tomorrow-night-eighties</option>
|
<!-- <option>ttcn</option>-->
|
||||||
<option>ttcn</option>
|
<!-- <option>twilight</option>-->
|
||||||
<option>twilight</option>
|
<!-- <option>vibrant-ink</option>-->
|
||||||
<option>vibrant-ink</option>
|
<!-- <option>xq-dark</option>-->
|
||||||
<option>xq-dark</option>
|
<!-- <option>xq-light</option>-->
|
||||||
<option>xq-light</option>
|
<!-- <option>yeti</option>-->
|
||||||
<option>yeti</option>
|
<!-- <option>yonce</option>-->
|
||||||
<option>yonce</option>
|
<!-- <option>zenburn</option>-->
|
||||||
<option>zenburn</option>
|
<!--</select>-->
|
||||||
</select>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
<script>
|
<script>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue