[amd64/tramp] hide interpreter specific trampoline behind ifdef
[mono.git] / mcs / class / referencesource / System.Activities.Presentation / System.Activities.Presentation / System / Activities / Presentation / View / AutoScrollHelper.cs
1 //----------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //----------------------------------------------------------------
4
5 namespace System.Activities.Presentation.View
6 {
7     using System;
8     using System.Windows;
9     using System.Windows.Media;
10     using System.Windows.Controls;
11     using System.Windows.Input;
12
13     internal static class AutoScrollHelper
14     {
15         const int scrollBuffer = 30;
16
17         public static void AutoScroll(MouseEventArgs e, DependencyObject element, double offsetPerScroll)
18         {
19             FrameworkElement logicalView = element as FrameworkElement;
20             while (element != null)
21             {
22                 element = VisualTreeHelper.GetParent(element);
23                 if (element != null && element is ScrollViewer)
24                 {
25                     break;
26                 }
27             }
28             ScrollViewer scrollViewer = element as ScrollViewer;
29             if (scrollViewer != null)
30             {                
31                 AutoScroll(e.GetPosition(scrollViewer), scrollViewer, logicalView != null ? e.GetPosition(logicalView) : (Point?)null, logicalView,
32                      25, 25, offsetPerScroll);
33             }
34         }
35
36         public static void AutoScroll(DragEventArgs e, ScrollViewer scrollViewer, double offsetPerScroll)
37         {
38             AutoScroll(e.GetPosition(scrollViewer), scrollViewer, offsetPerScroll);
39         }
40
41         public static void AutoScroll(Point position, ScrollViewer scrollViewer, double offsetPerScroll)
42         {
43             AutoScroll(position, scrollViewer, null, null,
44                 50, 50, offsetPerScroll);
45         }
46
47         static void AutoScroll(Point positionInScrollViewer, ScrollViewer scrollViewer, Point? positionInLogicalView, FrameworkElement logicalView, double scrollOnDragThresholdX, double scrollOnDragThresholdY, double scrollOnDragOffset)
48         {
49             double scrollViewerWidth = scrollViewer.ActualWidth;
50             double scrollViewerHeight = scrollViewer.ActualHeight;
51             
52             double logicalViewWidth = 0;
53             double logicalViewHeight = 0;
54             if (logicalView != null)
55             {
56                 logicalViewWidth = logicalView.ActualWidth;
57                 logicalViewHeight = logicalView.ActualHeight;
58             }             
59             
60             double heightToScroll = 0;
61             double widthToScroll = 0;
62
63             if (positionInScrollViewer.X > (scrollViewerWidth - scrollOnDragThresholdX)
64                 && (positionInLogicalView == null
65                    || positionInLogicalView.Value.X < (logicalViewWidth - scrollBuffer)))
66             {
67                 widthToScroll = scrollOnDragOffset;
68             }
69             else if (positionInScrollViewer.X < scrollOnDragThresholdX
70                 && (positionInLogicalView == null
71                    || positionInLogicalView.Value.X > scrollBuffer))
72             {
73                 widthToScroll = -scrollOnDragOffset;
74             }
75
76             if (positionInScrollViewer.Y > (scrollViewerHeight - scrollOnDragThresholdY)
77                 && (positionInLogicalView == null
78                     || positionInLogicalView.Value.Y < logicalViewHeight - scrollBuffer))
79             {
80                 heightToScroll = scrollOnDragOffset;
81             }
82             else if (positionInScrollViewer.Y < scrollOnDragThresholdY
83                 && (positionInLogicalView == null
84                    || positionInLogicalView.Value.Y > scrollBuffer))
85             {
86                 heightToScroll = -scrollOnDragOffset;
87             }
88
89             if (widthToScroll != 0 || heightToScroll != 0)
90             {
91                 scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + heightToScroll);
92                 scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + widthToScroll);
93             }
94         }
95     }
96 }