Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / System / Windows / Documents / UIElementPropertyUndoUnit.cs / 1 / UIElementPropertyUndoUnit.cs
//---------------------------------------------------------------------------- // // File: UIElementPropertyUndoUnit.cs // // Description: Undo unit for property sets on UIElement. // It is created for: // 1. FlowDirectionProperty sets on a TextEditor's UI scope element. // 2. HorizontalAlignmentProperty sets on UIElement child of BlockUIContainer. // // History: // 01/13/2006 : pjoshi - Branched from FlowDirectionUndoUnit.cs // //--------------------------------------------------------------------------- using System; using System.Windows; using MS.Internal; using MS.Internal.Documents; namespace System.Windows.Documents { // 1. Undo unit for FlowDirectionProperty sets on a TextEditor's UI scope element. // // The TextEditor lets users configure the FlowDirection of text dynamically // even when running on TextBoxes (TextEditor.AcceptsRichContent == false). // In this case, there's no TextElement to hang property values on, so we must // resort to assigning values directly to the TextEditor's UiScope, which is // not covered by the TextContainer's undo infrastructure. // // This class encapsulates an undo unit used to track FlowDirection changes on // plain text documents. // // 2. Undo unit for HorizontalAlignmentProperty sets on UIElement child of BlockUIContainer. // // When applying TextAlignment property to BlockUIContainer elements in rich text documents, // text alignment must be translated into HorizontalAlignment of its child UIElement. // We must assign this property value directly to the embedded UIElement. // Since TextEditor's undo mechanism for property changes on TextElements in the tree relies // on the OnPropertyChanged event listener, it is unable to track this property change. // Also, it is infeasible to have a OnPropertyChanged listener for all UIElements. // So we resort to explicitly adding this special undo unit in such situation. // internal class UIElementPropertyUndoUnit : IUndoUnit { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors // Create a new undo unit instance. private UIElementPropertyUndoUnit(UIElement uiElement, DependencyProperty property, object oldValue) { _uiElement = uiElement; _property = property; _oldValue = oldValue; } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods // Called by the undo manager. Restores tree state to its condition // when the unit was created. public void Do() { if (_oldValue != DependencyProperty.UnsetValue) { _uiElement.SetValue(_property, _oldValue); } else { _uiElement.ClearValue(_property); } } // Called by the undo manager. public bool Merge(IUndoUnit unit) { Invariant.Assert(unit != null); return false; } #endregion Public Methods //------------------------------------------------------ // // Internal Methods // //------------------------------------------------------ #region Internal Methods // Note that following strongly typed overloads of Add are meant to restrict the usage of UIElementPropertyUndoUnit // for tracking changes to only a limited set of properties of UIElements. // In general, it is not safe to keep a reference to the original property value, however for enum types, it is safe to do so. // Add a new UIElementPropertyUndoUnit to the undo stack for HorizontalAlignment property. internal static void Add(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, HorizontalAlignment newValue) { AddPrivate(textContainer, uiElement, property, newValue); } // Add a new UIElementPropertyUndoUnit to the undo stack for FlowDirection property. internal static void Add(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, FlowDirection newValue) { AddPrivate(textContainer, uiElement, property, newValue); } #endregion Internal Methods //----------------------------------------------------- // // Privte Methods // //------------------------------------------------------ #region Private Methods // Private helper that adds a new UIElementPropertyUndoUnit to the undo stack. private static void AddPrivate(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, object newValue) { UndoManager undoManager = TextTreeUndo.GetOrClearUndoManager(textContainer); if (undoManager == null) { return; } object currentValue = uiElement.ReadLocalValue(property); if (currentValue is Expression) { // Can't undo when old value is an expression, so clear the stack. undoManager.Clear(); return; } if (currentValue.Equals(newValue)) { // No property change. return; } undoManager.Add(new UIElementPropertyUndoUnit(uiElement, property, currentValue)); } #endregion Private Methods //----------------------------------------------------- // // Private Fields // //----------------------------------------------------- #region Private Fields // UIElement associated with this undo unit. private readonly UIElement _uiElement; // DependencyProperty of the UIElement associated with this undo unit. private readonly DependencyProperty _property; // Original property value. private readonly object _oldValue; #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // File: UIElementPropertyUndoUnit.cs // // Description: Undo unit for property sets on UIElement. // It is created for: // 1. FlowDirectionProperty sets on a TextEditor's UI scope element. // 2. HorizontalAlignmentProperty sets on UIElement child of BlockUIContainer. // // History: // 01/13/2006 : pjoshi - Branched from FlowDirectionUndoUnit.cs // //--------------------------------------------------------------------------- using System; using System.Windows; using MS.Internal; using MS.Internal.Documents; namespace System.Windows.Documents { // 1. Undo unit for FlowDirectionProperty sets on a TextEditor's UI scope element. // // The TextEditor lets users configure the FlowDirection of text dynamically // even when running on TextBoxes (TextEditor.AcceptsRichContent == false). // In this case, there's no TextElement to hang property values on, so we must // resort to assigning values directly to the TextEditor's UiScope, which is // not covered by the TextContainer's undo infrastructure. // // This class encapsulates an undo unit used to track FlowDirection changes on // plain text documents. // // 2. Undo unit for HorizontalAlignmentProperty sets on UIElement child of BlockUIContainer. // // When applying TextAlignment property to BlockUIContainer elements in rich text documents, // text alignment must be translated into HorizontalAlignment of its child UIElement. // We must assign this property value directly to the embedded UIElement. // Since TextEditor's undo mechanism for property changes on TextElements in the tree relies // on the OnPropertyChanged event listener, it is unable to track this property change. // Also, it is infeasible to have a OnPropertyChanged listener for all UIElements. // So we resort to explicitly adding this special undo unit in such situation. // internal class UIElementPropertyUndoUnit : IUndoUnit { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors // Create a new undo unit instance. private UIElementPropertyUndoUnit(UIElement uiElement, DependencyProperty property, object oldValue) { _uiElement = uiElement; _property = property; _oldValue = oldValue; } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods // Called by the undo manager. Restores tree state to its condition // when the unit was created. public void Do() { if (_oldValue != DependencyProperty.UnsetValue) { _uiElement.SetValue(_property, _oldValue); } else { _uiElement.ClearValue(_property); } } // Called by the undo manager. public bool Merge(IUndoUnit unit) { Invariant.Assert(unit != null); return false; } #endregion Public Methods //------------------------------------------------------ // // Internal Methods // //------------------------------------------------------ #region Internal Methods // Note that following strongly typed overloads of Add are meant to restrict the usage of UIElementPropertyUndoUnit // for tracking changes to only a limited set of properties of UIElements. // In general, it is not safe to keep a reference to the original property value, however for enum types, it is safe to do so. // Add a new UIElementPropertyUndoUnit to the undo stack for HorizontalAlignment property. internal static void Add(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, HorizontalAlignment newValue) { AddPrivate(textContainer, uiElement, property, newValue); } // Add a new UIElementPropertyUndoUnit to the undo stack for FlowDirection property. internal static void Add(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, FlowDirection newValue) { AddPrivate(textContainer, uiElement, property, newValue); } #endregion Internal Methods //----------------------------------------------------- // // Privte Methods // //------------------------------------------------------ #region Private Methods // Private helper that adds a new UIElementPropertyUndoUnit to the undo stack. private static void AddPrivate(ITextContainer textContainer, UIElement uiElement, DependencyProperty property, object newValue) { UndoManager undoManager = TextTreeUndo.GetOrClearUndoManager(textContainer); if (undoManager == null) { return; } object currentValue = uiElement.ReadLocalValue(property); if (currentValue is Expression) { // Can't undo when old value is an expression, so clear the stack. undoManager.Clear(); return; } if (currentValue.Equals(newValue)) { // No property change. return; } undoManager.Add(new UIElementPropertyUndoUnit(uiElement, property, currentValue)); } #endregion Private Methods //----------------------------------------------------- // // Private Fields // //----------------------------------------------------- #region Private Fields // UIElement associated with this undo unit. private readonly UIElement _uiElement; // DependencyProperty of the UIElement associated with this undo unit. private readonly DependencyProperty _property; // Original property value. private readonly object _oldValue; #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PropertyFilterAttribute.cs
- WindowsIdentity.cs
- Identity.cs
- ExpressionReplacer.cs
- GenericsNotImplementedException.cs
- DispatcherEventArgs.cs
- DataSourceView.cs
- SemanticTag.cs
- BoolExpressionVisitors.cs
- RequestCachingSection.cs
- PopupRoot.cs
- WorkflowPrinting.cs
- HtmlLink.cs
- ObjectStateEntryOriginalDbUpdatableDataRecord.cs
- ToolStripSplitStackLayout.cs
- WindowsSolidBrush.cs
- _ScatterGatherBuffers.cs
- ExpandCollapsePattern.cs
- HTMLTagNameToTypeMapper.cs
- CommandPlan.cs
- TransformProviderWrapper.cs
- WebPartZoneBase.cs
- TraceSource.cs
- LinqDataSourceUpdateEventArgs.cs
- shaperfactoryquerycacheentry.cs
- Binding.cs
- NeutralResourcesLanguageAttribute.cs
- Merger.cs
- shaperfactory.cs
- ExtendedProperty.cs
- DefaultTextStore.cs
- DesignerHierarchicalDataSourceView.cs
- SHA256CryptoServiceProvider.cs
- SByteStorage.cs
- Preprocessor.cs
- StorageEntityContainerMapping.cs
- AttributeQuery.cs
- MenuItemBindingCollection.cs
- PrintEvent.cs
- DataSourceDesigner.cs
- SQLRoleProvider.cs
- XmlCharCheckingWriter.cs
- XdrBuilder.cs
- CrossSiteScriptingValidation.cs
- MobileComponentEditorPage.cs
- SymbolMethod.cs
- Array.cs
- LinqMaximalSubtreeNominator.cs
- ItemsControl.cs
- SynchronizedKeyedCollection.cs
- ZipFileInfo.cs
- CookieHandler.cs
- AccessDataSource.cs
- ToolboxComponentsCreatingEventArgs.cs
- PointHitTestResult.cs
- SafeWaitHandle.cs
- SessionStateContainer.cs
- WebFaultClientMessageInspector.cs
- XmlImplementation.cs
- DataRecordInfo.cs
- RequestResizeEvent.cs
- _PooledStream.cs
- SiteMapNodeItem.cs
- Int64AnimationBase.cs
- NonSerializedAttribute.cs
- cookiecontainer.cs
- IisTraceWebEventProvider.cs
- WebPartUserCapability.cs
- AspNetHostingPermission.cs
- ViewCellRelation.cs
- Constants.cs
- LineVisual.cs
- WindowsFormsDesignerOptionService.cs
- GreenMethods.cs
- IsolatedStorageFilePermission.cs
- NamedPipeAppDomainProtocolHandler.cs
- DataException.cs
- Registry.cs
- BlurEffect.cs
- NativeMethods.cs
- TdsParserStateObject.cs
- Literal.cs
- PasswordTextContainer.cs
- BitmapEffectGeneralTransform.cs
- InfoCardSymmetricAlgorithm.cs
- TypeGeneratedEventArgs.cs
- WorkflowDesignerColors.cs
- MsmqNonTransactedPoisonHandler.cs
- UInt32Converter.cs
- SpeechSeg.cs
- Schedule.cs
- DesignerCategoryAttribute.cs
- TemplateControlBuildProvider.cs
- PageTrueTypeFont.cs
- XmlReflectionMember.cs
- ActionMessageFilter.cs
- XmlCharType.cs
- DateTimeEditor.cs
- WebPartCatalogCloseVerb.cs
- CodeTypeDelegate.cs