UNPKG

devexpress-richedit

Version:

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

63 lines (62 loc) 3.25 kB
import { LayoutPositionCreatorConflictFlags, LayoutPositionMainSubDocumentCreator } from '../../layout-engine/layout-position-creator'; import { DocumentLayoutDetailsLevel } from '../../layout/document-layout-details-level'; import { LayoutPoint } from '../../layout/layout-point'; import { SelectionCommandBase } from './selection-command-base'; export class GoToPrevPageCommandBase extends SelectionCommandBase { getPosition() { const selection = this.selection; const initPosition = selection.forwardDirection ? selection.lastSelectedInterval.end : selection.lastSelectedInterval.start; const layoutPosition = new LayoutPositionMainSubDocumentCreator(this.control.layout, this.selection.activeSubDocument, initPosition, DocumentLayoutDetailsLevel.Box) .create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(true)); if (!layoutPosition) return -1; const charOffset = initPosition - layoutPosition.getLogPosition(DocumentLayoutDetailsLevel.Box); const x = layoutPosition.pageArea.x + layoutPosition.column.x + layoutPosition.row.x + layoutPosition.box.x + layoutPosition.box.getCharOffsetXInPixels(this.control.measurer, charOffset); const y = layoutPosition.pageArea.y + layoutPosition.column.y + layoutPosition.row.y + layoutPosition.box.y; const viewportHeight = Math.max(layoutPosition.row.height, this.control.viewManager.sizes.getVisibleAreaHeight(false)); let newY = y - viewportHeight; let page = layoutPosition.page; const absoluteY = newY + page.y; do { if (absoluteY >= page.y) { newY = absoluteY - page.y; const point = new LayoutPoint(page.index, x, newY); const htr = this.control.hitTestManager.calculate(point, DocumentLayoutDetailsLevel.Character, this.selection.activeSubDocument); if (!this.extendSelection()) htr.correctAsVisibleBox(); return htr.getPosition(); } const siblingPageIndex = layoutPosition.pageIndex - 1; page = this.control.layout.pages[siblingPageIndex]; } while (page); return 0; } isEnabled() { return super.isEnabled() && this.selection.activeSubDocument.isMain(); } } export class GoToPrevPageCommand extends GoToPrevPageCommandBase { executeCore(_state, _options) { const selection = this.selection; const position = this.getPosition(); if (position < 0) return false; selection.deprecatedSetSelection(position, position, selection.endOfLine, selection.keepX, true); return true; } extendSelection() { return false; } } export class ExtendGoToPrevPageCommand extends GoToPrevPageCommandBase { executeCore(_state, _options) { const position = this.getPosition(); if (position < 0) return false; this.selection.changeState((newState) => newState.extendLastInterval(position)); return true; } extendSelection() { return true; } }