示例#1
0
        private void Dgv_MouseDown(object sender, MouseEventArgs e)
        {
            DataGridView dgv = (DataGridView)sender;

            DataGridView.HitTestInfo hitTestInfo;
            hitTestInfo = dgv.HitTest(e.X, e.Y);
            if (hitTestInfo.RowIndex > -1 &&
                dgv.Rows.Count > hitTestInfo.RowIndex)
            {
                RowData trigger = (RowData)dgv.Rows[hitTestInfo.RowIndex].Cells[2].Value;
                trigger.MouseDown(dgv, e);
            }
        }
示例#2
0
        internal void CmdKeyProcessed(object sender, Keys keys)
        {
            switch (keys)
            {
            case Keys.Enter:
            case Keys.Up:
            case Keys.Down:
            case Keys.Left:
            case Keys.Right:
            case Keys.Escape:
                SelectByKey(keys);
                break;

            case Keys.Control | Keys.F:
                Menu menu = menus[iMenuKey];
                menu.FocusTextBox();
                break;

            case Keys.Tab:
            {
                Menu currentMenu           = (Menu)sender;
                int  indexOfTheCurrentMenu = GetMenuIndex(currentMenu);
                int  indexMax = menus.Where(m => m != null).Count() - 1;
                int  indexNew = 0;
                if (indexOfTheCurrentMenu > 0)
                {
                    indexNew = indexOfTheCurrentMenu - 1;
                }
                else
                {
                    indexNew = indexMax;
                }

                menus[indexNew].FocusTextBox();
            }

            break;

            case Keys.Tab | Keys.Shift:
            {
                Menu currentMenu           = (Menu)sender;
                int  indexOfTheCurrentMenu = GetMenuIndex(currentMenu);
                int  indexMax = menus.Where(m => m != null).Count() - 1;
                int  indexNew = 0;
                if (indexOfTheCurrentMenu < indexMax)
                {
                    indexNew = indexOfTheCurrentMenu + 1;
                }
                else
                {
                    indexNew = 0;
                }

                menus[indexNew].FocusTextBox();
            }

            break;

            case Keys.Apps:
            {
                DataGridView dgv = menus[iMenuKey].GetDataGridView();

                if (iRowKey > -1 &&
                    dgv.Rows.Count > iRowKey)
                {
                    Point          pt      = dgv.GetCellDisplayRectangle(2, iRowKey, false).Location;
                    RowData        trigger = (RowData)dgv.Rows[iRowKey].Cells[2].Value;
                    MouseEventArgs mea     = new MouseEventArgs(MouseButtons.Right, 1, pt.X, pt.Y, 0);
                    trigger.MouseDown(dgv, mea);
                }
            }

            break;

            default:
                break;
            }

            int GetMenuIndex(in Menu currentMenu)
            {
                int index = 0;

                foreach (Menu menuFindIndex in menus.Where(m => m != null))
                {
                    if (currentMenu == menuFindIndex)
                    {
                        break;
                    }

                    index++;
                }

                return(index);
            }
        }
示例#3
0
        private void SelectByKey(Keys keys, string keyInput = "", bool keepSelection = false)
        {
            int iRowBefore  = iRowKey;
            int iMenuBefore = iMenuKey;

            Menu         menu             = menus[iMenuKey];
            DataGridView dgv              = null;
            DataGridView dgvBefore        = null;
            Menu         menuFromSelected = null;
            string       textselected     = string.Empty;
            bool         isStillSelected  = IsAnyMenuSelectedByKey(ref dgv, ref menuFromSelected, ref textselected);

            if (isStillSelected)
            {
                if (keepSelection)
                {
                    // If current selection is still valid for this search then skip selecting different item
                    if (textselected.StartsWith(keyInput, true, CultureInfo.InvariantCulture))
                    {
                        return;
                    }
                }

                dgvBefore = dgv;
            }
            else
            {
                ResetSelectedByKey();
                menu = menus[iMenuKey];
                dgv  = menu.GetDataGridView();
            }

            bool toClear = false;

            switch (keys)
            {
            case Keys.Enter:
                if (iRowKey > -1 &&
                    dgv.Rows.Count > iRowKey)
                {
                    RowData trigger = (RowData)dgv.Rows[iRowKey].Cells[2].Value;
                    if (trigger.IsMenuOpen || !trigger.ContainsMenu)
                    {
                        trigger.MouseDown(dgv, null);
                        trigger.DoubleClick(
                            new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
                    }
                    else
                    {
                        RowDeselected(iRowBefore, dgvBefore);
                        SelectRow(dgv, iRowKey);
                        EnterPressed.Invoke(dgv, iRowKey);
                    }
                }

                break;

            case Keys.Up:
                if (SelectMatchedReverse(dgv, iRowKey) ||
                    SelectMatchedReverse(dgv, dgv.Rows.Count - 1))
                {
                    RowDeselected(iRowBefore, dgvBefore);
                    SelectRow(dgv, iRowKey);
                    toClear = true;
                }

                break;

            case Keys.Down:
                if (SelectMatched(dgv, iRowKey) ||
                    SelectMatched(dgv, 0))
                {
                    RowDeselected(iRowBefore, dgvBefore);
                    SelectRow(dgv, iRowKey);
                    toClear = true;
                }

                break;

            case Keys.Left:
                int iMenuKeyNext = iMenuKey + 1;
                if (isStillSelected)
                {
                    if (menuFromSelected != null &&
                        menuFromSelected == menus[iMenuKeyNext])
                    {
                        dgv = menuFromSelected.GetDataGridView();
                        if (dgv.Rows.Count > 0)
                        {
                            iMenuKey += 1;
                            iRowKey   = -1;
                            if (SelectMatched(dgv, iRowKey) ||
                                SelectMatched(dgv, 0))
                            {
                                RowDeselected(iRowBefore, dgvBefore);
                                SelectRow(dgv, iRowKey);
                                toClear = true;
                            }
                        }
                    }
                }
                else
                {
                    iRowKey  = -1;
                    iMenuKey = menus.Where(m => m != null).Count() - 1;
                    if (menus[iMenuKey] != null)
                    {
                        dgv = menus[iMenuKey].GetDataGridView();
                        if (SelectMatched(dgv, iRowKey) ||
                            SelectMatched(dgv, 0))
                        {
                            RowDeselected(iRowBefore, dgvBefore);
                            SelectRow(dgv, iRowKey);
                            toClear = true;
                        }
                    }
                }

                break;

            case Keys.Right:
                if (iMenuKey > 0)
                {
                    if (menus[iMenuKey - 1] != null)
                    {
                        iMenuKey -= 1;
                        iRowKey   = -1;
                        menu      = menus[iMenuKey];
                        dgv       = menu.GetDataGridView();
                        if (SelectMatched(dgv, dgv.SelectedRows[0].Index) ||
                            SelectMatched(dgv, 0))
                        {
                            RowDeselected(iRowBefore, dgvBefore);
                            SelectRow(dgv, iRowKey);
                            toClear = true;
                        }
                    }
                }
                else
                {
                    RowDeselected(iRowBefore, dgvBefore);
                    iMenuKey = 0;
                    iRowKey  = -1;
                    toClear  = true;
                    Cleared?.Invoke();
                }

                break;

            case Keys.Escape:
                RowDeselected(iRowBefore, dgvBefore);
                iMenuKey = 0;
                iRowKey  = -1;
                toClear  = true;
                ClosePressed?.Invoke();
                break;

            default:
                if (!string.IsNullOrEmpty(keyInput))
                {
                    if (SelectMatched(dgv, iRowKey, keyInput) ||
                        SelectMatched(dgv, 0, keyInput))
                    {
                        RowDeselected(iRowBefore, null);
                        SelectRow(dgv, iRowKey);
                        toClear = true;
                    }
                    else if (isStillSelected)
                    {
                        iRowKey = iRowBefore - 1;
                        if (SelectMatched(dgv, iRowKey, keyInput) ||
                            SelectMatched(dgv, 0, keyInput))
                        {
                            RowDeselected(iRowBefore, null);
                            SelectRow(dgv, iRowKey);
                        }
                        else
                        {
                            iRowKey = iRowBefore;
                        }
                    }
                }

                break;
            }

            if (isStillSelected && toClear)
            {
                ClearIsSelectedByKey(iMenuBefore, iRowBefore);
            }
        }