Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / MS / Internal / PtsHost / CellParaClient.cs / 1 / CellParaClient.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Para client for cell // // History: // 05/19/2003 : [....] - Created // //--------------------------------------------------------------------------- using MS.Internal.Text; using MS.Internal.Documents; using MS.Internal.PtsTable; using System.Security; using System.Windows; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Threading; using System; using System.Diagnostics; using System.Collections.Generic; using System.Collections.ObjectModel; using MS.Internal.PtsHost.UnsafeNativeMethods; namespace MS.Internal.PtsHost { ////// Para client for cell /// internal sealed class CellParaClient : SubpageParaClient { //----------------------------------------------------- // // Constructors // //----------------------------------------------------- #region Constructors ////// Default constructor. /// /// Cell paragraph. /// Table paraclient. internal CellParaClient(CellParagraph cellParagraph, TableParaClient tableParaClient) : base(cellParagraph) { _tableParaClient = tableParaClient; } #endregion Constructors //------------------------------------------------------ // // Public Methods // //----------------------------------------------------- #region Public Methods #endregion Public Methods //------------------------------------------------------ // // Internal Methods // //------------------------------------------------------ #region Internal Methods ////// Arrange. /// /// U offset component of the cell's visual. /// V offset component of the cell's visual. /// Table's rectangle.. (in page flow dir) /// Table's flow direction /// Page context ////// Critical, because: /// a) calls Critical function PTS.FsClearUpdateInfoInSubpage. /// b) calls Critical function PTS.FsTransformRectangle /// Safe - as the parameters passed in are Critical for set. /// [SecurityCritical, SecurityTreatAsSafe] internal void Arrange(int du, int dv, PTS.FSRECT rcTable, FlowDirection tableFlowDirection, PageContext pageContext) { // // Determine cell width based on column widths. // CalculatedColumn[] calculatedColumns = _tableParaClient.CalculatedColumns; Debug.Assert(calculatedColumns != null && (Cell.ColumnIndex + Cell.ColumnSpan) <= calculatedColumns.Length); double durCellSpacing = Table.InternalCellSpacing; double durCellWidth = -durCellSpacing; // find the width sum of all columns the cell spans int i = Cell.ColumnIndex + Cell.ColumnSpan - 1; do { durCellWidth += calculatedColumns[i].DurWidth + durCellSpacing; } while (--i >= ColumnIndex); if(tableFlowDirection != PageFlowDirection) { PTS.FSRECT pageRect = pageContext.PageRect; PTS.Validate(PTS.FsTransformRectangle(PTS.FlowDirectionToFswdir(PageFlowDirection), ref pageRect, ref rcTable, PTS.FlowDirectionToFswdir(tableFlowDirection), out rcTable)); } _rect.u = du + rcTable.u; _rect.v = dv + rcTable.v; _rect.du = TextDpi.ToTextDpi(durCellWidth); _rect.dv = TextDpi.ToTextDpi(_arrangeHeight); if(tableFlowDirection != PageFlowDirection) { PTS.FSRECT pageRect = pageContext.PageRect; PTS.Validate(PTS.FsTransformRectangle(PTS.FlowDirectionToFswdir(tableFlowDirection), ref pageRect, ref _rect, PTS.FlowDirectionToFswdir(PageFlowDirection), out _rect)); } _flowDirectionParent = tableFlowDirection; _flowDirection = (FlowDirection)Paragraph.Element.GetValue(FrameworkElement.FlowDirectionProperty); _pageContext = pageContext; OnArrange(); if(_paraHandle.Value != IntPtr.Zero) { PTS.Validate(PTS.FsClearUpdateInfoInSubpage(PtsContext.Context, _paraHandle.Value), PtsContext); } } ////// ValidateVisual. /// internal void ValidateVisual() { ValidateVisual(PTS.FSKUPDATE.fskupdNew); } ////// FormatCellFinite - Calls same apis that PTS does for formatting /// /// Subpage size. /// Subpage break record. /// Is an empty cell ok? /// Text Direction /// Suppress hard break before first para /// Format result /// dvr Used /// Resultant break record for end of page ////// Critical - as this calls the Critical function FormatParaFinite and Critical /// setter on _paraHandle.Value. /// [SecurityCritical] internal void FormatCellFinite(Size subpageSize, IntPtr breakRecordIn, bool isEmptyOk, uint fswdir, PTS.FSKSUPPRESSHARDBREAKBEFOREFIRSTPARA fsksuppresshardbreakbeforefirstparaIn, out PTS.FSFMTR fsfmtr, out int dvrUsed, out IntPtr breakRecordOut) { IntPtr pfspara; PTS.FSBBOX fsbbox; IntPtr pmcsclientOut; PTS.FSKCLEAR fskclearOut; int dvrTopSpace; PTS.FSPAP fspap; if(CellParagraph.StructuralCache.DtrList != null && breakRecordIn != null) { CellParagraph.InvalidateStructure(TextContainerHelper.GetCPFromElement(CellParagraph.StructuralCache.TextContainer, CellParagraph.Element, ElementEdge.BeforeStart)); } // Ensures segment is created for paragraph fspap = new PTS.FSPAP(); CellParagraph.GetParaProperties(ref fspap); PTS.FSRECT rectCell; rectCell = new PTS.FSRECT(); rectCell.u = rectCell.v = 0; rectCell.du = TextDpi.ToTextDpi(subpageSize.Width); rectCell.dv = TextDpi.ToTextDpi(subpageSize.Height); // Suppress top space if cell is broken, but not otherwise bool suppressTopSpace = (breakRecordIn != IntPtr.Zero) ? true : false; CellParagraph.FormatParaFinite(this, breakRecordIn, PTS.FromBoolean(true), IntPtr.Zero, PTS.FromBoolean(isEmptyOk), PTS.FromBoolean(suppressTopSpace), fswdir, ref rectCell, null, PTS.FSKCLEAR.fskclearNone, fsksuppresshardbreakbeforefirstparaIn, out fsfmtr, out pfspara, out breakRecordOut, out dvrUsed, out fsbbox, out pmcsclientOut, out fskclearOut, out dvrTopSpace); if (pmcsclientOut != IntPtr.Zero) { MarginCollapsingState mcs = PtsContext.HandleToObject(pmcsclientOut) as MarginCollapsingState; PTS.ValidateHandle(mcs); dvrUsed += mcs.Margin; mcs.Dispose(); pmcsclientOut = IntPtr.Zero; } _paraHandle.Value = pfspara; } ////// FormatCellBottomless /// /// Text Direction /// Width of cell (height is specified by row props) /// bottomless format result /// dvr Used ////// Critical - as this calls the Critical setter on _paraHandle.Value. /// Safe - as pfspara which it is set to is generated in the function. /// [SecurityCritical, SecurityTreatAsSafe] internal void FormatCellBottomless(uint fswdir, double width, out PTS.FSFMTRBL fmtrbl, out int dvrUsed) { IntPtr pfspara; PTS.FSBBOX fsbbox; IntPtr pmcsclientOut; PTS.FSKCLEAR fskclearOut; int dvrTopSpace; int fPageBecomesUninterruptable; PTS.FSPAP fspap; if(CellParagraph.StructuralCache.DtrList != null) { CellParagraph.InvalidateStructure(TextContainerHelper.GetCPFromElement(CellParagraph.StructuralCache.TextContainer, CellParagraph.Element, ElementEdge.BeforeStart)); } fspap = new PTS.FSPAP(); CellParagraph.GetParaProperties(ref fspap); CellParagraph.FormatParaBottomless(this, PTS.FromBoolean(false), fswdir, 0, TextDpi.ToTextDpi(width), 0, null, PTS.FSKCLEAR.fskclearNone, PTS.FromBoolean(true), out fmtrbl, out pfspara, out dvrUsed, out fsbbox, out pmcsclientOut, out fskclearOut, out dvrTopSpace, out fPageBecomesUninterruptable); if (pmcsclientOut != IntPtr.Zero) { MarginCollapsingState mcs = PtsContext.HandleToObject(pmcsclientOut) as MarginCollapsingState; PTS.ValidateHandle(mcs); dvrUsed += mcs.Margin; mcs.Dispose(); pmcsclientOut = IntPtr.Zero; } _paraHandle.Value = pfspara; } ////// UpdateBottomlessCell /// /// Text Direction /// Width of cell (height is specified by row props) /// bottomless format result /// dvr Used ////// Critical - as this calls Critical function SubpageParagraph.UpdateBottomlessPara. /// Safe - as the pointer parameter passed in is Critical for set. /// [SecurityCritical, SecurityTreatAsSafe] internal void UpdateBottomlessCell(uint fswdir, double width, out PTS.FSFMTRBL fmtrbl, out int dvrUsed) { IntPtr pmcsclientOut; PTS.FSKCLEAR fskclearOut; PTS.FSBBOX fsbbox; int dvrTopSpace; int fPageBecomesUninterruptable; PTS.FSPAP fspap; fspap = new PTS.FSPAP(); CellParagraph.GetParaProperties(ref fspap); CellParagraph.UpdateBottomlessPara(_paraHandle.Value, this, PTS.FromBoolean(false), fswdir, 0, TextDpi.ToTextDpi(width), 0, null, PTS.FSKCLEAR.fskclearNone, PTS.FromBoolean(true), out fmtrbl, out dvrUsed, out fsbbox, out pmcsclientOut, out fskclearOut, out dvrTopSpace, out fPageBecomesUninterruptable); if (pmcsclientOut != IntPtr.Zero) { MarginCollapsingState mcs = PtsContext.HandleToObject(pmcsclientOut) as MarginCollapsingState; PTS.ValidateHandle(mcs); dvrUsed += mcs.Margin; mcs.Dispose(); pmcsclientOut = IntPtr.Zero; } } ////// /// /// /// /// ///internal Geometry GetTightBoundingGeometryFromTextPositions(ITextPointer startPosition, ITextPointer endPosition, Rect visibleRect) { Geometry geometry = null; // Find out if cell is selected. We consider cell selected if its end tag is crossed by selection. // The asymmetry is important here - it allows to use only normalized positions // and still be able to select individual cells. // Note that this logic is an assumption in textselection unit expansion mechanism // (TexSelection.ExtendSelectionToStructuralUnit method). if (endPosition.CompareTo(Cell.StaticElementEnd) >= 0) { geometry = new RectangleGeometry(_rect.FromTextDpi()); } else { SubpageParagraphResult paragraphResult = (SubpageParagraphResult)(CreateParagraphResult()); ReadOnlyCollection colResults = paragraphResult.Columns; Transform transform; transform = new TranslateTransform(-TextDpi.FromTextDpi(ContentRect.u), -TextDpi.FromTextDpi(ContentRect.v)); visibleRect = transform.TransformBounds(visibleRect); transform = null; geometry = TextDocumentView.GetTightBoundingGeometryFromTextPositionsHelper(colResults[0].Paragraphs, paragraphResult.FloatingElements, startPosition, endPosition, 0.0, visibleRect); if (geometry != null) { // restrict geometry to the cell's content rect boundary. // because of end-of-line / end-of-para simulation calculated geometry could be larger. Rect viewport = new Rect(0, 0, TextDpi.FromTextDpi(ContentRect.du), TextDpi.FromTextDpi(ContentRect.dv)); CaretElement.ClipGeometryByViewport(ref geometry, viewport); transform = new TranslateTransform(TextDpi.FromTextDpi(ContentRect.u), TextDpi.FromTextDpi(ContentRect.v)); CaretElement.AddTransformToGeometry(geometry, transform); } } return (geometry); } /// /// Calculates width of cell /// /// Table owner ///Cell's width internal double CalculateCellWidth(TableParaClient tableParaClient) { Debug.Assert(tableParaClient != null); CalculatedColumn[] calculatedColumns = tableParaClient.CalculatedColumns; Debug.Assert( calculatedColumns != null && (Cell.ColumnIndex + Cell.ColumnSpan) <= calculatedColumns.Length); double durCellSpacing = Table.InternalCellSpacing; double durCellWidth = -durCellSpacing; // find the width sum of all columns the cell spans int i = Cell.ColumnIndex + Cell.ColumnSpan - 1; do { durCellWidth += calculatedColumns[i].DurWidth + durCellSpacing; } while (--i >= Cell.ColumnIndex); Debug.Assert(0 <= durCellWidth); return durCellWidth; } #endregion Internal Methods //----------------------------------------------------- // // Internal Properties // //------------------------------------------------------ #region Internal Properties ////// Cell. /// internal TableCell Cell { get { return (CellParagraph.Cell); } } ////// Table. /// internal Table Table { get { return (Cell.Table); } } ////// Cell paragraph. /// internal CellParagraph CellParagraph { get { return (CellParagraph)_paragraph; } } ////// Returns column index. /// internal int ColumnIndex { get { return (Cell.ColumnIndex); } } ////// Sets height for arrange. /// internal double ArrangeHeight { set { _arrangeHeight = value; } } ////// Table para client /// internal TableParaClient TableParaClient { get { return (_tableParaClient); } } #endregion Internal Properties //----------------------------------------------------- // // Private Fields // //----------------------------------------------------- #region Private Fields private double _arrangeHeight; // height for arrange private TableParaClient _tableParaClient; #endregion Private Fields } internal class CellInfo { ////// C'tor - Just needs the table and cell para clients. /// /// Table para client. /// Cell Para client. internal CellInfo(TableParaClient tpc, CellParaClient cpc) { _rectTable = new Rect(TextDpi.FromTextDpi(tpc.Rect.u), TextDpi.FromTextDpi(tpc.Rect.v), TextDpi.FromTextDpi(tpc.Rect.du), TextDpi.FromTextDpi(tpc.Rect.dv)); _rectCell = new Rect(TextDpi.FromTextDpi(cpc.Rect.u), TextDpi.FromTextDpi(cpc.Rect.v), TextDpi.FromTextDpi(cpc.Rect.du), TextDpi.FromTextDpi(cpc.Rect.dv)); _autofitWidth = tpc.AutofitWidth; _columnWidths = new double[tpc.CalculatedColumns.Length]; for(int index = 0; index < tpc.CalculatedColumns.Length; index++) { _columnWidths[index] = tpc.CalculatedColumns[index].DurWidth; } _cell = cpc.Cell; } ////// Adjusts cells rectangles by a given amount /// /// Table para client. internal void Adjust(Point ptAdjust) { _rectTable.X += ptAdjust.X; _rectTable.Y += ptAdjust.Y; _rectCell.X += ptAdjust.X; _rectCell.Y += ptAdjust.Y; } ////// Cell info is for /// internal TableCell Cell { get { return (_cell); } } ////// Widths of columns in table /// internal double[] TableColumnWidths { get { return (_columnWidths); } } ////// Autofit Width of table /// internal double TableAutofitWidth { get { return (_autofitWidth); } } ////// Area for table /// internal Rect TableArea { get { return (_rectTable); } } ////// Area for cell /// internal Rect CellArea { get { return (_rectCell); } } private Rect _rectCell; private Rect _rectTable; private TableCell _cell; private double[] _columnWidths; private double _autofitWidth; } } // 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
- CheckBoxList.cs
- SmiContextFactory.cs
- UserControlCodeDomTreeGenerator.cs
- AuthenticateEventArgs.cs
- DbConnectionPoolCounters.cs
- SHA1CryptoServiceProvider.cs
- ObjectSpanRewriter.cs
- Utils.cs
- CompositeControl.cs
- HScrollBar.cs
- TextRunCache.cs
- ParserContext.cs
- Point.cs
- TextServicesCompartment.cs
- AmbientValueAttribute.cs
- ComponentResourceManager.cs
- ZoomPercentageConverter.cs
- OleDbStruct.cs
- XmlNodeReader.cs
- ScriptModule.cs
- DrawListViewItemEventArgs.cs
- GatewayDefinition.cs
- ElementProxy.cs
- LogRestartAreaEnumerator.cs
- DbProviderManifest.cs
- ExpandCollapseProviderWrapper.cs
- PlatformCulture.cs
- ClaimTypes.cs
- ScrollViewerAutomationPeer.cs
- PrintDocument.cs
- ContentElement.cs
- WebControlParameterProxy.cs
- RenderDataDrawingContext.cs
- DefaultMemberAttribute.cs
- ContentDisposition.cs
- GacUtil.cs
- XmlSubtreeReader.cs
- Configuration.cs
- XmlSchemaDocumentation.cs
- BitmapDecoder.cs
- WindowsAuthenticationModule.cs
- XmlTextReader.cs
- UiaCoreApi.cs
- MouseGestureValueSerializer.cs
- RadialGradientBrush.cs
- GrowingArray.cs
- ArrayWithOffset.cs
- DocumentSignatureManager.cs
- TargetException.cs
- XmlLangPropertyAttribute.cs
- CssClassPropertyAttribute.cs
- typedescriptorpermission.cs
- ZoomingMessageFilter.cs
- Stylesheet.cs
- HitTestParameters3D.cs
- DataGridViewRowContextMenuStripNeededEventArgs.cs
- AppDomainUnloadedException.cs
- HtmlInputRadioButton.cs
- DocumentViewerConstants.cs
- EntityDataSourceColumn.cs
- ToolstripProfessionalRenderer.cs
- MobileControlPersister.cs
- TextureBrush.cs
- TreeViewEvent.cs
- SmiEventSink_DeferedProcessing.cs
- ByteStreamGeometryContext.cs
- BitmapMetadataEnumerator.cs
- MultiPropertyDescriptorGridEntry.cs
- BitArray.cs
- DbConnectionInternal.cs
- WebResourceUtil.cs
- PerfCounterSection.cs
- ControlAdapter.cs
- GridErrorDlg.cs
- SignatureHelper.cs
- ApplicationManager.cs
- Type.cs
- SoapServerMethod.cs
- NativeMethods.cs
- Win32PrintDialog.cs
- StandardOleMarshalObject.cs
- Brush.cs
- ByteAnimation.cs
- Rect3DValueSerializer.cs
- ReadOnlyAttribute.cs
- FusionWrap.cs
- FormView.cs
- TypeCollectionDesigner.xaml.cs
- SID.cs
- ColumnResult.cs
- CustomAttribute.cs
- VirtualDirectoryMappingCollection.cs
- CodeEntryPointMethod.cs
- SrgsElementFactory.cs
- CqlParserHelpers.cs
- InternalDispatchObject.cs
- ObjectSet.cs
- ReaderContextStackData.cs
- OdbcParameterCollection.cs
- ResponseBodyWriter.cs