提交 946d872a 编写于 作者: J Joao Moreno

input box length warnings

introduces scm.inputCounter
上级 7b4bb1ed
......@@ -519,7 +519,7 @@ export class Repository implements Disposable {
this._sourceControl.inputBox.placeholder = localize('commitMessage', "Message (press {0} to commit)");
this._sourceControl.acceptInputCommand = { command: 'git.commitWithInput', title: localize('commit', "Commit"), arguments: [this._sourceControl] };
this._sourceControl.quickDiffProvider = this;
this._sourceControl.inputBox.warningLength = 72;
this._sourceControl.inputBox.lineWarningLength = 72;
this.disposables.push(this._sourceControl);
this._mergeGroup = this._sourceControl.createResourceGroup('merge', localize('merge changes', "Merge Changes"));
......
......@@ -5784,9 +5784,9 @@ declare module 'vscode' {
placeholder: string;
/**
* The warning threshold for commit messages.
* The warning threshold for lines in the input box.
*/
warningLength: number | undefined;
lineWarningLength: number | undefined;
}
interface QuickDiffProvider {
......
......@@ -392,13 +392,13 @@ export class MainThreadSCM implements MainThreadSCMShape {
repository.input.placeholder = placeholder;
}
$setWarningLength(sourceControlHandle: number, warningLength: number): void {
$setLineWarningLength(sourceControlHandle: number, lineWarningLength: number): void {
const repository = this._repositories[sourceControlHandle];
if (!repository) {
return;
}
repository.input.warningLength = warningLength;
repository.input.lineWarningLength = lineWarningLength;
}
}
......@@ -410,7 +410,7 @@ export interface MainThreadSCMShape extends IDisposable {
$setInputBoxValue(sourceControlHandle: number, value: string): void;
$setInputBoxPlaceholder(sourceControlHandle: number, placeholder: string): void;
$setWarningLength(sourceControlHandle: number, warningLength: number): void;
$setLineWarningLength(sourceControlHandle: number, lineWarningLength: number): void;
}
export type DebugSessionUUID = string;
......
......@@ -140,15 +140,15 @@ export class ExtHostSCMInputBox implements vscode.SourceControlInputBox {
this._placeholder = placeholder;
}
private _warningLength: number | undefined;
private _lineWarningLength: number | undefined;
get warningLength(): number | undefined {
return this._warningLength;
get lineWarningLength(): number | undefined {
return this._lineWarningLength;
}
set warningLength(warningLength: number) {
this._proxy.$setWarningLength(this._sourceControlHandle, warningLength);
this._warningLength = warningLength;
set lineWarningLength(lineWarningLength: number) {
this._proxy.$setLineWarningLength(this._sourceControlHandle, lineWarningLength);
this._lineWarningLength = lineWarningLength;
}
constructor(private _proxy: MainThreadSCMShape, private _sourceControlHandle: number) {
......
......@@ -74,5 +74,11 @@ Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration).regis
default: 'all',
description: localize('diffDecorations', "Controls diff decorations in the editor.")
},
'scm.inputCounter': {
type: 'string',
enum: ['always', 'warn', 'off'],
default: 'warn',
description: localize('inputCounter', "Controls when to display the input counter.")
}
}
});
\ No newline at end of file
......@@ -8,7 +8,7 @@
import 'vs/css!./media/scmViewlet';
import { localize } from 'vs/nls';
import { TPromise } from 'vs/base/common/winjs.base';
import Event, { Emitter, chain, mapEvent } from 'vs/base/common/event';
import Event, { Emitter, chain, mapEvent, anyEvent } from 'vs/base/common/event';
import { domEvent, stop } from 'vs/base/browser/event';
import { basename } from 'vs/base/common/paths';
import { onUnexpectedError } from 'vs/base/common/errors';
......@@ -56,6 +56,7 @@ import { format } from 'vs/base/common/strings';
import { ISpliceable, ISequence, ISplice } from 'vs/base/common/sequence';
import { firstIndex } from 'vs/base/common/arrays';
import { WorkbenchList, IListService } from 'vs/platform/list/browser/listService';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
// TODO@Joao
// Need to subclass MenuItemActionItem in order to respect
......@@ -695,7 +696,8 @@ export class RepositoryPanel extends ViewletPanel {
@IWorkbenchEditorService protected editorService: IWorkbenchEditorService,
@IEditorGroupService protected editorGroupService: IEditorGroupService,
@IContextKeyService protected contextKeyService: IContextKeyService,
@IInstantiationService protected instantiationService: IInstantiationService
@IInstantiationService protected instantiationService: IInstantiationService,
@IConfigurationService protected configurationService: IConfigurationService
) {
super(repository.provider.label, {}, keybindingService, contextMenuService);
this.menus = instantiationService.createInstance(SCMMenus, repository.provider);
......@@ -754,23 +756,46 @@ export class RepositoryPanel extends ViewletPanel {
};
const validation = (text: string): IMessage => {
const warningLength = this.repository.input.warningLength;
if (warningLength === undefined) {
const setting = this.configurationService.getValue<'always' | 'warn' | 'off'>('scm.inputCounter');
if (setting === 'off') {
return null;
}
let position = this.inputBox.inputElement.selectionStart;
let start = 0, end;
let match: RegExpExecArray;
const regex = /\r?\n/g;
while ((match = regex.exec(text)) && position > match.index) {
start = match.index + match[0].length;
}
end = match ? match.index : text.length;
const line = text.substring(start, end);
const lineWarningLength = this.repository.input.lineWarningLength;
if (lineWarningLength === undefined) {
return {
content: localize('commitMessageInfo', "{0} characters", text.length),
content: localize('commitMessageInfo', "{0} characters in current line", text.length),
type: MessageType.INFO
};
}
const charactersLeft = warningLength - text.length;
if (charactersLeft > 0) {
if (line.length <= lineWarningLength) {
if (setting !== 'always') {
return null;
}
return {
content: localize('commitMessageCountdown', "{0} characters left", text.length),
content: localize('commitMessageCountdown', "{0} characters left in current line", lineWarningLength - line.length),
type: MessageType.INFO
};
} else {
return {
content: localize('commitMessageWarning', "{0} characters over", text.length),
content: localize('commitMessageWarning', "{0} characters over {1} in current line", line.length - lineWarningLength, lineWarningLength),
type: MessageType.WARNING
};
}
......@@ -783,6 +808,10 @@ export class RepositoryPanel extends ViewletPanel {
this.disposables.push(attachInputBoxStyler(this.inputBox, this.themeService));
this.disposables.push(this.inputBox);
const onKeyUp = domEvent(this.inputBox.inputElement, 'keyup');
const onMouseUp = domEvent(this.inputBox.inputElement, 'mouseup');
anyEvent<any>(onKeyUp, onMouseUp)(() => this.inputBox.validate(), null, this.disposables);
this.inputBox.value = this.repository.input.value;
this.inputBox.onDidChange(value => this.repository.input.value = value, null, this.disposables);
this.repository.input.onDidChange(value => this.inputBox.value = value, null, this.disposables);
......
......@@ -75,7 +75,7 @@ export interface ISCMInput {
placeholder: string;
readonly onDidChangePlaceholder: Event<string>;
warningLength: number | undefined;
lineWarningLength: number | undefined;
}
export interface ISCMRepository extends IDisposable {
......
......@@ -40,15 +40,7 @@ class SCMInput implements ISCMInput {
private _onDidChangePlaceholder = new Emitter<string>();
get onDidChangePlaceholder(): Event<string> { return this._onDidChangePlaceholder.event; }
private _warningLength: number | undefined;
get warningLength(): number | undefined {
return this._warningLength;
}
set warningLength(warningLength: number) {
this._warningLength = warningLength;
}
public lineWarningLength: number | undefined = undefined;
}
class SCMRepository implements ISCMRepository {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册