windows-misc-20050102
[openafs.git] / src / WINNT / afsusrmgr / columns.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "TaAfsUsrMgr.h"
16 #include "columns.h"
17 #include "display.h"
18
19
20 /*
21  * PROTOTYPES _________________________________________________________________
22  *
23  */
24
25 BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
26 void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault);
27 void Columns_OnSelect (HWND hDlg);
28 void Columns_OnSelAvail (HWND hDlg);
29 void Columns_OnSelShown (HWND hDlg);
30 void Columns_OnInsert (HWND hDlg);
31 void Columns_OnDelete (HWND hDlg);
32 void Columns_OnMoveUp (HWND hDlg);
33 void Columns_OnMoveDown (HWND hDlg);
34 void Columns_OnApply (HWND hDlg);
35
36
37 /*
38  * COLUMNS DIALOG _____________________________________________________________
39  *
40  */
41
42 typedef enum
43    {
44    ceUSERS,           // gr.viewUsr
45    ceGROUPS,          // gr.viewGrp
46    ceMACHINES,        // gr.viewMch
47    } COLUMNS_ENTRY;
48
49 static struct
50    {
51    int ids;
52    BOOL fUsuallyHidden;
53    VIEWINFO vi;
54    BOOL fChanged;
55    }
56 COLUMNS[] =
57    {
58       { IDS_COL_USERS,        FALSE,    {0},    FALSE },  // ceUSERS
59       { IDS_COL_GROUPS,       FALSE,    {0},    FALSE },  // ceGROUPS
60       { IDS_COL_MACHINES,     FALSE,    {0},    FALSE },  // ceMACHINES
61    };
62
63 #define nCOLUMNS (sizeof(COLUMNS)/sizeof(COLUMNS[0]))
64
65 typedef struct
66    {
67    HWND hParent;
68    LPVIEWINFO lpviDefault;
69    } ShowColumnsParams;
70
71 void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi)
72 {
73    for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
74       {
75       COLUMNS[ iCol ].fChanged = FALSE;
76       }
77
78    memcpy (&COLUMNS[ ceUSERS    ].vi, &gr.viewUsr, sizeof(VIEWINFO));
79    memcpy (&COLUMNS[ ceGROUPS   ].vi, &gr.viewGrp, sizeof(VIEWINFO));
80    memcpy (&COLUMNS[ ceMACHINES ].vi, &gr.viewMch, sizeof(VIEWINFO));
81
82    if (lpvi == &gr.viewUsr)
83       lpvi = &COLUMNS[ ceUSERS  ].vi;
84    else if (lpvi == &gr.viewGrp)
85       lpvi = &COLUMNS[ ceGROUPS ].vi;
86    else if (lpvi == &gr.viewMch)
87       lpvi = &COLUMNS[ ceMACHINES ].vi;
88
89    // If the caller didn't specify which VIEWINFO structure to adjust
90    // by default, pick whichever one is on the currently-displayed tab
91    //
92    if (!lpvi)
93       {
94       switch (Display_GetActiveTab())
95          {
96          case ttUSERS:
97             lpvi = &COLUMNS[ ceUSERS ].vi;
98             break;
99          case ttGROUPS:
100             lpvi = &COLUMNS[ ceGROUPS ].vi;
101             break;
102          case ttMACHINES:
103             lpvi = &COLUMNS[ ceMACHINES ].vi;
104             break;
105          }
106       }
107
108    // Show the Columns dialog
109    //
110    LPPROPSHEET psh = PropSheet_Create (IDS_COLUMNS_TITLE, FALSE);
111    psh->sh.hwndParent = hParent;
112
113    ShowColumnsParams *pscp = New (ShowColumnsParams);
114    pscp->hParent = hParent;
115    pscp->lpviDefault = lpvi;
116
117    PropSheet_AddTab (psh, 0, IDD_COLUMNS, (DLGPROC)Columns_DlgProc, (LPARAM)pscp, TRUE);
118    PropSheet_ShowModal (psh, PumpMessage);
119 }
120
121
122 BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
123 {
124    if (AfsAppLib_HandleHelp (IDD_COLUMNS, hDlg, msg, wp, lp))
125       return TRUE;
126
127    if (msg == WM_INITDIALOG)
128       SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam);
129
130    ShowColumnsParams *pscp;
131    pscp = (ShowColumnsParams *)GetWindowLong (hDlg, DWL_USER);
132
133    switch (msg)
134       {
135       case WM_INITDIALOG:
136          Columns_OnInitDialog (hDlg, (pscp) ? pscp->lpviDefault : NULL);
137          break;
138
139       case WM_COMMAND:
140          switch (LOWORD(wp))
141             {
142             case IDAPPLY:
143                Columns_OnApply (hDlg);
144                break;
145
146             case IDOK:
147             case IDCANCEL:
148                EndDialog (hDlg, LOWORD(wp));
149                break;
150
151             case IDC_COLUMNS:
152                if (HIWORD(wp) == CBN_SELCHANGE)
153                   {
154                   Columns_OnSelect (hDlg);
155                   }
156                break;
157
158             case IDC_COL_AVAIL:
159                if (HIWORD(wp) == LBN_SELCHANGE)
160                   {
161                   Columns_OnSelAvail (hDlg);
162                   }
163                break;
164
165             case IDC_COL_SHOWN:
166                if (HIWORD(wp) == LBN_SELCHANGE)
167                   {
168                   Columns_OnSelShown (hDlg);
169                   }
170                break;
171
172             case IDC_COL_INSERT:
173                Columns_OnInsert (hDlg);
174                break;
175
176             case IDC_COL_DELETE:
177                Columns_OnDelete (hDlg);
178                break;
179
180             case IDC_COL_UP:
181                Columns_OnMoveUp (hDlg);
182                break;
183
184             case IDC_COL_DOWN:
185                Columns_OnMoveDown (hDlg);
186                break;
187             }
188          break;
189       }
190
191    return FALSE;
192 }
193
194
195 void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault)
196 {
197    HWND hList = GetDlgItem (hDlg, IDC_COLUMNS);
198    CB_StartChange (hList);
199
200    for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
201       {
202       if ((COLUMNS[iCol].fUsuallyHidden) && (lpviDefault != &COLUMNS[iCol].vi))
203          continue;
204
205       CB_AddItem (hList, COLUMNS[iCol].ids, (LPARAM)&COLUMNS[iCol].vi);
206       }
207
208    CB_EndChange (hList, (LPARAM)lpviDefault);
209
210    Columns_OnSelect (hDlg);
211 }
212
213
214 void Columns_OnSelect (HWND hDlg)
215 {
216    HWND hList;
217    LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem(hDlg,IDC_COLUMNS));
218
219    // Fill in the Available list...
220    //
221    hList = GetDlgItem (hDlg, IDC_COL_AVAIL);
222    LB_StartChange (hList);
223
224    for (size_t iAvail = 0; iAvail < lpvi->nColsAvail; ++iAvail)
225       {
226       for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown)
227          {
228          if (lpvi->aColumns[ iShown ] == iAvail)
229             break;
230          }
231       if (iShown == lpvi->nColsShown)
232          {
233          LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail);
234          }
235       }
236
237    LB_EndChange (hList);
238    Columns_OnSelAvail (hDlg);
239
240    // Fill in the Shown list...
241    //
242    hList = GetDlgItem (hDlg, IDC_COL_SHOWN);
243    LB_StartChange (hList);
244
245    for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown)
246       {
247       iAvail = lpvi->aColumns[ iShown ];
248       LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail);
249       }
250
251    LB_EndChange (hList);
252    Columns_OnSelShown (hDlg);
253 }
254
255
256 void Columns_OnSelAvail (HWND hDlg)
257 {
258    HWND hList = GetDlgItem (hDlg, IDC_COL_AVAIL);
259    int ii = LB_GetSelected (hList);
260
261    EnableWindow (GetDlgItem (hDlg, IDC_COL_INSERT), (ii != -1));
262 }
263
264
265 void Columns_OnSelShown (HWND hDlg)
266 {
267    HWND hList = GetDlgItem (hDlg, IDC_COL_SHOWN);
268    int ii = LB_GetSelected (hList);
269
270    if (ii == -1)
271       {
272       EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), FALSE);
273       EnableWindow (GetDlgItem (hDlg, IDC_COL_UP),     FALSE);
274       EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN),   FALSE);
275       }
276    else
277       {
278       int iAvail = LB_GetData (hList, ii);
279       EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), (iAvail != 0));
280
281       int ci = (int)SendMessage (hList, LB_GETCOUNT, 0, 0);
282       EnableWindow (GetDlgItem (hDlg, IDC_COL_UP),   (ii > 1));
283       EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), (ii > 0 && ii < ci-1));
284       }
285 }
286
287
288 void Columns_OnInsert (HWND hDlg)
289 {
290    LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
291    HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
292    HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
293    int ii = LB_GetSelected (hAvail);
294
295    if (ii != -1)
296       {
297       size_t iAvail = LB_GetData (hAvail, ii);
298       int iShown = 1+ LB_GetSelected (hShown);
299
300       TCHAR szText[ cchRESOURCE ];
301       SendMessage (hAvail, LB_GETTEXT, ii, (LPARAM)szText);
302
303       LB_AddItem (hShown, szText, iAvail);
304       SendMessage (hAvail, LB_DELETESTRING, ii, 0);
305
306       lpvi->aColumns[ lpvi->nColsShown ] = iAvail;
307       lpvi->nColsShown ++;
308
309       for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
310          {
311          if (lpvi == &COLUMNS[ iCol ].vi)
312             COLUMNS[ iCol ].fChanged = TRUE;
313          }
314
315       Columns_OnSelAvail (hDlg);
316       Columns_OnSelShown (hDlg);
317       PropSheetChanged (hDlg);
318       }
319 }
320
321
322 void Columns_OnDelete (HWND hDlg)
323 {
324    LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
325    HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
326    HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
327    int ii = LB_GetSelected (hShown);
328
329    if (ii != -1)
330       {
331       TCHAR szText[ cchRESOURCE ];
332       SendMessage (hShown, LB_GETTEXT, ii, (LPARAM)szText);
333
334       size_t iAvail = (size_t)LB_GetData (hShown, ii);
335       LB_AddItem (hAvail, szText, iAvail);
336       SendMessage (hShown, LB_DELETESTRING, ii, 0);
337
338       for ( ; ii < (int)lpvi->nColsShown-1; ++ii)
339          {
340          lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ];
341          }
342       lpvi->nColsShown --;
343
344       for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
345          {
346          if (lpvi == &COLUMNS[ iCol ].vi)
347             COLUMNS[ iCol ].fChanged = TRUE;
348          }
349
350       Columns_OnSelAvail (hDlg);
351       Columns_OnSelShown (hDlg);
352       PropSheetChanged (hDlg);
353       }
354 }
355
356
357 void Columns_OnMoveUp (HWND hDlg)
358 {
359    LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
360    HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
361    HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
362    int ii = LB_GetSelected (hShown);
363
364    if (ii > 0)
365       {
366       size_t iAvail = (size_t)LB_GetData (hShown, ii);
367       lpvi->aColumns[ ii ] = lpvi->aColumns[ ii-1 ];
368       lpvi->aColumns[ ii-1 ] = iAvail;
369
370       for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
371          {
372          if (lpvi == &COLUMNS[ iCol ].vi)
373             COLUMNS[ iCol ].fChanged = TRUE;
374          }
375
376       Columns_OnSelect (hDlg);
377       LB_SetSelectedByData (hShown, (LPARAM)iAvail);
378       Columns_OnSelShown (hDlg);
379       PropSheetChanged (hDlg);
380       }
381 }
382
383
384 void Columns_OnMoveDown (HWND hDlg)
385 {
386    LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
387    HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
388    HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
389    int ii = LB_GetSelected (hShown);
390
391    if (ii != -1)
392       {
393       size_t iAvail = (size_t)LB_GetData (hShown, ii);
394       lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ];
395       lpvi->aColumns[ ii+1 ] = iAvail;
396
397       for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
398          {
399          if (lpvi == &COLUMNS[ iCol ].vi)
400             COLUMNS[ iCol ].fChanged = TRUE;
401          }
402
403       Columns_OnSelect (hDlg);
404       LB_SetSelectedByData (hShown, (LPARAM)iAvail);
405       Columns_OnSelShown (hDlg);
406       PropSheetChanged (hDlg);
407       }
408 }
409
410
411 void Columns_OnApply (HWND hDlg)
412 {
413    for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
414       {
415       if (COLUMNS[ iCol ].fChanged)
416          {
417          switch (iCol)
418             {
419             case ceUSERS:
420                if (Display_GetActiveTab() == ttUSERS)
421                   Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivUsr);
422                else
423                   memcpy (&gr.viewUsr, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO));
424                break;
425
426             case ceGROUPS:
427                if (Display_GetActiveTab() == ttGROUPS)
428                   Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivGrp);
429                else
430                   memcpy (&gr.viewGrp, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO));
431                break;
432
433             case ceMACHINES:
434                if (Display_GetActiveTab() == ttMACHINES)
435                   Display_RefreshView (&COLUMNS[ iCol ].vi, gr.ivMch);
436                else
437                   memcpy (&gr.viewMch, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO));
438                break;
439             }
440          }
441       }
442 }
443