diff --git a/pom.xml b/pom.xml index 38e801a..5937b23 100644 --- a/pom.xml +++ b/pom.xml @@ -481,6 +481,11 @@ 2.21.0 + + com.fifesoft + rsyntaxtextarea + 3.3.4 + diff --git a/src/main/java/com/zhangmeng/tools/components/RxEditer.java b/src/main/java/com/zhangmeng/tools/components/RxEditer.java new file mode 100644 index 0000000..8f08d3e --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/components/RxEditer.java @@ -0,0 +1,65 @@ +package com.zhangmeng.tools.components; + +import javafx.beans.property.SimpleIntegerProperty; +import javafx.embed.swing.SwingNode; +import javafx.scene.layout.AnchorPane; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +import org.fife.ui.rsyntaxtextarea.SyntaxConstants; +import org.fife.ui.rtextarea.RTextScrollPane; + +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; + +public class RxEditer extends AnchorPane{ + private final SimpleIntegerProperty line = new SimpleIntegerProperty(); + private final SimpleIntegerProperty column = new SimpleIntegerProperty(); + + private final RSyntaxTextArea textArea = new RSyntaxTextArea(); + + public RSyntaxTextArea getTextArea(){ + return textArea; + } + + public void setText(String text){ + textArea.setText(text); + } + + public RxEditer(String style) { + SwingNode sn = new SwingNode(); + new Thread(()->{ + SwingUtilities.invokeLater(() -> { + textArea.setEditable(true);//编辑器 + if (style == null || style.equals("")) { + textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);//java + }else { + textArea.setSyntaxEditingStyle(style); + } + textArea.setCodeFoldingEnabled(true);//折叠代码 + textArea.addCaretListener(e -> { + JTextArea editArea = (JTextArea) e.getSource(); + int linenum = 1; + int columnnum = 1; + try { + int caretpos = editArea.getCaretPosition(); + linenum = editArea.getLineOfOffset(caretpos); + columnnum = caretpos - editArea.getLineStartOffset(linenum); + linenum += 1; + columnnum += 1; + } catch (Exception ex) { + ex.printStackTrace(); + } + line.setValue(linenum); + column.setValue(columnnum); + }); + RTextScrollPane sp = new RTextScrollPane(textArea); + sn.setContent(sp); + }); + }).start(); + getChildren().add(sn); + setTopAnchor(sn, 0.0); + setBottomAnchor(sn, 0.0); + setLeftAnchor(sn, 0.0); + setRightAnchor(sn, 0.0); + } +} diff --git a/src/main/java/com/zhangmeng/tools/controller/EditorListImplController.java b/src/main/java/com/zhangmeng/tools/controller/EditorListImplController.java index b53d9b4..4621190 100644 --- a/src/main/java/com/zhangmeng/tools/controller/EditorListImplController.java +++ b/src/main/java/com/zhangmeng/tools/controller/EditorListImplController.java @@ -2,6 +2,7 @@ package com.zhangmeng.tools.controller; import com.sun.javafx.PlatformUtil; import com.zhangmeng.tools.components.RecursiveFileList; +import com.zhangmeng.tools.components.RxEditer; import com.zhangmeng.tools.dto.FileTreeView; import com.zhangmeng.tools.editors.ace.AceEditor; import com.zhangmeng.tools.editors.ace.AceMode; @@ -12,6 +13,7 @@ import com.zhangmeng.tools.editors.timifx.TimiFxEditor; import com.zhangmeng.tools.utils.*; import javafx.application.Platform; import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -45,6 +47,7 @@ import net.imyeyu.timifx.service.RunAsync; import net.imyeyu.timijava.config.Config; import net.imyeyu.timijava.config.ConfigManager; import org.apache.commons.io.FilenameUtils; +import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fxmisc.flowless.VirtualizedScrollPane; import org.fxmisc.richtext.CodeArea; @@ -64,6 +67,8 @@ import static net.imyeyu.timifx.TimiFX.BORDER_EXLEFT; @Slf4j public class EditorListImplController { + private final SimpleIntegerProperty editer_index = new SimpleIntegerProperty(); + @FXML public MenuItem open_file; @@ -79,6 +84,15 @@ public class EditorListImplController { @FXML public MenuItem new_file; + public void swing_menu_item(ActionEvent actionEvent) { + editer_index.setValue(1); + boolean flag = false; + if (swingEditor != null) { + flag = true; + } + swingEditor(flag); + } + public enum Type { JAVA, HTML, GO, JS, CSS, SQL, XML, YML, MARKDOWN @@ -90,10 +104,13 @@ public class EditorListImplController { private AnchorPane root; private AceEditor acJsEditor; + private MonacoWebView monacoEdit; private CodeMirrWebView codemirror; private AnchorPane timiFx; + private AnchorPane swingEditor; + private SimpleObjectProperty choose_file = new SimpleObjectProperty<>(null); private SimpleObjectProperty choose_them = new SimpleObjectProperty<>(null); private final ObservableList filePaths_list = FXCollections.observableArrayList(); @@ -507,6 +524,19 @@ public class EditorListImplController { common_method(); } + + private void swingEditor(boolean flag) { + //默认选择第一个 + listView.getSelectionModel().select(1); + if (!flag) { + swingEditor = new RxEditer(null); + root = swingEditor; + } else { + root = acJsEditor; + } + common_method(); + } + private void monacoEdit(boolean flag) { //默认选择第一个 @@ -666,9 +696,16 @@ public class EditorListImplController { if (!tabPane.getTabs().contains(tab)) { if (remove_set.contains(tab)){ //重新加载内容 - AceEditor aceEditor = (AceEditor) tab.getContent(); - aceEditor.setAceText(read_content(file)); - tab.setContent(aceEditor); + if (editer_index.getValue() == 0){ + AceEditor aceEditor = (AceEditor) tab.getContent(); + aceEditor.setAceText(read_content(file)); + tab.setContent(aceEditor); + } + if (editer_index.getValue() == 1){ + RxEditer sw = (RxEditer) tab.getContent(); + sw.setText(read_content(file)); + tab.setContent(sw); + } } tabPane.getTabs().add(tab); @@ -725,23 +762,40 @@ public class EditorListImplController { remove_set.add(tab); } }); - AceMode mode = null; - switch (type) { - case JAVA -> mode = AceMode.JAVA; - case HTML -> mode = AceMode.HTML; - case XML -> mode = AceMode.XML; - case SQL -> mode = AceMode.SQL; - case MARKDOWN -> mode = AceMode.MARKDOWN; - } - //新建编辑器 - AceEditor editor = new AceEditor(choose_file.getValue(), mode, EditorListImplController.this.choose_them.get()); - WebView view = editor.getWebView(); - AnchorPane.setTopAnchor(view, 0.0); - AnchorPane.setBottomAnchor(view, 0.0); - AnchorPane.setLeftAnchor(view, 0.0); - AnchorPane.setRightAnchor(view, 0.0); - tab.setContent(editor); + //判断是哪个编辑器 + if (editer_index.getValue() == 0){ + AceMode mode = null; + switch (type) { + case JAVA -> mode = AceMode.JAVA; + case HTML -> mode = AceMode.HTML; + case XML -> mode = AceMode.XML; + case SQL -> mode = AceMode.SQL; + case MARKDOWN -> mode = AceMode.MARKDOWN; + } + //新建编辑器 + AceEditor editor = new AceEditor(choose_file.getValue(), mode, EditorListImplController.this.choose_them.get()); + WebView view = editor.getWebView(); + AnchorPane.setTopAnchor(view, 0.0); + AnchorPane.setBottomAnchor(view, 0.0); + AnchorPane.setLeftAnchor(view, 0.0); + AnchorPane.setRightAnchor(view, 0.0); + tab.setContent(editor); + } + if (editer_index.getValue() == 1){ + String style = null; + switch (type) { + case JAVA -> style = SyntaxConstants.SYNTAX_STYLE_JAVA; + case HTML -> style = SyntaxConstants.SYNTAX_STYLE_HTML; + case XML -> style = SyntaxConstants.SYNTAX_STYLE_XML; + case SQL -> style = SyntaxConstants.SYNTAX_STYLE_SQL; + case MARKDOWN -> style = SyntaxConstants.SYNTAX_STYLE_MARKDOWN; + } + RxEditer rx = new RxEditer(style); + rx.setText(file_content); + tab.setContent(rx); + } + tabPane.getTabs().add(tab); tabPane.getSelectionModel().select(tab); @@ -1016,7 +1070,7 @@ public class EditorListImplController { Stage stage = (Stage) splitPane.getScene().getWindow(); stage.setScene(scene); - ListView listView = (ListView) fx.lookup("#listView"); + ListView listView = (ListView) fx.lookup("#listView"); listView.getSelectionModel().select(index); } @@ -1067,6 +1121,7 @@ public class EditorListImplController { } public void ace_menu_item(ActionEvent actionEvent) { + editer_index.setValue(0); boolean flag = false; if (acJsEditor != null) { flag = true; diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java index 61a9aeb..19548bf 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java @@ -689,4 +689,9 @@ public class HomeController implements Serializable { public void mysql_to_struct_menu_item(ActionEvent actionEvent) { load_go_tools(1); } + + public void swing_menu_item(ActionEvent actionEvent) { + js_edit_list_impl(1); + } + } \ No newline at end of file diff --git a/src/main/resources/fxml/editor-list-impl.fxml b/src/main/resources/fxml/editor-list-impl.fxml index 0e87614..2b43228 100644 --- a/src/main/resources/fxml/editor-list-impl.fxml +++ b/src/main/resources/fxml/editor-list-impl.fxml @@ -115,7 +115,7 @@ - + diff --git a/src/main/resources/fxml/home.fxml b/src/main/resources/fxml/home.fxml index 0297878..e18b7fb 100644 --- a/src/main/resources/fxml/home.fxml +++ b/src/main/resources/fxml/home.fxml @@ -117,7 +117,7 @@ - +