Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / MS / Internal / PtsHost / FigureHelper.cs / 1 / FigureHelper.cs
//---------------------------------------------------------------------------- // // Copyright (C) Microsoft Corporation. All rights reserved. // // File: FigureHelper.cs // // Description: Helpers for figure formatting // // History: // 02/07/2006 : ghermann - created // //--------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // avoid generating warnings about unknown // message numbers and unknown pragmas for PRESharp contol using System; using System.Windows; using System.Windows.Media; using System.Windows.Documents; using MS.Internal.Text; namespace MS.Internal.PtsHost { // --------------------------------------------------------------------- // Helper services to assist formatting figure // --------------------------------------------------------------------- internal static class FigureHelper { // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to page // ----------------------------------------------------------------- internal static bool IsVerticalPageAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.PageTop || verticalAnchor == FigureVerticalAnchor.PageBottom || verticalAnchor == FigureVerticalAnchor.PageCenter; } // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to content // ------------------------------------------------------------------ internal static bool IsVerticalContentAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.ContentTop || verticalAnchor == FigureVerticalAnchor.ContentBottom || verticalAnchor == FigureVerticalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to page // ------------------------------------------------------------------ internal static bool IsHorizontalPageAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.PageLeft || horizontalAnchor == FigureHorizontalAnchor.PageRight || horizontalAnchor == FigureHorizontalAnchor.PageCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to content // ----------------------------------------------------------------- internal static bool IsHorizontalContentAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ContentLeft || horizontalAnchor == FigureHorizontalAnchor.ContentRight || horizontalAnchor == FigureHorizontalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to column // ------------------------------------------------------------------ internal static bool IsHorizontalColumnAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ColumnLeft || horizontalAnchor == FigureHorizontalAnchor.ColumnRight || horizontalAnchor == FigureHorizontalAnchor.ColumnCenter; } // ----------------------------------------------------------------- // Width figure size calculation // ------------------------------------------------------------------ internal static double CalculateFigureWidth(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isWidthAuto) { double value; isWidthAuto = figureLength.IsAuto ? true : false; // Check figure's horizontal anchor. If anchored to page, use page width to format FigureHorizontalAnchor horizontalAnchor = figure.HorizontalAnchor; if(figureLength.IsPage || (figureLength.IsAuto && IsHorizontalPageAnchor(horizontalAnchor))) { value = structuralCache.CurrentFormatContext.PageWidth * figureLength.Value; } else if (figureLength.IsAbsolute) { value = CalculateFigureCommon(figureLength); } else // figureLength.IsColumn || figureLength.IsContent || figureLength.IsAuto { double columnWidth, gap, rule; int cColumns; GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); if (figureLength.IsContent || (figureLength.IsAuto && IsHorizontalContentAnchor(horizontalAnchor))) { // Use content width for figure value = (columnWidth * cColumns + gap * (cColumns - 1)) * figureLength.Value; } else // figureLength.IsColumn || figureLength.IsAuto { // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; int columnGapsSpanned = (int) lengthValue; if(columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } } Invariant.Assert(!DoubleUtil.IsNaN(value)); return value; } // ------------------------------------------------------------------ // Height figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureHeight(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isHeightAuto) { double value; if(figureLength.IsPage) { value = (structuralCache.CurrentFormatContext.PageHeight) * figureLength.Value; } else if(figureLength.IsContent) // Column to be treated same as content { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = (structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom) * figureLength.Value; } else if (figureLength.IsColumn) { // Height is calculated based on column width, since column height is the same as content. Per spec. // Retrieve all column metrics for current page int cColumns; double columnWidth; double gap; double rule; FigureHelper.GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; if (lengthValue > cColumns) { lengthValue = cColumns; } int columnGapsSpanned = (int)lengthValue; if (columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } else { value = FigureHelper.CalculateFigureCommon(figureLength); } if(!DoubleUtil.IsNaN(value)) { FigureVerticalAnchor verticalAnchor = figure.VerticalAnchor; // Value is in pixels. Now we limit value to max out depending on anchoring. if(FigureHelper.IsVerticalPageAnchor(verticalAnchor)) { value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight)); } else // Column and paragraph anchoring still max out at content height { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom)); } TextDpi.EnsureValidPageWidth(ref value); isHeightAuto = false; } else { value = structuralCache.CurrentFormatContext.PageHeight; isHeightAuto = true; } return value; } // ------------------------------------------------------------------ // Common figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureCommon(FigureLength figureLength) { double value; if(figureLength.IsAuto) { value = Double.NaN; } else if(figureLength.IsAbsolute) { value = figureLength.Value; } else { Invariant.Assert(false, "Unknown figure length type specified."); value = 0.0; } return value; } // ----------------------------------------------------------------- // Returns calculated column information - count, width, gap and rule. // ----------------------------------------------------------------- internal static void GetColumnMetrics(StructuralCache structuralCache, out int cColumns, out double width, out double gap, out double rule) { ColumnPropertiesGroup columnProperties = new ColumnPropertiesGroup(structuralCache.PropertyOwner); FontFamily pageFontFamily = (FontFamily)structuralCache.PropertyOwner.GetValue(Block.FontFamilyProperty); double lineHeight = DynamicPropertyReader.GetLineHeightValue(structuralCache.PropertyOwner); double pageFontSize = (double)structuralCache.PropertyOwner.GetValue(Block.FontSizeProperty); Size pageSize = structuralCache.CurrentFormatContext.PageSize; Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; double pageWidth = pageSize.Width - (pageMargin.Left + pageMargin.Right); cColumns = PtsHelper.CalculateColumnCount(columnProperties, lineHeight, pageWidth, pageFontSize, pageFontFamily, true); double freeSpace; rule = columnProperties.ColumnRuleWidth; PtsHelper.GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, true, cColumns, ref lineHeight, out width, out freeSpace, out gap); if (columnProperties.IsColumnWidthFlexible && columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Between) { width += freeSpace / cColumns; } width = Math.Min(width, pageWidth); } } } #pragma warning enable 1634, 1691 // 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. // // File: FigureHelper.cs // // Description: Helpers for figure formatting // // History: // 02/07/2006 : ghermann - created // //--------------------------------------------------------------------------- #pragma warning disable 1634, 1691 // avoid generating warnings about unknown // message numbers and unknown pragmas for PRESharp contol using System; using System.Windows; using System.Windows.Media; using System.Windows.Documents; using MS.Internal.Text; namespace MS.Internal.PtsHost { // --------------------------------------------------------------------- // Helper services to assist formatting figure // --------------------------------------------------------------------- internal static class FigureHelper { // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to page // ----------------------------------------------------------------- internal static bool IsVerticalPageAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.PageTop || verticalAnchor == FigureVerticalAnchor.PageBottom || verticalAnchor == FigureVerticalAnchor.PageCenter; } // ------------------------------------------------------------------ // Returns whether a vertical anchor is relative to content // ------------------------------------------------------------------ internal static bool IsVerticalContentAnchor(FigureVerticalAnchor verticalAnchor) { return verticalAnchor == FigureVerticalAnchor.ContentTop || verticalAnchor == FigureVerticalAnchor.ContentBottom || verticalAnchor == FigureVerticalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to page // ------------------------------------------------------------------ internal static bool IsHorizontalPageAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.PageLeft || horizontalAnchor == FigureHorizontalAnchor.PageRight || horizontalAnchor == FigureHorizontalAnchor.PageCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to content // ----------------------------------------------------------------- internal static bool IsHorizontalContentAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ContentLeft || horizontalAnchor == FigureHorizontalAnchor.ContentRight || horizontalAnchor == FigureHorizontalAnchor.ContentCenter; } // ----------------------------------------------------------------- // Returns whether a horizontal anchor is relative to column // ------------------------------------------------------------------ internal static bool IsHorizontalColumnAnchor(FigureHorizontalAnchor horizontalAnchor) { return horizontalAnchor == FigureHorizontalAnchor.ColumnLeft || horizontalAnchor == FigureHorizontalAnchor.ColumnRight || horizontalAnchor == FigureHorizontalAnchor.ColumnCenter; } // ----------------------------------------------------------------- // Width figure size calculation // ------------------------------------------------------------------ internal static double CalculateFigureWidth(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isWidthAuto) { double value; isWidthAuto = figureLength.IsAuto ? true : false; // Check figure's horizontal anchor. If anchored to page, use page width to format FigureHorizontalAnchor horizontalAnchor = figure.HorizontalAnchor; if(figureLength.IsPage || (figureLength.IsAuto && IsHorizontalPageAnchor(horizontalAnchor))) { value = structuralCache.CurrentFormatContext.PageWidth * figureLength.Value; } else if (figureLength.IsAbsolute) { value = CalculateFigureCommon(figureLength); } else // figureLength.IsColumn || figureLength.IsContent || figureLength.IsAuto { double columnWidth, gap, rule; int cColumns; GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); if (figureLength.IsContent || (figureLength.IsAuto && IsHorizontalContentAnchor(horizontalAnchor))) { // Use content width for figure value = (columnWidth * cColumns + gap * (cColumns - 1)) * figureLength.Value; } else // figureLength.IsColumn || figureLength.IsAuto { // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; int columnGapsSpanned = (int) lengthValue; if(columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } } Invariant.Assert(!DoubleUtil.IsNaN(value)); return value; } // ------------------------------------------------------------------ // Height figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureHeight(StructuralCache structuralCache, Figure figure, FigureLength figureLength, out bool isHeightAuto) { double value; if(figureLength.IsPage) { value = (structuralCache.CurrentFormatContext.PageHeight) * figureLength.Value; } else if(figureLength.IsContent) // Column to be treated same as content { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = (structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom) * figureLength.Value; } else if (figureLength.IsColumn) { // Height is calculated based on column width, since column height is the same as content. Per spec. // Retrieve all column metrics for current page int cColumns; double columnWidth; double gap; double rule; FigureHelper.GetColumnMetrics(structuralCache, out cColumns, out columnWidth, out gap, out rule); // We do this to prevent a 2.0 columns from spanning 2.0 + gap, so we just check for edge double lengthValue = figureLength.Value; if (lengthValue > cColumns) { lengthValue = cColumns; } int columnGapsSpanned = (int)lengthValue; if (columnGapsSpanned == lengthValue && columnGapsSpanned > 0) { columnGapsSpanned -= 1; } value = (columnWidth * lengthValue) + gap * columnGapsSpanned; } else { value = FigureHelper.CalculateFigureCommon(figureLength); } if(!DoubleUtil.IsNaN(value)) { FigureVerticalAnchor verticalAnchor = figure.VerticalAnchor; // Value is in pixels. Now we limit value to max out depending on anchoring. if(FigureHelper.IsVerticalPageAnchor(verticalAnchor)) { value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight)); } else // Column and paragraph anchoring still max out at content height { Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; value = Math.Max(1, Math.Min(value, structuralCache.CurrentFormatContext.PageHeight - pageMargin.Top - pageMargin.Bottom)); } TextDpi.EnsureValidPageWidth(ref value); isHeightAuto = false; } else { value = structuralCache.CurrentFormatContext.PageHeight; isHeightAuto = true; } return value; } // ------------------------------------------------------------------ // Common figure size calculation // ----------------------------------------------------------------- internal static double CalculateFigureCommon(FigureLength figureLength) { double value; if(figureLength.IsAuto) { value = Double.NaN; } else if(figureLength.IsAbsolute) { value = figureLength.Value; } else { Invariant.Assert(false, "Unknown figure length type specified."); value = 0.0; } return value; } // ----------------------------------------------------------------- // Returns calculated column information - count, width, gap and rule. // ----------------------------------------------------------------- internal static void GetColumnMetrics(StructuralCache structuralCache, out int cColumns, out double width, out double gap, out double rule) { ColumnPropertiesGroup columnProperties = new ColumnPropertiesGroup(structuralCache.PropertyOwner); FontFamily pageFontFamily = (FontFamily)structuralCache.PropertyOwner.GetValue(Block.FontFamilyProperty); double lineHeight = DynamicPropertyReader.GetLineHeightValue(structuralCache.PropertyOwner); double pageFontSize = (double)structuralCache.PropertyOwner.GetValue(Block.FontSizeProperty); Size pageSize = structuralCache.CurrentFormatContext.PageSize; Thickness pageMargin = structuralCache.CurrentFormatContext.PageMargin; double pageWidth = pageSize.Width - (pageMargin.Left + pageMargin.Right); cColumns = PtsHelper.CalculateColumnCount(columnProperties, lineHeight, pageWidth, pageFontSize, pageFontFamily, true); double freeSpace; rule = columnProperties.ColumnRuleWidth; PtsHelper.GetColumnMetrics(columnProperties, pageWidth, pageFontSize, pageFontFamily, true, cColumns, ref lineHeight, out width, out freeSpace, out gap); if (columnProperties.IsColumnWidthFlexible && columnProperties.ColumnSpaceDistribution == ColumnSpaceDistribution.Between) { width += freeSpace / cColumns; } width = Math.Min(width, pageWidth); } } } #pragma warning enable 1634, 1691 // 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
- ResXBuildProvider.cs
- CloudCollection.cs
- InternalTypeHelper.cs
- SessionIDManager.cs
- DataList.cs
- Rights.cs
- Guid.cs
- DeobfuscatingStream.cs
- UnionExpr.cs
- CompModSwitches.cs
- ProvidePropertyAttribute.cs
- MemoryMappedViewStream.cs
- VirtualDirectoryMappingCollection.cs
- ContextMarshalException.cs
- RoutedUICommand.cs
- DataException.cs
- XslAstAnalyzer.cs
- ListViewUpdatedEventArgs.cs
- PolicyLevel.cs
- LinqDataSourceContextEventArgs.cs
- OleServicesContext.cs
- WizardForm.cs
- ObjectTag.cs
- DataGridViewToolTip.cs
- FormViewDeleteEventArgs.cs
- FunctionParameter.cs
- SqlParameterizer.cs
- EpmAttributeNameBuilder.cs
- FormsAuthenticationEventArgs.cs
- SolidColorBrush.cs
- AttachedAnnotationChangedEventArgs.cs
- SamlAttributeStatement.cs
- MemberCollection.cs
- WebBrowser.cs
- TextBox.cs
- ItemCheckEvent.cs
- ListViewItemMouseHoverEvent.cs
- DocumentApplicationJournalEntry.cs
- ObjectAnimationUsingKeyFrames.cs
- Array.cs
- XsdDuration.cs
- SemanticResultKey.cs
- Point4D.cs
- SymbolEqualComparer.cs
- TraceFilter.cs
- NameScopePropertyAttribute.cs
- EntityDataSourceValidationException.cs
- Color.cs
- XmlCompatibilityReader.cs
- ValidatingCollection.cs
- TableCellsCollectionEditor.cs
- Underline.cs
- HostedElements.cs
- NewArrayExpression.cs
- SQLInt64Storage.cs
- Compiler.cs
- TextPenaltyModule.cs
- PersonalizationState.cs
- FormatConvertedBitmap.cs
- Variant.cs
- backend.cs
- XmlWriterTraceListener.cs
- PixelFormat.cs
- ColorAnimation.cs
- QuaternionAnimation.cs
- CodeCommentStatementCollection.cs
- ProfileBuildProvider.cs
- ButtonStandardAdapter.cs
- LinqDataSourceContextEventArgs.cs
- TreeNodeBindingCollection.cs
- TextTabProperties.cs
- RelatedView.cs
- RepeatButtonAutomationPeer.cs
- SqlFactory.cs
- DataViewManager.cs
- DecimalFormatter.cs
- IdentityReference.cs
- Typography.cs
- ComboBoxItem.cs
- FragmentQueryKB.cs
- HtmlInputRadioButton.cs
- AudioStateChangedEventArgs.cs
- Comparer.cs
- TraceSection.cs
- BuiltInExpr.cs
- RuleDefinitions.cs
- DataListItem.cs
- CalendarDay.cs
- ServiceHostingEnvironment.cs
- GZipStream.cs
- Base64Decoder.cs
- ScriptComponentDescriptor.cs
- LocalizationComments.cs
- FileDialogCustomPlacesCollection.cs
- ConfigXmlElement.cs
- AsyncCodeActivityContext.cs
- IsolatedStorageFile.cs
- PhysicalOps.cs
- CommandBinding.cs
- InfoCardProofToken.cs