Skip to content

Commit 4b6413d

Browse files
committed
Execute commands in GitWave window instead of git bash
1 parent fbbc2c4 commit 4b6413d

File tree

9 files changed

+234
-119
lines changed

9 files changed

+234
-119
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<slf4j-api.version>2.0.9</slf4j-api.version>
1919
<logback-classic.version>1.4.11</logback-classic.version>
2020
<jackson-databind.version>2.15.3</jackson-databind.version>
21+
<richtextfx.version>0.11.3</richtextfx.version>
2122

2223
<maven-bundle-plugin.version>5.1.9</maven-bundle-plugin.version>
2324
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
@@ -37,6 +38,11 @@
3738
<artifactId>javafx-fxml</artifactId>
3839
<version>${javafx.version}</version>
3940
</dependency>
41+
<dependency>
42+
<groupId>org.fxmisc.richtext</groupId>
43+
<artifactId>richtextfx</artifactId>
44+
<version>${richtextfx.version}</version>
45+
</dependency>
4046
<dependency>
4147
<groupId>org.slf4j</groupId>
4248
<artifactId>slf4j-api</artifactId>

src/main/java/com/github/introfog/gitwave/controller/BaseController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public void initialize(FxmlStageHolder fxmlStageHolder) {
2828
this.fxmlStageHolder = fxmlStageHolder;
2929
}
3030

31+
public Stage getStage() {
32+
return fxmlStageHolder.getStage();
33+
}
34+
3135
protected void setClosingOnEscapePressing(FxmlStageHolder fxmlStageHolder) {
3236
fxmlStageHolder.getScene().setOnKeyPressed(event -> {
3337
if (event.getCode() == KeyCode.ESCAPE) {
@@ -39,8 +43,4 @@ protected void setClosingOnEscapePressing(FxmlStageHolder fxmlStageHolder) {
3943
protected void closeStage() {
4044
fxmlStageHolder.getStage().close();
4145
}
42-
43-
protected Stage getStage() {
44-
return fxmlStageHolder.getStage();
45-
}
4646
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright 2023-2024 Dmitry Chubrick
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.github.introfog.gitwave.controller.main;
18+
19+
import com.github.introfog.gitwave.controller.BaseController;
20+
import com.github.introfog.gitwave.model.StageFactory;
21+
import com.github.introfog.gitwave.model.StageFactory.FxmlStageHolder;
22+
23+
import javafx.application.Platform;
24+
import javafx.fxml.FXML;
25+
import javafx.scene.input.KeyCode;
26+
import org.fxmisc.richtext.InlineCssTextArea;
27+
28+
public class ExecutionController extends BaseController {
29+
@FXML
30+
private InlineCssTextArea canvas;
31+
32+
private boolean wasClosed = false;
33+
private boolean isExecutionFinished = false;
34+
35+
@Override
36+
public void initialize(FxmlStageHolder fxmlStageHolder) {
37+
super.initialize(fxmlStageHolder);
38+
fxmlStageHolder.getStage().setOnCloseRequest(event -> {
39+
wasClosed = true;
40+
StageFactory.unregisterExecutingController(this);
41+
});
42+
canvas.setOnKeyPressed(event -> {
43+
if (event.getCode() == KeyCode.ESCAPE || event.getCode() == KeyCode.ENTER) {
44+
if (isExecutionFinished) {
45+
fxmlStageHolder.getStage().close();
46+
}
47+
}
48+
});
49+
fxmlStageHolder.getScene().setOnKeyPressed(event -> {
50+
if (event.getCode() == KeyCode.ESCAPE || event.getCode() == KeyCode.ENTER) {
51+
if (isExecutionFinished) {
52+
fxmlStageHolder.getStage().close();
53+
}
54+
}
55+
});
56+
}
57+
58+
public void writeCommand(String command) {
59+
Platform.runLater(() -> {
60+
canvas.clear();
61+
});
62+
commonWritingPart(command + "\n\n", "-fx-fill: green");
63+
}
64+
65+
public void writeDirectory(String path) {
66+
commonWritingPart("\n" + path + "\n", "-fx-fill: DarkCyan");
67+
}
68+
69+
public void writeStandardOutput(String line) {
70+
commonWritingPart(line + "\n", "-fx-fill: black");
71+
}
72+
73+
public void writeErrorOutput(String line) {
74+
commonWritingPart(line + "\n", "-fx-fill: red");
75+
}
76+
77+
public void writeFinishMessage() {
78+
commonWritingPart("\nPress Enter or Esc to close the window...", "-fx-fill: green");
79+
isExecutionFinished = true;
80+
}
81+
82+
public boolean wasClosed() {
83+
return wasClosed;
84+
}
85+
86+
private void commonWritingPart(String line, String style) {
87+
Platform.runLater(() -> {
88+
canvas.appendText(line);
89+
canvas.setStyle(canvas.getLength() - line.length(), canvas.getLength(), style);
90+
canvas.requestFollowCaret();
91+
});
92+
}
93+
}

src/main/java/com/github/introfog/gitwave/controller/main/MainController.java

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,19 @@
2121
import com.github.introfog.gitwave.model.AppConstants;
2222
import com.github.introfog.gitwave.model.CommandExecutor;
2323
import com.github.introfog.gitwave.model.DialogFactory;
24+
import com.github.introfog.gitwave.model.StageFactory;
2425
import com.github.introfog.gitwave.model.StageFactory.FxmlStageHolder;
2526
import com.github.introfog.gitwave.model.dto.ParameterDto;
2627

2728
import java.io.File;
29+
import java.util.List;
2830
import javafx.concurrent.Task;
2931
import javafx.fxml.FXML;
3032
import javafx.scene.control.Button;
3133
import javafx.scene.control.ButtonType;
3234
import javafx.scene.control.Label;
3335
import javafx.scene.control.Menu;
3436
import javafx.scene.control.MenuItem;
35-
import javafx.scene.control.ProgressIndicator;
3637
import javafx.scene.control.SeparatorMenuItem;
3738
import javafx.scene.control.TableView;
3839
import javafx.scene.control.TextField;
@@ -65,11 +66,6 @@ public class MainController extends BaseController {
6566
@FXML
6667
private SeparatorMenuItem updateMenuItemSeparator;
6768

68-
@FXML
69-
private ProgressIndicator runProgress;
70-
@FXML
71-
private Button run;
72-
7369
@Override
7470
public void initialize(FxmlStageHolder fxmlStageHolder) {
7571
super.initialize(fxmlStageHolder);
@@ -78,10 +74,12 @@ public void initialize(FxmlStageHolder fxmlStageHolder) {
7874
event.consume();
7975
if (DialogFactory.createCloseConfirmationAlert() == ButtonType.OK) {
8076
AppConfig.getInstance().closeApp();
77+
for (ExecutionController executionController : StageFactory.getExecutingControllers()) {
78+
executionController.getStage().close();
79+
}
8180
primaryStage.close();
8281
};
8382
});
84-
switchRunButton(false);
8583

8684
directoryTabController = new DirectoryTabController(fxmlStageHolder, directory);
8785
parametersTabController = new ParametersTabController(fxmlStageHolder, parametersTable, parametersText);
@@ -124,8 +122,20 @@ protected void runCommand() {
124122
}
125123
AppConfig.getInstance().setLastRunFolder(directoryToRunIn.getAbsolutePath());
126124

127-
Task<Void> runCommandTask = createRunCommandTask(directoryToRunIn);
128-
new Thread(runCommandTask).start();
125+
final FxmlStageHolder executionWindow = StageFactory.createNoneModalExecutionWindow();
126+
executionWindow.getStage().show();
127+
ExecutionController executionController = executionWindow.getFxmlLoader().getController();
128+
129+
new Thread(new Task<>() {
130+
@Override
131+
protected Void call() {
132+
final List<File> repositoriesToRunCommand = CommandExecutor.searchGitRepositories(directoryToRunIn);
133+
134+
CommandExecutor.executeCommand(repositoriesToRunCommand, executionController,
135+
commandTabController.getCommandWithParameters());
136+
return null;
137+
}
138+
}).start();
129139
}
130140
}
131141

@@ -148,23 +158,4 @@ protected void openUpdate() {
148158
protected void foundIssue() {
149159
AppConfig.getInstance().getHostServices().showDocument(AppConstants.LINK_TO_GIT_CONTRIBUTING_FILE);
150160
}
151-
152-
private void switchRunButton(boolean inProgress) {
153-
run.setDisable(inProgress);
154-
runProgress.setVisible(inProgress);
155-
}
156-
157-
private Task<Void> createRunCommandTask(File directoryToRunIn) {
158-
return new Task<>() {
159-
@Override
160-
protected Void call() {
161-
switchRunButton(true);
162-
final File scriptFile = CommandExecutor.searchGitRepositoriesAndCreateScriptFile(directoryToRunIn,
163-
commandTabController.getCommandWithParameters());
164-
switchRunButton(false);
165-
CommandExecutor.executeScriptFileWithCommand(scriptFile);
166-
return null;
167-
}
168-
};
169-
}
170161
}

0 commit comments

Comments
 (0)