1 // PropertiesList.cpp : implementation file
\r
5 #include "xkeymacs.h"
\r
7 #include "Properties.h"
\r
8 #include "PropertiesList.h"
\r
11 #define new DEBUG_NEW
\r
13 static char THIS_FILE[] = __FILE__;
\r
16 /////////////////////////////////////////////////////////////////////////////
\r
17 // CPropertiesList property page
\r
19 BOOL CPropertiesList::m_bSortAscending = TRUE;
\r
21 IMPLEMENT_DYNCREATE(CPropertiesList, CPropertyPage)
\r
23 CPropertiesList::CPropertiesList() : CPropertyPage(CPropertiesList::IDD)
\r
25 //{{AFX_DATA_INIT(CPropertiesList)
\r
26 // NOTE: the ClassWizard will add member initialization here
\r
30 CPropertiesList::~CPropertiesList()
\r
34 void CPropertiesList::DoDataExchange(CDataExchange* pDX)
\r
36 CPropertyPage::DoDataExchange(pDX);
\r
37 //{{AFX_DATA_MAP(CPropertiesList)
\r
38 DDX_Control(pDX, IDC_PROPERTIES_LIST, m_cPropertiesList);
\r
43 BEGIN_MESSAGE_MAP(CPropertiesList, CPropertyPage)
\r
44 //{{AFX_MSG_MAP(CPropertiesList)
\r
46 ON_NOTIFY(LVN_COLUMNCLICK, IDC_PROPERTIES_LIST, OnColumnclickPropertiesList)
\r
50 /////////////////////////////////////////////////////////////////////////////
\r
51 // CPropertiesList message handlers
\r
53 BOOL CPropertiesList::OnSetActive()
\r
55 m_pProperties->EnableControl(LIST_TAB);
\r
56 SetDialogData(m_pProperties->GetCurrentApplication());
\r
58 return CPropertyPage::OnSetActive();
\r
61 void CPropertiesList::SetDialogData(CString szApplicationName)
\r
63 UpdateDialogData(szApplicationName, FALSE);
\r
66 void CPropertiesList::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)
\r
68 if (bSaveAndValidate) { // GetDialogData
\r
72 if (!bSaveAndValidate) { // SetDialogData
\r
73 m_cPropertiesList.DeleteAllItems();
\r
74 m_nCategoryWidth = 0;
\r
75 m_nCommandWidth = 0;
\r
78 for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {
\r
79 CString szCommandName = CCommands::GetCommandName(nCommandID);
\r
80 if (szCommandName.IsEmpty()) {
\r
84 CString szCategory(MAKEINTRESOURCE(CCommands::GetCategoryID(nCommandID)));
\r
85 if (szCategory.IsEmpty()) {
\r
89 BOOL bInserted = FALSE;
\r
90 for (int nCommandType = 0; nCommandType < MAX_COMMAND_TYPE; ++nCommandType) {
\r
91 for (int nKey = 0; nKey < MAX_KEY; ++nKey) {
\r
92 if (nCommandID == CProfile::GetCommandID(m_pProperties->GetApplicationID(), nCommandType, nKey)) {
\r
94 szKey.Format(_T("%s%s"), CProfile::CommandType2String(nCommandType), CProfile::Key2String(nKey));
\r
96 InsertItem(szCategory, szCommandName, szKey);
\r
103 InsertItem(szCategory, szCommandName, _T(""));
\r
107 SortItem(m_nSelectedColumn);
\r
108 m_cPropertiesList.SetColumnWidth(0, m_nCategoryWidth + 0x20);
\r
109 m_cPropertiesList.SetColumnWidth(1, m_nCommandWidth + 0x20);
\r
110 m_cPropertiesList.SetColumnWidth(2, m_nKeyWidth + 0x20);
\r
113 if (!bSaveAndValidate) { // SetDialogData
\r
118 void CPropertiesList::GetDialogData()
\r
120 UpdateDialogData(m_pProperties->GetCurrentApplication(), TRUE);
\r
123 int CPropertiesList::OnCreate(LPCREATESTRUCT lpCreateStruct)
\r
125 if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
\r
128 m_pProperties = (CProperties *)GetParent()->GetParent();
\r
133 BOOL CPropertiesList::OnKillActive()
\r
136 return CPropertyPage::OnKillActive();
\r
139 void CPropertiesList::EnableControl()
\r
141 BOOL bEnable = m_pProperties->IsEnableControl();
\r
143 m_cPropertiesList.EnableWindow(bEnable);
\r
146 BOOL CPropertiesList::OnInitDialog()
\r
148 CPropertyPage::OnInitDialog();
\r
150 DWORD dwStyle = m_cPropertiesList.GetExtendedStyle();
\r
151 dwStyle |= LVS_EX_FULLROWSELECT;
\r
152 m_cPropertiesList.SetExtendedStyle(dwStyle);
\r
154 m_nSelectedColumn = 0;
\r
155 m_bSortAscending = TRUE;
\r
157 m_cPropertiesList.InsertColumn(0, CString(MAKEINTRESOURCE(IDS_CATEGORY)), LVCFMT_LEFT);
\r
158 m_cPropertiesList.InsertColumn(1, CString(MAKEINTRESOURCE(IDS_COMMAND)), LVCFMT_LEFT);
\r
159 m_cPropertiesList.InsertColumn(2, CString(MAKEINTRESOURCE(IDS_KEY)), LVCFMT_LEFT);
\r
161 return TRUE; // return TRUE unless you set the focus to a control
\r
162 // EXCEPTION: OCX Property Pages should return FALSE
\r
165 int CALLBACK CPropertiesList::SortCategory(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
167 return Sort(lParam1, lParam2, lParamSort, SORT_CATEGORY);
\r
170 int CALLBACK CPropertiesList::SortCommand(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
172 return Sort(lParam1, lParam2, lParamSort, SORT_COMMAND);
\r
175 int CALLBACK CPropertiesList::SortKey(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
\r
177 return Sort(lParam1, lParam2, lParamSort, SORT_KEY);
\r
180 void CPropertiesList::OnColumnclickPropertiesList(NMHDR* pNMHDR, LRESULT* pResult)
\r
182 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
\r
183 if (m_nSelectedColumn == pNMListView->iSubItem) {
\r
184 m_bSortAscending = !m_bSortAscending;
\r
186 m_nSelectedColumn = pNMListView->iSubItem;
\r
187 m_bSortAscending = TRUE;
\r
190 for (int nItem = 0; nItem < m_cPropertiesList.GetItemCount(); ++nItem) {
\r
191 m_cPropertiesList.SetItemData(nItem, nItem);
\r
194 SortItem(pNMListView->iSubItem);
\r
199 void CPropertiesList::DisplayIndicator()
\r
201 CHeaderCtrl *pHeaderCtrl = m_cPropertiesList.GetHeaderCtrl();
\r
203 for (int nItemCount = 0; nItemCount < pHeaderCtrl->GetItemCount(); ++nItemCount) {
\r
205 if (nItemCount == m_nSelectedColumn) {
\r
206 hditem.mask = HDI_FORMAT | HDI_BITMAP;
\r
207 hditem.fmt = HDF_STRING | HDF_BITMAP | HDF_BITMAP_ON_RIGHT;
\r
208 const int IDB_SORT = m_bSortAscending ? IDB_SORT_ASCENDING : IDB_SORT_DESCENDING;
\r
209 hditem.hbm = (HBITMAP)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_SORT), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
\r
210 pHeaderCtrl->SetItem(nItemCount, &hditem);
\r
212 hditem.mask = HDI_FORMAT;
\r
213 hditem.fmt = HDF_STRING;
\r
215 pHeaderCtrl->SetItem(nItemCount, &hditem);
\r
220 void CPropertiesList::SortItem(int nColumn)
\r
224 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);
\r
227 m_cPropertiesList.SortItems(CPropertiesList::SortCommand, (LPARAM) &m_cPropertiesList);
\r
230 m_cPropertiesList.SortItems(CPropertiesList::SortKey, (LPARAM) &m_cPropertiesList);
\r
233 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);
\r
237 DisplayIndicator();
\r
240 void CPropertiesList::InsertItem(LPCTSTR szCategory, LPCTSTR szCommandName, LPCTSTR szKey)
\r
242 int nItem = m_cPropertiesList.InsertItem(m_cPropertiesList.GetItemCount(), szCategory);
\r
243 m_cPropertiesList.SetItemData(nItem, nItem);
\r
244 m_cPropertiesList.SetItemText(nItem, 1, szCommandName);
\r
245 m_cPropertiesList.SetItemText(nItem, 2, szKey);
\r
247 m_nCategoryWidth = __max(m_nCategoryWidth, m_cPropertiesList.GetStringWidth(szCategory));
\r
248 m_nCommandWidth = __max(m_nCommandWidth, m_cPropertiesList.GetStringWidth(szCommandName));
\r
249 m_nKeyWidth = __max(m_nKeyWidth, m_cPropertiesList.GetStringWidth(szKey));
\r
252 int CPropertiesList::Sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort, SORT_TYPE sortType)
\r
254 CListCtrl *pListCtrl = (CListCtrl *) lParamSort;
\r
256 CString szCategory1 = pListCtrl->GetItemText(lParam1, 0);
\r
257 CString szCommand1 = pListCtrl->GetItemText(lParam1, 1);
\r
258 CString szKey1 = pListCtrl->GetItemText(lParam1, 2);
\r
260 CString szCategory2 = pListCtrl->GetItemText(lParam2, 0);
\r
261 CString szCommand2 = pListCtrl->GetItemText(lParam2, 1);
\r
262 CString szKey2 = pListCtrl->GetItemText(lParam2, 2);
\r
265 switch (sortType) {
\r
266 case SORT_CATEGORY:
\r
267 rc = rc ? rc : _tcscmp(szCategory1, szCategory2);
\r
268 // Do NOT write break; here.
\r
270 rc = rc ? rc : _tcscmp(szCommand1, szCommand2);
\r
271 // Do NOT write break; here.
\r
274 rc = rc ? rc : _tcscmp(szKey1, szKey2);
\r
275 if (szKey1.IsEmpty() && !szKey2.IsEmpty()) {
\r
277 } else if (!szKey1.IsEmpty() && szKey2.IsEmpty()) {
\r
285 return m_bSortAscending ? rc : rc * -1;
\r