提交 84501959 编写于 作者: J Joao Moreno

tree: cleanup null vs undefined

上级 0c96049d
......@@ -288,15 +288,15 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
// Tree navigation
getParentElement(location: TRef | null = null): T | null {
getParentElement(location: TRef): T {
return this.model.getParentElement(location);
}
getFirstElementChild(location: TRef | null = null): T | null {
getFirstElementChild(location: TRef): T | undefined {
return this.model.getFirstElementChild(location);
}
getLastElementAncestor(location: TRef | null = null): T | null {
getLastElementAncestor(location: TRef): T | undefined {
return this.model.getLastElementAncestor(location);
}
......
......@@ -23,6 +23,7 @@ export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterDat
container: HTMLElement,
delegate: IListVirtualDelegate<T>,
renderers: ITreeRenderer<any /* TODO@joao */, TFilterData, any>[],
private rootElement: T,
options: IIndexTreeOptions<T, TFilterData> = {}
) {
super(container, delegate, renderers, options);
......@@ -33,6 +34,6 @@ export class IndexTree<T, TFilterData = void> extends AbstractTree<T, TFilterDat
}
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IIndexTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, number[]> {
return new IndexTreeModel(view, options);
return new IndexTreeModel(view, this.rootElement, options);
}
}
\ No newline at end of file
......@@ -43,20 +43,9 @@ export interface IIndexTreeModelOptions<T, TFilterData> {
filter?: ITreeFilter<T, TFilterData>;
}
export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFilterData, number[]> {
private root: IMutableTreeNode<T, TFilterData> = {
parent: undefined,
element: undefined!,
children: [],
depth: 0,
collapsible: false,
collapsed: false,
renderNodeCount: 0,
visible: true,
filterData: undefined
};
export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = void> implements ITreeModel<T, TFilterData, number[]> {
private root: IMutableTreeNode<T, TFilterData>;
private eventBufferer = new EventBufferer();
private _onDidChangeCollapseState = new Emitter<ITreeNode<T, TFilterData>>();
......@@ -68,9 +57,21 @@ export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFil
private collapseByDefault: boolean;
private filter?: ITreeFilter<T, TFilterData>;
constructor(private list: ISpliceable<ITreeNode<T, TFilterData>>, options: IIndexTreeModelOptions<T, TFilterData> = {}) {
constructor(private list: ISpliceable<ITreeNode<T, TFilterData>>, rootElement: T, options: IIndexTreeModelOptions<T, TFilterData> = {}) {
this.collapseByDefault = typeof options.collapseByDefault === 'undefined' ? false : options.collapseByDefault;
this.filter = options.filter;
this.root = {
parent: undefined,
element: rootElement,
children: [],
depth: 0,
collapsible: false,
collapsed: false,
renderNodeCount: 0,
visible: true,
filterData: undefined
};
}
splice(
......@@ -353,7 +354,7 @@ export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFil
}
// cheap
private getTreeNode(location: number[] | null, node: IMutableTreeNode<T, TFilterData> = this.root): IMutableTreeNode<T, TFilterData> {
private getTreeNode(location: number[], node: IMutableTreeNode<T, TFilterData> = this.root): IMutableTreeNode<T, TFilterData> {
if (!location || location.length === 0) {
return node;
}
......@@ -418,7 +419,7 @@ export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFil
return location.reverse();
}
getParentNodeLocation(location: number[]): number[] | null {
getParentNodeLocation(location: number[]): number[] {
if (location.length <= 1) {
return [];
}
......@@ -426,33 +427,33 @@ export class IndexTreeModel<T, TFilterData = void> implements ITreeModel<T, TFil
return tail2(location)[0];
}
getParentElement(location: number[]): T | null {
getParentElement(location: number[]): T {
const parentLocation = this.getParentNodeLocation(location);
const node = this.getTreeNode(parentLocation);
return node === this.root ? null : node.element;
return node.element;
}
getFirstElementChild(location: number[]): T | null {
getFirstElementChild(location: number[]): T | undefined {
const node = this.getTreeNode(location);
if (node.children.length === 0) {
return null;
return undefined;
}
return node.children[0].element;
}
getLastElementAncestor(location: number[]): T | null {
getLastElementAncestor(location: number[]): T | undefined {
const node = this.getTreeNode(location);
if (node.children.length === 0) {
return null;
return undefined;
}
return this._getLastElementAncestor(node);
}
private _getLastElementAncestor(node: ITreeNode<T, TFilterData>): T | null {
private _getLastElementAncestor(node: ITreeNode<T, TFilterData>): T {
if (node.children.length === 0) {
return node.element;
}
......
......@@ -32,11 +32,11 @@ export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends
children?: ISequence<ITreeElement<T>>,
onDidCreateNode?: (node: ITreeNode<T, TFilterData>) => void,
onDidDeleteNode?: (node: ITreeNode<T, TFilterData>) => void
): Iterator<ITreeElement<T>> {
): Iterator<ITreeElement<T | null>> {
return this.model.setChildren(element, children, onDidCreateNode, onDidDeleteNode);
}
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T, TFilterData, T> {
protected createModel(view: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeOptions<T, TFilterData>): ITreeModel<T | null, TFilterData, T | null> {
return new ObjectTreeModel(view, options);
}
}
\ No newline at end of file
......@@ -11,10 +11,10 @@ import { ITreeModel, ITreeNode, ITreeElement } from 'vs/base/browser/ui/tree/tre
export interface IObjectTreeModelOptions<T, TFilterData> extends IIndexTreeModelOptions<T, TFilterData> { }
export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> implements ITreeModel<T, TFilterData, T> {
export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends NonNullable<any> = void> implements ITreeModel<T | null, TFilterData, T | null> {
private model: IndexTreeModel<T, TFilterData>;
private nodes = new Map<T, ITreeNode<T, TFilterData>>();
private model: IndexTreeModel<T | null, TFilterData>;
private nodes = new Map<T | null, ITreeNode<T, TFilterData>>();
readonly onDidChangeCollapseState: Event<ITreeNode<T, TFilterData>>;
readonly onDidChangeRenderNodeCount: Event<ITreeNode<T, TFilterData>>;
......@@ -22,9 +22,9 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> imp
get size(): number { return this.nodes.size; }
constructor(list: ISpliceable<ITreeNode<T, TFilterData>>, options: IObjectTreeModelOptions<T, TFilterData> = {}) {
this.model = new IndexTreeModel(list, options);
this.onDidChangeCollapseState = this.model.onDidChangeCollapseState;
this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount;
this.model = new IndexTreeModel(list, null, options);
this.onDidChangeCollapseState = this.model.onDidChangeCollapseState as Event<ITreeNode<T, TFilterData>>;
this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount as Event<ITreeNode<T, TFilterData>>;
}
setChildren(
......@@ -32,9 +32,9 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> imp
children: ISequence<ITreeElement<T>> | undefined,
onDidCreateNode?: (node: ITreeNode<T, TFilterData>) => void,
onDidDeleteNode?: (node: ITreeNode<T, TFilterData>) => void
): Iterator<ITreeElement<T>> {
): Iterator<ITreeElement<T | null>> {
const location = this.getElementLocation(element);
const insertedElements = new Set<T>();
const insertedElements = new Set<T | null>();
const _onDidCreateNode = (node: ITreeNode<T, TFilterData>) => {
insertedElements.add(node.element);
......@@ -64,7 +64,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> imp
);
}
private preserveCollapseState(elements: ISequence<ITreeElement<T>> | undefined): ISequence<ITreeElement<T>> {
private preserveCollapseState(elements: ISequence<ITreeElement<T | null>> | undefined): ISequence<ITreeElement<T | null>> {
const iterator = elements ? getSequenceIterator(elements) : Iterator.empty<ITreeElement<T>>();
return Iterator.map(iterator, treeElement => {
......@@ -91,12 +91,12 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> imp
return this.model.getParentElement(location);
}
getFirstElementChild(ref: T | null = null): T | null {
getFirstElementChild(ref: T | null = null): T | null | undefined {
const location = this.getElementLocation(ref);
return this.model.getFirstElementChild(location);
}
getLastElementAncestor(ref: T | null = null): T | null {
getLastElementAncestor(ref: T | null = null): T | null | undefined {
const location = this.getElementLocation(ref);
return this.model.getLastElementAncestor(location);
}
......@@ -129,7 +129,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData = void> imp
this.model.refilter();
}
getNode(element: T | null = null): ITreeNode<T, TFilterData> {
getNode(element: T | null = null): ITreeNode<T | null, TFilterData> {
const location = this.getElementLocation(element);
return this.model.getNode(location);
}
......
......@@ -92,11 +92,11 @@ export interface ITreeModel<T, TFilterData, TRef> {
getListIndex(location: TRef): number;
getNode(location?: TRef): ITreeNode<T, any>;
getNodeLocation(node: ITreeNode<T, any>): TRef;
getParentNodeLocation(location: TRef): TRef | null;
getParentNodeLocation(location: TRef): TRef;
getParentElement(location: TRef | null): T | null;
getFirstElementChild(location: TRef | null): T | null;
getLastElementAncestor(location: TRef | null): T | null;
getParentElement(location: TRef): T;
getFirstElementChild(location: TRef): T | undefined;
getLastElementAncestor(location: TRef): T | undefined;
isCollapsed(location: TRef): boolean;
setCollapsed(location: TRef, collapsed: boolean): boolean;
......
......@@ -25,14 +25,14 @@ suite('IndexTreeModel', function () {
test('ctor', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
assert(model);
assert.equal(list.length, 0);
});
test('insert', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{ element: 0 },
......@@ -54,7 +54,7 @@ suite('IndexTreeModel', function () {
test('deep insert', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -91,7 +91,7 @@ suite('IndexTreeModel', function () {
test('deep insert collapsed', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -119,7 +119,7 @@ suite('IndexTreeModel', function () {
test('delete', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{ element: 0 },
......@@ -144,7 +144,7 @@ suite('IndexTreeModel', function () {
test('nested delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -178,7 +178,7 @@ suite('IndexTreeModel', function () {
test('deep delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -206,7 +206,7 @@ suite('IndexTreeModel', function () {
test('hidden delete', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -231,7 +231,7 @@ suite('IndexTreeModel', function () {
test('collapse', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -262,7 +262,7 @@ suite('IndexTreeModel', function () {
test('expand', () => {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -302,7 +302,7 @@ suite('IndexTreeModel', function () {
test('collapse should recursively adjust visible count', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -341,7 +341,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), { filter });
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -375,7 +375,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), { filter });
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -398,7 +398,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), { filter });
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -437,7 +437,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), { filter });
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -483,7 +483,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), { filter });
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -529,7 +529,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<string>(toSpliceable(list), { filter });
const model = new IndexTreeModel<string>(toSpliceable(list), 'root', { filter });
model.splice([0], 0, Iterator.fromArray([
{
......@@ -577,7 +577,7 @@ suite('IndexTreeModel', function () {
test('simple', function () {
const list: ITreeNode<number>[] = [];
const model = new IndexTreeModel<number>(toSpliceable(list));
const model = new IndexTreeModel<number>(toSpliceable(list), -1);
model.splice([0], 0, Iterator.fromArray([
{
......@@ -607,7 +607,7 @@ suite('IndexTreeModel', function () {
}
};
const model = new IndexTreeModel<number>(toSpliceable(list), { filter });
const model = new IndexTreeModel<number>(toSpliceable(list), -1, { filter });
model.splice([0], 0, Iterator.fromArray([
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册