SourceCode/PROMS/DotNetBar Source Code/ContainerKeyboardNavigation.cs

207 lines
8.1 KiB
C#

using System;
using System.Text;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
internal class ContainerKeyboardNavigation
{
internal static void ProcessKeyDown(BaseItem container, System.Windows.Forms.KeyEventArgs objArg)
{
if (container.SubItems.Count == 0 || objArg.Handled)
return;
BaseItem objExpanded = container.ExpandedItem();
if (objExpanded != null)
{
objExpanded.InternalKeyDown(objArg);
if (objArg.Handled)
return;
}
eOrientation containerOrientation = container.Orientation;
if (container is ItemContainer)
containerOrientation = ((ItemContainer)container).LayoutOrientation;
if (containerOrientation == eOrientation.Horizontal && (objArg.KeyCode == Keys.Left || objArg.KeyCode == Keys.Right || container.HotSubItem == null && (objArg.KeyCode == Keys.Down || objArg.KeyCode == Keys.Up)) ||
(containerOrientation == eOrientation.Vertical && (objArg.KeyCode == Keys.Up || objArg.KeyCode == Keys.Down || container.HotSubItem == null && (objArg.KeyCode == Keys.Right || objArg.KeyCode == Keys.Left))))
{
// Select next object
if (container.HotSubItem != null)
{
container.HotSubItem.InternalMouseLeave();
if (container.AutoExpand && container.HotSubItem.Expanded)
{
container.HotSubItem.Expanded = false;
}
}
if (objArg.KeyCode == System.Windows.Forms.Keys.Left || objArg.KeyCode == Keys.Up)
{
int iIndex = 0;
if (container.HotSubItem != null)
iIndex = container.SubItems.IndexOf(container.HotSubItem) - 1;
if (iIndex < 0)
iIndex = container.SubItems.Count - 1;
BaseItem objNew = null;
bool bRepeat = false;
do
{
for (int i = iIndex; i >= 0; i--)
{
objNew = container.SubItems[i];
if (CanFocus(objNew))
{
iIndex = i;
break;
}
}
if (!CanFocus(container.SubItems[iIndex]))
{
if (!bRepeat)
{
iIndex = container.SubItems.Count - 1;
bRepeat = true;
}
else
bRepeat = false;
}
else
bRepeat = false;
} while (bRepeat);
container.HotSubItem = container.SubItems[iIndex];
}
else
{
int iIndex = 0;
if (container.HotSubItem != null)
iIndex = container.SubItems.IndexOf(container.HotSubItem) + 1;
while (iIndex < container.SubItems.Count && !CanFocus(container.SubItems[iIndex]))
iIndex++;
if (iIndex >= container.SubItems.Count)
iIndex = 0;
BaseItem objNew = null;
for (int i = iIndex; i < container.SubItems.Count; i++)
{
objNew = container.SubItems[i];
if (CanFocus(objNew))
{
iIndex = i;
break;
}
}
container.HotSubItem = container.SubItems[iIndex];
}
if (container.HotSubItem != null)
{
if (container.HotSubItem is ItemContainer)
{
((ItemContainer)container.HotSubItem).SelectFirstItem();
}
else
{
container.HotSubItem.InternalMouseEnter();
container.HotSubItem.InternalMouseMove(new MouseEventArgs(MouseButtons.None, 0, container.HotSubItem.LeftInternal + 1, container.HotSubItem.TopInternal + 1, 0));
IScrollableItemControl isc = container.ContainerControl as IScrollableItemControl;
if (isc != null)
isc.KeyboardItemSelected(container.HotSubItem);
}
}
objArg.Handled = true;
}
else if (objArg.KeyCode == System.Windows.Forms.Keys.Escape)
{
if (objExpanded != null)
{
objExpanded.Expanded = false;
objArg.Handled = true;
}
else
{
Control cc = container.ContainerControl as Control;
if (cc is Bar)
{
Bar bar = cc as Bar;
if (bar.BarState == eBarState.Popup)
{
bar.ParentItem.Expanded = false;
}
else
{
if (container.AutoExpand)
container.AutoExpand = false;
else if (bar.Focused || bar.MenuFocus)
{
bar.MenuFocus = false;
bar.ReleaseFocus();
}
}
objArg.Handled = true;
}
else if (cc is ItemControl)
{
ItemControl ic = cc as ItemControl;
if (container.AutoExpand)
container.AutoExpand = false;
else if (ic.Focused || ic.MenuFocus)
{
ic.MenuFocus = false;
ic.ReleaseFocus();
}
}
}
}
else
{
BaseItem objItem = container.ExpandedItem();
if (objItem != null)
objItem.InternalKeyDown(objArg);
else
{
int key = 0;
if (objArg.Shift)
{
try
{
byte[] keyState = new byte[256];
if (NativeFunctions.GetKeyboardState(keyState))
{
byte[] chars = new byte[2];
if (NativeFunctions.ToAscii((uint)objArg.KeyValue, 0, keyState, chars, 0) != 0)
{
key = chars[0];
}
}
}
catch (Exception)
{
key = 0;
}
}
if (key == 0)
key = (int)NativeFunctions.MapVirtualKey((uint)objArg.KeyValue, 2);
if (container.HotSubItem != null)
container.HotSubItem.InternalKeyDown(objArg);
}
}
}
private static bool CanFocus(BaseItem objNew)
{
if (objNew == null) return false;
if (!objNew.Visible || !objNew.GetEnabled() || objNew is ListBoxItem && ((ListBoxItem)objNew).IsSelected)
return false;
if (objNew is LabelItem)
return false;
return true;
}
}
}