janus
Version:
the two-faced application library-framework
169 lines (153 loc) • 5.81 kB
JavaScript
// Generated by CoffeeScript 1.12.2
(function() {
var DerivedList, FlattenedList, List, ref, util,
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
hasProp = {}.hasOwnProperty;
ref = require('../list'), List = ref.List, DerivedList = ref.DerivedList;
util = require('../../util/util');
FlattenedList = (function(superClass) {
var sizeof;
extend(FlattenedList, superClass);
function FlattenedList(parent, options) {
var i, idx, len, list, ref1;
this.parent = parent;
this.options = options != null ? options : {};
FlattenedList.__super__.constructor.call(this);
this._listListeners = new List();
ref1 = this.parent.list;
for (idx = i = 0, len = ref1.length; i < len; idx = ++i) {
list = ref1[idx];
this._addObj(list, idx);
}
this.listenTo(this.parent, 'added', (function(_this) {
return function(obj, idx) {
return _this._addObj(obj, idx);
};
})(this));
this.listenTo(this.parent, 'moved', (function(_this) {
return function(obj, idx, oldIdx) {
return _this._moveObj(obj, oldIdx, idx);
};
})(this));
this.listenTo(this.parent, 'removed', (function(_this) {
return function(obj, idx) {
return _this._removeObj(obj, idx);
};
})(this));
}
sizeof = function(x) {
if ((x != null ? x.isMappable : void 0) === true) {
return x.length_;
} else {
return 1;
}
};
FlattenedList.prototype._getOverallIdx = function(parentIdx, offset) {
if (offset == null) {
offset = 0;
}
return util.foldLeft(0)(this.parent.list.slice(0, parentIdx), function(length, x) {
return length + sizeof(x);
}) + offset;
};
FlattenedList.prototype._addObj = function(obj, idx) {
var elem, event, handler, i, len, listeners, offset, ref1;
if ((obj != null ? obj.isMappable : void 0) === true) {
listeners = {
added: (function(_this) {
return function(elem, offset) {
return _this._add(elem, _this._getOverallIdx(_this._listListeners.list.indexOf(listeners), offset));
};
})(this),
moved: (function(_this) {
return function(elem, newIdx, oldIdx) {
var mappedBase;
mappedBase = _this._getOverallIdx(_this._listListeners.list.indexOf(listeners));
return _this._moveAt(mappedBase + oldIdx, mappedBase + newIdx);
};
})(this),
removed: (function(_this) {
return function(_, offset) {
return _this._removeAt(_this._getOverallIdx(_this._listListeners.list.indexOf(listeners), offset));
};
})(this)
};
for (event in listeners) {
handler = listeners[event];
obj.on(event, handler);
}
this._listListeners.add(listeners, idx);
ref1 = obj.list;
for (offset = i = 0, len = ref1.length; i < len; offset = ++i) {
elem = ref1[offset];
this._add(elem, this._getOverallIdx(idx, offset));
}
} else {
this._add(obj, this._getOverallIdx(idx));
}
};
FlattenedList.prototype._moveObj = function(obj, oldIdx, newIdx) {
var _, i, j, mNewIdx, mOldIdx, offset, ref1, ref2;
mOldIdx = this._getOverallIdx(oldIdx);
mNewIdx = this._getOverallIdx(newIdx);
if ((obj != null ? obj.isMappable : void 0) === true) {
if (newIdx > oldIdx) {
mNewIdx += sizeof(obj);
mNewIdx -= sizeof(this.parent.list[newIdx - 1]);
}
if (newIdx < oldIdx) {
mOldIdx -= sizeof(obj);
mOldIdx += sizeof(this.parent.list[oldIdx]);
}
if (newIdx > oldIdx) {
for (_ = i = 0, ref1 = obj.length_; 0 <= ref1 ? i < ref1 : i > ref1; _ = 0 <= ref1 ? ++i : --i) {
this._moveAt(mOldIdx, mNewIdx);
}
} else if (newIdx < oldIdx) {
for (offset = j = 0, ref2 = obj.length_; 0 <= ref2 ? j < ref2 : j > ref2; offset = 0 <= ref2 ? ++j : --j) {
this._moveAt(mOldIdx + offset, mNewIdx + offset);
}
}
} else {
this._moveAt(mOldIdx, mNewIdx);
}
this._listListeners.moveAt(oldIdx, newIdx);
};
FlattenedList.prototype._removeObj = function(obj, idx) {
var _, event, handler, i, len, listeners, objStartIdx, ref1;
objStartIdx = this._getOverallIdx(idx);
listeners = this._listListeners.removeAt(idx);
if ((obj != null ? obj.isMappable : void 0) === true) {
for (event in listeners) {
handler = listeners[event];
obj.off(event, handler);
}
ref1 = obj.list;
for (i = 0, len = ref1.length; i < len; i++) {
_ = ref1[i];
this._removeAt(objStartIdx);
}
} else {
this._removeAt(objStartIdx);
}
};
FlattenedList.prototype.__destroy = function() {
var event, handler, i, idx, len, listeners, ref1;
ref1 = this._listListeners.list;
for (idx = i = 0, len = ref1.length; i < len; idx = ++i) {
listeners = ref1[idx];
if (listeners != null) {
for (event in listeners) {
handler = listeners[event];
this.parent.list[idx].off(event, handler);
}
}
}
this._listListeners.destroy();
};
return FlattenedList;
})(DerivedList);
module.exports = {
FlattenedList: FlattenedList
};
}).call(this);