207 lines
8.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|