Example #1
0
        protected override bool HandleCursorLoop(Keys key)
        {
            int focusedIdx = ShellBrowser.GetFocusedIndex();
            int itemCount  = ShellBrowser.GetItemCount();
            int selectMe   = -1;
            int viewMode   = ShellBrowser.ViewMode;

            if (viewMode == FVM.TILE && QTUtility.IsXP)
            {
                viewMode = FVM.ICON;
            }
            switch (viewMode)
            {
            case FVM.CONTENT:
            case FVM.DETAILS:
            case FVM.TILE:
                if (key == Keys.Up && focusedIdx == 0)
                {
                    selectMe = itemCount - 1;
                }
                else if (key == Keys.Down && focusedIdx == itemCount - 1)
                {
                    selectMe = 0;
                }
                break;

            case FVM.ICON:
            case FVM.SMALLICON:
            case FVM.THUMBNAIL:
            case FVM.LIST:
                Keys   KeyNextItem, KeyPrevItem, KeyNextPage, KeyPrevPage;
                IntPtr MsgNextPage, MsgPrevPage;
                if (viewMode == FVM.LIST)
                {
                    KeyNextItem = Keys.Down;
                    KeyPrevItem = Keys.Up;
                    KeyNextPage = Keys.Right;
                    KeyPrevPage = Keys.Left;
                    MsgNextPage = (IntPtr)LVNI.TORIGHT;
                    MsgPrevPage = (IntPtr)LVNI.TOLEFT;
                }
                else
                {
                    KeyNextItem = Keys.Right;
                    KeyPrevItem = Keys.Left;
                    KeyNextPage = Keys.Down;
                    KeyPrevPage = Keys.Up;
                    MsgNextPage = (IntPtr)LVNI.BELOW;
                    MsgPrevPage = (IntPtr)LVNI.ABOVE;
                }

                int nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgNextPage);
                if (nextPageIdx == -1 || nextPageIdx == focusedIdx)
                {
                    nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgPrevPage);
                }
                else if (QTUtility.IsXP)
                {
                    int testIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)nextPageIdx, MsgPrevPage);
                    if (testIdx != focusedIdx)
                    {
                        nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgPrevPage);
                    }
                }
                if (nextPageIdx == -1 || nextPageIdx == focusedIdx)
                {
                    if (key == KeyNextItem)
                    {
                        if (focusedIdx == itemCount - 1)
                        {
                            selectMe = 0;
                        }
                        else
                        {
                            RECT thisRect = GetItemRect(focusedIdx);
                            RECT nextRect = GetItemRect(focusedIdx + 1);
                            if (viewMode == FVM.LIST)
                            {
                                if (nextRect.top < thisRect.top)
                                {
                                    selectMe = 0;
                                }
                            }
                            else if (nextRect.left < thisRect.left)
                            {
                                selectMe = 0;
                            }
                        }
                    }
                    else if (key == KeyPrevItem && focusedIdx == 0)
                    {
                        selectMe = itemCount - 1;
                    }
                    else if (key == KeyNextPage || key == KeyPrevPage)
                    {
                        if (QTUtility.IsXP)
                        {
                            return(true);
                        }
                    }
                }
                else
                {
                    int pageCount = Math.Abs(focusedIdx - nextPageIdx);
                    int page      = focusedIdx % pageCount;
                    if (key == KeyNextItem && (page == pageCount - 1 || focusedIdx == itemCount - 1))
                    {
                        selectMe = focusedIdx - page;
                    }
                    else if (key == KeyPrevItem && page == 0)
                    {
                        selectMe = Math.Min(focusedIdx + pageCount - 1, itemCount - 1);
                    }
                    else if (key == KeyNextPage && focusedIdx + pageCount >= itemCount)
                    {
                        selectMe = page;
                    }
                    else if (key == KeyPrevPage && focusedIdx < pageCount)
                    {
                        int x = itemCount - focusedIdx - 1;
                        selectMe = x - x % pageCount + focusedIdx;
                    }
                }
                break;
            }

            if (selectMe >= 0)
            {
                SetRedraw(false);
                ShellBrowser.SelectItem(selectMe);
                PInvoke.SendMessage(Handle, LVM.REDRAWITEMS, (IntPtr)focusedIdx, (IntPtr)focusedIdx);
                SetRedraw(true);
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #2
0
        // 使用箭头键时候环绕选择文件夹
        protected override bool HandleCursorLoop(Keys key)
        {
            int focusedIdx = ShellBrowser.GetFocusedIndex();
            int itemCount  = ShellBrowser.GetItemCount();
            int selectMe   = -1;
            FVM viewMode   = ShellBrowser.ViewMode;

            switch (viewMode)
            {
            case FVM.CONTENT:
            case FVM.DETAILS:
                if (key == Keys.Up && focusedIdx == 0)
                {
                    selectMe = itemCount - 1;
                }
                else if (key == Keys.Down && focusedIdx == itemCount - 1)
                {
                    selectMe = 0;
                }
                break;

            case FVM.ICON:
            case FVM.SMALLICON:
            case FVM.THUMBNAIL:
            case FVM.TILE:
            case FVM.LIST:
                Keys KeyNextItem, KeyPrevItem, KeyNextPage, KeyPrevPage;
                if (viewMode == FVM.LIST)
                {
                    KeyNextItem = Keys.Down;
                    KeyPrevItem = Keys.Up;
                    KeyNextPage = Keys.Right;
                    KeyPrevPage = Keys.Left;
                }
                else
                {
                    KeyNextItem = Keys.Right;
                    KeyPrevItem = Keys.Left;
                    KeyNextPage = Keys.Down;
                    KeyPrevPage = Keys.Up;
                }
                int pageCount = AutomationManager.DoQuery(factory => {
                    AutomationElement elem = factory.FromHandle(Handle);
                    if (elem == null)
                    {
                        return(-1);
                    }
                    return(viewMode == FVM.LIST ? elem.GetRowCount() : elem.GetColumnCount());
                });
                if (pageCount == -1)
                {
                    return(false);
                }
                int page = focusedIdx % pageCount;
                if (key == KeyNextItem && (page == pageCount - 1 || focusedIdx == itemCount - 1))
                {
                    selectMe = focusedIdx - page;
                }
                else if (key == KeyPrevItem && page == 0)
                {
                    selectMe = Math.Min(focusedIdx + pageCount - 1, itemCount - 1);
                }
                else if (key == KeyNextPage && focusedIdx + pageCount >= itemCount)
                {
                    selectMe = page;
                }
                else if (key == KeyPrevPage && focusedIdx < pageCount)
                {
                    int x = itemCount - focusedIdx - 1;
                    selectMe = x - x % pageCount + focusedIdx;
                }
                break;
            }
            if (selectMe >= 0)
            {
                ShellBrowser.SelectItem(selectMe);
                return(true);
            }
            else
            {
                return(false);
            }
        }