From 6dff6baa8ec01aa7db1a8b2c799347a6d429f408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E8=BD=B2?= Date: Fri, 6 Oct 2023 01:41:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=96=E8=AF=91=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/module-info.java | 2 +- .../component/stage/setting/SetStage.java | 2 +- .../{setting => toolbar}/DirTreeBtn.java | 2 +- .../{menuitem => toolbar}/OpenDirectory.java | 2 +- .../event/handler/toolbar/RunBtn.java | 17 ++++ .../handler/{setting => toolbar}/SetBtn.java | 2 +- .../manager/DirectorySidebarManager.java | 2 +- .../views/manager/RootBorderPaneManager.java | 2 - .../views/manager/SidebarToolBarManager.java | 13 ++- .../left/sidebar/tools/SidebarToolBar.java | 13 ++- .../root/top/menubar/menu/FileTopMenu.java | 1 + .../root/top/menubar/menu/RunTopMenu.java | 85 ++++++++++++++++++- 12 files changed, 129 insertions(+), 14 deletions(-) rename src/main/java/org/jcnc/jnotepad/controller/event/handler/{setting => toolbar}/DirTreeBtn.java (90%) rename src/main/java/org/jcnc/jnotepad/controller/event/handler/{menuitem => toolbar}/OpenDirectory.java (97%) create mode 100644 src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java rename src/main/java/org/jcnc/jnotepad/controller/event/handler/{setting => toolbar}/SetBtn.java (93%) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 6c3451e..ac60eed 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -28,7 +28,7 @@ module org.jcnc.jnotepad { exports org.jcnc.jnotepad.controller.config; exports org.jcnc.jnotepad.controller.manager; exports org.jcnc.jnotepad.controller.i18n; - exports org.jcnc.jnotepad.controller.event.handler.setting; + exports org.jcnc.jnotepad.controller.event.handler.toolbar; exports org.jcnc.jnotepad.controller.event.handler.menuitem; exports org.jcnc.jnotepad.component.module.interfaces; opens org.jcnc.jnotepad.app.config; diff --git a/src/main/java/org/jcnc/jnotepad/component/stage/setting/SetStage.java b/src/main/java/org/jcnc/jnotepad/component/stage/setting/SetStage.java index a2a4171..daacdf7 100644 --- a/src/main/java/org/jcnc/jnotepad/component/stage/setting/SetStage.java +++ b/src/main/java/org/jcnc/jnotepad/component/stage/setting/SetStage.java @@ -22,7 +22,7 @@ import org.jcnc.jnotepad.common.constants.TextConstants; import org.jcnc.jnotepad.common.manager.ApplicationCacheManager; import org.jcnc.jnotepad.component.stage.dialog.factory.impl.BasicDirectoryChooserFactory; import org.jcnc.jnotepad.controller.config.AppConfigController; -import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenDirectory; +import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory; import org.jcnc.jnotepad.model.entity.Cache; import org.jcnc.jnotepad.model.enums.CacheExpirationTime; import org.jcnc.jnotepad.plugin.PluginManagerInterface; 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/toolbar/DirTreeBtn.java similarity index 90% rename from src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/DirTreeBtn.java index 2108880..27066f3 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/DirTreeBtn.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/DirTreeBtn.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.controller.event.handler.setting; +package org.jcnc.jnotepad.controller.event.handler.toolbar; import javafx.event.ActionEvent; import javafx.event.EventHandler; diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/OpenDirectory.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/OpenDirectory.java similarity index 97% rename from src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/OpenDirectory.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/OpenDirectory.java index 726e7c8..977131f 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/menuitem/OpenDirectory.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/OpenDirectory.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.controller.event.handler.menuitem; +package org.jcnc.jnotepad.controller.event.handler.toolbar; import javafx.event.ActionEvent; 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 new file mode 100644 index 0000000..3c917cc --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/RunBtn.java @@ -0,0 +1,17 @@ +package org.jcnc.jnotepad.controller.event.handler.toolbar; + + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; + +/** + * @author luke + */ +public class RunBtn implements EventHandler { + + @Override + public void handle(ActionEvent actionEvent) { + // TODO: 2023/10/6 点击按钮,打开下方侧边栏的运行输出栏 + + } +} diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/SetBtn.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/SetBtn.java similarity index 93% rename from src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/SetBtn.java rename to src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/SetBtn.java index e232e80..f5e60f5 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/setting/SetBtn.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/toolbar/SetBtn.java @@ -1,4 +1,4 @@ -package org.jcnc.jnotepad.controller.event.handler.setting; +package org.jcnc.jnotepad.controller.event.handler.toolbar; import javafx.event.ActionEvent; import javafx.event.EventHandler; 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 0ff640c..dc93ca0 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/DirectorySidebarManager.java @@ -4,7 +4,7 @@ import javafx.beans.value.ChangeListener; import javafx.scene.control.SplitPane; import javafx.scene.control.TreeItem; import org.jcnc.jnotepad.common.manager.ApplicationCacheManager; -import org.jcnc.jnotepad.controller.event.handler.menuitem.OpenDirectory; +import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory; import org.jcnc.jnotepad.model.entity.DirFileModel; import org.jcnc.jnotepad.util.FileUtil; import org.jcnc.jnotepad.views.root.center.main.MainBorderPane; 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 b77d85c..005e4a2 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/RootBorderPaneManager.java @@ -3,7 +3,6 @@ package org.jcnc.jnotepad.views.manager; 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; @@ -37,7 +36,6 @@ public class RootBorderPaneManager { // 中间,用于显示主界面 rootBorderPane.setCenterComponent(MainBorderPane.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 1ec053a..90a508c 100644 --- a/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java +++ b/src/main/java/org/jcnc/jnotepad/views/manager/SidebarToolBarManager.java @@ -5,8 +5,9 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import org.jcnc.jnotepad.api.core.views.manager.AbstractManager; import org.jcnc.jnotepad.api.core.views.manager.builder.SideBarButtonBuilder; -import org.jcnc.jnotepad.controller.event.handler.setting.DirTreeBtn; -import org.jcnc.jnotepad.controller.event.handler.setting.SetBtn; +import org.jcnc.jnotepad.controller.event.handler.toolbar.DirTreeBtn; +import org.jcnc.jnotepad.controller.event.handler.toolbar.RunBtn; +import org.jcnc.jnotepad.controller.event.handler.toolbar.SetBtn; import org.jcnc.jnotepad.views.root.left.sidebar.tools.SidebarToolBar; import java.util.ArrayList; @@ -53,7 +54,13 @@ public class SidebarToolBarManager extends AbstractManager { .setImageViewEssentialAttribute(10D, 10D, true, 2.5D, 2.5D) .setButtonEssentialAttribute(20D, 20D) .setEventHandler(new DirTreeBtn()).build()); - + registerNode( + new SideBarButtonBuilder() + .setButton(sidebarToolBar.getRunButton()) + .setImageView(new ImageView(new Image("directory.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/left/sidebar/tools/SidebarToolBar.java b/src/main/java/org/jcnc/jnotepad/views/root/left/sidebar/tools/SidebarToolBar.java index 07ba78c..8ee1ec4 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 @@ -30,9 +30,9 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar { Button dirTreeButton = new Button(); /** - * 工具栏上的文本侧边栏按钮 + * 工具栏上的运行侧边栏按钮 */ - Button fileButton = new Button(); + Button runButton = new Button(); private SidebarToolBar() { // 垂直排列 @@ -69,4 +69,13 @@ public class SidebarToolBar extends javafx.scene.control.ToolBar { public Button getDirTreeButton() { return dirTreeButton; } + + /** + * 获取工具栏上的运行按钮。 + * + * @return 运行按钮 + */ + public Button getRunButton() { + return runButton; + } } diff --git a/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/FileTopMenu.java b/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/FileTopMenu.java index eeabecc..ceac373 100644 --- a/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/FileTopMenu.java +++ b/src/main/java/org/jcnc/jnotepad/views/root/top/menubar/menu/FileTopMenu.java @@ -4,6 +4,7 @@ import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import org.jcnc.jnotepad.api.core.views.top.menu.AbstractTopMenu; import org.jcnc.jnotepad.controller.event.handler.menuitem.*; +import org.jcnc.jnotepad.controller.event.handler.toolbar.OpenDirectory; import java.util.HashMap; import java.util.Map; 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 f12f366..c45a553 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 @@ -1,9 +1,16 @@ package org.jcnc.jnotepad.views.root.top.menubar.menu; +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.util.LogUtil; +import org.jcnc.jnotepad.views.manager.CenterTabPaneManager; +import org.jcnc.jnotepad.views.root.center.main.center.tab.CenterTab; +import java.io.*; import java.util.HashMap; import java.util.Map; @@ -16,6 +23,7 @@ import static org.jcnc.jnotepad.common.constants.TextConstants.RUN; * @author gewuyou */ public class RunTopMenu extends AbstractTopMenu { + CenterTab centerTab = CenterTabPaneManager.getInstance().getSelected(); private static final RunTopMenu INSTANCE = new RunTopMenu(); private final Map runMenuItems = new HashMap<>(); @@ -53,14 +61,89 @@ public class RunTopMenu extends AbstractTopMenu { return runMenuItems; } + EventHandler codeRun = event -> { + // 创建一个TextArea用于输出编译后的结果 + TextArea resultTextArea = new TextArea(); + resultTextArea.setPrefRowCount(10); + resultTextArea.setPrefColumnCount(40); + resultTextArea.setEditable(false); // 禁止编辑 + + // 获取TextCodeArea的文本内容 + + CenterTab centerTab = CenterTabPaneManager.getInstance().getSelected(); + String code = centerTab.getLineNumberTextArea().getText(); + + // TextCodeArea的当前文本内容 + System.out.println("TextCodeArea的当前文本内容:" + code); + + String fileName = "temp.c"; + + // 将C代码写入临时文件 + try (PrintWriter writer = new PrintWriter(new FileWriter(fileName))) { + writer.write(code); + } catch (IOException ex) { + LogUtil.getLogger(this.getClass()).info("正在写入:{}", code); + } + + // 编译和运行C代码 + compileAndRunCode(fileName, resultTextArea); + }; + + /** + * 编译和运行C代码的方法 + */ + private void compileAndRunCode(String fileName, TextArea resultTextArea) { + try { + // 创建ProcessBuilder并指定GCC编译命令 + ProcessBuilder processBuilder = new ProcessBuilder("gcc", fileName, "-o", "temp"); + + // 设置工作目录 + processBuilder.directory(null); + + // 启动编译器进程 + Process compileProcess = processBuilder.start(); + + // 读取编译器的输出信息 + BufferedReader compileReader = new BufferedReader(new InputStreamReader(compileProcess.getInputStream())); + String line; + while ((line = compileReader.readLine()) != null) { + System.out.println(line); + } + + // 等待编译完成并获取返回值 + int compileExitCode = compileProcess.waitFor(); + if (compileExitCode == 0) { + System.out.println("编译成功!"); + + // 运行编译后的可执行文件 + Process runProcess = new ProcessBuilder("./temp").start(); + + // 读取运行结果 + BufferedReader runReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream())); + StringBuilder result = new StringBuilder(); + while ((line = runReader.readLine()) != null) { + result.append(line).append("\n"); + } + + // 显示运行结果 + resultTextArea.setText(result.toString()); + } else { + System.out.println("编译失败,返回代码:" + compileExitCode); + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } /** * 注册顶部菜单 */ @Override protected void registerTopMenu() { + // 运行 - registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", null); + registerMenuItem(topMenuBar.getRunItem(), RUN, "runItem", codeRun); + // 调试 registerMenuItem(topMenuBar.getDeBugItem(), DE_BUG, "deBugItem", null); -- Gitee