UNPKG

devexpress-richedit

Version:

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

65 lines (64 loc) 3.46 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 GoToNextPageCommandBase 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.Character) .create(new LayoutPositionCreatorConflictFlags().setDefault(selection.endOfLine), new LayoutPositionCreatorConflictFlags().setDefault(false)); 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.bottom) { 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(); const position = htr.getPosition(); if (position !== initPosition) return position; } const siblingPageIndex = layoutPosition.pageIndex + 1; page = this.control.layoutFormatterManager.forceFormatPage(siblingPageIndex); } while (page); return this.selection.activeSubDocument.getDocumentEndPosition() - 1; } isEnabled() { return super.isEnabled() && this.selection.activeSubDocument.isMain(); } } export class GoToNextPageCommand extends GoToNextPageCommandBase { executeCore(_state, _parameter) { 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 ExtendGoToNextPageCommand extends GoToNextPageCommandBase { executeCore(_state, _parameter) { const position = this.getPosition(); if (position < 0) return false; this.selection.changeState((newState) => newState.extendLastInterval(position)); return true; } extendSelection() { return true; } }