UNPKG

@syncfusion/ej2-documenteditor

Version:

Feature-rich document editor control with built-in support for context menu, options pane and dialogs.

994 lines 740 kB
/* eslint-disable */ import { isNullOrUndefined } from '@syncfusion/ej2-base'; import { Dictionary } from '../../base/dictionary'; import { CharacterRangeType, FontScriptType } from '../../base/types'; import { HelperMethods, Point, WrapPosition } from '../editor/editor-helper'; import { WBorder, WBorders, WCharacterFormat, WParagraphFormat } from '../format/index'; import { WListLevel } from '../list/list-level'; import { BlockContainer, BlockWidget, BodyWidget, BookmarkElementBox, EditRangeEndElementBox, EditRangeStartElementBox, ElementBox, FieldElementBox, FieldTextElementBox, HeaderFooterWidget, ImageElementBox, LineWidget, ListTextElementBox, Margin, ParagraphWidget, Rect, TabElementBox, TableCellWidget, TableRowWidget, TableWidget, TextElementBox, Widget, CheckBoxFormField, DropDownFormField, ShapeElementBox, TextFrame, ContentControl, FootnoteElementBox, FootNoteWidget, ShapeBase, CommentCharacterElementBox } from './page'; import { PageLayoutViewer, WebLayoutViewer } from './viewer'; import { TextHelper } from './text-helper'; // Check box character is rendered smaller when compared to MS Word // So, mutiplied the font side by below factor to render check box character large. var CHECK_BOX_FACTOR = 1.35; /** * @private */ var Layout = /** @class */ (function () { function Layout(documentHelper) { /** * @private */ this.islayoutFootnote = false; /** * @private */ this.isMultiColumnDoc = false; /** * @private */ this.allowLayout = true; /** * @private */ this.isReplaceAll = false; /** * @private */ this.isTextFormat = false; /** * @private */ this.isSectionBreakCont = false; /** * @private */ this.isReplacingAll = false; /** * @private */ this.footHeight = 0; /** * @private */ this.existFootnoteHeight = 0; /** * @private */ this.isfootMove = false; /** * @private */ this.footnoteHeight = 0; /** * @private */ this.isTableFootNote = false; /** * @private */ this.isRelayout = false; /** * @private */ this.isRelayoutneed = false; /** * @private */ this.isOverlapFloatTable = false; this.isInitialLoad = true; /** * @private */ this.isInsertFormField = false; this.fieldBegin = undefined; this.maxTextHeight = 0; this.maxBaseline = 0; this.maxTextBaseline = 0; this.isFieldCode = false; this.isRtlFieldCode = false; this.isRTLLayout = false; this.isSkipFirstLineIndent = false; this.currentCell = undefined; this.isFootnoteContentChanged = false; this.isEndnoteContentChanged = false; this.keepWithNext = false; this.is2013Justification = false; this.nextElementToLayout = undefined; this.endNoteHeight = 0; this.isMultiColumnSplit = false; this.isMultiColumnLayout = false; this.skipUpdateContainerWidget = false; this.isIFfield = false; this.isLayoutWhole = false; /** * @private */ this.isBidiReLayout = false; /** * @private */ this.defaultTabWidthPixel = 48; /** * @private */ this.isRelayoutFootnote = false; this.isRelayoutOverlap = false; this.skipRelayoutOverlap = false; this.isWrapText = false; this.isYPositionUpdated = false; this.isXPositionUpdated = false; this.hasFloatingElement = false; this.isFootNoteLayoutStart = false; this.wrapPosition = []; this.shiftedFloatingItemsFromTable = []; this.isDocumentContainsRtl = false; this.layoutedFootnoteElement = []; this.documentHelper = documentHelper; } Layout.prototype.isSameStyle = function (currentParagraph, isAfterSpacing) { var nextOrPrevSibling = undefined; if (isAfterSpacing) { if (currentParagraph.nextWidget instanceof ParagraphWidget) { nextOrPrevSibling = currentParagraph.nextWidget; } } else { if (currentParagraph.previousWidget instanceof ParagraphWidget) { nextOrPrevSibling = currentParagraph.previousWidget; } } if (isNullOrUndefined(nextOrPrevSibling)) { //Need to skip contextual spacing behavior when document is not Word 2013 and paragraph preserved inside the table cell with AllowSpaceOfSameStyleInTable compatiblity options. if (currentParagraph.paragraphFormat.contextualSpacing && (currentParagraph.isInsideTable ? (!this.documentHelper.allowSpaceOfSameStyleInTable || this.documentHelper.compatibilityMode === 'Word2013') : false)) { if (currentParagraph.index === 0) { nextOrPrevSibling = this.updateFirstParagraphSpacingBasedOnContextualSpacing(currentParagraph, isAfterSpacing); } else if (currentParagraph.index === currentParagraph.associatedCell.childWidgets.length - 1) { nextOrPrevSibling = this.updateLastParagraphSpacingBasedOnContextualSpacing(currentParagraph); if (nextOrPrevSibling === currentParagraph) { return true; } } } if (isNullOrUndefined(nextOrPrevSibling)) { return false; } } if (nextOrPrevSibling instanceof ParagraphWidget && currentParagraph.paragraphFormat.baseStyle === nextOrPrevSibling.paragraphFormat.baseStyle && (currentParagraph.isInsideTable ? !this.documentHelper.allowSpaceOfSameStyleInTable : true)) { if (currentParagraph.paragraphFormat.listFormat.listId >= 0 && nextOrPrevSibling.paragraphFormat.listFormat.listId >= 0) { if (!currentParagraph.paragraphFormat.contextualSpacing) { if (isAfterSpacing && currentParagraph.paragraphFormat.spaceAfterAuto) { return true; } else if (!isAfterSpacing && currentParagraph.paragraphFormat.spaceBeforeAuto) { return true; } } } return currentParagraph.paragraphFormat.contextualSpacing; } return false; }; Layout.prototype.updateFirstParagraphSpacingBasedOnContextualSpacing = function (paragraph, isAfterSpacing) { var ownerCell = paragraph.associatedCell; var ownerRow = ownerCell.ownerRow; var ownerTable = ownerRow.ownerTable; var nextOrPrevSibling; if (isAfterSpacing) { nextOrPrevSibling = isNullOrUndefined(paragraph.nextRenderedWidget) ? (!isNullOrUndefined(ownerCell.nextRenderedWidget) ? ownerCell.nextRenderedWidget.firstChild : undefined) : paragraph.nextRenderedWidget; } else { nextOrPrevSibling = isNullOrUndefined(paragraph.previousRenderedWidget) ? (!isNullOrUndefined(ownerCell.previousRenderedWidget) ? ownerCell.previousRenderedWidget.firstChild : undefined) : paragraph.previousRenderedWidget; } if (ownerCell.index === 0 && paragraph.index === 0) { if (ownerRow.index === 0) { if (ownerTable.isInsideTable && ownerTable.index == 0) { nextOrPrevSibling = this.checkOwnerTablePrevItem(ownerTable, paragraph); } else { //If paragraph is preserved in first row first cell means, need to check owner table previous sibling. var ownerTablePrevSibling = ownerTable.previousRenderedWidget; return ownerTablePrevSibling; } } else { if (isNullOrUndefined(nextOrPrevSibling) && paragraph.paragraphFormat.baseStyle.name === "Normal" && paragraph.paragraphFormat.listFormat.listId < 0) { return paragraph; } return nextOrPrevSibling; } } else if (paragraph.index === 0 && !isAfterSpacing) { //If para is first item in any cell excluding first cell, need to check previous cell last item. var prevCell = ownerRow.childWidgets[ownerCell.index - 1]; var prevCelllastItem = prevCell.childWidgets[prevCell.childWidgets.length - 1]; //if previous cell last item is table means skip before spacing value no need to check any paragraph styles. if (prevCelllastItem instanceof TableWidget && paragraph.paragraphFormat.baseStyle.name === "Normal" && paragraph.paragraphFormat.listFormat.listId < 0) { return paragraph; } } return nextOrPrevSibling; }; Layout.prototype.updateLastParagraphSpacingBasedOnContextualSpacing = function (paragraph) { var ownerCell = paragraph.associatedCell; var ownerRow = ownerCell.ownerRow; var nextCellFirstItem; if (ownerCell.index === ownerRow.childWidgets.length - 1 && paragraph.index === ownerCell.childWidgets.length - 1) { if (paragraph.paragraphFormat.baseStyle.name === "Normal" && paragraph.paragraphFormat.listFormat.listId < 0) { //If para preserved in last item in cell and cell is last cell in current row means its after spacing value not considered. return paragraph; } } else if (paragraph.index === ownerCell.childWidgets.length - 1) { //If current para is last item in current cell then need to check next cell first item. var nextCell = ownerRow.childWidgets[ownerCell.index + 1]; nextCellFirstItem = nextCell.firstChild; //If next cell first item is table then need to check inner table first para. //This is applicable for multiple nested table so when first item is table it try to get its first paragraph. while (nextCellFirstItem instanceof TableWidget) { nextCellFirstItem = nextCellFirstItem.childWidgets[0].childWidgets[0].childWidgets[0]; } } return nextCellFirstItem; }; Layout.prototype.checkOwnerTablePrevItem = function (ownerTable, paragraph) { var row = ownerTable.associatedCell.ownerRow; var prevSibling; if (row.index > 0) { if (paragraph.paragraphFormat.baseStyle.name === "Normal" && paragraph.paragraphFormat.listFormat.listId < 0) { return paragraph; } } else { if (row.ownerTable.isInsideTable && row.ownerTable.index === 0) { this.checkOwnerTablePrevItem(row.ownerTable, paragraph); } else { var prevSibling_1 = row.ownerTable.previousRenderedWidget; return prevSibling_1; } } return prevSibling; }; Object.defineProperty(Layout.prototype, "viewer", { get: function () { return this.documentHelper.owner.viewer; }, enumerable: true, configurable: true }); Layout.prototype.layout = function () { // Todo: Need to handle complete document layout(relayout). //const page: Page = this.documentHelper.pages[0]; //const body: BodyWidget = page.bodyWidgets[0]; }; /** * Releases un-managed and - optionally - managed resources. * * @returns {void} */ Layout.prototype.destroy = function () { this.documentHelper = undefined; this.value = undefined; this.allowLayout = undefined; this.isInitialLoad = undefined; this.fieldBegin = undefined; this.maxTextHeight = undefined; this.maxBaseline = undefined; this.maxTextBaseline = undefined; this.isSkipFirstLineIndent = undefined; this.isFieldCode = undefined; this.footnoteHeight = undefined; this.isMultiColumnDoc = undefined; this.isIFfield = undefined; }; Layout.prototype.layoutItems = function (sections, isReLayout, isContinuousSection) { var _this = this; var page; var height = 0; var width = 0; for (var i = 0; i < sections.length; i++) { var section = sections[i]; if (section.sectionFormat.numberOfColumns > 1) { this.isMultiColumnDoc = true; } var nextSection = sections[i + 1]; this.viewer.columnLayoutArea.setColumns(section.sectionFormat); var lastpage = this.documentHelper.pages[this.documentHelper.pages.length - 1]; var bodyWidget = void 0; if (!isNullOrUndefined(lastpage) && !isNullOrUndefined(lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1]) && lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1].childWidgets.length === 0 && !isNullOrUndefined(lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1].previousSplitWidget)) { bodyWidget = lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1].previousSplitWidget; } /* eslint-disable-next-line max-len */ if (i > 0 && !isNullOrUndefined(bodyWidget) && !isNullOrUndefined(bodyWidget.lastChild) && !(bodyWidget.lastChild instanceof TableWidget) && ((this.documentHelper.compatibilityMode === 'Word2013' && bodyWidget.lastChild.isEndsWithPageBreak || bodyWidget.lastChild.isEndsWithColumnBreak)) && lastpage.bodyWidgets[0].childWidgets.length === 0) { var removedPages = this.documentHelper.pages.splice(this.documentHelper.pages.length - 1, 1); removedPages[0].destroy(); lastpage = this.documentHelper.pages[this.documentHelper.pages.length - 1]; } var breakCode = section.sectionFormat.breakCode; var prevSection = undefined; if (i !== 0 && this.documentHelper.compatibilityMode === 'Word2010' && breakCode === 'NewColumn') { var splitWidgets = sections[i - 1].getSplitWidgets(); prevSection = splitWidgets[splitWidgets.length - 1]; if (prevSection.sectionFormat.columns.length > 1 && section.sectionFormat.columns.length > 1 && prevSection.sectionFormat.columns.length === section.sectionFormat.columns.length && prevSection.sectionFormat.columns.length - 1 !== prevSection.columnIndex && !(prevSection.lastChild instanceof ParagraphWidget && prevSection.lastChild.isEndsWithPageBreak)) { var nextColumn = this.viewer.columnLayoutArea.getNextColumnByBodyWidget(prevSection); if (!isNullOrUndefined(nextColumn)) { section.columnIndex = nextColumn.index; section.isWord2010NextColumn = true; section.y = prevSection.y; this.viewer.clientActiveArea.height -= section.y - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = section.y; } } } if (!section.isWord2010NextColumn && breakCode !== 'NoBreak') { breakCode = 'NewPage'; } if ((i === 0 && !isContinuousSection) || (i !== 0 && !section.isWord2010NextColumn && (isNullOrUndefined(breakCode) || breakCode === 'NewPage' || height !== section.sectionFormat.pageHeight || width !== section.sectionFormat.pageWidth || (!isNullOrUndefined(lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1].lastChild) && lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1].lastChild.isEndsWithPageBreak)))) { page = this.viewer.createNewPage(section); } else { var clientY = this.documentHelper.viewer.clientActiveArea.y; var clientHeight = this.documentHelper.viewer.clientActiveArea.height; if (isContinuousSection) { var section_1 = this.getBodyWidget(lastpage.bodyWidgets[lastpage.bodyWidgets.length - 1], true); var height_1 = this.getNextWidgetHeight(section_1); this.viewer.updateClientArea(section_1, section_1.page); clientHeight = this.viewer.clientActiveArea.height - (height_1 - this.viewer.clientActiveArea.y); clientY = height_1; isContinuousSection = false; } //if (i - 1 > 0) { page = lastpage; //} page.bodyWidgets.push(section); page.bodyWidgets[page.bodyWidgets.length - 1].page = page; this.documentHelper.viewer.updateClientArea(section, page); this.documentHelper.viewer.clientActiveArea.y = clientY; this.documentHelper.viewer.clientActiveArea.height = clientHeight; } height = section.sectionFormat.pageHeight; width = section.sectionFormat.pageWidth; this.addBodyWidget(this.viewer.clientActiveArea, section); if (this.documentHelper.pages.length > 1) { var pageIndex = 0; for (var i_1 = 0; i_1 < this.documentHelper.pages.length; i_1++) { var prevPage = this.documentHelper.pages[i_1]; var prevSectionIndex = prevPage.sectionIndex; var index = section.index; if (prevSectionIndex > index || prevPage === page) { break; } pageIndex++; } if (pageIndex < this.documentHelper.pages.length - 1) { this.documentHelper.insertPage(pageIndex, page); } } this.layoutSection(section, 0, nextSection); if (section.isWord2010NextColumn && !isNullOrUndefined(prevSection)) { var sectionHeight = this.getNextWidgetHeight(prevSection); if (this.viewer.clientActiveArea.y < sectionHeight) { this.viewer.updateClientArea(prevSection, prevSection.page); this.viewer.clientActiveArea.height = this.viewer.clientActiveArea.height - (sectionHeight - this.viewer.clientActiveArea.y); this.viewer.clientActiveArea.y = sectionHeight; } } } if (!isReLayout) { this.layoutComments(this.documentHelper.comments); } this.updateFieldElements(); if (this.documentHelper.owner.layoutType === 'Pages') { this.layoutEndNoteElement(); } /* tslint:disable:align */ setTimeout(function () { if (_this.documentHelper) { _this.documentHelper.isScrollHandler = true; // if (this.documentHelper.owner.isSpellCheck && this.documentHelper.owner.spellChecker.enableOptimizedSpellCheck) { // this.documentHelper.triggerElementsOnLoading = true; // } _this.documentHelper.clearContent(); _this.viewer.updateScrollBars(); _this.documentHelper.isScrollHandler = false; _this.isInitialLoad = false; } }, 50); }; /** * @private */ Layout.prototype.layoutComments = function (comments) { if (!isNullOrUndefined(comments)) { this.viewer.owner.commentReviewPane.layoutComments(); } }; Layout.prototype.layoutSection = function (section, index, nextSection) { var block = section.firstChild; var nextBlock; var prevBlock; do { if (block instanceof TableWidget && block.tableFormat.preferredWidthType === 'Auto' && !block.tableFormat.allowAutoFit) { block.calculateGrid(); } if (!isNullOrUndefined(block)) { this.viewer.updateClientAreaForBlock(block, true, undefined, true, true); var bodyIndex = block.containerWidget.indexInOwner; nextBlock = this.layoutBlock(block, index); index = 0; this.viewer.updateClientAreaForBlock(block, false); prevBlock = block; block = nextBlock; } } while (block); block = section.firstChild; if (this.viewer instanceof PageLayoutViewer && section.sectionFormat.numberOfColumns > 1 && !isNullOrUndefined(nextSection) && nextSection.sectionFormat.breakCode === 'NoBreak' && (section.sectionFormat.breakCode === 'NoBreak' || (section.sectionIndex === section.page.bodyWidgets[0].sectionIndex))) { if (this.getColumnBreak(section)) { var splittedSection = section.getSplitWidgets(); var bodyWidget = splittedSection[splittedSection.length - 1]; if (!isNullOrUndefined(section.page.nextPage)) { this.splitBodyWidgetBasedOnColumn(bodyWidget); } else { var firstBody = this.getBodyWidget(bodyWidget, true); this.viewer.updateClientArea(firstBody, firstBody.page); var height = this.getNextWidgetHeight(firstBody); this.viewer.clientActiveArea.height -= height - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = height; } } else { if (!isNullOrUndefined(section.page.nextPage)) { section = this.documentHelper.pages[this.documentHelper.pages.length - 1].bodyWidgets[0]; } this.splitBodyWidgetBasedOnColumn(section); } } var page; if (block && block.bodyWidget && block.bodyWidget.page) { page = block.bodyWidget.page; } while (page) { if (page.footnoteWidget) { this.layoutfootNote(page.footnoteWidget); page = page.nextPage; } else { page = page.nextPage; } } page = undefined; block = undefined; }; /** * @private * */ Layout.prototype.reLayoutMultiColumn = function (section, isFirstBlock, blockIndex) { this.isInitialLoad = true; section = section.getSplitWidgets()[0]; this.combineMultiColumnForRelayout(section); if (section.sectionFormat.numberOfColumns > 1) { this.isMultiColumnDoc = true; } this.isMultiColumnSplit = false; var previousSection = section.previousRenderedWidget; var nextSection = section.nextRenderedWidget; var isUpdatedClientArea = false; // Section's Y position is not updated properly when the two sections combined and layouted. if (!isFirstBlock && !isNullOrUndefined(section.firstChild) && section.firstChild instanceof ParagraphWidget && section.y !== section.firstChild.y) { section.y = section.firstChild.y; } if (isFirstBlock && nextSection && section.page !== nextSection.page && section.firstChild instanceof ParagraphWidget) { var paragraph = section.firstChild; var lineHeight = 0; if (paragraph.isEmpty()) { lineHeight = this.documentHelper.textHelper.getParagraphMarkSize(paragraph.characterFormat).Height; } else { var firstLine = paragraph.childWidgets[0]; lineHeight = this.getMaxElementHeight(firstLine); } var previousBlock = paragraph.previousRenderedWidget; if (section.y === this.viewer.clientActiveArea.y && lineHeight > this.viewer.clientActiveArea.height) { previousBlock = isNullOrUndefined(previousBlock) ? paragraph : previousBlock; this.moveBlocksToNextPage(previousBlock); this.viewer.columnLayoutArea.setColumns(section.sectionFormat); this.viewer.updateClientArea(section, section.page); isUpdatedClientArea = true; } } else if (!isNullOrUndefined(previousSection) && previousSection.page !== section.page && section.firstChild instanceof ParagraphWidget && previousSection.lastChild instanceof ParagraphWidget) { var previousParagraph = previousSection.lastChild; var paragraph = section.firstChild; if (section instanceof BodyWidget && previousSection.lastChild && previousParagraph instanceof ParagraphWidget && previousSection.sectionFormat.breakCode === 'NoBreak' && section.page.index !== previousSection.page.index && section.index !== previousSection.index) { var bodyWidget = previousSection; if (bodyWidget.sectionFormat.columns.length > 1) { bodyWidget = this.getBodyWidget(bodyWidget, true); } var bottom = HelperMethods.round((this.getNextWidgetHeight(bodyWidget) + paragraph.height), 2); // Bug 858530: Shift the widgets to previous container widget if the client height is not enough to place this widget. if (!previousSection.lastChild.isEndsWithPageBreak && !previousSection.lastChild.isEndsWithColumnBreak && bottom <= HelperMethods.round(this.viewer.clientActiveArea.bottom, 2)) { var page = previousSection.page; var nextPage = section.page; for (var j = 0; j < nextPage.bodyWidgets.length; j++) { var nextBodyWidget = nextPage.bodyWidgets[j]; nextPage.bodyWidgets.splice(nextPage.bodyWidgets.indexOf(nextBodyWidget), 1); page.bodyWidgets.splice(page.bodyWidgets.length, 0, nextBodyWidget); nextBodyWidget.page = page; j--; } section.y = this.viewer.clientActiveArea.y; this.documentHelper.removeEmptyPages(); } } } if (!isUpdatedClientArea) { this.viewer.columnLayoutArea.setColumns(section.sectionFormat); this.viewer.updateClientArea(section, section.page); this.viewer.clientActiveArea.height -= section.y - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = section.y; } this.addBodyWidget(this.viewer.clientActiveArea, section); this.clearBlockWidget(section.childWidgets, true, true, true); this.isMultiColumnLayout = true; this.reLayoutMultiColumnBlock(section, nextSection, blockIndex); this.isMultiColumnLayout = false; this.isInitialLoad = false; var splitSections = section.getSplitWidgets(); var lastSection = splitSections[splitSections.length - 1]; var firstBody = this.getBodyWidget(lastSection, true); this.viewer.updateClientArea(firstBody, firstBody.page); var height = this.getNextWidgetHeight(firstBody); this.viewer.clientActiveArea.height -= height - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = height; if (!isNullOrUndefined(lastSection) && !isNullOrUndefined(lastSection.nextRenderedWidget)) { nextSection = lastSection.nextRenderedWidget; var clientY = this.documentHelper.viewer.clientActiveArea.y; var clientHeight = this.documentHelper.viewer.clientActiveArea.height; this.documentHelper.viewer.updateClientArea(nextSection, nextSection.page); this.documentHelper.viewer.clientActiveArea.y = clientY; this.documentHelper.viewer.clientActiveArea.height = clientHeight; this.documentHelper.blockToShift = nextSection.firstChild; } if (isNullOrUndefined(lastSection.nextRenderedWidget) || (!isNullOrUndefined(lastSection.nextRenderedWidget) && lastSection.sectionFormat.breakCode !== 'NoBreak' && lastSection.nextRenderedWidget.sectionFormat.pageHeight !== lastSection.sectionFormat.pageHeight && lastSection.nextRenderedWidget.sectionFormat.pageWidth !== lastSection.sectionFormat.pageWidth)) { this.documentHelper.blockToShift = undefined; } }; Layout.prototype.combineMultiColumnForRelayout = function (section) { var splitSections = section.getSplitWidgets(); var firstSection = splitSections[0]; section = splitSections[splitSections.length - 1]; while (section !== firstSection) { var prevSection = section.previousRenderedWidget; var isPreviousSplit = false; for (var i = 0; i < section.childWidgets.length; i++) { if (section.childWidgets[i] instanceof BlockWidget && !isNullOrUndefined(section.childWidgets[i].previousSplitWidget) && !isNullOrUndefined(section.childWidgets[i].previousSplitWidget.previousSplitWidget) && section.childWidgets[i].previousSplitWidget.bodyWidget.page !== section.childWidgets[i].previousSplitWidget.previousSplitWidget.bodyWidget.page) { isPreviousSplit = true; } if ((section.childWidgets[i] instanceof BlockWidget && !isNullOrUndefined(section.childWidgets[i].previousSplitWidget) && section.childWidgets[i].previousSplitWidget.bodyWidget.page === section.childWidgets[i].bodyWidget.page && !isPreviousSplit)) { section.childWidgets[i].combineWidget(this.viewer); if (prevSection.lastChild instanceof TableWidget) { this.updateCellHeightInCombinedTable(prevSection.lastChild); } i--; continue; } prevSection.childWidgets.push(section.childWidgets[i]); section.childWidgets[i].containerWidget = prevSection; section.childWidgets[i].containerWidget.page = prevSection.page; section.childWidgets.splice(0, 1); i--; } section = section.previousRenderedWidget; } this.documentHelper.removeEmptyPages(); }; Layout.prototype.reLayoutMultiColumnBlock = function (section, nextSection, blockIndex) { var block = section.firstChild; var nextBlock; do { if (block instanceof TableWidget && block.tableFormat.preferredWidthType === 'Auto' && !block.tableFormat.allowAutoFit) { block.calculateGrid(); } if (!isNullOrUndefined(block)) { this.viewer.updateClientAreaForBlock(block, true, undefined, true); nextBlock = this.layoutBlock(block, 0, block.index < blockIndex ? true : false); this.viewer.updateClientAreaForBlock(block, false); block = nextBlock; } } while (block && section.getSplitWidgets().indexOf(block.bodyWidget) !== -1); block = section.firstChild; if (this.viewer instanceof PageLayoutViewer && section.sectionFormat.numberOfColumns > 1 && !isNullOrUndefined(nextSection) && nextSection.sectionFormat.breakCode === 'NoBreak' && (section.sectionFormat.breakCode === 'NoBreak' || (section.sectionIndex === section.page.bodyWidgets[0].sectionIndex))) { var splittedSection = section.getSplitWidgets(); var bodyWidget = splittedSection[splittedSection.length - 1]; if (this.getColumnBreak(section)) { if (section.page !== bodyWidget.page) { this.splitBodyWidgetBasedOnColumn(bodyWidget); } else { var firstBody = this.getBodyWidget(bodyWidget, true); this.viewer.updateClientArea(firstBody, firstBody.page); var height = this.getNextWidgetHeight(firstBody); this.viewer.clientActiveArea.height -= height - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = height; } } else if (!isNullOrUndefined(section.page.nextPage)) { this.splitBodyWidgetBasedOnColumn(bodyWidget); } } }; Layout.prototype.splitBodyWidgetBasedOnColumn = function (section) { section = this.getBodyWidget(section, true); var firstSection = section; this.isMultiColumnSplit = true; if (!this.isInitialLoad && section.sectionFormat.equalWidth) { var previousStartIndex = this.documentHelper.selection.startOffset; var previousEndIndex = this.documentHelper.selection.endOffset; this.combineMultiColumn(section); this.layoutMultiColumnBody(section, false); if (previousStartIndex !== this.documentHelper.selection.startOffset) { this.documentHelper.selection.select(previousStartIndex, previousEndIndex); } } this.combineMultiColumn(section); var lineCountInfo = this.getCountOrLine(section, undefined, undefined, true); var totalHeight = lineCountInfo.lineCount; var lineToBeSplit = Math.round(totalHeight / section.sectionFormat.numberOfColumns); while (section) { var lineCountInfo_1 = this.getCountOrLine(section, lineToBeSplit, true, false); var line = lineCountInfo_1.lineWidget; var lineIndexInCell = lineCountInfo_1.lineCount; if (!isNullOrUndefined(line)) { if (line.paragraph.containerWidget instanceof BodyWidget) { this.moveToNextLine(line, true, line.indexInOwner); } else if (line.paragraph.containerWidget instanceof TableCellWidget) { var table = [line.paragraph.containerWidget.ownerTable]; var rows = [line.paragraph.containerWidget.ownerRow]; var index = line.paragraph.containerWidget.index; if (table[table.length - 1].isInsideTable) { table[table.length - 1] = this.getParentTable(table[table.length - 1]); rows[rows.length - 1] = this.getParentRow(rows[rows.length - 1]); } this.updateWidgetsToTable(table, rows, rows[rows.length - 1], false, lineIndexInCell, index, true); var tableWidget = table[table.length - 1]; var rowWidget = rows[rows.length - 1]; var nextRow = rowWidget.nextRenderedWidget; while (nextRow) { this.clearRowWidget(nextRow, true, true, false); nextRow = this.layoutRow(table, nextRow); nextRow = nextRow.nextRenderedWidget; } if (!isNullOrUndefined(tableWidget.nextRenderedWidget) && section.sectionFormat.equalWidth) { this.documentHelper.blockToShift = tableWidget.nextRenderedWidget; this.documentHelper.layout.shiftLayoutedItems(false); } } var firstBody = this.getBodyWidget(line.paragraph.bodyWidget, true); var lastBody = this.getBodyWidget(firstBody, false); if (!firstBody.sectionFormat.equalWidth && lastBody.sectionFormat.numberOfColumns - 1 === lastBody.columnIndex && isNullOrUndefined(lastBody.nextSplitWidget)) { var nonEqualBody = firstBody; var initialCount = (this.getCountOrLine(firstBody)).lineCount; this.layoutMultiColumnBody(nonEqualBody, true); var finalCount = (this.getCountOrLine(firstBody)).lineCount; if (initialCount !== finalCount) { this.splitBodyWidgetBasedOnColumn(firstBody); } } if (isNullOrUndefined(lastBody.nextSplitWidget)) { this.viewer.updateClientArea(firstBody, firstBody.page); var height = this.getNextWidgetHeight(firstBody); this.viewer.clientActiveArea.height -= height - this.viewer.clientActiveArea.y; this.viewer.clientActiveArea.y = height; this.viewer.clientArea.y = this.viewer.clientActiveArea.y; this.viewer.clientArea.height = this.viewer.clientActiveArea.height; } } section = section.nextRenderedWidget; if (!isNullOrUndefined(section) && section.columnIndex === section.sectionFormat.numberOfColumns - 1) { break; } } this.isMultiColumnSplit = false; if (!this.isInitialLoad) { section = this.getBodyWidget(firstSection, false); if (!isNullOrUndefined(section.nextRenderedWidget)) { this.documentHelper.blockToShift = section.nextRenderedWidget.firstChild; } } }; /** * @private */ Layout.prototype.getColumnBreak = function (section) { var firstBody = this.getBodyWidget(section, true); if (firstBody.sectionFormat.numberOfColumns <= 1) { return false; } while (firstBody) { if (firstBody.lastChild instanceof ParagraphWidget && firstBody.lastChild.isEndsWithColumnBreak) { return true; } if (isNullOrUndefined(firstBody.nextRenderedWidget) || firstBody.index !== firstBody.nextRenderedWidget.index) { break; } firstBody = firstBody.nextRenderedWidget; } return false; }; Layout.prototype.layoutMultiColumnBody = function (nonEqualBody, updatePosition) { var skipPosition = false; while (nonEqualBody) { if (!skipPosition) { this.viewer.updateClientArea(nonEqualBody, nonEqualBody.page); this.viewer.clientActiveArea.height -= nonEqualBody.y - this.viewer.clientActiveArea.y; if (nonEqualBody instanceof FootNoteWidget) { this.viewer.clientArea.height = Number.POSITIVE_INFINITY; this.viewer.clientActiveArea.height = Number.POSITIVE_INFINITY; } else { this.viewer.clientActiveArea.y = nonEqualBody.y; } } skipPosition = updatePosition ? false : true; for (var i = 0; i < nonEqualBody.childWidgets.length; i++) { var block = nonEqualBody.childWidgets[i]; if (block instanceof TableWidget) { this.clearTableWidget(block, true, true, true); } this.viewer.updateClientAreaForBlock(block, true); var isUpdatedList = false; if (block instanceof ParagraphWidget && !isNullOrUndefined(block.paragraphFormat) && block.paragraphFormat.listFormat.listId !== -1) { isUpdatedList = block.paragraphFormat.listFormat.listLevelNumber === 0 ? true : false; } this.layoutBlock(block, 0, isUpdatedList); this.viewer.updateClientAreaForBlock(block, false); } if (nonEqualBody.columnIndex === nonEqualBody.sectionFormat.numberOfColumns - 1 || (!isNullOrUndefined(nonEqualBody.nextRenderedWidget) && nonEqualBody.sectionIndex !== nonEqualBody.nextRenderedWidget.sectionIndex)) { break; } nonEqualBody = nonEqualBody.nextRenderedWidget; } }; Layout.prototype.getNextWidgetHeight = function (body) { var height = 0; var updatedHeight = 0; while (body && body.childWidgets.length > 0) { height = body.lastChild.height; if (body.lastChild instanceof TableWidget) { height = this.getHeight(body.lastChild); } height += body.lastChild.y; if (height > updatedHeight) { updatedHeight = height; } if (!isNullOrUndefined(body) && body.columnIndex === body.sectionFormat.numberOfColumns - 1 || body.sectionFormat.numberOfColumns === 0 || (!isNullOrUndefined(body.nextRenderedWidget) && body.sectionIndex !== body.nextRenderedWidget.sectionIndex)) { break; } body = body.nextRenderedWidget; } return updatedHeight; }; Layout.prototype.getHeight = function (block) { var height = 0; for (var i = 0; i < block.childWidgets.length; i++) { height += block.childWidgets[i].height; } return height; }; Layout.prototype.getBookmarkMargin = function (lineWidget) { var height = 0; for (var i = 0; i < lineWidget.children.length; i++) { var element = lineWidget.children[i]; if (!isNullOrUndefined(element.margin) && element instanceof BookmarkElementBox) { height = element.margin.top + element.margin.bottom; break; } } return height; }; Layout.prototype.getCountOrLine = function (section, lineToBeSplit, isSplit, getHeight) { var totalNoOflines = 0; var line; var count = 0; var skip = false; var maxHeight = 0; var lineIndexInCell = 0; var splitCountLine; var lineMargin = 0; while (section) { for (var i = 0; i < section.childWidgets.length; i++) { var block = section.childWidgets[i]; if (block instanceof ParagraphWidget) { for (var j = 0; j < block.childWidgets.length; j++) { var lineWidget = block.childWidgets[j]; lineMargin = 0; if (!isNullOrUndefined(lineWidget.margin)) { lineMargin = lineWidget.margin.top + lineWidget.margin.bottom + this.getBookmarkMargin(lineWidget); } if (!isSplit) { totalNoOflines++; maxHeight += lineWidget.height - lineMargin; } else { maxHeight += lineWidget.height - lineMargin; if (Math.round(lineToBeSplit) < Math.round(maxHeight)) { line = block.childWidgets[j]; skip = true; count = 0; break; } else { count++; } } } } else if (block instanceof TableWidget) { splitCountLine = this.getCountOrLineTable(block, lineToBeSplit, isSplit, maxHeight, false, getHeight); if (getHeight) { maxHeight += splitCountLine.lineCount; } else if (!isSplit) { totalNoOflines += splitCountLine.lineCount; } else if (isNullOrUndefined(splitCountLine.lineWidget)) { // count = splitCountLine.lineCount; maxHeight = splitCountLine.lineCount; } else { line = splitCountLine.lineWidget; lineIndexInCell = splitCountLine.lineCount; skip = true; } } if (skip && isSplit) { break; } } if (skip && isSplit) { break; } if (!isNullOrUndefined(section.nextRenderedWidget) && section.index !== section.nextRenderedWidget.index) { break; } section = section.nextRenderedWidget; } if (getHeight) { return { lineWidget: undefined, lineCount: maxHeight }; } else if (!isSplit) { return { lineWidget: undefined, lineCount: totalNoOflines }; } else { return { lineWidget: line, lineCount: lineIndexInCell }; } }; Layout.prototype.getCountOrLineTable = function (block, lineToBeSplit, isSplit, maxSplitHeight, isNested, getHeight) { var lineIndexInCell = 0; var skip = false; var line; var totalNoOflines = 0; var totalHeight = 0; var minCount = 0; var maxCount = 0; var minHeight = 0; var maxHeight = 0; var splitCountLine; for (var i = 0; i < block.childWidgets.length; i++) { var row = block.childWidgets[i]; var minCountCell = void 0; var maxCountCell = void 0; minCount = 0; maxCount = 0; minHeight = 0; maxHeight = 0; for (var j = 0; j < row.childWidgets.length; j++) { var cell = row.childWidgets[j]; for (var k = 0; k < cell.childWidgets.length; k++) { var blocks = cell.childWidgets[k]; if (blocks instanceof ParagraphWidget && blocks.childWidgets.length > 0) { for (var l = 0; l < blocks.childWidgets.length; l++) { minCount++; minCountCell = cell; minHeight += blocks.childWidgets[l].height; } } else { splitCountLine = this.getCountOrLineTable(blocks, lineToBeSplit, isSplit, maxSplitHeight, true, getHeight); minCount += splitCountLine.lineCount; minHeight += splitCountLine.lineCount; } } if (maxCount < minCount) { maxCount = minCount; // maxCountCell = minCountCell; } if (maxHeight < minHeight) { maxHeight = minHeight; maxCountCell = minCountCell; } minCount = 0; minHeight = 0; } if (!isSplit || isNested) { totalNoOflines = totalNoOflines + maxCount; totalHeight += maxHeight; } else { var countInCell = 0; for (var i_2 = 0; i_2 < maxCountCell.childWidgets.length; i_2++) { var blocks = maxCountCell.childWidgets[i_2]; if (blocks instanceof ParagraphWidget) { for (var j = 0; j < blocks.childWidgets.length; j++) { maxSplitHeight += blocks.childWidgets[j].height; if (Math.round(lineToBeSplit) < Math.round(maxSplitHeight)) { line = blocks.childWidgets[j]; skip = true; maxSplitHeight = 0; lineIndexInCell = countInCell; break; } else { countInCell++; } if (skip && isSplit) { break; } } } else { splitCountLine = this.getCountOrLineTable(blocks, lineToBeSplit, isSplit, maxSplitHeight, false, getHeight); if (isNullOrUndefined(splitCountLine.lineWidget)) { countInCell += splitCountLine.lineCount; // count = splitCountLine.lineCount; maxSplitHeight += blocks.height; } else { skip = true; maxSplitHeight = 0; line = splitCountLine.lineWidget; countInCell += splitCountLine.lineCount; lineIndexInCell = countInCell; break; } } if (skip && isSplit) { break; } } } maxCount = 0; if (skip && isSplit) { break; } } if (getHeight) { return { lineWidget: undefined, lineCount: totalHeight }; } else if (!isSplit) { return { lineWidget: undefined, lineCount: totalNoOflines }; } else if (isSplit && isNullOrUndefined(line) && isNested) { return { lineWidget: undefined, lineCount: totalNoOflines }; } else if (isSplit && isNullOrUndefined(line) && !isNested) { return { lineWidget: undefined, lineCount: maxSplitHeight }; } else { return { lineWidget: line, lineCount: lineIndexInCell }; } }; /** * @priva