Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / TextFormatting / FormatSettings.cs / 1305600 / 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;
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
private TextFormattingMode _textFormattingMode;
private bool _isSideways;
internal FormatSettings(
TextFormatterImp formatter,
TextSource textSource,
TextRunCacheImp runCache,
ParaProp pap,
TextLineBreak previousLineBreak,
bool isSingleLineFormatting,
TextFormattingMode textFormattingMode,
bool isSideways
)
{
_isSideways = isSideways;
_textFormattingMode = textFormattingMode;
_formatter = formatter;
_textSource = textSource;
_runCache = runCache;
_pap = pap;
_digitState = new DigitState();
_previousLineBreak = previousLineBreak;
_maxLineWidth = Constants.IdealInfiniteWidth;
if (isSingleLineFormatting)
{
// Apply text indent on each line in single line mode
_textIndent = _pap.Indent;
}
}
internal TextFormattingMode TextFormattingMode
{
get
{
return _textFormattingMode;
}
}
internal bool IsSideways
{
get
{
return _isSideways;
}
}
///
/// 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.IdealInfiniteWidth;
}
///
/// 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.IdealInfiniteWidth : paragraphWidth);
formatWidth = formatWidth - _pap.ParagraphIndent;
// sanitize the format width value before passing to LS
formatWidth = Math.Max(formatWidth, 0);
formatWidth = Math.Min(formatWidth, Constants.IdealInfiniteWidth);
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
- SiteMapNodeCollection.cs
- TypographyProperties.cs
- TextLineBreak.cs
- AspNetHostingPermission.cs
- SqlUnionizer.cs
- QilStrConcat.cs
- RTLAwareMessageBox.cs
- GridViewCommandEventArgs.cs
- HttpListenerRequestUriBuilder.cs
- DbInsertCommandTree.cs
- SignatureHelper.cs
- SystemIcons.cs
- SrgsRulesCollection.cs
- WasEndpointConfigContainer.cs
- InplaceBitmapMetadataWriter.cs
- ClockController.cs
- SafeCryptHandles.cs
- DataControlExtensions.cs
- SpecularMaterial.cs
- DynamicMethod.cs
- AQNBuilder.cs
- RawStylusInput.cs
- Journaling.cs
- DeflateEmulationStream.cs
- HttpClientCertificate.cs
- CompoundFileStorageReference.cs
- ScrollableControl.cs
- RegistrationServices.cs
- XmlComplianceUtil.cs
- PopupControlService.cs
- BooleanFunctions.cs
- ViewStateModeByIdAttribute.cs
- MetadataProperty.cs
- RangeBaseAutomationPeer.cs
- SocketInformation.cs
- NetworkInformationException.cs
- DropTarget.cs
- DbReferenceCollection.cs
- WebReferencesBuildProvider.cs
- DataTableExtensions.cs
- DBConnectionString.cs
- InfoCardAsymmetricCrypto.cs
- DataTableReaderListener.cs
- AsymmetricAlgorithm.cs
- Button.cs
- Cursors.cs
- TakeOrSkipWhileQueryOperator.cs
- MessageDescription.cs
- DataKeyArray.cs
- ConnectivityStatus.cs
- WindowsListViewGroup.cs
- SamlAdvice.cs
- MergeLocalizationDirectives.cs
- URI.cs
- MethodExpr.cs
- SocketElement.cs
- VisualStyleInformation.cs
- SqlDataSource.cs
- SystemIPAddressInformation.cs
- TransformValueSerializer.cs
- DataQuery.cs
- DeferredElementTreeState.cs
- RequestCachingSection.cs
- UrlPropertyAttribute.cs
- SqlMetaData.cs
- __ComObject.cs
- XmlNodeList.cs
- OdbcUtils.cs
- WebPartMinimizeVerb.cs
- InstanceDataCollectionCollection.cs
- BamlRecordHelper.cs
- ReferentialConstraint.cs
- ReflectionUtil.cs
- InputScope.cs
- CompilerTypeWithParams.cs
- AccessViolationException.cs
- Storyboard.cs
- ScrollEvent.cs
- RichTextBoxConstants.cs
- MonikerHelper.cs
- EventProvider.cs
- TypedRowHandler.cs
- ExternalFile.cs
- SettingsPropertyIsReadOnlyException.cs
- ADConnectionHelper.cs
- XmlAttributeCollection.cs
- MouseGesture.cs
- MD5Cng.cs
- ObservableCollection.cs
- KeyValueInternalCollection.cs
- StreamGeometry.cs
- WorkflowMarkupElementEventArgs.cs
- TemplateInstanceAttribute.cs
- ExpressionWriter.cs
- control.ime.cs
- ContractListAdapter.cs
- TemporaryBitmapFile.cs
- UnknownBitmapEncoder.cs
- ServiceDescriptionReflector.cs
- NamedPermissionSet.cs