source: trunk/src/WTLx/ListViewSortMixin.hpp @ 684

Revision 684, 3.7 KB checked in by Eoin, 11 years ago (diff)

Ctrl + Click on LVHeader sets secondary listview sorting parameter.

Line 
1
2//         Copyright Eóin O'Callaghan 2008 - 2008.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#ifndef LISTVIEW_SORT_MIXIN_HPP_INCLUDED
8#define LISTVIEW_SORT_MIXIN_HPP_INCLUDED
9
10#include <boost/iterator/filter_iterator.hpp>
11#include <winstl/controls/listview_sequence.hpp>
12
13namespace WTLx
14{
15
16template<typename T>
17class ListViewSortMixin : public WTL::CSortListViewImpl<T>
18{
19protected:
20        ListViewSortMixin() :
21                iSecondarySort(-1),
22                bSecondaryDescending(false)
23        {}
24
25        BEGIN_MSG_MAP(ListViewSortMixin)
26                MESSAGE_HANDLER(LVM_INSERTCOLUMN, WTL::CSortListViewImpl<T>::OnInsertColumn)
27                MESSAGE_HANDLER(LVM_DELETECOLUMN, WTL::CSortListViewImpl<T>::OnDeleteColumn)
28                NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick)
29                NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick)
30                MESSAGE_HANDLER(WM_SETTINGCHANGE, WTL::CSortListViewImpl<T>::OnSettingChange)
31        END_MSG_MAP()
32
33        DWORD SetListViewSortMixinExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
34        {
35                DWORD dwPrevStyle = m_dwSortLVExtendedStyle;
36                if(dwMask == 0)
37                        m_dwSortLVExtendedStyle = dwExtendedStyle;
38                else
39                        m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
40                return dwPrevStyle;
41        }
42
43        DWORD GetListViewSortMixinExtendedStyle() const
44        {
45                return m_dwSortLVExtendedStyle;
46        }
47       
48        void SetColumnSortType(int iCol, WORD wType)
49        {
50                HAL_DEV_SORT_MSG(hal::wform(L"SetColumnSortType(int iCol = %1%, WORD wType = %2%)") % iCol % wType);
51
52                ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());
53                ATLASSERT(wType >= WTL::LVCOLSORT_NONE);
54                m_arrColSortType[iCol] = wType;         
55        }
56
57        LRESULT OnHeaderItemClick(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
58        {               
59                HAL_DEV_SORT_MSG(hal::wform(L"OnHeaderItemClick(int idCtrl = %1%, LPNMHDR pnmh, BOOL& bHandled)") % idCtrl);
60
61                LPNMHEADER p = (LPNMHEADER)pnmh;
62                if(p->iButton == 0)
63                {
64                        if (GetKeyState(VK_LCONTROL) || GetKeyState(VK_RCONTROL))
65                        {
66                                bSecondaryDescending = (iSecondarySort == p->iItem) ? !bSecondaryDescending : false;
67                                iSecondarySort = p->iItem;
68                        }
69                        else
70                        {
71                                int iOld = m_iSortColumn;
72                                bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false;
73
74                                if (DoSortItems(p->iItem, bDescending))
75                                        NotifyParentSortChanged(p->iItem, iOld);
76                        }
77                }
78
79                bHandled = FALSE;
80                return 0;
81        }
82
83//  Operations
84        bool DoSortItems(int iCol, bool bDescending = false)
85        {
86                HAL_DEV_SORT_MSG(hal::wform(L"DoSortItems(int iCol = %1%, bool bDescending = %2%)") % iCol % bDescending);
87
88                T* pT = static_cast<T*>(this);
89                ATLASSERT(::IsWindow(pT->m_hWnd));
90                ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());
91
92                WORD wType = m_arrColSortType[iCol];
93                if(wType == WTL::LVCOLSORT_NONE)
94                        return false;
95                else if (wType <= WTL::LVCOLSORT_LAST)
96                {
97                        HAL_DEV_SORT_MSG(hal::wform(L"wType = %1%, passing DoSort() to base class") % wType);
98                        return WTL::CSortListViewImpl<T>::DoSortItems(iCol, bDescending);
99                }
100
101                int nCount = pT->GetItemCount();
102                if(nCount < 2)
103                {
104                        m_bSortDescending = bDescending;
105                        SetSortColumn(iCol);
106                        return true;
107                }
108
109                WTL::CWaitCursor waitCursor(false);
110                if(m_bUseWaitCursor)
111                        waitCursor.Set();
112
113                bool bRet = pT->DoSortItemsExternal(iCol, bDescending);
114
115                if(bRet)
116                {
117                        m_bSortDescending = bDescending;
118                        SetSortColumn(iCol);
119                }
120
121                if(m_bUseWaitCursor)
122                        waitCursor.Restore();
123
124                return bRet;
125        }
126
127        const int GetSecondarySortColumn() { return iSecondarySort; }
128        const bool IsSecondarySortDescending() { return bSecondaryDescending; }
129
130private:
131        int iSecondarySort;
132        bool bSecondaryDescending;
133};
134
135}
136
137#endif // LISTVIEW_SORT_MIXIN_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.