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