2014-11-19 15:52:01 -08:00
|
|
|
import {ProtoRecordRange, RecordRange} from './record_range';
|
2014-10-02 15:14:32 +02:00
|
|
|
import {ProtoRecord, Record} from './record';
|
2014-12-02 17:09:46 -08:00
|
|
|
import {int, isPresent, isBlank} from 'facade/lang';
|
|
|
|
import {ListWrapper, List} from 'facade/collection';
|
2014-11-19 15:52:01 -08:00
|
|
|
|
2014-10-02 15:14:32 +02:00
|
|
|
export * from './record';
|
2014-11-19 15:52:01 -08:00
|
|
|
export * from './record_range'
|
2014-10-02 15:14:32 +02:00
|
|
|
|
|
|
|
export class ChangeDetector {
|
2014-11-21 21:19:23 -08:00
|
|
|
_rootRecordRange:RecordRange;
|
2014-12-02 17:09:46 -08:00
|
|
|
|
2014-11-19 15:52:01 -08:00
|
|
|
constructor(recordRange:RecordRange) {
|
|
|
|
this._rootRecordRange = recordRange;
|
2014-10-02 15:14:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
detectChanges():int {
|
2014-12-02 17:09:46 -08:00
|
|
|
var count = 0;
|
|
|
|
var updatedRecords = null;
|
|
|
|
var record = this._rootRecordRange.findFirstEnabledRecord();
|
|
|
|
|
|
|
|
while (isPresent(record)) {
|
|
|
|
var currentRange = record.recordRange;
|
|
|
|
var currentGroup = record.groupMemento();
|
|
|
|
|
2014-10-02 15:14:32 +02:00
|
|
|
if (record.check()) {
|
2014-12-02 17:09:46 -08:00
|
|
|
count ++;
|
|
|
|
if (record.terminatesExpression()) {
|
|
|
|
updatedRecords = this._addRecord(updatedRecords, record);
|
|
|
|
}
|
2014-10-02 15:14:32 +02:00
|
|
|
}
|
2014-12-02 17:09:46 -08:00
|
|
|
|
2014-12-03 11:26:39 -08:00
|
|
|
if (isPresent(updatedRecords)) {
|
|
|
|
var nextEnabled = record.nextEnabled;
|
|
|
|
var nextRange = isPresent(nextEnabled) ? nextEnabled.recordRange : null;
|
|
|
|
var nextGroup = isPresent(nextEnabled) ? nextEnabled.groupMemento() : null;
|
|
|
|
|
|
|
|
if (currentRange != nextRange || currentGroup != nextGroup) {
|
|
|
|
currentRange.dispatcher.onRecordChange(currentGroup, updatedRecords);
|
|
|
|
updatedRecords = null;
|
|
|
|
}
|
2014-12-02 17:09:46 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
record = record.nextEnabled;
|
2014-10-02 15:14:32 +02:00
|
|
|
}
|
2014-12-02 17:09:46 -08:00
|
|
|
|
2014-10-02 15:14:32 +02:00
|
|
|
return count;
|
|
|
|
}
|
2014-12-02 17:09:46 -08:00
|
|
|
|
|
|
|
_addRecord(updatedRecords:List, record:Record) {
|
|
|
|
if (isBlank(updatedRecords)) {
|
|
|
|
updatedRecords = _singleElementList;
|
|
|
|
updatedRecords[0] = record;
|
|
|
|
|
|
|
|
} else if (updatedRecords === _singleElementList) {
|
|
|
|
updatedRecords = [_singleElementList[0], record];
|
|
|
|
|
|
|
|
} else {
|
|
|
|
ListWrapper.push(updatedRecords, record);
|
|
|
|
}
|
|
|
|
return updatedRecords;
|
|
|
|
}
|
2014-10-02 15:14:32 +02:00
|
|
|
}
|
2014-12-02 17:09:46 -08:00
|
|
|
|
|
|
|
var _singleElementList = [null];
|