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