diff --git a/pom.xml b/pom.xml
index c96c1f9..e1dcbd9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -406,7 +406,11 @@
bcprov-jdk16
1.46
-
+
+ org.fxmisc.richtext
+ richtextfx
+ 0.10.0
+
diff --git a/src/main/java/com/zhangmeng/tools/components/RecursiveFileList.java b/src/main/java/com/zhangmeng/tools/components/RecursiveFileList.java
new file mode 100644
index 0000000..5b6f4c2
--- /dev/null
+++ b/src/main/java/com/zhangmeng/tools/components/RecursiveFileList.java
@@ -0,0 +1,159 @@
+package com.zhangmeng.tools.components;
+
+/**
+ * @author : 芊芊墨客
+ * @version : 1.0
+ * @date : 2023-05-08 11:41
+ */
+
+import com.zaxxer.hikari.util.FastList;
+import javafx.application.Platform;
+import javafx.beans.property.SimpleIntegerProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.control.Label;
+import javafx.scene.control.TreeCell;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeView;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.HBox;
+import javafx.scene.text.Font;
+import javafx.scene.text.Text;
+import javafx.util.Callback;
+import org.apache.commons.io.FilenameUtils;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.util.*;
+
+public class RecursiveFileList extends TreeView {
+
+ private final SimpleObjectProperty index_file = new SimpleObjectProperty<>(null);
+
+ private final SimpleIntegerProperty text_size = new SimpleIntegerProperty(15);
+ private final SimpleIntegerProperty icon_size = new SimpleIntegerProperty(15);
+
+ public RecursiveFileList(File root) {
+ super(new TreeItem<>(root));
+ if (root != null){
+ new Thread(()->{
+ Platform.runLater(()->{
+ setRoot(getTreeItem(root));
+ });
+ }).start();
+ }else {
+ setRoot(null);
+ }
+ setShowRoot(true);
+ this.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
+ if (newValue.getValue().isFile()) {
+ index_file.setValue(newValue.getValue());
+ }
+ });
+ this.setCellFactory(new Callback, TreeCell>() {
+ @Override
+ public TreeCell call(TreeView param) {
+ return new TreeCell(){
+ @Override
+ protected void updateItem(File item, boolean empty) {
+ super.updateItem(item, empty);
+ if (!empty){
+ HBox hBox = new HBox(10);
+ ImageView iv = null;
+ if (this.getTreeItem().isExpanded()){
+ iv = new ImageView(new Image("image/向下.png"));
+ }else {
+ iv = new ImageView(new Image("image/向右.png"));
+ }
+ iv.setPreserveRatio(true);
+ iv.setFitWidth(icon_size.get());
+ this.setDisclosureNode(iv);
+
+ Label label = new Label(item.getName());
+ label.setFont(new Font(text_size.get()));
+
+ //判断是否是文件
+ boolean directory = item.isDirectory();
+ if (directory){
+ ImageView dir = new ImageView(new Image("image/dir.png"));
+ dir.setPreserveRatio(true);
+ dir.setFitWidth(icon_size.get());
+ hBox.getChildren().add(dir);
+ }else {
+ if (item.isFile()){
+ ImageView file = null;
+
+ String extension = FilenameUtils.getExtension(item.getName());
+ if (extension.equals("java")){
+ file = new ImageView(new Image("image/java.png"));
+ }
+ if (extension.equals("html")){
+ file = new ImageView(new Image("image/html.png"));
+ }
+ if (extension.equals("jar")){
+ file = new ImageView(new Image("image/jar.png"));
+ }
+ if (extension.equals("json")){
+ file = new ImageView(new Image("image/json.png"));
+ }
+
+ if (extension.equals("jpg")){
+ file = new ImageView(new Image("image/jpg.png"));
+ }
+
+ if (extension.equals("png")){
+ file = new ImageView(new Image("image/png.png"));
+ }
+
+ if (file != null){
+ file.setPreserveRatio(true);
+ file.setFitWidth(icon_size.get());
+ hBox.getChildren().add(file);
+ }
+ }
+ }
+
+ hBox.getChildren().add(label);
+ this.setGraphic(hBox);
+ }else {
+ this.setGraphic(null);
+ this.setDisclosureNode(null);
+ }
+ }
+ };
+ }
+ });
+ }
+
+ private TreeItem getTreeItem(File file) {
+ TreeItem item = new TreeItem<>();
+ item.setGraphic(new Text(file.getName()));
+ item.setValue(file);
+ if (file.isDirectory()) {
+ if (file.listFiles()!= null){
+ List fileList = new ArrayList<>();
+ File[] dirs = file.listFiles(File::isDirectory);
+ if (dirs != null){
+ Arrays.sort(dirs, Comparator.comparing(File::getName));
+ fileList.addAll(List.of(dirs));
+ }
+ File[] files = file.listFiles(File::isFile);
+ if (files != null){
+ Arrays.sort(files, Comparator.comparing(File::getName));
+ fileList.addAll(List.of(files));
+ }
+ for (File child : fileList) {
+ item.getChildren().add(getTreeItem(child));
+ }
+ }
+ }
+ return item;
+ }
+
+ public File getValue() {
+ if (index_file.getValue() == null) {
+ return null;
+ }
+ return index_file.getValue();
+ }
+}
diff --git a/src/main/java/com/zhangmeng/tools/controller/FileEditController.java b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java
new file mode 100644
index 0000000..3741a26
--- /dev/null
+++ b/src/main/java/com/zhangmeng/tools/controller/FileEditController.java
@@ -0,0 +1,179 @@
+package com.zhangmeng.tools.controller;
+
+import com.zhangmeng.tools.components.RecursiveFileList;
+import com.zhangmeng.tools.languages.ProcessJava;
+import com.zhangmeng.tools.utils.AlertUtils;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.SplitPane;
+import javafx.scene.image.Image;
+import javafx.stage.DirectoryChooser;
+import javafx.stage.FileChooser;
+import javafx.stage.Stage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.fxmisc.flowless.VirtualizedScrollPane;
+import org.fxmisc.richtext.CodeArea;
+import org.fxmisc.richtext.LineNumberFactory;
+import org.fxmisc.richtext.model.StyleSpans;
+import org.fxmisc.richtext.model.StyleSpansBuilder;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author : 芊芊墨客
+ * @version : 1.0
+ * @date : 2023-06-01 10:44
+ *
+ * 文本编辑器
+ */
+@Slf4j
+public class FileEditController {
+
+
+ public SplitPane splitPane;
+
+ private CodeArea codeArea;
+ private RecursiveFileList recursiveFileList = null;
+
+ @FXML
+ public void initialize() {
+ recursiveFileList = new RecursiveFileList(null);
+ codeArea = new CodeArea();
+ URL resource = this.getClass().getClassLoader().getResource("css/code.css");
+ codeArea.setParagraphGraphicFactory(LineNumberFactory.get(codeArea));
+ codeArea.textProperty().addListener((obs, oldText, newText) -> {
+ codeArea.setStyleSpans(0, computeHighlighting(newText));
+ });
+ codeArea.getStylesheets().add(resource.toExternalForm());
+ splitPane.getItems().add(0,recursiveFileList);
+ splitPane.getItems().add(1,new VirtualizedScrollPane<>(codeArea));
+ splitPane.setDividerPosition(0,0.20);
+ splitPane.setDividerPosition(1,0.80);
+ }
+
+ @FXML
+ public void open_file_dir(ActionEvent event) {
+ open_file_dir();
+ }
+
+ public void open_file(File file){
+ byte[] bytes = new byte[0];
+ try {
+ bytes = Files.readAllBytes(file.toPath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ String file_content = new String(bytes, StandardCharsets.UTF_8);
+ codeArea.clear();
+ codeArea.replaceText(0, 0, file_content);
+ }
+
+ public void open_file_dir(){
+
+ Stage stage = new Stage();
+ DirectoryChooser dc = new DirectoryChooser();
+ dc.setTitle("文件夹选择");
+ File file = dc.showDialog(stage);
+ if (file != null) {
+ if (file.isDirectory()){
+ splitPane.getItems().clear();
+ recursiveFileList = new RecursiveFileList(file) ;
+ recursiveFileList.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
+ if (newValue.getValue().isFile()) {
+ String extension = FilenameUtils.getExtension(newValue.getValue().getName());
+ boolean flag = true;
+
+ if (extension.equals("mp4")){
+ flag = false;
+ }
+
+ if (extension.equals("jpg")){
+ flag = false;
+ }
+
+ if (extension.equals("png")){
+ flag = false;
+ }
+
+ if (extension.equals("avi")){
+ flag = false;
+ }
+
+ if (extension.equals("zip")){
+ flag = false;
+ }
+
+ if (extension.equals("ico")){
+ flag = false;
+ }
+//
+// if (extension.equals("json")){
+// flag = true;
+// }
+//
+// if (extension.equals("go")){
+// flag = true;
+// }
+//
+// if (extension.equals("js")){
+// flag = true;
+// }
+//
+// if (extension.equals("css")){
+// flag = true;
+// }
+//
+// if (extension.equals(".xml")){
+// flag = true;
+// }
+ if (flag){
+ open_file(newValue.getValue());
+ }else {
+ AlertUtils.alert_warning("该文件不支持!");
+ }
+ }
+ });
+
+ splitPane.getItems().add(0,recursiveFileList);
+ splitPane.getItems().add(1,new VirtualizedScrollPane<>(codeArea));
+ splitPane.setDividerPosition(0,0.20);
+ splitPane.setDividerPosition(1,0.80);
+ }
+ }
+ }
+
+ public static StyleSpans> computeHighlighting(String text) {
+ Matcher matcher = ProcessJava.PATTERN.matcher(text);
+ int lastKwEnd = 0;
+ StyleSpansBuilder> spansBuilder = new StyleSpansBuilder<>();
+ while(matcher.find()) {
+ String styleClass =
+ matcher.group("KEYWORD") != null ? "keyword" :
+ matcher.group("PAREN") != null ? "paren" :
+ matcher.group("BRACE") != null ? "brace" :
+ matcher.group("BRACKET") != null ? "bracket" :
+ matcher.group("SEMICOLON") != null ? "semicolon" :
+ matcher.group("STRING") != null ? "string" :
+ matcher.group("COMMENT") != null ? "comment" :
+ matcher.group("ANNOTATION") != null ? "annotation" :
+ matcher.group("PARAMS") != null ? "parameter" :
+ null; /* never happens */
+ assert styleClass != null;
+ spansBuilder.add(Collections.emptyList(), matcher.start() - lastKwEnd);
+ spansBuilder.add(Collections.singleton(styleClass), matcher.end() - matcher.start());
+ lastKwEnd = matcher.end();
+ }
+ spansBuilder.add(Collections.emptyList(), text.length() - lastKwEnd);
+ return spansBuilder.create();
+ }
+
+}
diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java
index 8ed041a..33230ab 100644
--- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java
@@ -595,4 +595,7 @@ public class HomeController implements Serializable {
listView.getSelectionModel().select(index);
}
+ public void file_edit_menu_item(ActionEvent event) {
+ load_small_tools(16);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
index 6387832..2f58af4 100644
--- a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
+++ b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java
@@ -83,6 +83,7 @@ public class SmallToolsController {
private AnchorPane pdf_ocr;
private AnchorPane batch_update_file_name;
private AnchorPane capter_screen;
+ private AnchorPane file_edit;
@FXML
private ListView listView;
@@ -118,9 +119,9 @@ public class SmallToolsController {
}
@FXML
- public void cron_menu_item(){
+ public void cron_menu_item() {
boolean flag = false;
- if (cron != null){
+ if (cron != null) {
flag = true;
}
@@ -128,10 +129,10 @@ public class SmallToolsController {
}
@FXML
- public void unicode_menu_item(){
+ public void unicode_menu_item() {
boolean flag = false;
- if (unicode != null){
+ if (unicode != null) {
flag = true;
}
@@ -139,9 +140,9 @@ public class SmallToolsController {
}
@FXML
- public void jwt_menu_item(){
+ public void jwt_menu_item() {
boolean flag = false;
- if (jwt_web != null){
+ if (jwt_web != null) {
flag = true;
}
@@ -149,69 +150,69 @@ public class SmallToolsController {
}
@FXML
- public void hex_16_menu_item(){
+ public void hex_16_menu_item() {
boolean flag = false;
- if (hex_16 != null){
+ if (hex_16 != null) {
flag = true;
}
hex_16(flag);
}
@FXML
- public void color_choose_menu_item(){
+ public void color_choose_menu_item() {
boolean flag = false;
- if (color_choose != null){
+ if (color_choose != null) {
flag = true;
}
color_choose(flag);
}
@FXML
- public void qr_code_menu_item(){
+ public void qr_code_menu_item() {
boolean flag = false;
- if (qr_code != null){
+ if (qr_code != null) {
flag = true;
}
qr_code(flag);
}
@FXML
- public void date_query_menu_item(){
+ public void date_query_menu_item() {
boolean flag = false;
- if (date_query != null){
+ if (date_query != null) {
flag = true;
}
date_query(flag);
}
@FXML
- public void base_62_menu_item(){
+ public void base_62_menu_item() {
load_codec_tools(0);
}
@FXML
- public void base_64_menu_item(){
+ public void base_64_menu_item() {
load_codec_tools(1);
}
@FXML
- public void base_32_menu_item(){
+ public void base_32_menu_item() {
load_codec_tools(2);
}
@FXML
- public void sql_code_gen_menu_item(){
+ public void sql_code_gen_menu_item() {
load_mysql_tools(0);
}
@FXML
- public void netty_client_menu_item(){
+ public void netty_client_menu_item() {
load_network_tools(0);
}
- public void load_network_tools(int index){
+ public void load_network_tools(int index) {
AnchorPane fx = null;
try {
fx = FXMLLoader.load(ResourcesUtils.getResource("network-tools"));
@@ -228,7 +229,7 @@ public class SmallToolsController {
}
@FXML
- public void morse_coder_menu_item(){
+ public void morse_coder_menu_item() {
load_codec_tools(3);
}
@@ -409,11 +410,33 @@ public class SmallToolsController {
}
capter_screen(flag);
}
+
+ if (newValue.getIndex() == 16) {
+ if (file_edit != null) {
+ flag = true;
+ }
+ file_edit(flag);
+ }
}
});
}
+ private void file_edit(boolean flag) {
+ //默认选择第一个
+ listView.getSelectionModel().select(0);
+ if (!flag) {
+ try {
+ root = FXMLLoader.load(ResourcesUtils.getResource("file-edit"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ file_edit = root;
+ } else {
+ root = file_edit;
+ }
+ common_method();
+ }
public static Image getImage(ResourcesUtils.SmallTools SmallTools) {
@@ -429,11 +452,12 @@ public class SmallToolsController {
case TelePhone -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case JSONView -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
case Maven_Install_Jar -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
- case Word_ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
- case Bar_Code -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
- case Pdf_Ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
- case BatchUpdateFileName -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
- case Capter_Screent -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case Word_ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case Bar_Code -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case Pdf_Ocr -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case BatchUpdateFileName -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case Capter_Screent -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
+ case File_Edit -> new Image(ImagePath.path(ImagePath.ImagePathType.Qr_CODE));
};
}
@@ -496,7 +520,6 @@ public class SmallToolsController {
}
-
private void hex_16(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(0);
@@ -531,7 +554,7 @@ public class SmallToolsController {
common_method();
}
- public void jwt_web(boolean flag){
+ public void jwt_web(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(2);
@@ -548,7 +571,7 @@ public class SmallToolsController {
common_method();
}
- public void color_choose(boolean flag){
+ public void color_choose(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(3);
@@ -565,7 +588,7 @@ public class SmallToolsController {
common_method();
}
- public void qr_code(boolean flag){
+ public void qr_code(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(4);
@@ -582,7 +605,7 @@ public class SmallToolsController {
common_method();
}
- public void date_query(boolean flag){
+ public void date_query(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(4);
@@ -599,7 +622,7 @@ public class SmallToolsController {
common_method();
}
- public void cron(boolean flag){
+ public void cron(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(6);
@@ -616,7 +639,7 @@ public class SmallToolsController {
common_method();
}
- public void telephone(boolean flag){
+ public void telephone(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(8);
@@ -705,9 +728,9 @@ public class SmallToolsController {
}
@FXML
- public void batch_update_file_name_menu_item(){
+ public void batch_update_file_name_menu_item() {
boolean flag = false;
- if (batch_update_file_name != null){
+ if (batch_update_file_name != null) {
flag = true;
}
@@ -750,7 +773,7 @@ public class SmallToolsController {
common_method();
}
- public void capter_screen(boolean flag){
+ public void capter_screen(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(15);
@@ -799,13 +822,13 @@ public class SmallToolsController {
@FXML
public void mail_menu_item(ActionEvent event) {
boolean flag = false;
- if (mail != null){
+ if (mail != null) {
flag = true;
}
mail(flag);
}
- private void mail(boolean flag ){
+ private void mail(boolean flag) {
//默认选择第一个
listView.getSelectionModel().select(7);
@@ -837,7 +860,7 @@ public class SmallToolsController {
load_http_tools(2);
}
- public void load_http_tools(int index){
+ public void load_http_tools(int index) {
AnchorPane fx = null;
try {
fx = FXMLLoader.load(ResourcesUtils.getResource("http-tools"));
@@ -868,7 +891,7 @@ public class SmallToolsController {
load_server_tools(2);
}
- public void load_server_tools(int index){
+ public void load_server_tools(int index) {
AnchorPane fx = null;
try {
fx = FXMLLoader.load(ResourcesUtils.getResource("server-tools"));
@@ -883,35 +906,40 @@ public class SmallToolsController {
ListView listView = (ListView) fx.lookup("#listView");
listView.getSelectionModel().select(index);
}
+
@FXML
public void socket_server_menu_item(ActionEvent event) {
load_server_tools(3);
}
+
@FXML
public void telephone_menu_item(ActionEvent event) {
boolean flag = false;
- if (telephone != null){
+ if (telephone != null) {
flag = true;
}
telephone(flag);
}
+
@FXML
public void mybatis_plus_gen_menu_item(ActionEvent event) {
load_mysql_tools(1);
}
+
@FXML
public void JsonView_menu_item(ActionEvent event) {
- boolean flag =false;
- if (json_view != null){
+ boolean flag = false;
+ if (json_view != null) {
flag = true;
}
json_view(flag);
}
+
@FXML
public void maven_jar_install_menu_item(ActionEvent event) {
- boolean flag =false;
- if (maven_install_jar != null){
+ boolean flag = false;
+ if (maven_install_jar != null) {
flag = true;
}
maven_install_jar(flag);
@@ -919,16 +947,17 @@ public class SmallToolsController {
@FXML
public void word_ocr_menu_item(ActionEvent event) {
- boolean flag =false;
- if (word_ocr != null){
+ boolean flag = false;
+ if (word_ocr != null) {
flag = true;
}
word_ocr(flag);
}
+
@FXML
public void bar_code_menu_item(ActionEvent event) {
- boolean flag =false;
- if (bar_code != null){
+ boolean flag = false;
+ if (bar_code != null) {
flag = true;
}
bar_code(flag);
@@ -936,8 +965,8 @@ public class SmallToolsController {
@FXML
public void pdf_menu_item(ActionEvent event) {
- boolean flag =false;
- if (pdf_ocr != null){
+ boolean flag = false;
+ if (pdf_ocr != null) {
flag = true;
}
pdf_ocr(flag);
@@ -945,7 +974,7 @@ public class SmallToolsController {
public void capter_screen_menu_item(ActionEvent event) {
boolean flag = false;
- if (capter_screen != null){
+ if (capter_screen != null) {
flag = true;
}
capter_screen(flag);
diff --git a/src/main/java/com/zhangmeng/tools/languages/ProcessJava.java b/src/main/java/com/zhangmeng/tools/languages/ProcessJava.java
new file mode 100644
index 0000000..2b31356
--- /dev/null
+++ b/src/main/java/com/zhangmeng/tools/languages/ProcessJava.java
@@ -0,0 +1,127 @@
+package com.zhangmeng.tools.languages;
+
+import java.util.regex.Pattern;
+
+/**
+ * @author : 芊芊墨客
+ * @version : 1.0
+ * @date : 2023-06-01 11:01
+ */
+public class ProcessJava {
+
+ public static final String[] KEYWORDS = new String[] {
+ "abstract", "assert", "boolean", "break", "byte",
+ "case", "catch", "char", "class", "const",
+ "continue", "default", "do", "double", "else",
+ "enum", "extends", "final", "finally", "float",
+ "for", "if", "goto", "implements", "import",
+ "instanceof", "int", "interface", "long", "native",
+ "new", "package", "private", "protected", "public",
+ "return", "short", "static", "strictfp", "super",
+ "switch", "synchronized", "this", "throw", "throws",
+ "transient", "try", "void", "volatile", "while"
+ };
+
+ public static final String KEYWORD_PATTERN = "\\b(" + String.join("|", KEYWORDS) + ")\\b";
+ public static final String PAREN_PATTERN = "\\(|\\)";
+ public static final String BRACE_PATTERN = "\\{|\\}";
+ public static final String BRACKET_PATTERN = "\\[|\\]";
+ public static final String SEMICOLON_PATTERN = "\\;";
+ public static final String STRING_PATTERN = "\"([^\"\\\\]|\\\\.)*\"";
+ public static final String COMMENT_PATTERN = "//[^\n]*" + "|" + "/\\*(.|\\R)*?\\*/";
+ public static final String ANNOTATION_PATTERN = "@[a-zA-Z]+";
+ public static final String PARAMS_PATTERN = "\\\\b([a-zA-Z]+)\\\\s*=\\\\s*([a-zA-Z0-9]+)\\\\b";
+
+ public static final Pattern PATTERN = Pattern.compile(
+ "(?" + KEYWORD_PATTERN + ")"
+ + "|(?" + PAREN_PATTERN + ")"
+ + "|(?" + BRACE_PATTERN + ")"
+ + "|(?" + BRACKET_PATTERN + ")"
+ + "|(?" + SEMICOLON_PATTERN + ")"
+ + "|(?" + STRING_PATTERN + ")"
+ + "|(?" + COMMENT_PATTERN + ")"
+ + "|(?" + ANNOTATION_PATTERN + ")"
+ + "|(?" + PARAMS_PATTERN + ")"
+
+ );
+
+ public static String SAMPLE_CODE = "package com.dashidao.server.model;\n" +
+ "\n" +
+ "import java.util.Date;\n" +
+ "\n" +
+ "public class PosterGroupCouponCode extends BaseEntity {\n" +
+ "\n" +
+ "\tprivate Date addTime;\n" +
+ "\tprivate Boolean deleteStatus;\n" +
+ "\tprivate String groupCouponCode;\n" +
+ "\tprivate Integer groupCouponStatus;\n" +
+ "\tprivate Date writeOffTime;\n" +
+ "\tprivate Long orderFormId;\n" +
+ "\tprivate Long posterGoodsCartId;\n" +
+ "\tprivate Long tuiKuanShouHouId;\n" +
+ "\tprivate Long orderMealUserId;\n" +
+ "\tprivate String groupSkusJson;\n" +
+ "\n" +
+ "\tpublic Date getAddTime() {\n" +
+ "\t\treturn addTime;\n" +
+ "\t}\n" +
+ "\tpublic void setAddTime(Date addTime) {\n" +
+ "\t\tthis.addTime = addTime;\n" +
+ "\t}\n" +
+ "\tpublic Boolean getDeleteStatus() {\n" +
+ "\t\treturn deleteStatus;\n" +
+ "\t}\n" +
+ "\tpublic void setDeleteStatus(Boolean deleteStatus) {\n" +
+ "\t\tthis.deleteStatus = deleteStatus;\n" +
+ "\t}\n" +
+ "\tpublic String getGroupCouponCode() {\n" +
+ "\t\treturn groupCouponCode;\n" +
+ "\t}\n" +
+ "\tpublic void setGroupCouponCode(String groupCouponCode) {\n" +
+ "\t\tthis.groupCouponCode = groupCouponCode;\n" +
+ "\t}\n" +
+ "\tpublic Integer getGroupCouponStatus() {\n" +
+ "\t\treturn groupCouponStatus;\n" +
+ "\t}\n" +
+ "\tpublic void setGroupCouponStatus(Integer groupCouponStatus) {\n" +
+ "\t\tthis.groupCouponStatus = groupCouponStatus;\n" +
+ "\t}\n" +
+ "\tpublic Date getWriteOffTime() {\n" +
+ "\t\treturn writeOffTime;\n" +
+ "\t}\n" +
+ "\tpublic void setWriteOffTime(Date writeOffTime) {\n" +
+ "\t\tthis.writeOffTime = writeOffTime;\n" +
+ "\t}\n" +
+ "\tpublic Long getOrderFormId() {\n" +
+ "\t\treturn orderFormId;\n" +
+ "\t}\n" +
+ "\tpublic void setOrderFormId(Long orderFormId) {\n" +
+ "\t\tthis.orderFormId = orderFormId;\n" +
+ "\t}\n" +
+ "\tpublic Long getPosterGoodsCartId() {\n" +
+ "\t\treturn posterGoodsCartId;\n" +
+ "\t}\n" +
+ "\tpublic void setPosterGoodsCartId(Long posterGoodsCartId) {\n" +
+ "\t\tthis.posterGoodsCartId = posterGoodsCartId;\n" +
+ "\t}\n" +
+ "\tpublic Long getTuiKuanShouHouId() {\n" +
+ "\t\treturn tuiKuanShouHouId;\n" +
+ "\t}\n" +
+ "\tpublic void setTuiKuanShouHouId(Long tuiKuanShouHouId) {\n" +
+ "\t\tthis.tuiKuanShouHouId = tuiKuanShouHouId;\n" +
+ "\t}\n" +
+ "\tpublic Long getOrderMealUserId() {\n" +
+ "\t\treturn orderMealUserId;\n" +
+ "\t}\n" +
+ "\tpublic void setOrderMealUserId(Long orderMealUserId) {\n" +
+ "\t\tthis.orderMealUserId = orderMealUserId;\n" +
+ "\t}\n" +
+ "\tpublic String getGroupSkusJson() {\n" +
+ "\t\treturn groupSkusJson;\n" +
+ "\t}\n" +
+ "\tpublic void setGroupSkusJson(String groupSkusJson) {\n" +
+ "\t\tthis.groupSkusJson = groupSkusJson;\n" +
+ "\t}\n" +
+ "\n" +
+ "}\n";
+}
diff --git a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
index 4c856c0..70d38dd 100644
--- a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
+++ b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java
@@ -132,6 +132,7 @@ public class ResourcesUtils {
Pdf_Ocr("pdf识别", 13),
BatchUpdateFileName("批量修改文件名", 14),
Capter_Screent("截图", 15),
+ File_Edit("文件编辑器", 16),
;
SmallTools(String title, int index) {
diff --git a/src/main/resources/css/code.css b/src/main/resources/css/code.css
new file mode 100644
index 0000000..9379b12
--- /dev/null
+++ b/src/main/resources/css/code.css
@@ -0,0 +1,187 @@
+/*- CodeArea的根节点样式*/
+.code-area {
+ -fx-font-family: "Consolas";
+ -fx-font-size: 16px;
+ -fx-text-fill: #1d171e;
+ -fx-background-color: #ffffff;
+}
+
+/** - 行号的样式*/
+.code-area .line-number {
+ -fx-background-color: #f4f4f4;
+ -fx-text-fill: #999999;
+ -fx-fill: #f4f;
+ -fx-font-size: 18px;
+ -fx-padding: 5 5 5 5px
+}
+
+/*- 光标的样式*/
+.code-area .caret {
+
+}
+
+.code-area .selection {
+ -fx-fill: #cbcacb;
+}
+
+/*-*/
+/*选中文本的样式*/
+.code-area .highlight {
+
+}
+
+/*-*/
+/*高亮文本的样式*/
+.code-area .folded {
+
+}
+
+/*-*/
+/*折叠代码的样式*/
+.code-area .folded-indicator {
+
+}
+
+/*-*/
+/*折叠代码指示器的样式*/
+.code-area .folded-indicator:hover {
+
+}
+
+/*-*/
+/*折叠代码指示器的鼠标悬停样式*/
+.code-area .error {
+
+}
+
+/*-*/
+/*错误文本的样式*/
+.code-area .warning {
+
+}
+
+/*-*/
+/*警告文本的样式*/
+.code-area .info {
+
+}
+
+/*-*/
+/*信息文本的样式*/
+.code-area .keyword {
+ -fx-fill: #10ADEBFF
+}
+
+/*-*/
+/*关键字的样式*/
+.code-area .operator {
+ -fx-fill: #d12746;
+}
+
+/*-*/
+/*运算符的样式*/
+.code-area .number {
+ -fx-fill: #27c5d1;
+}
+
+/*-*/
+/*数字的样式*/
+.code-area .string {
+
+}
+
+/*-*/
+/*字符串的样式*/
+.code-area .comment {
+ -fx-fill: #cbcacb;
+}
+
+/*-*/
+/*注释的样式*/
+.code-area .type {
+ -fx-fill: red;
+ -fx-text-fill: #ffff55;
+}
+
+/*-*/
+/*类型的样式*/
+.code-area .function {
+ -fx-fill: red;
+ -fx-text-fill: #ffff55;
+}
+
+/*-*/
+/*函数的样式*/
+.code-area .parameter {
+ -fx-fill: #d56b6b;
+}
+
+/*-*/
+/*参数的样式*/
+.code-area .annotation {
+ -fx-fill: #eeee07;
+}
+
+/*-*/
+/*注解的样式*/
+.code-area .class {
+ -fx-fill: red;
+ -fx-text-fill: red;
+}
+
+/*-*/
+/*类的样式*/
+.code-area .interface {
+ -fx-fill: red;
+ -fx-text-fill: red;
+}
+
+/*-*/
+/*接口的样式*/
+.code-area .enum {
+
+}
+
+/*-*/
+/*枚举的样式*/
+.code-area .field {
+
+}
+
+/*-*/
+/*字段的样式*/
+.code-area .method {
+ -fx-fill: red;
+ -fx-text-fill: red;
+}
+
+/*-*/
+/*方法的样式*/
+.code-area .constructor {
+
+}
+
+/*-*/
+/*构造函数的样式*/
+.code-area .static {
+
+}
+
+/*-*/
+/*静态的样式*/
+.code-area .final {
+
+}
+
+/*-*/
+/*最终的样式*/
+.code-area .abstract {
+ -fx-fill: red;
+
+}
+
+/*-*/
+/*抽象的样式*/
+.code-area .deprecated {
+ -fx-fill: #d12746;
+}
diff --git a/src/main/resources/fxml/file-edit.fxml b/src/main/resources/fxml/file-edit.fxml
new file mode 100644
index 0000000..2367e7a
--- /dev/null
+++ b/src/main/resources/fxml/file-edit.fxml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/home.fxml b/src/main/resources/fxml/home.fxml
index 61dfe56..2afb18e 100644
--- a/src/main/resources/fxml/home.fxml
+++ b/src/main/resources/fxml/home.fxml
@@ -49,6 +49,7 @@
+
diff --git a/src/main/resources/image/dir.png b/src/main/resources/image/dir.png
new file mode 100644
index 0000000..15c29b7
Binary files /dev/null and b/src/main/resources/image/dir.png differ
diff --git a/src/main/resources/image/html.png b/src/main/resources/image/html.png
new file mode 100644
index 0000000..56d9f1e
Binary files /dev/null and b/src/main/resources/image/html.png differ
diff --git a/src/main/resources/image/jar.png b/src/main/resources/image/jar.png
new file mode 100644
index 0000000..1d7cfed
Binary files /dev/null and b/src/main/resources/image/jar.png differ
diff --git a/src/main/resources/image/java.png b/src/main/resources/image/java.png
new file mode 100644
index 0000000..4dc7435
Binary files /dev/null and b/src/main/resources/image/java.png differ
diff --git a/src/main/resources/image/jpg.png b/src/main/resources/image/jpg.png
new file mode 100644
index 0000000..960aefd
Binary files /dev/null and b/src/main/resources/image/jpg.png differ
diff --git a/src/main/resources/image/json.png b/src/main/resources/image/json.png
new file mode 100644
index 0000000..6903b6c
Binary files /dev/null and b/src/main/resources/image/json.png differ
diff --git a/src/main/resources/image/png.png b/src/main/resources/image/png.png
new file mode 100644
index 0000000..75daa7c
Binary files /dev/null and b/src/main/resources/image/png.png differ
diff --git a/src/main/resources/image/向下.png b/src/main/resources/image/向下.png
new file mode 100644
index 0000000..bce1d60
Binary files /dev/null and b/src/main/resources/image/向下.png differ
diff --git a/src/main/resources/image/向右.png b/src/main/resources/image/向右.png
new file mode 100644
index 0000000..5d3f6e6
Binary files /dev/null and b/src/main/resources/image/向右.png differ