mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
299 lines
12 KiB
C#
299 lines
12 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Microsoft.Iris.Navigation.NavigationServices
|
|
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
|
|
// Assembly location: C:\Program Files\Zune\UIX.dll
|
|
|
|
using Microsoft.Iris.Debug;
|
|
using Microsoft.Iris.Library;
|
|
using Microsoft.Iris.Render;
|
|
using Microsoft.Iris.RenderAPI.Drawing;
|
|
using Microsoft.Iris.Session;
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
|
|
namespace Microsoft.Iris.Navigation
|
|
{
|
|
internal static class NavigationServices
|
|
{
|
|
private static float s_originNear = 0.0f;
|
|
private static float s_originSize = 0.0f;
|
|
private static NavigationServices.SearchOrientation s_originOrientation = SearchOrientation.None;
|
|
|
|
public static bool FindNextPeer(
|
|
INavigationSite originSite,
|
|
Direction searchDirection,
|
|
RectangleF startRectangleF,
|
|
out INavigationSite resultSite)
|
|
{
|
|
INavigationSite navigationSite1 = originSite;
|
|
Debug.Trace.IsCategoryEnabled(TraceCategory.Navigation, 2);
|
|
if (startRectangleF.IsEmpty && !GetDefaultOutboundStartRect(originSite, out startRectangleF))
|
|
{
|
|
resultSite = null;
|
|
return false;
|
|
}
|
|
ProcessDirectionalMemory(ref startRectangleF, searchDirection);
|
|
INavigationSite parentTabGroup = FindParentTabGroup(navigationSite1, searchDirection);
|
|
if (parentTabGroup != null)
|
|
navigationSite1 = parentTabGroup;
|
|
INavigationSite boundingSite = FindBoundingSite(navigationSite1, searchDirection);
|
|
INavigationSite navigationSite2 = null;
|
|
NavigationItem itemForSite1 = NavigationItem.CreateItemForSite(navigationSite1, searchDirection, false);
|
|
if (itemForSite1 != null)
|
|
{
|
|
NavigationItem navigationItem1 = itemForSite1.SearchUpTree(startRectangleF, null, null);
|
|
if (navigationItem1 != null)
|
|
navigationSite2 = navigationItem1.Subject;
|
|
if (navigationSite2 == null && boundingSite != null && NavigationItem.IsWrappingSite(boundingSite, searchDirection))
|
|
{
|
|
Vector3 positionPxlVector;
|
|
Vector3 sizePxlVector;
|
|
boundingSite.ComputeBounds(out positionPxlVector, out sizePxlVector);
|
|
RectangleF excludeRectangleF = new RectangleF(positionPxlVector.X, positionPxlVector.Y, sizePxlVector.X, sizePxlVector.Y);
|
|
AdjustStartRectForSimulatedEntry(searchDirection, excludeRectangleF, ref startRectangleF);
|
|
NavigationItem itemForSite2 = NavigationItem.CreateItemForSite(boundingSite, searchDirection, true);
|
|
if (itemForSite2 != null)
|
|
{
|
|
NavigationItem navigationItem2 = itemForSite2.SearchDownTree(startRectangleF, true, boundingSite, originSite);
|
|
if (navigationItem2 != null)
|
|
navigationSite2 = navigationItem2.Subject;
|
|
}
|
|
if (navigationSite2 == originSite)
|
|
navigationSite2 = null;
|
|
}
|
|
}
|
|
bool flag = navigationSite2 != null;
|
|
resultSite = navigationSite2;
|
|
return flag || boundingSite != null;
|
|
}
|
|
|
|
public static bool FindFromPoint(
|
|
INavigationSite originSite,
|
|
PointF pt,
|
|
out INavigationSite result)
|
|
{
|
|
return FindFromPoint(originSite, Direction.Next, pt, out result);
|
|
}
|
|
|
|
public static bool FindFromPoint(
|
|
INavigationSite originSite,
|
|
Direction bias,
|
|
PointF pt,
|
|
out INavigationSite result)
|
|
{
|
|
ResetDirectionalMemory();
|
|
return new FindFromPointWorker(originSite, bias).FindFromPoint(pt, out result);
|
|
}
|
|
|
|
public static bool FindNextWithin(
|
|
INavigationSite originSite,
|
|
Direction searchDirection,
|
|
RectangleF startRectangleF,
|
|
out INavigationSite resultSite)
|
|
{
|
|
Debug.Trace.IsCategoryEnabled(TraceCategory.Navigation, 2);
|
|
if (startRectangleF.IsEmpty && !GetDefaultInboundStartRect(originSite, searchDirection, out startRectangleF))
|
|
{
|
|
resultSite = null;
|
|
return false;
|
|
}
|
|
ProcessDirectionalMemory(ref startRectangleF, searchDirection);
|
|
INavigationSite navigationSite = null;
|
|
NavigationItem itemForSite = NavigationItem.CreateItemForSite(originSite, searchDirection, true);
|
|
if (itemForSite != null)
|
|
{
|
|
NavigationItem navigationItem = itemForSite.SearchDownTree(startRectangleF, true, null, null);
|
|
if (navigationItem != null)
|
|
navigationSite = navigationItem.Subject;
|
|
}
|
|
bool flag = navigationSite != null;
|
|
resultSite = navigationSite;
|
|
return flag;
|
|
}
|
|
|
|
public static void SeedDefaultFocus(INavigationSite focusSite)
|
|
{
|
|
if (focusSite == null)
|
|
return;
|
|
NavigationItem.RememberFocus(focusSite);
|
|
}
|
|
|
|
public static void ClearDefaultFocus(INavigationSite startSite) => NavigationItem.ClearFocus(startSite);
|
|
|
|
public static bool GetDefaultInboundStartRect(
|
|
INavigationSite originSite,
|
|
Direction searchDirection,
|
|
out RectangleF startRectangleF)
|
|
{
|
|
if (!GetDefaultOutboundStartRect(originSite, out startRectangleF))
|
|
return false;
|
|
AdjustStartRectForSimulatedEntry(searchDirection, startRectangleF, ref startRectangleF);
|
|
return true;
|
|
}
|
|
|
|
public static bool GetDefaultOutboundStartRect(
|
|
INavigationSite originSite,
|
|
out RectangleF startRectangleF)
|
|
{
|
|
if (!originSite.Visible)
|
|
{
|
|
startRectangleF = RectangleF.Zero;
|
|
return false;
|
|
}
|
|
Vector3 positionPxlVector;
|
|
Vector3 sizePxlVector;
|
|
originSite.ComputeBounds(out positionPxlVector, out sizePxlVector);
|
|
startRectangleF = new RectangleF(positionPxlVector.X, positionPxlVector.Y, sizePxlVector.X, sizePxlVector.Y);
|
|
return true;
|
|
}
|
|
|
|
private static void ResetDirectionalMemory() => UpdateDirectionalMemoryInfo(RectangleF.Zero, Direction.Next);
|
|
|
|
private static bool UpdateDirectionalMemoryInfo(
|
|
RectangleF startRectangleF,
|
|
Direction searchDirection)
|
|
{
|
|
float num1 = 0.0f;
|
|
float num2 = 0.0f;
|
|
NavigationServices.SearchOrientation searchOrientation = SearchOrientation.None;
|
|
switch (searchDirection)
|
|
{
|
|
case Direction.North:
|
|
case Direction.South:
|
|
searchOrientation = SearchOrientation.Vertical;
|
|
num1 = startRectangleF.X;
|
|
num2 = startRectangleF.Width;
|
|
break;
|
|
case Direction.East:
|
|
case Direction.West:
|
|
searchOrientation = SearchOrientation.Horizontal;
|
|
num1 = startRectangleF.Y;
|
|
num2 = startRectangleF.Height;
|
|
break;
|
|
case Direction.Previous:
|
|
case Direction.Next:
|
|
searchOrientation = SearchOrientation.None;
|
|
break;
|
|
}
|
|
bool flag = s_originOrientation != searchOrientation;
|
|
if (flag)
|
|
{
|
|
s_originOrientation = searchOrientation;
|
|
s_originNear = num1;
|
|
s_originSize = num2;
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
private static void ProcessDirectionalMemory(
|
|
ref RectangleF startRectangleF,
|
|
Direction searchDirection)
|
|
{
|
|
if (UpdateDirectionalMemoryInfo(startRectangleF, searchDirection))
|
|
return;
|
|
bool flag = true;
|
|
switch (s_originOrientation)
|
|
{
|
|
case SearchOrientation.Horizontal:
|
|
startRectangleF.Y = s_originNear;
|
|
startRectangleF.Height = s_originSize;
|
|
break;
|
|
case SearchOrientation.Vertical:
|
|
startRectangleF.X = s_originNear;
|
|
startRectangleF.Width = s_originSize;
|
|
break;
|
|
case SearchOrientation.None:
|
|
flag = false;
|
|
break;
|
|
}
|
|
int num = flag ? 1 : 0;
|
|
}
|
|
|
|
private static INavigationSite FindBoundingSite(
|
|
INavigationSite searchSite,
|
|
Direction searchDirection)
|
|
{
|
|
while (searchSite != null && !NavigationItem.IsBoundingSite(searchSite, searchDirection))
|
|
searchSite = searchSite.Parent;
|
|
return searchSite;
|
|
}
|
|
|
|
private static INavigationSite FindParentTabGroup(
|
|
INavigationSite targetSite,
|
|
Direction searchDirection)
|
|
{
|
|
switch (searchDirection)
|
|
{
|
|
case Direction.Previous:
|
|
case Direction.Next:
|
|
for (; targetSite != null; targetSite = targetSite.Parent)
|
|
{
|
|
if (NavigationItem.IsBoundingSite(targetSite, searchDirection))
|
|
return null;
|
|
if (NavigationItem.IsTabGroup(targetSite))
|
|
break;
|
|
}
|
|
return targetSite;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static void AdjustStartRectForSimulatedEntry(
|
|
Direction searchDirection,
|
|
RectangleF excludeRectangleF,
|
|
ref RectangleF startRectangleF)
|
|
{
|
|
switch (searchDirection)
|
|
{
|
|
case Direction.North:
|
|
startRectangleF.Y = excludeRectangleF.Bottom;
|
|
break;
|
|
case Direction.South:
|
|
startRectangleF.Y = excludeRectangleF.Top - startRectangleF.Height;
|
|
break;
|
|
case Direction.East:
|
|
startRectangleF.X = excludeRectangleF.Left - startRectangleF.Width;
|
|
break;
|
|
case Direction.West:
|
|
startRectangleF.X = excludeRectangleF.Right;
|
|
break;
|
|
}
|
|
}
|
|
|
|
[Conditional("DEBUG")]
|
|
private static void DumpSiteTree(INavigationSite branchSite, INavigationSite markSite)
|
|
{
|
|
int num = branchSite.IsLogicalJunction ? 1 : 0;
|
|
if (branchSite.Navigability != NavigationClass.None)
|
|
InvariantString.Format(", Class: {0}", branchSite.Navigability);
|
|
if (branchSite.Mode != NavigationPolicies.None)
|
|
InvariantString.Format(", Mode: {0}", branchSite.Mode);
|
|
foreach (INavigationSite child in branchSite.Children)
|
|
;
|
|
}
|
|
|
|
[Conditional("DEBUG")]
|
|
private static void DumpSiteTreeContaining(INavigationSite originSite)
|
|
{
|
|
INavigationSite navigationSite = originSite;
|
|
while (true)
|
|
{
|
|
INavigationSite parent = navigationSite.Parent;
|
|
if (parent != null)
|
|
navigationSite = parent;
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
|
|
private enum SearchOrientation
|
|
{
|
|
Horizontal,
|
|
Vertical,
|
|
None,
|
|
}
|
|
}
|
|
}
|