Skip to content

Commit dbc521a

Browse files
committed
mix create project modes
1 parent d097db8 commit dbc521a

10 files changed

+77
-57
lines changed

extension/package.json

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@
3939
"workspaceContains:settings.gradle",
4040
"workspaceContains:build.gradle.kts",
4141
"workspaceContains:settings.gradle.kts",
42-
"onCommand:gradle.createProject",
43-
"onCommand:gradle.createProjectAdvanced"
42+
"onCommand:gradle.createProject"
4443
],
4544
"main": "./dist/index.js",
4645
"contributes": {
@@ -328,11 +327,6 @@
328327
"category": "Gradle",
329328
"title": "Create a Gradle Java Project..."
330329
},
331-
{
332-
"command": "gradle.createProjectAdvanced",
333-
"category": "Gradle",
334-
"title": "Create a Gradle Java Project... (Advanced)"
335-
},
336330
{
337331
"command": "gradle.runTasks",
338332
"category": "Gradle",

extension/src/commands/Commands.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ import { GradleTaskProvider } from "../tasks";
7373
import { isJavaExtEnabled } from "../util/javaExtension";
7474
import { GradleDaemonsTreeDataProvider, GradleTasksTreeDataProvider, RecentTasksTreeDataProvider } from "../views";
7575
import { Command } from "./Command";
76-
import { COMMAND_CREATE_PROJECT, COMMAND_CREATE_PROJECT_ADVANCED, CreateProjectCommand } from "./CreateProjectCommand";
76+
import { COMMAND_CREATE_PROJECT, CreateProjectCommand } from "./CreateProjectCommand";
7777
import { HideStoppedDaemonsCommand, HIDE_STOPPED_DAEMONS } from "./HideStoppedDaemonsCommand";
7878
import { COMMAND_RELOAD_JAVA_PROJECT, ReloadJavaProjectsCommand } from "./ReloadJavaProjectsCommand";
7979
import { COMMAND_RUN_TASKS, RunTasksCommand } from "./RunTasksCommand";
@@ -186,7 +186,6 @@ export class Commands {
186186
this.registerCommand(SHOW_STOPPED_DAEMONS, new ShowStoppedDaemonsCommand(this.gradleDaemonsTreeDataProvider));
187187
this.registerCommand(HIDE_STOPPED_DAEMONS, new HideStoppedDaemonsCommand(this.gradleDaemonsTreeDataProvider));
188188
this.registerCommand(COMMAND_CREATE_PROJECT, new CreateProjectCommand(this.client), [false]);
189-
this.registerCommand(COMMAND_CREATE_PROJECT_ADVANCED, new CreateProjectCommand(this.client), [true]);
190189
this.registerCommand(COMMAND_RUN_TASKS, new RunTasksCommand(this.gradleTaskProvider));
191190
if (isJavaExtEnabled()) {
192191
this.registerCommand(COMMAND_RELOAD_JAVA_PROJECT, new ReloadJavaProjectsCommand());

extension/src/commands/CreateProjectCommand.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult
1111
import { Command } from "./Command";
1212

1313
export const COMMAND_CREATE_PROJECT = "gradle.createProject";
14-
export const COMMAND_CREATE_PROJECT_ADVANCED = "gradle.createProjectAdvanced";
1514

1615
export class CreateProjectCommand extends Command {
1716
constructor(private client: GradleClient) {
@@ -31,7 +30,7 @@ export class CreateProjectCommand extends Command {
3130
canSelectFolders: true,
3231
canSelectMany: false,
3332
});
34-
const isAdvanced = params[0] as boolean;
33+
const isAdvanced = false;
3534
if (targetFolderUri) {
3635
const metadata: IProjectCreationMetadata = {
3736
isAdvanced: isAdvanced,
@@ -42,7 +41,7 @@ export class CreateProjectCommand extends Command {
4241
projectName: path.basename(targetFolderUri[0].fsPath),
4342
sourcePackageName: await this.client.getNormalizedPackageName(path.basename(targetFolderUri[0].fsPath)),
4443
steps: [],
45-
nextStep: isAdvanced ? selectProjectTypeStep : selectScriptDSLStep,
44+
nextStep: selectScriptDSLStep,
4645
client: this.client,
4746
};
4847
const success = await this.runSteps(metadata);
@@ -73,6 +72,10 @@ export class CreateProjectCommand extends Command {
7372
}
7473
step = metadata.steps.pop();
7574
break;
75+
case StepResult.RESTART:
76+
metadata.steps = [];
77+
step = selectProjectTypeStep;
78+
break;
7679
case StepResult.STOP:
7780
return false; // user cancellation
7881
default:
@@ -82,7 +85,6 @@ export class CreateProjectCommand extends Command {
8285
return true;
8386
}
8487

85-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
8688
private async createProject(metadata: IProjectCreationMetadata): Promise<void> {
8789
const cancellationKey = getRunTaskCommandCancellationKey(metadata.targetFolder, "init");
8890
const args: string[] = ["init"];

extension/src/createProject/SelectProjectTypeStep.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import * as vscode from "vscode";
55
import { selectScriptDSLStep } from "./SelectScriptDSLStep";
66
import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult } from "./types";
7+
import { updateTotalSteps } from "./utils";
78

89
export class SelectProjectTypeStep implements IProjectCreationStep {
910
public async run(metadata: IProjectCreationMetadata): Promise<StepResult> {
@@ -25,19 +26,17 @@ export class SelectProjectTypeStep implements IProjectCreationStep {
2526
switch (selectedType.label) {
2627
case "application":
2728
metadata.projectType = ProjectType.JAVA_APPLICATION;
28-
metadata.totalSteps = 5;
2929
break;
3030
case "library":
3131
metadata.projectType = ProjectType.JAVA_LIBRARY;
32-
metadata.totalSteps = 5;
3332
break;
3433
case "Gradle plugin":
3534
metadata.projectType = ProjectType.JAVA_GRADLE_PLUGIN;
36-
metadata.totalSteps = 4; // when creating gradle plugin, we shouldn't specify test framework
3735
break;
3836
default:
3937
resolve(StepResult.STOP);
4038
}
39+
updateTotalSteps(metadata);
4140
metadata.steps.push(selectProjectTypeStep);
4241
metadata.nextStep = selectScriptDSLStep;
4342
resolve(StepResult.NEXT);

extension/src/createProject/SelectScriptDSLStep.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as vscode from "vscode";
55
import { selectTestFrameworkStep } from "./SelectTestFrameworkStep";
66
import { specifyProjectNameStep } from "./SpecifyProjectNameStep";
77
import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult } from "./types";
8+
import { createQuickInputButtons, switchToAdvancedLabel, updateTotalSteps } from "./utils";
89

910
export class SelectScriptDSLStep implements IProjectCreationStep {
1011
public async run(metadata: IProjectCreationMetadata): Promise<StepResult> {
@@ -19,16 +20,7 @@ export class SelectScriptDSLStep implements IProjectCreationStep {
1920
pickBox.matchOnDescription = true;
2021
pickBox.ignoreFocusOut = true;
2122
pickBox.items = this.getScriptDSLPickItems();
22-
if (metadata.steps.length) {
23-
pickBox.buttons = [vscode.QuickInputButtons.Back];
24-
disposables.push(
25-
pickBox.onDidTriggerButton((item) => {
26-
if (item === vscode.QuickInputButtons.Back) {
27-
resolve(StepResult.PREVIOUS);
28-
}
29-
})
30-
);
31-
}
23+
pickBox.buttons = createQuickInputButtons(metadata);
3224
disposables.push(
3325
pickBox.onDidAccept(() => {
3426
const selectedScriptDSL = pickBox.selectedItems[0];
@@ -52,6 +44,15 @@ export class SelectScriptDSLStep implements IProjectCreationStep {
5244
resolve(StepResult.NEXT);
5345
}
5446
}),
47+
pickBox.onDidTriggerButton((item) => {
48+
if (item === vscode.QuickInputButtons.Back) {
49+
resolve(StepResult.PREVIOUS);
50+
} else if (item.tooltip === switchToAdvancedLabel) {
51+
metadata.isAdvanced = true;
52+
updateTotalSteps(metadata);
53+
resolve(StepResult.RESTART);
54+
}
55+
}),
5556
pickBox.onDidHide(() => {
5657
resolve(StepResult.STOP);
5758
})

extension/src/createProject/SelectTestFrameworkStep.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import * as vscode from "vscode";
55
import { specifyProjectNameStep } from "./SpecifyProjectNameStep";
66
import { IProjectCreationMetadata, IProjectCreationStep, StepResult, TestFramework } from "./types";
7+
import { createQuickInputButtons } from "./utils";
78

89
export class SelectTestFrameworkStep implements IProjectCreationStep {
910
public async run(metadata: IProjectCreationMetadata): Promise<StepResult> {
@@ -18,16 +19,7 @@ export class SelectTestFrameworkStep implements IProjectCreationStep {
1819
pickBox.matchOnDescription = true;
1920
pickBox.ignoreFocusOut = true;
2021
pickBox.items = this.getTestFrameworkPickItems();
21-
if (metadata.steps.length) {
22-
pickBox.buttons = [vscode.QuickInputButtons.Back];
23-
disposables.push(
24-
pickBox.onDidTriggerButton((item) => {
25-
if (item === vscode.QuickInputButtons.Back) {
26-
resolve(StepResult.PREVIOUS);
27-
}
28-
})
29-
);
30-
}
22+
pickBox.buttons = createQuickInputButtons(metadata);
3123
disposables.push(
3224
pickBox.onDidAccept(() => {
3325
const selectedTestFramework = pickBox.selectedItems[0];
@@ -54,6 +46,11 @@ export class SelectTestFrameworkStep implements IProjectCreationStep {
5446
resolve(StepResult.NEXT);
5547
}
5648
}),
49+
pickBox.onDidTriggerButton((item) => {
50+
if (item === vscode.QuickInputButtons.Back) {
51+
resolve(StepResult.PREVIOUS);
52+
}
53+
}),
5754
pickBox.onDidHide(() => {
5855
resolve(StepResult.STOP);
5956
})

extension/src/createProject/SpecifyProjectNameStep.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import * as vscode from "vscode";
55
import { specifySourcePackageNameStep } from "./SpecifySourcePackageNameStep";
66
import { IProjectCreationMetadata, IProjectCreationStep, StepResult } from "./types";
7+
import { createQuickInputButtons, switchToAdvancedLabel, updateTotalSteps } from "./utils";
78

89
export class SpecifyProjectNameStep implements IProjectCreationStep {
910
public async run(metadata: IProjectCreationMetadata): Promise<StepResult> {
@@ -21,16 +22,7 @@ export class SpecifyProjectNameStep implements IProjectCreationStep {
2122
const validationMessage: string | undefined = this.isValidProjectName(metadata.projectName);
2223
inputBox.enabled = validationMessage === undefined;
2324
inputBox.validationMessage = validationMessage;
24-
if (metadata.steps.length) {
25-
inputBox.buttons = [vscode.QuickInputButtons.Back];
26-
disposables.push(
27-
inputBox.onDidTriggerButton((item) => {
28-
if (item === vscode.QuickInputButtons.Back) {
29-
resolve(StepResult.PREVIOUS);
30-
}
31-
})
32-
);
33-
}
25+
inputBox.buttons = createQuickInputButtons(metadata);
3426
disposables.push(
3527
inputBox.onDidChangeValue(() => {
3628
const validationMessage: string | undefined = this.isValidProjectName(inputBox.value);
@@ -43,6 +35,15 @@ export class SpecifyProjectNameStep implements IProjectCreationStep {
4335
metadata.nextStep = !metadata.isAdvanced ? undefined : specifySourcePackageNameStep;
4436
resolve(StepResult.NEXT);
4537
}),
38+
inputBox.onDidTriggerButton((item) => {
39+
if (item === vscode.QuickInputButtons.Back) {
40+
resolve(StepResult.PREVIOUS);
41+
} else if (item.tooltip === switchToAdvancedLabel) {
42+
metadata.isAdvanced = true;
43+
updateTotalSteps(metadata);
44+
resolve(StepResult.RESTART);
45+
}
46+
}),
4647
inputBox.onDidHide(() => {
4748
resolve(StepResult.STOP);
4849
})

extension/src/createProject/SpecifySourcePackageNameStep.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import * as vscode from "vscode";
55
import { IProjectCreationMetadata, IProjectCreationStep, StepResult } from "./types";
6-
import { asyncDebounce } from "./utils";
6+
import { asyncDebounce, createQuickInputButtons } from "./utils";
77

88
export class SpecifySourcePackageNameStep implements IProjectCreationStep {
99
public static GET_NORMALIZED_PACKAGE_NAME = "getNormalizedPackageName";
@@ -34,16 +34,7 @@ export class SpecifySourcePackageNameStep implements IProjectCreationStep {
3434
inputBox.value = normalizedName as string;
3535
inputBox.ignoreFocusOut = true;
3636
inputBox.enabled = true;
37-
if (metadata.steps.length) {
38-
inputBox.buttons = [vscode.QuickInputButtons.Back];
39-
disposables.push(
40-
inputBox.onDidTriggerButton((item) => {
41-
if (item === vscode.QuickInputButtons.Back) {
42-
resolve(StepResult.PREVIOUS);
43-
}
44-
})
45-
);
46-
}
37+
inputBox.buttons = createQuickInputButtons(metadata);
4738
disposables.push(
4839
inputBox.onDidChangeValue(async () => {
4940
const normalizedName = await getNormalizedPackageNameTrigger(inputBox.value);
@@ -67,6 +58,11 @@ export class SpecifySourcePackageNameStep implements IProjectCreationStep {
6758
resolve(StepResult.NEXT);
6859
}
6960
}),
61+
inputBox.onDidTriggerButton((item) => {
62+
if (item === vscode.QuickInputButtons.Back) {
63+
resolve(StepResult.PREVIOUS);
64+
}
65+
}),
7066
inputBox.onDidHide(() => {
7167
resolve(StepResult.STOP);
7268
})

extension/src/createProject/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export enum StepResult {
2525
NEXT,
2626
STOP,
2727
PREVIOUS,
28+
// used for switching mode and restart all steps
29+
RESTART,
2830
}
2931

3032
export enum ProjectType {

extension/src/createProject/utils.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33

44
/* eslint-disable @typescript-eslint/no-explicit-any */
55
import { debounce } from "lodash";
6+
import { QuickInputButton, QuickInputButtons, ThemeIcon } from "vscode";
7+
import { IProjectCreationMetadata, ProjectType } from "./types";
8+
9+
export const switchToAdvancedLabel = "Switch to advanced mode...";
610

711
export function asyncDebounce(func: any, wait: any, bind: any) {
812
const debounced = debounce(async (resolve, reject, bindSelf, args) => {
@@ -22,3 +26,28 @@ export function asyncDebounce(func: any, wait: any, bind: any) {
2226

2327
return returnFunc;
2428
}
29+
30+
export function updateTotalSteps(metadata: IProjectCreationMetadata): void {
31+
if (!metadata.isAdvanced) {
32+
metadata.totalSteps = 2;
33+
} else if (metadata.projectType === ProjectType.JAVA_GRADLE_PLUGIN) {
34+
// when creating gradle plugin, we shouldn't specify test framework
35+
metadata.totalSteps = 4;
36+
} else {
37+
metadata.totalSteps = 5;
38+
}
39+
}
40+
41+
export function createQuickInputButtons(metadata: IProjectCreationMetadata): QuickInputButton[] {
42+
const buttons: QuickInputButton[] = [];
43+
if (metadata.steps.length) {
44+
buttons.push(QuickInputButtons.Back);
45+
}
46+
if (!metadata.isAdvanced) {
47+
buttons.push({
48+
iconPath: new ThemeIcon("settings-gear"),
49+
tooltip: switchToAdvancedLabel,
50+
});
51+
}
52+
return buttons;
53+
}

0 commit comments

Comments
 (0)