From dbc521a7c0f6a173800f1fcca570ffd8127f3584 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 19 Sep 2022 12:54:53 +0800 Subject: [PATCH] mix create project modes --- extension/package.json | 8 +---- extension/src/commands/Commands.ts | 3 +- .../src/commands/CreateProjectCommand.ts | 10 ++++--- .../createProject/SelectProjectTypeStep.ts | 5 ++-- .../src/createProject/SelectScriptDSLStep.ts | 21 +++++++------- .../createProject/SelectTestFrameworkStep.ts | 17 +++++------ .../createProject/SpecifyProjectNameStep.ts | 21 +++++++------- .../SpecifySourcePackageNameStep.ts | 18 +++++------- extension/src/createProject/types.ts | 2 ++ extension/src/createProject/utils.ts | 29 +++++++++++++++++++ 10 files changed, 77 insertions(+), 57 deletions(-) diff --git a/extension/package.json b/extension/package.json index fca8da9d8..8a026ab4f 100644 --- a/extension/package.json +++ b/extension/package.json @@ -39,8 +39,7 @@ "workspaceContains:settings.gradle", "workspaceContains:build.gradle.kts", "workspaceContains:settings.gradle.kts", - "onCommand:gradle.createProject", - "onCommand:gradle.createProjectAdvanced" + "onCommand:gradle.createProject" ], "main": "./dist/index.js", "contributes": { @@ -328,11 +327,6 @@ "category": "Gradle", "title": "Create a Gradle Java Project..." }, - { - "command": "gradle.createProjectAdvanced", - "category": "Gradle", - "title": "Create a Gradle Java Project... (Advanced)" - }, { "command": "gradle.runTasks", "category": "Gradle", diff --git a/extension/src/commands/Commands.ts b/extension/src/commands/Commands.ts index d35fb755b..86f50749a 100644 --- a/extension/src/commands/Commands.ts +++ b/extension/src/commands/Commands.ts @@ -73,7 +73,7 @@ import { GradleTaskProvider } from "../tasks"; import { isJavaExtEnabled } from "../util/javaExtension"; import { GradleDaemonsTreeDataProvider, GradleTasksTreeDataProvider, RecentTasksTreeDataProvider } from "../views"; import { Command } from "./Command"; -import { COMMAND_CREATE_PROJECT, COMMAND_CREATE_PROJECT_ADVANCED, CreateProjectCommand } from "./CreateProjectCommand"; +import { COMMAND_CREATE_PROJECT, CreateProjectCommand } from "./CreateProjectCommand"; import { HideStoppedDaemonsCommand, HIDE_STOPPED_DAEMONS } from "./HideStoppedDaemonsCommand"; import { COMMAND_RELOAD_JAVA_PROJECT, ReloadJavaProjectsCommand } from "./ReloadJavaProjectsCommand"; import { COMMAND_RUN_TASKS, RunTasksCommand } from "./RunTasksCommand"; @@ -186,7 +186,6 @@ export class Commands { this.registerCommand(SHOW_STOPPED_DAEMONS, new ShowStoppedDaemonsCommand(this.gradleDaemonsTreeDataProvider)); this.registerCommand(HIDE_STOPPED_DAEMONS, new HideStoppedDaemonsCommand(this.gradleDaemonsTreeDataProvider)); this.registerCommand(COMMAND_CREATE_PROJECT, new CreateProjectCommand(this.client), [false]); - this.registerCommand(COMMAND_CREATE_PROJECT_ADVANCED, new CreateProjectCommand(this.client), [true]); this.registerCommand(COMMAND_RUN_TASKS, new RunTasksCommand(this.gradleTaskProvider)); if (isJavaExtEnabled()) { this.registerCommand(COMMAND_RELOAD_JAVA_PROJECT, new ReloadJavaProjectsCommand()); diff --git a/extension/src/commands/CreateProjectCommand.ts b/extension/src/commands/CreateProjectCommand.ts index b97eb4cf5..718876cfb 100644 --- a/extension/src/commands/CreateProjectCommand.ts +++ b/extension/src/commands/CreateProjectCommand.ts @@ -11,7 +11,6 @@ import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult import { Command } from "./Command"; export const COMMAND_CREATE_PROJECT = "gradle.createProject"; -export const COMMAND_CREATE_PROJECT_ADVANCED = "gradle.createProjectAdvanced"; export class CreateProjectCommand extends Command { constructor(private client: GradleClient) { @@ -31,7 +30,7 @@ export class CreateProjectCommand extends Command { canSelectFolders: true, canSelectMany: false, }); - const isAdvanced = params[0] as boolean; + const isAdvanced = false; if (targetFolderUri) { const metadata: IProjectCreationMetadata = { isAdvanced: isAdvanced, @@ -42,7 +41,7 @@ export class CreateProjectCommand extends Command { projectName: path.basename(targetFolderUri[0].fsPath), sourcePackageName: await this.client.getNormalizedPackageName(path.basename(targetFolderUri[0].fsPath)), steps: [], - nextStep: isAdvanced ? selectProjectTypeStep : selectScriptDSLStep, + nextStep: selectScriptDSLStep, client: this.client, }; const success = await this.runSteps(metadata); @@ -73,6 +72,10 @@ export class CreateProjectCommand extends Command { } step = metadata.steps.pop(); break; + case StepResult.RESTART: + metadata.steps = []; + step = selectProjectTypeStep; + break; case StepResult.STOP: return false; // user cancellation default: @@ -82,7 +85,6 @@ export class CreateProjectCommand extends Command { return true; } - // eslint-disable-next-line @typescript-eslint/no-unused-vars private async createProject(metadata: IProjectCreationMetadata): Promise { const cancellationKey = getRunTaskCommandCancellationKey(metadata.targetFolder, "init"); const args: string[] = ["init"]; diff --git a/extension/src/createProject/SelectProjectTypeStep.ts b/extension/src/createProject/SelectProjectTypeStep.ts index 5d94ede4a..4e2701f7e 100644 --- a/extension/src/createProject/SelectProjectTypeStep.ts +++ b/extension/src/createProject/SelectProjectTypeStep.ts @@ -4,6 +4,7 @@ import * as vscode from "vscode"; import { selectScriptDSLStep } from "./SelectScriptDSLStep"; import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult } from "./types"; +import { updateTotalSteps } from "./utils"; export class SelectProjectTypeStep implements IProjectCreationStep { public async run(metadata: IProjectCreationMetadata): Promise { @@ -25,19 +26,17 @@ export class SelectProjectTypeStep implements IProjectCreationStep { switch (selectedType.label) { case "application": metadata.projectType = ProjectType.JAVA_APPLICATION; - metadata.totalSteps = 5; break; case "library": metadata.projectType = ProjectType.JAVA_LIBRARY; - metadata.totalSteps = 5; break; case "Gradle plugin": metadata.projectType = ProjectType.JAVA_GRADLE_PLUGIN; - metadata.totalSteps = 4; // when creating gradle plugin, we shouldn't specify test framework break; default: resolve(StepResult.STOP); } + updateTotalSteps(metadata); metadata.steps.push(selectProjectTypeStep); metadata.nextStep = selectScriptDSLStep; resolve(StepResult.NEXT); diff --git a/extension/src/createProject/SelectScriptDSLStep.ts b/extension/src/createProject/SelectScriptDSLStep.ts index 7e43c4e66..0b21217ff 100644 --- a/extension/src/createProject/SelectScriptDSLStep.ts +++ b/extension/src/createProject/SelectScriptDSLStep.ts @@ -5,6 +5,7 @@ import * as vscode from "vscode"; import { selectTestFrameworkStep } from "./SelectTestFrameworkStep"; import { specifyProjectNameStep } from "./SpecifyProjectNameStep"; import { IProjectCreationMetadata, IProjectCreationStep, ProjectType, StepResult } from "./types"; +import { createQuickInputButtons, switchToAdvancedLabel, updateTotalSteps } from "./utils"; export class SelectScriptDSLStep implements IProjectCreationStep { public async run(metadata: IProjectCreationMetadata): Promise { @@ -19,16 +20,7 @@ export class SelectScriptDSLStep implements IProjectCreationStep { pickBox.matchOnDescription = true; pickBox.ignoreFocusOut = true; pickBox.items = this.getScriptDSLPickItems(); - if (metadata.steps.length) { - pickBox.buttons = [vscode.QuickInputButtons.Back]; - disposables.push( - pickBox.onDidTriggerButton((item) => { - if (item === vscode.QuickInputButtons.Back) { - resolve(StepResult.PREVIOUS); - } - }) - ); - } + pickBox.buttons = createQuickInputButtons(metadata); disposables.push( pickBox.onDidAccept(() => { const selectedScriptDSL = pickBox.selectedItems[0]; @@ -52,6 +44,15 @@ export class SelectScriptDSLStep implements IProjectCreationStep { resolve(StepResult.NEXT); } }), + pickBox.onDidTriggerButton((item) => { + if (item === vscode.QuickInputButtons.Back) { + resolve(StepResult.PREVIOUS); + } else if (item.tooltip === switchToAdvancedLabel) { + metadata.isAdvanced = true; + updateTotalSteps(metadata); + resolve(StepResult.RESTART); + } + }), pickBox.onDidHide(() => { resolve(StepResult.STOP); }) diff --git a/extension/src/createProject/SelectTestFrameworkStep.ts b/extension/src/createProject/SelectTestFrameworkStep.ts index 5afcf0cb2..88fc04d17 100644 --- a/extension/src/createProject/SelectTestFrameworkStep.ts +++ b/extension/src/createProject/SelectTestFrameworkStep.ts @@ -4,6 +4,7 @@ import * as vscode from "vscode"; import { specifyProjectNameStep } from "./SpecifyProjectNameStep"; import { IProjectCreationMetadata, IProjectCreationStep, StepResult, TestFramework } from "./types"; +import { createQuickInputButtons } from "./utils"; export class SelectTestFrameworkStep implements IProjectCreationStep { public async run(metadata: IProjectCreationMetadata): Promise { @@ -18,16 +19,7 @@ export class SelectTestFrameworkStep implements IProjectCreationStep { pickBox.matchOnDescription = true; pickBox.ignoreFocusOut = true; pickBox.items = this.getTestFrameworkPickItems(); - if (metadata.steps.length) { - pickBox.buttons = [vscode.QuickInputButtons.Back]; - disposables.push( - pickBox.onDidTriggerButton((item) => { - if (item === vscode.QuickInputButtons.Back) { - resolve(StepResult.PREVIOUS); - } - }) - ); - } + pickBox.buttons = createQuickInputButtons(metadata); disposables.push( pickBox.onDidAccept(() => { const selectedTestFramework = pickBox.selectedItems[0]; @@ -54,6 +46,11 @@ export class SelectTestFrameworkStep implements IProjectCreationStep { resolve(StepResult.NEXT); } }), + pickBox.onDidTriggerButton((item) => { + if (item === vscode.QuickInputButtons.Back) { + resolve(StepResult.PREVIOUS); + } + }), pickBox.onDidHide(() => { resolve(StepResult.STOP); }) diff --git a/extension/src/createProject/SpecifyProjectNameStep.ts b/extension/src/createProject/SpecifyProjectNameStep.ts index 15d18e3b9..d5382777a 100644 --- a/extension/src/createProject/SpecifyProjectNameStep.ts +++ b/extension/src/createProject/SpecifyProjectNameStep.ts @@ -4,6 +4,7 @@ import * as vscode from "vscode"; import { specifySourcePackageNameStep } from "./SpecifySourcePackageNameStep"; import { IProjectCreationMetadata, IProjectCreationStep, StepResult } from "./types"; +import { createQuickInputButtons, switchToAdvancedLabel, updateTotalSteps } from "./utils"; export class SpecifyProjectNameStep implements IProjectCreationStep { public async run(metadata: IProjectCreationMetadata): Promise { @@ -21,16 +22,7 @@ export class SpecifyProjectNameStep implements IProjectCreationStep { const validationMessage: string | undefined = this.isValidProjectName(metadata.projectName); inputBox.enabled = validationMessage === undefined; inputBox.validationMessage = validationMessage; - if (metadata.steps.length) { - inputBox.buttons = [vscode.QuickInputButtons.Back]; - disposables.push( - inputBox.onDidTriggerButton((item) => { - if (item === vscode.QuickInputButtons.Back) { - resolve(StepResult.PREVIOUS); - } - }) - ); - } + inputBox.buttons = createQuickInputButtons(metadata); disposables.push( inputBox.onDidChangeValue(() => { const validationMessage: string | undefined = this.isValidProjectName(inputBox.value); @@ -43,6 +35,15 @@ export class SpecifyProjectNameStep implements IProjectCreationStep { metadata.nextStep = !metadata.isAdvanced ? undefined : specifySourcePackageNameStep; resolve(StepResult.NEXT); }), + inputBox.onDidTriggerButton((item) => { + if (item === vscode.QuickInputButtons.Back) { + resolve(StepResult.PREVIOUS); + } else if (item.tooltip === switchToAdvancedLabel) { + metadata.isAdvanced = true; + updateTotalSteps(metadata); + resolve(StepResult.RESTART); + } + }), inputBox.onDidHide(() => { resolve(StepResult.STOP); }) diff --git a/extension/src/createProject/SpecifySourcePackageNameStep.ts b/extension/src/createProject/SpecifySourcePackageNameStep.ts index dd017620f..0df015990 100644 --- a/extension/src/createProject/SpecifySourcePackageNameStep.ts +++ b/extension/src/createProject/SpecifySourcePackageNameStep.ts @@ -3,7 +3,7 @@ import * as vscode from "vscode"; import { IProjectCreationMetadata, IProjectCreationStep, StepResult } from "./types"; -import { asyncDebounce } from "./utils"; +import { asyncDebounce, createQuickInputButtons } from "./utils"; export class SpecifySourcePackageNameStep implements IProjectCreationStep { public static GET_NORMALIZED_PACKAGE_NAME = "getNormalizedPackageName"; @@ -34,16 +34,7 @@ export class SpecifySourcePackageNameStep implements IProjectCreationStep { inputBox.value = normalizedName as string; inputBox.ignoreFocusOut = true; inputBox.enabled = true; - if (metadata.steps.length) { - inputBox.buttons = [vscode.QuickInputButtons.Back]; - disposables.push( - inputBox.onDidTriggerButton((item) => { - if (item === vscode.QuickInputButtons.Back) { - resolve(StepResult.PREVIOUS); - } - }) - ); - } + inputBox.buttons = createQuickInputButtons(metadata); disposables.push( inputBox.onDidChangeValue(async () => { const normalizedName = await getNormalizedPackageNameTrigger(inputBox.value); @@ -67,6 +58,11 @@ export class SpecifySourcePackageNameStep implements IProjectCreationStep { resolve(StepResult.NEXT); } }), + inputBox.onDidTriggerButton((item) => { + if (item === vscode.QuickInputButtons.Back) { + resolve(StepResult.PREVIOUS); + } + }), inputBox.onDidHide(() => { resolve(StepResult.STOP); }) diff --git a/extension/src/createProject/types.ts b/extension/src/createProject/types.ts index 44eec269c..063965089 100644 --- a/extension/src/createProject/types.ts +++ b/extension/src/createProject/types.ts @@ -25,6 +25,8 @@ export enum StepResult { NEXT, STOP, PREVIOUS, + // used for switching mode and restart all steps + RESTART, } export enum ProjectType { diff --git a/extension/src/createProject/utils.ts b/extension/src/createProject/utils.ts index 3d7a34a34..3ff5be744 100644 --- a/extension/src/createProject/utils.ts +++ b/extension/src/createProject/utils.ts @@ -3,6 +3,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { debounce } from "lodash"; +import { QuickInputButton, QuickInputButtons, ThemeIcon } from "vscode"; +import { IProjectCreationMetadata, ProjectType } from "./types"; + +export const switchToAdvancedLabel = "Switch to advanced mode..."; export function asyncDebounce(func: any, wait: any, bind: any) { const debounced = debounce(async (resolve, reject, bindSelf, args) => { @@ -22,3 +26,28 @@ export function asyncDebounce(func: any, wait: any, bind: any) { return returnFunc; } + +export function updateTotalSteps(metadata: IProjectCreationMetadata): void { + if (!metadata.isAdvanced) { + metadata.totalSteps = 2; + } else if (metadata.projectType === ProjectType.JAVA_GRADLE_PLUGIN) { + // when creating gradle plugin, we shouldn't specify test framework + metadata.totalSteps = 4; + } else { + metadata.totalSteps = 5; + } +} + +export function createQuickInputButtons(metadata: IProjectCreationMetadata): QuickInputButton[] { + const buttons: QuickInputButton[] = []; + if (metadata.steps.length) { + buttons.push(QuickInputButtons.Back); + } + if (!metadata.isAdvanced) { + buttons.push({ + iconPath: new ThemeIcon("settings-gear"), + tooltip: switchToAdvancedLabel, + }); + } + return buttons; +}