Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Core / CSharp / MS / Internal / TextFormatting / FormatSettings.cs / 1 / FormatSettings.cs
//------------------------------------------------------------------------
//
// Microsoft Windows Client Platform
// Copyright (C) Microsoft Corporation, 2001
//
// File: FormatSettings.cs
//
// Contents: Settings to format text
//
// Created: 2-25-2004 Worachai Chaoweeraprasit (wchao)
//
//-----------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Security;
using System.Windows;
using System.Windows.Threading;
using System.Windows.Media.TextFormatting;
namespace MS.Internal.TextFormatting
{
///
/// Text formatting state
///
internal sealed class FormatSettings
{
private TextFormatterImp _formatter; // formatter object
private TextSource _textSource; // client text source for main text
private TextRunCacheImp _runCache; // run cache owned by client
private ParaProp _pap; // current paragraph properties
private DigitState _digitState; // current number substitution properties
private TextLineBreak _previousLineBreak; // break of previous line
private int _maxLineWidth; // Max line width of the line being built. Only used in Optimal paragraph for the moment
private int _textIndent; // Distance from line start to where text starts
internal FormatSettings(
TextFormatterImp formatter,
TextSource textSource,
TextRunCacheImp runCache,
ParaProp pap,
TextLineBreak previousLineBreak,
bool isSingleLineFormatting
)
{
_formatter = formatter;
_textSource = textSource;
_runCache = runCache;
_pap = pap;
_digitState = new DigitState();
_previousLineBreak = previousLineBreak;
_maxLineWidth = Constants.InfiniteWidth;
if (isSingleLineFormatting)
{
// Apply text indent on each line in single line mode
_textIndent = _pap.Indent;
}
}
///
/// Current formatter
///
internal TextFormatterImp Formatter
{
get { return _formatter; }
}
///
/// Current source
///
internal TextSource TextSource
{
get { return _textSource; }
}
///
/// Break of previous line
///
internal TextLineBreak PreviousLineBreak
{
get { return _previousLineBreak; }
}
///
/// paragraph properties
///
internal ParaProp Pap
{
get { return _pap; }
}
///
/// Max width of the line being built. In optimal break mode, client may format
/// breakpoints for the line with max width different from the paragraph width.
///
internal int MaxLineWidth
{
get { return _maxLineWidth; }
}
///
/// Update formatting parameters at line start
///
internal void UpdateSettingsForCurrentLine(
int maxLineWidth,
TextLineBreak previousLineBreak,
bool isFirstLineInPara
)
{
_previousLineBreak = previousLineBreak;
_digitState = new DigitState(); // reset digit state
_maxLineWidth = Math.Max(maxLineWidth, 0);
if (isFirstLineInPara)
{
_textIndent = _pap.Indent;
}
else
{
// Do not apply text indentation to all but the first line in para
_textIndent = 0;
}
}
///
/// Calculate formatting width from specified constraint width
///
internal int GetFormatWidth(int finiteFormatWidth)
{
// LS does not support no wrap, for such case, we would need to
// simulate formatting a line within an infinite paragraph width
// while still keeping the last legit boundary for trimming purpose.
return _pap.Wrap ? finiteFormatWidth : Constants.InfiniteWidth;
}
///
/// Calculate finite formatting width from specified constraint width
///
internal int GetFiniteFormatWidth(int paragraphWidth)
{
// indent is part of our text line but not of LS line
// paragraph width == 0 means format width is unlimited
int formatWidth = (paragraphWidth <= 0 ? Constants.InfiniteWidth : paragraphWidth);
formatWidth = formatWidth - _pap.ParagraphIndent;
// sanitize the format width value before passing to LS
formatWidth = Math.Max(formatWidth, 0);
formatWidth = Math.Min(formatWidth, Constants.InfiniteWidth);
return formatWidth;
}
///
/// Fetch text run and character string associated with it
///
///
/// Critical: This code has unsafe code block that uses pointers.
/// TreatAsSafe: This code does not expose the pointers.
///
[SecurityCritical, SecurityTreatAsSafe]
internal CharacterBufferRange FetchTextRun(
int cpFetch,
int cpFirst,
out TextRun textRun,
out int runLength
)
{
int offsetToFirstCp;
textRun = _runCache.FetchTextRun(this, cpFetch, cpFirst, out offsetToFirstCp, out runLength);
CharacterBufferRange charString;
switch (TextRunInfo.GetRunType(textRun))
{
case Plsrun.Text:
{
CharacterBufferReference charBufferRef = textRun.CharacterBufferReference;
charString = new CharacterBufferRange(
charBufferRef.CharacterBuffer,
charBufferRef.OffsetToFirstChar + offsetToFirstCp,
runLength
);
break;
}
case Plsrun.InlineObject:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
charString = new CharacterBufferRange((char*) TextStore.PwchObjectReplacement, 1);
}
break;
case Plsrun.LineBreak:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
//
// Line break is to be represented as "Line Separator" such that
// it doesn't terminate the optimal paragraph formatting session, but still breaks the line
// unambiguously.
//
charString = new CharacterBufferRange((char*) TextStore.PwchLineSeparator, 1);
}
break;
case Plsrun.ParaBreak:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
//
// Paragraph break is special as it also terminates the paragraph.
// It should be represented as "Paragraph Separator" such that it will be correctly handled
// in Bidi and Optimal paragraph formatting.
//
charString = new CharacterBufferRange((char*) TextStore.PwchParaSeparator, 1);
}
break;
case Plsrun.Hidden:
unsafe
{
charString = new CharacterBufferRange((char*) TextStore.PwchHidden, 1);
}
break;
default:
charString = CharacterBufferRange.Empty;
break;
}
return charString;
}
///
/// Get text immediately preceding cpLimit.
///
internal TextSpan GetPrecedingText(int cpLimit)
{
return _runCache.GetPrecedingText(_textSource, cpLimit);
}
///
/// Current number substitution propeties
///
internal DigitState DigitState
{
get { return _digitState; }
}
///
/// Distance from line start to where text starts
///
internal int TextIndent
{
get { return _textIndent; }
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------
//
// Microsoft Windows Client Platform
// Copyright (C) Microsoft Corporation, 2001
//
// File: FormatSettings.cs
//
// Contents: Settings to format text
//
// Created: 2-25-2004 Worachai Chaoweeraprasit (wchao)
//
//-----------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Security;
using System.Windows;
using System.Windows.Threading;
using System.Windows.Media.TextFormatting;
namespace MS.Internal.TextFormatting
{
///
/// Text formatting state
///
internal sealed class FormatSettings
{
private TextFormatterImp _formatter; // formatter object
private TextSource _textSource; // client text source for main text
private TextRunCacheImp _runCache; // run cache owned by client
private ParaProp _pap; // current paragraph properties
private DigitState _digitState; // current number substitution properties
private TextLineBreak _previousLineBreak; // break of previous line
private int _maxLineWidth; // Max line width of the line being built. Only used in Optimal paragraph for the moment
private int _textIndent; // Distance from line start to where text starts
internal FormatSettings(
TextFormatterImp formatter,
TextSource textSource,
TextRunCacheImp runCache,
ParaProp pap,
TextLineBreak previousLineBreak,
bool isSingleLineFormatting
)
{
_formatter = formatter;
_textSource = textSource;
_runCache = runCache;
_pap = pap;
_digitState = new DigitState();
_previousLineBreak = previousLineBreak;
_maxLineWidth = Constants.InfiniteWidth;
if (isSingleLineFormatting)
{
// Apply text indent on each line in single line mode
_textIndent = _pap.Indent;
}
}
///
/// Current formatter
///
internal TextFormatterImp Formatter
{
get { return _formatter; }
}
///
/// Current source
///
internal TextSource TextSource
{
get { return _textSource; }
}
///
/// Break of previous line
///
internal TextLineBreak PreviousLineBreak
{
get { return _previousLineBreak; }
}
///
/// paragraph properties
///
internal ParaProp Pap
{
get { return _pap; }
}
///
/// Max width of the line being built. In optimal break mode, client may format
/// breakpoints for the line with max width different from the paragraph width.
///
internal int MaxLineWidth
{
get { return _maxLineWidth; }
}
///
/// Update formatting parameters at line start
///
internal void UpdateSettingsForCurrentLine(
int maxLineWidth,
TextLineBreak previousLineBreak,
bool isFirstLineInPara
)
{
_previousLineBreak = previousLineBreak;
_digitState = new DigitState(); // reset digit state
_maxLineWidth = Math.Max(maxLineWidth, 0);
if (isFirstLineInPara)
{
_textIndent = _pap.Indent;
}
else
{
// Do not apply text indentation to all but the first line in para
_textIndent = 0;
}
}
///
/// Calculate formatting width from specified constraint width
///
internal int GetFormatWidth(int finiteFormatWidth)
{
// LS does not support no wrap, for such case, we would need to
// simulate formatting a line within an infinite paragraph width
// while still keeping the last legit boundary for trimming purpose.
return _pap.Wrap ? finiteFormatWidth : Constants.InfiniteWidth;
}
///
/// Calculate finite formatting width from specified constraint width
///
internal int GetFiniteFormatWidth(int paragraphWidth)
{
// indent is part of our text line but not of LS line
// paragraph width == 0 means format width is unlimited
int formatWidth = (paragraphWidth <= 0 ? Constants.InfiniteWidth : paragraphWidth);
formatWidth = formatWidth - _pap.ParagraphIndent;
// sanitize the format width value before passing to LS
formatWidth = Math.Max(formatWidth, 0);
formatWidth = Math.Min(formatWidth, Constants.InfiniteWidth);
return formatWidth;
}
///
/// Fetch text run and character string associated with it
///
///
/// Critical: This code has unsafe code block that uses pointers.
/// TreatAsSafe: This code does not expose the pointers.
///
[SecurityCritical, SecurityTreatAsSafe]
internal CharacterBufferRange FetchTextRun(
int cpFetch,
int cpFirst,
out TextRun textRun,
out int runLength
)
{
int offsetToFirstCp;
textRun = _runCache.FetchTextRun(this, cpFetch, cpFirst, out offsetToFirstCp, out runLength);
CharacterBufferRange charString;
switch (TextRunInfo.GetRunType(textRun))
{
case Plsrun.Text:
{
CharacterBufferReference charBufferRef = textRun.CharacterBufferReference;
charString = new CharacterBufferRange(
charBufferRef.CharacterBuffer,
charBufferRef.OffsetToFirstChar + offsetToFirstCp,
runLength
);
break;
}
case Plsrun.InlineObject:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
charString = new CharacterBufferRange((char*) TextStore.PwchObjectReplacement, 1);
}
break;
case Plsrun.LineBreak:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
//
// Line break is to be represented as "Line Separator" such that
// it doesn't terminate the optimal paragraph formatting session, but still breaks the line
// unambiguously.
//
charString = new CharacterBufferRange((char*) TextStore.PwchLineSeparator, 1);
}
break;
case Plsrun.ParaBreak:
Debug.Assert(offsetToFirstCp == 0);
unsafe
{
//
// Paragraph break is special as it also terminates the paragraph.
// It should be represented as "Paragraph Separator" such that it will be correctly handled
// in Bidi and Optimal paragraph formatting.
//
charString = new CharacterBufferRange((char*) TextStore.PwchParaSeparator, 1);
}
break;
case Plsrun.Hidden:
unsafe
{
charString = new CharacterBufferRange((char*) TextStore.PwchHidden, 1);
}
break;
default:
charString = CharacterBufferRange.Empty;
break;
}
return charString;
}
///
/// Get text immediately preceding cpLimit.
///
internal TextSpan GetPrecedingText(int cpLimit)
{
return _runCache.GetPrecedingText(_textSource, cpLimit);
}
///
/// Current number substitution propeties
///
internal DigitState DigitState
{
get { return _digitState; }
}
///
/// Distance from line start to where text starts
///
internal int TextIndent
{
get { return _textIndent; }
}
}
}
// 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
- XmlChoiceIdentifierAttribute.cs
- XmlAtomErrorReader.cs
- DataRecordInternal.cs
- ParameterElement.cs
- MethodCallExpression.cs
- glyphs.cs
- SqlAliasesReferenced.cs
- ToolStripDesigner.cs
- XmlSerializationGeneratedCode.cs
- EventNotify.cs
- TextEndOfSegment.cs
- CountdownEvent.cs
- dataSvcMapFileLoader.cs
- MenuItemCollection.cs
- XD.cs
- ResourcesBuildProvider.cs
- Geometry3D.cs
- ImageFormatConverter.cs
- TemplatingOptionsDialog.cs
- GeneralTransformGroup.cs
- TreeWalker.cs
- UnknownWrapper.cs
- FilteredXmlReader.cs
- RichTextBoxAutomationPeer.cs
- DispatcherHookEventArgs.cs
- SchemaRegistration.cs
- ExpandedWrapper.cs
- TableRowsCollectionEditor.cs
- CollectionViewProxy.cs
- FormViewInsertedEventArgs.cs
- TransformDescriptor.cs
- ListBoxChrome.cs
- DataGridGeneralPage.cs
- IApplicationTrustManager.cs
- RedistVersionInfo.cs
- PartialClassGenerationTask.cs
- ComponentGuaranteesAttribute.cs
- ParamArrayAttribute.cs
- SafeCryptContextHandle.cs
- recordstatescratchpad.cs
- UrlPath.cs
- RedistVersionInfo.cs
- CommonObjectSecurity.cs
- Setter.cs
- AnnotationStore.cs
- QueueTransferProtocol.cs
- GridViewColumnCollection.cs
- SqlFormatter.cs
- AuthenticationModuleElement.cs
- XmlSchemas.cs
- UnsafeNativeMethods.cs
- SequentialOutput.cs
- TextRunCache.cs
- SqlDataSourceParameterParser.cs
- TemplateColumn.cs
- NaturalLanguageHyphenator.cs
- PropertyCollection.cs
- DrawTreeNodeEventArgs.cs
- CellIdBoolean.cs
- NameObjectCollectionBase.cs
- SecurityDocument.cs
- DayRenderEvent.cs
- SortQuery.cs
- XhtmlConformanceSection.cs
- OracleBFile.cs
- ProjectionPathBuilder.cs
- CommentEmitter.cs
- PropertyEntry.cs
- PartialTrustHelpers.cs
- ObjectDataSourceSelectingEventArgs.cs
- UserPersonalizationStateInfo.cs
- XmlLoader.cs
- MergeFilterQuery.cs
- PointCollectionConverter.cs
- DurationConverter.cs
- DataGridViewCellValidatingEventArgs.cs
- VirtualPathData.cs
- RowsCopiedEventArgs.cs
- WindowsIdentity.cs
- DbgCompiler.cs
- FixedBufferAttribute.cs
- ProviderConnectionPoint.cs
- HierarchicalDataBoundControl.cs
- FixedTextPointer.cs
- CompilerWrapper.cs
- ItemList.cs
- _UriTypeConverter.cs
- DataGridRowAutomationPeer.cs
- PlatformNotSupportedException.cs
- VisualTarget.cs
- XmlSchemaAll.cs
- RuntimeIdentifierPropertyAttribute.cs
- VisualTarget.cs
- PrintPreviewControl.cs
- SqlErrorCollection.cs
- ReadOnlyHierarchicalDataSourceView.cs
- InterleavedZipPartStream.cs
- RefreshPropertiesAttribute.cs
- WebPartHelpVerb.cs
- ObjectSpanRewriter.cs