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

Revision 685, 4.2 KB checked in by Eoin, 11 years ago (diff)

Secondary sorting complete.

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
13#define SLVN_SECONDSORTCHANGED          SLVN_SORTCHANGED+1
14
15namespace WTLx
16{
17
18template<typename T>
19class ListViewSortMixin : public WTL::CSortListViewImpl<T>
20{
21protected:
22        ListViewSortMixin() :
23                iSecondarySort(-1),
24                bSecondaryDescending(false)
25        {}
26
27        BEGIN_MSG_MAP(ListViewSortMixin)
28                MESSAGE_HANDLER(LVM_INSERTCOLUMN, WTL::CSortListViewImpl<T>::OnInsertColumn)
29                MESSAGE_HANDLER(LVM_DELETECOLUMN, WTL::CSortListViewImpl<T>::OnDeleteColumn)
30                NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick)
31                NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick)
32                MESSAGE_HANDLER(WM_SETTINGCHANGE, WTL::CSortListViewImpl<T>::OnSettingChange)
33        END_MSG_MAP()
34
35        DWORD SetListViewSortMixinExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
36        {
37                DWORD dwPrevStyle = m_dwSortLVExtendedStyle;
38                if(dwMask == 0)
39                        m_dwSortLVExtendedStyle = dwExtendedStyle;
40                else
41                        m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
42                return dwPrevStyle;
43        }
44
45        DWORD GetListViewSortMixinExtendedStyle() const
46        {
47                return m_dwSortLVExtendedStyle;
48        }
49       
50        void SetColumnSortType(int iCol, WORD wType)
51        {
52                HAL_DEV_SORT_MSG(hal::wform(L"SetColumnSortType(int iCol = %1%, WORD wType = %2%)") % iCol % wType);
53
54                ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());
55                ATLASSERT(wType >= WTL::LVCOLSORT_NONE);
56                m_arrColSortType[iCol] = wType;         
57        }
58
59        LRESULT OnHeaderItemClick(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
60        {               
61                HAL_DEV_SORT_MSG(hal::wform(L"OnHeaderItemClick(int idCtrl = %1%, LPNMHDR pnmh, BOOL& bHandled)") % idCtrl);
62
63                LPNMHEADER p = (LPNMHEADER)pnmh;
64                if(p->iButton == 0)
65                {
66                        if (GetKeyState(VK_CONTROL) & 0x8000)
67                        {
68                                int iOld = iSecondarySort;
69
70                                bSecondaryDescending = (iSecondarySort == p->iItem) ? !bSecondaryDescending : false;
71                                iSecondarySort = p->iItem;
72
73                                if (DoSortItems(p->iItem, m_bSortDescending))
74                                        NotifyParentSecondarySortChanged(p->iItem, iOld);
75                        }
76                        else
77                        {
78                                int iOld = m_iSortColumn;
79                                bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false;
80
81                                if (DoSortItems(p->iItem, bDescending))
82                                        NotifyParentSortChanged(p->iItem, iOld);
83                        }
84                }
85
86                bHandled = FALSE;
87                return 0;
88        }
89
90        void NotifyParentSecondarySortChanged(int iNewSortCol, int iOldSortCol)
91        {
92                T* pT = static_cast<T*>(this);
93                int nID = pT->GetDlgCtrlID();
94                WTL::NMSORTLISTVIEW nm = { { pT->m_hWnd, nID, SLVN_SECONDSORTCHANGED }, iNewSortCol, iOldSortCol };
95                ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nID, (LPARAM)&nm);
96        }
97
98//  Operations
99        bool DoSortItems(int iCol, bool bDescending = false)
100        {
101                HAL_DEV_SORT_MSG(hal::wform(L"DoSortItems(int iCol = %1%, bool bDescending = %2%)") % iCol % bDescending);
102
103                T* pT = static_cast<T*>(this);
104                ATLASSERT(::IsWindow(pT->m_hWnd));
105                ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize());
106
107                WORD wType = m_arrColSortType[iCol];
108                if(wType == WTL::LVCOLSORT_NONE)
109                        return false;
110                else if (wType <= WTL::LVCOLSORT_LAST)
111                {
112                        HAL_DEV_SORT_MSG(hal::wform(L"wType = %1%, passing DoSort() to base class") % wType);
113                        return WTL::CSortListViewImpl<T>::DoSortItems(iCol, bDescending);
114                }
115
116                int nCount = pT->GetItemCount();
117                if(nCount < 2)
118                {
119                        m_bSortDescending = bDescending;
120                        SetSortColumn(iCol);
121                        return true;
122                }
123
124                WTL::CWaitCursor waitCursor(false);
125                if(m_bUseWaitCursor)
126                        waitCursor.Set();
127
128                bool bRet = pT->DoSortItemsExternal(iCol, bDescending);
129
130                if(bRet)
131                {
132                        m_bSortDescending = bDescending;
133                        SetSortColumn(iCol);
134                }
135
136                if(m_bUseWaitCursor)
137                        waitCursor.Restore();
138
139                return bRet;
140        }
141
142        const int GetSecondarySortColumn() const { return iSecondarySort; }
143        const bool IsSecondarySortDescending() const { return bSecondaryDescending; }
144
145        int iSecondarySort;
146        bool bSecondaryDescending;
147};
148
149}
150
151#endif // LISTVIEW_SORT_MIXIN_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.