diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 6c3451eece134393a254c19a86c947454e55c8e6..ac60eedfaf05547d288ebc2cff75b9a1347faca8 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 a2a417179f8b26a236a20fae71bf0378de386136..daacdf7e49e9280a6402f8dc694e41524f88ef59 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 2108880f490f81d1a7cdf4e94f7cbcc39b8ea5b5..27066f3bae35947f30966edbbfaa246c84c71bef 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 726e7c8b39aa42b5caab6ff834561cc2ac192b8c..977131fe8845549949c1844f7b58e43d974db887 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 0000000000000000000000000000000000000000..3c917cc1f766d49fd2c58ebca0733d5c21d50dfa --- /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 e232e804c7516ec665e8b9cb3c22ad001c56ea4b..f5e60f5e5ce9cfe3fea9621789b1648895c963a4 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 0ff640cdfb5aea48e38cc9cd145c79bab21966c1..dc93ca024f65b61f639bc9d192b9958bce2bff92 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 b77d85c0b109f4afe9ea1eda95902e3b782d2d6c..005e4a2787b93545cba26d0409f9338b7406f758 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 1ec053a7615e58223b6c7c854cf5a05579b076bf..90a508c49e68353fcf20662858bf836c0d0caadd 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 07ba78ca0bf02dced1ae8cff1937328e4d1116c1..8ee1ec42ed96379ea9864a3063be26764014f9ab 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 eeabecc25cc9060f3ee7a820a895c6b319450a17..ceac3731e3967b1a612f6c84d21da956259df40a 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 f12f366164003dfe896392e1884e4aaf971e213e..c45a5539fd99b6a8a7a1ae0e7998a40391b09dbf 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);