OSDN Git Service

Add descriptions of recent changes to doc/release{,_J}.txt.
[xkeymacs/xkeymacs.git] / xkeymacs / propertieslist.cpp
1 // PropertiesList.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "xkeymacs.h"\r
6 #include "Profile.h"\r
7 #include "Properties.h"\r
8 #include "PropertiesList.h"\r
9 \r
10 #ifdef _DEBUG\r
11 #define new DEBUG_NEW\r
12 #undef THIS_FILE\r
13 static char THIS_FILE[] = __FILE__;\r
14 #endif\r
15 \r
16 /////////////////////////////////////////////////////////////////////////////\r
17 // CPropertiesList property page\r
18 \r
19 BOOL CPropertiesList::m_bSortAscending = TRUE;\r
20 \r
21 IMPLEMENT_DYNCREATE(CPropertiesList, CPropertyPage)\r
22 \r
23 CPropertiesList::CPropertiesList() : CPropertyPage(CPropertiesList::IDD)\r
24 {\r
25         //{{AFX_DATA_INIT(CPropertiesList)\r
26                 // NOTE: the ClassWizard will add member initialization here\r
27         //}}AFX_DATA_INIT\r
28 }\r
29 \r
30 CPropertiesList::~CPropertiesList()\r
31 {\r
32 }\r
33 \r
34 void CPropertiesList::DoDataExchange(CDataExchange* pDX)\r
35 {\r
36         CPropertyPage::DoDataExchange(pDX);\r
37         //{{AFX_DATA_MAP(CPropertiesList)\r
38         DDX_Control(pDX, IDC_PROPERTIES_LIST, m_cPropertiesList);\r
39         //}}AFX_DATA_MAP\r
40 }\r
41 \r
42 \r
43 BEGIN_MESSAGE_MAP(CPropertiesList, CPropertyPage)\r
44         //{{AFX_MSG_MAP(CPropertiesList)\r
45         ON_WM_CREATE()\r
46         ON_NOTIFY(LVN_COLUMNCLICK, IDC_PROPERTIES_LIST, OnColumnclickPropertiesList)\r
47         //}}AFX_MSG_MAP\r
48 END_MESSAGE_MAP()\r
49 \r
50 /////////////////////////////////////////////////////////////////////////////\r
51 // CPropertiesList message handlers\r
52 \r
53 BOOL CPropertiesList::OnSetActive() \r
54 {\r
55         m_pProperties->EnableControl(LIST_TAB);\r
56         SetDialogData(m_pProperties->GetCurrentApplication());\r
57 \r
58         return CPropertyPage::OnSetActive();\r
59 }\r
60 \r
61 void CPropertiesList::SetDialogData(CString szApplicationName)\r
62 {\r
63         UpdateDialogData(szApplicationName, FALSE);\r
64 }\r
65 \r
66 void CPropertiesList::UpdateDialogData(CString szApplicationName, BOOL bSaveAndValidate)\r
67 {\r
68         if (bSaveAndValidate) { // GetDialogData\r
69                 UpdateData();\r
70         }\r
71 \r
72         if (!bSaveAndValidate) {        // SetDialogData\r
73                 m_cPropertiesList.DeleteAllItems();\r
74                 m_nCategoryWidth = 0;\r
75                 m_nCommandWidth = 0;\r
76                 m_nKeyWidth = 0;\r
77 \r
78                 for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {\r
79                         CString szCommandName = CCommands::GetCommandName(nCommandID);\r
80                         if (szCommandName.IsEmpty()) {\r
81                                 break;\r
82                         }\r
83 \r
84                         CString szCategory(MAKEINTRESOURCE(CCommands::GetCategoryID(nCommandID)));\r
85                         if (szCategory.IsEmpty()) {\r
86                                 continue;\r
87                         }\r
88 \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
93                                                 CString szKey;\r
94                                                 szKey.Format(_T("%s%s"), CProfile::CommandType2String(nCommandType), CProfile::Key2String(nKey));\r
95 \r
96                                                 InsertItem(szCategory, szCommandName, szKey);\r
97 \r
98                                                 bInserted = TRUE;\r
99                                         }\r
100                                 }\r
101                         }\r
102                         if (!bInserted) {\r
103                                 InsertItem(szCategory, szCommandName, _T(""));\r
104                         }\r
105                 }\r
106 \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
111         }\r
112 \r
113         if (!bSaveAndValidate) {        // SetDialogData\r
114                 UpdateData(FALSE);\r
115         }\r
116 }\r
117 \r
118 void CPropertiesList::GetDialogData()\r
119 {\r
120         UpdateDialogData(m_pProperties->GetCurrentApplication(), TRUE);\r
121 }\r
122 \r
123 int CPropertiesList::OnCreate(LPCREATESTRUCT lpCreateStruct) \r
124 {\r
125         if (CPropertyPage::OnCreate(lpCreateStruct) == -1)\r
126                 return -1;\r
127 \r
128         m_pProperties = (CProperties *)GetParent()->GetParent();\r
129 \r
130         return 0;\r
131 }\r
132 \r
133 BOOL CPropertiesList::OnKillActive() \r
134 {\r
135         GetDialogData();\r
136         return CPropertyPage::OnKillActive();\r
137 }\r
138 \r
139 void CPropertiesList::EnableControl()\r
140 {\r
141         BOOL bEnable = m_pProperties->IsEnableControl();\r
142 \r
143         m_cPropertiesList.EnableWindow(bEnable);\r
144 }\r
145 \r
146 BOOL CPropertiesList::OnInitDialog() \r
147 {\r
148         CPropertyPage::OnInitDialog();\r
149 \r
150         DWORD dwStyle = m_cPropertiesList.GetExtendedStyle();\r
151         dwStyle |= LVS_EX_FULLROWSELECT;\r
152         m_cPropertiesList.SetExtendedStyle(dwStyle);\r
153 \r
154         m_nSelectedColumn = 0;\r
155         m_bSortAscending = TRUE;\r
156 \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
160 \r
161         return TRUE;  // return TRUE unless you set the focus to a control\r
162                       // EXCEPTION: OCX Property Pages should return FALSE\r
163 }\r
164 \r
165 int CALLBACK CPropertiesList::SortCategory(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
166 {\r
167         return Sort(lParam1, lParam2, lParamSort, SORT_CATEGORY);\r
168 }\r
169 \r
170 int CALLBACK CPropertiesList::SortCommand(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
171 {\r
172         return Sort(lParam1, lParam2, lParamSort, SORT_COMMAND);\r
173 }\r
174 \r
175 int CALLBACK CPropertiesList::SortKey(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)\r
176 {\r
177         return Sort(lParam1, lParam2, lParamSort, SORT_KEY);\r
178 }\r
179 \r
180 void CPropertiesList::OnColumnclickPropertiesList(NMHDR* pNMHDR, LRESULT* pResult) \r
181 {\r
182         NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;\r
183         if (m_nSelectedColumn == pNMListView->iSubItem) {\r
184                 m_bSortAscending = !m_bSortAscending;\r
185         } else {\r
186                 m_nSelectedColumn = pNMListView->iSubItem;\r
187                 m_bSortAscending = TRUE;\r
188         }\r
189 \r
190         for (int nItem = 0; nItem < m_cPropertiesList.GetItemCount(); ++nItem) {\r
191                 m_cPropertiesList.SetItemData(nItem, nItem);\r
192         }\r
193 \r
194         SortItem(pNMListView->iSubItem);\r
195 \r
196         *pResult = 0;\r
197 }\r
198 \r
199 void CPropertiesList::DisplayIndicator()\r
200 {\r
201         CHeaderCtrl *pHeaderCtrl = m_cPropertiesList.GetHeaderCtrl();\r
202 \r
203         for (int nItemCount = 0; nItemCount < pHeaderCtrl->GetItemCount(); ++nItemCount) {\r
204                 HDITEM hditem;\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
211                 } else {\r
212                         hditem.mask = HDI_FORMAT;\r
213                         hditem.fmt = HDF_STRING;\r
214                         hditem.hbm = NULL;\r
215                         pHeaderCtrl->SetItem(nItemCount, &hditem);\r
216                 }\r
217         }\r
218 }\r
219 \r
220 void CPropertiesList::SortItem(int nColumn)\r
221 {\r
222         switch (nColumn) {\r
223         case 0:\r
224                 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);\r
225                 break;\r
226         case 1:\r
227                 m_cPropertiesList.SortItems(CPropertiesList::SortCommand, (LPARAM) &m_cPropertiesList);\r
228                 break;\r
229         case 2:\r
230                 m_cPropertiesList.SortItems(CPropertiesList::SortKey, (LPARAM) &m_cPropertiesList);\r
231                 break;\r
232         default:\r
233                 m_cPropertiesList.SortItems(CPropertiesList::SortCategory, (LPARAM) &m_cPropertiesList);\r
234                 break;\r
235         }\r
236 \r
237         DisplayIndicator();\r
238 }\r
239 \r
240 void CPropertiesList::InsertItem(LPCTSTR szCategory, LPCTSTR szCommandName, LPCTSTR szKey)\r
241 {\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
246 \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
250 }\r
251 \r
252 int CPropertiesList::Sort(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort, SORT_TYPE sortType)\r
253 {\r
254         CListCtrl *pListCtrl = (CListCtrl *) lParamSort;\r
255 \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
259 \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
263 \r
264         int rc = 0;\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
269         case SORT_COMMAND:\r
270                 rc = rc ? rc : _tcscmp(szCommand1, szCommand2);\r
271                 // Do NOT write break; here.\r
272         case SORT_KEY:\r
273                 if (!rc) {\r
274                         rc = rc ? rc : _tcscmp(szKey1, szKey2);\r
275                         if (szKey1.IsEmpty() && !szKey2.IsEmpty()) {\r
276                                 rc = 1;\r
277                         } else if (!szKey1.IsEmpty() && szKey2.IsEmpty()) {\r
278                                 rc = -1;\r
279                         }\r
280                 }\r
281                 break;\r
282         default:\r
283                 break;\r
284         }\r
285         return m_bSortAscending ? rc : rc * -1;\r
286 }\r