6 #include "TaAfsUsrMgr.h"
13 * ANIMATED ICON ______________________________________________________________
17 static DWORD l_cReqAnimation = 0;
19 void Display_StartWorking (void)
21 if ((++l_cReqAnimation) == 1)
23 AfsAppLib_StartAnimation (GetDlgItem (g.hMain, IDC_ANIM));
28 void Display_StopWorking (void)
30 if (!l_cReqAnimation || !(--l_cReqAnimation))
32 AfsAppLib_StopAnimation (GetDlgItem (g.hMain, IDC_ANIM));
38 * USER/GROUP LISTS ___________________________________________________________
42 void Display_PopulateList (void)
44 switch (Display_GetActiveTab())
47 Display_PopulateUserList();
51 Display_PopulateGroupList();
55 Display_PopulateMachineList();
61 void Display_PopulateUserList (void)
65 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
66 HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST);
69 TCHAR szQuerying[ cchRESOURCE ];
70 GetString (szQuerying, IDS_QUERYING_LONG);
71 SetDlgItemText (hDlg, IDC_USERS_TITLE, szQuerying);
73 Display_StartWorking();
74 GetDlgItemText (hDlg, IDC_USERS_PATTERN, g.szPatternUsers, cchNAME);
75 StartTask (taskUPD_USERS, g.hMain);
81 void Display_PopulateGroupList (void)
85 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
86 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
89 TCHAR szQuerying[ cchRESOURCE ];
90 GetString (szQuerying, IDS_QUERYING_LONG);
91 SetDlgItemText (hDlg, IDC_GROUPS_TITLE, szQuerying);
93 Display_StartWorking();
94 GetDlgItemText (hDlg, IDC_GROUPS_PATTERN, g.szPatternGroups, cchNAME);
95 StartTask (taskUPD_GROUPS, g.hMain);
101 void Display_PopulateMachineList (void)
105 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
106 HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
107 if (IsWindow (hList))
109 TCHAR szQuerying[ cchRESOURCE ];
110 GetString (szQuerying, IDS_QUERYING_LONG);
111 SetDlgItemText (hDlg, IDC_MACHINES_TITLE, szQuerying);
113 Display_StartWorking();
114 GetDlgItemText (hDlg, IDC_MACHINES_PATTERN, g.szPatternMachines, cchNAME);
115 StartTask (taskUPD_MACHINES, g.hMain);
121 void Display_OnEndTask_UpdUsers (LPTASKPACKET ptp)
123 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
124 HWND hList = GetDlgItem (hDlg, IDC_USERS_LIST);
125 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternUsers))
127 FastList_Begin (hList);
129 // Update the title above the list to indicate what we're showing
131 TCHAR szCell[ cchRESOURCE ];
132 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
134 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0] || (gr.SearchUsers.SearchType != SEARCH_NO_LIMITATIONS)) ? IDS_USERS_PATTERN : IDS_USERS_ALL, TEXT("%s"), szCell);
135 SetDlgItemText (hDlg, IDC_USERS_TITLE, pszTitle);
136 FreeString (pszTitle);
138 // For faster access, we'll want to use a hashlist to deal with
139 // the items in our ASIDLIST (right now it's just a flat array).
140 // This lets us remove duplicates--which is no big deal because
141 // there shouldn't be any anyway--but more importantly it lets
142 // us instantly determine if a particular ASID is in the list
143 // (the asc_AsidListTest function is O(n), and we need O(1)).
145 LPHASHLIST pAsidList = New (HASHLIST);
146 if (TASKDATA(ptp)->pAsidList)
148 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
149 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
152 // Delete any items which are currently in the FastList but
153 // which aren't in our AsidList.
156 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
158 hItemNext = FastList_FindNext (hList, hItem);
159 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
160 if (!pAsidList->fIsInList ((PVOID)idObject))
161 FastList_RemoveItem (hList, hItem);
164 // Add items for any entries which are in our AsidList but aren't
165 // currently in the FastList.
167 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
169 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
171 ASID idObject = (ASID)( pEnum->GetObject() );
174 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
177 memset (&ai, 0x00, sizeof(ai));
178 Display_GetImageIcons (dwStyle, gr.ivUsr, idObject, imageUSER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
179 ai.lParam = (LPARAM)idObject;
180 hItem = FastList_AddItem (hList, &ai);
185 FastList_End (hList);
188 Display_StopWorking();
192 void Display_OnEndTask_UpdGroups (LPTASKPACKET ptp)
194 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
195 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
196 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternGroups))
198 FastList_Begin (hList);
200 // Update the title above the list to indicate what we're showing
202 TCHAR szCell[ cchRESOURCE ];
203 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
205 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_GROUPS_PATTERN : IDS_GROUPS_ALL, TEXT("%s"), szCell);
206 SetDlgItemText (hDlg, IDC_GROUPS_TITLE, pszTitle);
207 FreeString (pszTitle);
209 // For faster access, we'll want to use a hashlist to deal with
210 // the items in our ASIDLIST (right now it's just a flat array).
211 // This lets us remove duplicates--which is no big deal because
212 // there shouldn't be any anyway--but more importantly it lets
213 // us instantly determine if a particular ASID is in the list
214 // (the asc_AsidListTest function is O(n), and we need O(1)).
216 LPHASHLIST pAsidList = New (HASHLIST);
217 if (TASKDATA(ptp)->pAsidList)
219 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
220 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
223 // Delete any items which are currently in the FastList but
224 // which aren't in our AsidList.
227 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
229 hItemNext = FastList_FindNext (hList, hItem);
230 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
231 if (!pAsidList->fIsInList ((PVOID)idObject))
232 FastList_RemoveItem (hList, hItem);
235 // Add items for any entries which are in our AsidList but aren't
236 // currently in the FastList.
238 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
240 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
242 ASID idObject = (ASID)( pEnum->GetObject() );
245 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
248 memset (&ai, 0x00, sizeof(ai));
249 Display_GetImageIcons (dwStyle, gr.ivGrp, idObject, imageGROUP, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
250 ai.lParam = (LPARAM)idObject;
251 hItem = FastList_AddItem (hList, &ai);
256 FastList_End (hList);
259 Display_StopWorking();
263 void Display_OnEndTask_UpdMachines (LPTASKPACKET ptp)
265 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
266 HWND hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
267 if (IsWindow (hList) && !lstrcmpi (TASKDATA(ptp)->szPattern, g.szPatternMachines))
269 FastList_Begin (hList);
271 // Update the title above the list to indicate what we're showing
273 TCHAR szCell[ cchRESOURCE ];
274 asc_CellNameGet_Fast (g.idClient, g.idCell, szCell);
276 LPTSTR pszTitle = FormatString ((TASKDATA(ptp)->szPattern[0]) ? IDS_MACHINES_PATTERN : IDS_MACHINES_ALL, TEXT("%s"), szCell);
277 SetDlgItemText (hDlg, IDC_MACHINES_TITLE, pszTitle);
278 FreeString (pszTitle);
280 // For faster access, we'll want to use a hashlist to deal with
281 // the items in our ASIDLIST (right now it's just a flat array).
282 // This lets us remove duplicates--which is no big deal because
283 // there shouldn't be any anyway--but more importantly it lets
284 // us instantly determine if a particular ASID is in the list
285 // (the asc_AsidListTest function is O(n), and we need O(1)).
287 LPHASHLIST pAsidList = New (HASHLIST);
288 if (TASKDATA(ptp)->pAsidList)
290 for (size_t iAsid = 0; iAsid < TASKDATA(ptp)->pAsidList->cEntries; ++iAsid)
291 pAsidList->AddUnique ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ iAsid ].idObject));
294 // Delete any items which are currently in the FastList but
295 // which aren't in our AsidList.
298 for (HLISTITEM hItem = FastList_FindFirst (hList); hItem; hItem = hItemNext)
300 hItemNext = FastList_FindNext (hList, hItem);
301 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
302 if (!pAsidList->fIsInList ((PVOID)idObject))
303 FastList_RemoveItem (hList, hItem);
306 // Add items for any entries which are in our AsidList but aren't
307 // currently in the FastList.
309 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
311 for (LPENUM pEnum = pAsidList->FindFirst(); pEnum; pEnum = pEnum->FindNext())
313 ASID idObject = (ASID)( pEnum->GetObject() );
316 if ((hItem = FastList_FindItem (hList, (LPARAM)idObject)) == NULL)
319 memset (&ai, 0x00, sizeof(ai));
320 Display_GetImageIcons (dwStyle, gr.ivMch, idObject, imageSERVER, IMAGE_NOIMAGE, &ai.iFirstImage, &ai.iSecondImage);
321 ai.lParam = (LPARAM)idObject;
322 hItem = FastList_AddItem (hList, &ai);
327 FastList_End (hList);
330 Display_StopWorking();
334 void Display_RefreshView (LPVIEWINFO pviNew, ICONVIEW ivNew)
336 // Find the current VIEWINFO and ICONVIEW settings
338 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
343 switch (Display_GetActiveTab())
347 pviOld = &gr.viewUsr;
348 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
353 pviOld = &gr.viewGrp;
354 hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
359 pviOld = &gr.viewMch;
360 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
366 FastList_Begin (hList);
368 // If the VIEWINFO state has changed, fix it. This will change between
369 // large icons, small icons and details, as well as correct the currently-
370 // displayed columns to match what's in the new VIEWINFO structure.
372 BOOL fChangedLayouts = FALSE;
374 if (memcmp (pviOld, pviNew, sizeof(VIEWINFO)))
376 FL_RestoreView (hList, pviNew);
377 fChangedLayouts = ((pviOld->lvsView & FLS_VIEW_MASK) != (pviNew->lvsView & FLS_VIEW_MASK)) ? TRUE : FALSE;
378 memcpy (pviOld, pviNew, sizeof(VIEWINFO));
381 // If the ICONVIEW state has changed, fix all items to show just
382 // the appropriate icons. We'll also have to do this if we just changed
383 // from details/small/large icons to another layout (that's what
384 // fChangedLayouts indicates)
386 if ((*pivOld != ivNew) || (fChangedLayouts))
388 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
390 HLISTITEM hItem = NULL;
391 while ((hItem = FastList_FindNext (hList, hItem)) != NULL)
393 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
397 if (pviOld == &gr.viewUsr)
398 Display_GetImageIcons (dwStyle, ivNew, idObject, imageUSER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
399 else if (pviOld == &gr.viewGrp)
400 Display_GetImageIcons (dwStyle, ivNew, idObject, imageGROUP, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
402 Display_GetImageIcons (dwStyle, ivNew, idObject, imageSERVER, IMAGE_NOIMAGE, &iFirstImage, &iSecondImage);
404 FastList_SetItemFirstImage (hList, hItem, iFirstImage);
405 FastList_SetItemSecondImage (hList, hItem, iSecondImage);
411 FastList_End (hList);
416 void Display_RefreshView_Fast (void)
418 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
419 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
420 if (!IsWindow (hList))
421 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
422 if (!IsWindow (hList))
423 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
424 if (IsWindow (hList))
427 GetClientRect (hList, &rWindow);
428 InvalidateRect (hList, &rWindow, FALSE);
429 UpdateWindow (hList);
434 void Display_SelectAll (void)
436 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
437 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
438 if (!IsWindow (hList))
439 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
440 if (!IsWindow (hList))
441 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
442 if (IsWindow (hList))
444 // Select all items in the list
446 FastList_SelectAll (hList);
448 // Simulate a FLN_ITEMSELECT notification (since we changed
449 // the selection programmatically, no notification will have been
452 FLN_ITEMSELECT_PARAMS fln;
453 fln.hdr.hwndFrom = hList;
454 fln.hdr.idFrom = GetWindowLong (hList, GWL_ID);
455 fln.hdr.code = FLN_ITEMSELECT;
456 fln.hItem = FastList_FindFirstSelected (hList);
457 SendMessage (GetParent (hList), WM_NOTIFY, (WPARAM)fln.hdr.idFrom, (LPARAM)&fln);
462 LPASIDLIST Display_GetSelectedList (void)
464 LPASIDLIST pAsidList = NULL;
466 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
467 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
468 if (!IsWindow (hList))
469 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
470 if (!IsWindow (hList))
471 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
472 if (IsWindow (hList))
474 if (asc_AsidListCreate (&pAsidList))
476 for (HLISTITEM hItem = FastList_FindFirstSelected (hList);
478 hItem = FastList_FindNextSelected (hList, hItem))
480 ASID idObject = (ASID)FastList_GetItemParam (hList, hItem);
482 asc_AsidListAddEntry (&pAsidList, idObject, 0);
491 size_t Display_GetSelectedCount (void)
493 size_t cSelected = 0;
495 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
496 HWND hList = GetDlgItem (hDlg, IDC_GROUPS_LIST);
497 if (!IsWindow (hList))
498 hList = GetDlgItem (hDlg, IDC_USERS_LIST);
499 if (!IsWindow (hList))
500 hList = GetDlgItem (hDlg, IDC_MACHINES_LIST);
501 if (IsWindow (hList))
503 for (HLISTITEM hItem = FastList_FindFirstSelected (hList);
505 hItem = FastList_FindNextSelected (hList, hItem))
515 TABTYPE Display_GetActiveTab (void)
517 HWND hDlg = GetTabChild (GetDlgItem (g.hMain, IDC_TAB));
518 if (IsWindow (GetDlgItem (hDlg, IDC_GROUPS_LIST)))
520 if (IsWindow (GetDlgItem (hDlg, IDC_MACHINES_LIST)))
527 * ROUTINES ___________________________________________________________________
531 BOOL Display_HandleColumnNotify (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp, LPVIEWINFO pvi)
533 if (msg == WM_NOTIFY)
535 HWND hList = GetDlgItem (hDlg, ((LPNMHDR)lp)->idFrom);
536 if (fIsFastList (hList))
538 switch (((LPNMHDR)lp)->code)
540 case FLN_COLUMNRESIZE:
541 FL_StoreView (hList, pvi);
544 case FLN_COLUMNCLICK:
545 LPFLN_COLUMNCLICK_PARAMS pp = (LPFLN_COLUMNCLICK_PARAMS)lp;
549 FastList_GetSortStyle (hList, &iCol, &fRev);
551 if (iCol == pp->icol)
552 FastList_SetSortStyle (hList, iCol, !fRev);
554 FastList_SetSortStyle (hList, pp->icol, FALSE);
556 FL_StoreView (hList, pvi);
566 BOOL CALLBACK Display_GetItemText (HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie)
568 LPVIEWINFO lpvi = (LPVIEWINFO)dwCookie;
569 ASID idObject = (ASID)(pfln->item.lParam);
571 pfln->item.pszText[0] = TEXT('\0');
573 if ((idObject) && (pfln->item.icol < (int)lpvi->nColsShown))
575 size_t iCol = lpvi->aColumns[ pfln->item.icol ];
577 if (lpvi == &gr.viewUsr)
579 User_GetColumn (idObject, (USERCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
581 else if (lpvi == &gr.viewGrp)
583 Group_GetColumn (idObject, (GROUPCOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
585 else if (lpvi == &gr.viewMch)
587 Machine_GetColumn (idObject, (MACHINECOLUMN)iCol, pfln->item.pszText, NULL, NULL, NULL);
595 void Display_GetImageIcons (DWORD dwStyle, ICONVIEW iv, ASID idObject, int iImageNormal, int iImageAlert, int *piFirstImage, int *piSecondImage)
599 if ((dwStyle & FLS_VIEW_MASK) != FLS_VIEW_LIST)
605 *piFirstImage = iImageNormal;
606 *piSecondImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE;
610 *piFirstImage = (fAlert) ? iImageAlert : iImageNormal;
611 *piSecondImage = IMAGE_NOIMAGE;
615 *piFirstImage = (fAlert) ? iImageAlert : IMAGE_BLANKIMAGE;
616 *piSecondImage = IMAGE_NOIMAGE;