File: src\Framework\MS\Internal\Documents\Application\DocumentApplicationJournalEntry.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//----------------------------------------------------------------------------
//
// <copyright file="DocumentApplicationJournalEntry.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// Description: Attached to custom journal entries created for changes in the DocumentApplication's
//   UI state. 
//
// History:
//  06/24/2005 - JeremyNS created
//
//----------------------------------------------------------------------------
 
using System;
using System.Runtime.Serialization;
using System.Security;
using System.Security.Permissions;
using System.Diagnostics;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Navigation;
using System.Windows.Controls;
 
namespace MS.Internal.Documents.Application
{
    /// <remarks>
    /// DocumentApplicationJournalEntry is not a real journal entry, just the CustomContentState
    /// attached to one. It wraps a DocumentApplicationState object, which is the actual view state.
    /// The split is needed because PresentationUI cannot access internal Framework classes and methods.
    /// </remarks>
    [Serializable]
    internal sealed class DocumentApplicationJournalEntry : System.Windows.Navigation.CustomContentState
    {
        //------------------------------------------------------
        //
        //  Constructors
        //
        //------------------------------------------------------
        /// <summary>
        /// Constructs a DocumentApplicationJournalEntry
        /// </summary>
        /// <param name="state">State of the DocumentApplication to journal</param>
        /// <param name="name">Name of the journal entry to display in the UI.
        /// If this is null it will default to the URI source.</param>
        public DocumentApplicationJournalEntry(object state, string name)
        {
            Invariant.Assert(state is DocumentApplicationState,
                "state should be of type DocumentApplicationState");
 
            // Store parameters locally.
            _state = state;
            _displayName = name;
        }
 
        public DocumentApplicationJournalEntry(object state):
            this(state, null)
        {
        }
 
        //------------------------------------------------------
        //
        //  Public Methods
        //
        //------------------------------------------------------
        /// <summary>
        /// Used to reset the UI to state of this entry
        /// </summary>
        /// <param name="navigationService">NavigationService currently running</param>
        /// <param name="mode">Navigation direction</param>
        /// <SecurityNote>
        /// Critical: set_StoredDocumentApplicationState is defined in a non-APTCA assembly.
        /// TreatAsSafe: call to set_StoredDocumentApplicationState does not entail any risk.
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]        
        public override void Replay(NavigationService navigationService, NavigationMode mode)
        {
            ContentControl navigator = (ContentControl)navigationService.INavigatorHost;
            // Find a reference to the DocumentViewer hosted in the NavigationWindow
            // On initial history navigation in the browser, the window's layout may not have been 
            // done yet. ApplyTemplate() causes the viewer to be created.
            navigator.ApplyTemplate();
            DocumentApplicationDocumentViewer docViewer = navigator.Template.FindName(
                "PUIDocumentApplicationDocumentViewer", navigator)
                as DocumentApplicationDocumentViewer;
            Debug.Assert(docViewer != null, "PUIDocumentApplicationDocumentViewer not found.");
            if (docViewer != null)
            {
                // Set the new state on the DocumentViewer
                if (_state is DocumentApplicationState)
                {
                    docViewer.StoredDocumentApplicationState = (DocumentApplicationState)_state;
                }
 
                // Check that a Document exists.
                if (navigationService.Content != null)
                {
                    IDocumentPaginatorSource document = navigationService.Content as IDocumentPaginatorSource;
 
                    // If the document has already been paginated (could happen in the
                    // case of a fragment navigation), then set the DocumentViewer to the
                    // new state that was set.
                    if ((document != null) && (document.DocumentPaginator.IsPageCountValid))
                    {
                        docViewer.SetUIToStoredState();
                    }
                }
            }
        }
 
        public override string JournalEntryName
        {
            get { return _displayName; }
        }
 
        //------------------------------------------------------
        //
        //  Private Fields.
        //
        //------------------------------------------------------
 
        // The DocumentApplicationState has been weakly-typed to avoid PresentationFramework
        // having a type dependency on PresentationUI.  The perf impact of the weak
        // typed variables in this case was determined to be much less than forcing the load
        // of a new assembly when Assembly.GetTypes was called on PresentationFramework.
        private object _state; // DocumentApplicationState
 
        private string _displayName;
 
    }
}