Files
MicrosoftIris/UIX/Microsoft/Iris/Navigation/NavigationServices.cs
T
2022-03-03 08:14:05 -06:00

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,
}
}
}