/// <summary> /// <see cref="ITextView.BringPositionIntoViewAsync"/> /// </summary> internal override void BringPositionIntoViewAsync(ITextPointer position, object userState) { DocumentPageTextView pageTextView; int pageNumber; BringPositionIntoViewRequest pendingRequest; // Verify that layout information is valid. Cannot continue if not valid. if (!IsValid) { throw new InvalidOperationException(SR.Get(SRID.TextViewInvalidLayout)); } if (_pendingRequest != null) { // Ignore new request if the previous is not completed yet. OnBringPositionIntoViewCompleted(new BringPositionIntoViewCompletedEventArgs( position, false, null, false, userState)); } pendingRequest = new BringPositionIntoViewRequest(position, userState); _pendingRequest = pendingRequest; pageTextView = GetTextViewFromPosition(position); // If the position is currently in the view, do nothing. // Otherwise, let the viewer handle the request. if (pageTextView != null) { pendingRequest.Succeeded = true; OnBringPositionIntoViewCompleted(pendingRequest); } else { if (position is ContentPosition) { DynamicDocumentPaginator documentPaginator = _viewer.Document.DocumentPaginator as DynamicDocumentPaginator; if (documentPaginator != null) { pageNumber = documentPaginator.GetPageNumber((ContentPosition)position) + 1; if (_viewer.CanGoToPage(pageNumber)) { _viewer.GoToPage(pageNumber); } else { OnBringPositionIntoViewCompleted(pendingRequest); } } else { OnBringPositionIntoViewCompleted(pendingRequest); } } else { OnBringPositionIntoViewCompleted(pendingRequest); } } }
/// <summary> /// Fires BringPositionIntoViewCompleted event. /// </summary> private void OnBringPositionIntoViewCompleted(BringPositionIntoViewRequest request) { _pendingRequest = null; OnBringPositionIntoViewCompleted(new BringPositionIntoViewCompletedEventArgs( request.Position, request.Succeeded, null, false, request.UserState)); }