Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Documents / DocumentSequence.cs / 1305600 / DocumentSequence.cs
//---------------------------------------------------------------------------- //// Copyright (C) 2004 by Microsoft Corporation. All rights reserved. // // // Description: // Implements the FixedDocumentSequence element // // History: // 05/05/2004 - Zhenbin Xu (ZhenbinX) - Created. // // //--------------------------------------------------------------------------- using MS.Internal.Documents; using MS.Utility; // ExceptionStringTable using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Windows.Automation.Peers; // AutomationPeer using System.Windows.Threading; // Dispatcher using System.Windows; // DependencyID etc. using System.Windows.Media; // Visual using System.Windows.Markup; // IAddChild, ContentProperty using System.Windows.Navigation; #pragma warning disable 1634, 1691 // suppressing PreSharp warnings namespace System.Windows.Documents { ////// FixedDocumentSequence is a IDocumentPaginatorSource that composites other IDocumentPaginatorSource /// via DocumentReference /// [ContentProperty("References")] public class FixedDocumentSequence : FrameworkContentElement, IDocumentPaginatorSource, IAddChildInternal, IServiceProvider, IFixedNavigate, IUriContext { //------------------------------------------------------------------- // // Connstructors // //--------------------------------------------------------------------- #region Constructors static FixedDocumentSequence() { FocusableProperty.OverrideMetadata(typeof(FixedDocumentSequence), new FrameworkPropertyMetadata(true)); } ////// Default FixedDocumentSequence constructor /// public FixedDocumentSequence() : base() { _Init(); } #endregion Constructors //-------------------------------------------------------------------- // // Public Methods // //--------------------------------------------------------------------- #region IServiceProvider Members ////// object IServiceProvider.GetService(Type serviceType) { if (serviceType == null) { throw new ArgumentNullException("serviceType"); } if (serviceType == typeof(ITextContainer)) { return this.TextContainer; } if (serviceType == typeof(RubberbandSelector)) { // create this on demand, but not through the property, only through the // service, so it is only created when it's actually used if (_rubberbandSelector == null) { _rubberbandSelector = new RubberbandSelector(); } return _rubberbandSelector; } return null; } #endregion IServiceProvider Members #region IAddChild ////// /// Called to Add the object as a Child. /// /// /// Object to add as a child /// void IAddChild.AddChild(Object value) { if (value == null) { throw new ArgumentNullException("value"); } // Dispatcher.VerifyAccess(); DocumentReference docRef = value as DocumentReference; if (docRef == null) { throw new ArgumentException(SR.Get(SRID.UnexpectedParameterType, value.GetType(), typeof(DocumentReference)), "value"); } if (docRef.IsInitialized) { _references.Add(docRef); } else { DocumentsTrace.FixedDocumentSequence.Content.Trace(string.Format("Doc {0} Deferred", _references.Count)); if (_partialRef == null) { _partialRef = docRef; _partialRef.Initialized += new EventHandler(_OnDocumentReferenceInitialized); } else { throw new InvalidOperationException(SR.Get(SRID.PrevoiusUninitializedDocumentReferenceOutstanding)); } } } ////// Called when text appears under the tag in markup /// /// /// Text to Add to the Object /// void IAddChild.AddText(string text) { XamlSerializerUtil.ThrowIfNonWhiteSpaceInAddText(text, this); } #endregion #region IFixedNavigate void IFixedNavigate.NavigateAsync(string elementID) { if (IsPageCountValid == true) { FixedHyperLink.NavigateToElement(this, elementID); } else { _navigateAfterPagination = true; _navigateFragment = elementID; } } UIElement IFixedNavigate.FindElementByID(string elementID, out FixedPage rootFixedPage) { UIElement uiElementRet = null; rootFixedPage = null; DynamicDocumentPaginator childPaginator; FixedDocument childFixedDoc; if (Char.IsDigit(elementID[0])) { //We convert to a page number here. int pageNumber = Convert.ToInt32(elementID, CultureInfo.InvariantCulture) - 1; int childPageNumber; if (TranslatePageNumber(pageNumber, out childPaginator, out childPageNumber)) { childFixedDoc = childPaginator.Source as FixedDocument; if (childFixedDoc != null) { uiElementRet = childFixedDoc.GetFixedPage(childPageNumber); } } } else { foreach (DocumentReference docRef in References) { childPaginator = GetPaginator(docRef); childFixedDoc = childPaginator.Source as FixedDocument; if (childFixedDoc != null) { uiElementRet = ((IFixedNavigate)childFixedDoc).FindElementByID(elementID, out rootFixedPage); if (uiElementRet != null) { break; } } } } return uiElementRet; } #endregion #region LogicalTree ////// Returns enumerator to logical children /// protected internal override IEnumerator LogicalChildren { get { // Dispatcher.VerifyAccess(); DocumentReference[] docArray = new DocumentReference[_references.Count]; this._references.CopyTo(docArray, 0); return docArray.GetEnumerator(); } } #endregion LogicalTree #region IDocumentPaginatorSource Members ////// An object which paginates content. /// public DocumentPaginator DocumentPaginator { get { return _paginator; } } #endregion IDocumentPaginatorSource Members #region DocumentPaginator ////// internal DocumentPage GetPage(int pageNumber) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPage({0})", pageNumber)); // Make sure that the call is in the right context. // Dispatcher.VerifyAccess(); // Page number cannot be negative. if (pageNumber < 0) { throw new ArgumentOutOfRangeException("pageNumber", SR.Get(SRID.IDPNegativePageNumber)); } DocumentPage innerDP = null; DynamicDocumentPaginator innerPaginator; int innerPageNumber; // Find the appropriate inner IDF and BR if (TranslatePageNumber(pageNumber, out innerPaginator, out innerPageNumber)) { innerDP = innerPaginator.GetPage(innerPageNumber); Debug.Assert(innerDP != null); // Now warp inner DP and return it return new FixedDocumentSequenceDocumentPage(this, innerPaginator, innerDP); } return DocumentPage.Missing; } ////// /// Returns a FixedDocumentSequenceDocumentPage for the specified document and page number. /// internal DocumentPage GetPage(FixedDocument document, int fixedDocPageNumber) { if (fixedDocPageNumber < 0) { throw new ArgumentOutOfRangeException("fixedDocPageNumber", SR.Get(SRID.IDPNegativePageNumber)); } if (document == null) { throw new ArgumentNullException("document"); } DocumentPage innerDP = document.GetPage(fixedDocPageNumber); Debug.Assert(innerDP != null); // Now wrap inner DP and return it return new FixedDocumentSequenceDocumentPage(this, document.DocumentPaginator as DynamicDocumentPaginator, innerDP); } ////// internal void GetPageAsync(int pageNumber, object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsync({0}, {1})", pageNumber, userState)); // Make sure that the call is in the right context. // Dispatcher.VerifyAccess(); // Page number cannot be negative. if (pageNumber < 0) { throw new ArgumentOutOfRangeException("pageNumber", SR.Get(SRID.IDPNegativePageNumber)); } if (userState == null) { throw new ArgumentNullException("userState"); } // Add to outstanding AsyncOp list GetPageAsyncRequest asyncRequest = new GetPageAsyncRequest(new RequestedPage(pageNumber/*childPaginator, childPageNumber*/), userState); _asyncOps[userState] = asyncRequest; DispatcherOperationCallback queueTask = new DispatcherOperationCallback(_GetPageAsyncDelegate); Dispatcher.BeginInvoke(DispatcherPriority.Background, queueTask, asyncRequest); } ////// /// internal int GetPageNumber(ContentPosition contentPosition) { if (contentPosition == null) { throw new ArgumentNullException("contentPosition"); } // ContentPosition may be only created by DynamicDocumentPaginator.GetObjectPosition or // DynamicDocumentPaginator.GetPagePosition. // Because of that we are expecting one of 2 types here. DynamicDocumentPaginator childPaginator = null; ContentPosition childContentPosition = null; if (contentPosition is DocumentSequenceTextPointer) { DocumentSequenceTextPointer dsTextPointer = (DocumentSequenceTextPointer)contentPosition; #pragma warning suppress 6506 // dsTextPointer is obviously not null childPaginator = GetPaginator(dsTextPointer.ChildBlock.DocRef); childContentPosition = dsTextPointer.ChildPointer as ContentPosition; } if (childContentPosition == null) { throw new ArgumentException(SR.Get(SRID.IDPInvalidContentPosition)); } int childPageNumber = childPaginator.GetPageNumber(childContentPosition); int pageNumber; _SynthesizeGlobalPageNumber(childPaginator, childPageNumber, out pageNumber); return pageNumber; } ////// /// internal void CancelAsync(object userState) { DocumentsTrace.FixedFormat.IDF.Trace(string.Format("IDP.GetPageAsyncCancel([{0}])", userState)); if (userState == null) { throw new ArgumentNullException("userState"); } if (_asyncOps.ContainsKey(userState)) { GetPageAsyncRequest asyncRequest = _asyncOps[userState]; if (asyncRequest != null) { asyncRequest.Cancelled = true; if (asyncRequest.Page.ChildPaginator != null) { asyncRequest.Page.ChildPaginator.CancelAsync(asyncRequest); } } } } ////// /// internal ContentPosition GetObjectPosition(Object o) { if (o == null) { throw new ArgumentNullException("o"); } foreach (DocumentReference docRef in References) { DynamicDocumentPaginator childPaginator = GetPaginator(docRef); if (childPaginator != null) { ContentPosition cp = childPaginator.GetObjectPosition(o); if (cp != ContentPosition.Missing && (cp is ITextPointer)) { ChildDocumentBlock childBlock = new ChildDocumentBlock(this.TextContainer, docRef); return new DocumentSequenceTextPointer(childBlock, (ITextPointer)cp); } } } return ContentPosition.Missing; } ////// /// internal ContentPosition GetPagePosition(DocumentPage page) { FixedDocumentSequenceDocumentPage docPage = page as FixedDocumentSequenceDocumentPage; if (docPage == null) { return ContentPosition.Missing; } return docPage.ContentPosition; } ////// /// internal bool IsPageCountValid { get { bool documentSequencePageCountFinal = true; if (IsInitialized) { foreach (DocumentReference docRef in References) { DynamicDocumentPaginator paginator = GetPaginator(docRef); if (paginator == null || !paginator.IsPageCountValid) { documentSequencePageCountFinal = false; break; } } } else { documentSequencePageCountFinal = false; } return documentSequencePageCountFinal; } } ////// /// internal int PageCount { get { // // This can be optimized if the page count for each IDP won't change // && the list of IDP won't change. When each doc.IsPageCountValid is // true, then page count won't change. // int count = 0; foreach (DocumentReference docRef in References) { DynamicDocumentPaginator paginator = GetPaginator(docRef); if (paginator != null) { count += paginator.PageCount; if (!paginator.IsPageCountValid) { break; } } } return count; } } ////// /// internal Size PageSize { get { return _pageSize; } set { _pageSize = value; } } #endregion DocumentPaginator #region IUriContext ////// /// Uri IUriContext.BaseUri { get { return (Uri) GetValue(BaseUriHelper.BaseUriProperty); } set { SetValue(BaseUriHelper.BaseUriProperty, value); } } #endregion //-------------------------------------------------------------- ------ // // Public Properties // //---------------------------------------------------------------------- #region Public Properties ////// /// Get a collection of DocumentReference that this FixedDocumentSequence contains. /// [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)] [CLSCompliant(false)] public DocumentReferenceCollection References { get { // Dispatcher.VerifyAccess(); return _references; } } ////// /// public static readonly DependencyProperty PrintTicketProperty = DependencyProperty.RegisterAttached("PrintTicket", typeof(object), typeof(FixedDocumentSequence), new FrameworkPropertyMetadata((object)null)); ////// Get/Set PrintTicket Property /// public object PrintTicket { get { object printTicket = GetValue(PrintTicketProperty); return printTicket; } set { SetValue(PrintTicketProperty,value); } } #endregion Public Properties //------------------------------------------------------------------- // // Public Events // //---------------------------------------------------------------------- //------------------------------------------------------------------- // // Protected Methods // //--------------------------------------------------------------------- #region Protected Methods ////// Creates AutomationPeer ( protected override AutomationPeer OnCreateAutomationPeer() { return new DocumentAutomationPeer(this); } #endregion Protected Methods //------------------------------------------------------------------- // // Internal Methods // //---------------------------------------------------------------------- #region Internal Method internal DynamicDocumentPaginator GetPaginator(DocumentReference docRef) { // #966803: Source change won't be a support scenario. Debug.Assert(docRef != null); DynamicDocumentPaginator paginator = null; IDocumentPaginatorSource document = docRef.CurrentlyLoadedDoc; if (document != null) { paginator = document.DocumentPaginator as DynamicDocumentPaginator; Debug.Assert(paginator != null); } else { document = docRef.GetDocument(false /*forceReload*/); if (document != null) { paginator = document.DocumentPaginator as DynamicDocumentPaginator; Debug.Assert(paginator != null); // hook up event handlers paginator.PaginationCompleted += new EventHandler(_OnChildPaginationCompleted); paginator.PaginationProgress += new PaginationProgressEventHandler(_OnChildPaginationProgress); paginator.PagesChanged += new PagesChangedEventHandler(_OnChildPagesChanged); } } return paginator; } //--------------------------------------------------------------------- // IDP Helper //---------------------------------------------------------------------- // Take a global page number and translate it into a child paginator with a child page number. // A document will be look at if the previous document has finished pagination. internal bool TranslatePageNumber(int pageNumber, out DynamicDocumentPaginator childPaginator, out int childPageNumber) { childPaginator = null; childPageNumber = 0; foreach (DocumentReference docRef in References) { childPaginator = GetPaginator(docRef); if (childPaginator != null) { childPageNumber = pageNumber; if (childPaginator.PageCount > childPageNumber) { // The page falls inside this paginator. return true; } else { if (!childPaginator.IsPageCountValid) { // Don't bother look further if this doc has not finished // pagination break; } pageNumber -= childPaginator.PageCount; } } } return false; } #endregion Internal Method //-------------------------------------------------------------------- // // Internal Properties // //--------------------------------------------------------------------- #region Internal Properties internal DocumentSequenceTextContainer TextContainer { get { if (_textContainer == null) { _textContainer = new DocumentSequenceTextContainer(this); } return _textContainer; } } #endregion Internal Properties //-------------------------------------------------------------------- // // Private Methods // //--------------------------------------------------------------------- #region Private Methods private void _Init() { _paginator = new FixedDocumentSequencePaginator(this); _references = new DocumentReferenceCollection(); _references.CollectionChanged += new NotifyCollectionChangedEventHandler(_OnCollectionChanged); _asyncOps = new Dictionary) ///
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- WorkflowServiceAttributes.cs
- Timer.cs
- DefaultBinder.cs
- LocalizationCodeDomSerializer.cs
- QueuePathDialog.cs
- EmbeddedObject.cs
- SqlConnectionPoolProviderInfo.cs
- DataContractSerializerFaultFormatter.cs
- AdjustableArrowCap.cs
- DeclarativeCatalogPart.cs
- SyndicationElementExtension.cs
- TypeUnloadedException.cs
- RegexStringValidatorAttribute.cs
- ObjectHandle.cs
- SmiMetaDataProperty.cs
- OracleCommandBuilder.cs
- TypeReference.cs
- LinkedResource.cs
- OperatingSystem.cs
- MachineSettingsSection.cs
- Normalization.cs
- MeasureData.cs
- Cursor.cs
- ContractTypeNameCollection.cs
- FontFamily.cs
- PropertyPathWorker.cs
- WindowsSolidBrush.cs
- XmlEncodedRawTextWriter.cs
- NegatedConstant.cs
- SqlLiftWhereClauses.cs
- OracleRowUpdatedEventArgs.cs
- ISFTagAndGuidCache.cs
- DefaultAutoFieldGenerator.cs
- XmlElementAttributes.cs
- BooleanFunctions.cs
- HttpCookie.cs
- SharedStatics.cs
- ToolStripPanelRow.cs
- EmptyStringExpandableObjectConverter.cs
- RoleServiceManager.cs
- SmtpMail.cs
- AssemblyHash.cs
- CryptoKeySecurity.cs
- X509LogoTypeExtension.cs
- TextElementEnumerator.cs
- ControlParameter.cs
- SmiSettersStream.cs
- ImplicitInputBrush.cs
- WebPartTransformerCollection.cs
- BaseInfoTable.cs
- CompilerParameters.cs
- FrameSecurityDescriptor.cs
- CompressionTransform.cs
- IncomingWebResponseContext.cs
- DoubleIndependentAnimationStorage.cs
- ResXDataNode.cs
- ExportException.cs
- ImmutableDispatchRuntime.cs
- WebPartEditVerb.cs
- ApplicationId.cs
- XamlReaderHelper.cs
- CapabilitiesPattern.cs
- ObjectDataSourceDisposingEventArgs.cs
- IsolatedStorageSecurityState.cs
- WorkflowDesigner.cs
- BitmapDownload.cs
- UrlMappingCollection.cs
- ArraySet.cs
- LinqMaximalSubtreeNominator.cs
- ObjectPropertyMapping.cs
- ModuleBuilder.cs
- CompilerGeneratedAttribute.cs
- ExponentialEase.cs
- ClientTargetSection.cs
- ImageSource.cs
- MarkupCompiler.cs
- ModelPerspective.cs
- ImageListUtils.cs
- Viewport3DAutomationPeer.cs
- ConfigXmlComment.cs
- ComplexObject.cs
- ExclusiveTcpListener.cs
- ToolStripDesignerAvailabilityAttribute.cs
- XmlDocumentSerializer.cs
- SessionStateContainer.cs
- StrokeNodeOperations.cs
- CustomTokenProvider.cs
- SourceLineInfo.cs
- HttpServerUtilityBase.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- DescendantQuery.cs
- Expander.cs
- control.ime.cs
- DataBinder.cs
- XPathNavigatorException.cs
- WebPartCancelEventArgs.cs
- QueryInterceptorAttribute.cs
- MenuItemCollection.cs
- DropSource.cs
- RangeBaseAutomationPeer.cs