UNPKG

devexpress-richedit

Version:

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

66 lines (65 loc) 3.58 kB
import { LayoutPositionCreatorConflictFlags, LayoutPositionMainSubDocumentCreator, LayoutPositionOtherSubDocumentCreator } from './layout-engine/layout-position-creator'; import { DocumentLayoutDetailsLevel } from './layout/document-layout-details-level'; import { LayoutPoint } from './layout/layout-point'; import { Point } from '@devexpress/utils/lib/geometry/point'; import { DomUtils } from '@devexpress/utils/lib/utils/dom'; export class PopupMenuManager { constructor(controlOwner, viewManager, measurer, selection) { this.rejectNextShowContextMenuId = null; this.controlOwner = controlOwner; this.viewManager = viewManager; this.measurer = measurer; this.selection = selection; } setSelection(selection) { this.selection = selection; } rejectNextShowContextMenu() { this.rejectNextShowContextMenuId = setTimeout(() => { this.rejectNextShowContextMenuId = null; }, 300); } showByKey() { this.controlOwner.showPopupMenu((_contextMenuBar) => { const point = this.getContextMenuAbsPoint(this.selection.lastSelectedInterval.start); return point ? point : this.undefinedPoint(); }); } showByMouseClick(point) { this.controlOwner.showPopupMenu((contextMenuBar) => { if (contextMenuBar.isSpellingMenu) { const layoutPoint = this.getContextMenuAbsPoint(this.selection.lastSelectedInterval.start); if (layoutPoint) return layoutPoint; } return point; }); } showByTouchClick() { if (this.rejectNextShowContextMenuId !== null) return; this.controlOwner.showPopupMenu((_contextMenuBar) => { const point = this.getContextMenuAbsPoint(this.selection.lastSelectedInterval.start); return point ? point : this.undefinedPoint(); }); } undefinedPoint() { return new Point(DomUtils.getAbsolutePositionX(this.viewManager.canvas), DomUtils.getAbsolutePositionY(this.viewManager.canvas)); } getContextMenuAbsPoint(lastSelectedIntervalStartPosition) { const subDocument = this.selection.activeSubDocument; const layoutPosition = subDocument.isMain() ? new LayoutPositionMainSubDocumentCreator(this.selection.layout, subDocument, lastSelectedIntervalStartPosition, DocumentLayoutDetailsLevel.Character) .create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(true)) : new LayoutPositionOtherSubDocumentCreator(this.selection.layout, subDocument, lastSelectedIntervalStartPosition, this.selection.pageIndex, DocumentLayoutDetailsLevel.Box) .create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(true)); if (!layoutPosition) return null; const layoutPoint = new LayoutPoint(layoutPosition.pageIndex, layoutPosition.getLayoutX(this.measurer), layoutPosition.getLayoutY(DocumentLayoutDetailsLevel.Row) + layoutPosition.row.height); if (this.viewManager.canvasManager.isVisiblePosition(layoutPoint)) { const pageElement = this.viewManager.cache[layoutPoint.pageIndex].page; return layoutPoint.offset(DomUtils.getAbsolutePositionX(pageElement), DomUtils.getAbsolutePositionY(pageElement)); } return null; } }