Merge from vscode 2e5312cd61ff99c570299ecc122c52584265eda2

This commit is contained in:
ADS Merger
2020-04-23 02:50:35 +00:00
committed by Anthony Dresser
parent 3603f55d97
commit 7f1d8fc32f
659 changed files with 22709 additions and 12497 deletions

View File

@@ -156,9 +156,12 @@ export class SCMStatusController implements IWorkbenchContribution {
const disposables = new DisposableStore();
for (const c of commands) {
const tooltip = `${label} - ${c.tooltip}`;
disposables.add(this.statusbarService.addEntry({
text: c.title,
tooltip: `${label} - ${c.tooltip}`,
ariaLabel: c.tooltip || label,
tooltip,
command: c
}, 'status.scm', localize('status.scm', "Source Control"), MainThreadStatusBarAlignment.LEFT, 10000));
}

View File

@@ -25,7 +25,7 @@ import { ActionBar, ActionViewItem } from 'vs/base/browser/ui/actionbar/actionba
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
import { Command } from 'vs/editor/common/modes';
import { renderCodicons } from 'vs/base/common/codicons';
import { renderCodicons, Codicon } from 'vs/base/common/codicons';
import { escape } from 'vs/base/common/strings';
import { WorkbenchList } from 'vs/platform/list/browser/listService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
@@ -203,13 +203,21 @@ export class MainPane extends ViewPane {
const renderer = this.instantiationService.createInstance(ProviderRenderer);
const identityProvider = { getId: (r: ISCMRepository) => r.provider.id };
this.list = <WorkbenchList<ISCMRepository>>this.instantiationService.createInstance(WorkbenchList, `SCM Main`, container, delegate, [renderer], {
this.list = this.instantiationService.createInstance(WorkbenchList, `SCM Main`, container, delegate, [renderer], {
identityProvider,
horizontalScrolling: false,
overrideStyles: {
listBackground: SIDE_BAR_BACKGROUND
},
accessibilityProvider: {
getAriaLabel(r: ISCMRepository) {
return r.provider.label;
},
getWidgetAriaLabel() {
return MainPane.TITLE;
}
}
});
}) as WorkbenchList<ISCMRepository>;
this._register(renderer.onDidRenderElement(e => this.list.updateWidth(this.viewModel.repositories.indexOf(e)), null));
this._register(this.list.onDidChangeSelection(this.onListSelectionChange, this));
@@ -242,6 +250,7 @@ export class MainPane extends ViewPane {
}
protected layoutBody(height: number, width: number): void {
super.layoutBody(height, width);
this.list.layout(height, width);
}
@@ -328,6 +337,7 @@ export class MainPaneDescriptor implements IViewDescriptor {
readonly id = MainPane.ID;
readonly name = MainPane.TITLE;
readonly containerIcon = Codicon.sourceControl.classNames;
readonly ctorDescriptor: SyncDescriptor<MainPane>;
readonly canToggleVisibility = true;
readonly hideByDefault = false;

View File

@@ -5,7 +5,7 @@
import 'vs/css!./media/scmViewlet';
import { Event, Emitter } from 'vs/base/common/event';
import { basename, isEqual } from 'vs/base/common/resources';
import { basename, dirname, isEqual } from 'vs/base/common/resources';
import { IDisposable, Disposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle';
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer';
import { append, $, addClass, toggleClass, trackFocus, removeClass } from 'vs/base/browser/dom';
@@ -27,7 +27,7 @@ import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar
import { IThemeService, LIGHT, registerThemingParticipant, IFileIconTheme } from 'vs/platform/theme/common/themeService';
import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar } from './util';
import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService';
import { WorkbenchCompressibleObjectTree, TreeResourceNavigator, IOpenEvent } from 'vs/platform/list/browser/listService';
import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async';
import { INotificationService } from 'vs/platform/notification/common/notification';
@@ -71,6 +71,9 @@ import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector';
import { LinkDetector } from 'vs/editor/contrib/links/links';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
import { IModeService } from 'vs/editor/common/services/modeService';
import { ILabelService } from 'vs/platform/label/common/label';
type TreeElement = ISCMResourceGroup | IResourceNode<ISCMResource, ISCMResourceGroup> | ISCMResource;
@@ -388,6 +391,39 @@ class SCMResourceIdentityProvider implements IIdentityProvider<TreeElement> {
}
}
export class SCMAccessibilityProvider implements IListAccessibilityProvider<TreeElement> {
constructor(@ILabelService private readonly labelService: ILabelService) { }
getWidgetAriaLabel(): string {
return localize('scm', "Source Control Management");
}
getAriaLabel(element: TreeElement): string {
if (ResourceTree.isResourceNode(element)) {
return this.labelService.getUriLabel(element.uri, { relative: true, noPrefix: true }) || element.name;
} else if (isSCMResourceGroup(element)) {
return element.label;
} else {
const result: string[] = [];
if (element.decorations.tooltip) {
result.push(element.decorations.tooltip);
}
result.push(basename(element.sourceUri));
const path = this.labelService.getUriLabel(dirname(element.sourceUri), { relative: true, noPrefix: true });
if (path) {
result.push(path);
}
return result.join(', ');
}
}
}
interface IGroupItem {
readonly group: ISCMResourceGroup;
readonly resources: ISCMResource[];
@@ -635,6 +671,7 @@ export class RepositoryPane extends ViewPane {
@IMenuService protected menuService: IMenuService,
@IStorageService private storageService: IStorageService,
@IModelService private modelService: IModelService,
@IModeService private modeService: IModeService,
@IOpenerService openerService: IOpenerService,
@ITelemetryService telemetryService: ITelemetryService,
) {
@@ -772,7 +809,9 @@ export class RepositoryPane extends ViewPane {
});
this.configurationService.updateValue('editor.wordBasedSuggestions', false, { resource: uri }, ConfigurationTarget.MEMORY);
this.inputModel = this.modelService.getModel(uri) || this.modelService.createModel('', null, uri);
const mode = this.modeService.create('scminput');
this.inputModel = this.modelService.getModel(uri) || this.modelService.createModel('', mode, uri);
this.inputEditor.setModel(this.inputModel);
this._register(this.inputEditor.onDidChangeCursorPosition(triggerValidation));
@@ -784,6 +823,7 @@ export class RepositoryPane extends ViewPane {
return;
}
this.inputModel.setValue(value);
this.inputEditor.setPosition(this.inputModel.getFullModelRange().getEndPosition());
}));
// Keep API in sync with model and update placeholder and validation
@@ -801,9 +841,7 @@ export class RepositoryPane extends ViewPane {
const onDidChangeContentHeight = Event.filter(this.inputEditor.onDidContentSizeChange, e => e.contentHeightChanged);
this._register(onDidChangeContentHeight(() => this.layoutBody()));
if (this.repository.provider.onDidChangeCommitTemplate) {
this._register(this.repository.provider.onDidChangeCommitTemplate(this.onDidChangeCommitTemplate, this));
}
this._register(this.repository.provider.onDidChangeCommitTemplate(this.onDidChangeCommitTemplate, this));
this.onDidChangeCommitTemplate();
@@ -845,7 +883,7 @@ export class RepositoryPane extends ViewPane {
const keyboardNavigationLabelProvider = new SCMTreeKeyboardNavigationLabelProvider();
const identityProvider = new SCMResourceIdentityProvider();
this.tree = <WorkbenchCompressibleObjectTree<TreeElement, FuzzyScore>>this.instantiationService.createInstance(
this.tree = this.instantiationService.createInstance(
WorkbenchCompressibleObjectTree,
'SCM Tree Repo',
this.listContainer,
@@ -859,13 +897,12 @@ export class RepositoryPane extends ViewPane {
keyboardNavigationLabelProvider,
overrideStyles: {
listBackground: SIDE_BAR_BACKGROUND
}
});
},
accessibilityProvider: this.instantiationService.createInstance(SCMAccessibilityProvider)
}) as WorkbenchCompressibleObjectTree<TreeElement, FuzzyScore>;
this._register(Event.chain(this.tree.onDidOpen)
.map(e => e.elements[0])
.filter<ISCMResource>((e): e is ISCMResource => !!e && !isSCMResourceGroup(e) && !ResourceTree.isResourceNode(e))
.on(this.open, this));
const navigator = this._register(new TreeResourceNavigator(this.tree, { openOnSelection: false }));
this._register(navigator.onDidOpenResource(this.open, this));
this._register(Event.chain(this.tree.onDidPin)
.map(e => e.elements[0])
@@ -875,7 +912,7 @@ export class RepositoryPane extends ViewPane {
this._register(this.tree.onContextMenu(this.onListContextMenu, this));
this._register(this.tree);
let mode = this.configurationService.getValue<'tree' | 'list'>('scm.defaultViewMode') === 'list' ? ViewModelMode.List : ViewModelMode.Tree;
let viewMode = this.configurationService.getValue<'tree' | 'list'>('scm.defaultViewMode') === 'list' ? ViewModelMode.List : ViewModelMode.Tree;
const rootUri = this.repository.provider.rootUri;
@@ -883,11 +920,11 @@ export class RepositoryPane extends ViewPane {
const storageMode = this.storageService.get(`scm.repository.viewMode:${rootUri.toString()}`, StorageScope.WORKSPACE) as ViewModelMode;
if (typeof storageMode === 'string') {
mode = storageMode;
viewMode = storageMode;
}
}
this.viewModel = this.instantiationService.createInstance(ViewModel, this.repository.provider.groups, this.tree, mode);
this.viewModel = this.instantiationService.createInstance(ViewModel, this.repository.provider.groups, this.tree, viewMode);
this._register(this.viewModel);
addClass(this.listContainer, 'file-icon-themable-tree');
@@ -929,6 +966,10 @@ export class RepositoryPane extends ViewPane {
return;
}
if (width !== undefined) {
super.layoutBody(height, width);
}
this.cachedHeight = height;
this.cachedWidth = width;
@@ -1005,8 +1046,12 @@ export class RepositoryPane extends ViewPane {
return this.repository.provider;
}
private open(e: ISCMResource): void {
e.open();
private open(e: IOpenEvent<TreeElement | null>): void {
if (!e.element || isSCMResourceGroup(e.element) || ResourceTree.isResourceNode(e.element)) {
return;
}
e.element.open(!!e.editorOptions.preserveFocus);
}
private pin(): void {

View File

@@ -26,17 +26,25 @@ import { SCMService } from 'vs/workbench/contrib/scm/common/scmService';
import { IViewContainersRegistry, ViewContainerLocation, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views';
import { SCMViewPaneContainer } from 'vs/workbench/contrib/scm/browser/scmViewlet';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { ModesRegistry } from 'vs/editor/common/modes/modesRegistry';
import { Codicon } from 'vs/base/common/codicons';
class OpenSCMViewletAction extends ShowViewletAction {
static readonly ID = VIEWLET_ID;
static readonly LABEL = localize('toggleGitViewlet', "Show Git");
static readonly LABEL = localize('toggleSCMViewlet', "Show SCM");
constructor(id: string, label: string, @IViewletService viewletService: IViewletService, @IEditorGroupsService editorGroupService: IEditorGroupsService, @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService) {
super(id, label, VIEWLET_ID, viewletService, editorGroupService, layoutService);
}
}
ModesRegistry.registerLanguage({
id: 'scminput',
extensions: [],
mimetypes: ['text/x-scm-input']
});
Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench)
.registerWorkbenchContribution(DirtyDiffWorkbenchController, LifecyclePhase.Restored);
@@ -44,7 +52,9 @@ Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegis
id: VIEWLET_ID,
name: localize('source control', "Source Control"),
ctorDescriptor: new SyncDescriptor(SCMViewPaneContainer),
icon: 'codicon-source-control',
storageId: 'workbench.scm.views.state',
icon: Codicon.sourceControl.classNames,
alwaysUseContainerInfo: true,
order: 12 // {{SQL CARBON EDIT}}
}, ViewContainerLocation.Sidebar);
@@ -53,7 +63,7 @@ Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench)
// Register Action to Open Viewlet
Registry.as<IWorkbenchActionRegistry>(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction(
SyncActionDescriptor.create(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), {
SyncActionDescriptor.from(OpenSCMViewletAction, {
primary: 0,
win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G },
linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G },

View File

@@ -24,16 +24,16 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService';
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { IViewsRegistry, Extensions, IViewDescriptorService, IViewDescriptor } from 'vs/workbench/common/views';
import { IViewsRegistry, Extensions, IViewDescriptorService, IViewDescriptor, IAddedViewDescriptorRef, IViewDescriptorRef } from 'vs/workbench/common/views';
import { Registry } from 'vs/platform/registry/common/platform';
import { RepositoryPane, RepositoryViewDescriptor } from 'vs/workbench/contrib/scm/browser/repositoryPane';
import { MainPaneDescriptor, MainPane, IViewModel } from 'vs/workbench/contrib/scm/browser/mainPane';
import { ViewPaneContainer, IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
import type { IAddedViewDescriptorRef, IViewDescriptorRef } from 'vs/workbench/browser/parts/views/views';
import { debounce } from 'vs/base/common/decorators';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { addClass } from 'vs/base/browser/dom';
import { Codicon } from 'vs/base/common/codicons';
export interface ISpliceEvent<T> {
index: number;
@@ -69,6 +69,7 @@ export class EmptyPane extends ViewPane {
export class EmptyPaneDescriptor implements IViewDescriptor {
readonly id = EmptyPane.ID;
readonly name = EmptyPane.TITLE;
readonly containerIcon = Codicon.sourceControl.classNames;
readonly ctorDescriptor = new SyncDescriptor(EmptyPane);
readonly canToggleVisibility = true;
readonly hideByDefault = false;
@@ -79,8 +80,6 @@ export class EmptyPaneDescriptor implements IViewDescriptor {
export class SCMViewPaneContainer extends ViewPaneContainer implements IViewModel {
private static readonly STATE_KEY = 'workbench.scm.views.state';
private menus: SCMMenus;
private _repositories: ISCMRepository[] = [];
@@ -103,7 +102,7 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
get onDidChangeVisibleRepositories(): Event<ISCMRepository[]> {
const modificationEvent = Event.debounce(Event.any(this.viewsModel.onDidAdd, this.viewsModel.onDidRemove), () => null, 0);
const modificationEvent = Event.debounce(Event.any(this.viewContainerModel.onDidAddVisibleViewDescriptors, this.viewContainerModel.onDidRemoveVisibleViewDescriptors), () => null, 0);
return Event.map(modificationEvent, () => this.visibleRepositories);
}
@@ -125,7 +124,7 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
@IContextKeyService contextKeyService: IContextKeyService,
@IViewDescriptorService viewDescriptorService: IViewDescriptorService
) {
super(VIEWLET_ID, SCMViewPaneContainer.STATE_KEY, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService);
super(VIEWLET_ID, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService, viewDescriptorService);
this.menus = instantiationService.createInstance(SCMMenus, undefined);
this._register(this.menus.onDidChangeTitle(this.updateTitleArea, this));
@@ -142,14 +141,14 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
this._register(configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('scm.alwaysShowProviders') && configurationService.getValue<boolean>('scm.alwaysShowProviders')) {
this.viewsModel.setVisible(MainPane.ID, true);
this.viewContainerModel.setVisible(MainPane.ID, true);
}
}));
this.repositoryCountKey = contextKeyService.createKey('scm.providerCount', 0);
this._register(this.viewsModel.onDidAdd(this.onDidShowView, this));
this._register(this.viewsModel.onDidRemove(this.onDidHideView, this));
this._register(this.viewContainerModel.onDidAddVisibleViewDescriptors(this.onDidShowView, this));
this._register(this.viewContainerModel.onDidRemoveVisibleViewDescriptors(this.onDidHideView, this));
}
create(parent: HTMLElement): void {
@@ -216,8 +215,8 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
@debounce(0)
private afterOnDidHideView(): void {
if (this.repositoryCountKey.get()! > 0 && this.viewDescriptors.every(d => !this.viewsModel.isVisible(d.id))) {
this.viewsModel.setVisible(this.viewDescriptors[0].id, true);
if (this.repositoryCountKey.get()! > 0 && this.viewDescriptors.every(d => !this.viewContainerModel.isVisible(d.id))) {
this.viewContainerModel.setVisible(this.viewDescriptors[0].id, true);
}
}
@@ -284,9 +283,9 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
setVisibleRepositories(repositories: ISCMRepository[]): void {
const visibleViewDescriptors = this.viewsModel.visibleViewDescriptors;
const visibleViewDescriptors = this.viewContainerModel.visibleViewDescriptors;
const toSetVisible = this.viewsModel.viewDescriptors
const toSetVisible = this.viewContainerModel.activeViewDescriptors
.filter((d): d is RepositoryViewDescriptor => d instanceof RepositoryViewDescriptor && repositories.indexOf(d.repository) > -1 && visibleViewDescriptors.indexOf(d) === -1);
const toSetInvisible = visibleViewDescriptors
@@ -304,11 +303,11 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
}
this.viewsModel.setVisible(viewDescriptor.id, false);
this.viewContainerModel.setVisible(viewDescriptor.id, false);
}
for (const viewDescriptor of toSetVisible) {
this.viewsModel.setVisible(viewDescriptor.id, true, size);
this.viewContainerModel.setVisible(viewDescriptor.id, true, size);
}
}
}

View File

@@ -30,7 +30,7 @@ export interface ISCMResource {
readonly resourceGroup: ISCMResourceGroup;
readonly sourceUri: URI;
readonly decorations: ISCMResourceDecorations;
open(): Promise<void>;
open(preserveFocus: boolean): Promise<void>;
}
export interface ISCMResourceGroup extends ISequence<ISCMResource> {