2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
17 #include "svr_window.h"
18 #include "propcache.h"
23 * PROTOTYPES _________________________________________________________________
27 BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
28 void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault);
29 void Columns_OnSelect (HWND hDlg);
30 void Columns_OnSelAvail (HWND hDlg);
31 void Columns_OnSelShown (HWND hDlg);
32 void Columns_OnInsert (HWND hDlg);
33 void Columns_OnDelete (HWND hDlg);
34 void Columns_OnMoveUp (HWND hDlg);
35 void Columns_OnMoveDown (HWND hDlg);
36 BOOL Columns_OnApply (HWND hDlg, LPVIEWINFO lpviDefault);
40 * COLUMNS DIALOG _____________________________________________________________
46 ceSERVERS = 0, // gr.di*.viewSvr
47 ceFILESETS, // gr.viewSet
48 ceAGGREGATES, // gr.viewAgg
49 ceSERVICES, // gr.viewSvc
50 ceREPLICAS, // gr.viewRep
51 ceAGGS_MOVE, // gr.viewAggMove
52 ceAGGS_CREATE, // gr.viewAggCreate
53 ceAGGS_RESTORE // gr.viewAggRestore
65 { IDS_COL_SERVERS, FALSE }, // ceSERVERS
66 { IDS_COL_FILESETS, FALSE }, // ceFILESETS
67 { IDS_COL_AGGREGATES, FALSE }, // ceAGGREGATES
68 { IDS_COL_SERVICES, FALSE }, // ceSERVICES
69 { IDS_COL_REPLICAS, FALSE }, // ceREPLICAS
70 { IDS_COL_AGGS_MOVE, TRUE }, // ceAGG_MOVE
71 { IDS_COL_AGGS_CREATE, TRUE }, // ceAGG_CREATE
72 { IDS_COL_AGGS_RESTORE, TRUE } // ceAGG_RESTORE
75 #define nCOLUMNS (sizeof(COLUMNS)/sizeof(COLUMNS[0]))
80 LPVIEWINFO lpviDefault;
83 void ShowColumnsDialog (HWND hParent, LPVIEWINFO lpvi)
85 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
87 COLUMNS[ iCol ].fChanged = FALSE;
90 if (gr.fPreview && !gr.fVert)
91 memcpy (&COLUMNS[ ceSERVERS ].vi, &gr.diHorz.viewSvr, sizeof(VIEWINFO));
93 memcpy (&COLUMNS[ ceSERVERS ].vi, &gr.diVert.viewSvr, sizeof(VIEWINFO));
95 memcpy (&COLUMNS[ ceFILESETS ].vi, &gr.viewSet, sizeof(VIEWINFO));
96 memcpy (&COLUMNS[ ceAGGREGATES ].vi, &gr.viewAgg, sizeof(VIEWINFO));
97 memcpy (&COLUMNS[ ceSERVICES ].vi, &gr.viewSvc, sizeof(VIEWINFO));
98 memcpy (&COLUMNS[ ceREPLICAS ].vi, &gr.viewRep, sizeof(VIEWINFO));
99 memcpy (&COLUMNS[ ceAGGS_MOVE ].vi, &gr.viewAggMove, sizeof(VIEWINFO));
100 memcpy (&COLUMNS[ ceAGGS_CREATE ].vi, &gr.viewAggCreate, sizeof(VIEWINFO));
101 memcpy (&COLUMNS[ ceAGGS_RESTORE ].vi, &gr.viewAggRestore, sizeof(VIEWINFO));
103 if (lpvi == &gr.viewSet)
104 lpvi = &COLUMNS[ ceFILESETS ].vi;
105 else if (lpvi == &gr.viewAgg)
106 lpvi = &COLUMNS[ ceAGGREGATES ].vi;
107 else if (lpvi == &gr.viewSvc)
108 lpvi = &COLUMNS[ ceSERVICES ].vi;
109 else if (lpvi == &gr.viewRep)
110 lpvi = &COLUMNS[ ceREPLICAS ].vi;
111 else if (lpvi == &gr.viewAggMove)
112 lpvi = &COLUMNS[ ceAGGS_MOVE ].vi;
113 else if (lpvi == &gr.viewAggCreate)
114 lpvi = &COLUMNS[ ceAGGS_CREATE ].vi;
115 else if (lpvi == &gr.viewAggRestore)
116 lpvi = &COLUMNS[ ceAGGS_RESTORE ].vi;
118 lpvi = &COLUMNS[ ceSERVERS ].vi;
120 LPPROPSHEET psh = PropSheet_Create (IDS_COLUMNS_TITLE, FALSE);
121 psh->sh.hwndParent = hParent;
123 ShowColumnsParams *pscp = New (ShowColumnsParams);
124 pscp->hParent = hParent;
125 pscp->lpviDefault = lpvi;
127 PropSheet_AddTab (psh, 0, IDD_COLUMNS, (DLGPROC)Columns_DlgProc, (LPARAM)pscp, TRUE);
128 PropSheet_ShowModal (psh, PumpMessage);
132 BOOL CALLBACK Columns_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
134 if (AfsAppLib_HandleHelp (IDD_COLUMNS, hDlg, msg, wp, lp))
137 if (msg == WM_INITDIALOG)
138 SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam);
140 ShowColumnsParams *pscp;
141 pscp = (ShowColumnsParams *)GetWindowLong (hDlg, DWL_USER);
145 case WM_INITDIALOG_SHEET:
146 PropCache_Add (pcGENERAL, NULL, hDlg);
149 case WM_DESTROY_SHEET:
150 PropCache_Delete (hDlg);
154 Columns_OnInitDialog (hDlg, (pscp) ? pscp->lpviDefault : NULL);
161 if (Columns_OnApply (hDlg, (pscp) ? pscp->lpviDefault : NULL))
165 PostMessage (pscp->hParent, WM_COLUMNS_CHANGED, 0, 0);
172 EndDialog (hDlg, LOWORD(wp));
176 if (HIWORD(wp) == CBN_SELCHANGE)
178 Columns_OnSelect (hDlg);
183 if (HIWORD(wp) == LBN_SELCHANGE)
185 Columns_OnSelAvail (hDlg);
190 if (HIWORD(wp) == LBN_SELCHANGE)
192 Columns_OnSelShown (hDlg);
197 Columns_OnInsert (hDlg);
201 Columns_OnDelete (hDlg);
205 Columns_OnMoveUp (hDlg);
209 Columns_OnMoveDown (hDlg);
219 void Columns_OnInitDialog (HWND hDlg, LPVIEWINFO lpviDefault)
223 lpviDefault = (gr.fPreview && !gr.fVert) ? &gr.diHorz.viewSvr : &gr.diVert.viewSvr;
226 HWND hList = GetDlgItem (hDlg, IDC_COLUMNS);
227 CB_StartChange (hList);
229 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
231 if ((COLUMNS[iCol].fUsuallyHidden) && (lpviDefault != &COLUMNS[iCol].vi))
234 CB_AddItem (hList, COLUMNS[iCol].ids, (LPARAM)&COLUMNS[iCol].vi);
237 CB_EndChange (hList, (LPARAM)lpviDefault);
239 Columns_OnSelect (hDlg);
243 void Columns_OnSelect (HWND hDlg)
246 LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem(hDlg,IDC_COLUMNS));
248 // Fill in the Available list...
250 hList = GetDlgItem (hDlg, IDC_COL_AVAIL);
251 LB_StartChange (hList);
253 for (size_t iAvail = 0; iAvail < lpvi->nColsAvail; ++iAvail)
255 for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown)
257 if (lpvi->aColumns[ iShown ] == iAvail)
260 if (iShown == lpvi->nColsShown)
262 LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail);
266 LB_EndChange (hList);
267 Columns_OnSelAvail (hDlg);
269 // Fill in the Shown list...
271 hList = GetDlgItem (hDlg, IDC_COL_SHOWN);
272 LB_StartChange (hList);
274 for (size_t iShown = 0; iShown < lpvi->nColsShown; ++iShown)
276 iAvail = lpvi->aColumns[ iShown ];
277 LB_AddItem (hList, lpvi->idsColumns[ iAvail ], (LPARAM)iAvail);
280 LB_EndChange (hList);
281 Columns_OnSelShown (hDlg);
285 void Columns_OnSelAvail (HWND hDlg)
287 HWND hList = GetDlgItem (hDlg, IDC_COL_AVAIL);
288 int ii = LB_GetSelected (hList);
290 EnableWindow (GetDlgItem (hDlg, IDC_COL_INSERT), (ii != -1));
294 void Columns_OnSelShown (HWND hDlg)
296 HWND hList = GetDlgItem (hDlg, IDC_COL_SHOWN);
297 int ii = LB_GetSelected (hList);
301 EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), FALSE);
302 EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), FALSE);
303 EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), FALSE);
307 int iAvail = LB_GetData (hList, ii);
308 EnableWindow (GetDlgItem (hDlg, IDC_COL_DELETE), (iAvail != 0));
310 int ci = (int)SendMessage (hList, LB_GETCOUNT, 0, 0);
311 EnableWindow (GetDlgItem (hDlg, IDC_COL_UP), (ii > 1));
312 EnableWindow (GetDlgItem (hDlg, IDC_COL_DOWN), (ii > 0 && ii < ci-1));
317 void Columns_OnInsert (HWND hDlg)
319 LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
320 HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
321 HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
322 int ii = LB_GetSelected (hAvail);
326 size_t iAvail = LB_GetData (hAvail, ii);
327 int iShown = 1+ LB_GetSelected (hShown);
329 TCHAR szText[ cchRESOURCE ];
330 SendMessage (hAvail, LB_GETTEXT, ii, (LPARAM)szText);
332 LB_AddItem (hShown, szText, iAvail);
333 SendMessage (hAvail, LB_DELETESTRING, ii, 0);
335 lpvi->aColumns[ lpvi->nColsShown ] = iAvail;
338 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
340 if (lpvi == &COLUMNS[ iCol ].vi)
341 COLUMNS[ iCol ].fChanged = TRUE;
344 Columns_OnSelAvail (hDlg);
345 Columns_OnSelShown (hDlg);
346 PropSheetChanged (hDlg);
351 void Columns_OnDelete (HWND hDlg)
353 LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
354 HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
355 HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
356 int ii = LB_GetSelected (hShown);
360 TCHAR szText[ cchRESOURCE ];
361 SendMessage (hShown, LB_GETTEXT, ii, (LPARAM)szText);
363 size_t iAvail = (size_t)LB_GetData (hShown, ii);
364 LB_AddItem (hAvail, szText, iAvail);
365 SendMessage (hShown, LB_DELETESTRING, ii, 0);
367 for ( ; ii < (int)lpvi->nColsShown-1; ++ii)
369 lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ];
373 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
375 if (lpvi == &COLUMNS[ iCol ].vi)
376 COLUMNS[ iCol ].fChanged = TRUE;
379 Columns_OnSelAvail (hDlg);
380 Columns_OnSelShown (hDlg);
381 PropSheetChanged (hDlg);
386 void Columns_OnMoveUp (HWND hDlg)
388 LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
389 HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
390 HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
391 int ii = LB_GetSelected (hShown);
395 size_t iAvail = (size_t)LB_GetData (hShown, ii);
396 lpvi->aColumns[ ii ] = lpvi->aColumns[ ii-1 ];
397 lpvi->aColumns[ ii-1 ] = iAvail;
399 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
401 if (lpvi == &COLUMNS[ iCol ].vi)
402 COLUMNS[ iCol ].fChanged = TRUE;
405 Columns_OnSelect (hDlg);
406 LB_SetSelectedByData (hShown, (LPARAM)iAvail);
407 Columns_OnSelShown (hDlg);
408 PropSheetChanged (hDlg);
413 void Columns_OnMoveDown (HWND hDlg)
415 LPVIEWINFO lpvi = (LPVIEWINFO)CB_GetSelectedData (GetDlgItem (hDlg, IDC_COLUMNS));
416 HWND hAvail = GetDlgItem (hDlg, IDC_COL_AVAIL);
417 HWND hShown = GetDlgItem (hDlg, IDC_COL_SHOWN);
418 int ii = LB_GetSelected (hShown);
422 size_t iAvail = (size_t)LB_GetData (hShown, ii);
423 lpvi->aColumns[ ii ] = lpvi->aColumns[ ii+1 ];
424 lpvi->aColumns[ ii+1 ] = iAvail;
426 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
428 if (lpvi == &COLUMNS[ iCol ].vi)
429 COLUMNS[ iCol ].fChanged = TRUE;
432 Columns_OnSelect (hDlg);
433 LB_SetSelectedByData (hShown, (LPARAM)iAvail);
434 Columns_OnSelShown (hDlg);
435 PropSheetChanged (hDlg);
440 BOOL Columns_OnApply (HWND hDlg, LPVIEWINFO lpviDefault)
442 BOOL fPostMessage = FALSE;
444 for (size_t iCol = 0; iCol < nCOLUMNS; ++iCol)
446 if (COLUMNS[ iCol ].fChanged)
448 CHILDTAB iTab = (CHILDTAB)-1;
452 memcpy (&vi, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO));
454 LPVIEWINFO lpviTarget = NULL;
459 if (gr.fPreview && !gr.fVert)
460 lpviTarget = &gr.diHorz.viewSvr;
462 lpviTarget = &gr.diVert.viewSvr;
463 FL_RestoreView (GetDlgItem (g.hMain, IDC_SERVERS), &COLUMNS[ iCol ].vi);
464 UpdateDisplay_Servers (FALSE, NULL, 0);
468 lpviTarget = &gr.viewSet;
470 idcList = IDC_SET_LIST;
474 lpviTarget = &gr.viewAgg;
475 iTab = tabAGGREGATES;
476 idcList = IDC_AGG_LIST;
480 lpviTarget = &gr.viewSvc;
482 idcList = IDC_SVC_LIST;
486 lpviTarget = &gr.viewRep;
490 lpviTarget = &gr.viewAggMove;
494 lpviTarget = &gr.viewAggCreate;
498 lpviTarget = &gr.viewAggRestore;
502 if (lpviTarget != NULL)
504 memcpy (lpviTarget, &COLUMNS[ iCol ].vi, sizeof(VIEWINFO));
505 if (lpviDefault == &COLUMNS[ iCol ].vi)
509 if (iTab != (CHILDTAB)-1)
511 for (HWND hServer = g.hMain;
513 hServer = PropCache_Search (pcSERVER, ANYVALUE, hServer))
515 HWND hTab = GetDlgItem (hServer, IDC_TABS);
516 int iTabShown = TabCtrl_GetCurSel (hTab);
518 if (iTab == iTabShown)
520 HWND hChild = Server_GetCurrentTab (hServer);
521 HWND hList = GetDlgItem (hChild, idcList);
523 TCHAR szClassName[ cchRESOURCE ];
524 if (GetClassName (hList, szClassName, cchRESOURCE))
526 if (lstrcmp (szClassName, WC_FASTLIST))
530 FL_StoreView (hList, &vi);
531 COLUMNS[ iCol ].vi.lvsView = vi.lvsView;
532 FL_RestoreView (hList, &COLUMNS[ iCol ].vi);
533 Server_ForceRedraw (hServer);
536 if (hServer == g.hMain)