forked from fanruan/fineui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.8 KiB
88 lines
2.8 KiB
8 years ago
|
!(function () {
|
||
|
var Section = function (height, width, x, y) {
|
||
|
this.height = height;
|
||
|
this.width = width;
|
||
|
this.x = x;
|
||
|
this.y = y;
|
||
|
|
||
|
this._indexMap = {};
|
||
|
this._indices = [];
|
||
|
};
|
||
|
|
||
|
Section.prototype = {
|
||
|
constructor: Section,
|
||
|
addCellIndex: function (index) {
|
||
|
if (!this._indexMap[index]) {
|
||
|
this._indexMap[index] = true;
|
||
|
this._indices.push(index);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
getCellIndices: function () {
|
||
|
return this._indices
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var SECTION_SIZE = 100;
|
||
|
BI.SectionManager = function (sectionSize) {
|
||
|
this._sectionSize = sectionSize || SECTION_SIZE;
|
||
|
this._cellMetadata = [];
|
||
|
this._sections = {};
|
||
|
};
|
||
|
|
||
|
BI.SectionManager.prototype = {
|
||
|
constructor: BI.SectionManager,
|
||
|
getCellIndices: function (height, width, x, y) {
|
||
|
var indices = {};
|
||
|
|
||
|
BI.each(this.getSections(height, width, x, y), function (i, section) {
|
||
|
BI.each(section.getCellIndices(), function (j, index) {
|
||
|
indices[index] = index
|
||
|
})
|
||
|
});
|
||
|
|
||
|
return BI.map(BI.keys(indices), function (i, index) {
|
||
|
return indices[index]
|
||
|
});
|
||
|
},
|
||
|
|
||
|
getCellMetadata: function (index) {
|
||
|
return this._cellMetadata[index];
|
||
|
},
|
||
|
|
||
|
getSections: function (height, width, x, y) {
|
||
|
var sectionXStart = Math.floor(x / this._sectionSize);
|
||
|
var sectionXStop = Math.floor((x + width - 1) / this._sectionSize);
|
||
|
var sectionYStart = Math.floor(y / this._sectionSize);
|
||
|
var sectionYStop = Math.floor((y + height - 1) / this._sectionSize);
|
||
|
|
||
|
var sections = [];
|
||
|
|
||
|
for (var sectionX = sectionXStart; sectionX <= sectionXStop; sectionX++) {
|
||
|
for (var sectionY = sectionYStart; sectionY <= sectionYStop; sectionY++) {
|
||
|
var key = sectionX + "." + sectionY;
|
||
|
|
||
|
if (!this._sections[key]) {
|
||
|
this._sections[key] = new Section(this._sectionSize, this._sectionSize, sectionX * this._sectionSize, sectionY * this._sectionSize)
|
||
|
}
|
||
|
|
||
|
sections.push(this._sections[key])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return sections
|
||
|
},
|
||
|
|
||
|
getTotalSectionCount: function () {
|
||
|
return BI.size(this._sections);
|
||
|
},
|
||
|
|
||
|
registerCell: function (cellMetadatum, index) {
|
||
|
this._cellMetadata[index] = cellMetadatum;
|
||
|
|
||
|
BI.each(this.getSections(cellMetadatum.height, cellMetadatum.width, cellMetadatum.x, cellMetadatum.y), function (i, section) {
|
||
|
section.addCellIndex(index);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
})();
|