Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / Annotations / Anchoring / AttachedAnnotation.cs / 1305600 / AttachedAnnotation.cs
//------------------------------------------------------------------------------ // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // AttachedAnnotation represents an annotation which has been loaded for a // specific logical tree and has a runtime anchor in that tree. The same // annotation may be loaded in a different logical tree and get a different // anchor - thereby creating a different AttachedAnnotation. // // Spec: http://team/sites/ag/Specifications/Annotation%20Service%20Spec.doc // // History: // 08/18/2003: rruiz: Added enum and class as per spec. // 11/18/2003: magedz: implements IAttachedAnnotations interface as per service spec. // //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Windows; using System.Windows.Annotations; using System.Windows.Annotations.Storage; using System.Windows.Media; using System.Xml; using System.Collections.Generic; using MS.Utility; namespace MS.Internal.Annotations.Anchoring { ////// AttachedAnnotation represents an annotation which has been loaded for a /// specific logical tree and has an anchor in that tree. The same annotation /// may be loaded in a different logical tree and get a different anchor - /// thereby creating a different AttachedAnnotation. /// internal class AttachedAnnotation : IAttachedAnnotation { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Create an instance of AttachedAnnotation. /// /// the LocatorManager providing processors for this anchored annotation /// the annotation itself /// the annotation's anchor represented by the attached anchor /// the attached anchor itself /// the level of the attached anchor internal AttachedAnnotation(LocatorManager manager, Annotation annotation, AnnotationResource anchor, Object attachedAnchor, AttachmentLevel attachmentLevel) : this(manager, annotation, anchor, attachedAnchor, attachmentLevel, null) { } ////// Create an instance of AttachedAnnotation with a specified parent. Takes an optional /// parent for the attached annotation. This is useful when the parent is known before /// hand and not available through the normal means (such as in printing). /// /// the LocatorManager providing processors for this anchored annotation /// the annotation itself /// the annotation's anchor represented by the attached anchor /// the attached anchor itself /// the level of the attached anchor /// parent of the selection internal AttachedAnnotation(LocatorManager manager, Annotation annotation, AnnotationResource anchor, Object attachedAnchor, AttachmentLevel attachmentLevel, DependencyObject parent) { Debug.Assert(manager != null, "LocatorManager can not be null"); Debug.Assert(annotation != null, "Annotation can not be null"); Debug.Assert(anchor != null, "Anchor can not be null"); Debug.Assert(attachedAnchor != null, "AttachedAnchor can not be null"); _annotation = annotation; _anchor = anchor; _locatorManager = manager; Update(attachedAnchor, attachmentLevel, parent); } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods ////// Returns true if the attachedanchor of this IAttachedAnnotation is /// equal to the attached anchor passed to the function /// /// ///true if the anchors are equal public bool IsAnchorEqual(Object o) { //return _selectionProcessor.AnchorEquals(_attachedAnchor, o); return false; } #endregion Public Methods //------------------------------------------------------ // // Public Operators // //------------------------------------------------------ //----------------------------------------------------- // // Public Events // //------------------------------------------------------ //----------------------------------------------------- // // Public Properties // //----------------------------------------------------- #region Public Properties ////// The Annotation that is being attached to the element tree /// ///public Annotation Annotation { get { return _annotation; } } /// /// The specific anchor that has been resolved into the element tree /// ///public AnnotationResource Anchor { get { return _anchor; } } /// /// The part of the Avalon element tree that this attached annotation is anchored to /// ///public Object AttachedAnchor { get { return _attachedAnchor; } } /// /// This is simply a public accessor for FullyAttachedAnchor. We didn't want to use the /// FullyAttachedAnchor name in the public API but couldn't get rid of this internal /// property because there are a few known users of it (through reflection). /// public Object ResolvedAnchor { get { return FullyAttachedAnchor; } } ////// For virtualized content, this property returns the full anchor for the annotation. /// It may not be all visible or loaded into the tree, but the full anchor is useful /// for some operations that operate on content that may be virtualized. This property /// could be: /// - equal to AttachedAnchor, if the attachment level is Full /// - different from AttachedAnchor, if the attachment level was not full but the /// anchor could be resolved using virtual data /// - null, if the attachment level was not ful but the anchor could not be resolved /// using virtual data /// public Object FullyAttachedAnchor { get { if (_attachmentLevel == AttachmentLevel.Full) return _attachedAnchor; else return _fullyAttachedAnchor; } } ////// The level of attachment of the annotation to its attached anchor /// ///public AttachmentLevel AttachmentLevel { get { return _attachmentLevel; } } /// /// The Avalon logical Parent node of the attached anchor /// ///public DependencyObject Parent { get { return _parent; } } /// /// The Avalon coordinate of the attached anchor measured relative /// from its parent coordinate /// ///public Point AnchorPoint { get { Point pt = _selectionProcessor.GetAnchorPoint(_attachedAnchor); if (!Double.IsInfinity(pt.X) && !Double.IsInfinity(pt.Y)) { _cachedPoint = pt; } return _cachedPoint; } } /// /// The AnnotationStore /// ///public AnnotationStore Store { get { return GetStore(); } } #endregion Public Properties //----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods /// /// Update the attached anchor and level for this attached annotation. Internal method called by /// the annotation service when a change to an anchor is processed. Optional parent will be used /// if present. Otherwise we get the parent from the selection processor. /// /// the new attached anchor /// the new attachment level /// optional, the parent of the attached annotation internal void Update(object attachedAnchor, AttachmentLevel attachmentLevel, DependencyObject parent) { Debug.Assert(attachedAnchor != null, "AttachedAnchor can not be null"); Debug.Assert(attachmentLevel > AttachmentLevel.Unresolved && attachmentLevel <= AttachmentLevel.Incomplete, "Undefined attachment level"); _attachedAnchor = attachedAnchor; _attachmentLevel = attachmentLevel; _selectionProcessor = _locatorManager.GetSelectionProcessor(attachedAnchor.GetType()); // Use optional parent if available if (parent != null) { _parent = parent; } else { _parent = _selectionProcessor.GetParent(_attachedAnchor); } Debug.Assert(_selectionProcessor != null, SR.Get(SRID.NoProcessorForSelectionType, attachedAnchor.GetType())); } ////// Sets the fully attached anchor for this attached annotation. Should be used if /// the attachment level is not Full and the anchor could be fully resolved using virual content. /// internal void SetFullyAttachedAnchor(object fullyAttachedAnchor) { Debug.Assert(_attachmentLevel != AttachmentLevel.Full, "Should only set fully resolved anchor if attachment level is not full."); _fullyAttachedAnchor = fullyAttachedAnchor; } #endregion Internal Methods //----------------------------------------------------- // // Private Methods // //------------------------------------------------------ #region Private Functions private AnnotationStore GetStore() { // indirect via the parent element & DP if (this.Parent != null) { AnnotationService service = AnnotationService.GetService(this.Parent); if (service != null) return service.Store; } return null; } #endregion Private Methods //------------------------------------------------------ // // Private Fields // //----------------------------------------------------- #region Private Fields // The Annotation that is being attached to the element tree private Annotation _annotation; // The specific anchor that has been resolved into the element tree private AnnotationResource _anchor; // The part of the Avalon element tree that this attached annotation is anchored to private Object _attachedAnchor; // The fully resolved anchor, if different from _attachedAnchor private Object _fullyAttachedAnchor; // The level of attachment of the annotation to its attached anchor private AttachmentLevel _attachmentLevel; // Parent object of the attached anchor. This shouldn't change without // the anchor actually changing. private DependencyObject _parent; // // The selectionprocessor capable of handling this _attachedanchor private SelectionProcessor _selectionProcessor; // the locatormanager that created this attached annotation private LocatorManager _locatorManager; // cached anchor point - used if the selection processor returns Infinity private Point _cachedPoint; #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // AttachedAnnotation represents an annotation which has been loaded for a // specific logical tree and has a runtime anchor in that tree. The same // annotation may be loaded in a different logical tree and get a different // anchor - thereby creating a different AttachedAnnotation. // // Spec: http://team/sites/ag/Specifications/Annotation%20Service%20Spec.doc // // History: // 08/18/2003: rruiz: Added enum and class as per spec. // 11/18/2003: magedz: implements IAttachedAnnotations interface as per service spec. // //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.Windows; using System.Windows.Annotations; using System.Windows.Annotations.Storage; using System.Windows.Media; using System.Xml; using System.Collections.Generic; using MS.Utility; namespace MS.Internal.Annotations.Anchoring { ////// AttachedAnnotation represents an annotation which has been loaded for a /// specific logical tree and has an anchor in that tree. The same annotation /// may be loaded in a different logical tree and get a different anchor - /// thereby creating a different AttachedAnnotation. /// internal class AttachedAnnotation : IAttachedAnnotation { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Create an instance of AttachedAnnotation. /// /// the LocatorManager providing processors for this anchored annotation /// the annotation itself /// the annotation's anchor represented by the attached anchor /// the attached anchor itself /// the level of the attached anchor internal AttachedAnnotation(LocatorManager manager, Annotation annotation, AnnotationResource anchor, Object attachedAnchor, AttachmentLevel attachmentLevel) : this(manager, annotation, anchor, attachedAnchor, attachmentLevel, null) { } ////// Create an instance of AttachedAnnotation with a specified parent. Takes an optional /// parent for the attached annotation. This is useful when the parent is known before /// hand and not available through the normal means (such as in printing). /// /// the LocatorManager providing processors for this anchored annotation /// the annotation itself /// the annotation's anchor represented by the attached anchor /// the attached anchor itself /// the level of the attached anchor /// parent of the selection internal AttachedAnnotation(LocatorManager manager, Annotation annotation, AnnotationResource anchor, Object attachedAnchor, AttachmentLevel attachmentLevel, DependencyObject parent) { Debug.Assert(manager != null, "LocatorManager can not be null"); Debug.Assert(annotation != null, "Annotation can not be null"); Debug.Assert(anchor != null, "Anchor can not be null"); Debug.Assert(attachedAnchor != null, "AttachedAnchor can not be null"); _annotation = annotation; _anchor = anchor; _locatorManager = manager; Update(attachedAnchor, attachmentLevel, parent); } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods ////// Returns true if the attachedanchor of this IAttachedAnnotation is /// equal to the attached anchor passed to the function /// /// ///true if the anchors are equal public bool IsAnchorEqual(Object o) { //return _selectionProcessor.AnchorEquals(_attachedAnchor, o); return false; } #endregion Public Methods //------------------------------------------------------ // // Public Operators // //------------------------------------------------------ //----------------------------------------------------- // // Public Events // //------------------------------------------------------ //----------------------------------------------------- // // Public Properties // //----------------------------------------------------- #region Public Properties ////// The Annotation that is being attached to the element tree /// ///public Annotation Annotation { get { return _annotation; } } /// /// The specific anchor that has been resolved into the element tree /// ///public AnnotationResource Anchor { get { return _anchor; } } /// /// The part of the Avalon element tree that this attached annotation is anchored to /// ///public Object AttachedAnchor { get { return _attachedAnchor; } } /// /// This is simply a public accessor for FullyAttachedAnchor. We didn't want to use the /// FullyAttachedAnchor name in the public API but couldn't get rid of this internal /// property because there are a few known users of it (through reflection). /// public Object ResolvedAnchor { get { return FullyAttachedAnchor; } } ////// For virtualized content, this property returns the full anchor for the annotation. /// It may not be all visible or loaded into the tree, but the full anchor is useful /// for some operations that operate on content that may be virtualized. This property /// could be: /// - equal to AttachedAnchor, if the attachment level is Full /// - different from AttachedAnchor, if the attachment level was not full but the /// anchor could be resolved using virtual data /// - null, if the attachment level was not ful but the anchor could not be resolved /// using virtual data /// public Object FullyAttachedAnchor { get { if (_attachmentLevel == AttachmentLevel.Full) return _attachedAnchor; else return _fullyAttachedAnchor; } } ////// The level of attachment of the annotation to its attached anchor /// ///public AttachmentLevel AttachmentLevel { get { return _attachmentLevel; } } /// /// The Avalon logical Parent node of the attached anchor /// ///public DependencyObject Parent { get { return _parent; } } /// /// The Avalon coordinate of the attached anchor measured relative /// from its parent coordinate /// ///public Point AnchorPoint { get { Point pt = _selectionProcessor.GetAnchorPoint(_attachedAnchor); if (!Double.IsInfinity(pt.X) && !Double.IsInfinity(pt.Y)) { _cachedPoint = pt; } return _cachedPoint; } } /// /// The AnnotationStore /// ///public AnnotationStore Store { get { return GetStore(); } } #endregion Public Properties //----------------------------------------------------- // // Internal Methods // //------------------------------------------------------ #region Internal Methods /// /// Update the attached anchor and level for this attached annotation. Internal method called by /// the annotation service when a change to an anchor is processed. Optional parent will be used /// if present. Otherwise we get the parent from the selection processor. /// /// the new attached anchor /// the new attachment level /// optional, the parent of the attached annotation internal void Update(object attachedAnchor, AttachmentLevel attachmentLevel, DependencyObject parent) { Debug.Assert(attachedAnchor != null, "AttachedAnchor can not be null"); Debug.Assert(attachmentLevel > AttachmentLevel.Unresolved && attachmentLevel <= AttachmentLevel.Incomplete, "Undefined attachment level"); _attachedAnchor = attachedAnchor; _attachmentLevel = attachmentLevel; _selectionProcessor = _locatorManager.GetSelectionProcessor(attachedAnchor.GetType()); // Use optional parent if available if (parent != null) { _parent = parent; } else { _parent = _selectionProcessor.GetParent(_attachedAnchor); } Debug.Assert(_selectionProcessor != null, SR.Get(SRID.NoProcessorForSelectionType, attachedAnchor.GetType())); } ////// Sets the fully attached anchor for this attached annotation. Should be used if /// the attachment level is not Full and the anchor could be fully resolved using virual content. /// internal void SetFullyAttachedAnchor(object fullyAttachedAnchor) { Debug.Assert(_attachmentLevel != AttachmentLevel.Full, "Should only set fully resolved anchor if attachment level is not full."); _fullyAttachedAnchor = fullyAttachedAnchor; } #endregion Internal Methods //----------------------------------------------------- // // Private Methods // //------------------------------------------------------ #region Private Functions private AnnotationStore GetStore() { // indirect via the parent element & DP if (this.Parent != null) { AnnotationService service = AnnotationService.GetService(this.Parent); if (service != null) return service.Store; } return null; } #endregion Private Methods //------------------------------------------------------ // // Private Fields // //----------------------------------------------------- #region Private Fields // The Annotation that is being attached to the element tree private Annotation _annotation; // The specific anchor that has been resolved into the element tree private AnnotationResource _anchor; // The part of the Avalon element tree that this attached annotation is anchored to private Object _attachedAnchor; // The fully resolved anchor, if different from _attachedAnchor private Object _fullyAttachedAnchor; // The level of attachment of the annotation to its attached anchor private AttachmentLevel _attachmentLevel; // Parent object of the attached anchor. This shouldn't change without // the anchor actually changing. private DependencyObject _parent; // // The selectionprocessor capable of handling this _attachedanchor private SelectionProcessor _selectionProcessor; // the locatormanager that created this attached annotation private LocatorManager _locatorManager; // cached anchor point - used if the selection processor returns Infinity private Point _cachedPoint; #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
- Mapping.cs
- OpenTypeCommon.cs
- EnumerableRowCollectionExtensions.cs
- BooleanAnimationUsingKeyFrames.cs
- ISO2022Encoding.cs
- bidPrivateBase.cs
- TransactionFlowBindingElementImporter.cs
- MobileSysDescriptionAttribute.cs
- XmlTextWriter.cs
- HotSpot.cs
- PlanCompiler.cs
- TextBoxLine.cs
- cache.cs
- ByteAnimationBase.cs
- SoundPlayer.cs
- XmlHierarchicalDataSourceView.cs
- DbDataRecord.cs
- SmtpMail.cs
- FixedDSBuilder.cs
- LinqDataSourceValidationException.cs
- SerialPort.cs
- ToolStripSplitStackLayout.cs
- KeysConverter.cs
- HandlerWithFactory.cs
- SynchronousChannelMergeEnumerator.cs
- SqlNotificationEventArgs.cs
- SchemaSetCompiler.cs
- DateTimeHelper.cs
- CompiledQueryCacheEntry.cs
- MsmqBindingFilter.cs
- XmlAttributeAttribute.cs
- DesignerCategoryAttribute.cs
- FlowLayout.cs
- RegexInterpreter.cs
- OleDbTransaction.cs
- ServiceChannelProxy.cs
- MissingMethodException.cs
- RelationshipDetailsRow.cs
- SafeBitVector32.cs
- ImageMapEventArgs.cs
- TypedTableBaseExtensions.cs
- CodeMethodReturnStatement.cs
- DependencyProperty.cs
- DictionaryItemsCollection.cs
- RepeaterDataBoundAdapter.cs
- X509Utils.cs
- AsyncPostBackTrigger.cs
- StylusPointDescription.cs
- CancelRequestedQuery.cs
- TreeViewAutomationPeer.cs
- ControlCodeDomSerializer.cs
- Message.cs
- BinaryFormatter.cs
- HttpCapabilitiesBase.cs
- TextSpanModifier.cs
- Viewport2DVisual3D.cs
- InkCollectionBehavior.cs
- ToolStripRenderEventArgs.cs
- DbParameterCollectionHelper.cs
- Config.cs
- ObjectDataSourceMethodEventArgs.cs
- AssemblyInfo.cs
- ObjectDataSourceSelectingEventArgs.cs
- SystemIPGlobalProperties.cs
- CultureSpecificStringDictionary.cs
- DebuggerAttributes.cs
- Point3D.cs
- ColorAnimation.cs
- UnsafeNativeMethods.cs
- ConfigurationSectionCollection.cs
- XmlSchemaComplexType.cs
- ButtonPopupAdapter.cs
- RegexCompiler.cs
- Selector.cs
- XmlBindingWorker.cs
- ToolStripOverflowButton.cs
- EnumerableRowCollectionExtensions.cs
- TimeZone.cs
- ContainerTracking.cs
- RelatedEnd.cs
- CustomWebEventKey.cs
- MediaContext.cs
- Types.cs
- DecimalAnimation.cs
- HttpRequestTraceRecord.cs
- CalloutQueueItem.cs
- PlatformCulture.cs
- Point4DValueSerializer.cs
- Propagator.cs
- CheckBox.cs
- TakeQueryOptionExpression.cs
- GlyphsSerializer.cs
- AppendHelper.cs
- IBuiltInEvidence.cs
- FunctionMappingTranslator.cs
- MenuItemBindingCollection.cs
- ApplicationInfo.cs
- SpAudioStreamWrapper.cs
- GregorianCalendar.cs
- ConfigurationCollectionAttribute.cs