UNPKG

@wcardinal/wcardinal-geditor

Version:

WebGL-based graphic editor, tester and viewer for supervisory systems

223 lines 9.16 kB
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