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
JavaScript
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);
}
}