export async function registerAdvanceAskForChoice()

in src/commands/askForOptionCommands.ts [25:85]


export async function registerAdvanceAskForChoice(context: ExtensionContext): Promise<void> {
    context.subscriptions.push(commands.registerCommand(JavaTestRunnerCommands.ADVANCED_ASK_CLIENT_FOR_CHOICE, async (placeHolder: string, choices: IOption[], advancedAction: string, canPickMany: boolean) => {
        let result: string[] | undefined;
        const disposables: Disposable[] = [];
        try {
            result = await new Promise<string[] | undefined>((resolve: (value: string[] | undefined) => void) => {
                const quickPick: QuickPick<IOption> = window.createQuickPick<IOption>();
                // if all the items are advanced item, show them directly
                let showAdvancedItem: boolean = choices.filter((c: IOption) => {
                    return !c.isAdvanced;
                }).length === 0;
                quickPick.title = placeHolder;
                quickPick.placeholder = placeHolder;
                quickPick.items = filterOptions(showAdvancedItem, choices);
                quickPick.buttons = getActionButtons(showAdvancedItem, advancedAction);
                quickPick.canSelectMany = canPickMany;
                quickPick.ignoreFocusOut = true;
                disposables.push(quickPick.onDidTriggerButton((btn: QuickInputButton) => {
                    if (btn.tooltip?.endsWith(advancedAction)) {
                        showAdvancedItem = !showAdvancedItem;
                        quickPick.items = filterOptions(showAdvancedItem, choices);
                        quickPick.buttons = getActionButtons(showAdvancedItem, advancedAction);
                    }
                }));
                disposables.push(quickPick.onDidHide(() => {
                    return resolve(undefined);
                }));
                disposables.push(quickPick.onDidAccept(() => {
                    return resolve(quickPick.selectedItems.map((o: IOption) => o.value));
                }));
                disposables.push(quickPick);
                quickPick.show();
            });
        } finally {
            for (const d of disposables) {
                d.dispose();
            }
        }
        return result;
    }));

    function filterOptions(showAdvancedItem: boolean, choices: IOption[]): IOption[] {
        return choices.filter((c: IOption) => {
            return !c.isAdvanced || showAdvancedItem && c.isAdvanced;
        });
    }

    function getActionButtons(showAdvancedItem: boolean, advancedAction: string): QuickInputButton[] {
        if (showAdvancedItem) {
            return [{
                iconPath: new ThemeIcon('collapse-all'),
                tooltip: `Hide ${advancedAction}`,
            }];
        }

        return [{
            iconPath: new ThemeIcon('expand-all'),
            tooltip: `Show ${advancedAction}`,
        }];
    }
}