@wcardinal/wcardinal-geditor
Version:
WebGL-based graphic editor, tester and viewer for supervisory systems
223 lines • 9.16 kB
JavaScript
import { __extends } from "tslib";
import { EShapeCopyPart, EShapeGroupShadowed, EShapeLockPart, EShapeRectangle } from "@wcardinal/wcardinal-ui";
import { EShapeTableCell } from "./e-shape-table-cell";
import { EShapeTableColumn } from "./e-shape-table-column";
import { EShapeTableIds } from "./e-shape-table-ids";
import { EShapeTableRow } from "./e-shape-table-row";
var EShapeTable = /** @class */ (function (_super) {
__extends(EShapeTable, _super);
function EShapeTable(mode, type) {
if (type === void 0) { type = EShapeTableIds.ID; }
var _this = _super.call(this, mode, type) || this;
_this._columnWidths = [];
_this._columnXs = [];
_this.column = new EShapeTableColumn(function () {
_this.onColumnChange();
});
_this.row = new EShapeTableRow(_this, function () {
_this.onRowChange();
});
_this.cell = new EShapeTableCell(_this);
return _this;
}
EShapeTable.prototype.onColumnChange = function () {
this.newCellsHeader();
this.newCellsBody(true);
this.layoutCells();
};
EShapeTable.prototype.onRowChange = function () {
this.newCellsBody(false);
this.layoutCells();
};
EShapeTable.prototype.onSizeChange = function () {
_super.prototype.onSizeChange.call(this);
this.newCellsBody(false);
this.layoutCells();
};
EShapeTable.prototype.newCellsHeader = function () {
if (this.children.length <= 0) {
return;
}
var header = this.children[0];
var column = this.column;
var columnCount = column.size();
var values = column.values;
// Create / delete children
var children = header.children;
var childrenLength = children.length;
if (childrenLength < columnCount) {
var master = children[childrenLength - 1] || this;
for (var i = childrenLength; i < columnCount; ++i) {
var cell = new EShapeRectangle().copy(master);
cell.text.value = values[i].header.label;
cell.attach(header);
}
}
else if (columnCount < childrenLength) {
for (var i = childrenLength - 1; columnCount <= i; --i) {
children[i].detach();
}
}
// Update text
for (var i = 0; i < columnCount; ++i) {
children[i].text.value = values[i].header.label;
}
};
EShapeTable.prototype.toRowCountRequired = function () {
return Math.min(1000, Math.max(1, Math.floor(Math.abs(this.size.y) / this.row.height))) - 1;
};
EShapeTable.prototype.newCellsBody = function (isColumnDirty) {
// Rows
if (this.children.length <= 1) {
return;
}
var body = this.children[1];
var rows = body.children;
var rowsLength = rows.length;
var rowCountRequired = this.toRowCountRequired();
var rowCount = Math.max(2, rowCountRequired);
if (rowsLength < rowCount) {
var masterEven = (0 < rowsLength ? rows[0] : null) || this;
var masterOdd = (1 < rowsLength ? rows[1] : null) || this;
var mode = this.mode;
for (var irow = rowsLength; irow < rowCount; ++irow) {
var master = irow % 2 === 0 ? masterEven : masterOdd;
new EShapeGroupShadowed(mode).copy(master, EShapeCopyPart.ACTION).attach(body);
}
}
else if (rowCount < rowsLength) {
for (var i = rowsLength - 1; rowCount <= i; --i) {
rows[i].detach();
}
}
if (0 < rows.length) {
rows[0].visible = 0 < rowCountRequired;
}
if (1 < rows.length) {
rows[1].visible = 1 < rowCountRequired;
}
// Cells
var masterCellEven = (0 < rows.length ? rows[0].children[0] : null) || this;
var masterCellOdd = (1 < rows.length ? rows[1].children[0] : null) || this;
var column = this.column;
var columnValues = column.values;
var columnCount = column.size();
for (var irow = 0; irow < rowCount; ++irow) {
var columnCountRequired = irow <= 1 ? Math.max(1, columnCount) : columnCount;
var row = rows[irow];
var cells = row.children;
var cellsLength = cells.length;
var master = irow % 2 === 0 ? masterCellEven : masterCellOdd;
if (cellsLength < columnCountRequired) {
for (var icolumn = cellsLength; icolumn < columnCountRequired; ++icolumn) {
new EShapeRectangle().copy(master).attach(row);
}
}
else if (columnCountRequired < cellsLength) {
for (var i = cellsLength - 1; columnCountRequired <= i; --i) {
cells[i].detach();
}
}
if (0 < cells.length) {
cells[0].visible = 0 < columnCount;
}
if (1 < cells.length) {
cells[1].visible = 1 < columnCount;
}
if (isColumnDirty) {
for (var i = 0; i < columnCount; ++i) {
cells[i].text.align.horizontal = columnValues[i].align;
}
}
}
};
EShapeTable.prototype.layoutCells = function () {
if (this.children.length <= 1) {
return;
}
var rowHeight = this.row.height;
var rowHeightHalf = rowHeight * 0.5;
var column = this.column;
var size = this.size;
var sizeX = size.x;
var sizeY = size.y;
var sxh = -sizeX * 0.5;
var syh = -sizeY * 0.5;
var columnValues = column.values;
var columnValuesLength = columnValues.length;
// Total weight
var totalWeight = 0;
for (var i = 0; i < columnValuesLength; ++i) {
totalWeight += columnValues[i].weight;
}
totalWeight = Math.max(0.00001, totalWeight);
// Column width and x position
var columnWidths = this._columnWidths;
var columnXs = this._columnXs;
var columnWidthFactor = sizeX / totalWeight;
var columnX = 0;
for (var i = 0; i < columnValuesLength; ++i) {
var columnWidth = columnValues[i].weight * columnWidthFactor;
columnWidths[i] = columnWidth;
columnXs[i] = columnX + columnWidth * 0.5;
columnX += columnWidth;
}
// Header
var header = this.children[0];
header.lock(EShapeLockPart.ALL);
header.size.set(sizeX, rowHeight);
header.transform.position.set(0, syh + rowHeightHalf);
header.unlock(EShapeLockPart.ALL, true);
var hcells = header.children;
var hcellsLength = hcells.length;
for (var icolumn = 0; icolumn < hcellsLength; ++icolumn) {
var hcell = hcells[icolumn];
hcell.lock(EShapeLockPart.ALL);
hcell.size.set(columnWidths[icolumn], rowHeight);
hcell.transform.position.set(sxh + columnXs[icolumn], 0);
hcell.unlock(EShapeLockPart.ALL, true);
}
// Body
var body = this.children[1];
body.lock(EShapeLockPart.ALL);
body.size.set(sizeX, sizeY - rowHeight);
body.transform.position.set(0, rowHeightHalf);
body.unlock(EShapeLockPart.ALL, true);
var rows = body.children;
var rowsLength = rows.length;
for (var irow = 0, y = syh + rowHeight; irow < rowsLength; ++irow, y += rowHeight) {
var row = rows[irow];
row.lock(EShapeLockPart.ALL);
row.size.set(sizeX, rowHeight);
row.transform.position.set(0, y);
row.unlock(EShapeLockPart.ALL, true);
var cells = row.children;
var cellsLength = cells.length;
for (var icolumn = 0; icolumn < cellsLength; ++icolumn) {
var cell = cells[icolumn];
cell.lock(EShapeLockPart.ALL);
cell.size.set(columnWidths[icolumn], rowHeight);
cell.transform.position.set(sxh + columnXs[icolumn], 0);
cell.unlock(EShapeLockPart.ALL, true);
}
}
};
EShapeTable.prototype.copy = function (source, part) {
if (part === void 0) { part = EShapeCopyPart.ALL; }
var result = _super.prototype.copy.call(this, source, part);
if (source instanceof EShapeTable) {
this.column.copy(source.column);
this.row.copy(source.row);
}
return result;
};
EShapeTable.prototype.serialize = function (manager) {
var result = _super.prototype.serialize.call(this, manager);
var resource = result[15];
result[15] = manager.addResource("[".concat(this.column.serialize(manager), ",").concat(this.row.serialize(manager), ",").concat(resource, "]"));
return result;
};
return EShapeTable;
}(EShapeGroupShadowed));
export { EShapeTable };
//# sourceMappingURL=e-shape-table.js.map