diff --git a/src/main/java/org/jcnc/jnotepad/JnotepadApp.java b/src/main/java/org/jcnc/jnotepad/JnotepadApp.java index bf46dd2d468e349673256f7d94edae8bdc76ddb0..d2ccd29022d5af17e79b537f97ad2cb49df499ad 100644 --- a/src/main/java/org/jcnc/jnotepad/JnotepadApp.java +++ b/src/main/java/org/jcnc/jnotepad/JnotepadApp.java @@ -30,7 +30,6 @@ public class JnotepadApp extends Application { // 获取当前启动位置a String currentWorkingDirectory = System.getProperty("user.dir"); LogUtil.getLogger(this.getClass()).info("当前启动位置:{}", currentWorkingDirectory); - // 设置参数 APPLICATION_MANAGER.setApplication(this); APPLICATION_MANAGER.setPrimaryStage(primaryStage); diff --git a/src/main/java/org/jcnc/jnotepad/api/core/controller/config/BaseConfigController.java b/src/main/java/org/jcnc/jnotepad/api/core/controller/config/BaseConfigController.java index b5bc79e5de244bb5acc466ac26de79d5c3ce1fb7..5c20c9b817acb345f3bb92203f0185ea791158ef 100644 --- a/src/main/java/org/jcnc/jnotepad/api/core/controller/config/BaseConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/api/core/controller/config/BaseConfigController.java @@ -22,9 +22,9 @@ import java.nio.file.Paths; */ public abstract class BaseConfigController implements ConfigController { - protected final String rootConfigDir = "config"; + protected static final String ROOT_CONFIG_DIR = "config"; - protected final String systemConfigDir = "system"; + protected static final String SYSTEM_CONFIG_DIR = "system"; protected T config; Logger logger = LogUtil.getLogger(this.getClass()); diff --git a/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/AbstractMenuBuilder.java b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/AbstractMenuBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..d62a6dfb3378d9d776889e558250fcead7879ce8 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/AbstractMenuBuilder.java @@ -0,0 +1,118 @@ +package org.jcnc.jnotepad.api.core.views.menu.builder; + +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuItem; +import javafx.scene.control.SeparatorMenuItem; + +/** + * 抽象菜单建造者类 + * + * @author gewuyou + */ +public abstract class AbstractMenuBuilder { + /** + * Get subclass builder + * + * @return builder + */ + protected abstract B getBuilder(); + + /** + * Retrieves the items of the menu. + * + * @return an ObservableList of MenuItems + */ + protected abstract ObservableList getItems(); + + /** + * 添加菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件 + * @return 建造者 + */ + public B addMenuItem(String label, EventHandler eventHandler) { + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件 + * @param disable 是否禁用 + * @return 建造者 + */ + public B addMenuItem(String label, EventHandler eventHandler, boolean disable) { + if (!disable) { + return getBuilder(); + } + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加单选菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件 + * @return 建造者 + */ + public B addRadioMenuItem(String label, EventHandler eventHandler) { + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加复选菜单项 + * + * @param label 菜单项名称 + * @param eventHandler 事件 + * @return 建造者 + */ + public B addCheckMenuItem(String label, EventHandler eventHandler) { + MenuItem menuItem = new MenuItem(label); + menuItem.setOnAction(eventHandler); + getItems().add(menuItem); + return getBuilder(); + } + + /** + * 添加菜单 + * + * @param menu 菜单 + * @return 建造者 + */ + public B addMenu(Menu menu) { + getItems().add(menu); + return getBuilder(); + } + + /** + * 添加分割线 + * + * @return 建造者 + */ + public B addSeparatorMenuItem() { + getItems().add(new SeparatorMenuItem()); + return getBuilder(); + } + + /** + * Build menu + * + * @return menu + */ + public abstract T build(); + +} diff --git a/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/ContextMenuBuilder.java b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/ContextMenuBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..fb08b392f613f66039ac59f1601243c07ab40779 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/ContextMenuBuilder.java @@ -0,0 +1,49 @@ +package org.jcnc.jnotepad.api.core.views.menu.builder; + +import javafx.collections.ObservableList; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.MenuItem; + +/** + * 上下文菜单建造者类 + * + * @author gewuyou + */ +public class ContextMenuBuilder extends AbstractMenuBuilder { + private final ContextMenu contextMenu; + + public ContextMenuBuilder() { + contextMenu = new ContextMenu(); + } + + + /** + * Builds and returns the ContextMenu object. + * + * @return the built ContextMenu object + */ + @Override + public ContextMenu build() { + return contextMenu; + } + + /** + * Get subclass builder + * + * @return builder + */ + @Override + protected ContextMenuBuilder getBuilder() { + return this; + } + + /** + * Retrieves the items of the menu. + * + * @return an ObservableList of MenuItems + */ + @Override + protected ObservableList getItems() { + return contextMenu.getItems(); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/MenuBuilder.java b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/MenuBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..40ee03818e2ada13a25772f6c155398f3eb30697 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/api/core/views/menu/builder/MenuBuilder.java @@ -0,0 +1,48 @@ +package org.jcnc.jnotepad.api.core.views.menu.builder; + +import javafx.collections.ObservableList; +import javafx.scene.control.Menu; +import javafx.scene.control.MenuItem; + +/** + * 菜单建造者类 + * + * @author gewuyou + */ +public class MenuBuilder extends AbstractMenuBuilder { + private final Menu menu; + + public MenuBuilder(String label) { + menu = new Menu(label); + } + + /** + * Get subclass builder + * + * @return builder + */ + @Override + protected MenuBuilder getBuilder() { + return this; + } + + /** + * Retrieves the items of the menu. + * + * @return an ObservableList of MenuItems + */ + @Override + protected ObservableList getItems() { + return menu.getItems(); + } + + /** + * Build menu + * + * @return menu + */ + @Override + public Menu build() { + return menu; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/component/stage/topmenu/help/HelpPaneStage.java b/src/main/java/org/jcnc/jnotepad/component/stage/topmenu/help/HelpPaneStage.java index 4f5fb66d8f5ec795b4e3e4e1ea27f0a10a23ae09..81a65e0539c316ecbbe8098c09430950cbb0c489 100644 --- a/src/main/java/org/jcnc/jnotepad/component/stage/topmenu/help/HelpPaneStage.java +++ b/src/main/java/org/jcnc/jnotepad/component/stage/topmenu/help/HelpPaneStage.java @@ -12,13 +12,12 @@ import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.input.Clipboard; -import javafx.scene.input.ClipboardContent; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Modality; import javafx.stage.Stage; import org.jcnc.jnotepad.api.core.component.stage.AbstractPaneStage; +import org.jcnc.jnotepad.util.ClipboardUtil; import org.jcnc.jnotepad.util.LogUtil; import org.jcnc.jnotepad.util.UiUtil; import org.jcnc.jnotepad.views.manager.RootManager; @@ -139,12 +138,10 @@ public class HelpPaneStage extends AbstractPaneStage { // 调用 RootManager 中的方法来显示 Notification rootManager.addNotificationToStackPane(rootManager.getRootStackPane(), notification); - Clipboard clipboard = Clipboard.getSystemClipboard(); - ClipboardContent content = new ClipboardContent(); String info = "软件名字:" + APP_NAME + "\t" + "版本:" + VERSION; - content.putString(info); + ClipboardUtil.writeTextToClipboard(info); LogUtil.getLogger(this.getClass()).info("软件信息已经复制到剪贴板:{}", info); - clipboard.setContent(content); + // 关闭当前的 Stage Stage currentStage = (Stage) ((Button) event.getSource()).getScene().getWindow(); currentStage.close(); diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java index da0638561729fa7b4ea910caeb4618537e8ba39f..293432f52d1cab941cd6249d061c326fe5d21b3b 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/config/AppConfigController.java @@ -29,7 +29,7 @@ public class AppConfigController extends BaseConfigController { private final String configDir; public AppConfigController() { - configDir = Paths.get(System.getProperty(DEFAULT_PROPERTY), PROGRAM_FILE_DIRECTORY, systemConfigDir).toString(); + configDir = Paths.get(System.getProperty(DEFAULT_PROPERTY), PROGRAM_FILE_DIRECTORY, SYSTEM_CONFIG_DIR).toString(); loadConfig(); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java index 3568c32d45a181e4f2b479b7bed10e07af3bf2bb..f65146de58a0d3b8091b90bcdae6970e4a4af8f2 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/config/PluginConfigController.java @@ -26,7 +26,7 @@ public class PluginConfigController extends BaseConfigController { private PluginConfigController() { String rootPath = AppConfigController.getInstance().getConfig().getRootPath(); - configDir = Paths.get(rootPath, PROGRAM_FILE_DIRECTORY, rootConfigDir).toString(); + configDir = Paths.get(rootPath, PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString(); setPluginsDir(Paths.get(rootPath, PROGRAM_FILE_DIRECTORY, "plugins").toString()); loadConfig(); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/config/UserConfigController.java b/src/main/java/org/jcnc/jnotepad/controller/config/UserConfigController.java index 3db3c65fc9867acc1aeba5657a70799e7555fa07..3bbb9bdf87b68aa8c7e4ea5c5c708cc3e92a5629 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/config/UserConfigController.java +++ b/src/main/java/org/jcnc/jnotepad/controller/config/UserConfigController.java @@ -32,7 +32,7 @@ public class UserConfigController extends BaseConfigController { private String configDir; private UserConfigController() { - configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, rootConfigDir).toString(); + configDir = Paths.get(AppConfigController.getInstance().getConfig().getRootPath(), PROGRAM_FILE_DIRECTORY, ROOT_CONFIG_DIR).toString(); loadConfig(); } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/RenameFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/RenameFile.java index eb5b7c53d58b5eefa96850bd774db6238d6f859c..92bc7359534d69e214f9020630df57a89354b1f9 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/RenameFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/RenameFile.java @@ -27,10 +27,12 @@ import java.io.File; * @author gewuyou */ public class RenameFile implements EventHandler { - Logger logger = LogUtil.getLogger(this.getClass()); + static Logger logger = LogUtil.getLogger(RenameFile.class); - @Override - public void handle(ActionEvent actionEvent) { + /** + * 重命名 + */ + public static void rename() { // 获取当前标签页 CenterTab centerTab = CenterTabPaneManager.getInstance().getSelected(); if (centerTab == null || centerTab.getText().isEmpty()) { @@ -52,7 +54,7 @@ public class RenameFile implements EventHandler { * * @param centerTab 标签页组件 */ - private void handleRenameTab(CenterTab centerTab) { + private static void handleRenameTab(CenterTab centerTab) { TextField textField = new TextField(centerTab.getText()); textField.getStyleClass().add("tab-title-editable"); // 临时记录标签页名称 @@ -116,7 +118,7 @@ public class RenameFile implements EventHandler { * @param newTabName 要检查的新标签页名称 * @return 如果存在具有相同名称的标签页,则返回 true;否则返回 false */ - private boolean isTabNameExists(String newTabName) { + private static boolean isTabNameExists(String newTabName) { CenterTabPane tabPane = CenterTabPane.getInstance(); return tabPane.getTabs().stream() .anyMatch(tab -> tab.getText().equals(newTabName)); @@ -125,7 +127,7 @@ public class RenameFile implements EventHandler { /** * 显示警告弹窗,提示用户更换重复的名称。 */ - private void showDuplicateNameAlert(String newTabName) { + private static void showDuplicateNameAlert(String newTabName) { PopUpUtil.errorAlert("重命名错误", "\" " + newTabName + "\" 和已有标签页名字重复", "请再次重命名", null, null); @@ -136,7 +138,7 @@ public class RenameFile implements EventHandler { * * @param centerTab 标签页组件 */ - private void handleRenameRelevanceFile(CenterTab centerTab) { + private static void handleRenameRelevanceFile(CenterTab centerTab) { // 获取原始文件对象 File file = (File) centerTab.getUserData(); @@ -160,4 +162,9 @@ public class RenameFile implements EventHandler { } } } + + @Override + public void handle(ActionEvent actionEvent) { + rename(); + } } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveAsFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveAsFile.java index 48cdf0b3aeef9026e591f0eba69237540f261b76..57fb5306f15b18f52adcd715a35a20551ad55fd7 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveAsFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveAsFile.java @@ -22,6 +22,6 @@ public class SaveAsFile extends SaveFile { @Override public void handle(ActionEvent event) { LogUtil.getLogger(SaveAsFile.class).info("已调用另存为功能"); - saveTab(this.getClass()); + saveAsFile(); } } diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveFile.java index 31f818d403484c94378199ee86dcb58c9ac8904e..f3534a661998d2feac03e4d7e85ad832755f8592 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/SaveFile.java @@ -32,17 +32,9 @@ import static org.jcnc.jnotepad.controller.config.UserConfigController.CONFIG_NA */ public class SaveFile implements EventHandler { private static final ApplicationCacheManager CACHE_MANAGER = ApplicationCacheManager.getInstance(); - Logger logger = LogUtil.getLogger(this.getClass()); + static Logger logger = LogUtil.getLogger(SaveFile.class); - /** - * 处理保存文件事件。 - * - * @param actionEvent 事件对象 - * @apiNote 当用户选择保存文件时,如果当前标签页是关联文件,则自动保存; - * 否则,调用另存为方法。 - */ - @Override - public void handle(ActionEvent actionEvent) { + public static void saveFile() { // 获取当前tab页 CenterTab selectedTab = CenterTabPaneManager.getInstance().getSelected(); if (selectedTab == null) { @@ -51,7 +43,7 @@ public class SaveFile implements EventHandler { // 如果打开的是非关联文件,则调用另存为方法 if (!selectedTab.isRelevance()) { logger.info("当前保存文件为非关联打开文件,调用另存为方法"); - saveTab(this.getClass()); + saveAsFile(); } else { logger.info("当前保存文件为关联打开文件,调用自动保存方法"); // 调用tab保存方法 @@ -71,11 +63,10 @@ public class SaveFile implements EventHandler { /** * 保存标签页的方法。 * - * @param currentClass 调用该方法的类 * @apiNote 将当前选中的标签页进行另存为弹出窗口式的保存。 * @see LogUtil */ - protected void saveTab(Class currentClass) { + public static void saveAsFile() { CenterTab selectedTab = CenterTabPaneManager.getInstance().getSelected(); if (selectedTab == null) { return; @@ -94,7 +85,7 @@ public class SaveFile implements EventHandler { cache.setCacheData(file.getParent()); CACHE_MANAGER.addCache(cache); } - LogUtil.getLogger(currentClass).info("正在保存文件: {}", file.getName()); + logger.info("正在保存文件: {}", file.getName()); selectedTab.save(file); // 将保存后的文件设置为关联文件 selectedTab.setRelevance(true); @@ -102,4 +93,16 @@ public class SaveFile implements EventHandler { selectedTab.setText(file.getName()); } } + + /** + * 处理保存文件事件。 + * + * @param actionEvent 事件对象 + * @apiNote 当用户选择保存文件时,如果当前标签页是关联文件,则自动保存; + * 否则,调用另存为方法。 + */ + @Override + public void handle(ActionEvent actionEvent) { + saveFile(); + } } diff --git a/src/main/java/org/jcnc/jnotepad/util/ClipboardUtil.java b/src/main/java/org/jcnc/jnotepad/util/ClipboardUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4e95321814086639a3debd6a7d1fa5901abb27cd --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/util/ClipboardUtil.java @@ -0,0 +1,42 @@ +package org.jcnc.jnotepad.util; + +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; + +/** + * 剪切板工具 + * + * @author gewuyou + */ +public class ClipboardUtil { + /** + * 系统剪切板对象 + */ + private static final Clipboard CLIPBOARD = Clipboard.getSystemClipboard(); + + private ClipboardUtil() { + } + + /** + * Writes the provided text to the system clipboard. + * + * @param text the text to be written to the clipboard + */ + public static void writeTextToClipboard(String text) { + ClipboardContent content = new ClipboardContent(); + content.putString(text); + CLIPBOARD.setContent(content); + } + + /** + * Reads text from the clipboard. + * + * @return the text read from the clipboard + */ + public static String readTextFromClipboard() { + String text = CLIPBOARD.getString(); + LogUtil.getLogger(ClipboardUtil.class).info("剪切板内容:{}", text); + return text; + } + +} diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java index ce6f7b22a3c2660c8a1b87fa51f9b78b7c8e0379..199fb7344f8a8e18855209f4a725a4499297942d 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java @@ -28,7 +28,7 @@ public class BuildPanelManager { private static final MainBorderPane MAIN_BORDER_PANE = MainBorderPane.getInstance(); - private static boolean isShow = false; + private boolean isShow = false; /** * 控制终端显示 diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/CenterTabPaneManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/CenterTabPaneManager.java index e1d973d406d0991ead4da378dfc86c9895ae3b8b..09732c25607321a26767cff95fe9c65b5f209eca 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/CenterTabPaneManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/CenterTabPaneManager.java @@ -157,4 +157,82 @@ public class CenterTabPaneManager { }); CACHE_MANAGER.addCache(CACHE_MANAGER.createCache("tabs", "centerTabs", filePaths, CacheExpirationTime.NEVER_EXPIRES.getValue())); } + + /** + * Removes the specified CenterTab from the Tabs. + * + * @param tab the CenterTab to be removed + */ + public void removeTab(CenterTab tab) { + centerTabPane.getTabs().remove(tab); + } + + /** + * Removes all tabs from the center tab pane. + */ + public void removeAllTabs() { + centerTabPane.getTabs().clear(); + } + + /** + * Removes all tabs from the center tab pane that are not equal to the specified center tab. + * + * @param centerTab the center tab to compare against + */ + public void removeOtherTabs(CenterTab centerTab) { + centerTabPane.getTabs().removeIf(tab -> !centerTab.equals(tab)); + } + + /** + * This function removes the left tabs from the given CenterTab object. + * + * @param centerTab the CenterTab object from which to remove the left tabs + */ + public void removeLeftTabs(CenterTab centerTab) { + ObservableList tabs = centerTabPane.getTabs(); + tabs.remove(0, tabs.indexOf(centerTab)); + } + + /** + * Removes all tabs to the right of the specified center tab. + * + * @param centerTab the center tab to remove right tabs from + */ + public void removeRightTabs(CenterTab centerTab) { + ObservableList tabs = centerTabPane.getTabs(); + tabs.remove(tabs.indexOf(centerTab), tabs.size()); + } + + /** + * 判断是否有其它标签页 + * + * @return 是否有其它标签页 + */ + public boolean hasOtherTabs() { + return centerTabPane.getTabs().size() > 1; + } + + + /** + * 判断是否有左侧标签页 + * + * @param centerTab 标签页 + * @return 是否有左侧标签页 + */ + public boolean hasLeftTabs(CenterTab centerTab) { + int index = centerTabPane.getTabs().indexOf(centerTab); + return index > 0; + } + + /** + * 判断是否有右侧标签页 + * + * @param centerTab 标签页 + * @return 是否有右侧标签页 + */ + public boolean hasRightTabs(CenterTab centerTab) { + ObservableList tabs = centerTabPane.getTabs(); + int index = tabs.indexOf(centerTab); + return index != tabs.size() - 1; + } } diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java index 449888baa1cd6898cfa67f97f47c71deecbcf661..79aa88ca0061886b9cc6124ae5f2c36731e77548 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java @@ -19,7 +19,9 @@ public class MainBorderPaneManager { private static final MainBorderPane MAIN_BORDER_PANE = MainBorderPane.getInstance(); private static final DirectorySidebarPane DIRECTORY_SIDEBAR_PANE = DirectorySidebarPane.getInstance(); - // 默认分割条位置 + /** + * 默认分割条位置 + */ private static final double TOP_SPLIT_PANEL_DEFAULT_DIVIDER_POSITIONS = 0.3; private MainBorderPaneManager() { diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/RootManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/RootManager.java index ecd7081ff6b54cf32c6d33951abd3e13b915cfb6..820e31b1553580c98dd17e76ea01de57aca4c78a 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/RootManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/RootManager.java @@ -27,7 +27,7 @@ public class RootManager { /** * 主布局 */ - private BorderPane root; + private final BorderPane root; /** * 私有构造函数。设置场景和根布局。 diff --git a/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTab.java b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTab.java index 7a135b7c8c463240863e5640153de2a8a876f401..abc28a8cc1e50d31d08821cb503af4b0e8e361b8 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTab.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/tab/CenterTab.java @@ -2,8 +2,13 @@ package org.jcnc.jnotepad.views.root.center.main.center.tab; import javafx.scene.control.Tab; import org.fxmisc.flowless.VirtualizedScrollPane; +import org.jcnc.jnotepad.api.core.views.menu.builder.ContextMenuBuilder; +import org.jcnc.jnotepad.api.core.views.menu.builder.MenuBuilder; import org.jcnc.jnotepad.component.module.TextCodeArea; import org.jcnc.jnotepad.controller.config.UserConfigController; +import org.jcnc.jnotepad.controller.event.handler.menuitem.RenameFile; +import org.jcnc.jnotepad.controller.event.handler.menuitem.SaveFile; +import org.jcnc.jnotepad.util.ClipboardUtil; import org.jcnc.jnotepad.util.LogUtil; import org.jcnc.jnotepad.views.manager.BottomStatusBoxManager; import org.jcnc.jnotepad.views.manager.CenterTabPaneManager; @@ -17,7 +22,7 @@ import java.nio.charset.Charset; /** * 封装标签页组件,增加属于标签页的属性,例如:自动换行开关。 - * 每个Tab关联一个LineNumberTextArea。 + * 每个Tab关联一个TextCodeArea。 * * @author songdragon */ @@ -53,6 +58,7 @@ public class CenterTab extends Tab { this.setContent(new VirtualizedScrollPane<>(textCodeArea)); setAutoLine(UserConfigController.getInstance().getAutoLineConfig()); this.charset = charset; + contextMenuMonitor(); } public boolean isRelevance() { @@ -84,6 +90,54 @@ public class CenterTab extends Tab { this.charset = charset; } + public void contextMenuMonitor() { + ContextMenuBuilder builder = new ContextMenuBuilder(); + CenterTabPaneManager centerTabPaneManager = CenterTabPaneManager.getInstance(); + File file = (File) this.getUserData(); + //todo 设置上下文菜单 + this.setContextMenu( + builder + .addMenuItem("关闭", e -> centerTabPaneManager.removeTab(this)) + .addMenuItem( + "关闭其它标签页", + e -> centerTabPaneManager.removeOtherTabs(this), + centerTabPaneManager.hasOtherTabs() + ) + .addMenuItem("关闭所有标签页", e -> centerTabPaneManager.removeAllTabs()) + .addMenuItem( + "关闭左侧标签页", + e -> centerTabPaneManager.removeLeftTabs(this), + centerTabPaneManager.hasLeftTabs(this) + ) + .addMenuItem( + "关闭右侧标签页", + e -> centerTabPaneManager.removeRightTabs(this), + centerTabPaneManager.hasRightTabs(this) + ) + .addSeparatorMenuItem() + .addMenu( + new MenuBuilder("复制") + .addMenuItem("文件名", e -> ClipboardUtil.writeTextToClipboard(this.getText())) + .addMenuItem("文件路径", e -> ClipboardUtil.writeTextToClipboard(file.getAbsolutePath())) + .addMenuItem("所在文件夹", e -> ClipboardUtil.writeTextToClipboard(file.getParent())) + .build() + ) + .addSeparatorMenuItem() + .addMenuItem("保存", e -> SaveFile.saveFile()) + .addMenuItem("另存为", e -> SaveFile.saveAsFile(), isRelevance) + .addMenuItem("重命名", e -> RenameFile.rename()) + .addSeparatorMenuItem() + .addMenu(new MenuBuilder("打开于") + .addMenuItem("资源管理器", e -> { + + }) + .addMenuItem("终端", e -> { + + }) + .build()) + .build()); + } + /** * 保存选中的文件标签页 */ @@ -131,6 +185,7 @@ public class CenterTab extends Tab { saveSelectedFileTab(); }); } + /** * 保存为指定文件 * diff --git a/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/RunTopMenu.java b/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/RunTopMenu.java index 6ebe38efe2ab96dd7eb1c87b98fe9d4ef0ffe7f1..91d891c28c87b6af964c2e8d89767e409b5ef8ca 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/RunTopMenu.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/RunTopMenu.java @@ -19,7 +19,7 @@ import static org.jcnc.jnotepad.common.constants.TextConstants.DE_BUG; import static org.jcnc.jnotepad.common.constants.TextConstants.RUN; /** - * 文件菜单 + * 运行菜单 * * @author gewuyou */ @@ -139,7 +139,6 @@ public class RunTopMenu extends AbstractTopMenu { // 运行 registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun); - // 调试 test registerMenuItem(topMenuBar.getDeBugItem(), DE_BUG, "deBugItem", event -> { BUILD_PANEL_MANAGER.controlShow(true);