ICSharpCode.TextEditor.Document.SelectionManager.ExtendSelection C# (CSharp) Method

ExtendSelection() public method

public ExtendSelection ( Point oldPosition, Point newPosition ) : void
oldPosition Point
newPosition Point
return void
        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);
            }
        }