Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / System / Windows / Documents / FixedSOMSemanticBox.cs / 1 / FixedSOMSemanticBox.cs
/*++ File: FixedSOMSemanticBox.cs Copyright (C) 2005 Microsoft Corporation. All rights reserved. Description: This class is the abstract base class for all the objects in SOM. It consists of a bounding rectangle, and implements IComparable interface to figure out content ordering on the page History: 05/17/2005: [....] - Created --*/ namespace System.Windows.Documents { using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Windows.Media; internal abstract class FixedSOMSemanticBox : IComparable { //-------------------------------------------------------------------- // // Constructors // //--------------------------------------------------------------------- #region Constructors public FixedSOMSemanticBox() { _boundingRect = Rect.Empty; } public FixedSOMSemanticBox(Rect boundingRect) { _boundingRect = boundingRect; } #endregion Constructors //------------------------------------------------------------------- // // Public Properties // //--------------------------------------------------------------------- #region Public Properties public Rect BoundingRect { get { return _boundingRect; } set { _boundingRect = value; } } #endregion Public Properties //-------------------------------------------------------------------- // // Public Methods // //--------------------------------------------------------------------- #region Public Methods #if DEBUG //For visualization purposes public abstract void Render(DrawingContext dc, string label, DrawDebugVisual debugVisuals) ; public void RenderLabel(DrawingContext dc, string label) { CultureInfo EnglishCulture = CultureInfo.GetCultureInfoByIetfLanguageTag("en-US"); FormattedText ft = new FormattedText(label, EnglishCulture, FlowDirection.LeftToRight, new Typeface("Arial"), 10, Brushes.White); Point labelLocation = new Point(_boundingRect.Left-25, (_boundingRect.Bottom + _boundingRect.Top)/2 - 10); Geometry geom = ft.BuildHighlightGeometry(labelLocation); Pen backgroundPen = new Pen(Brushes.Black,1); dc.DrawGeometry(Brushes.Black, backgroundPen, geom); dc.DrawText(ft, labelLocation); } #endif public virtual void SetRTFProperties(FixedElement element) { } public int CompareTo(object o) { Debug.Assert(o != null); if (!(o is FixedSOMSemanticBox)) { throw new ArgumentException(SR.Get(SRID.UnexpectedParameterType, o.GetType(), typeof(FixedSOMSemanticBox)), "o"); } SpatialComparison compareHor = _CompareHorizontal(o as FixedSOMSemanticBox, false); SpatialComparison compareVer = _CompareVertical(o as FixedSOMSemanticBox); Debug.Assert(compareHor != SpatialComparison.None && compareVer != SpatialComparison.None); int result; if (compareHor == SpatialComparison.Equal && compareVer == SpatialComparison.Equal) { result = 0; } else if (compareHor == SpatialComparison.Equal) { if (compareVer == SpatialComparison.Before || compareVer == SpatialComparison.OverlapBefore) { result = -1; } else { result = 1; } } else if (compareVer == SpatialComparison.Equal) { if (compareHor == SpatialComparison.Before || compareHor == SpatialComparison.OverlapBefore) { result = -1; } else { result = 1; } } else if (compareHor == SpatialComparison.Before) { result = -1; } else if (compareHor == SpatialComparison.After) { result = 1; } else { //Objects overlap if (compareVer == SpatialComparison.Before) { result = -1; } else if (compareVer == SpatialComparison.After) { result = 1; } //These objects intersect. else if (compareHor == SpatialComparison.OverlapBefore) { result = -1; } else { result = 1; } } return result; } #endregion Abstract Methods //-------------------------------------------------------------------- // // IComparable // //---------------------------------------------------------------------- #region IComparable Methods int IComparable.CompareTo(object o) { return this.CompareTo(o); } #endregion IComparable Methods //------------------------------------------------------------------- // // Protected Methods // //---------------------------------------------------------------------- #region Private Methods //Method that compares horizontally according to specific reading order protected SpatialComparison _CompareHorizontal(FixedSOMSemanticBox otherBox, bool RTL) { SpatialComparison result = SpatialComparison.None; Rect thisRect = this.BoundingRect; Rect otherRect = otherBox.BoundingRect; double thisRectRefX = RTL ? thisRect.Right : thisRect.Left; double otherRectRefX = RTL ? otherRect.Right : otherRect.Left; if (thisRectRefX == otherRectRefX) { result = SpatialComparison.Equal; } //Easiest way: calculate as if it's LTR and invert the result if RTL else if (thisRect.Right < otherRect.Left) { //Clearly before the other object result = SpatialComparison.Before; } else if (otherRect.Right < thisRect.Left) { //Clearly after the other object result = SpatialComparison.After; } else { double overlap = Math.Abs(thisRectRefX - otherRectRefX); double longerWidth = thisRect.Width > otherRect.Width ? thisRect.Width : otherRect.Width; if (overlap/longerWidth < 0.1) { //If less than 10% overlap then assume these are equal in horizontal comparison result = SpatialComparison.Equal; } //Objects overlap else if (thisRect.Left < otherRect.Left) { result = SpatialComparison.OverlapBefore; } else { result = SpatialComparison.OverlapAfter; } } if (RTL && result != SpatialComparison.Equal) { result = _InvertSpatialComparison(result); } return result; } //Method that compares horizontally according to specific reading order //In the future we should take into account the document language and plug it into this algorithm protected SpatialComparison _CompareVertical(FixedSOMSemanticBox otherBox) { SpatialComparison result = SpatialComparison.None; Rect thisRect = this.BoundingRect; Rect otherRect = otherBox.BoundingRect; if (thisRect.Top == otherRect.Top) { result = SpatialComparison.Equal; } else if (thisRect.Bottom <= otherRect.Top) { //Clearly before the other object result = SpatialComparison.Before; } else if (otherRect.Bottom <= thisRect.Top) { //Clearly after the other object result = SpatialComparison.After; } else { //Objects overlap if (thisRect.Top < otherRect.Top) { result = SpatialComparison.OverlapBefore; } else { result = SpatialComparison.OverlapAfter; } } return result; } protected int _SpatialToAbsoluteComparison(SpatialComparison comparison) { int result=0; switch (comparison) { case SpatialComparison.Before: case SpatialComparison.OverlapBefore: result = -1; break; case SpatialComparison.After: case SpatialComparison.OverlapAfter: result = 1; break; case SpatialComparison.Equal: result = 0; break; default: Debug.Assert(false); break; } return result; } protected SpatialComparison _InvertSpatialComparison(SpatialComparison comparison) { SpatialComparison result = comparison; switch (comparison) { case SpatialComparison.Before: result = SpatialComparison.After; break; case SpatialComparison.After: result = SpatialComparison.Before; break; case SpatialComparison.OverlapBefore: result = SpatialComparison.OverlapAfter; break; case SpatialComparison.OverlapAfter: result = SpatialComparison.OverlapBefore; break; default: break; } return result; } #endregion Protected Methods #region enums protected enum SpatialComparison { None =0, Before, OverlapBefore, Equal, OverlapAfter, After }; #endregion enums //------------------------------------------------------------------- // // Protected Fields // //--------------------------------------------------------------------- #region Protected Fields protected Rect _boundingRect; #endregion Protected 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
- DiscardableAttribute.cs
- StorageComplexTypeMapping.cs
- PolicyException.cs
- DataGridViewIntLinkedList.cs
- CopyOnWriteList.cs
- StringDictionary.cs
- ColorTransform.cs
- CellPartitioner.cs
- SecurityTokenProvider.cs
- ReadOnlyDictionary.cs
- SoapWriter.cs
- StartUpEventArgs.cs
- _CacheStreams.cs
- UnsignedPublishLicense.cs
- IdleTimeoutMonitor.cs
- ZipIOZip64EndOfCentralDirectoryLocatorBlock.cs
- UnionCqlBlock.cs
- ArgumentDesigner.xaml.cs
- EUCJPEncoding.cs
- ScrollPatternIdentifiers.cs
- XmlSchemaSimpleTypeList.cs
- TreeNodeStyleCollection.cs
- CodeDomComponentSerializationService.cs
- MethodToken.cs
- SQLMoneyStorage.cs
- ToolStripGripRenderEventArgs.cs
- CommittableTransaction.cs
- ComEventsSink.cs
- UserControlAutomationPeer.cs
- ObjectDataSource.cs
- IteratorFilter.cs
- XslCompiledTransform.cs
- EntityDataSourceViewSchema.cs
- oledbmetadatacolumnnames.cs
- BeginStoryboard.cs
- ValidationPropertyAttribute.cs
- ISO2022Encoding.cs
- VolatileEnlistmentMultiplexing.cs
- _IPv6Address.cs
- ValidationPropertyAttribute.cs
- CodeDesigner.cs
- SqlVisitor.cs
- InternalsVisibleToAttribute.cs
- InstanceDataCollectionCollection.cs
- MsmqIntegrationOutputChannel.cs
- ProfileParameter.cs
- StringArrayConverter.cs
- ListDictionary.cs
- TypeToTreeConverter.cs
- WaitHandle.cs
- UshortList2.cs
- DataColumnMappingCollection.cs
- ListBoxItemWrapperAutomationPeer.cs
- DataGridRowEventArgs.cs
- SettingsPropertyWrongTypeException.cs
- ToolStripItemGlyph.cs
- ThreadAbortException.cs
- SendMailErrorEventArgs.cs
- DataListComponentEditor.cs
- DataGridRow.cs
- ZipIOLocalFileHeader.cs
- OSFeature.cs
- OracleBinary.cs
- SecondaryIndex.cs
- UndoManager.cs
- LoadGrammarCompletedEventArgs.cs
- SafeHandle.cs
- SimplePropertyEntry.cs
- XmlFileEditor.cs
- MouseButtonEventArgs.cs
- ToolStripContainer.cs
- ColumnMapProcessor.cs
- ISAPIApplicationHost.cs
- DesignerDataTableBase.cs
- PropertyChangingEventArgs.cs
- DSASignatureFormatter.cs
- TextEditorCharacters.cs
- ObjectAnimationUsingKeyFrames.cs
- UdpReplyToBehavior.cs
- System.Data.OracleClient_BID.cs
- TemplateBuilder.cs
- ToolStripDropDown.cs
- DebuggerAttributes.cs
- CacheChildrenQuery.cs
- Cursor.cs
- XPathScanner.cs
- MarshalByValueComponent.cs
- XPathSingletonIterator.cs
- PagedDataSource.cs
- ReferentialConstraint.cs
- CustomCategoryAttribute.cs
- DecoderReplacementFallback.cs
- InfiniteIntConverter.cs
- DesignerImageAdapter.cs
- DataGridClipboardHelper.cs
- Util.cs
- CodeDirectoryCompiler.cs
- PropertyGridEditorPart.cs
- x509utils.cs
- BitmapData.cs