diff --git a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java index 61ba6470954545c00e664b9aa23c215911365c5f..f19289c017a74df949cb0bdb4316c60d7a2fe5ea 100644 --- a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java @@ -12,6 +12,8 @@ public class TextConstants { /// GlobalConfig文本常量 + + public static final String SAVE = "SAVE"; public static final String FILE = "FILE"; public static final String NEW = "NEW"; diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java index 46655ab521fca83e20f7a5e2cfaa17d2aab4f167..1a2aef33487a962346b47eeff338a0ad4cbb5077 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/OpenFile.java @@ -5,11 +5,15 @@ import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.stage.FileChooser; +import org.jcnc.jnotepad.app.i18n.UiResourceBundle; +import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.manager.ThreadPoolManager; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.tool.EncodingDetector; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.UiUtil; +import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; +import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.jcnc.jnotepad.ui.module.LineNumberTextArea; import java.io.BufferedReader; @@ -36,10 +40,13 @@ public class OpenFile implements EventHandler { */ @Override public void handle(ActionEvent event) { - // 创建文件选择器 - FileChooser fileChooser = new FileChooser(); // 显示文件选择对话框,并获取选中的文件 - File file = fileChooser.showOpenDialog(UiUtil.getAppWindow()); + File file = TextFileChooserFactory.getInstance().createFileChooser( + UiResourceBundle.getContent(TextConstants.OPEN), + null, + null, + new FileChooser.ExtensionFilter("All types", "*.*")) + .showOpenDialog(UiUtil.getAppWindow()); if (file != null) { openFile(file); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java index cc6dea8255ae5f5762f95f9666b9d91eb133d087..442b5e81346e3d8f127bb96626912b398dfa97aa 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/RenameFile.java @@ -5,9 +5,13 @@ import javafx.event.EventHandler; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.stage.FileChooser; +import org.jcnc.jnotepad.app.i18n.UiResourceBundle; +import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.UiUtil; +import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; +import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.slf4j.Logger; import java.io.File; @@ -29,65 +33,81 @@ public class RenameFile implements EventHandler { } // 判断当前是否为关联文件 if (jnotepadtab.isRelevance()) { - // 创建一个文件窗口 - FileChooser fileChooser = new FileChooser(); - // 设置窗口名称 - fileChooser.setTitle("重命名"); - // 设置原始文件名称 - fileChooser.setInitialFileName(jnotepadtab.getText()); - // 获取原始文件对象 - File file = (File) jnotepadtab.getUserData(); - // 设置打开的目录 - fileChooser.setInitialDirectory(new File(file.getParent())); - // 设置文件类型 - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("文本文档", "*.txt")); - // 获取应用窗口并绑定 - File newFile = fileChooser.showSaveDialog(UiUtil.getAppWindow()); - if (newFile != null) { - boolean rename = file.renameTo(newFile); - // 设置文件数据 - jnotepadtab.setUserData(newFile); - if (rename) { - jnotepadtab.setText(newFile.getName()); - logger.info("文件重命名成功"); - } else { - logger.debug("文件重命名失败"); - } - } + // 重命名关联文件 + handleRenameRelevanceFile(jnotepadtab); } // 如果当前不是关联文件则重命名标签页 else { - TextField textField = new TextField(jnotepadtab.getText()); - textField.getStyleClass().add("tab-title-editable"); - // 清空标签页名称 - jnotepadtab.setText(""); - // 监听 Enter 键,完成编辑 - textField.setOnKeyPressed(event -> { - if (event.getCode() == KeyCode.ENTER) { - jnotepadtab.setText(textField.getText()); - // 可选:移除 TextField 的图形 - jnotepadtab.setGraphic(null); - // 可选:恢复标签页的关闭按钮 - jnotepadtab.setClosable(true); - } - }); - // 监听失去焦点事件,完成编辑 - textField.focusedProperty().addListener((observable, oldValue, newValue) -> { - if (Boolean.FALSE.equals(newValue)) { - jnotepadtab.setText(textField.getText()); - // 可选:移除 TextField 的图形 - jnotepadtab.setGraphic(null); - // 可选:恢复标签页的关闭按钮 - jnotepadtab.setClosable(true); - } - }); - jnotepadtab.setClosable(false); - // 设置 TextField 作为标签页的图形 - jnotepadtab.setGraphic(textField); - // 默认获取焦点并选中所有文字 - textField.requestFocus(); - textField.selectAll(); + handleRenameTab(jnotepadtab); + } + } + + /** + * 重命名标签页 + * + * @param jnotepadtab 标签页组件 + * @since 2023/8/31 21:48 + */ + private void handleRenameTab(JNotepadTab jnotepadtab) { + TextField textField = new TextField(jnotepadtab.getText()); + textField.getStyleClass().add("tab-title-editable"); + // 清空标签页名称 + jnotepadtab.setText(""); + // 监听 Enter 键,完成编辑 + textField.setOnKeyPressed(event -> { + if (event.getCode() == KeyCode.ENTER) { + jnotepadtab.setText(textField.getText()); + // 可选:移除 TextField 的图形 + jnotepadtab.setGraphic(null); + // 可选:恢复标签页的关闭按钮 + jnotepadtab.setClosable(true); + } + }); + // 监听失去焦点事件,完成编辑 + textField.focusedProperty().addListener((observable, oldValue, newValue) -> { + if (Boolean.FALSE.equals(newValue)) { + jnotepadtab.setText(textField.getText()); + // 可选:移除 TextField 的图形 + jnotepadtab.setGraphic(null); + // 可选:恢复标签页的关闭按钮 + jnotepadtab.setClosable(true); + } + }); + jnotepadtab.setClosable(false); + // 设置 TextField 作为标签页的图形 + jnotepadtab.setGraphic(textField); + // 默认获取焦点并选中所有文字 + textField.requestFocus(); + textField.selectAll(); + } + /** + * 重命名关联文件 + * + * @param jnotepadtab 标签页组件 + * @since 2023/8/31 21:47 + */ + private void handleRenameRelevanceFile(JNotepadTab jnotepadtab) { + // 获取原始文件对象 + File file = (File) jnotepadtab.getUserData(); + // 获取应用窗口并绑定 + File newFile = TextFileChooserFactory.getInstance() + .createFileChooser( + UiResourceBundle.getContent(TextConstants.RENAME), + jnotepadtab.getText(), + new File(file.getParent()), + new FileChooser.ExtensionFilter("All types", "*.*")) + .showSaveDialog(UiUtil.getAppWindow()); + if (newFile != null) { + boolean rename = file.renameTo(newFile); + // 设置文件数据 + jnotepadtab.setUserData(newFile); + if (rename) { + jnotepadtab.setText(newFile.getName()); + logger.info("文件重命名成功"); + } else { + logger.debug("文件重命名失败"); + } } } } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java index fe9979e61fa77f7c049958334808cfb5ec378826..b4143869856db2171caf71aea635158f4571cace 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuBar/SaveFile.java @@ -3,11 +3,15 @@ package org.jcnc.jnotepad.controller.event.handler.menuBar; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.stage.FileChooser; +import org.jcnc.jnotepad.app.i18n.UiResourceBundle; +import org.jcnc.jnotepad.constants.TextConstants; import org.jcnc.jnotepad.controller.i18n.LocalizationController; import org.jcnc.jnotepad.root.center.main.center.tab.JNotepadTab; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.SingletonUtil; import org.jcnc.jnotepad.tool.UiUtil; +import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; +import org.jcnc.jnotepad.ui.dialog.factory.impl.TextFileChooserFactory; import org.slf4j.Logger; import java.io.File; @@ -64,23 +68,22 @@ public class SaveFile implements EventHandler { */ protected void saveTab(Class currentClass) { JNotepadTab selectedTab = UiUtil.getJnotepadtab(); - if (selectedTab != null) { - // 创建一个文件窗口 - FileChooser fileChooser = new FileChooser(); - // 设置保存文件名称 - fileChooser.setInitialFileName(selectedTab.getText()); - // 设置保存文件类型 - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("文本文档", "*.txt")); - // 获取应用窗口并绑定 - File file = fileChooser.showSaveDialog(UiUtil.getAppWindow()); - if (file != null) { - LogUtil.getLogger(currentClass).info("正在保存文件:{}", file.getName()); - selectedTab.save(file); - // 将保存后的文件设置为已关联 - selectedTab.setRelevance(true); - // 更新Tab页标签上的文件名 - selectedTab.setText(file.getName()); - } + if (selectedTab == null) { + return; + } + File file = TextFileChooserFactory.getInstance().createFileChooser( + UiResourceBundle.getContent(TextConstants.SAVE_AS), + selectedTab.getText(), + null, + new FileChooser.ExtensionFilter("All types", "*.*")) + .showSaveDialog(UiUtil.getAppWindow()); + if (file != null) { + LogUtil.getLogger(currentClass).info("正在保存文件:{}", file.getName()); + selectedTab.save(file); + // 将保存后的文件设置为已关联 + selectedTab.setRelevance(true); + // 更新Tab页标签上的文件名 + selectedTab.setText(file.getName()); } } } diff --git a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java index 14dee976a7d4a44b082309bed65a27ce229f1191..00e7c0fe9162600888c04d61acee44a9b7663ed0 100644 --- a/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java +++ b/src/main/java/org/jcnc/jnotepad/root/center/main/center/tab/JNotepadTab.java @@ -1,7 +1,7 @@ package org.jcnc.jnotepad.root.center.main.center.tab; import javafx.scene.control.Tab; -import org.jcnc.jnotepad.controller.config.AppConfigController; +import org.jcnc.jnotepad.tool.SingletonUtil; import org.jcnc.jnotepad.ui.module.LineNumberTextArea; import java.io.File; @@ -38,7 +38,7 @@ public class JNotepadTab extends Tab { super(tabTitle); lineNumberTextArea = textArea; this.setContent(lineNumberTextArea); - setAutoLine(AppConfigController.getInstance().getAutoLineConfig()); + setAutoLine(SingletonUtil.getAppConfigController().getAutoLineConfig()); this.charset = charset; } diff --git a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/FileChooserFactory.java b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/FileChooserFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..7b6489bd46d4eedb598c997e36813726cd43bf38 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/FileChooserFactory.java @@ -0,0 +1,33 @@ +package org.jcnc.jnotepad.ui.dialog.factory; + +import javafx.stage.FileChooser; + +import java.io.File; + +/** + * 文件选择对话框工厂 + * + * @author gewuyou + */ +public interface FileChooserFactory { + /** + * 创建原始文件选择对话框 + * + * @return javafx.stage.FileChooser + * @since 2023/8/31 20:29 + */ + FileChooser createFileChooser(); + + /** + * 创建详细的文件选择对话框 + * + * @param title 对话框名字 + * @param filename 选中的文件名 + * @param directory 初始目录 + * @param extensionFilter 文件类型数组 + * @return javafx.stage.FileChooser + * @apiNote + * @since 2023/8/31 20:35 + */ + FileChooser createFileChooser(String title, String filename, File directory, FileChooser.ExtensionFilter extensionFilter); +} diff --git a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c0725692e5f5a0050b61a11989917bce6da0574b --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/TextFileChooserFactory.java @@ -0,0 +1,65 @@ +package org.jcnc.jnotepad.ui.dialog.factory.impl; + +import javafx.stage.FileChooser; +import org.jcnc.jnotepad.ui.dialog.factory.FileChooserFactory; + +import java.io.File; + +/** + * 文本文件选择对话框 + * + * @author gewuyou + * @see FileChooserFactory + */ +public class TextFileChooserFactory implements FileChooserFactory { + + private TextFileChooserFactory() { + + } + + private static final TextFileChooserFactory INSTANCE = new TextFileChooserFactory(); + + public static TextFileChooserFactory getInstance() { + return INSTANCE; + } + + /** + * 创建原始文件选择对话框 + * + * @return javafx.stage.FileChooser + * @since 2023/8/31 20:29 + */ + @Override + public FileChooser createFileChooser() { + return new FileChooser(); + } + + /** + * 创建详细的文件选择对话框 + * + * @param title 对话框名字 + * @param filename 选中的文件名 + * @param directory 初始目录 + * @param extensionFilter 文件类型数组 + * @return javafx.stage.FileChooser + * @apiNote + * @since 2023/8/31 20:35 + */ + @Override + public FileChooser createFileChooser(String title, String filename, File directory, FileChooser.ExtensionFilter extensionFilter) { + FileChooser fileChooser = createFileChooser(); + // 设置窗口名称 + fileChooser.setTitle(title); + if (filename != null) { + // 设置原始文件名称 + fileChooser.setInitialFileName(filename); + } + if (directory != null) { + // 设置打开的目录 + fileChooser.setInitialDirectory(directory); + } + // 设置文件类型 + fileChooser.getExtensionFilters().add(extensionFilter); + return fileChooser; + } +}