react-virtualized
Version:
React components for efficiently rendering large, scrollable lists and tabular data
147 lines (113 loc) • 4.13 kB
JavaScript
import _Object$keys from 'babel-runtime/core-js/object/keys';
import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
import _createClass from 'babel-runtime/helpers/createClass';
/**
* Window Sections are used to group nearby cells.
* This enables us to more quickly determine which cells to display in a given region of the Window.
*
*/
import Section from './Section';
var SECTION_SIZE = 100;
/**
* Contains 0 to many Sections.
* Grows (and adds Sections) dynamically as cells are registered.
* Automatically adds cells to the appropriate Section(s).
*/
var SectionManager = function () {
function SectionManager() {
var sectionSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SECTION_SIZE;
_classCallCheck(this, SectionManager);
this._sectionSize = sectionSize;
this._cellMetadata = [];
this._sections = {};
}
/**
* Gets all cell indices contained in the specified region.
* A region may encompass 1 or more Sections.
*/
_createClass(SectionManager, [{
key: 'getCellIndices',
value: function getCellIndices(_ref) {
var height = _ref.height,
width = _ref.width,
x = _ref.x,
y = _ref.y;
var indices = {};
this.getSections({ height: height, width: width, x: x, y: y }).forEach(function (section) {
return section.getCellIndices().forEach(function (index) {
indices[index] = index;
});
});
// Object keys are strings; this function returns numbers
return _Object$keys(indices).map(function (index) {
return indices[index];
});
}
/** Get size and position information for the cell specified. */
}, {
key: 'getCellMetadata',
value: function getCellMetadata(_ref2) {
var index = _ref2.index;
return this._cellMetadata[index];
}
/** Get all Sections overlapping the specified region. */
}, {
key: 'getSections',
value: function getSections(_ref3) {
var height = _ref3.height,
width = _ref3.width,
x = _ref3.x,
y = _ref3.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({
height: this._sectionSize,
width: this._sectionSize,
x: sectionX * this._sectionSize,
y: sectionY * this._sectionSize
});
}
sections.push(this._sections[key]);
}
}
return sections;
}
/** Total number of Sections based on the currently registered cells. */
}, {
key: 'getTotalSectionCount',
value: function getTotalSectionCount() {
return _Object$keys(this._sections).length;
}
/** Intended for debugger/test purposes only */
}, {
key: 'toString',
value: function toString() {
var _this = this;
return _Object$keys(this._sections).map(function (index) {
return _this._sections[index].toString();
});
}
/** Adds a cell to the appropriate Sections and registers it metadata for later retrievable. */
}, {
key: 'registerCell',
value: function registerCell(_ref4) {
var cellMetadatum = _ref4.cellMetadatum,
index = _ref4.index;
this._cellMetadata[index] = cellMetadatum;
this.getSections(cellMetadatum).forEach(function (section) {
return section.addCellIndex({ index: index });
});
}
}]);
return SectionManager;
}();
export default SectionManager;
import { bpfrpt_proptype_Index } from './types';
import { bpfrpt_proptype_SizeAndPositionInfo } from './types';