UNPKG

devexpress-richedit

Version:

DevExpress Rich Text Editor is an advanced word-processing tool designed for working with rich text documents.

229 lines (228 loc) 11.5 kB
import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed'; import { SearchUtils } from '@devexpress/utils/lib/utils/search'; import { MaskedParagraphPropertiesBundleFull, ParagraphListInfo } from '../../rich-utils/properties-bundle'; import { MaskedCharacterProperties } from '../character/character-properties'; import { CharacterPropertiesMask } from '../character/enums'; import { NumberConverterCreator } from '../number-converters/number-converter-creator'; import { AbstractNumberingList, NumberingList } from '../numbering-lists/numbering-list'; import { CharacterPropertiesMerger } from '../properties-merger/character-properties-merger'; import { ParagraphPropertiesMerger } from '../properties-merger/paragraph-properties-merger'; import { Table } from '../tables/main-structures/table'; import { TabProperties } from './paragraph-style'; import { isDefined } from '@devexpress/utils/lib/utils/common'; export class TabsInfo { } export var TabAlign; (function (TabAlign) { TabAlign[TabAlign["Left"] = 0] = "Left"; TabAlign[TabAlign["Center"] = 1] = "Center"; TabAlign[TabAlign["Right"] = 2] = "Right"; TabAlign[TabAlign["Decimal"] = 3] = "Decimal"; TabAlign[TabAlign["Numbering"] = 4] = "Numbering"; })(TabAlign || (TabAlign = {})); export class Paragraph { get isEmpty() { return this.length <= 1; } constructor(subDocument, startLogPosition, length, paragraphStyle, maskedParagraphProperties, indexInMaskedParagraphProperitesCache = undefined) { this.numberingListIndex = NumberingList.NumberingListNotSettedIndex; this.listLevelIndex = -1; this.subDocument = subDocument; this.startLogPosition = startLogPosition; this.length = length; this.paragraphStyle = paragraphStyle; if (indexInMaskedParagraphProperitesCache === undefined) { if (maskedParagraphProperties) this.setParagraphProperties(maskedParagraphProperties); else this.maskedParagraphProperties = null; } else this.maskedParagraphProperties = this.subDocument.documentModel.cache.maskedParagraphPropertiesCache.getItemByJsonKey(indexInMaskedParagraphProperitesCache); this.mergedParagraphFormatting = null; this.tabs = new TabProperties(); } getParagraphBundleFull(model) { return new MaskedParagraphPropertiesBundleFull(model.cache.maskedParagraphPropertiesCache.getItem(this.maskedParagraphProperties), model.stylesManager.addParagraphStyle(this.paragraphStyle), new ParagraphListInfo(this.numberingListIndex, this.listLevelIndex), this.tabs.clone()); } getTableCell() { const parPos = this.startLogPosition.value; const tables = this.subDocument.tables; const table = Table.getTableByPosition(tables, parPos, true); if (!table) return null; const rowIndex = SearchUtils.normedInterpolationIndexOf(table.rows, (r) => r.getStartPosition(), parPos); const row = table.rows[rowIndex]; const cellIndex = SearchUtils.normedInterpolationIndexOf(row.cells, (c) => c.startParagraphPosition.value, parPos); const cell = row.cells[cellIndex]; return cell; } isInList() { return this.getNumberingListIndex() >= 0; } isInOwnList() { return this.numberingListIndex >= 0; } isInStyleList() { return this.paragraphStyle && this.paragraphStyle.numberingListIndex >= 0; } getListLevelIndex() { if (this.listLevelIndex >= 0) return this.listLevelIndex; return this.paragraphStyle ? this.paragraphStyle.getListLevelIndex() : -1; } getListLevel() { return this.getNumberingList().levels[this.getListLevelIndex()]; } getNumberingListIndex() { if (this.numberingListIndex >= 0 || this.numberingListIndex === NumberingList.NoNumberingListIndex) return this.numberingListIndex; return this.paragraphStyle ? this.paragraphStyle.getNumberingListIndex() : -1; } getNumberingList() { return this.subDocument.documentModel.numberingLists[this.getNumberingListIndex()]; } getAbstractNumberingList() { var numberingList = this.getNumberingList(); return numberingList ? numberingList.getAbstractNumberingList() : null; } getAbstractNumberingListIndex() { var numberingList = this.getNumberingList(); return numberingList ? numberingList.abstractNumberingListIndex : -1; } getNumberingListText() { var counters = this.subDocument.documentModel.getRangeListCounters(this); return this.getNumberingListTextCore(counters); } getNumberingListTextCore(counters) { var levels = this.getNumberingList().levels; var formatString = levels[this.getListLevelIndex()].getListLevelProperties().displayFormatString; return this.formatNumberingListText(formatString, counters, levels); } getNumberingListSeparatorChar() { return this.getListLevel().getListLevelProperties().separator; } getNumerationCharacterProperties() { var merger = new CharacterPropertiesMerger(); merger.mergeCharacterProperties(this.getNumberingList().levels[this.getListLevelIndex()].getCharacterProperties()); const paragraphRunProperties = this.subDocument.getRunByPosition(this.getEndPosition() - 1).getCharacterMergedProperties(); const maskedParagraphRunProperties = new MaskedCharacterProperties(); maskedParagraphRunProperties.copyFrom(paragraphRunProperties); maskedParagraphRunProperties.setUseValueFull(CharacterPropertiesMask.UseAll ^ CharacterPropertiesMask.UseFontUnderlineType); merger.mergeCharacterProperties(maskedParagraphRunProperties); return this.subDocument.documentModel.cache.mergedCharacterPropertiesCache.getItem(merger.getMergedProperties()); } getNumerationLanguageId() { const characterProperties = this.getNumerationCharacterProperties(); if (!isDefined(characterProperties.langInfo)) return "en"; const langId = characterProperties.langInfo.latin; if (!isDefined(langId)) return "en"; return langId; } formatNumberingListText(formatString, args, levels) { var objArgs = new Array(args.length); const langId = this.getNumerationLanguageId(); for (var i = 0; i < args.length; i++) { var converter = NumberConverterCreator.createConverter(levels[i].getListLevelProperties().format, this.subDocument.documentModel.simpleFormattersManager, langId); objArgs[i] = converter.convertNumber(args[i]); } try { return this.subDocument.documentModel.simpleFormattersManager.formatString(formatString, ...objArgs); } catch (e) { try { return objArgs[0]; } catch (e) { return ""; } } } get interval() { return new FixedInterval(this.startLogPosition.value, this.length); } getEndPosition() { return this.startLogPosition.value + this.length; } setParagraphProperties(properties) { this.maskedParagraphProperties = this.subDocument.documentModel.cache.maskedParagraphPropertiesCache.getItem(properties); } onParagraphPropertiesChanged() { this.resetParagraphMergedProperties(); } resetParagraphMergedProperties() { this.mergedParagraphFormatting = null; } getParagraphMergedProperties() { if (!this.mergedParagraphFormatting) { var merger = new ParagraphPropertiesMerger(); merger.mergeMaskedParagraphProperties(this.maskedParagraphProperties); if (this.isInOwnList()) merger.mergeMaskedParagraphProperties(this.getListLevel().getParagraphProperties()); if (this.numberingListIndex == AbstractNumberingList.NoNumberingListIndex) merger.mergeParagraphStyle(this.paragraphStyle); else merger.mergeParagraphStyleConsiderNumbering(this.paragraphStyle, this.subDocument.documentModel); const tableCell = this.getTableCell(); if (tableCell) merger.mergeTableStyle(tableCell); merger.mergeMaskedParagraphProperties(this.subDocument.documentModel.defaultParagraphProperties); this.mergedParagraphFormatting = this.subDocument.documentModel.cache.mergedParagraphPropertiesCache.getItem(merger.getMergedProperties()); } return this.mergedParagraphFormatting; } setParagraphMergedProperies(properties) { this.mergedParagraphFormatting = this.subDocument.documentModel.cache.mergedParagraphPropertiesCache.getItem(properties); } hasParagraphMergedProperies() { return !!this.mergedParagraphFormatting; } getTabs() { var result = new TabsInfo(); result.defaultTabStop = this.subDocument.documentModel.defaultTabWidth; result.positions = []; if (this.paragraphStyle) { var styleTabs = this.paragraphStyle.getResultTabs().tabsInfo; for (var i = 0; i < styleTabs.length; i++) if (!styleTabs[i].deleted) { var tabPosition = styleTabs[i].clone(); var index = SearchUtils.binaryIndexOf(result.positions, (t) => t.position - styleTabs[i].position); if (index < 0) result.positions.splice(~index, 0, tabPosition); else result.positions[index] = tabPosition; } } var paragraphTabs = this.tabs.tabsInfo; for (var i = 0; i < paragraphTabs.length; i++) { var index = SearchUtils.binaryIndexOf(result.positions, (t) => t.position - paragraphTabs[i].position); if (index < 0) { index = ~index; if (!paragraphTabs[i].deleted) result.positions.splice(index, 0, paragraphTabs[i].clone()); } else { if (paragraphTabs[i].deleted) result.positions.splice(index, 1); else result.positions[index] = paragraphTabs[i].clone(); } } return result; } clone(subDocument) { const result = new Paragraph(subDocument, subDocument.positionManager.registerPosition(this.startLogPosition.value), this.length, subDocument.documentModel.stylesManager.getParagraphStyleByName(this.paragraphStyle.styleName), this.maskedParagraphProperties); result.tabs = this.tabs.clone(); result.numberingListIndex = this.numberingListIndex; result.listLevelIndex = this.listLevelIndex; return result; } copyFrom(from) { this.paragraphStyle = from.paragraphStyle; this.setParagraphProperties(from.maskedParagraphProperties); if (from.hasParagraphMergedProperies()) this.setParagraphMergedProperies(from.getParagraphMergedProperties()); this.numberingListIndex = from.numberingListIndex; this.listLevelIndex = from.listLevelIndex; this.tabs = from.tabs.clone(); } }