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