|
//----------------------------------------------------------------------------
//
// <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;
}
}
|