|
|
- 'use strict';
- import {
- CancellationTokenSource,
- commands,
- QuickPickItem,
- QuickPickOptions,
- TextDocumentShowOptions,
- TextEditor,
- Uri,
- window
- } from 'vscode';
- import { Commands, openEditor } from '../commands';
- import { configuration } from '../configuration';
- import { GlyphChars } from '../constants';
- import { Container } from '../container';
- import { GitLog, GitLogCommit, GitRepoSearchBy, GitStashCommit, GitUri } from '../git/gitService';
- import { KeyMapping, Keys } from '../keyboard';
- import { Strings } from '../system';
- import {
- BranchesAndTagsQuickPick,
- BranchQuickPickItem,
- RefQuickPickItem,
- TagQuickPickItem
- } from './branchesAndTagsQuickPick';
-
- export function getQuickPickIgnoreFocusOut() {
- return !configuration.get<boolean>(configuration.name('advanced')('quickPick')('closeOnFocusOut').value);
- }
-
- export function showQuickPickProgress(message: string, mapping?: KeyMapping): CancellationTokenSource {
- const cancellation = new CancellationTokenSource();
- void _showQuickPickProgress(message, cancellation, mapping);
- return cancellation;
- }
-
- async function _showQuickPickProgress(message: string, cancellation: CancellationTokenSource, mapping?: KeyMapping) {
- const scope = mapping && (await Container.keyboard.beginScope(mapping));
-
- try {
- await window.showQuickPick(
- _getInfiniteCancellablePromise(cancellation),
- {
- placeHolder: message,
- ignoreFocusOut: getQuickPickIgnoreFocusOut()
- } as QuickPickOptions,
- cancellation.token
- );
- }
- catch (ex) {
- // Not sure why this throws
- }
- finally {
- cancellation.cancel();
- scope && scope.dispose();
- }
- }
-
- function _getInfiniteCancellablePromise(cancellation: CancellationTokenSource) {
- return new Promise<QuickPickItem[]>((resolve, reject) => {
- const disposable = cancellation.token.onCancellationRequested(() => {
- disposable.dispose();
- resolve([]);
- });
- });
- }
-
- export interface QuickPickItem extends QuickPickItem {
- onDidSelect?(): void;
- onDidPressKey?(key: Keys): Promise<{} | undefined>;
- }
-
- export class CommandQuickPickItem implements QuickPickItem {
- label!: string;
- description!: string;
- detail?: string | undefined;
- protected command: Commands | undefined;
- protected args: any[] | undefined;
-
- constructor(item: QuickPickItem, args?: [Commands, any[]]);
- constructor(item: QuickPickItem, command?: Commands, args?: any[]);
- constructor(item: QuickPickItem, commandOrArgs?: Commands | [Commands, any[]], args?: any[]) {
- if (commandOrArgs === undefined) {
- this.command = undefined;
- this.args = args;
- }
- else if (typeof commandOrArgs === 'string') {
- this.command = commandOrArgs;
- this.args = args;
- }
- else {
- this.command = commandOrArgs[0];
- this.args = commandOrArgs.slice(1);
- }
- Object.assign(this, item);
- }
-
- execute(): Promise<{} | undefined> {
- if (this.command === undefined) return Promise.resolve(undefined);
-
- return commands.executeCommand(this.command, ...(this.args || [])) as Promise<{} | undefined>;
- }
-
- onDidPressKey(key: Keys): Promise<{} | undefined> {
- return this.execute();
- }
- }
-
- export class CommitQuickPickItem implements QuickPickItem {
- label: string;
- description: string;
- detail: string;
-
- constructor(
- public readonly commit: GitLogCommit
- ) {
- const message = commit.getShortMessage();
- if (commit.isStash) {
- this.label = message;
- this.description = '';
- this.detail = `${GlyphChars.Space} ${(commit as GitStashCommit).stashName || commit.shortSha} ${Strings.pad(
- GlyphChars.Dot,
- 1,
- 1
- )} ${commit.formattedDate} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${commit.getFormattedDiffStatus({
- compact: true
- })}`;
- }
- else {
- this.label = message;
- this.description = `${Strings.pad('$(git-commit)', 1, 1)} ${commit.shortSha}`;
- this.detail = `${GlyphChars.Space} ${commit.author}, ${commit.formattedDate}${
- commit.isFile
- ? ''
- : ` ${Strings.pad(GlyphChars.Dot, 1, 1)} ${commit.getFormattedDiffStatus({ compact: true })}`
- }`;
- }
- }
- }
-
- export class ChooseFromBranchesAndTagsQuickPickItem extends CommandQuickPickItem {
- constructor(
- private readonly repoPath: string,
- private readonly placeHolder: string,
- private readonly _goBack?: CommandQuickPickItem,
- item: QuickPickItem = {
- label: 'Choose from Branch or Tag History...',
- description: `${Strings.pad(GlyphChars.Dash, 2, 2)} shows list of branches and tags`
- }
- ) {
- super(item, undefined, undefined);
- }
-
- execute(): Promise<CommandQuickPickItem | BranchQuickPickItem | TagQuickPickItem | RefQuickPickItem | undefined> {
- return new BranchesAndTagsQuickPick(this.repoPath).show(this.placeHolder, {
- allowCommitId: true,
- goBack: this._goBack
- });
- }
- }
-
- export class KeyCommandQuickPickItem extends CommandQuickPickItem {
- constructor(command: Commands, args?: any[]) {
- super({ label: '', description: '' } as QuickPickItem, command, args);
- }
- }
-
- export class MessageQuickPickItem extends CommandQuickPickItem {
- constructor(message: string) {
- super({ label: message, description: '' } as QuickPickItem);
- }
- }
-
- export class OpenFileCommandQuickPickItem extends CommandQuickPickItem {
- constructor(
- public readonly uri: Uri,
- item: QuickPickItem
- ) {
- super(item, undefined, undefined);
- }
-
- async execute(options?: TextDocumentShowOptions): Promise<TextEditor | undefined> {
- return openEditor(this.uri, options);
- }
-
- // onDidSelect(): Promise<{} | undefined> {
- // return this.execute({
- // preserveFocus: true,
- // preview: true
- // });
- // }
-
- onDidPressKey(key: Keys): Promise<{} | undefined> {
- return this.execute({
- preserveFocus: true,
- preview: false
- });
- }
- }
-
- export class OpenFilesCommandQuickPickItem extends CommandQuickPickItem {
- constructor(
- public readonly uris: Uri[],
- item: QuickPickItem
- ) {
- super(item, undefined, undefined);
- }
-
- async execute(
- options: TextDocumentShowOptions = { preserveFocus: false, preview: false }
- ): Promise<{} | undefined> {
- for (const uri of this.uris) {
- await openEditor(uri, options);
- }
- return undefined;
- }
-
- async onDidPressKey(key: Keys): Promise<{} | undefined> {
- return this.execute({
- preserveFocus: true,
- preview: false
- });
- }
- }
-
- export class ShowCommitInViewQuickPickItem extends CommandQuickPickItem {
- constructor(
- public readonly commit: GitLogCommit,
- item: QuickPickItem = {
- label: 'Show in View',
- description: `${Strings.pad(GlyphChars.Dash, 2, 2)} displays the commit in the GitLens Search Commits view`
- }
- ) {
- super(item, undefined, undefined);
- }
-
- async execute(): Promise<{} | undefined> {
- await Container.searchView.search(this.commit.repoPath, this.commit.sha, GitRepoSearchBy.Sha, {
- label: { label: `commits with an id matching '${this.commit.shortSha}'` }
- });
- return undefined;
- }
- }
-
- export class ShowCommitSearchResultsInViewQuickPickItem extends CommandQuickPickItem {
- constructor(
- public readonly search: string,
- public readonly searchBy: GitRepoSearchBy,
- public readonly results: GitLog,
- public readonly resultsLabel: string | { label: string; resultsType?: { singular: string; plural: string } },
- item: QuickPickItem = {
- label: 'Show in View',
- description: `${Strings.pad(
- GlyphChars.Dash,
- 2,
- 2
- )} displays the search results in the GitLens Search Commits view`
- }
- ) {
- super(item, undefined, undefined);
- }
-
- async execute(): Promise<{} | undefined> {
- await Container.searchView.showSearchResults(this.results.repoPath, this.search, this.searchBy, this.results, {
- label: this.resultsLabel
- });
- return undefined;
- }
- }
-
- export class ShowFileHistoryInViewQuickPickItem extends CommandQuickPickItem {
- constructor(
- public readonly uri: GitUri,
- public readonly baseRef: string | undefined,
- item: QuickPickItem = {
- label: 'Show in View',
- description: `${Strings.pad(
- GlyphChars.Dash,
- 2,
- 2
- )} displays the file history in the GitLens File History view`
- }
- ) {
- super(item, undefined, undefined);
- }
-
- async execute(): Promise<{} | undefined> {
- await Container.fileHistoryView.showHistoryForUri(this.uri, this.baseRef);
- return undefined;
- }
- }
|