UNPKG

devexpress-richedit

Version:

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

93 lines (92 loc) 6.37 kB
import { StringUtils } from "@devexpress/utils/lib/utils/string"; import { UnitConverter } from "@devexpress/utils/lib/class/unit-converter"; import { Size } from "@devexpress/utils/lib/geometry/size"; import { Margins } from "@devexpress/utils/lib/geometry/margins"; import { ColorUtils } from "@devexpress/utils/lib/utils/color"; import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed'; import { AnchorTextBoxSize } from "../model/floating-objects/sizes"; import { AnchorObjectHorizontalPositionType, AnchorObjectTextWrapType, AnchorObjectVerticalPositionType, RelativeHeightType, RelativeWidthType } from "../model/floating-objects/enums"; import { TextBoxProperties } from "../model/floating-objects/text-box-properties"; import { AnchorInfo } from "../model/floating-objects/anchor-info"; import { MaskedCharacterPropertiesBundle } from "../rich-utils/properties-bundle"; import { Shape } from "../model/shapes/shape"; import { BaseTextBoxInfo } from "../model/manipulators/text-box-manipulator"; import { NonVisualDrawingObjectInfo } from "../model/manipulators/picture-manipulator/non-visual-drawing-object-info"; import { SubDocumentPosition } from "../model/sub-document"; import { InsertTextManipulatorParams } from "../model/manipulators/text-manipulator/insert-text-manipulator-params"; import { RunType } from "../model/runs/run-type"; import { ColorModelInfo } from "../model/color/color-model-info"; import { FontInfo } from "../model/fonts/font-info"; import { CharacterPropertyDescriptor } from "../model/character/character-property-descriptor"; import { InputPositionBase } from "../selection/input-position-base"; import { SelectionIntervalsInfo } from "../selection/selection-intervals-info"; export class InformationCreator { static textBoxHeightInTwips = 950; static insertPosition = 0; static saveWithInformation(control, saveDocument) { if (!InformationCreator.canSaveWithInformation(control)) return saveDocument(); control.beginUpdate(); const modelManipulator = control.modelManager.modelManipulator; const mainSubDocument = modelManipulator.model.mainSubDocument; const targetSubDocPos = new SubDocumentPosition(mainSubDocument, InformationCreator.insertPosition); const textBoxInfo = InformationCreator.createTextBoxInfo(control); const textBoxRun = modelManipulator.textBox.insertAnchoredTextBox(targetSubDocPos, control.inputPosition.charPropsBundle, textBoxInfo); const textBoxSubDoc = modelManipulator.model.subDocumentsCollection.collection[textBoxRun.subDocId]; InformationCreator.insertText(control, textBoxSubDoc); try { saveDocument(); } finally { const removeInterval = new FixedInterval(InformationCreator.insertPosition, textBoxRun.getLength()); modelManipulator.range.removeIntervalWithoutHistory(mainSubDocument, removeInterval, false); delete modelManipulator.model.subDocumentsCollection.collection[textBoxRun.subDocId]; control.endUpdate(); } } static canSaveWithInformation(control) { const data = control.owner.licenseInfo; return !!data && !StringUtils.isNullOrEmpty(data.message); } static createTextBoxInfo(control) { const modelManipulator = control.modelManager.modelManipulator; const mainSubDocument = modelManipulator.model.mainSubDocument; const section = mainSubDocument.documentModel.sections.at(0); const absoluteSize = new Size(section.sectionProperties.pageWidth, InformationCreator.textBoxHeightInTwips); const relativeSize = new Size(AnchorTextBoxSize.RELATIVE_COEFF * 1, AnchorTextBoxSize.RELATIVE_COEFF * 0.2); const size = new AnchorTextBoxSize(false, 0, absoluteSize, relativeSize, RelativeWidthType.Page, RelativeHeightType.Margin, false, true); const topBottomMargin = UnitConverter.inchesToTwips(0.05); const leftRightMargin = UnitConverter.inchesToTwips(0.1); const contentMargins = new Margins(leftRightMargin, leftRightMargin, topBottomMargin, topBottomMargin); const textBoxProperties = new TextBoxProperties(contentMargins); const anchorInfo = new AnchorInfo(); anchorInfo.zOrder = modelManipulator.floatingObject.zOrder.getNewZOrder(mainSubDocument); anchorInfo.allowOverlap = false; anchorInfo.horizontalPositionType = AnchorObjectHorizontalPositionType.Page; anchorInfo.verticalPositionType = AnchorObjectVerticalPositionType.Page; anchorInfo.wrapType = AnchorObjectTextWrapType.None; return new BaseTextBoxInfo(null, size, new Shape(), anchorInfo, textBoxProperties, new NonVisualDrawingObjectInfo()); } static insertText(control, textBoxSubDoc) { const modelManipulator = control.modelManager.modelManipulator; const data = control.owner.licenseInfo; if (data == null) return; const characterStyle = modelManipulator.model.getDefaultCharacterStyle().clone(); const maskedCharacterProperties = characterStyle.maskedCharacterProperties.clone(); if (data.fontName) { const fontInfo = new FontInfo(data.fontName); fontInfo.measurer = modelManipulator.model.cache.fontInfoCache.fontMeasurer; maskedCharacterProperties.setValue(CharacterPropertyDescriptor.fontInfo, fontInfo); } if (data.fontSize) maskedCharacterProperties.setValue(CharacterPropertyDescriptor.size, data.fontSize); if (data.color) maskedCharacterProperties.setValue(CharacterPropertyDescriptor.textColor, ColorModelInfo.makeByColor(ColorUtils.fromString(data.color))); const charPropsBundle = new MaskedCharacterPropertiesBundle(maskedCharacterProperties, characterStyle); const textBoxSubDocPos = new SubDocumentPosition(textBoxSubDoc, 0); const insertParams = new InsertTextManipulatorParams(textBoxSubDocPos, charPropsBundle, RunType.TextRun, data.message); const inputPosition = new InputPositionBase().setIntervals(SelectionIntervalsInfo.fromPosition(textBoxSubDoc, 0)); modelManipulator.text.insertTextWithParagraphs(insertParams, inputPosition, false); } }