mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-03-21 12:20:29 -04:00
Merge from vscode 91e99652cd5fcfc072387c64e151b435e39e8dcf (#6962)
This commit is contained in:
@@ -38,6 +38,7 @@
|
||||
line-height: 19px;
|
||||
transition: top 200ms linear;
|
||||
padding: 0 4px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.monaco-editor .find-widget.hiddenEditor {
|
||||
|
||||
@@ -57,7 +57,7 @@ const NLS_MATCHES_COUNT_LIMIT_TITLE = nls.localize('title.matchesCountLimit', "O
|
||||
const NLS_MATCHES_LOCATION = nls.localize('label.matchesLocation', "{0} of {1}");
|
||||
const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results");
|
||||
|
||||
const FIND_WIDGET_INITIAL_WIDTH = 411;
|
||||
const FIND_WIDGET_INITIAL_WIDTH = 419;
|
||||
const PART_WIDTH = 275;
|
||||
const FIND_INPUT_AREA_WIDTH = PART_WIDTH - 54;
|
||||
|
||||
@@ -1172,6 +1172,39 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas
|
||||
this._findInput.inputBox.layout();
|
||||
this._tryUpdateHeight();
|
||||
}));
|
||||
|
||||
this._register(this._resizeSash.onDidReset(() => {
|
||||
// users double click on the sash
|
||||
const currentWidth = dom.getTotalWidth(this._domNode);
|
||||
|
||||
if (currentWidth < FIND_WIDGET_INITIAL_WIDTH) {
|
||||
// The editor is narrow and the width of the find widget is controlled fully by CSS.
|
||||
return;
|
||||
}
|
||||
|
||||
let width = FIND_WIDGET_INITIAL_WIDTH;
|
||||
|
||||
if (!this._resized || currentWidth === FIND_WIDGET_INITIAL_WIDTH) {
|
||||
// 1. never resized before, double click should maximizes it
|
||||
// 2. users resized it already but its width is the same as default
|
||||
width = this._codeEditor.getConfiguration().layoutInfo.width - 28 - this._codeEditor.getConfiguration().layoutInfo.minimapWidth - 15;
|
||||
this._resized = true;
|
||||
} else {
|
||||
/**
|
||||
* no op, the find widget should be shrinked to its default size.
|
||||
*/
|
||||
}
|
||||
|
||||
const inputBoxWidth = width - FIND_ALL_CONTROLS_WIDTH;
|
||||
|
||||
this._domNode.style.width = `${width}px`;
|
||||
this._findInput.inputBox.width = inputBoxWidth;
|
||||
if (this._isReplaceVisible) {
|
||||
this._replaceInput.width = dom.getTotalWidth(this._findInput.domNode);
|
||||
}
|
||||
|
||||
this._findInput.inputBox.layout();
|
||||
}));
|
||||
}
|
||||
|
||||
private updateAccessibilitySupport(): void {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria';
|
||||
import { isNonEmptyArray } from 'vs/base/common/arrays';
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
||||
import { dispose, IDisposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle';
|
||||
import { dispose, IDisposable, DisposableStore, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions';
|
||||
import { EditOperation } from 'vs/editor/common/core/editOperation';
|
||||
@@ -33,9 +33,49 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ
|
||||
import { IdleValue } from 'vs/base/common/async';
|
||||
import { isObject } from 'vs/base/common/types';
|
||||
import { CommitCharacterController } from './suggestCommitCharacters';
|
||||
import { IPosition } from 'vs/editor/common/core/position';
|
||||
import { TrackedRangeStickiness, ITextModel } from 'vs/editor/common/model';
|
||||
|
||||
const _sticky = false; // for development purposes only
|
||||
|
||||
class LineSuffix {
|
||||
|
||||
private readonly _marker: string[] | undefined;
|
||||
|
||||
constructor(private readonly _model: ITextModel, private readonly _position: IPosition) {
|
||||
// spy on what's happening right of the cursor. two cases:
|
||||
// 1. end of line -> check that it's still end of line
|
||||
// 2. mid of line -> add a marker and compute the delta
|
||||
const maxColumn = _model.getLineMaxColumn(_position.lineNumber);
|
||||
if (maxColumn !== _position.column) {
|
||||
const offset = _model.getOffsetAt(_position);
|
||||
const end = _model.getPositionAt(offset + 1);
|
||||
this._marker = _model.deltaDecorations([], [{
|
||||
range: Range.fromPositions(_position, end),
|
||||
options: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }
|
||||
}]);
|
||||
}
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
if (this._marker) {
|
||||
this._model.deltaDecorations(this._marker, []);
|
||||
}
|
||||
}
|
||||
|
||||
delta(position: IPosition): number {
|
||||
if (this._position.lineNumber !== position.lineNumber) {
|
||||
return 0;
|
||||
} else if (this._marker) {
|
||||
const range = this._model.getDecorationRange(this._marker[0]);
|
||||
const end = this._model.getOffsetAt(range!.getStartPosition());
|
||||
return end - this._model.getOffsetAt(position);
|
||||
} else {
|
||||
return this._model.getLineMaxColumn(position.lineNumber) - position.column;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class SuggestController implements IEditorContribution {
|
||||
|
||||
private static readonly ID: string = 'editor.contrib.suggestController';
|
||||
@@ -47,9 +87,9 @@ export class SuggestController implements IEditorContribution {
|
||||
private readonly _model: SuggestModel;
|
||||
private readonly _widget: IdleValue<SuggestWidget>;
|
||||
private readonly _alternatives: IdleValue<SuggestAlternatives>;
|
||||
private readonly _lineSuffix = new MutableDisposable<LineSuffix>();
|
||||
private readonly _toDispose = new DisposableStore();
|
||||
|
||||
|
||||
constructor(
|
||||
private _editor: ICodeEditor,
|
||||
@IEditorWorkerService editorWorker: IEditorWorkerService,
|
||||
@@ -115,6 +155,7 @@ export class SuggestController implements IEditorContribution {
|
||||
|
||||
this._toDispose.add(this._model.onDidTrigger(e => {
|
||||
this._widget.getValue().showTriggered(e.auto, e.shy ? 250 : 50);
|
||||
this._lineSuffix.value = new LineSuffix(this._editor.getModel()!, e.position);
|
||||
}));
|
||||
this._toDispose.add(this._model.onDidSuggest(e => {
|
||||
if (!e.shy) {
|
||||
@@ -123,7 +164,7 @@ export class SuggestController implements IEditorContribution {
|
||||
}
|
||||
}));
|
||||
this._toDispose.add(this._model.onDidCancel(e => {
|
||||
if (this._widget && !e.retrigger) {
|
||||
if (!e.retrigger) {
|
||||
this._widget.getValue().hideWidget();
|
||||
}
|
||||
}));
|
||||
@@ -154,6 +195,7 @@ export class SuggestController implements IEditorContribution {
|
||||
this._toDispose.dispose();
|
||||
this._widget.dispose();
|
||||
this._model.dispose();
|
||||
this._lineSuffix.dispose();
|
||||
}
|
||||
|
||||
protected _insertSuggestion(event: ISelectedSuggestion | undefined, keepAlternativeSuggestions: boolean, undoStops: boolean): void {
|
||||
@@ -193,10 +235,11 @@ export class SuggestController implements IEditorContribution {
|
||||
|
||||
const overwriteBefore = position.column - suggestion.range.startColumn;
|
||||
const overwriteAfter = suggestion.range.endColumn - position.column;
|
||||
const suffixDelta = this._lineSuffix.value ? this._lineSuffix.value.delta(this._editor.getPosition()) : 0;
|
||||
|
||||
SnippetController2.get(this._editor).insert(insertText, {
|
||||
overwriteBefore: overwriteBefore + columnDelta,
|
||||
overwriteAfter,
|
||||
overwriteAfter: overwriteAfter + suffixDelta,
|
||||
undoStopBefore: false,
|
||||
undoStopAfter: false,
|
||||
adjustWhitespace: !(suggestion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace)
|
||||
|
||||
@@ -10,7 +10,7 @@ import { Emitter, Event } from 'vs/base/common/event';
|
||||
import { IDisposable, dispose, DisposableStore, isDisposable } from 'vs/base/common/lifecycle';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Position, IPosition } from 'vs/editor/common/core/position';
|
||||
import { Selection } from 'vs/editor/common/core/selection';
|
||||
import { ITextModel, IWordAtPosition } from 'vs/editor/common/model';
|
||||
import { CompletionItemProvider, StandardTokenType, CompletionContext, CompletionProviderRegistry, CompletionTriggerKind, CompletionItemKind, completionKindFromString } from 'vs/editor/common/modes';
|
||||
@@ -28,6 +28,7 @@ export interface ICancelEvent {
|
||||
export interface ITriggerEvent {
|
||||
readonly auto: boolean;
|
||||
readonly shy: boolean;
|
||||
readonly position: IPosition;
|
||||
}
|
||||
|
||||
export interface ISuggestEvent {
|
||||
@@ -365,7 +366,7 @@ export class SuggestModel implements IDisposable {
|
||||
// Cancel previous requests, change state & update UI
|
||||
this.cancel(retrigger);
|
||||
this._state = auto ? State.Auto : State.Manual;
|
||||
this._onDidTrigger.fire({ auto, shy: context.shy });
|
||||
this._onDidTrigger.fire({ auto, shy: context.shy, position: this._editor.getPosition() });
|
||||
|
||||
// Capture context when request was sent
|
||||
this._context = ctx;
|
||||
|
||||
@@ -9,7 +9,7 @@ import { EditorCommand } from 'vs/editor/browser/editorExtensions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Selection } from 'vs/editor/common/core/selection';
|
||||
import { deserializePipePositions, serializePipePositions, testRepeatedActionAndExtractPositions } from 'vs/editor/contrib/wordOperations/test/wordTestUtils';
|
||||
import { CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight } from 'vs/editor/contrib/wordOperations/wordOperations';
|
||||
import { CursorWordEndLeft, CursorWordEndLeftSelect, CursorWordEndRight, CursorWordEndRightSelect, CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect, CursorWordStartLeft, CursorWordStartLeftSelect, CursorWordStartRight, CursorWordStartRightSelect, DeleteWordEndLeft, DeleteWordEndRight, DeleteWordLeft, DeleteWordRight, DeleteWordStartLeft, DeleteWordStartRight, CursorWordAccessibilityLeft, CursorWordAccessibilityLeftSelect, CursorWordAccessibilityRight, CursorWordAccessibilityRightSelect } from 'vs/editor/contrib/wordOperations/wordOperations';
|
||||
import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor';
|
||||
|
||||
suite('WordOperations', () => {
|
||||
@@ -26,6 +26,10 @@ suite('WordOperations', () => {
|
||||
const _cursorWordStartRightSelect = new CursorWordStartRightSelect();
|
||||
const _cursorWordEndRightSelect = new CursorWordEndRightSelect();
|
||||
const _cursorWordRightSelect = new CursorWordRightSelect();
|
||||
const _cursorWordAccessibilityLeft = new CursorWordAccessibilityLeft();
|
||||
const _cursorWordAccessibilityLeftSelect = new CursorWordAccessibilityLeftSelect();
|
||||
const _cursorWordAccessibilityRight = new CursorWordAccessibilityRight();
|
||||
const _cursorWordAccessibilityRightSelect = new CursorWordAccessibilityRightSelect();
|
||||
const _deleteWordLeft = new DeleteWordLeft();
|
||||
const _deleteWordStartLeft = new DeleteWordStartLeft();
|
||||
const _deleteWordEndLeft = new DeleteWordEndLeft();
|
||||
@@ -39,6 +43,12 @@ suite('WordOperations', () => {
|
||||
function cursorWordLeft(editor: ICodeEditor, inSelectionMode: boolean = false): void {
|
||||
runEditorCommand(editor, inSelectionMode ? _cursorWordLeftSelect : _cursorWordLeft);
|
||||
}
|
||||
function cursorWordAccessibilityLeft(editor: ICodeEditor, inSelectionMode: boolean = false): void {
|
||||
runEditorCommand(editor, inSelectionMode ? _cursorWordAccessibilityLeft : _cursorWordAccessibilityLeftSelect);
|
||||
}
|
||||
function cursorWordAccessibilityRight(editor: ICodeEditor, inSelectionMode: boolean = false): void {
|
||||
runEditorCommand(editor, inSelectionMode ? _cursorWordAccessibilityRightSelect : _cursorWordAccessibilityRight);
|
||||
}
|
||||
function cursorWordStartLeft(editor: ICodeEditor, inSelectionMode: boolean = false): void {
|
||||
runEditorCommand(editor, inSelectionMode ? _cursorWordStartLeftSelect : _cursorWordStartLeft);
|
||||
}
|
||||
@@ -326,6 +336,34 @@ suite('WordOperations', () => {
|
||||
assert.deepEqual(actual, EXPECTED);
|
||||
});
|
||||
|
||||
test('cursorWordAccessibilityLeft', () => {
|
||||
const EXPECTED = ['| /* |Just |some |more |text |a+= |3 +|5-|3 + |7 */ '].join('\n');
|
||||
const [text,] = deserializePipePositions(EXPECTED);
|
||||
const actualStops = testRepeatedActionAndExtractPositions(
|
||||
text,
|
||||
new Position(1000, 1000),
|
||||
ed => cursorWordAccessibilityLeft(ed),
|
||||
ed => ed.getPosition()!,
|
||||
ed => ed.getPosition()!.equals(new Position(1, 1))
|
||||
);
|
||||
const actual = serializePipePositions(text, actualStops);
|
||||
assert.deepEqual(actual, EXPECTED);
|
||||
});
|
||||
|
||||
test('cursorWordAccessibilityRight', () => {
|
||||
const EXPECTED = [' /* Just| some| more| text| a|+= 3| +5|-3| + 7| */ |'].join('\n');
|
||||
const [text,] = deserializePipePositions(EXPECTED);
|
||||
const actualStops = testRepeatedActionAndExtractPositions(
|
||||
text,
|
||||
new Position(1, 1),
|
||||
ed => cursorWordAccessibilityRight(ed),
|
||||
ed => ed.getPosition()!,
|
||||
ed => ed.getPosition()!.equals(new Position(1, 50))
|
||||
);
|
||||
const actual = serializePipePositions(text, actualStops);
|
||||
assert.deepEqual(actual, EXPECTED);
|
||||
});
|
||||
|
||||
test('deleteWordLeft for non-empty selection', () => {
|
||||
withTestCodeEditor([
|
||||
' \tMy First Line\t ',
|
||||
|
||||
@@ -18,6 +18,9 @@ import { ScrollType } from 'vs/editor/common/editorCommon';
|
||||
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility';
|
||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { EDITOR_DEFAULTS } from 'vs/editor/common/config/editorOptions';
|
||||
|
||||
export interface MoveWordOptions extends ICommandOptions {
|
||||
inSelectionMode: boolean;
|
||||
@@ -170,6 +173,48 @@ export class CursorWordLeftSelect extends WordLeftCommand {
|
||||
}
|
||||
}
|
||||
|
||||
export class CursorWordAccessibilityLeft extends WordLeftCommand {
|
||||
constructor() {
|
||||
super({
|
||||
inSelectionMode: false,
|
||||
wordNavigationType: WordNavigationType.WordAccessibility,
|
||||
id: 'cursorWordAccessibilityLeft',
|
||||
precondition: undefined,
|
||||
kbOpts: {
|
||||
kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, CONTEXT_ACCESSIBILITY_MODE_ENABLED),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.LeftArrow,
|
||||
mac: { primary: KeyMod.Alt | KeyCode.LeftArrow },
|
||||
weight: KeybindingWeight.EditorContrib + 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected _move(_: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position {
|
||||
return super._move(getMapForWordSeparators(EDITOR_DEFAULTS.wordSeparators), model, position, wordNavigationType);
|
||||
}
|
||||
}
|
||||
|
||||
export class CursorWordAccessibilityLeftSelect extends WordLeftCommand {
|
||||
constructor() {
|
||||
super({
|
||||
inSelectionMode: true,
|
||||
wordNavigationType: WordNavigationType.WordAccessibility,
|
||||
id: 'cursorWordAccessibilitLeftSelecty',
|
||||
precondition: undefined,
|
||||
kbOpts: {
|
||||
kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, CONTEXT_ACCESSIBILITY_MODE_ENABLED),
|
||||
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.LeftArrow,
|
||||
mac: { primary: KeyMod.Alt | KeyMod.Shift | KeyCode.LeftArrow },
|
||||
weight: KeybindingWeight.EditorContrib + 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected _move(_: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position {
|
||||
return super._move(getMapForWordSeparators(EDITOR_DEFAULTS.wordSeparators), model, position, wordNavigationType);
|
||||
}
|
||||
}
|
||||
|
||||
export class CursorWordStartRight extends WordRightCommand {
|
||||
constructor() {
|
||||
super({
|
||||
@@ -248,6 +293,48 @@ export class CursorWordRightSelect extends WordRightCommand {
|
||||
}
|
||||
}
|
||||
|
||||
export class CursorWordAccessibilityRight extends WordRightCommand {
|
||||
constructor() {
|
||||
super({
|
||||
inSelectionMode: false,
|
||||
wordNavigationType: WordNavigationType.WordAccessibility,
|
||||
id: 'cursorWordAccessibilityRight',
|
||||
precondition: undefined,
|
||||
kbOpts: {
|
||||
kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, CONTEXT_ACCESSIBILITY_MODE_ENABLED),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.RightArrow,
|
||||
mac: { primary: KeyMod.Alt | KeyCode.RightArrow },
|
||||
weight: KeybindingWeight.EditorContrib + 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected _move(_: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position {
|
||||
return super._move(getMapForWordSeparators(EDITOR_DEFAULTS.wordSeparators), model, position, wordNavigationType);
|
||||
}
|
||||
}
|
||||
|
||||
export class CursorWordAccessibilityRightSelect extends WordRightCommand {
|
||||
constructor() {
|
||||
super({
|
||||
inSelectionMode: true,
|
||||
wordNavigationType: WordNavigationType.WordAccessibility,
|
||||
id: 'cursorWordAccessibilityRightSelect',
|
||||
precondition: undefined,
|
||||
kbOpts: {
|
||||
kbExpr: ContextKeyExpr.and(EditorContextKeys.textInputFocus, CONTEXT_ACCESSIBILITY_MODE_ENABLED),
|
||||
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.RightArrow,
|
||||
mac: { primary: KeyMod.Alt | KeyMod.Shift | KeyCode.RightArrow },
|
||||
weight: KeybindingWeight.EditorContrib + 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected _move(_: WordCharacterClassifier, model: ITextModel, position: Position, wordNavigationType: WordNavigationType): Position {
|
||||
return super._move(getMapForWordSeparators(EDITOR_DEFAULTS.wordSeparators), model, position, wordNavigationType);
|
||||
}
|
||||
}
|
||||
|
||||
export interface DeleteWordOptions extends ICommandOptions {
|
||||
whitespaceHeuristics: boolean;
|
||||
wordNavigationType: WordNavigationType;
|
||||
@@ -397,6 +484,10 @@ registerEditorCommand(new CursorWordRight());
|
||||
registerEditorCommand(new CursorWordStartRightSelect());
|
||||
registerEditorCommand(new CursorWordEndRightSelect());
|
||||
registerEditorCommand(new CursorWordRightSelect());
|
||||
registerEditorCommand(new CursorWordAccessibilityLeft());
|
||||
registerEditorCommand(new CursorWordAccessibilityLeftSelect());
|
||||
registerEditorCommand(new CursorWordAccessibilityRight());
|
||||
registerEditorCommand(new CursorWordAccessibilityRightSelect());
|
||||
registerEditorCommand(new DeleteWordStartLeft());
|
||||
registerEditorCommand(new DeleteWordEndLeft());
|
||||
registerEditorCommand(new DeleteWordLeft());
|
||||
|
||||
Reference in New Issue
Block a user