2023年10月10日14:51:17
parent
ec9eace48c
commit
e41bf5ffc7
|
|
@ -0,0 +1,23 @@
|
||||||
|
#
|
||||||
|
# TimiFXExamples 配置文件,不建议手动修改,可能会导致程序异常或崩溃
|
||||||
|
#
|
||||||
|
|
||||||
|
[Main]
|
||||||
|
|
||||||
|
# 语言
|
||||||
|
Lang=zh_CN
|
||||||
|
|
||||||
|
# 窗体宽度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 1300
|
||||||
|
Width=1300
|
||||||
|
|
||||||
|
# 窗体高度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 850
|
||||||
|
Height=850
|
||||||
|
|
||||||
|
# 编辑器主题
|
||||||
|
AceJsThem=kr_theme
|
||||||
|
|
||||||
|
|
||||||
|
[Interpolator]
|
||||||
|
|
||||||
|
# 动画插值器持续时间
|
||||||
|
Duration=1000
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package com.zhangmeng.tools.controller;
|
package com.zhangmeng.tools.controller;
|
||||||
|
|
||||||
|
import com.sun.javafx.PlatformUtil;
|
||||||
|
import com.zhangmeng.tools.components.RecursiveFileList;
|
||||||
import com.zhangmeng.tools.dto.FileTreeView;
|
import com.zhangmeng.tools.dto.FileTreeView;
|
||||||
import com.zhangmeng.tools.editors.ace.AceEditor;
|
import com.zhangmeng.tools.editors.ace.AceEditor;
|
||||||
import com.zhangmeng.tools.editors.ace.AceMode;
|
import com.zhangmeng.tools.editors.ace.AceMode;
|
||||||
|
|
@ -12,6 +14,7 @@ import com.zhangmeng.tools.utils.ImagePath;
|
||||||
import com.zhangmeng.tools.utils.ResourcesUtils;
|
import com.zhangmeng.tools.utils.ResourcesUtils;
|
||||||
import eu.mihosoft.monacofx.Editor;
|
import eu.mihosoft.monacofx.Editor;
|
||||||
import eu.mihosoft.monacofx.MonacoFX;
|
import eu.mihosoft.monacofx.MonacoFX;
|
||||||
|
import javafx.application.Platform;
|
||||||
import javafx.beans.property.SimpleDoubleProperty;
|
import javafx.beans.property.SimpleDoubleProperty;
|
||||||
import javafx.beans.property.SimpleObjectProperty;
|
import javafx.beans.property.SimpleObjectProperty;
|
||||||
import javafx.beans.value.ChangeListener;
|
import javafx.beans.value.ChangeListener;
|
||||||
|
|
@ -19,27 +22,29 @@ import javafx.beans.value.ObservableValue;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
|
import javafx.event.Event;
|
||||||
|
import javafx.event.EventHandler;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.Parent;
|
||||||
import javafx.scene.Scene;
|
import javafx.scene.Scene;
|
||||||
import javafx.scene.control.*;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.image.Image;
|
import javafx.scene.image.Image;
|
||||||
import javafx.scene.image.ImageView;
|
import javafx.scene.image.ImageView;
|
||||||
import javafx.scene.input.KeyCode;
|
import javafx.scene.input.*;
|
||||||
import javafx.scene.input.KeyEvent;
|
|
||||||
import javafx.scene.input.MouseButton;
|
|
||||||
import javafx.scene.input.MouseEvent;
|
|
||||||
import javafx.scene.layout.AnchorPane;
|
import javafx.scene.layout.AnchorPane;
|
||||||
import javafx.scene.layout.HBox;
|
import javafx.scene.layout.HBox;
|
||||||
import javafx.scene.paint.Paint;
|
import javafx.scene.paint.Paint;
|
||||||
import javafx.scene.text.Font;
|
import javafx.scene.text.Font;
|
||||||
import javafx.scene.web.WebEngine;
|
import javafx.scene.web.WebEngine;
|
||||||
import javafx.scene.web.WebView;
|
import javafx.scene.web.WebView;
|
||||||
|
import javafx.stage.DirectoryChooser;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.imyeyu.timifx.service.RunAsync;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.fxmisc.flowless.VirtualizedScrollPane;
|
import org.fxmisc.flowless.VirtualizedScrollPane;
|
||||||
import org.fxmisc.richtext.CodeArea;
|
import org.fxmisc.richtext.CodeArea;
|
||||||
|
|
@ -53,25 +58,29 @@ import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static net.imyeyu.timifx.TimiFX.BORDER_EXLEFT;
|
import static net.imyeyu.timifx.TimiFX.BORDER_EXLEFT;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class EditorListImplController {
|
public class EditorListImplController {
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public MenuItem open_file;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public MenuItem open_dir;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
public MenuItem save;
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
|
|
||||||
JAVA,
|
JAVA, HTML, GO, JS, CSS, SQL, XML, YML, MARKDOWN
|
||||||
HTML,
|
|
||||||
GO,
|
|
||||||
JS,
|
|
||||||
CSS,
|
|
||||||
SQL,
|
|
||||||
XML,
|
|
||||||
YML,
|
|
||||||
MARKDOWN
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private TabPane tabPane = null;
|
||||||
private SimpleDoubleProperty width = new SimpleDoubleProperty(0.0);
|
private SimpleDoubleProperty width = new SimpleDoubleProperty(0.0);
|
||||||
private SimpleDoubleProperty height = new SimpleDoubleProperty(0.0);
|
private SimpleDoubleProperty height = new SimpleDoubleProperty(0.0);
|
||||||
private AnchorPane root;
|
private AnchorPane root;
|
||||||
|
|
@ -82,7 +91,7 @@ public class EditorListImplController {
|
||||||
private AnchorPane timiFx;
|
private AnchorPane timiFx;
|
||||||
|
|
||||||
private SimpleObjectProperty<File> choose_file = new SimpleObjectProperty<>(null);
|
private SimpleObjectProperty<File> choose_file = new SimpleObjectProperty<>(null);
|
||||||
|
private final ObservableList<Path> filePaths_list = FXCollections.observableArrayList();
|
||||||
public static final String color_cell = "#f4f4f4";
|
public static final String color_cell = "#f4f4f4";
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
|
|
@ -91,6 +100,8 @@ public class EditorListImplController {
|
||||||
@FXML
|
@FXML
|
||||||
private SplitPane splitPane;
|
private SplitPane splitPane;
|
||||||
|
|
||||||
|
private static final Map<Path, Tab> map = new HashMap<>();
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
public void date_query_menu_item() {
|
public void date_query_menu_item() {
|
||||||
load_small_tools(5);
|
load_small_tools(5);
|
||||||
|
|
@ -354,8 +365,61 @@ public class EditorListImplController {
|
||||||
return listCell;
|
return listCell;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
tabPane = new TabPane();
|
||||||
|
//添加菜单
|
||||||
|
addMenu();
|
||||||
|
File file = null;
|
||||||
|
FileTreeView fileTreeView = new FileTreeView(file);
|
||||||
|
fileTreeView.setBorder(BORDER_EXLEFT);
|
||||||
|
fileTreeView.setFixedCellSize(40);
|
||||||
|
splitPane.getItems().clear();
|
||||||
|
splitPane.getItems().add(0, fileTreeView);
|
||||||
|
splitPane.getItems().add(1, tabPane);
|
||||||
|
splitPane.setDividerPosition(0, 0.20);
|
||||||
|
splitPane.setDividerPosition(1, 0.80);
|
||||||
|
}
|
||||||
|
|
||||||
acJsEditor(false);
|
public void addMenu() {
|
||||||
|
|
||||||
|
// 设置快捷键
|
||||||
|
save.setAccelerator(new KeyCodeCombination(KeyCode.S, KeyCodeCombination.CONTROL_DOWN));
|
||||||
|
save.setOnAction(event -> writer_file());
|
||||||
|
|
||||||
|
open_file.setAccelerator(new KeyCodeCombination(KeyCode.F, KeyCodeCombination.CONTROL_DOWN));
|
||||||
|
open_file.setOnAction(event -> open_file());
|
||||||
|
|
||||||
|
open_dir.setAccelerator(new KeyCodeCombination(KeyCode.D, KeyCodeCombination.CONTROL_DOWN));
|
||||||
|
open_dir.setOnAction(event -> open_file_dir());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void open_file() {
|
||||||
|
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);
|
||||||
|
if (file != null) {
|
||||||
|
refresh(file, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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()) {
|
||||||
|
refresh(file, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refresh(File file, int type) {
|
||||||
|
file_checked(file, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void acJsEditor(boolean flag) {
|
private void acJsEditor(boolean flag) {
|
||||||
|
|
@ -439,7 +503,7 @@ public class EditorListImplController {
|
||||||
AlertUtils.alert_warning("tab " + choose_file.get().getName() + "保存成功!");
|
AlertUtils.alert_warning("tab " + choose_file.get().getName() + "保存成功!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void file_checked(File file) {
|
public void file_checked(File file, int open_type) {
|
||||||
String extension = FilenameUtils.getExtension(file.getName());
|
String extension = FilenameUtils.getExtension(file.getName());
|
||||||
boolean flag = true;
|
boolean flag = true;
|
||||||
|
|
||||||
|
|
@ -492,19 +556,44 @@ public class EditorListImplController {
|
||||||
if (extension.equals("yml")) {
|
if (extension.equals("yml")) {
|
||||||
type = Type.YML;
|
type = Type.YML;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (extension.equals("md")) {
|
||||||
|
type = Type.MARKDOWN;
|
||||||
|
}
|
||||||
|
|
||||||
if (type == null) {
|
if (type == null) {
|
||||||
type = Type.JAVA;
|
type = Type.JAVA;
|
||||||
}
|
}
|
||||||
if (type == null) {
|
|
||||||
type = Type.MARKDOWN;
|
open_file(file, type, open_type);
|
||||||
}
|
|
||||||
open_file(file, type);
|
|
||||||
} else {
|
} else {
|
||||||
AlertUtils.alert_warning("该文件不支持!");
|
AlertUtils.alert_warning("该文件不支持!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void open_file(File file, Type type) {
|
public void open_file(File file, Type type, int open_type) {
|
||||||
|
|
||||||
|
//打开文件
|
||||||
|
//打开文件夹
|
||||||
|
choose_file.setValue(file);
|
||||||
|
|
||||||
|
if (open_type == 1) {
|
||||||
|
common_method();
|
||||||
|
}
|
||||||
|
|
||||||
|
Path path = file.toPath();
|
||||||
|
if (filePaths_list.contains(path)) {//size -1 ,szie -2
|
||||||
|
//切换到一打开的tab
|
||||||
|
Tab tab = map.get(path);
|
||||||
|
if (!tabPane.getTabs().contains(tab)) {
|
||||||
|
tabPane.getTabs().add(tab);
|
||||||
|
}
|
||||||
|
tabPane.getSelectionModel().select(tab);
|
||||||
|
} else {
|
||||||
|
if (choose_file.get().isFile()) {
|
||||||
|
|
||||||
|
//异步加载
|
||||||
|
RunAsync.runback(() -> {
|
||||||
|
|
||||||
String file_content = null;
|
String file_content = null;
|
||||||
try {
|
try {
|
||||||
|
|
@ -516,39 +605,90 @@ public class EditorListImplController {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return file_content;
|
||||||
|
}, file_content -> {
|
||||||
|
|
||||||
int index = listView.getSelectionModel().getSelectedIndex();
|
Tab tab = new Tab(file.getName());
|
||||||
|
|
||||||
switch (index) {
|
ContextMenu contextMenu = new ContextMenu();
|
||||||
case 0 -> {
|
MenuItem close = new MenuItem("close");
|
||||||
|
MenuItem close_other_tabs = new MenuItem("close other tabs");
|
||||||
|
MenuItem close_all = new MenuItem("close all");
|
||||||
|
close_all.setOnAction(event -> {
|
||||||
|
tabPane.getTabs().clear();
|
||||||
|
});
|
||||||
|
close_other_tabs.setOnAction(event -> {
|
||||||
|
ObservableList<Tab> tabs = tabPane.getTabs();
|
||||||
|
ObservableList<Tab> list = FXCollections.observableArrayList(tabs);
|
||||||
|
//关闭其他
|
||||||
|
for (Tab tabPaneTab : list) {
|
||||||
|
if (tabPaneTab != tabPane.getSelectionModel().getSelectedItem()) {
|
||||||
|
tabs.remove(tabPaneTab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
close.setOnAction(event -> {
|
||||||
|
//关闭当前窗口
|
||||||
|
Tab selectedItem = tabPane.getSelectionModel().getSelectedItem();
|
||||||
|
tabPane.getTabs().remove(selectedItem);
|
||||||
|
});
|
||||||
|
contextMenu.getItems().add(close);
|
||||||
|
contextMenu.getItems().add(close_other_tabs);
|
||||||
|
contextMenu.getItems().add(close_all);
|
||||||
|
|
||||||
|
|
||||||
|
tab.setContextMenu(contextMenu);
|
||||||
|
tab.setOnCloseRequest(new EventHandler<Event>() {
|
||||||
|
@Override
|
||||||
|
public void handle(Event event) {
|
||||||
|
// log.info("tabtab.setOnCloseRequest:--->" + tab.getText());
|
||||||
|
tabPane.getTabs().remove(tab);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AceMode mode = null;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case JAVA -> acJsEditor.setAceMode(AceMode.JAVA);
|
case JAVA -> mode = AceMode.JAVA;
|
||||||
case HTML -> acJsEditor.setAceMode(AceMode.HTML);
|
case HTML -> mode = AceMode.HTML;
|
||||||
case XML -> acJsEditor.setAceMode(AceMode.XML);
|
case XML -> mode = AceMode.XML;
|
||||||
case SQL -> acJsEditor.setAceMode(AceMode.SQL);
|
case SQL -> mode = AceMode.SQL;
|
||||||
case MARKDOWN -> acJsEditor.setAceMode(AceMode.MARKDOWN);
|
case MARKDOWN -> mode = AceMode.MARKDOWN;
|
||||||
}
|
}
|
||||||
|
//新建编辑器
|
||||||
|
AceEditor editor = new AceEditor(choose_file.getValue(),mode,null);
|
||||||
|
WebView view = editor.getWebView();
|
||||||
|
AnchorPane.setTopAnchor(view, 0.0);
|
||||||
|
AnchorPane.setBottomAnchor(view, 0.0);
|
||||||
|
AnchorPane.setLeftAnchor(view, 0.0);
|
||||||
|
AnchorPane.setRightAnchor(view, 0.0);
|
||||||
|
|
||||||
acJsEditor.setAceText(file_content);
|
tab.setContent(editor);
|
||||||
|
tabPane.getTabs().add(tab);
|
||||||
|
tabPane.getSelectionModel().select(tab);
|
||||||
|
|
||||||
|
filePaths_list.add(path);
|
||||||
|
map.put(path, tab);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
case 1 -> monacoEdit.setText(file_content);
|
|
||||||
case 2 -> codemirror.setText(file_content);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* File file = new File("D:\\generate");
|
||||||
|
*/
|
||||||
private void common_method() {
|
private void common_method() {
|
||||||
//splitPane.getItems().remove(1);
|
//splitPane.getItems().remove(1);
|
||||||
|
File file = choose_file.get();
|
||||||
|
|
||||||
|
//添加菜单
|
||||||
splitPane.getItems().clear();
|
splitPane.getItems().clear();
|
||||||
//添加文件选择
|
|
||||||
File file = new File("D:\\generate");
|
|
||||||
|
|
||||||
|
//添加文件选择
|
||||||
FileTreeView fileTreeView = new FileTreeView(file);
|
FileTreeView fileTreeView = new FileTreeView(file);
|
||||||
fileTreeView.setBorder(BORDER_EXLEFT);
|
fileTreeView.setBorder(BORDER_EXLEFT);
|
||||||
|
fileTreeView.setFixedCellSize(40);
|
||||||
//fileTreeView.addItemFilter(file -> file.isDirectory() || file.getName().endsWith(".txt"));
|
//fileTreeView.addItemFilter(file -> file.isDirectory() || file.getName().endsWith(".txt"));
|
||||||
splitPane.getItems().add(0, fileTreeView);
|
splitPane.getItems().add(0, fileTreeView);
|
||||||
splitPane.getItems().add(1, root);
|
splitPane.getItems().add(1, tabPane);
|
||||||
splitPane.setDividerPosition(0, 0.2);
|
splitPane.setDividerPosition(0, 0.2);
|
||||||
splitPane.setDividerPosition(1, 0.8);
|
splitPane.setDividerPosition(1, 0.8);
|
||||||
|
|
||||||
|
|
@ -571,34 +711,36 @@ public class EditorListImplController {
|
||||||
if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
|
if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
|
||||||
// 双击左键的操作
|
// 双击左键的操作
|
||||||
log.info("open file:" + choose_file.get().getName());
|
log.info("open file:" + choose_file.get().getName());
|
||||||
file_checked(choose_file.get());
|
if (choose_file.getValue() != null) {
|
||||||
|
file_checked(choose_file.get(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
root.widthProperty().addListener((observable, oldValue, newValue) -> {
|
// root.widthProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
if (newValue != null) {
|
// if (newValue != null) {
|
||||||
double width = splitPane.getWidth();
|
// double width = splitPane.getWidth();
|
||||||
EditorListImplController.this.width.set(width);
|
// EditorListImplController.this.width.set(width);
|
||||||
log.info("home:--->width:{}", width);
|
// log.info("home:--->width:{}", width);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
root.heightProperty().addListener((observable, oldValue, newValue) -> {
|
// root.heightProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
if (newValue != null) {
|
// if (newValue != null) {
|
||||||
double height = splitPane.getHeight();
|
// double height = splitPane.getHeight();
|
||||||
EditorListImplController.this.height.set(height);
|
// EditorListImplController.this.height.set(height);
|
||||||
log.info("home:--->height:{}", height);
|
// log.info("home:--->height:{}", height);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
this.width.addListener((observable, oldValue, newValue) -> {
|
// this.width.addListener((observable, oldValue, newValue) -> {
|
||||||
EditorListImplController.this.root.setPrefWidth(newValue.doubleValue() - listView.getWidth());
|
// EditorListImplController.this.root.setPrefWidth(newValue.doubleValue() - listView.getWidth());
|
||||||
log.info("root:=====================>width:" + (newValue.doubleValue() - listView.getWidth()));
|
// log.info("root:=====================>width:" + (newValue.doubleValue() - listView.getWidth()));
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
this.height.addListener((observable, oldValue, newValue) -> {
|
// this.height.addListener((observable, oldValue, newValue) -> {
|
||||||
EditorListImplController.this.root.setPrefHeight(newValue.doubleValue() - listView.getHeight());
|
// EditorListImplController.this.root.setPrefHeight(newValue.doubleValue() - listView.getHeight());
|
||||||
log.info("root:=====================>:height" + (newValue.doubleValue() - listView.getWidth()));
|
// log.info("root:=====================>:height" + (newValue.doubleValue() - listView.getWidth()));
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
|
|
|
||||||
|
|
@ -105,10 +105,10 @@ public class FileTreeView extends XTreeView<File> implements TimiFX {
|
||||||
this.refreshItem((TreeItem)this.getSelectionModel().getSelectedItem());
|
this.refreshItem((TreeItem)this.getSelectionModel().getSelectedItem());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
List<File> roots = new ArrayList<>();
|
List<File> roots = new ArrayList<>();
|
||||||
|
if (root != null){
|
||||||
roots.add(root);
|
roots.add(root);
|
||||||
|
}
|
||||||
|
|
||||||
menuDestroy.disableProperty().bind(Bindings.createBooleanBinding(() -> {
|
menuDestroy.disableProperty().bind(Bindings.createBooleanBinding(() -> {
|
||||||
ObservableList<TreeItem<File>> items = this.getSelectionModel().getSelectedItems();
|
ObservableList<TreeItem<File>> items = this.getSelectionModel().getSelectedItems();
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,27 @@ public class AceEditor extends AnchorPane {
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AceEditor(File file,AceMode mode,AceTheme theme) {
|
||||||
|
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;
|
||||||
|
if (theme != null){
|
||||||
|
this.theme.setValue(theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.mode = mode;
|
||||||
|
setText(file_content);
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
public AceEditor(String text) {
|
public AceEditor(String text) {
|
||||||
setText(text);
|
setText(text);
|
||||||
initialize();
|
initialize();
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,9 @@
|
||||||
<?import javafx.scene.control.SplitPane?>
|
<?import javafx.scene.control.SplitPane?>
|
||||||
<?import javafx.scene.layout.AnchorPane?>
|
<?import javafx.scene.layout.AnchorPane?>
|
||||||
|
|
||||||
<AnchorPane prefHeight="800.0"
|
<AnchorPane prefHeight="800.0" prefWidth="1661.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zhangmeng.tools.controller.EditorListImplController">
|
||||||
prefWidth="1661.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1"
|
|
||||||
fx:controller="com.zhangmeng.tools.controller.EditorListImplController">
|
|
||||||
<children>
|
<children>
|
||||||
<MenuBar layoutX="14.0" layoutY="27.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
|
<MenuBar layoutX="14.0" layoutY="27.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
AnchorPane.topAnchor="0.0">
|
|
||||||
<menus>
|
<menus>
|
||||||
<Menu mnemonicParsing="false" text="加密工具">
|
<Menu mnemonicParsing="false" text="加密工具">
|
||||||
<items>
|
<items>
|
||||||
|
|
@ -24,112 +21,126 @@
|
||||||
</Menu>
|
</Menu>
|
||||||
<Menu mnemonicParsing="false" text="影音工具">
|
<Menu mnemonicParsing="false" text="影音工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="视频播放" onAction="#video_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#video_menu_item" text="视频播放" />
|
||||||
<MenuItem mnemonicParsing="false" text="音乐播放" onAction="#music_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#music_menu_item" text="音乐播放" />
|
||||||
<MenuItem mnemonicParsing="false" text="vip 视频解析" onAction="#vip_parser_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#vip_parser_menu_item" text="vip 视频解析" />
|
||||||
<MenuItem mnemonicParsing="false" text="音乐解析" onAction="#music_parser_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#music_parser_menu_item" text="音乐解析" />
|
||||||
<MenuItem mnemonicParsing="false" text="视频转码" onAction="#video_transcoder_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#video_transcoder_menu_item" text="视频转码" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
<Menu mnemonicParsing="false" text="常用小工具">
|
<Menu mnemonicParsing="false" text="常用小工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="16进制(Hex)" onAction="#hex_16_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#hex_16_menu_item" text="16进制(Hex)" />
|
||||||
<MenuItem mnemonicParsing="false" text="Unicode和字符串转换" onAction="#unicode_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#unicode_menu_item" text="Unicode和字符串转换" />
|
||||||
<MenuItem mnemonicParsing="false" text="jwt工具" onAction="#jwt_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#jwt_menu_item" text="jwt工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="颜色选择工具" onAction="#color_choose_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#color_choose_menu_item" text="颜色选择工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="二维码生成" onAction="#qr_code_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#qr_code_menu_item" text="二维码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="时间工具" onAction="#date_query_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#date_query_menu_item" text="时间工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="cron表达式" onAction="#cron_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#cron_menu_item" text="cron表达式" />
|
||||||
<MenuItem mnemonicParsing="false" text="邮件发送" onAction="#mail_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#mail_menu_item" text="邮件发送" />
|
||||||
<MenuItem mnemonicParsing="false" text="手机号工具" onAction="#telephone_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#telephone_menu_item" text="手机号工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="JsonView" onAction="#JsonView_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#JsonView_menu_item" text="JsonView" />
|
||||||
<MenuItem mnemonicParsing="false" text="maven-jar-install" onAction="#maven_jar_install_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#maven_jar_install_menu_item" text="maven-jar-install" />
|
||||||
<MenuItem mnemonicParsing="false" text="word-ocr" onAction="#word_ocr_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#word_ocr_menu_item" text="word-ocr" />
|
||||||
<MenuItem mnemonicParsing="false" text="条形码识别" onAction="#bar_code_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#bar_code_menu_item" text="条形码识别" />
|
||||||
<MenuItem mnemonicParsing="false" text="pdf识别" onAction="#pdf_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#pdf_menu_item" text="pdf识别" />
|
||||||
<MenuItem mnemonicParsing="false" text="批量修改文件名" onAction="#batch_update_file_name_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#batch_update_file_name_menu_item" text="批量修改文件名" />
|
||||||
<MenuItem mnemonicParsing="false" text="截图工具" onAction="#capter_screen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#capter_screen_menu_item" text="截图工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="文件编辑器" onAction="#file_edit_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#file_edit_menu_item" text="文件编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="LayUI表单代码生成" onAction="#layui_form_gen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#layui_form_gen_menu_item" text="LayUI表单代码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="日志输出" onAction="#log_console_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#log_console_menu_item" text="日志输出" />
|
||||||
<MenuItem mnemonicParsing="false" text="EditPlus注册码生成" onAction="#edit_plus_code_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#edit_plus_code_menu_item" text="EditPlus注册码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="minio文件上传" onAction="#minio_upload_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#minio_upload_menu_item" text="minio文件上传" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="编解码工具">
|
<Menu mnemonicParsing="false" text="编解码工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="Base62编码解码" onAction="#base_62_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#base_62_menu_item" text="Base62编码解码" />
|
||||||
<MenuItem mnemonicParsing="false" text="Base64编码解码" onAction="#base_64_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#base_64_menu_item" text="Base64编码解码" />
|
||||||
<MenuItem mnemonicParsing="false" text="Base32编码解码" onAction="#base_32_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#base_32_menu_item" text="Base32编码解码" />
|
||||||
<MenuItem mnemonicParsing="false" text="摩尔斯电码" onAction="#morse_coder_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#morse_coder_menu_item" text="摩尔斯电码" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="代码工具">
|
<Menu mnemonicParsing="false" text="代码工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="mysql代码生成" onAction="#sql_code_gen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#sql_code_gen_menu_item" text="mysql代码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="mybatis-plus 代码生成" onAction="#mybatis_plus_gen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#mybatis_plus_gen_menu_item" text="mybatis-plus 代码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="json转javaBean 代码生成" onAction="#json_javabean_gen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#json_javabean_gen_menu_item" text="json转javaBean 代码生成" />
|
||||||
<MenuItem mnemonicParsing="false" text="sql 查询" onAction="#sql_query_gen_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#sql_query_gen_menu_item" text="sql 查询" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="http工具">
|
<Menu mnemonicParsing="false" text="http工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="http请求工具" onAction="#http_request_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#http_request_menu_item" text="http请求工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="http上传工具" onAction="#http_upload_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#http_upload_menu_item" text="http上传工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="http下载工具" onAction="#http_download_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#http_download_menu_item" text="http下载工具" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="server 工具">
|
<Menu mnemonicParsing="false" text="server 工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="http-server 请求工具" onAction="#http_server_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#http_server_menu_item" text="http-server 请求工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="ftp-server 请求工具" onAction="#ftp_server_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#ftp_server_menu_item" text="ftp-server 请求工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="ssh-client 请求工具" onAction="#ssh_client_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#ssh_client_menu_item" text="ssh-client 请求工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="socket-server 服务工具" onAction="#socket_server_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#socket_server_menu_item" text="socket-server 服务工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="socket-client-aio 客户端工具" onAction="#socket_client_aio_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#socket_client_aio_menu_item" text="socket-client-aio 客户端工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="socket-server-aio 服务端工具" onAction="#socket_server_aio_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#socket_server_aio_menu_item" text="socket-server-aio 服务端工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="socket-server-nio 服务端工具" onAction="#socket_server_nio_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#socket_server_nio_menu_item" text="socket-server-nio 服务端工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="socket-client-nio 客户端工具" onAction="#socket_client_nio_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#socket_client_nio_menu_item" text="socket-client-nio 客户端工具" />
|
||||||
<MenuItem mnemonicParsing="false" text="web-socket-client 客户端工具" onAction="#web_socket_client_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#web_socket_client_menu_item" text="web-socket-client 客户端工具" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="go语言工具">
|
<Menu mnemonicParsing="false" text="go语言工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="json生成结构体" onAction="#json_to_struct_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#json_to_struct_menu_item" text="json生成结构体" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="编辑器工具">
|
<Menu mnemonicParsing="false" text="编辑器工具">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_js_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#ace_js_menu_item" text="ace.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_js_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#monaco_js_menu_item" text="monaco.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_js_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#codemirror_js_menu_item" text="codemirror.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="timefx 编辑器" onAction="#timeFx_fx_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#timeFx_fx_menu_item" text="timefx 编辑器" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
<Menu mnemonicParsing="false" text="编辑器">
|
<Menu mnemonicParsing="false" text="编辑器">
|
||||||
<items>
|
<items>
|
||||||
<MenuItem mnemonicParsing="false" text="ace.js 编辑器" onAction="#ace_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#ace_menu_item" text="ace.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="monaco.js 编辑器" onAction="#monaco_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#monaco_menu_item" text="monaco.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="codemirror.js 编辑器" onAction="#codemirror_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#codemirror_menu_item" text="codemirror.js 编辑器" />
|
||||||
<MenuItem mnemonicParsing="false" text="timefx 编辑器" onAction="#timeFx_menu_item"/>
|
<MenuItem mnemonicParsing="false" onAction="#timeFx_menu_item" text="timefx 编辑器" />
|
||||||
</items>
|
</items>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
|
||||||
</menus>
|
</menus>
|
||||||
</MenuBar>
|
</MenuBar>
|
||||||
<SplitPane fx:id="splitPane" dividerPositions="0.5" layoutY="25.0" prefHeight="575.0" prefWidth="1200.0"
|
<AnchorPane layoutY="25.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="25.0">
|
||||||
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
|
<children>
|
||||||
AnchorPane.topAnchor="25.0">
|
|
||||||
|
<SplitPane fx:id="splitPane" dividerPositions="0.5" prefHeight="575.0" prefWidth="1200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="25.0">
|
||||||
<items>
|
<items>
|
||||||
<ListView fx:id="listView" maxWidth="300.0" minWidth="200.0" prefHeight="200.0" prefWidth="200.0"/>
|
<ListView fx:id="listView" maxWidth="300.0" minWidth="200.0" prefHeight="634.0" prefWidth="295.0" />
|
||||||
<AnchorPane prefHeight="200.0" prefWidth="200.0" />
|
<AnchorPane prefHeight="200.0" prefWidth="200.0" />
|
||||||
</items>
|
</items>
|
||||||
</SplitPane>
|
</SplitPane>
|
||||||
|
<MenuBar AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
|
||||||
|
<menus>
|
||||||
|
<Menu mnemonicParsing="false" text="文件">
|
||||||
|
<items>
|
||||||
|
<MenuItem fx:id="open_file" mnemonicParsing="false" text="打开文件" />
|
||||||
|
<MenuItem fx:id="open_dir" mnemonicParsing="false" text="打开文件夹" />
|
||||||
|
<MenuItem fx:id="save" mnemonicParsing="false" text="保存" />
|
||||||
|
</items>
|
||||||
|
</Menu>
|
||||||
|
</menus>
|
||||||
|
</MenuBar>
|
||||||
|
</children>
|
||||||
|
</AnchorPane>
|
||||||
</children>
|
</children>
|
||||||
</AnchorPane>
|
</AnchorPane>
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@ Width=1300
|
||||||
# 窗体高度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 850
|
# 窗体高度,静默配置,双精度浮点型,取值范围 [1, 系统最大限制],默认 850
|
||||||
Height=850
|
Height=850
|
||||||
|
|
||||||
|
# 编辑器主题
|
||||||
|
AceJsThem=kr_theme
|
||||||
|
|
||||||
|
|
||||||
[Interpolator]
|
[Interpolator]
|
||||||
|
|
||||||
# 动画插值器持续时间
|
# 动画插值器持续时间
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue