|
@@ -103,6 +103,13 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
return this._index >= 0;
|
|
return this._index >= 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Test whether the vector is disposed.
|
|
|
|
+ */
|
|
|
|
+ get isDisposed(): boolean {
|
|
|
|
+ return this._factory === null;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Dispose of the resources held by the model.
|
|
* Dispose of the resources held by the model.
|
|
*/
|
|
*/
|
|
@@ -183,7 +190,7 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
* Handle a change in the vector.
|
|
* Handle a change in the vector.
|
|
*/
|
|
*/
|
|
private _onVectorChanged(list: IObservableVector<T>, change: ObservableVector.IChangedArgs<T>): void {
|
|
private _onVectorChanged(list: IObservableVector<T>, change: ObservableVector.IChangedArgs<T>): void {
|
|
- if (!this._isUndoable) {
|
|
|
|
|
|
+ if (this.isDisposed || !this._isUndoable) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
// Clear everything after this position if necessary.
|
|
// Clear everything after this position if necessary.
|
|
@@ -211,6 +218,7 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
*/
|
|
*/
|
|
private _undoChange(change: ObservableVector.IChangedArgs<JSONObject>): void {
|
|
private _undoChange(change: ObservableVector.IChangedArgs<JSONObject>): void {
|
|
let index = 0;
|
|
let index = 0;
|
|
|
|
+ let factory = this._factory;
|
|
switch (change.type) {
|
|
switch (change.type) {
|
|
case 'add':
|
|
case 'add':
|
|
each(change.newValues, () => {
|
|
each(change.newValues, () => {
|
|
@@ -220,13 +228,13 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
case 'set':
|
|
case 'set':
|
|
index = change.oldIndex;
|
|
index = change.oldIndex;
|
|
each(change.oldValues, value => {
|
|
each(change.oldValues, value => {
|
|
- this.set(index++, this._createValue(value));
|
|
|
|
|
|
+ this.set(index++, factory(value));
|
|
});
|
|
});
|
|
break;
|
|
break;
|
|
case 'remove':
|
|
case 'remove':
|
|
index = change.oldIndex;
|
|
index = change.oldIndex;
|
|
each(change.oldValues, value => {
|
|
each(change.oldValues, value => {
|
|
- this.insert(index++, this._createValue(value));
|
|
|
|
|
|
+ this.insert(index++, factory(value));
|
|
});
|
|
});
|
|
break;
|
|
break;
|
|
case 'move':
|
|
case 'move':
|
|
@@ -242,17 +250,18 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
*/
|
|
*/
|
|
private _redoChange(change: ObservableVector.IChangedArgs<JSONObject>): void {
|
|
private _redoChange(change: ObservableVector.IChangedArgs<JSONObject>): void {
|
|
let index = 0;
|
|
let index = 0;
|
|
|
|
+ let factory = this._factory;
|
|
switch (change.type) {
|
|
switch (change.type) {
|
|
case 'add':
|
|
case 'add':
|
|
index = change.newIndex;
|
|
index = change.newIndex;
|
|
each(change.newValues, value => {
|
|
each(change.newValues, value => {
|
|
- this.insert(index++, this._createValue(value));
|
|
|
|
|
|
+ this.insert(index++, factory(value));
|
|
});
|
|
});
|
|
break;
|
|
break;
|
|
case 'set':
|
|
case 'set':
|
|
index = change.newIndex;
|
|
index = change.newIndex;
|
|
each(change.newValues, value => {
|
|
each(change.newValues, value => {
|
|
- this.set(change.newIndex++, this._createValue(value));
|
|
|
|
|
|
+ this.set(change.newIndex++, factory(value));
|
|
});
|
|
});
|
|
break;
|
|
break;
|
|
case 'remove':
|
|
case 'remove':
|
|
@@ -268,14 +277,6 @@ class ObservableUndoableVector<T extends ISerializable> extends ObservableVector
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * Create a value from JSON.
|
|
|
|
- */
|
|
|
|
- private _createValue(data: JSONObject): T {
|
|
|
|
- let factory = this._factory;
|
|
|
|
- return factory(data);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* Copy a change as JSON.
|
|
* Copy a change as JSON.
|
|
*/
|
|
*/
|