diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index c0fec9e524fafc1587ea10de8379a17e8fcd1f34..8cefcaad530ff3909332959730a9fec1e4e939bd 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -47,5 +47,6 @@ module org.jcnc.jnotepad { exports org.jcnc.jnotepad.component.module.hbox; exports org.jcnc.jnotepad.component.stage.topmenu.help; exports org.jcnc.jnotepad.component.stage.topmenu.plugin; + exports org.jcnc.jnotepad.component.module.vbox.components; } \ No newline at end of file diff --git a/src/main/java/org/jcnc/jnotepad/common/constants/SplitPaneItemConstants.java b/src/main/java/org/jcnc/jnotepad/common/constants/SplitPaneItemConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..abb36efb75c9ee2bb50becd939d8fa2e7b24f6d1 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/common/constants/SplitPaneItemConstants.java @@ -0,0 +1,25 @@ +package org.jcnc.jnotepad.common.constants; + +/** + * SplitPane常量类 + * * + *

用于记录SplitPane中子组件的索引

+ * + * @author cccqyu + */ +public class SplitPaneItemConstants { + + // rootSplitPane + + // 上部 + public static final int ROOT_SPLIT_PANE_TOP_SPLIT_PANE = 0; + // 底部 + public static final int ROOT_SPLIT_PANE_CMDBox = 1; + + // rootSplitPane中的上部面板 + // 左侧 + public static final int TOP_SPLIT_PANE_DIRECTORY_SIDEBAR_PANE = 0; + // 右侧 + public static final int TOP_SPLIT_PANE_CENTER_TAB_PANE = 1; + +} diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java new file mode 100644 index 0000000000000000000000000000000000000000..11702466d968ded851ec6795fe1c0f0fdd81d737 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/component/module/vbox/BuildPanel.java @@ -0,0 +1,58 @@ +package org.jcnc.jnotepad.component.module.vbox; + +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import org.jcnc.jnotepad.component.module.vbox.components.DebugBox; +import org.jcnc.jnotepad.component.module.vbox.components.CmdTerminalBox; +import org.jcnc.jnotepad.component.module.vbox.components.RunBox; + +/** + * 底部Run,Debug,Cmd面板 + * + * + * @author cccqyu + */ +public class BuildPanel extends TabPane { + + private static BuildPanel instance = null; + + public static BuildPanel getInstance() { + + if (instance == null) { + instance = new BuildPanel(); + } + return instance; + } + + private final CmdTerminalBox cmdTerminalBox; + private final RunBox runBox; + private final DebugBox debugBox; + + private BuildPanel() { + cmdTerminalBox = new CmdTerminalBox(); + runBox = new RunBox(); + debugBox = new DebugBox(); + + Tab runTab = new Tab("运行",runBox); + runTab.setClosable(false); + + Tab buildTab = new Tab("构建", debugBox); + buildTab.setClosable(false); + + Tab cmdTab = new Tab("控制台",cmdTerminalBox); + cmdTab.setClosable(false); + this.getTabs().addAll(runTab,buildTab,cmdTab); + } + + public CmdTerminalBox getCmdTerminalBox() { + return cmdTerminalBox; + } + + public RunBox getRunBox() { + return runBox; + } + + public DebugBox getBuildBox() { + return debugBox; + } +} diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/CmdTerminalBox.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java similarity index 98% rename from src/main/java/org/jcnc/jnotepad/component/module/vbox/CmdTerminalBox.java rename to src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java index fe1f1dd756657d2563a17c1cee3f093c283ce108..3d7951adff16651e0765c118fe03ba00bf5fd18c 100644 --- a/src/main/java/org/jcnc/jnotepad/component/module/vbox/CmdTerminalBox.java +++ b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/CmdTerminalBox.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.component.module.vbox; +package org.jcnc.jnotepad.component.module.vbox.components; import javafx.animation.KeyFrame; import javafx.animation.Timeline; diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/DebugBox.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/DebugBox.java new file mode 100644 index 0000000000000000000000000000000000000000..f6d59e5459013e65f363a61780398abc08b80940 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/DebugBox.java @@ -0,0 +1,20 @@ +package org.jcnc.jnotepad.component.module.vbox.components; + +import org.jcnc.jnotepad.component.module.TextCodeArea; + +/** + * Debug终端界面。 + * + * + * @author cccqyu + */ +public class DebugBox extends TextCodeArea { + public DebugBox() { + super(); + this.setEditable(false); + } + + public void setText(String text) { + this.appendText(text); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/RunBox.java b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/RunBox.java new file mode 100644 index 0000000000000000000000000000000000000000..a35cea1f4f733128f817b213c8416ab171e02f10 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/component/module/vbox/components/RunBox.java @@ -0,0 +1,23 @@ +package org.jcnc.jnotepad.component.module.vbox.components; + +import org.jcnc.jnotepad.component.module.TextCodeArea; + +/** + * Run终端界面。 + * + * + * @author cccqyu + */ +public class RunBox extends TextCodeArea { + + + public RunBox() { + super(); + this.setEditable(false); + } + + public void setText(String text) { + this.appendText(text); + } + +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java index 3c917cc1f766d49fd2c58ebca0733d5c21d50dfa..2548596cdd9e35175d590bf15d867b3dc2f6d0df 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java @@ -3,15 +3,20 @@ package org.jcnc.jnotepad.controller.event.handler.toolbar; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import org.jcnc.jnotepad.views.manager.BuildPanelManager; /** - * @author luke + * 终端处理器 + * + * + * @author cccqyu */ public class RunBtn implements EventHandler { - @Override - public void handle(ActionEvent actionEvent) { - // TODO: 2023/10/6 点击按钮,打开下方侧边栏的运行输出栏 + private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance(); + @Override + public void handle(ActionEvent event) { + BUILD_PANEL_MANAGER.controlShow(); } } diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java new file mode 100644 index 0000000000000000000000000000000000000000..ce6f7b22a3c2660c8a1b87fa51f9b78b7c8e0379 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/views/manager/BuildPanelManager.java @@ -0,0 +1,68 @@ +package org.jcnc.jnotepad.views.manager; + +import javafx.scene.control.SplitPane; +import org.jcnc.jnotepad.component.module.TextCodeArea; +import org.jcnc.jnotepad.views.root.center.main.MainBorderPane; + +/** + * 构建底部三大菜单管理类 + * + *

管理构建三大菜单操作

+ * + * @author cccqyu + */ +public class BuildPanelManager { + + private BuildPanelManager() { + } + + /** + * 单例模式,保证只有一个 BuildPanelManager 实例 + */ + private static final BuildPanelManager INSTANCE = new BuildPanelManager(); + + + public static BuildPanelManager getInstance() { + return INSTANCE; + } + + + private static final MainBorderPane MAIN_BORDER_PANE = MainBorderPane.getInstance(); + private static boolean isShow = false; + + /** + * 控制终端显示 + */ + public void controlShow() { + + // 获取root分割面板 + SplitPane root = (SplitPane) MAIN_BORDER_PANE.getCenter(); + + if (isShow) { + root.setDividerPositions(1); + } else { + // 展开分割条,文件树 + root.setDividerPositions(0.7); + } + isShow = !isShow; + } + + public void controlShow(boolean bool) { + + // 获取root分割面板 + SplitPane root = (SplitPane) MAIN_BORDER_PANE.getCenter(); + + if (!bool) { + root.setDividerPositions(1); + } else { + // 展开分割条,文件树 + root.setDividerPositions(0.7); + } + isShow = !isShow; + } + + public void setText(TextCodeArea textCodeArea, String text) { + textCodeArea.appendText(text); + } + +} diff --git a/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java b/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java index dc93ca024f65b61f639bc9d192b9958bce2bff92..ac8473bc5c20947a153ee868727be6d3dcf79227 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java @@ -3,6 +3,7 @@ package org.jcnc.jnotepad.views.manager; import javafx.beans.value.ChangeListener; import javafx.scene.control.SplitPane; import javafx.scene.control.TreeItem; +import org.jcnc.jnotepad.common.constants.SplitPaneItemConstants; import org.jcnc.jnotepad.common.manager.ApplicationCacheManager; import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory; import org.jcnc.jnotepad.model.entity.DirFileModel; @@ -44,26 +45,25 @@ public class DirectorySidebarManager { private static final double LAST_DIVIDER_POSITION = 0.3; + private static boolean isShow = false; + /** * 控制文件树显示 */ public void controlShow() { - // 获取分割面板 - SplitPane center = (SplitPane) MAIN_BORDER_PANE.getCenter(); - // 获取分割条位置 - double dividerPosition = center.getDividerPositions()[0]; - // 保留分割条位置一位小数 - String formattedNumber = String.format("%.1f", dividerPosition); - double roundedNumber = Double.parseDouble(formattedNumber); - - // 分割条位置不等于 代表展开 - if (Double.compare(roundedNumber, 0.0) != 0) { - // 收缩分割条 收缩文件树 - center.setDividerPositions(0.0); + // 获取root分割面板 + SplitPane root = (SplitPane) MAIN_BORDER_PANE.getCenter(); + + // 获取root的上部分割面板 + SplitPane topSplitPane = (SplitPane) root.getItems().get(SplitPaneItemConstants.ROOT_SPLIT_PANE_TOP_SPLIT_PANE); + + if (isShow) { + topSplitPane.setDividerPositions(0); } else { // 展开分割条,文件树 - center.setDividerPositions(LAST_DIVIDER_POSITION); + topSplitPane.setDividerPositions(LAST_DIVIDER_POSITION); } + isShow = !isShow; } /** @@ -74,10 +74,13 @@ public class DirectorySidebarManager { public void controlShow(boolean bool) { if (bool) { // 获取分割面板 - SplitPane center = (SplitPane) MAIN_BORDER_PANE.getCenter(); - center.setDividerPositions(LAST_DIVIDER_POSITION); - } + SplitPane root = (SplitPane) MAIN_BORDER_PANE.getCenter(); + // 获取root的上部分割面板 + SplitPane topSplitPane = (SplitPane) root.getItems().get(SplitPaneItemConstants.ROOT_SPLIT_PANE_TOP_SPLIT_PANE); + topSplitPane.setDividerPositions(LAST_DIVIDER_POSITION); + isShow = true; + } } /** 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 bf0e08c5b11c36a7b9d14e2c551db36a88a588a2..449888baa1cd6898cfa67f97f47c71deecbcf661 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/MainBorderPaneManager.java @@ -1,6 +1,9 @@ package org.jcnc.jnotepad.views.manager; +import javafx.geometry.Orientation; import javafx.scene.control.SplitPane; +import org.jcnc.jnotepad.common.constants.SplitPaneItemConstants; +import org.jcnc.jnotepad.component.module.vbox.BuildPanel; import org.jcnc.jnotepad.views.root.center.main.MainBorderPane; import org.jcnc.jnotepad.views.root.center.main.center.directory.DirectorySidebarPane; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTabPane; @@ -17,7 +20,8 @@ public class MainBorderPaneManager { private static final DirectorySidebarPane DIRECTORY_SIDEBAR_PANE = DirectorySidebarPane.getInstance(); // 默认分割条位置 - private static final double defaultDividerPositions = 0.3; + private static final double TOP_SPLIT_PANEL_DEFAULT_DIVIDER_POSITIONS = 0.3; + private MainBorderPaneManager() { } @@ -27,13 +31,30 @@ public class MainBorderPaneManager { } public void initMainBorderPane() { + // 总分割面板 + SplitPane rootSplitPane = new SplitPane(); + // 设置上下布局 + rootSplitPane.setOrientation(Orientation.VERTICAL); + rootSplitPane.setDividerPositions(1); + + + // 上部面板 // 文件树和文本框的布局 - SplitPane splitPane = new SplitPane(); - splitPane.getItems().add(0, DIRECTORY_SIDEBAR_PANE); - splitPane.getItems().add(1, CenterTabPane.getInstance()); - splitPane.setDividerPositions(defaultDividerPositions); + SplitPane topSplitPane = new SplitPane(); + topSplitPane.getItems().add(SplitPaneItemConstants.TOP_SPLIT_PANE_DIRECTORY_SIDEBAR_PANE, DIRECTORY_SIDEBAR_PANE); + topSplitPane.getItems().add(SplitPaneItemConstants.TOP_SPLIT_PANE_CENTER_TAB_PANE, CenterTabPane.getInstance()); + topSplitPane.setDividerPositions(TOP_SPLIT_PANEL_DEFAULT_DIVIDER_POSITIONS); + + // 下部 + // 构建三大菜单 + BuildPanel buildPanel = BuildPanel.getInstance(); + + rootSplitPane.getItems().add(SplitPaneItemConstants.ROOT_SPLIT_PANE_TOP_SPLIT_PANE, topSplitPane); + rootSplitPane.getItems().add(SplitPaneItemConstants.ROOT_SPLIT_PANE_CMDBox, buildPanel); + + // 将总分割面板设置在布局中部 + MAIN_BORDER_PANE.setCenterComponent(rootSplitPane); + - // 将文件树以及文本框设置在布局中部 - MAIN_BORDER_PANE.setCenterComponent(splitPane); } } 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 90a508c49e68353fcf20662858bf836c0d0caadd..010c100b795fae11d65f38670403749a5de85677 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java @@ -54,10 +54,13 @@ public class SidebarToolBarManager extends AbstractManager { .setImageViewEssentialAttribute(10D, 10D, true, 2.5D, 2.5D) .setButtonEssentialAttribute(20D, 20D) .setEventHandler(new DirTreeBtn()).build()); + + + // Cmd 按钮 registerNode( new SideBarButtonBuilder() .setButton(sidebarToolBar.getRunButton()) - .setImageView(new ImageView(new Image("directory.png"))) + .setImageView(new ImageView(new Image("cmd.png"))) .setImageViewEssentialAttribute(10D, 10D, true, 2.5D, 2.5D) .setButtonEssentialAttribute(20D, 20D) .setEventHandler(new RunBtn()).build()); 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 c45a5539fd99b6a8a7a1ae0e7998a40391b09dbf..b1a94d9f8f6029d13cd32e7b28fa57dc1f5251ac 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 @@ -4,9 +4,10 @@ import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; -import javafx.scene.control.TextArea; import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; +import org.jcnc.jnotepad.component.module.vbox.BuildPanel; import org.jcnc.jnotepad.util.LogUtil; +import org.jcnc.jnotepad.views.manager.BuildPanelManager; import org.jcnc.jnotepad.views.manager.CenterTabPaneManager; import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab; @@ -24,6 +25,8 @@ import static org.jcnc.jnotepad.common.constants.TextConstants.RUN; */ public class RunTopMenu extends AbstractTopMenu { CenterTab centerTab = CenterTabPaneManager.getInstance().getSelected(); + private static final BuildPanelManager BUILD_PANEL_MANAGER = BuildPanelManager.getInstance(); + private static final BuildPanel BUILD_PANEL = BuildPanel.getInstance(); private static final RunTopMenu INSTANCE = new RunTopMenu(); private final Map runMenuItems = new HashMap<>(); @@ -61,12 +64,12 @@ public class RunTopMenu extends AbstractTopMenu { return runMenuItems; } - EventHandler codeRun = event -> { + EventHandler codeRun = event -> { // 创建一个TextArea用于输出编译后的结果 - TextArea resultTextArea = new TextArea(); - resultTextArea.setPrefRowCount(10); - resultTextArea.setPrefColumnCount(40); - resultTextArea.setEditable(false); // 禁止编辑 +// TextArea resultTextArea = new TextArea(); +// resultTextArea.setPrefRowCount(10); +// resultTextArea.setPrefColumnCount(40); +// resultTextArea.setEditable(false); // 禁止编辑 // 获取TextCodeArea的文本内容 @@ -86,13 +89,14 @@ public class RunTopMenu extends AbstractTopMenu { } // 编译和运行C代码 - compileAndRunCode(fileName, resultTextArea); +// compileAndRunCode(fileName, resultTextArea); + compileAndRunCode(fileName); }; /** * 编译和运行C代码的方法 */ - private void compileAndRunCode(String fileName, TextArea resultTextArea) { + private void compileAndRunCode(String fileName) { try { // 创建ProcessBuilder并指定GCC编译命令 ProcessBuilder processBuilder = new ProcessBuilder("gcc", fileName, "-o", "temp"); @@ -124,9 +128,9 @@ public class RunTopMenu extends AbstractTopMenu { while ((line = runReader.readLine()) != null) { result.append(line).append("\n"); } - // 显示运行结果 - resultTextArea.setText(result.toString()); + BUILD_PANEL_MANAGER.controlShow(true); + BUILD_PANEL_MANAGER.setText(BUILD_PANEL.getRunBox(),result.toString()); } else { System.out.println("编译失败,返回代码:" + compileExitCode); } @@ -145,8 +149,11 @@ public class RunTopMenu extends AbstractTopMenu { registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun); - // 调试 - registerMenuItem(topMenuBar.getDeBugItem(), DE_BUG, "deBugItem", null); + // 调试 test + registerMenuItem(topMenuBar.getDeBugItem(), DE_BUG, "deBugItem", event -> { + BUILD_PANEL_MANAGER.controlShow(true); + BUILD_PANEL_MANAGER.setText(BUILD_PANEL.getBuildBox(),"待开发"); + }); } diff --git a/src/main/resources/cmd.png b/src/main/resources/cmd.png new file mode 100644 index 0000000000000000000000000000000000000000..78439f6615e5ee3242018af456863edd81629044 Binary files /dev/null and b/src/main/resources/cmd.png differ diff --git a/temp.c b/temp.c new file mode 100644 index 0000000000000000000000000000000000000000..c81731828dd2cc620d19eedd3c2ad51a2a5502bf --- /dev/null +++ b/temp.c @@ -0,0 +1,7 @@ +#include +int main() +{ + // printf() 中字符串需要引号 + printf("Hello, World1111!"); + return 0; +} \ No newline at end of file