* Sync up to trunk head (r65481).
[reactos.git] / 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 DECLARE_COLUMN_PRESET(COMMANDLINE, 450, FALSE)
58 };
59
60 static int InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem);
61 INT_PTR CALLBACK ColumnsDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
62
63 void AddColumns(void)
64 {
65 LRESULT size;
66 WCHAR szTemp[256];
67 unsigned int n;
68
69 for (n=0; n<COLUMN_NMAX; n++) {
70 if (TaskManagerSettings.Columns[n]) {
71 LoadStringW(hInst, ColumnPresets[n].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
72 InsertColumn(n, szTemp, LVCFMT_LEFT, TaskManagerSettings.ColumnSizeArray[n], -1);
73 }
74 }
75
76 size = SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0);
77 SendMessageW(hProcessPageHeaderCtrl, HDM_SETORDERARRAY, (WPARAM) size, (LPARAM) &TaskManagerSettings.ColumnOrderArray);
78
79 UpdateColumnDataHints();
80 }
81
82 static int InsertColumn(int nCol, LPCWSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem)
83 {
84 LVCOLUMN column;
85
86 column.mask = LVCF_TEXT|LVCF_FMT;
87 column.pszText = (LPWSTR)lpszColumnHeading;
88 column.fmt = nFormat;
89
90 if (nWidth != -1)
91 {
92 column.mask |= LVCF_WIDTH;
93 column.cx = nWidth;
94 }
95
96 if (nSubItem != -1)
97 {
98 column.mask |= LVCF_SUBITEM;
99 column.iSubItem = nSubItem;
100 }
101
102 return ListView_InsertColumn(hProcessPageListCtrl, nCol, &column);
103 }
104
105 void SaveColumnSettings(void)
106 {
107 HDITEM hditem;
108 int i, n;
109 WCHAR text[260];
110 WCHAR szTemp[256];
111 LRESULT size;
112
113 /* Reset column data */
114 for (i=0; i<COLUMN_NMAX; i++) {
115 TaskManagerSettings.ColumnOrderArray[i] = i;
116 TaskManagerSettings.Columns[i] = FALSE;
117 TaskManagerSettings.ColumnSizeArray[i] = ColumnPresets[i].size;
118 }
119
120 /* Get header order */
121 size = SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0);
122 SendMessageW(hProcessPageHeaderCtrl, HDM_GETORDERARRAY, (WPARAM) size, (LPARAM) &TaskManagerSettings.ColumnOrderArray);
123
124 /* Get visible columns */
125 for (i = 0; i < SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0); i++) {
126 memset(&hditem, 0, sizeof(HDITEM));
127
128 hditem.mask = HDI_TEXT|HDI_WIDTH;
129 hditem.pszText = text;
130 hditem.cchTextMax = 260;
131
132 SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEM, i, (LPARAM) &hditem);
133
134 for (n = 0; n < COLUMN_NMAX; n++) {
135 LoadStringW(hInst, ColumnPresets[n].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
136 if (_wcsicmp(text, szTemp) == 0)
137 {
138 TaskManagerSettings.Columns[n] = TRUE;
139 TaskManagerSettings.ColumnSizeArray[n] = hditem.cxy;
140 }
141 }
142 }
143 }
144
145 void ProcessPage_OnViewSelectColumns(void)
146 {
147 int i;
148
149 if (DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_COLUMNS_DIALOG), hMainWnd, ColumnsDialogWndProc) == IDOK)
150 {
151 for (i=Header_GetItemCount(hProcessPageHeaderCtrl)-1; i>=0; i--)
152 {
153 (void)ListView_DeleteColumn(hProcessPageListCtrl, i);
154 }
155
156 for (i=0; i<COLUMN_NMAX; i++) {
157 TaskManagerSettings.ColumnOrderArray[i] = i;
158 TaskManagerSettings.ColumnSizeArray[i] = ColumnPresets[i].size;
159 }
160
161 AddColumns();
162 }
163 }
164
165 INT_PTR CALLBACK
166 ColumnsDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
167 {
168 unsigned int i;
169
170 switch (message)
171 {
172 case WM_INITDIALOG:
173
174 for (i=0; i<COLUMN_NMAX; i++) {
175 if (TaskManagerSettings.Columns[i])
176 CheckDlgButton(hDlg, ColumnPresets[i].dwIdcCtrl, BST_CHECKED);
177 }
178 return TRUE;
179
180 case WM_COMMAND:
181
182 if (LOWORD(wParam) == IDCANCEL)
183 {
184 EndDialog(hDlg, LOWORD(wParam));
185 return TRUE;
186 }
187
188 if (LOWORD(wParam) == IDOK)
189 {
190 for (i=0; i<COLUMN_NMAX; i++)
191 TaskManagerSettings.Columns[i] = (BOOL)IsDlgButtonChecked(hDlg, ColumnPresets[i].dwIdcCtrl);
192
193 EndDialog(hDlg, LOWORD(wParam));
194 return TRUE;
195 }
196
197 break;
198 }
199
200 return 0;
201 }
202
203 void UpdateColumnDataHints(void)
204 {
205 HDITEM hditem;
206 WCHAR text[260];
207 ULONG Index;
208 ULONG uItems;
209 WCHAR szTemp[256];
210 UINT i;
211
212 uItems = min(SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEMCOUNT, 0, 0), COLUMN_NMAX);
213
214 for (Index=0; Index<uItems; Index++)
215 {
216 memset(&hditem, 0, sizeof(HDITEM));
217
218 hditem.mask = HDI_TEXT;
219 hditem.pszText = text;
220 hditem.cchTextMax = 260;
221
222 SendMessageW(hProcessPageHeaderCtrl, HDM_GETITEM, Index, (LPARAM) &hditem);
223
224 for (i=0; i<COLUMN_NMAX; i++) {
225 LoadStringW(hInst, ColumnPresets[i].dwIdsName, szTemp, sizeof(szTemp)/sizeof(WCHAR));
226 if (_wcsicmp(text, szTemp) == 0)
227 ColumnDataHints[Index] = i;
228 }
229 }
230 }