Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / MS / Internal / documents / ScrollData.cs / 1 / ScrollData.cs
//----------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
// File: ScrollData.cs
//
// Description: IScrollInfo implementation helper for FlowDocumentView, TextBoxView.
//
//---------------------------------------------------------------------------
namespace MS.Internal.Documents
{
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using MS.Internal;
// IScrollInfo implementation helper for FlowDocumentView, TextBoxView.
internal class ScrollData
{
//-------------------------------------------------------------------
//
// Internal Methods
//
//-------------------------------------------------------------------
#region Internal Methods
///
///
///
internal void LineUp(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y - ScrollViewer._scrollLineDelta);
}
///
///
///
internal void LineDown(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y + ScrollViewer._scrollLineDelta);
}
///
///
///
internal void LineLeft(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X - ScrollViewer._scrollLineDelta);
}
///
///
///
internal void LineRight(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X + ScrollViewer._scrollLineDelta);
}
///
///
///
internal void PageUp(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y - _viewport.Height);
}
///
///
///
internal void PageDown(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y + _viewport.Height);
}
///
///
///
internal void PageLeft(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X - _viewport.Width);
}
///
///
///
internal void PageRight(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X + _viewport.Width);
}
///
///
///
internal void MouseWheelUp(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y - ScrollViewer._mouseWheelDelta);
}
///
///
///
internal void MouseWheelDown(UIElement owner)
{
SetVerticalOffset(owner, _offset.Y + ScrollViewer._mouseWheelDelta);
}
///
///
///
internal void MouseWheelLeft(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X - ScrollViewer._mouseWheelDelta);
}
///
///
///
internal void MouseWheelRight(UIElement owner)
{
SetHorizontalOffset(owner, _offset.X + ScrollViewer._mouseWheelDelta);
}
///
///
///
internal void SetHorizontalOffset(UIElement owner, double offset)
{
if (!this.CanHorizontallyScroll)
{
return;
}
offset = Math.Max(0, Math.Min(_extent.Width - _viewport.Width, offset));
if (!DoubleUtil.AreClose(offset, _offset.X))
{
_offset.X = offset;
owner.InvalidateArrange();
if (_scrollOwner != null)
{
_scrollOwner.InvalidateScrollInfo();
}
}
}
///
///
///
internal void SetVerticalOffset(UIElement owner, double offset)
{
if (!this.CanVerticallyScroll)
{
return;
}
offset = Math.Max(0, Math.Min(_extent.Height - _viewport.Height, offset));
if (!DoubleUtil.AreClose(offset, _offset.Y))
{
_offset.Y = offset;
owner.InvalidateArrange();
if (_scrollOwner != null)
{
_scrollOwner.InvalidateScrollInfo();
}
}
}
///
///
///
internal Rect MakeVisible(UIElement owner, Visual visual, Rect rectangle)
{
// We can only work on visuals that are us or children.
// An empty rect has no size or position. We can't meaningfully use it.
if (rectangle.IsEmpty ||
visual == null ||
(visual != owner && !owner.IsAncestorOf(visual)))
{
return Rect.Empty;
}
// Compute the child's rect relative to (0,0) in our coordinate space.
GeneralTransform childTransform = visual.TransformToAncestor(owner);
rectangle = childTransform.TransformBounds(rectangle);
// Initialize the viewport
Rect viewport = new Rect(_offset.X, _offset.Y, _viewport.Width, _viewport.Height);
rectangle.X += viewport.X;
rectangle.Y += viewport.Y;
// Compute the offsets required to minimally scroll the child maximally into view.
double minX = ComputeScrollOffset(viewport.Left, viewport.Right, rectangle.Left, rectangle.Right);
double minY = ComputeScrollOffset(viewport.Top, viewport.Bottom, rectangle.Top, rectangle.Bottom);
// We have computed the scrolling offsets; scroll to them.
SetHorizontalOffset(owner, minX);
SetVerticalOffset(owner, minY);
// Compute the visible rectangle of the child relative to the viewport.
if (this.CanHorizontallyScroll)
{
viewport.X = minX;
}
else
{
// munge the intersection
rectangle.X = viewport.X;
}
if (this.CanVerticallyScroll)
{
viewport.Y = minY;
}
else
{
// munge the intersection
rectangle.Y = viewport.Y;
}
rectangle.Intersect(viewport);
if (!rectangle.IsEmpty)
{
rectangle.X -= viewport.X;
rectangle.Y -= viewport.Y;
}
// Return the rectangle
return rectangle;
}
///
///
///
internal void SetScrollOwner(UIElement owner, ScrollViewer value)
{
if (value != _scrollOwner)
{
// Reset cached scroll info.
_disableHorizonalScroll = false;
_disableVerticalScroll = false;
_offset = new Vector();
_viewport = new Size();
_extent = new Size();
_scrollOwner = value;
owner.InvalidateArrange();
}
}
#endregion Internal Methods
//--------------------------------------------------------------------
//
// Internal Properties
//
//-------------------------------------------------------------------
#region Internal Properties
///
///
///
internal bool CanVerticallyScroll
{
get
{
return !_disableVerticalScroll;
}
set
{
_disableVerticalScroll = !value;
}
}
///
///
///
internal bool CanHorizontallyScroll
{
get
{
return !_disableHorizonalScroll;
}
set
{
_disableHorizonalScroll = !value;
}
}
///
///
///
internal double ExtentWidth
{
get
{
return _extent.Width;
}
set
{
_extent.Width = value;
}
}
///
///
///
internal double ExtentHeight
{
get
{
return _extent.Height;
}
set
{
_extent.Height = value;
}
}
///
///
///
internal double ViewportWidth
{
get
{
return _viewport.Width;
}
}
///
///
///
internal double ViewportHeight
{
get
{
return _viewport.Height;
}
}
///
///
///
internal double HorizontalOffset
{
get
{
return _offset.X;
}
}
///
///
///
internal double VerticalOffset
{
get
{
return _offset.Y;
}
}
///
///
///
internal ScrollViewer ScrollOwner
{
get
{
return _scrollOwner;
}
}
// HorizontalOffset/VerticalOffset as a Vector.
internal Vector Offset
{
get
{
return _offset;
}
set
{
_offset = value;
}
}
// ExtenttWidth/ExtentHeight as a Size.
internal Size Extent
{
get
{
return _extent;
}
set
{
_extent = value;
}
}
// ViewportWidth/ViewportHeight as a Size.
internal Size Viewport
{
get
{
return _viewport;
}
set
{
_viewport = value;
}
}
#endregion Internal Properties
//--------------------------------------------------------------------
//
// Private Methods
//
//--------------------------------------------------------------------
#region Private Methods
///
/// Compute scroll offset for child rectangle.
///
private double ComputeScrollOffset(double topView, double bottomView, double topChild, double bottomChild)
{
// # CHILD POSITION REMEDY
// 1 Above viewport Align top edge of child & viewport
// 2 Below viewport Align top edge of child & viewport
// 3 Entirely within viewport No scroll
// 4 Spanning viewport Align top edge of child & viewport
//
// Note: "Above viewport" = childTop above viewportTop, childBottom above viewportBottom
// "Below viewport" = childTop below viewportTop, childBottom below viewportBottom
// These child thus may overlap with the viewport, but will scroll the same direction/
bool topInView = DoubleUtil.GreaterThanOrClose(topChild, topView) && DoubleUtil.LessThan(topChild, bottomView);
bool bottomInView = DoubleUtil.LessThanOrClose(bottomChild, bottomView) && DoubleUtil.GreaterThan(bottomChild, topView);
double position;
if (topInView && bottomInView)
{
position = topView;
}
else
{
position = topChild;
}
return position;
}
#endregion Private Methods
//-------------------------------------------------------------------
//
// Private Fields
//
//--------------------------------------------------------------------
#region Private Fields
private bool _disableHorizonalScroll;
private bool _disableVerticalScroll;
private Vector _offset;
private Size _viewport;
private Size _extent;
private ScrollViewer _scrollOwner;
#endregion Private 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
- ServiceHttpHandlerFactory.cs
- StylusPointPropertyId.cs
- _SafeNetHandles.cs
- PageHandlerFactory.cs
- XmlIlTypeHelper.cs
- HtmlInputImage.cs
- XPathNodeList.cs
- XmlIlTypeHelper.cs
- WebServiceClientProxyGenerator.cs
- ItemCheckEvent.cs
- StringSorter.cs
- Ipv6Element.cs
- DataBindingExpressionBuilder.cs
- MenuItemAutomationPeer.cs
- ThaiBuddhistCalendar.cs
- KeySplineConverter.cs
- lengthconverter.cs
- Code.cs
- BezierSegment.cs
- RuleProcessor.cs
- UnsafeNativeMethods.cs
- SafeTimerHandle.cs
- RtfFormatStack.cs
- MessageEncodingBindingElement.cs
- ObjectQueryProvider.cs
- DescendantBaseQuery.cs
- ConnectionsZone.cs
- SQLInt16.cs
- InvariantComparer.cs
- Attributes.cs
- EventLogHandle.cs
- SafeBitVector32.cs
- LocalBuilder.cs
- DataSourceDesigner.cs
- PropertyDescriptorComparer.cs
- TraceProvider.cs
- sqlnorm.cs
- ScriptingJsonSerializationSection.cs
- ClonableStack.cs
- DateTimeOffset.cs
- TextLineResult.cs
- NetSectionGroup.cs
- CertificateManager.cs
- AspNetSynchronizationContext.cs
- Query.cs
- WebPageTraceListener.cs
- LocalizableResourceBuilder.cs
- BezierSegment.cs
- AsyncPostBackErrorEventArgs.cs
- NotificationContext.cs
- TextRangeEditLists.cs
- TypeInfo.cs
- QueuedDeliveryRequirementsMode.cs
- TransformerConfigurationWizardBase.cs
- AnnotationResource.cs
- AsymmetricKeyExchangeDeformatter.cs
- ConfigXmlSignificantWhitespace.cs
- ReferenceEqualityComparer.cs
- HttpContext.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs
- NonVisualControlAttribute.cs
- SpecialTypeDataContract.cs
- CultureInfoConverter.cs
- XpsDocument.cs
- SqlUserDefinedAggregateAttribute.cs
- BaseHashHelper.cs
- XPathDocumentBuilder.cs
- QueryContinueDragEventArgs.cs
- DataObjectPastingEventArgs.cs
- DecoderFallbackWithFailureFlag.cs
- NameSpaceEvent.cs
- ListControlStringCollectionEditor.cs
- XmlDocumentViewSchema.cs
- PeerApplication.cs
- WebPartDisplayModeCollection.cs
- ProcessModelInfo.cs
- DataBindEngine.cs
- Validator.cs
- JavascriptCallbackBehaviorAttribute.cs
- ToolboxItemFilterAttribute.cs
- DecoderNLS.cs
- PageVisual.cs
- HttpHandlerActionCollection.cs
- ZipIOBlockManager.cs
- Dictionary.cs
- WebPartConnectionsConnectVerb.cs
- ActivityTypeCodeDomSerializer.cs
- ControlIdConverter.cs
- DataGridViewSelectedCellCollection.cs
- ServiceObjectContainer.cs
- ExternalException.cs
- ContainerParaClient.cs
- ExpiredSecurityTokenException.cs
- PackagePartCollection.cs
- D3DImage.cs
- AppDomainGrammarProxy.cs
- ComponentDispatcher.cs
- XmlAtomicValue.cs
- AssemblyResourceLoader.cs
- DocumentPage.cs