diff --git a/README.md b/README.md
index ddd69967499860b4087664f6c5d846246747e2a8..66fa53620c34bc10bf96a77f9e4ad58559ab57da 100644
--- a/README.md
+++ b/README.md
@@ -102,7 +102,7 @@ JNotepad使用Java语言编写,并基于JavaFX框架开发,具有良好的
- `设置 > 语言`:切换语言。
-- `插件 > 增加插件`:(管理插件系统,待完善)。
+- `插件 > 增加插件`:管理插件系统。
## 依赖项
@@ -128,7 +128,7 @@ POM文件中的全部依赖项:
- MacOS 平台

-### 参与贡献
+# 参与贡献
1. 加入JCNC社区
1. [阅读JCNC开发者文档][docs-url]
diff --git a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
index 60a461047d2d64221b9861379308dcf2c28fab96..c6ef7b75ad9f00874f684a2d3851e07788476db0 100644
--- a/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
+++ b/src/main/java/org/jcnc/jnotepad/app/config/AppConfig.java
@@ -41,7 +41,7 @@ public class AppConfig {
shortcutKeys.add(createShortcutKey("saveAsItem", CTRL_ALT_S));
shortcutKeys.add(createShortcutKey("lineFeedItem", ""));
shortcutKeys.add(createShortcutKey("openConfigItem", ALT_S));
- shortcutKeys.add(createShortcutKey("addItem", ""));
+ shortcutKeys.add(createShortcutKey("pluginManager", ""));
shortcutKeys.add(createShortcutKey("countItem", ""));
myData.setShortcutKey(shortcutKeys);
return myData;
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 535b59b07d703c25045ec6beb155d3ab37e099e0..0c8c5140db70cd0feb2d08192ef1d9c5771035a6 100644
--- a/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java
+++ b/src/main/java/org/jcnc/jnotepad/common/constants/TextConstants.java
@@ -18,7 +18,7 @@ public class TextConstants {
public static final String SET = "SET";
public static final String WORD_WRAP = "WORD_WRAP";
public static final String PLUGIN = "PLUGIN";
- public static final String ADD_PLUGIN = "ADD_PLUGIN";
+ public static final String MANAGER_PLUGIN = "MANAGER_PLUGIN";
public static final String STATISTICS = "STATISTICS";
public static final String OPEN_CONFIGURATION_FILE = "OPEN_CONFIGURATION_FILE";
public static final String TOP = "TOP";
diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/CustomSplitPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/CustomSplitPane.java
new file mode 100644
index 0000000000000000000000000000000000000000..73fd2cd17838ac826f7039bd383c80215f2705b1
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/CustomSplitPane.java
@@ -0,0 +1,63 @@
+package org.jcnc.jnotepad.ui.pluginstage;
+
+import javafx.geometry.Orientation;
+import javafx.scene.control.SplitPane;
+import javafx.scene.layout.HBox;
+
+/**
+ * 自定义分割面板,用于将两个组件以水平方向分割显示。
+ *
+ *
该分割面板包含左侧和右侧两个区域,可分别设置内容。
+ *
+ * @author luke
+ */
+public class CustomSplitPane extends SplitPane {
+
+ private final HBox leftBox;
+ private final HBox rightBox;
+
+ /**
+ * 创建一个自定义分割面板,指定左侧和右侧的文本标签。
+ *
+ * @param leftText 左侧区域的文本标签
+ * @param rightText 右侧区域的文本标签
+ */
+ public CustomSplitPane(String leftText, String rightText) {
+ // 创建左侧和右侧的框
+ leftBox = createBox(leftText);
+ rightBox = createBox(rightText);
+
+ // 设置水平分割面板的属性
+ this.setOrientation(Orientation.HORIZONTAL);
+ this.setDividerPositions(0.5);
+
+ // 添加左侧和右侧的框到分割面板
+ this.getItems().addAll(leftBox, rightBox);
+ }
+
+ private HBox createBox(String text) {
+ HBox box = new HBox();
+ box.getChildren().add(new javafx.scene.control.Label(text));
+ return box;
+ }
+
+ /**
+ * 设置左侧区域的内容。
+ *
+ * @param content 左侧区域的内容节点
+ */
+ public void setLeftContent(javafx.scene.Node content) {
+ leftBox.getChildren().clear();
+ leftBox.getChildren().add(content);
+ }
+
+ /**
+ * 设置右侧区域的内容。
+ *
+ * @param content 右侧区域的内容节点
+ */
+ public void setRightContent(javafx.scene.Node content) {
+ rightBox.getChildren().clear();
+ rightBox.getChildren().add(content);
+ }
+}
diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c5b3e9fe2758536b3510378ecdfed7efd64ab09
--- /dev/null
+++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java
@@ -0,0 +1,145 @@
+package org.jcnc.jnotepad.ui.pluginstage;
+
+import atlantafx.base.controls.Tile;
+import atlantafx.base.controls.ToggleSwitch;
+import atlantafx.base.theme.PrimerLight;
+import javafx.application.Application;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TabPane;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.VBox;
+import org.jcnc.jnotepad.util.LogUtil;
+import org.slf4j.Logger;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 插件管理面板,用于管理插件的市场、已安装和设置功能。
+ *
+ * 此面板包含一个自定义分割面板,用于显示不同的插件管理选项卡内容。
+ *
+ * @author luke
+ */
+public class PluginManagementPane extends BorderPane {
+
+ Logger logger = LogUtil.getLogger(this.getClass());
+
+
+ private CustomSplitPane customSplitPane;
+ private final Map tileContentMap = new HashMap<>();
+
+ /**
+ * 创建一个插件管理面板的实例。
+ */
+ public PluginManagementPane() {
+ init();
+ }
+
+ /**
+ * 初始化插件管理面板。
+ */
+ private void init() {
+ // 创建选项卡面板
+ TabPane tabPane = new TabPane();
+
+ // 创建市场、已安装和设置选项卡
+ Tab marketTab = new Tab("市场");
+ Tab installedTab = new Tab("已安装");
+ Tab myTab = new Tab("设置");
+
+ // 禁用选项卡关闭按钮
+ marketTab.setClosable(false);
+ installedTab.setClosable(false);
+ myTab.setClosable(false);
+
+ // 创建选项卡内容面板
+ BorderPane marketTabContent = new BorderPane();
+ BorderPane installedTabContent = new BorderPane();
+ BorderPane myTabContent = new BorderPane();
+
+ // 创建自定义分割面板
+ customSplitPane = new CustomSplitPane("", "");
+ marketTabContent.setCenter(customSplitPane);
+
+ // 获取插件列表
+ var box = getBox();
+ customSplitPane.setLeftContent(box);
+
+ // 创建示例按钮并添加到已安装和设置选项卡中
+ installedTabContent.setCenter(new Button("2"));
+ myTabContent.setCenter(new Button("3"));
+
+ // 将选项卡内容设置到选项卡中
+ marketTab.setContent(marketTabContent);
+ installedTab.setContent(installedTabContent);
+ myTab.setContent(myTabContent);
+
+ // 将选项卡添加到选项卡面板中
+ tabPane.getTabs().addAll(marketTab, installedTab, myTab);
+
+ // 将选项卡面板设置为插件管理面板的中心内容
+ this.setCenter(tabPane);
+ }
+
+ /**
+ * 创建包含插件列表的VBox。
+ *
+ * @return 包含插件列表的VBox
+ */
+ private VBox getBox() {
+ // 创建示例插件列表项
+ var tile1 = createTile("运行插件", "这是一个运行插件\t\t\t\t\t\t\t ");
+ var tile2 = createTile("终端插件", "这是一个终端插件");
+ var tile3 = createTile("构建插件", "这是一个构建插件");
+
+ // 创建VBox并将插件列表项添加到其中
+ var box = new VBox(tile1, tile2, tile3);
+
+ return box;
+ }
+
+ /**
+ * 创建插件列表项Tile。
+ *
+ * @param title 插件标题
+ * @param description 插件描述
+ * @return 创建的插件列表项Tile
+ */
+ private Tile createTile(String title, String description) {
+ var tile = new Tile(title, description);
+ var tgl = new ToggleSwitch();
+
+ // 设置Tile的操作和操作处理程序
+ tile.setAction(tgl);
+ tile.setActionHandler(() -> {
+ customSplitPane.setRightContent(tileContentMap.get(tile));
+ logger.info("点击了" + tile);
+
+ });
+
+ // 创建专属的customSplitPane内容
+ var content = createCustomSplitPaneContent(title);
+
+
+ // 将内容与Tile关联起来
+ tileContentMap.put(tile, content);
+
+ return tile;
+ }
+
+ /**
+ * 创建专属于每个插件的CustomSplitPane内容。
+ *
+ * @param title 插件标题
+ * @return 创建的CustomSplitPane内容
+ */
+ private Node createCustomSplitPaneContent(String title) {
+ // TODO: 2023/9/23 未完成
+ return new Label("详情" + title);
+
+ }
+}
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 a826e91a64ade7556c20c9ad1378a4878d4beff5..18e1bb5116a3e7ab1494af9f11e2c71f8a08cea5 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
@@ -2,6 +2,7 @@ package org.jcnc.jnotepad.views.root.top.menu;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
+import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.stage.Stage;
@@ -11,7 +12,7 @@ import org.jcnc.jnotepad.controller.event.handler.menubar.*;
import org.jcnc.jnotepad.controller.event.handler.util.SetBtn;
import org.jcnc.jnotepad.controller.i18n.LocalizationController;
import org.jcnc.jnotepad.model.entity.ShortcutKey;
-import org.jcnc.jnotepad.plugin.PluginManagerInterface;
+import org.jcnc.jnotepad.ui.pluginstage.PluginManagementPane;
import org.jcnc.jnotepad.util.LogUtil;
import org.jcnc.jnotepad.util.UiUtil;
import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab;
@@ -90,7 +91,7 @@ public class TopMenuBar extends MenuBar {
/**
* 增加
*/
- private MenuItem addItem;
+ private MenuItem pluginManagerItem;
/**
* 查看
*/
@@ -268,21 +269,27 @@ public class TopMenuBar extends MenuBar {
pluginMenu = new Menu();
UiResourceBundle.bindStringProperty(pluginMenu.textProperty(), PLUGIN);
- addItem = new MenuItem();
- addItem.setOnAction(event -> {
- PluginManagerInterface pluginManagerInterface = PluginManagerInterface.getInstance();
- Stage stage = new Stage();
- stage.getIcons().add(UiUtil.getAppIcon());
- pluginManagerInterface.start(stage);
+ pluginManagerItem = new MenuItem();
+ pluginManagerItem.setOnAction(event -> {
+ Stage newStage = new Stage();
+ newStage.getIcons().add(UiUtil.getAppIcon());
+ newStage.setTitle("插件管理");
+
+ PluginManagementPane pluginManagementPane = new PluginManagementPane();
+
+ Scene scene = new Scene(pluginManagementPane, 900, 500);
+ newStage.setScene(scene);
+ newStage.show();
});
- UiResourceBundle.bindStringProperty(addItem.textProperty(), ADD_PLUGIN);
- itemMap.put("addItem", addItem);
+
+ UiResourceBundle.bindStringProperty(pluginManagerItem.textProperty(), MANAGER_PLUGIN);
+ itemMap.put("pluginManager", pluginManagerItem);
countItem = new MenuItem();
UiResourceBundle.bindStringProperty(countItem.textProperty(), STATISTICS);
itemMap.put("countItem", countItem);
- pluginMenu.getItems().addAll(addItem, countItem);
+ pluginMenu.getItems().addAll(pluginManagerItem, countItem);
}
/**
diff --git a/src/main/resources/i18n/i18n.properties b/src/main/resources/i18n/i18n.properties
index 8410a52856f904d11f437d1c05d85890462ee7fb..0c898793db923898f4e65282c6b47b871734a237 100644
--- a/src/main/resources/i18n/i18n.properties
+++ b/src/main/resources/i18n/i18n.properties
@@ -18,5 +18,5 @@ SAVE_AS=另存为
SAVE=保存
ROW=行数
FILE=文件
-ADD_PLUGIN=增加插件
+MANAGER_PLUGIN=管理插件
ENCODE=编码
diff --git a/src/main/resources/i18n/i18n_en.properties b/src/main/resources/i18n/i18n_en.properties
index 3456b3565a0b2e82bd8e6afb36067b8f891bf024..e37eab2f804857a4b4ad65d389bb2941f2cb4327 100644
--- a/src/main/resources/i18n/i18n_en.properties
+++ b/src/main/resources/i18n/i18n_en.properties
@@ -18,5 +18,5 @@ SAVE_AS=Save As
SAVE=Save
ROW=Row
FILE=File
-ADD_PLUGIN=Add Plugin
+MANAGER_PLUGIN=Manager Plugin
ENCODE=Encoding
\ No newline at end of file
diff --git a/src/main/resources/i18n/i18n_zh_CN.properties b/src/main/resources/i18n/i18n_zh_CN.properties
index 8410a52856f904d11f437d1c05d85890462ee7fb..1fbb8bb2da52e7764ee7adb0921e22823e6cea19 100644
--- a/src/main/resources/i18n/i18n_zh_CN.properties
+++ b/src/main/resources/i18n/i18n_zh_CN.properties
@@ -18,5 +18,5 @@ SAVE_AS=另存为
SAVE=保存
ROW=行数
FILE=文件
-ADD_PLUGIN=增加插件
+MANAGER_PLUGIN=插件管理
ENCODE=编码