2023年10月9日10:19:52
parent
bc5629b251
commit
c078f31fd5
|
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
Monaco_JS("monaco.js 编辑器", 1),
|
||||
CodeMirror_JS("codemirror.js 编辑器", 2),
|
||||
|
||||
;
|
||||
|
||||
EditorList(String title, int index) {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue