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>
15 #include "TaAfsUsrMgr.h"
22 * ANIMATED ICON ______________________________________________________________
26 static DWORD l_cReqAnimation = 0;
28 void Display_StartWorking (void)
30 if ((++l_cReqAnimation) == 1)
32 AfsAppLib_StartAnimation (GetDlgItem (g.hMain, IDC_ANIM));
37 void Display_StopWorking (void)
39 if (!l_cReqAnimation || !(--l_cReqAnimation))
41 AfsAppLib_StopAnimation (GetDlgItem (g.hMain, IDC_ANIM));
47 * USER/GROUP LISTS ___________________________________________________________
51 void Display_PopulateList (void)
53 switch (Display_GetActiveTab())
56 Display_PopulateUserList();
60 Display_PopulateGroupList();
64 Display_PopulateMachineList();
70 void Display_PopulateUserList (void)
74 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
75 HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST);
78 TCHAR szQuerying[ cchRESOURCE ];
79 GetString (szQuerying, IDS_QUERYING_LONG);
80 SetDlgItemText (hDlg, IDC_USERS_TITLE, szQuerying);
82 Display_StartWorking();
83 GetDlgItemText (hDlg, IDC_USERS_PATTERN, g.szPatternUsers, cchNAME);
84 StartTask (taskUPD_USERS, g.hMain);
90 void Display_PopulateGroupList (void)
94 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
95 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
98 TCHAR szQuerying[ cchRESOURCE ];
99 GetString (szQuerying, IDS_QUERYING_LONG);
100 SetDlgItemText (hDlg, IDC_GROUPS_TITLE, szQuerying);
102 Display_StartWorking();
103 GetDlgItemText (hDlg, IDC_GROUPS_PATTERN, g.szPatternGroups, cchNAME);
104 StartTask (taskUPD_GROUPS, g.hMain);
110 void Display_PopulateMachineList (void)
114 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
115 HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
116 if (IsWindow (hList))
118 TCHAR szQuerying[ cchRESOURCE ];
119 GetString (szQuerying, IDS_QUERYING_LONG);
120 SetDlgItemText (hDlg, IDC_MACHINES_TITLE, szQuerying);
122 Display_StartWorking();
123 GetDlgItemText (hDlg, IDC_MACHINES_PATTERN, g.szPatternMachines, cchNAME);
124 StartTask (taskUPD_MACHINES, g.hMain);
130 void Display_OnEndTask_UpdUsers (LPTASKPACKET ptp)
132 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
133 HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST);
134 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternUsers))
136 FastList_Begin (hList);
138 // Update the title above the list to indicate what we're showing
140 TCHAR szCell[ cchRESOURCE ];
141 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
143 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0] || (gr.SearchUsers.SearchType != SEARCH_NO_LIMITATIONS)) ? IDS_USERS_PATTERN : IDS_USERS_ALL, TEXT("%s"), szCell);
144 SetDlgItemText (hDlg, IDC_USERS_TITLE, pszTitle);
145 FreeString (pszTitle);
147 // For faster access, we'll want to use a hashlist to deal with
148 // the items in our ASIDLIST (right now it's just a flat array).
149 // This lets us remove duplicates--which is no big deal because
150 // there shouldn't be any anyway--but more importantly it lets
151 // us instantly determine if a particular ASID is in the list
152 // (the asc_AsidListTest function is O(n), and we need O(1)).
154 LPHASHLIST pAsidList = New (HASHLIST);
155 if (TASKDATA(ptp)->pAsidList)
157 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
158 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
161 // Delete any items which are currently in the FastList but
162 // which aren't in our AsidList.
165 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
167 hItemNext = FastList_FindNext (hList, hItem);
168 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
169 if (!pAsidList->fIsInList ((PVOID)idObject))
170 FastList_RemoveItem (hList, hItem);
173 // Add items for any entries which are in our AsidList but aren't
174 // currently in the FastList.
176 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
178 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
180 ASID idObject = (ASID)( pEnum->GetObject() );
183 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
186 memset (&ai, 0x00, sizeof(ai));
187 Display_GetImageIcons (dwStyle, gr.ivUsr, idObject, imageUSER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
188 ai.lParam = (LPARAM)idObject;
189 hItem = FastList_AddItem (hList, &ai);
194 FastList_End (hList);
197 Display_StopWorking();
201 void Display_OnEndTask_UpdGroups (LPTASKPACKET ptp)
203 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
204 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
205 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternGroups))
207 FastList_Begin (hList);
209 // Update the title above the list to indicate what we're showing
211 TCHAR szCell[ cchRESOURCE ];
212 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
214 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_GROUPS_PATTERN : IDS_GROUPS_ALL, TEXT("%s"), szCell);
215 SetDlgItemText (hDlg, IDC_GROUPS_TITLE, pszTitle);
216 FreeString (pszTitle);
218 // For faster access, we'll want to use a hashlist to deal with
219 // the items in our ASIDLIST (right now it's just a flat array).
220 // This lets us remove duplicates--which is no big deal because
221 // there shouldn't be any anyway--but more importantly it lets
222 // us instantly determine if a particular ASID is in the list
223 // (the asc_AsidListTest function is O(n), and we need O(1)).
225 LPHASHLIST pAsidList = New (HASHLIST);
226 if (TASKDATA(ptp)->pAsidList)
228 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
229 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
232 // Delete any items which are currently in the FastList but
233 // which aren't in our AsidList.
236 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
238 hItemNext = FastList_FindNext (hList, hItem);
239 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
240 if (!pAsidList->fIsInList ((PVOID)idObject))
241 FastList_RemoveItem (hList, hItem);
244 // Add items for any entries which are in our AsidList but aren't
245 // currently in the FastList.
247 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
249 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
251 ASID idObject = (ASID)( pEnum->GetObject() );
254 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
257 memset (&ai, 0x00, sizeof(ai));
258 Display_GetImageIcons (dwStyle, gr.ivGrp, idObject, imageGROUP, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
259 ai.lParam = (LPARAM)idObject;
260 hItem = FastList_AddItem (hList, &ai);
265 FastList_End (hList);
268 Display_StopWorking();
272 void Display_OnEndTask_UpdMachines (LPTASKPACKET ptp)
274 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
275 HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
276 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternMachines))
278 FastList_Begin (hList);
280 // Update the title above the list to indicate what we're showing
282 TCHAR szCell[ cchRESOURCE ];
283 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
285 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_MACHINES_PATTERN : IDS_MACHINES_ALL, TEXT("%s"), szCell);
286 SetDlgItemText (hDlg, IDC_MACHINES_TITLE, pszTitle);
287 FreeString (pszTitle);
289 // For faster access, we'll want to use a hashlist to deal with
290 // the items in our ASIDLIST (right now it's just a flat array).
291 // This lets us remove duplicates--which is no big deal because
292 // there shouldn't be any anyway--but more importantly it lets
293 // us instantly determine if a particular ASID is in the list
294 // (the asc_AsidListTest function is O(n), and we need O(1)).
296 LPHASHLIST pAsidList = New (HASHLIST);
297 if (TASKDATA(ptp)->pAsidList)
299 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
300 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
303 // Delete any items which are currently in the FastList but
304 // which aren't in our AsidList.
307 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
309 hItemNext = FastList_FindNext (hList, hItem);
310 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
311 if (!pAsidList->fIsInList ((PVOID)idObject))
312 FastList_RemoveItem (hList, hItem);
315 // Add items for any entries which are in our AsidList but aren't
316 // currently in the FastList.
318 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
320 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
322 ASID idObject = (ASID)( pEnum->GetObject() );
325 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
328 memset (&ai, 0x00, sizeof(ai));
329 Display_GetImageIcons (dwStyle, gr.ivMch, idObject, imageSERVER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
330 ai.lParam = (LPARAM)idObject;
331 hItem = FastList_AddItem (hList, &ai);
336 FastList_End (hList);
339 Display_StopWorking();
343 void Display_RefreshView (LPVIEWINFO pviNew, ICONVIEW ivNew)
345 // Find the current VIEWINFO and ICONVIEW settings
347 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
352 switch (Display_GetActiveTab())
356 pviOld = &gr.viewUsr;
357 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
362 pviOld = &gr.viewGrp;
363 hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
368 pviOld = &gr.viewMch;
369 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
375 FastList_Begin (hList);
377 // If the VIEWINFO state has changed, fix it. This will change between
378 // large icons, small icons and details, as well as correct the currently-
379 // displayed columns to match what's in the new VIEWINFO structure.
381 BOOL fChangedLayouts = FALSE;
383 if (memcmp (pviOld, pviNew, sizeof(VIEWINFO)))
385 FL_RestoreView (hList, pviNew);
386 fChangedLayouts = ((pviOld->lvsView & FLS_VIEW_MASK) != (pviNew->lvsView & FLS_VIEW_MASK)) ? TRUE : FALSE;
387 memcpy (pviOld, pviNew, sizeof(VIEWINFO));
390 // If the ICONVIEW state has changed, fix all items to show just
391 // the appropriate icons. We'll also have to do this if we just changed
392 // from details/small/large icons to another layout (that's what
393 // fChangedLayouts indicates)
395 if ((*pivOld != ivNew) || (fChangedLayouts))
397 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
399 HLISTITEM hItem = NULL;
400 while ((hItem = FastList_FindNext (hList, hItem)) != NULL)
402 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
406 if (pviOld == &gr.viewUsr)
407 Display_GetImageIcons (dwStyle, ivNew, idObject, imageUSER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
408 else if (pviOld == &gr.viewGrp)
409 Display_GetImageIcons (dwStyle, ivNew, idObject, imageGROUP, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
411 Display_GetImageIcons (dwStyle, ivNew, idObject, imageSERVER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
413 FastList_SetItemFirstImage (hList, hItem, iFirstImage);
414 FastList_SetItemSecondImage (hList, hItem, iSecondImage);
420 FastList_End (hList);
425 void Display_RefreshView_Fast (void)
427 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
428 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
429 if (!IsWindow (hList))
430 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
431 if (!IsWindow (hList))
432 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
433 if (IsWindow (hList))
436 GetClientRect (hList, &rWindow);
437 InvalidateRect (hList, &rWindow, FALSE);
438 UpdateWindow (hList);
443 void Display_SelectAll (void)
445 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
446 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
447 if (!IsWindow (hList))
448 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
449 if (!IsWindow (hList))
450 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
451 if (IsWindow (hList))
453 // Select all items in the list
455 FastList_SelectAll (hList);
457 // Simulate a FLN_ITEMSELECT notification (since we changed
458 // the selection programmatically, no notification will have been
461 FLN_ITEMSELECT_PARAMS fln;
462 fln.hdr.hwndFrom = hList;
463 fln.hdr.idFrom = GetWindowLong (hList, GWL_ID);
464 fln.hdr.code = FLN_ITEMSELECT;
465 fln.hItem = FastList_FindFirstSelected (hList);
466 SendMessage (GetParent (hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln);
471 LPASIDLIST Display_GetSelectedList (void)
473 LPASIDLIST pAsidList = NULL;
475 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
476 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
477 if (!IsWindow (hList))
478 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
479 if (!IsWindow (hList))
480 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
481 if (IsWindow (hList))
483 if (asc_AsidListCreate (&pAsidList))
485 for (HLISTITEM hItem = FastList_FindFirstSelected (hList);
487 hItem = FastList_FindNextSelected (hList, hItem))
489 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
491 asc_AsidListAddEntry (&pAsidList, idObject, 0);
500 size_t Display_GetSelectedCount (void)
502 size_t cSelected = 0;
504 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
505 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
506 if (!IsWindow (hList))
507 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
508 if (!IsWindow (hList))
509 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
510 if (IsWindow (hList))
512 for (HLISTITEM hItem = FastList_FindFirstSelected (hList);
514 hItem = FastList_FindNextSelected (hList, hItem))
524 TABTYPE Display_GetActiveTab (void)
526 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
527 if (IsWindow (GetDlgItem (hDlg, IDC_GROUPS_LIST)))
529 if (IsWindow (GetDlgItem (hDlg, IDC_MACHINES_LIST)))
536 * ROUTINES ___________________________________________________________________
540 BOOL Display_HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi)
542 if (msg == WM_NOTIFY)
544 HWND hList = GetDlgItem (hDlg, (int)((LPNMHDR)lp)->idFrom);
545 if (fIsFastList (hList))
547 switch (((LPNMHDR)lp)->code)
549 case FLN_COLUMNRESIZE:
550 FL_StoreView (hList, pvi);
553 case FLN_COLUMNCLICK:
554 LPFLN_COLUMNCLICK_PARAMS pp = (LPFLN_COLUMNCLICK_PARAMS)lp;
558 FastList_GetSortStyle (hList, &iCol, &fRev);
560 if (iCol == pp->icol)
561 FastList_SetSortStyle (hList, iCol, !fRev);
563 FastList_SetSortStyle (hList, pp->icol, FALSE);
565 FL_StoreView (hList, pvi);
575 BOOL CALLBACK Display_GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, UINT_PTR dwCookie)
577 LPVIEWINFO lpvi = (LPVIEWINFO)dwCookie;
578 ASID idObject = (ASID)(pfln->item.lParam);
580 pfln->item.pszText[0] = TEXT('\0');
582 if ((idObject) && (pfln->item.icol < (int)lpvi->nColsShown))
584 size_t iCol = lpvi->aColumns[ pfln->item.icol ];
586 if (lpvi == &gr.viewUsr)
588 User_GetColumn (idObject, (USERCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
590 else if (lpvi == &gr.viewGrp)
592 Group_GetColumn (idObject, (GROUPCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
594 else if (lpvi == &gr.viewMch)
596 Machine_GetColumn (idObject, (MACHINECOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
604 void Display_GetImageIcons (DWORD dwStyle, ICONVIEW iv, ASID idObject, int iImageNormal, int iImageAlert, int *piFirstImage, int *piSecondImage)
608 if ((dwStyle & FLS_VIEW_MASK) != FLS_VIEW_LIST)
614 *piFirstImage = iImageNormal;
615 *piSecondImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE;
619 *piFirstImage = (fAlert) ? iImageAlert : iImageNormal;
620 *piSecondImage = IMAGE_NOIMAGE;
624 *piFirstImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE;
625 *piSecondImage = IMAGE_NOIMAGE;