devexpress-richedit
Version:
DevExpress Rich Text Editor is an advanced word-processing tool designed for working with rich text documents.
99 lines (98 loc) • 7.74 kB
JavaScript
import { LayoutPositionCreatorConflictFlags, LayoutPositionMainSubDocumentCreator, LayoutPositionOtherSubDocumentCreator } from '../../layout-engine/layout-position-creator';
import { DocumentLayoutDetailsLevel } from '../../layout/document-layout-details-level';
import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
import { SelectionCommandBase } from './selection-command-base';
export class SelectLineCommand extends SelectionCommandBase {
executeCore(_state, options) {
var selection = this.selection;
var subDocument = this.selection.activeSubDocument;
var clickLayoutPosition = (subDocument.isMain()
? new LayoutPositionMainSubDocumentCreator(this.control.layout, subDocument, options.param, DocumentLayoutDetailsLevel.Character)
: new LayoutPositionOtherSubDocumentCreator(this.control.layout, subDocument, options.param, selection.pageIndex, DocumentLayoutDetailsLevel.Character))
.create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(true));
if (!clickLayoutPosition)
return false;
var clickRowEndBox = clickLayoutPosition.row.boxes[clickLayoutPosition.row.boxes.length - 1];
var clickRowStartPosition = clickLayoutPosition.getRelatedSubDocumentPagePosition() + clickLayoutPosition.pageArea.pageOffset + clickLayoutPosition.column.pageAreaOffset + clickLayoutPosition.row.columnOffset;
var clickRowEndPosition = clickRowStartPosition + clickRowEndBox.rowOffset + clickRowEndBox.getLength();
this.setSelection(clickRowStartPosition, clickRowEndPosition);
return true;
}
setSelection(startPosition, endPosition) {
this.selection.deprecatedSetSelection(startPosition, endPosition, false, -1, true);
}
}
export class AddSelectedLineCommandNoUpdateControlState extends SelectLineCommand {
setSelection(startPosition, endPosition) {
this.selection.changeState((newState) => newState.addInterval(FixedInterval.fromPositions(startPosition, endPosition))
.resetKeepX().setEndOfLine(false));
}
}
export class ExtendSelectLineCommand extends SelectionCommandBase {
executeCore(_state, options) {
const clickPosition = options.param;
var selection = this.selection;
var currentInterval = selection.lastSelectedInterval;
var intervalEnd = currentInterval.end;
if (intervalEnd == this.selection.activeSubDocument.getDocumentEndPosition())
intervalEnd--;
var subDocument = this.selection.activeSubDocument;
var startSelectionRowStartLayoutPosition = (subDocument.isMain()
? new LayoutPositionMainSubDocumentCreator(this.control.layout, subDocument, currentInterval.start, DocumentLayoutDetailsLevel.Character)
: new LayoutPositionOtherSubDocumentCreator(this.control.layout, subDocument, currentInterval.start, selection.pageIndex, DocumentLayoutDetailsLevel.Character))
.create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(false));
if (!startSelectionRowStartLayoutPosition)
return false;
var startSelectionEndBox = startSelectionRowStartLayoutPosition.row.boxes[startSelectionRowStartLayoutPosition.row.boxes.length - 1];
var endSelectionRowStartLayoutPosition = (subDocument.isMain()
? new LayoutPositionMainSubDocumentCreator(this.control.layout, subDocument, intervalEnd, DocumentLayoutDetailsLevel.Character)
: new LayoutPositionOtherSubDocumentCreator(this.control.layout, subDocument, intervalEnd, selection.pageIndex, DocumentLayoutDetailsLevel.Character))
.create(new LayoutPositionCreatorConflictFlags().setDefault(true), new LayoutPositionCreatorConflictFlags().setDefault(false));
if (!endSelectionRowStartLayoutPosition)
return false;
var endSelectionEndBox = endSelectionRowStartLayoutPosition.row.boxes[endSelectionRowStartLayoutPosition.row.boxes.length - 1];
var clickRowStartLayoutPosition = (subDocument.isMain()
? new LayoutPositionMainSubDocumentCreator(this.control.layout, subDocument, clickPosition, DocumentLayoutDetailsLevel.Character)
: new LayoutPositionOtherSubDocumentCreator(this.control.layout, subDocument, clickPosition, selection.pageIndex, DocumentLayoutDetailsLevel.Character))
.create(new LayoutPositionCreatorConflictFlags().setDefault(false), new LayoutPositionCreatorConflictFlags().setDefault(false));
if (!clickRowStartLayoutPosition)
return false;
var clickEndBox = clickRowStartLayoutPosition.row.boxes[clickRowStartLayoutPosition.row.boxes.length - 1];
var startSelectionRowStartPosition = startSelectionRowStartLayoutPosition.getRelatedSubDocumentPagePosition() + startSelectionRowStartLayoutPosition.pageArea.pageOffset +
startSelectionRowStartLayoutPosition.column.pageAreaOffset + startSelectionRowStartLayoutPosition.row.columnOffset;
var startSelectionRowEndPosition = startSelectionRowStartPosition + startSelectionEndBox.rowOffset + startSelectionEndBox.getLength();
var endSelectionRowStartPosition = endSelectionRowStartLayoutPosition.getRelatedSubDocumentPagePosition() + endSelectionRowStartLayoutPosition.pageArea.pageOffset +
endSelectionRowStartLayoutPosition.column.pageAreaOffset + endSelectionRowStartLayoutPosition.row.columnOffset;
var endSelectionRowEndPosition = endSelectionRowStartPosition + endSelectionEndBox.rowOffset + endSelectionEndBox.getLength();
var clickStartRowPosition = clickRowStartLayoutPosition.getRelatedSubDocumentPagePosition() + clickRowStartLayoutPosition.pageArea.pageOffset +
clickRowStartLayoutPosition.column.pageAreaOffset + clickRowStartLayoutPosition.row.columnOffset;
var clickEndRowPosition = clickStartRowPosition + clickEndBox.rowOffset + clickEndBox.getLength();
if (currentInterval.start == startSelectionRowStartPosition && currentInterval.end == endSelectionRowEndPosition) {
if (selection.forwardDirection) {
if (clickStartRowPosition < startSelectionRowStartPosition)
selection.deprecatedSetSelection(startSelectionRowEndPosition, clickStartRowPosition, false, -1, true);
else
selection.deprecatedSetSelection(startSelectionRowStartPosition, clickEndRowPosition, false, -1, true);
}
else {
if (clickStartRowPosition >= endSelectionRowStartPosition)
selection.deprecatedSetSelection(endSelectionRowStartPosition, clickEndRowPosition, false, -1, true);
else
selection.deprecatedSetSelection(endSelectionRowEndPosition, clickStartRowPosition, false, -1, true);
}
}
else {
if (selection.forwardDirection) {
var selectionEnd = clickStartRowPosition <= currentInterval.start ? Math.min(clickStartRowPosition, startSelectionRowStartPosition) : clickStartRowPosition;
selection.deprecatedSetSelection(currentInterval.start, selectionEnd, false, -1, true);
}
else
selection.deprecatedSetSelection(intervalEnd, clickStartRowPosition, false, -1, true);
}
return true;
}
}
export class SelectLineCommandNoUpdateControlState extends SelectLineCommand {
}
export class ExtendSelectLineCommandNoUpdateControlState extends ExtendSelectLineCommand {
}