mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-30 16:50:30 -04:00
Merge from vscode 3c6f6af7347d38e87bc6406024e8dcf9e9bce229 (#8962)
* Merge from vscode 3c6f6af7347d38e87bc6406024e8dcf9e9bce229 * skip failing tests * update mac build image
This commit is contained in:
committed by
Karl Burtram
parent
0eaee18dc4
commit
fefe1454de
@@ -29,7 +29,7 @@ import { renderCodicons } 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';
|
||||
import { IViewDescriptor } from 'vs/workbench/common/views';
|
||||
import { IViewDescriptor, IViewDescriptorService } from 'vs/workbench/common/views';
|
||||
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||
|
||||
@@ -184,11 +184,12 @@ export class MainPane extends ViewPane {
|
||||
@IContextMenuService protected contextMenuService: IContextMenuService,
|
||||
@ISCMService protected scmService: ISCMService,
|
||||
@IInstantiationService instantiationService: IInstantiationService,
|
||||
@IViewDescriptorService viewDescriptorService: IViewDescriptorService,
|
||||
@IContextKeyService private readonly contextKeyService: IContextKeyService,
|
||||
@IMenuService private readonly menuService: IMenuService,
|
||||
@IConfigurationService configurationService: IConfigurationService
|
||||
) {
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, instantiationService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService);
|
||||
}
|
||||
|
||||
protected renderBody(container: HTMLElement): void {
|
||||
|
||||
@@ -173,20 +173,48 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor > .monaco-inputbox {
|
||||
.scm-viewlet .scm-editor-container {
|
||||
padding: 1px;
|
||||
position: relative;
|
||||
outline-offset: -1px;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor-container > .scm-editor-validation {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 10;
|
||||
left: 0px;
|
||||
box-sizing: border-box;
|
||||
font-size: 0.9em;
|
||||
padding: 1px 3px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor > .monaco-inputbox > .wrapper > .mirror {
|
||||
max-height: 134px;
|
||||
.scm-viewlet .scm-editor-container.synthetic-focus > .scm-editor-validation {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor > .monaco-inputbox > .wrapper > textarea.input {
|
||||
min-height: 26px;
|
||||
.scm-viewlet .scm-editor-placeholder {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
margin: 1px;
|
||||
padding: 3px 4px;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor.scroll > .monaco-inputbox > .wrapper > textarea.input {
|
||||
overflow-y: scroll;
|
||||
.scm-viewlet .scm-editor-placeholder.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scm-viewlet .scm-editor-container .monaco-editor-background,
|
||||
.scm-viewlet .scm-editor-container .monaco-editor,
|
||||
.scm-viewlet .scm-editor-container .mtk1 {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.scm-viewlet .list-view-mode .monaco-tl-twistie:not(.force-twistie):not(.collapsible) {
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
import 'vs/css!./media/scmViewlet';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { domEvent } from 'vs/base/browser/event';
|
||||
import { basename, 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';
|
||||
@@ -25,16 +24,13 @@ import { IAction, IActionViewItem, ActionRunner, Action } from 'vs/base/common/a
|
||||
import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
|
||||
import { SCMMenus } from './menus';
|
||||
import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IThemeService, LIGHT } from 'vs/platform/theme/common/themeService';
|
||||
import { IThemeService, LIGHT, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar } from './util';
|
||||
import { attachBadgeStyler, attachInputBoxStyler } from 'vs/platform/theme/common/styler';
|
||||
import { InputBox, MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
|
||||
import { format } from 'vs/base/common/strings';
|
||||
import { attachBadgeStyler } from 'vs/platform/theme/common/styler';
|
||||
import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { ThrottledDelayer, disposableTimeout } from 'vs/base/common/async';
|
||||
import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async';
|
||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree';
|
||||
import { ResourceTree, IResourceNode } from 'vs/base/common/resourceTree';
|
||||
import { ISequence, ISplice } from 'vs/base/common/sequence';
|
||||
@@ -45,7 +41,7 @@ import { URI } from 'vs/base/common/uri';
|
||||
import { FileKind } from 'vs/platform/files/common/files';
|
||||
import { compareFileNames } from 'vs/base/common/comparers';
|
||||
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
|
||||
import { IViewDescriptor } from 'vs/workbench/common/views';
|
||||
import { IViewDescriptor, IViewDescriptorService } from 'vs/workbench/common/views';
|
||||
import { localize } from 'vs/nls';
|
||||
import { flatten, find } from 'vs/base/common/arrays';
|
||||
import { memoize } from 'vs/base/common/decorators';
|
||||
@@ -54,7 +50,23 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag
|
||||
import { toResource, SideBySideEditor } from 'vs/workbench/common/editor';
|
||||
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
|
||||
import { Hasher } from 'vs/base/common/hash';
|
||||
import { CodeEditorWidget, ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWidget';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { IEditorConstructionOptions } from 'vs/editor/common/config/editorOptions';
|
||||
import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions';
|
||||
import { IModelService } from 'vs/editor/common/services/modelService';
|
||||
import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions';
|
||||
import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer';
|
||||
import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard';
|
||||
import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu';
|
||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { format } from 'vs/base/common/strings';
|
||||
import { inputPlaceholderForeground, inputValidationInfoBorder, inputValidationWarningBorder, inputValidationErrorBorder, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationErrorBackground, inputValidationErrorForeground, inputBackground, inputForeground, inputBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { SuggestController } from 'vs/editor/contrib/suggest/suggestController';
|
||||
import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
|
||||
|
||||
type TreeElement = ISCMResourceGroup | IResourceNode<ISCMResource, ISCMResourceGroup> | ISCMResource;
|
||||
|
||||
@@ -579,20 +591,14 @@ export class ToggleViewModeAction extends Action {
|
||||
}
|
||||
}
|
||||
|
||||
function convertValidationType(type: InputValidationType): MessageType {
|
||||
switch (type) {
|
||||
case InputValidationType.Information: return MessageType.INFO;
|
||||
case InputValidationType.Warning: return MessageType.WARNING;
|
||||
case InputValidationType.Error: return MessageType.ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
export class RepositoryPane extends ViewPane {
|
||||
|
||||
private cachedHeight: number | undefined = undefined;
|
||||
private cachedWidth: number | undefined = undefined;
|
||||
private inputBoxContainer!: HTMLElement;
|
||||
private inputBox!: InputBox;
|
||||
private inputContainer!: HTMLElement;
|
||||
private validationContainer!: HTMLElement;
|
||||
private inputEditor!: CodeEditorWidget;
|
||||
private inputModel!: ITextModel;
|
||||
private listContainer!: HTMLElement;
|
||||
private tree!: WorkbenchCompressibleObjectTree<TreeElement, FuzzyScore>;
|
||||
private viewModel!: ViewModel;
|
||||
@@ -613,12 +619,14 @@ export class RepositoryPane extends ViewPane {
|
||||
@INotificationService private readonly notificationService: INotificationService,
|
||||
@IEditorService protected editorService: IEditorService,
|
||||
@IInstantiationService protected instantiationService: IInstantiationService,
|
||||
@IViewDescriptorService viewDescriptorService: IViewDescriptorService,
|
||||
@IConfigurationService protected configurationService: IConfigurationService,
|
||||
@IContextKeyService contextKeyService: IContextKeyService,
|
||||
@IMenuService protected menuService: IMenuService,
|
||||
@IStorageService private storageService: IStorageService
|
||||
@IStorageService private storageService: IStorageService,
|
||||
@IModelService private modelService: IModelService,
|
||||
) {
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, instantiationService);
|
||||
super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService);
|
||||
|
||||
this.menus = instantiationService.createInstance(SCMMenus, this.repository.provider);
|
||||
this._register(this.menus);
|
||||
@@ -656,51 +664,123 @@ export class RepositoryPane extends ViewPane {
|
||||
this._register(focusTracker);
|
||||
|
||||
// Input
|
||||
this.inputBoxContainer = append(container, $('.scm-editor'));
|
||||
this.inputContainer = append(container, $('.scm-editor'));
|
||||
const editorContainer = append(this.inputContainer, $('.scm-editor-container'));
|
||||
|
||||
const placeholderTextContainer = append(editorContainer, $('.scm-editor-placeholder'));
|
||||
const updatePlaceholder = () => {
|
||||
const binding = this.keybindingService.lookupKeybinding('scm.acceptInput');
|
||||
const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter');
|
||||
const placeholder = format(this.repository.input.placeholder, label);
|
||||
const placeholderText = format(this.repository.input.placeholder, label);
|
||||
|
||||
this.inputBox.setPlaceHolder(placeholder);
|
||||
placeholderTextContainer.textContent = placeholderText;
|
||||
};
|
||||
|
||||
this.validationContainer = append(editorContainer, $('.scm-editor-validation'));
|
||||
|
||||
const validationDelayer = new ThrottledDelayer<any>(200);
|
||||
const validate = () => {
|
||||
return this.repository.input.validateInput(this.inputBox.value, this.inputBox.inputElement.selectionStart || 0).then(result => {
|
||||
const position = this.inputEditor.getSelection()?.getStartPosition();
|
||||
const offset = position && this.inputModel.getOffsetAt(position);
|
||||
const value = this.inputModel.getValue();
|
||||
|
||||
return this.repository.input.validateInput(value, offset || 0).then(result => {
|
||||
if (!result) {
|
||||
this.inputBox.inputElement.removeAttribute('aria-invalid');
|
||||
this.inputBox.hideMessage();
|
||||
removeClass(editorContainer, 'validation-info');
|
||||
removeClass(editorContainer, 'validation-warning');
|
||||
removeClass(editorContainer, 'validation-error');
|
||||
removeClass(this.validationContainer, 'validation-info');
|
||||
removeClass(this.validationContainer, 'validation-warning');
|
||||
removeClass(this.validationContainer, 'validation-error');
|
||||
this.validationContainer.textContent = null;
|
||||
} else {
|
||||
this.inputBox.inputElement.setAttribute('aria-invalid', 'true');
|
||||
this.inputBox.showMessage({ content: result.message, type: convertValidationType(result.type) });
|
||||
toggleClass(editorContainer, 'validation-info', result.type === InputValidationType.Information);
|
||||
toggleClass(editorContainer, 'validation-warning', result.type === InputValidationType.Warning);
|
||||
toggleClass(editorContainer, 'validation-error', result.type === InputValidationType.Error);
|
||||
toggleClass(this.validationContainer, 'validation-info', result.type === InputValidationType.Information);
|
||||
toggleClass(this.validationContainer, 'validation-warning', result.type === InputValidationType.Warning);
|
||||
toggleClass(this.validationContainer, 'validation-error', result.type === InputValidationType.Error);
|
||||
this.validationContainer.textContent = result.message;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const triggerValidation = () => validationDelayer.trigger(validate);
|
||||
|
||||
this.inputBox = new InputBox(this.inputBoxContainer, this.contextViewService, { flexibleHeight: true, flexibleMaxHeight: 134 });
|
||||
this.inputBox.setEnabled(this.isBodyVisible());
|
||||
this._register(attachInputBoxStyler(this.inputBox, this.themeService));
|
||||
this._register(this.inputBox);
|
||||
const editorOptions: IEditorConstructionOptions = {
|
||||
...getSimpleEditorOptions(),
|
||||
lineDecorationsWidth: 4,
|
||||
dragAndDrop: false,
|
||||
cursorWidth: 1,
|
||||
fontSize: 13,
|
||||
lineHeight: 20,
|
||||
fontFamily: ' -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif',
|
||||
wrappingAlgorithm: 'dom',
|
||||
wrappingIndent: 'none',
|
||||
suggest: {
|
||||
showWords: false
|
||||
}
|
||||
};
|
||||
|
||||
this._register(this.inputBox.onDidChange(triggerValidation, null));
|
||||
const codeEditorWidgetOptions: ICodeEditorWidgetOptions = {
|
||||
isSimpleWidget: true,
|
||||
contributions: EditorExtensionsRegistry.getSomeEditorContributions([
|
||||
SuggestController.ID,
|
||||
SnippetController2.ID,
|
||||
MenuPreventer.ID,
|
||||
SelectionClipboardContributionID,
|
||||
ContextMenuController.ID,
|
||||
])
|
||||
};
|
||||
|
||||
const onKeyUp = domEvent(this.inputBox.inputElement, 'keyup');
|
||||
const onMouseUp = domEvent(this.inputBox.inputElement, 'mouseup');
|
||||
this._register(Event.any<any>(onKeyUp, onMouseUp)(triggerValidation, null));
|
||||
const services = new ServiceCollection([IContextKeyService, this.contextKeyService]);
|
||||
const instantiationService = this.instantiationService.createChild(services);
|
||||
this.inputEditor = instantiationService.createInstance(CodeEditorWidget, editorContainer, editorOptions, codeEditorWidgetOptions);
|
||||
|
||||
this.inputBox.value = this.repository.input.value;
|
||||
this._register(this.inputBox.onDidChange(value => this.repository.input.value = value, null));
|
||||
this._register(this.repository.input.onDidChange(value => this.inputBox.value = value, null));
|
||||
this._register(this.inputEditor);
|
||||
|
||||
this._register(this.inputEditor.onDidFocusEditorText(() => addClass(editorContainer, 'synthetic-focus')));
|
||||
this._register(this.inputEditor.onDidBlurEditorText(() => removeClass(editorContainer, 'synthetic-focus')));
|
||||
|
||||
let query: string | undefined;
|
||||
|
||||
if (this.repository.provider.rootUri) {
|
||||
query = `rootUri=${encodeURIComponent(this.repository.provider.rootUri.toString())}`;
|
||||
}
|
||||
|
||||
const uri = URI.from({
|
||||
scheme: Schemas.vscode,
|
||||
path: `scm/${this.repository.provider.contextValue}/${this.repository.provider.id}/input`,
|
||||
query
|
||||
});
|
||||
|
||||
this.inputModel = this.modelService.getModel(uri) || this.modelService.createModel('', null, uri);
|
||||
this.inputEditor.setModel(this.inputModel);
|
||||
|
||||
this.inputEditor.changeViewZones(accessor => {
|
||||
accessor.addZone({ afterLineNumber: 0, domNode: $('div'), heightInPx: 3 });
|
||||
});
|
||||
|
||||
this._register(this.inputEditor.onDidChangeCursorPosition(triggerValidation));
|
||||
|
||||
// Keep model in sync with API
|
||||
this.inputModel.setValue(this.repository.input.value);
|
||||
this._register(this.repository.input.onDidChange(value => this.inputModel.setValue(value)));
|
||||
|
||||
// Keep API in sync with model and update placeholder and validation
|
||||
toggleClass(placeholderTextContainer, 'hidden', this.inputModel.getValueLength() > 0);
|
||||
this.inputModel.onDidChangeContent(() => {
|
||||
this.repository.input.value = this.inputModel.getValue();
|
||||
toggleClass(placeholderTextContainer, 'hidden', this.inputModel.getValueLength() > 0);
|
||||
triggerValidation();
|
||||
});
|
||||
|
||||
updatePlaceholder();
|
||||
this._register(this.repository.input.onDidChangePlaceholder(updatePlaceholder, null));
|
||||
this._register(this.keybindingService.onDidUpdateKeybindings(updatePlaceholder, null));
|
||||
|
||||
this._register(this.inputBox.onDidHeightChange(() => this.layoutBody()));
|
||||
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));
|
||||
@@ -821,18 +901,24 @@ export class RepositoryPane extends ViewPane {
|
||||
}
|
||||
|
||||
this.cachedHeight = height;
|
||||
this.cachedWidth = width;
|
||||
|
||||
if (this.repository.input.visible) {
|
||||
removeClass(this.inputBoxContainer, 'hidden');
|
||||
this.inputBox.layout();
|
||||
removeClass(this.inputContainer, 'hidden');
|
||||
|
||||
const editorHeight = this.inputBox.height;
|
||||
const listHeight = height - (editorHeight + 12 /* margin */);
|
||||
const editorContentHeight = this.inputEditor.getContentHeight();
|
||||
const editorHeight = Math.min(editorContentHeight + 3, 134);
|
||||
this.inputEditor.layout({ height: editorHeight, width: width! - 12 - 16 - 2 });
|
||||
|
||||
this.validationContainer.style.top = `${editorHeight + 1}px`;
|
||||
|
||||
const listHeight = height - (editorHeight + 5 + 2 + 5);
|
||||
this.listContainer.style.height = `${listHeight}px`;
|
||||
this.tree.layout(listHeight, width);
|
||||
} else {
|
||||
addClass(this.inputBoxContainer, 'hidden');
|
||||
addClass(this.inputContainer, 'hidden');
|
||||
|
||||
this.inputEditor.onHide();
|
||||
this.listContainer.style.height = `${height}px`;
|
||||
this.tree.layout(height, width);
|
||||
}
|
||||
@@ -843,7 +929,7 @@ export class RepositoryPane extends ViewPane {
|
||||
|
||||
if (this.isExpanded()) {
|
||||
if (this.repository.input.visible) {
|
||||
this.inputBox.focus();
|
||||
this.inputEditor.focus();
|
||||
} else {
|
||||
this.tree.domFocus();
|
||||
}
|
||||
@@ -853,8 +939,13 @@ export class RepositoryPane extends ViewPane {
|
||||
}
|
||||
|
||||
private _onDidChangeVisibility(visible: boolean): void {
|
||||
this.inputBox.setEnabled(visible);
|
||||
this.viewModel.setVisible(visible);
|
||||
|
||||
if (this.repository.input.visible && visible) {
|
||||
this.inputEditor.onVisible();
|
||||
} else {
|
||||
this.inputEditor.onHide();
|
||||
}
|
||||
}
|
||||
|
||||
getActions(): IAction[] {
|
||||
@@ -938,11 +1029,13 @@ export class RepositoryPane extends ViewPane {
|
||||
const oldCommitTemplate = this.commitTemplate;
|
||||
this.commitTemplate = this.repository.provider.commitTemplate;
|
||||
|
||||
if (this.inputBox.value && this.inputBox.value !== oldCommitTemplate) {
|
||||
const value = this.inputModel.getValue();
|
||||
|
||||
if (value && value !== oldCommitTemplate) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.inputBox.value = this.commitTemplate;
|
||||
this.inputModel.setValue(this.commitTemplate);
|
||||
}
|
||||
|
||||
private updateInputBoxVisibility(): void {
|
||||
@@ -974,3 +1067,81 @@ export class RepositoryViewDescriptor implements IViewDescriptor {
|
||||
this.ctorDescriptor = new SyncDescriptor(RepositoryPane, [repository]);
|
||||
}
|
||||
}
|
||||
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
const inputBackgroundColor = theme.getColor(inputBackground);
|
||||
if (inputBackgroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container .monaco-editor-background,
|
||||
.scm-viewlet .scm-editor-container .monaco-editor,
|
||||
.scm-viewlet .scm-editor-container .monaco-editor .margin
|
||||
{ background-color: ${inputBackgroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputForegroundColor = theme.getColor(inputForeground);
|
||||
if (inputForegroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container .mtk1 { color: ${inputForegroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputBorderColor = theme.getColor(inputBorder);
|
||||
if (inputBorderColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container { outline: 1px solid ${inputBorderColor}; }`);
|
||||
}
|
||||
|
||||
const focusBorderColor = theme.getColor(focusBorder);
|
||||
if (focusBorderColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container.synthetic-focus { outline: 1px solid ${focusBorderColor}; }`);
|
||||
}
|
||||
|
||||
const inputPlaceholderForegroundColor = theme.getColor(inputPlaceholderForeground);
|
||||
if (inputPlaceholderForegroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-placeholder { color: ${inputPlaceholderForegroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationInfoBorderColor = theme.getColor(inputValidationInfoBorder);
|
||||
if (inputValidationInfoBorderColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container.validation-info { outline: 1px solid ${inputValidationInfoBorderColor}; }`);
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { border: 1px solid ${inputValidationInfoBorderColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationInfoBackgroundColor = theme.getColor(inputValidationInfoBackground);
|
||||
if (inputValidationInfoBackgroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { background-color: ${inputValidationInfoBackgroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationInfoForegroundColor = theme.getColor(inputValidationInfoForeground);
|
||||
if (inputValidationInfoForegroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-info { color: ${inputValidationInfoForegroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationWarningBorderColor = theme.getColor(inputValidationWarningBorder);
|
||||
if (inputValidationWarningBorderColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container.validation-warning { outline: 1px solid ${inputValidationWarningBorderColor}; }`);
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { border: 1px solid ${inputValidationWarningBorderColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationWarningBackgroundColor = theme.getColor(inputValidationWarningBackground);
|
||||
if (inputValidationWarningBackgroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { background-color: ${inputValidationWarningBackgroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationWarningForegroundColor = theme.getColor(inputValidationWarningForeground);
|
||||
if (inputValidationWarningForegroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-warning { color: ${inputValidationWarningForegroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationErrorBorderColor = theme.getColor(inputValidationErrorBorder);
|
||||
if (inputValidationErrorBorderColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-container.validation-error { outline: 1px solid ${inputValidationErrorBorderColor}; }`);
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { border: 1px solid ${inputValidationErrorBorderColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationErrorBackgroundColor = theme.getColor(inputValidationErrorBackground);
|
||||
if (inputValidationErrorBackgroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { background-color: ${inputValidationErrorBackgroundColor}; }`);
|
||||
}
|
||||
|
||||
const inputValidationErrorForegroundColor = theme.getColor(inputValidationErrorForeground);
|
||||
if (inputValidationErrorForegroundColor) {
|
||||
collector.addRule(`.scm-viewlet .scm-editor-validation.validation-error { color: ${inputValidationErrorForegroundColor}; }`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -25,7 +25,7 @@ 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 } from 'vs/workbench/common/views';
|
||||
import { IViewsRegistry, Extensions, IViewDescriptorService } from 'vs/workbench/common/views';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { nextTick } from 'vs/base/common/process';
|
||||
import { RepositoryPane, RepositoryViewDescriptor } from 'vs/workbench/contrib/scm/browser/repositoryPane';
|
||||
@@ -98,8 +98,9 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
|
||||
@IExtensionService extensionService: IExtensionService,
|
||||
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
|
||||
@IContextKeyService contextKeyService: IContextKeyService,
|
||||
@IViewDescriptorService viewDescriptorService: IViewDescriptorService
|
||||
) {
|
||||
super(VIEWLET_ID, SCMViewPaneContainer.STATE_KEY, { mergeViewWithContainerWhenSingleView: true }, instantiationService, configurationService, layoutService, contextMenuService, telemetryService, extensionService, themeService, storageService, contextService);
|
||||
super(VIEWLET_ID, SCMViewPaneContainer.STATE_KEY, { 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));
|
||||
|
||||
@@ -18,6 +18,10 @@ class SCMInput implements ISCMInput {
|
||||
}
|
||||
|
||||
set value(value: string) {
|
||||
if (value === this._value) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._value = value;
|
||||
this._onDidChange.fire(value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user