1 // PropertiesList.cpp : implementation file
\r
4 #include "propertieslist.h"
\r
6 #include "../xkeymacsdll/Commands.h"
\r
9 #define new DEBUG_NEW
\r
11 static char THIS_FILE[] = __FILE__;
\r
14 /////////////////////////////////////////////////////////////////////////////
\r
15 // CPropertiesList property page
\r
17 BOOL CPropertiesList::m_bSortAscending = TRUE;
\r
19 IMPLEMENT_DYNCREATE(CPropertiesList, CPropertyPage)
\r
21 CPropertiesList::CPropertiesList() : CPropertyPage(CPropertiesList::IDD)
\r
23 //{{AFX_DATA_INIT(CPropertiesList)
\r
24 // NOTE: the ClassWizard will add member initialization here
\r
28 CPropertiesList::~CPropertiesList()
\r
32 void CPropertiesList::DoDataExchange(CDataExchange* pDX)
\r
34 CPropertyPage::DoDataExchange(pDX);
\r
35 //{{AFX_DATA_MAP(CPropertiesList)
\r
36 DDX_Control(pDX, IDC_PROPERTIES_LIST, m_cPropertiesList);
\r
41 BEGIN_MESSAGE_MAP(CPropertiesList, CPropertyPage)
\r
42 //{{AFX_MSG_MAP(CPropertiesList)
\r
44 ON_NOTIFY(LVN_COLUMNCLICK, IDC_PROPERTIES_LIST, OnColumnclickPropertiesList)
\r
48 /////////////////////////////////////////////////////////////////////////////
\r
49 // CPropertiesList message handlers
\r
51 BOOL CPropertiesList::OnSetActive()
\r
53 m_pProperties->EnableControl(LIST_TAB);
\r
56 return CPropertyPage::OnSetActive();
\r
59 void CPropertiesList::SetDialogData()
\r
61 m_cPropertiesList.DeleteAllItems();
\r
62 m_nCategoryWidth = 0;
\r
63 m_nCommandWidth = 0;
\r
66 const int nAppID = m_pProperties->GetApplicationID();
\r
67 for (int nComID = 1; nComID < MAX_COMMAND; ++nComID) {
\r
68 const LPCTSTR szComName = CmdTable::Name(nComID);
\r
71 const CString category(MAKEINTRESOURCE(CmdTable::CategoryID(nComID)));
\r
72 if (category.IsEmpty())
\r
74 bool bInserted = false;
\r
75 for (int nType = 0; nType < MAX_COMMAND_TYPE; ++nType) {
\r
76 for (int nKey = 0; nKey < MAX_KEY; ++nKey)
\r
77 if (nComID == CProfile::GetCmdID(nAppID, nType, nKey)) {
\r
78 CString key = CProfile::KeyToString(nType, nKey);
\r
79 InsertItem(category, szComName, key);
\r
84 InsertItem(category, szComName, _T(""));
\r
86 SortItem(m_nSelectedColumn);
\r
87 m_cPropertiesList.SetColumnWidth(0, m_nCategoryWidth + 0x20);
\r
88 m_cPropertiesList.SetColumnWidth(1, m_nCommandWidth + 0x20);
\r
89 m_cPropertiesList.SetColumnWidth(2, m_nKeyWidth + 0x20);
\r
94 void CPropertiesList::GetDialogData()
\r
99 int CPropertiesList::OnCreate(LPCREATESTRUCT lpCreateStruct)
\r
101 if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
\r
104 m_pProperties = (CProperties *)GetParent()->GetParent();
\r
109 BOOL CPropertiesList::OnKillActive()
\r
112 return CPropertyPage::OnKillActive();
\r
115 void CPropertiesList::EnableControl()
\r
117 BOOL bEnable = m_pProperties->IsEnableControl();
\r
119 m_cPropertiesList.EnableWindow(bEnable);
\r
122 BOOL CPropertiesList::OnInitDialog()
\r
124 CPropertyPage::OnInitDialog();
\r
126 DWORD dwStyle = m_cPropertiesList.GetExtendedStyle();
\r
127 dwStyle |= LVS_EX_FULLROWSELECT;
\r
128 m_cPropertiesList.SetExtendedStyle(dwStyle);
\r
130 m_nSelectedColumn = 0;
\r
131 m_bSortAscending = TRUE;
\r
133 m_cPropertiesList.InsertColumn(0, CString(MAKEINTRESOURCE(IDS_CATEGORY)), LVCFMT_LEFT);
\r
134 m_cPropertiesList.InsertColumn(1, CString(MAKEINTRESOURCE(IDS_COMMAND)), LVCFMT_LEFT);
\r
135 m_cPropertiesList.InsertColumn(2, CString(MAKEINTRESOURCE(IDS_KEY)), LVCFMT_LEFT);
\r
137 return TRUE; // return TRUE unless you set the focus to a control
\r
138 // EXCEPTION: OCX Property Pages should return FALSE
\r
141 int CALLBACK CPropertiesList::SortCategory(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
143 return Sort(lParam1, lParam2, lParamSort, SORT_CATEGORY);
\r
146 int CALLBACK CPropertiesList::SortCommand(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
148 return Sort(lParam1, lParam2, lParamSort, SORT_COMMAND);
\r
151 int CALLBACK CPropertiesList::SortKey(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
153 return Sort(lParam1, lParam2, lParamSort, SORT_KEY);
\r
156 void CPropertiesList::OnColumnclickPropertiesList(NMHDR* pNMHDR, LRESULT* pResult)
\r
158 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
\r
159 if (m_nSelectedColumn == pNMListView->iSubItem) {
\r
160 m_bSortAscending = !m_bSortAscending;
\r
162 m_nSelectedColumn = pNMListView->iSubItem;
\r
163 m_bSortAscending = TRUE;
\r
166 for (int nItem = 0; nItem < m_cPropertiesList.GetItemCount(); ++nItem) {
\r
167 m_cPropertiesList.SetItemData(nItem, nItem);
\r
170 SortItem(pNMListView->iSubItem);
\r
175 void CPropertiesList::DisplayIndicator()
\r
177 CHeaderCtrl *pHeaderCtrl = m_cPropertiesList.GetHeaderCtrl();
\r
179 for (int nItemCount = 0; nItemCount < pHeaderCtrl->GetItemCount(); ++nItemCount) {
\r
181 if (nItemCount == m_nSelectedColumn) {
\r
182 hditem.mask = HDI_FORMAT | HDI_BITMAP;
\r
183 hditem.fmt = HDF_STRING | HDF_BITMAP | HDF_BITMAP_ON_RIGHT;
\r
184 const int IDB_SORT = m_bSortAscending ? IDB_SORT_ASCENDING : IDB_SORT_DESCENDING;
\r
185 hditem.hbm = (HBITMAP)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SORT), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
\r
186 pHeaderCtrl->SetItem(nItemCount, &hditem);
\r
188 hditem.mask = HDI_FORMAT;
\r
189 hditem.fmt = HDF_STRING;
\r
191 pHeaderCtrl->SetItem(nItemCount, &hditem);
\r
196 void CPropertiesList::SortItem(int nColumn)
\r
200 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);
\r
203 m_cPropertiesList.SortItems(CPropertiesList::SortCommand, (LPARAM) &m_cPropertiesList);
\r
206 m_cPropertiesList.SortItems(CPropertiesList::SortKey, (LPARAM) &m_cPropertiesList);
\r
209 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);
\r
213 DisplayIndicator();
\r
216 void CPropertiesList::InsertItem(LPCTSTR szCategory, LPCTSTR szCommandName, LPCTSTR szKey)
\r
218 int nItem = m_cPropertiesList.InsertItem(m_cPropertiesList.GetItemCount(), szCategory);
\r
219 m_cPropertiesList.SetItemData(nItem, nItem);
\r
220 m_cPropertiesList.SetItemText(nItem, 1, szCommandName);
\r
221 m_cPropertiesList.SetItemText(nItem, 2, szKey);
\r
223 m_nCategoryWidth = __max(m_nCategoryWidth, m_cPropertiesList.GetStringWidth(szCategory));
\r
224 m_nCommandWidth = __max(m_nCommandWidth, m_cPropertiesList.GetStringWidth(szCommandName));
\r
225 m_nKeyWidth = __max(m_nKeyWidth, m_cPropertiesList.GetStringWidth(szKey));
\r
228 int CPropertiesList::Sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort, SORT_TYPE sortType)
\r
230 CListCtrl *pListCtrl = (CListCtrl *) lParamSort;
\r
232 CString szCategory1 = pListCtrl->GetItemText(lParam1, 0);
\r
233 CString szCommand1 = pListCtrl->GetItemText(lParam1, 1);
\r
234 CString szKey1 = pListCtrl->GetItemText(lParam1, 2);
\r
236 CString szCategory2 = pListCtrl->GetItemText(lParam2, 0);
\r
237 CString szCommand2 = pListCtrl->GetItemText(lParam2, 1);
\r
238 CString szKey2 = pListCtrl->GetItemText(lParam2, 2);
\r
241 switch (sortType) {
\r
242 case SORT_CATEGORY:
\r
243 rc = rc ? rc : _tcscmp(szCategory1, szCategory2);
\r
244 // Do NOT write break; here.
\r
246 rc = rc ? rc : _tcscmp(szCommand1, szCommand2);
\r
247 // Do NOT write break; here.
\r
250 rc = rc ? rc : _tcscmp(szKey1, szKey2);
\r
251 if (szKey1.IsEmpty() && !szKey2.IsEmpty()) {
\r
253 } else if (!szKey1.IsEmpty() && szKey2.IsEmpty()) {
\r
261 return m_bSortAscending ? rc : rc * -1;
\r