[TASKMGR]
[reactos.git] / reactos / base / applications / taskmgr / column.c
1 /*
2 * ReactOS Task Manager
3 *
4 * column.c
5 *
6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7 * 2005 Klemens Friedl <frik85@reactos.at>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include <precomp.h>
25
26 UINT ColumnDataHints[COLUMN_NMAX];
27
28 #define DECLARE_COLUMN_PRESET(_name, _size, _state) \
29 { IDS_TAB_##_name, IDC_##_name, _size, _state },
30
31 const PresetColumnEntry ColumnPresets[COLUMN_NMAX] = {
32 DECLARE_COLUMN_PRESET(IMAGENAME, 105, TRUE)
33 DECLARE_COLUMN_PRESET(PID, 50, TRUE)
34 DECLARE_COLUMN_PRESET(USERNAME, 107, FALSE)
35 DECLARE_COLUMN_PRESET(SESSIONID, 70, FALSE)
36 DECLARE_COLUMN_PRESET(CPUUSAGE, 35, TRUE)
37 DECLARE_COLUMN_PRESET(CPUTIME, 70, TRUE)
38 DECLARE_COLUMN_PRESET(MEMORYUSAGE, 70, TRUE)
39 DECLARE_COLUMN_PRESET(PEAKMEMORYUSAGE, 100, FALSE)
40 DECLARE_COLUMN_PRESET(MEMORYUSAGEDELTA, 70, FALSE)
41 DECLARE_COLUMN_PRESET(PAGEFAULTS, 70, FALSE)
42 DECLARE_COLUMN_PRESET(PAGEFAULTSDELTA, 70, FALSE)
43 DECLARE_COLUMN_PRESET(VIRTUALMEMORYSIZE, 70, FALSE)
44 DECLARE_COLUMN_PRESET(PAGEDPOOL, 70, FALSE)
45 DECLARE_COLUMN_PRESET(NONPAGEDPOOL, 70, FALSE)
46 DECLARE_COLUMN_PRESET(BASEPRIORITY, 60, FALSE)
47 DECLARE_COLUMN_PRESET(HANDLECOUNT, 60, FALSE)
48 DECLARE_COLUMN_PRESET(THREADCOUNT, 60, FALSE)
49 DECLARE_COLUMN_PRESET(USEROBJECTS, 60, FALSE)
50 DECLARE_COLUMN_PRESET(GDIOBJECTS, 60, FALSE)
51 DECLARE_COLUMN_PRESET(IOREADS, 70, FALSE)
52 DECLARE_COLUMN_PRESET(IOWRITES, 70, FALSE)
53 DECLARE_COLUMN_PRESET(IOOTHER, 70, FALSE)
54 DECLARE_COLUMN_PRESET(IOREADBYTES, 70, FALSE)
55 DECLARE_COLUMN_PRESET(IOWRITEBYTES, 70, FALSE)
56 DECLARE_COLUMN_PRESET(IOOTHERBYTES, 70, FALSE)
57 };
58
59 static int InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem);
60 INT_PTR CALLBACK ColumnsDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
61
62 void AddColumns(void)
63 {
64 LRESULT size;
65 WCHAR szTemp[256];
66 unsigned int n;
67
68 for (n=0; n<COLUMN_NMAX; n++) {
69 if (TaskManagerSettings.Columns[n]) {
70 LoadStringW(hInst, ColumnPresets[n].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
71 InsertColumn(n, szTemp, LVCFMT_LEFT, TaskManagerSettings.ColumnSizeArray[n], -1);
72 }
73 }
74
75 size = SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0);
76 SendMessageW(hProcessPageHeaderCtrl, HDM_SETORDERARRAY, (WPARAM) size, (LPARAM) &TaskManagerSettings.ColumnOrderArray);
77
78 UpdateColumnDataHints();
79 }
80
81 static int InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem)
82 {
83 LVCOLUMN column;
84
85 column.mask = LVCF_TEXT|LVCF_FMT;
86 column.pszText = (LPWSTR)lpszColumnHeading;
87 column.fmt = nFormat;
88
89 if (nWidth != -1)
90 {
91 column.mask |= LVCF_WIDTH;
92 column.cx = nWidth;
93 }
94
95 if (nSubItem != -1)
96 {
97 column.mask |= LVCF_SUBITEM;
98 column.iSubItem = nSubItem;
99 }
100
101 return ListView_InsertColumn(hProcessPageListCtrl, nCol, &column);
102 }
103
104 void SaveColumnSettings(void)
105 {
106 HDITEM hditem;
107 int i, n;
108 WCHAR text[260];
109 WCHAR szTemp[256];
110 LRESULT size;
111
112 /* Reset column data */
113 for (i=0; i<COLUMN_NMAX; i++) {
114 TaskManagerSettings.ColumnOrderArray[i] = i;
115 TaskManagerSettings.Columns[i] = FALSE;
116 TaskManagerSettings.ColumnSizeArray[i] = ColumnPresets[i].size;
117 }
118
119 /* Get header order */
120 size = SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0);
121 SendMessageW(hProcessPageHeaderCtrl, HDM_GETORDERARRAY, (WPARAM) size, (LPARAM) &TaskManagerSettings.ColumnOrderArray);
122
123 /* Get visible columns */
124 for (i = 0; i < SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0); i++) {
125 memset(&hditem, 0, sizeof(HDITEM));
126
127 hditem.mask = HDI_TEXT|HDI_WIDTH;
128 hditem.pszText = text;
129 hditem.cchTextMax = 260;
130
131 SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEM, i, (LPARAM) &hditem);
132
133 for (n = 0; n < COLUMN_NMAX; n++) {
134 LoadStringW(hInst, ColumnPresets[n].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
135 if (_wcsicmp(text, szTemp) == 0)
136 {
137 TaskManagerSettings.Columns[n] = TRUE;
138 TaskManagerSettings.ColumnSizeArray[n] = hditem.cxy;
139 }
140 }
141 }
142 }
143
144 void ProcessPage_OnViewSelectColumns(void)
145 {
146 int i;
147
148 if (DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_COLUMNS_DIALOG), hMainWnd, ColumnsDialogWndProc) == IDOK)
149 {
150 for (i=Header_GetItemCount(hProcessPageHeaderCtrl)-1; i>=0; i--)
151 {
152 (void)ListView_DeleteColumn(hProcessPageListCtrl, i);
153 }
154
155 for (i=0; i<COLUMN_NMAX; i++) {
156 TaskManagerSettings.ColumnOrderArray[i] = i;
157 TaskManagerSettings.ColumnSizeArray[i] = ColumnPresets[i].size;
158 }
159
160 AddColumns();
161 }
162 }
163
164 INT_PTR CALLBACK
165 ColumnsDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
166 {
167 unsigned int i;
168
169 switch (message)
170 {
171 case WM_INITDIALOG:
172
173 for (i=0; i<COLUMN_NMAX; i++) {
174 if (TaskManagerSettings.Columns[i])
175 CheckDlgButton(hDlg, ColumnPresets[i].dwIdcCtrl, BST_CHECKED);
176 }
177 return TRUE;
178
179 case WM_COMMAND:
180
181 if (LOWORD(wParam) == IDCANCEL)
182 {
183 EndDialog(hDlg, LOWORD(wParam));
184 return TRUE;
185 }
186
187 if (LOWORD(wParam) == IDOK)
188 {
189 for (i=0; i<COLUMN_NMAX; i++)
190 TaskManagerSettings.Columns[i] = (BOOL)IsDlgButtonChecked(hDlg, ColumnPresets[i].dwIdcCtrl);
191
192 EndDialog(hDlg, LOWORD(wParam));
193 return TRUE;
194 }
195
196 break;
197 }
198
199 return 0;
200 }
201
202 void UpdateColumnDataHints(void)
203 {
204 HDITEM hditem;
205 WCHAR text[260];
206 ULONG Index;
207 WCHAR szTemp[256];
208 unsigned int i;
209
210 for (Index=0; Index<(ULONG)SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0); Index++)
211 {
212 memset(&hditem, 0, sizeof(HDITEM));
213
214 hditem.mask = HDI_TEXT;
215 hditem.pszText = text;
216 hditem.cchTextMax = 260;
217
218 SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEM, Index, (LPARAM) &hditem);
219
220 for (i=0; i<COLUMN_NMAX; i++) {
221 LoadStringW(hInst, ColumnPresets[i].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
222 if (_wcsicmp(text, szTemp) == 0)
223 ColumnDataHints[Index] = i;
224 }
225 }
226 }