提交 1844888b 编写于 作者: D Daniel Imms

Merge remote-tracking branch 'origin/master' into tyriar/split_simplify

......@@ -56,5 +56,11 @@
action: 'updateLabels',
addLabel: 'confirmed'
},
{
type: 'comment',
name: 'findDuplicates',
action: 'comment',
comment: "Potential duplicates:\n${potentialDuplicates}"
},
]
}
{
perform: true,
whenCreatedByTeam: false,
comment: "Thanks for submitting this issue. Please also check if it is already covered by an existing one, like:\n${potentialDuplicates}"
comment: "(Experimental duplicate detection)\nThanks for submitting this issue. Please also check if it is already covered by an existing one, like:\n${potentialDuplicates}"
}
......@@ -155,9 +155,10 @@
if (previous) {
if (next) {
const betweenProgress = (offset - window.scrollY - previous.element.getBoundingClientRect().top) / (next.element.getBoundingClientRect().top - previous.element.getBoundingClientRect().top);
return previous.line + betweenProgress * (next.line - previous.line);
const line = previous.line + betweenProgress * (next.line - previous.line);
return Math.max(line, 0);
} else {
return previous.line;
return Math.max(previous.line, 0);
}
}
return null;
......@@ -232,7 +233,7 @@
}
// Ignore clicks on links
for (let node = event.target; node; node = node.parentNode) {
for (let node = /** @type {HTMLElement} */(event.target); node; node = /** @type {HTMLElement} */(node.parentNode)) {
if (node.tagName === "A") {
return;
}
......@@ -261,7 +262,7 @@
}
if (node.href.startsWith('file://')) {
const [path, fragment] = node.href.replace(/^file:\/\//i, '').split('#');
postMessage('_markdown.openDocumentLink', { path, fragment });
postMessage('_markdown.openDocumentLink', [{ path, fragment }]);
event.preventDefault();
event.stopPropagation();
break;
......
......@@ -170,6 +170,12 @@ class TryCompleteJsDocCommand implements Command {
if (!res || !res.body) {
return undefined;
}
// Workaround for #43619
// docCommentTemplate previously returned undefined for empty jsdoc templates.
// TS 2.7 now returns a single line doc comment, which breaks indentation.
if (res.body.newText === '/** */') {
return undefined;
}
return TryCompleteJsDocCommand.templateToSnippet(res.body.newText);
}, () => undefined);
}
......
......@@ -462,15 +462,18 @@ class MouseController<T> implements IDisposable {
}
let reference = this.list.getFocus()[0];
reference = reference === undefined ? this.list.getSelection()[0] : reference;
const selection = this.list.getSelection();
reference = reference === undefined ? selection[0] : reference;
const focus = e.index;
if (selection.every(s => s !== focus)) {
this.list.setFocus([focus]);
}
if (this.multipleSelectionSupport && this.isSelectionRangeChangeEvent(e)) {
return this.changeSelection(e, reference);
}
const focus = e.index;
this.list.setFocus([focus]);
if (this.multipleSelectionSupport && this.isSelectionChangeEvent(e)) {
return this.changeSelection(e, reference);
}
......
......@@ -104,7 +104,11 @@ export class FoldingController implements IEditorContribution {
if (!model || !this._isEnabled || model.isTooLargeForTokenization()) {
return {};
}
return { collapsedRegions: this.foldingModel.getMemento(), lineCount: model.getLineCount() };
if (this.foldingModel) { // disposed ?
let collapsedRegions = this.foldingModel.isInitialized ? this.foldingModel.getMemento() : this.hiddenRangeModel.getMemento();
return { collapsedRegions, lineCount: model.getLineCount() };
}
return void 0;
}
/**
......
......@@ -26,18 +26,21 @@ export class FoldingModel {
private _ranges: FoldingRanges;
private _editorDecorationIds: string[];
private _isInitialized: boolean;
private _updateEventEmitter = new Emitter<FoldingModelChangeEvent>();
public get ranges(): FoldingRanges { return this._ranges; }
public get onDidChange(): Event<FoldingModelChangeEvent> { return this._updateEventEmitter.event; }
public get textModel() { return this._textModel; }
public get isInitialized() { return this._isInitialized; }
constructor(textModel: ITextModel, decorationProvider: IDecorationProvider) {
this._textModel = textModel;
this._decorationProvider = decorationProvider;
this._ranges = new FoldingRanges(new Uint32Array(0), new Uint32Array(0));
this._editorDecorationIds = [];
this._isInitialized = false;
}
public toggleCollapseState(regions: FoldingRegion[]) {
......@@ -128,6 +131,7 @@ export class FoldingModel {
this._editorDecorationIds = this._decorationProvider.deltaDecorations(this._editorDecorationIds, newEditorDecorations);
this._ranges = newRanges;
this._isInitialized = true;
this._updateEventEmitter.fire({ model: this });
}
......
......@@ -12,7 +12,7 @@ import { findFirst } from 'vs/base/common/arrays';
export class HiddenRangeModel {
private _foldingModel: FoldingModel;
private _hiddenRanges: IRange[] = [];
private _hiddenRanges: IRange[];
private _foldingModelListener: IDisposable;
private _updateEventEmitter = new Emitter<IRange[]>();
......@@ -22,6 +22,7 @@ export class HiddenRangeModel {
public constructor(model: FoldingModel) {
this._foldingModel = model;
this._foldingModelListener = model.onDidChange(_ => this.updateHiddenRanges());
this._hiddenRanges = [];
if (model.ranges.length) {
this.updateHiddenRanges();
}
......@@ -80,6 +81,13 @@ export class HiddenRangeModel {
return true;
}
/**
* Collapse state memento, for persistence only, only used if folding model is not yet initialized
*/
public getMemento(): CollapseMemento {
return this._hiddenRanges.map(r => ({ startLineNumber: r.startLineNumber - 1, endLineNumber: r.endLineNumber }));
}
private applyHiddenRanges(newHiddenAreas: IRange[]) {
this._hiddenRanges = newHiddenAreas;
this._updateEventEmitter.fire(newHiddenAreas);
......
......@@ -57,6 +57,7 @@ import { WorkbenchTree, WorkbenchTreeController } from 'vs/platform/list/browser
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { DataTransfers } from 'vs/base/browser/dnd';
import { Schemas } from 'vs/base/common/network';
import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces';
export class FileDataSource implements IDataSource {
constructor(
......@@ -782,8 +783,8 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
return true; // NewStatPlaceholders can not be moved
}
if (source.isRoot) {
return true; // Root folder can not be moved
if (source.isRoot && (sources.length > 1 || target instanceof FileStat && !target.isRoot)) {
return true; // Root folder can not be moved to a non root file stat. Do not allow root folder move when multi selection drag.
}
if (source.resource.toString() === target.resource.toString()) {
......@@ -916,7 +917,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
return updateConfirmSettingsPromise.then(() => {
if (confirmation.confirmed) {
return TPromise.join(sources.map(source => this.doHandleExplorerDrop(tree, data, source, target, isCopy))).then(() => void 0);
return TPromise.join(sources.map(source => this.doHandleExplorerDrop(tree, source, target, isCopy))).then(() => void 0);
}
return TPromise.as(void 0);
......@@ -924,8 +925,37 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
});
}
private doHandleExplorerDrop(tree: ITree, data: IDragAndDropData, source: FileStat, target: FileStat, isCopy: boolean): TPromise<void> {
private doHandleExplorerDrop(tree: ITree, source: FileStat, target: FileStat, isCopy: boolean): TPromise<void> {
return tree.expand(target).then(() => {
if (source.isRoot) {
const folders = this.contextService.getWorkspace().folders;
let sourceIndex: number;
let targetIndex: number;
const workspaceCreationData: IWorkspaceFolderCreationData[] = [];
for (let index = 0; index < folders.length; index++) {
if (folders[index].uri.toString() === source.resource.toString()) {
sourceIndex = index;
}
if (folders[index].uri.toString() === target.resource.toString()) {
targetIndex = index;
}
workspaceCreationData.push({
name: folders[index].name,
uri: folders[index].uri
});
if (sourceIndex && targetIndex) {
break;
}
}
const swap = workspaceCreationData[sourceIndex];
workspaceCreationData[sourceIndex] = workspaceCreationData[targetIndex];
workspaceCreationData[targetIndex] = swap;
return this.workspaceEditingService.updateFolders(Math.min(sourceIndex, targetIndex), workspaceCreationData.length, workspaceCreationData);
}
// Reuse duplicate action if user copies
if (isCopy) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册