From b4936bbbda5bebe3c2a8d4344c765abd11664d1b Mon Sep 17 00:00:00 2001 From: cccqy Date: Mon, 2 Oct 2023 21:03:34 +0800 Subject: [PATCH] =?UTF-8?q?###=20https://gitee.com/jcnc-org/JNotepad/issue?= =?UTF-8?q?s/I82EK4=20#I82EK4=20###=20=E5=A2=9E=E5=8A=A0=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=A0=91=E6=8C=89=E9=92=AE=20=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constants/TextConstants.java | 1 + .../event/handler/menubar/OpenDirectory.java | 62 ++++++++++++ .../event/handler/setting/DirTreeBtn.java | 20 ++++ .../jnotepad/model/entity/DirFileModel.java | 50 ++++++++++ .../factory/DirectoryChooserFactory.java | 28 ++++++ .../impl/BasicDirectoryChooserFactory.java | 56 +++++++++++ .../java/org/jcnc/jnotepad/util/FileUtil.java | 43 ++++++++ .../manager/DirectorySidebarManager.java | 92 ++++++++++++++++++ .../views/manager/RootBorderPaneManager.java | 4 +- .../views/manager/SidebarToolBarManager.java | 12 +++ .../views/manager/TopMenuBarManager.java | 3 + .../directory/DirectorySidebarPane.java | 49 ++++++++++ .../left/sidebar/tools/SidebarToolBar.java | 17 ++++ .../left/sidebar/tools/ToolVerticalBox.java | 35 +++++++ .../views/root/top/menu/TopMenuBar.java | 8 ++ src/main/resources/css/styles.css | 6 +- src/main/resources/directory.png | Bin 0 -> 1079 bytes src/main/resources/i18n/i18n.properties | 1 + src/main/resources/i18n/i18n_en.properties | 1 + src/main/resources/i18n/i18n_zh_CN.properties | 1 + 20 files changed, 487 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/OpenDirectory.java create mode 100644 src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java create mode 100644 src/main/java/org/jcnc/jnotepad/model/entity/DirFileModel.java create mode 100644 src/main/java/org/jcnc/jnotepad/ui/dialog/factory/DirectoryChooserFactory.java create mode 100644 src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/BasicDirectoryChooserFactory.java create mode 100644 src/main/java/org/jcnc/jnotepad/util/FileUtil.java create mode 100644 src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java create mode 100644 src/main/java/org/jcnc/jnotepad/views/root/center/main/center/directory/DirectorySidebarPane.java create mode 100644 src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/ToolVerticalBox.java create mode 100644 src/main/resources/directory.png diff --git a/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java index 9045874..9bd36f3 100644 --- a/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java +++ b/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java @@ -13,6 +13,7 @@ public class TextConstants { public static final String FILE = "FILE"; public static final String NEW = "NEW"; public static final String OPEN = "OPEN"; + public static final String OPEN_DIRECTORY = "OPEN_DIRECTORY"; public static final String SAVE_AS = "SAVE_AS"; public static final String RENAME = "RENAME"; public static final String SET = "SET"; diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/OpenDirectory.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/OpenDirectory.java new file mode 100644 index 0000000..496d81c --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/menubar/OpenDirectory.java @@ -0,0 +1,62 @@ +package org.jcnc.jnotepad.controller.event.handler.menubar; + + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import org.jcnc.jnotepad.app.i18n.UiResourceBundle; +import org.jcnc.jnotepad.common.constants.TextConstants; +import org.jcnc.jnotepad.common.manager.ApplicationCacheManager; +import org.jcnc.jnotepad.model.entity.Cache; +import org.jcnc.jnotepad.model.entity.DirFileModel; +import org.jcnc.jnotepad.model.enums.CacheExpirationTime; +import org.jcnc.jnotepad.ui.dialog.factory.impl.BasicDirectoryChooserFactory; +import org.jcnc.jnotepad.util.FileUtil; +import org.jcnc.jnotepad.util.UiUtil; +import org.jcnc.jnotepad.views.manager.DirectorySidebarManager; + +import java.io.File; + +/** + * @author : cccqyu + * @createTime 2023/10/2 1:29 + * @description 当用户选择打开文件夹时,将创建一个左侧树型结构目录。 + */ +public class OpenDirectory implements EventHandler { + + private static final ApplicationCacheManager CACHE_MANAGER = ApplicationCacheManager.getInstance(); + private static final DirectorySidebarManager DIRECTORY_SIDEBAR_MANAGER=DirectorySidebarManager.getInstance(); + @Override + public void handle(ActionEvent actionEvent) { + // 获取缓存 + Cache cache = CACHE_MANAGER.getCache("directory", "openDirectory"); + + // 显示文件选择对话框,并获取选中的文件 + File file = BasicDirectoryChooserFactory.getInstance().createDirectoryChooser( + UiResourceBundle.getContent(TextConstants.OPEN), + cache == null ? null : new File((String) cache.getCacheData()) + ) + .showDialog(UiUtil.getAppWindow()); + if (file == null) { + return; + } + // 设置缓存 + if (cache == null) { + CACHE_MANAGER.addCache(CACHE_MANAGER.createCache("directory", "openDirectory", file.getAbsolutePath(), CacheExpirationTime.NEVER_EXPIRES.getValue())); + } else { + cache.setCacheData(file.getParent()); + CACHE_MANAGER.addCache(cache); + } + flushDirSidebar(file); + + } + + public void flushDirSidebar(File file){ + // 将文件转为实体类 + DirFileModel dirFileModel = FileUtil.getDirFileModel(file); + // 打开侧边栏 + DIRECTORY_SIDEBAR_MANAGER.controlShow(true); + // 设置文件树功能 + DIRECTORY_SIDEBAR_MANAGER.setTreeView(dirFileModel); + + } +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java new file mode 100644 index 0000000..335a3a5 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java @@ -0,0 +1,20 @@ +package org.jcnc.jnotepad.controller.event.handler.setting; + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import org.jcnc.jnotepad.views.manager.DirectorySidebarManager; + +/** + * @author : cccqyu + * @createTime 2023/10/2 17:24 + * @description 文件树按钮事件的事件处理程序。 + */ +public class DirTreeBtn implements EventHandler { + + private static final DirectorySidebarManager DIRECTORY_SIDEBAR_MANAGER = DirectorySidebarManager.getInstance(); + + @Override + public void handle(ActionEvent actionEvent) { + DIRECTORY_SIDEBAR_MANAGER.controlShow(); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/model/entity/DirFileModel.java b/src/main/java/org/jcnc/jnotepad/model/entity/DirFileModel.java new file mode 100644 index 0000000..e67c6bf --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/model/entity/DirFileModel.java @@ -0,0 +1,50 @@ +package org.jcnc.jnotepad.model.entity; + +import java.util.List; + +/** + * @author : cccqyu + * @createTime 2023/10/2 20:31 + * @description 文件夹实体类 + */ +public class DirFileModel { + private String path; + private String name; + + private List childFile; + + public DirFileModel(String path, String name, List childFile) { + this.path = path; + this.name = name; + this.childFile = childFile; + } + + public List getChildFile() { + return childFile; + } + + public void setChildFile(List childFile) { + this.childFile = childFile; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} \ No newline at end of file diff --git a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/DirectoryChooserFactory.java b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/DirectoryChooserFactory.java new file mode 100644 index 0000000..dbe4005 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/DirectoryChooserFactory.java @@ -0,0 +1,28 @@ +package org.jcnc.jnotepad.ui.dialog.factory; + +import javafx.stage.DirectoryChooser; + +import java.io.File; + +/** + * @author : cccqyu + * @createTime 2023/10/2 1:49 + * @description 文件夹选择对话框工厂,该工厂接口用于创建文件夹选择对话框,包括原始和详细两种类型。 + */ +public interface DirectoryChooserFactory { + /** + * 创建原始文件选择对话框。 + * + * @return javafx.stage.DirectoryChooser 原始文件夹选择对话框对象 + */ + DirectoryChooser createDirectoryChooser(); + + /** + * 创建详细的文件选择对话框。 + * + * @param title 对话框标题 + * @param directory 初始目录 + * @return javafx.stage.FileChooser 详细文件选择对话框对象 + */ + DirectoryChooser createDirectoryChooser(String title, File directory); +} diff --git a/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/BasicDirectoryChooserFactory.java b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/BasicDirectoryChooserFactory.java new file mode 100644 index 0000000..20fb574 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/ui/dialog/factory/impl/BasicDirectoryChooserFactory.java @@ -0,0 +1,56 @@ +package org.jcnc.jnotepad.ui.dialog.factory.impl; + +import javafx.stage.DirectoryChooser; +import org.jcnc.jnotepad.ui.dialog.factory.DirectoryChooserFactory; + +import java.io.File; + +/** + * @author : cccqyu@outlook.com + * @createTime 2023/10/2 1:54 + * @description 基本文件夹选择对话框 + */ +public class BasicDirectoryChooserFactory implements DirectoryChooserFactory { + + private static final BasicDirectoryChooserFactory INSTANCE = new BasicDirectoryChooserFactory(); + + private BasicDirectoryChooserFactory() { + + } + + public static BasicDirectoryChooserFactory getInstance() { + return INSTANCE; + } + + /** + * 创建原始文件选择对话框。 + * + * @return javafx.stage.DirectoryChooser 原始文件夹选择对话框对象 + */ + @Override + public DirectoryChooser createDirectoryChooser() { + return new DirectoryChooser(); + } + + /** + * 创建详细的文件选择对话框。 + * + * @param title 对话框标题 + * @param directory 初始目录 + * @return javafx.stage.FileChooser 详细文件选择对话框对象 + */ + @Override + public DirectoryChooser createDirectoryChooser(String title, File directory) { + + DirectoryChooser directoryChooser= createDirectoryChooser(); + // 设置窗口名称 + directoryChooser.setTitle(title); + + if (directory != null) { + // 设置打开的目录 + directoryChooser.setInitialDirectory(directory); + } + + return directoryChooser; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/util/FileUtil.java b/src/main/java/org/jcnc/jnotepad/util/FileUtil.java new file mode 100644 index 0000000..df8b752 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/util/FileUtil.java @@ -0,0 +1,43 @@ +package org.jcnc.jnotepad.util; + +import org.jcnc.jnotepad.model.entity.DirFileModel; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author : cccqyu + * @createTime 2023/10/2 2:31 + * @description 文件工具类 + */ +public class FileUtil { + + /** + * 将文件夹转为DirFileModel + * + * @param file 文件 + * @return DirFileModel 存储文件夹与文件关系的实体类 + */ + public static DirFileModel getDirFileModel(File file) { + if (!file.exists()) { + return null; + } + + DirFileModel dirFileModel = new DirFileModel(file.getAbsolutePath(), file.getName(), new ArrayList<>()); + + File[] files = file.listFiles(); + if (files != null) { + for (File f : files) { + if (f.isDirectory()) { + DirFileModel childDirFileModel = getDirFileModel(f); + dirFileModel.getChildFile().add(childDirFileModel); + } else { + dirFileModel.getChildFile().add(new DirFileModel(f.getAbsolutePath(), f.getName(), null)); + } + } + } + + return dirFileModel; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java new file mode 100644 index 0000000..4970965 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java @@ -0,0 +1,92 @@ +package org.jcnc.jnotepad.views.manager; + +import javafx.scene.control.TreeItem; +import org.jcnc.jnotepad.model.entity.DirFileModel; +import org.jcnc.jnotepad.views.root.center.main.MainBorderPane; +import org.jcnc.jnotepad.views.root.center.main.center.directory.DirectorySidebarPane; + +import java.util.List; + +/** + * @author : cccqyu + * @createTime 2023/10/2 20:33 + * @description 文件树管理类 + */ +public class DirectorySidebarManager { + + private DirectorySidebarManager() { + } + + ; + /** + * 单例模式,保证只有一个 DirectorySidebar 实例 + */ + private static final DirectorySidebarManager INSTANCE = new DirectorySidebarManager(); + + + public static DirectorySidebarManager getInstance() { + return INSTANCE; + } + + private static final MainBorderPane MAIN_BORDER_PANE = MainBorderPane.getInstance(); + + private static final DirectorySidebarPane DIRECTORY_SIDEBAR_PANE = DirectorySidebarPane.getInstance(); + + /** + * 控制文件树显示 + * */ + public void controlShow() { + boolean isVisible = DIRECTORY_SIDEBAR_PANE.isVisible(); + // 设置自身显示 + DIRECTORY_SIDEBAR_PANE.setVisible(!isVisible); + if (isVisible) { + // 布局中移除 + MAIN_BORDER_PANE.setLeft(null); + } else { + MAIN_BORDER_PANE.setLeft(DIRECTORY_SIDEBAR_PANE); + } + + } + /** + * 控制文件树显示 + * @param bool 打开 + * */ + public void controlShow(boolean bool) { + // 设置自身显示 + DIRECTORY_SIDEBAR_PANE.setVisible(bool); + if (!MAIN_BORDER_PANE.getChildren().contains(DIRECTORY_SIDEBAR_PANE)) { + MAIN_BORDER_PANE.setLeft(DIRECTORY_SIDEBAR_PANE); + } + + } + + /** + * 设置文件树内容 + * @param dirFileModel 文件 + * */ + public void setTreeView(DirFileModel dirFileModel) { + TreeItem rootItem = new TreeItem(dirFileModel); + + DIRECTORY_SIDEBAR_PANE.setRoot(rootItem); + + expandFolder(dirFileModel, rootItem); + } + /** + * 递归展开 dirFileModel + * @param dirFileModel 文件 + * @param item 文件树子项内容 + * */ + private void expandFolder(DirFileModel dirFileModel, TreeItem item) { + List childFileList = dirFileModel.getChildFile(); + if (childFileList != null) { + for (DirFileModel childFile : childFileList) { + TreeItem childItem = new TreeItem<>(childFile); + item.getChildren().add(childItem); + expandFolder(childFile, childItem); + } + + } + } + + +} diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java index 022a4fe..b77d85c 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java @@ -4,6 +4,7 @@ import org.jcnc.jnotepad.views.root.RootBorderPane; import org.jcnc.jnotepad.views.root.bottom.RootBottomSideBarVerticalBox; import org.jcnc.jnotepad.views.root.center.main.MainBorderPane; import org.jcnc.jnotepad.views.root.left.sidebar.tools.ToolHorizontalBox; +import org.jcnc.jnotepad.views.root.left.sidebar.tools.ToolVerticalBox; import org.jcnc.jnotepad.views.root.right.RootRightSideBarVerticalBox; import org.jcnc.jnotepad.views.root.top.RootTopBorderPane; @@ -36,7 +37,8 @@ public class RootBorderPaneManager { // 中间,用于显示主界面 rootBorderPane.setCenterComponent(MainBorderPane.getInstance()); // 主界面的左边,工具栏 - rootBorderPane.setLeftComponent(ToolHorizontalBox.getInstance()); +// rootBorderPane.setLeftComponent(ToolHorizontalBox.getInstance()); + rootBorderPane.setLeftComponent(ToolVerticalBox.getInstance()); // 主界面的右边,侧边栏 rootBorderPane.setRightComponent(RootRightSideBarVerticalBox.getInstance()); // 主界面的上面,菜单栏 diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java index 054e590..c3828ed 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java @@ -3,6 +3,7 @@ package org.jcnc.jnotepad.views.manager; import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import org.jcnc.jnotepad.controller.event.handler.setting.DirTreeBtn; import org.jcnc.jnotepad.controller.event.handler.setting.SetBtn; import org.jcnc.jnotepad.views.manager.builder.SideBarButtonBuilder; import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar; @@ -43,9 +44,20 @@ public class SidebarToolBarManager extends AbstractManager { .setImageViewEssentialAttribute(10D, 10D, true, 2.5D, 2.5D) .setButtonEssentialAttribute(20D, 20D) .setEventHandler(new SetBtn()).build()); + // 注册文件树按钮 + registerNode( + new SideBarButtonBuilder() + .setButton(sidebarToolBar.getDirTreeButton()) + .setImageView(new ImageView(new Image("directory.png"))) + .setImageViewEssentialAttribute(10D, 10D, true, 2.5D, 2.5D) + .setButtonEssentialAttribute(20D, 20D) + .setEventHandler(new DirTreeBtn()).build()); + } + + /** * 获取节点列表 * diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/TopMenuBarManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/TopMenuBarManager.java index c74bf91..3b608ba 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/TopMenuBarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/TopMenuBarManager.java @@ -23,6 +23,7 @@ import org.slf4j.Logger; import java.util.*; import static org.jcnc.jnotepad.common.constants.TextConstants.*; +import static org.jcnc.jnotepad.common.constants.TextConstants.OPEN_DIRECTORY; /** * 顶部菜单栏管理类 @@ -89,6 +90,8 @@ public class TopMenuBarManager extends AbstractManager { registerFileMenuItem(topMenuBar.getSaveItem(), SAVE, "saveItem", new SaveFile()); registerFileMenuItem(topMenuBar.getSaveAsItem(), SAVE_AS, "saveAsItem", new SaveAsFile()); registerFileMenuItem(topMenuBar.getRenameItem(), RENAME, "renameItem", new RenameFile()); + // 打开文件夹按钮 + registerFileMenuItem(topMenuBar.getOpenDirItem(), OPEN_DIRECTORY, "openDirItem", new OpenDirectory()); // 语言菜单 registerLanguageMenuItem(topMenuBar.getChineseItem(), UPPER_CHINESE, Locale.CHINESE, this::toggleLanguage); diff --git a/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/directory/DirectorySidebarPane.java b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/directory/DirectorySidebarPane.java new file mode 100644 index 0000000..823951c --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/views/root/center/main/center/directory/DirectorySidebarPane.java @@ -0,0 +1,49 @@ +package org.jcnc.jnotepad.views.root.center.main.center.directory; + +import javafx.event.EventHandler; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; +import javafx.scene.input.MouseEvent; +import org.jcnc.jnotepad.controller.event.handler.menubar.OpenFile; +import org.jcnc.jnotepad.model.entity.DirFileModel; + +import java.io.File; +import java.util.Objects; + + +/** + * @author : cccqyu + * @createTime 2023/10/2 20:34 + * @description TreeView封装 + */ +public class DirectorySidebarPane extends TreeView { + + private static final DirectorySidebarPane INSTANCE = new DirectorySidebarPane(); + + private DirectorySidebarPane() { + this.setVisible(false); + + this.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent mouseEvent) { + if (mouseEvent.getClickCount() == 2) { + TreeItem item = DirectorySidebarPane.this.getSelectionModel().getSelectedItem(); + if (Objects.isNull(item)) return; + File file = new File(item.getValue().getPath()); + + if(!file.isFile()){ + return; + } + new OpenFile().openFile(file); + + } + } + }); + } + + public static DirectorySidebarPane getInstance() { + return INSTANCE; + } + + +} diff --git a/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/SidebarToolBar.java b/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/SidebarToolBar.java index 3f8d278..c1f2927 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/SidebarToolBar.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/SidebarToolBar.java @@ -1,5 +1,6 @@ package org.jcnc.jnotepad.views.root.left.sidebar.tools; +import javafx.geometry.Orientation; import javafx.scene.control.Button; /** @@ -22,7 +23,14 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar { */ Button setButton = new Button(); + /** + * 工具栏上的文件树 + */ + Button dirTreeButton = new Button(); + private SidebarToolBar() { + // 垂直排列 + this.setOrientation(Orientation.VERTICAL); } /** @@ -42,4 +50,13 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar { public Button getSetButton() { return setButton; } + + /** + * 获取工具栏上的文件树按钮。 + * + * @return 文件树按钮 + */ + public Button getDirTreeButton() { + return dirTreeButton; + } } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/ToolVerticalBox.java b/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/ToolVerticalBox.java new file mode 100644 index 0000000..7caf915 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/ToolVerticalBox.java @@ -0,0 +1,35 @@ +package org.jcnc.jnotepad.views.root.left.sidebar.tools; + +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import org.jcnc.jnotepad.ui.module.AbstractVerticalBox; + +/** + * @author : cccqyu + * @createTime 2023/10/2 20:40 + * @description 垂直布局 + */ +public class ToolVerticalBox extends AbstractVerticalBox { + /** + * 单例模式,保证只有一个 ToolVBox 实例 + */ + private static final ToolVerticalBox INSTANCE = new ToolVerticalBox(); + + private ToolVerticalBox() { + // 设置子节点垂直拉伸 + VBox.setVgrow(SidebarToolBar.getInstance(), Priority.ALWAYS); + + // 将 JNotepadToolBar 添加为子节点 + getChildren().add(SidebarToolBar.getInstance()); + getStyleClass().add("tool-vertical-box"); + } + + /** + * 获取 ToolVBox 的单例实例。 + * + * @return ToolVBox 的单例实例 + */ + public static ToolVerticalBox getInstance() { + return INSTANCE; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java b/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java index 12c0f9f..c1a8d92 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/top/menu/TopMenuBar.java @@ -59,6 +59,10 @@ public class TopMenuBar extends MenuBar { * 打开 */ private final MenuItem openItem = new MenuItem(); + /** + * 打开文件夾 + */ + private final MenuItem openDirItem = new MenuItem(); /** * 另存为 */ @@ -198,4 +202,8 @@ public class TopMenuBar extends MenuBar { public MenuItem getPluginManagerItem() { return pluginManagerItem; } + + public MenuItem getOpenDirItem() { + return openDirItem; + } } diff --git a/src/main/resources/css/styles.css b/src/main/resources/css/styles.css index 95404b1..73133ff 100644 --- a/src/main/resources/css/styles.css +++ b/src/main/resources/css/styles.css @@ -19,7 +19,11 @@ -fx-border-width: 0 1 0 0; -fx-border-color: -color-border-default; } - +/*左侧边栏*/ +.tool-horizontal-box { + -fx-border-width: 0 1 0 0; + -fx-border-color: -color-border-default; +} .paragraph-box .has-caret { -fx-background-color: -color-neutral-muted diff --git a/src/main/resources/directory.png b/src/main/resources/directory.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8e73d7f295a5cbdb1a8d600f12403b6399b154 GIT binary patch literal 1079 zcmV-71jze|P)Px&@kvBMRCr$PTTO@*M-=|vOf+EpgRqC>wBStDu8PUBYxf2(1|gb2f*^|MMTw|r z5)qQKYX}5FVtx=zvIpZy(2xWLe=fRS)b4d9As|yV3(V15{3J?$3|_;aU$k~lwZg39S{A;z9u-aQ`-6T<$I!21Ba3_`veA9Xg2EPy!>F3!#_ zd;j6XiGMmLKv>Tz@@M`=xlyV00uJlTb$+(;PHysNg(o-wzfub7nOE*)%xxk0kJ1t<6vN5w4V!wvmmP6 zafo?;EcOZo%}OQqHl&5Kyc=*^M_VDqx;a`N=m80aXkv z>M39pV5Wen0j3C=yMVb3nstC#2$_{&upu%_VY3%7n<29sG}~eGJYexY5D~(9jR=RC z)1PU5=W*hm2MA&BCh&O>wkYM^NE`uv!kLV{a(ddC37&eH-C)vogF@J60e%!TbtFy! z(m&p>TJswMk~Rert$_ai*H^!|bm>z7*OYdPC(((T0#aH#!MMP{X|3H47X<;uq&z;- z?sS=n`UqI(kE`xTUGNH!(z*o3yX^=lea}xA^tsmV*I^by{v29e!VBLf*ID54jgrFp z1HgvT@i;Ck<-XVMbof^Q+slLg)7lzenDHP7H6cK6)b(0-I$YN%%{)QOC*uh*9#l@J z`oP!;6knB#QrMQuxz}4Npxjk)58zkh32&ZIiH|5Xd8XETPuu0^DRqDHH*J+``iF^f zSJxQ0+~PWa(Rb;YX91cbrgOQx^J6oRw*MKDa?=Vb%no-M#k`micxKru{5dr>HPY9K literal 0 HcmV?d00001 diff --git a/src/main/resources/i18n/i18n.properties b/src/main/resources/i18n/i18n.properties index f9a767e..05d1515 100644 --- a/src/main/resources/i18n/i18n.properties +++ b/src/main/resources/i18n/i18n.properties @@ -9,6 +9,7 @@ PLUGIN=插件 CHINESE=中文 title=JNotepad OPEN=打开 +OPEN_DIRECTORY=打开文件夹 ABOUT=关于 HELP=帮助 OPEN_CONFIGURATION_FILE=打开配置文件 diff --git a/src/main/resources/i18n/i18n_en.properties b/src/main/resources/i18n/i18n_en.properties index f09df8f..2da0e7a 100644 --- a/src/main/resources/i18n/i18n_en.properties +++ b/src/main/resources/i18n/i18n_en.properties @@ -10,6 +10,7 @@ PLUGIN=Plugins CHINESE=Chinese title=JNotepad OPEN=Open +OPEN_DIRECTORY=Open Directory HELP=Help OPEN_CONFIGURATION_FILE=Open Configuration File RENAME=Rename diff --git a/src/main/resources/i18n/i18n_zh_CN.properties b/src/main/resources/i18n/i18n_zh_CN.properties index e9d8ba7..18f234a 100644 --- a/src/main/resources/i18n/i18n_zh_CN.properties +++ b/src/main/resources/i18n/i18n_zh_CN.properties @@ -9,6 +9,7 @@ PLUGIN=插件 CHINESE=中文 title=JNotepad OPEN=打开 +OPEN_DIRECTORY=打开文件夹 HELP=帮助 ABOUT=关于 OPEN_CONFIGURATION_FILE=打开配置文件