blob: 5b5c07ceadbf285633f1ad1aff7ee057f188e981 [file] [log] [blame]
/**
* @file data table data
* @author sushuang(sushuang@baidu.com)
*/
define(function (require) {
var $ = require('jquery');
var dtLib = require('dt/lib');
/**
* @class
*/
var EditorData = function (htIns) {
this._data = htIns.getSourceData();
this._htIns = htIns;
};
var editorDataProto = EditorData.prototype;
/**
* 清空所有数据
*
* @pubilc
*/
editorDataProto.clear = function () {
// 使用全赋null的方式,不可破坏editorData的结构。
for (var i = 0, data = this._data, len = data.length; i < len; i++) {
for (var j = 0, lenj = data[i].length; j < lenj; j++) {
data[i][j] = null;
}
}
};
/**
* 扩展data尺寸。在使用uncheckSet前使用。
* 这种设计难看,但这是为了适配handsontable,同时性能考虑。
*
* @public
* @param {number} rowCount 如果小于当前data的rowCount,则row不扩展。
* @param {number} colCount 如果小于当前data的colCount,则col不扩展。
*/
editorDataProto.enlarge = function (rowCount, colCount) {
var data = this._data;
var currColCount = this._htIns.countCols();
colCount = Math.max(colCount, currColCount);
if (colCount > currColCount) {
for (var i = 0, len = data.length; i < len; i++) {
data.length = colCount;
}
}
if (rowCount > data.length) {
for (var i = data.length; i < rowCount; i++) {
data.push(new Array(colCount));
}
}
};
/**
* 向data中设置值。
* uncheck的意思是,向二维数组中set前不检查非空(性能考虑)。
* 所以使用uncheckSet前,应该先使用enlarge函数,保证data二维数组的尺寸足够大。
* 此方法会被频繁调用。
*
* @public
*/
editorDataProto.uncheckSet = function (rowIndex, colIndex, data) {
this._data[rowIndex][colIndex] = data;
};
/**
* 将二维数组写入handsontable中
*
* @public
* @param {Array} data
*/
editorDataProto.writeArray = function (data, itemFormatter) {
var data = data || [[]];
var rowCount = data.length;
var colCount = 0;
$.each(data, function (idx, item) {
var item = item || [];
colCount = Math.max(item.length, colCount);
});
this.clear();
this.enlarge(rowCount, colCount);
var me = this;
$.each(data, function (idx, itemx) {
$.each(itemx || [], function (idy, itemy) {
me.uncheckSet(idx, idy, itemFormatter(itemy));
});
});
};
/**
* 得到data中的值。如果rowIndex或colIndex超出范围,不会抛异常而是返回空。
* 此方法会被频繁调用。
*
* @public
* @param {number} rowIndex
* @param {number} colIndex
* @param {string=} dataType 提供数据过滤的功能(如适当地处理null、非法number、trim等情况)。
* 可以是'string', 'number', 'auto'(能转成number则为number,否则为string)。
* 如果不传,则返回原始值。
* 注意,number支持 111e2 这种形式。也就是说,excel中输入了111e2,得到的值是11100。
* @return {*} value
* string时返回值必为string.
* number时如果非法则返回null.
*/
editorDataProto.get = function (rowIndex, colIndex, dataType) {
var row = this._data[rowIndex];
var value = row ? row[colIndex] : null;
// Empty value is null and ''.
// If a cell has been edited, the value can not be null but ''.
if (value === '') {
value = null;
}
if (dataType === 'string') {
value = value == null ? '' : String(value);
}
else if (dataType === 'number') {
value = dtLib.getNumber(value);
}
else if (dataType === 'auto') {
var newValue = dtLib.getNumber(value);
if (newValue != null) {
value = newValue;
}
}
return value;
};
/**
* 是否是空单元格
*
* @public
* @param {number} rowIndex
* @param {number} colIndex
* @return {boolean} isBlank
*/
editorDataProto.isBlank = function (rowIndex, colIndex) {
return dtLib.isBlank(this.get(rowIndex, colIndex));
};
/**
* @public
*/
editorDataProto.getEmptyValue = function () {
return null; // null 表示empty value.
};
/**
* 得到数据边界
*
* @public
* @param {Object} htIns
* @return {Object} {colCount: ..., rowCount: ...}
*/
editorDataProto.getDataWindowSize = function () {
var htIns = this._htIns;
var colCount = htIns.countCols();
var rowCount = htIns.countRows();
var editorData = htIns.dtEditorData;
// 找到row数据边界
var i = rowCount - 1;
var realRowCount = 0;
for (; i >= 0; i--) {
for (var j = 0; j < colCount; j++) {
if (editorData.get(i, j) != null) {
realRowCount = i + 1;
break;
}
}
if (realRowCount) {
break;
}
}
// 找到col数据边界
var j = colCount - 1;
var realColCount = 0;
for (; j >= 0; j--) {
for (var i = 0; i < realRowCount; i++) {
var val = editorData.get(i, j);
if (val != null && val !== '') {
realColCount = j + 1;
break;
}
}
if (realColCount) {
break;
}
}
return {colCount: realColCount, rowCount: realRowCount};
};
return EditorData;
});