public void ExtendSelection(Point oldPosition, Point newPosition)
{
if (oldPosition == newPosition) {
return;
}
Point min;
Point max;
bool oldIsGreater = GreaterEqPos(oldPosition, newPosition);
if (oldIsGreater) {
min = newPosition;
max = oldPosition;
} else {
min = oldPosition;
max = newPosition;
}
if (!HasSomethingSelected) {
SetSelection(new DefaultSelection(document, min, max));
return;
}
ISelection selection = this.selectionCollection[0];
bool changed = false;
if (selection.ContainsPosition(newPosition)) {
if (oldIsGreater) {
if (selection.EndPosition != newPosition) {
selection.EndPosition = newPosition;
changed = true;
}
} else {
if (selection.StartPosition != newPosition) {
// we're back to the line we started from and it was a gutter selection
if (selectFrom.where == WhereFrom.Gutter && newPosition.Y >= selectionStart.Y)
{
selection.StartPosition = selectionStart;
selection.EndPosition = NextValidPosition(selection.StartPosition.Y);
} else {
selection.StartPosition = newPosition;
}
changed = true;
}
}
} else {
if (oldPosition == selection.StartPosition) {
if (GreaterEqPos(newPosition, selection.EndPosition)) {
if (selection.StartPosition != selection.EndPosition ||
selection.EndPosition != newPosition) {
selection.StartPosition = selection.EndPosition;
selection.EndPosition = newPosition;
changed = true;
}
} else {
if (selection.StartPosition != newPosition) {
selection.StartPosition = newPosition;
changed = true;
}
}
} else {
if (GreaterEqPos(selection.StartPosition, newPosition)) {
if (selection.EndPosition != selection.StartPosition ||
selection.StartPosition != newPosition) {
changed = true;
}
if (selectFrom.where == WhereFrom.Gutter)
{
if (selectFrom.first == WhereFrom.Gutter)
{
if(newPosition.Y == selectionStart.Y) {
selection.EndPosition = NextValidPosition(selection.StartPosition.Y);
selection.StartPosition = new Point(0, newPosition.Y);
} else {
selection.EndPosition = NextValidPosition(selection.StartPosition.Y);
selection.StartPosition = newPosition;
}
} else {
if(newPosition.Y == selectionStart.Y) {
selection.EndPosition = NextValidPosition(selection.StartPosition.Y);
selection.StartPosition = new Point(selectionStart.X, newPosition.Y);
} else {
selection.EndPosition = new Point(selectionStart.X, selection.StartPosition.Y);
selection.StartPosition = newPosition;
}
}
} else {
selection.EndPosition = selection.StartPosition;
selection.StartPosition = newPosition;
}
changed = true;
} else {
if (selection.EndPosition != newPosition) {
selection.EndPosition = newPosition;
changed = true;
}
}
}
}
// if (GreaterEqPos(selection.StartPosition, min) && GreaterEqPos(selection.EndPosition, max)) {
// if (oldIsGreater) {
// selection.StartPosition = min;
// } else {
// selection.StartPosition = max;
// }
// } else {
// if (oldIsGreater) {
// selection.EndPosition = min;
// } else {
// selection.EndPosition = max;
// }
// }
if (changed) {
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, min.Y, max.Y));
document.CommitUpdate();
OnSelectionChanged(EventArgs.Empty);
}
}