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"
21 * DEFINITIONS ________________________________________________________________
25 #define ID_SEARCH_TIMER 0
27 #define msecSEARCH_TIMER 650
36 * PROTOTYPES _________________________________________________________________
40 BOOL CALLBACK Browse_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
41 void Browse_OnInitDialog (HWND hDlg);
42 void Browse_OnOK (HWND hDlg);
43 void Browse_OnEndTask_EnumObjects (HWND hDlg, LPTASKPACKET ptp);
44 void Browse_OnEndTask_Translate (HWND hDlg, LPTASKPACKET ptp);
45 void Browse_OnSelect (HWND hDlg);
46 void Browse_UpdateDialog (HWND hDlg);
47 void Browse_Enable (HWND hDlg, BOOL fEnable);
48 ASOBJTYPE Browse_GetSelectedType (HWND hDlg);
52 * ROUTINES ___________________________________________________________________
56 BOOL ShowBrowseDialog (LPBROWSE_PARAMS lpp)
59 if (lpp->TypeToShow & TYPE_USER)
61 if (lpp->TypeToShow & TYPE_GROUP)
63 lpp->fQuerying = FALSE;
65 int idd = (nTypesToShow == 1) ? IDD_BROWSE : (lpp->idsCheck) ? IDD_BROWSE_BOTH : IDD_BROWSE_COMBO;
67 if (ModalDialogParam (idd, lpp->hParent, (DLGPROC)Browse_DlgProc, (LPARAM)lpp) != IDOK)
70 if (!lpp->pObjectsSelected)
77 BOOL CALLBACK Browse_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
80 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
82 if (AfsAppLib_HandleHelp (lpp->iddForHelp, hDlg, msg, wp, lp))
89 SetWindowLong (hDlg, DWL_USER, lp);
90 Browse_OnInitDialog (hDlg);
96 if ((ptp = (LPTASKPACKET)lp) != NULL)
98 if ((ptp->idTask == taskUSER_ENUM) || (ptp->idTask == taskGROUP_ENUM))
99 Browse_OnEndTask_EnumObjects (hDlg, ptp);
100 else if (ptp->idTask == taskLIST_TRANSLATE)
101 Browse_OnEndTask_Translate (hDlg, ptp);
102 FreeTaskPacket (ptp);
109 case ID_SEARCH_TIMER:
110 if ( (l.dwTickLastType) && (GetTickCount() > l.dwTickLastType + msecSEARCH_TIMER) )
112 KillTimer (hDlg, ID_SEARCH_TIMER);
113 Browse_UpdateDialog (hDlg);
122 case IDC_BROWSE_SELECT:
127 EndDialog (hDlg, IDCANCEL);
130 case IDC_BROWSE_CHECK:
131 Browse_UpdateDialog (hDlg);
134 case IDC_BROWSE_COMBO:
135 if (HIWORD(wp) == CBN_SELCHANGE)
137 SetDlgItemText (hDlg, IDC_BROWSE_NAMED, TEXT(""));
138 Browse_UpdateDialog (hDlg);
142 case IDC_BROWSE_RESTART:
143 Browse_UpdateDialog (hDlg);
144 PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE);
147 case IDC_BROWSE_NAMED:
148 if (HIWORD(wp) == EN_UPDATE) // has the user hit Enter here?
150 TCHAR szTest[ 1024 ];
151 GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, 1024);
153 if ((lstrlen (szTest)) && (szTest[lstrlen(szTest)-1]==TEXT('\n')))
155 szTest[ lstrlen(szTest)-1 ] = TEXT('\0');
156 if ((lstrlen (szTest)) && (szTest[lstrlen(szTest)-1]==TEXT('\r')))
157 szTest[ lstrlen(szTest)-1 ] = TEXT('\0');
159 SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest);
160 PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDC_BROWSE_SELECT));
165 case IDC_BROWSE_PATTERN:
166 if (HIWORD(wp) == EN_UPDATE)
168 l.dwTickLastType = GetTickCount();
169 KillTimer (hDlg, ID_SEARCH_TIMER);
170 SetTimer (hDlg, ID_SEARCH_TIMER, msecSEARCH_TIMER +15, NULL);
177 switch (((LPNMHDR)lp)->code)
180 Browse_OnSelect (hDlg);
184 PostMessage (hDlg, WM_COMMAND, MAKELONG(IDC_BROWSE_SELECT,BN_CLICKED), (LPARAM)GetDlgItem (hDlg, IDC_BROWSE_SELECT));
194 void Browse_OnInitDialog (HWND hDlg)
197 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
199 // First, the text of the dialog is woefully ugly right now. Put
200 // in the strings which the caller supplied.
202 TCHAR szText[ cchRESOURCE ];
203 GetString (szText, lpp->idsTitle);
204 SetWindowText (hDlg, szText);
206 GetString (szText, lpp->idsPrompt);
207 SetDlgItemText (hDlg, IDC_BROWSE_TYPE, szText);
209 SetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szName);
211 SetDlgItemText (hDlg, IDC_BROWSE_PATTERN, TEXT(""));
214 asc_CellNameGet_Fast (g.idClient, g.idCell, szText, &status);
215 SetDlgItemText (hDlg, IDC_BROWSE_CELL, szText);
216 EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), FALSE);
218 if (GetDlgItem (hDlg, IDC_BROWSE_CHECK))
220 if (lpp->idsCheck == 0)
221 ShowWindow (GetDlgItem (hDlg, IDC_BROWSE_CHECK), FALSE);
224 GetString (szText, lpp->idsCheck);
225 SetDlgItemText (hDlg, IDC_BROWSE_CHECK, szText);
228 CheckDlgButton (hDlg, IDC_BROWSE_CHECK, (lpp->pObjectsToSkip) ? TRUE : FALSE);
231 if (GetDlgItem (hDlg, IDC_BROWSE_COMBO))
233 HWND hCombo = GetDlgItem (hDlg, IDC_BROWSE_COMBO);
235 CB_StartChange (hCombo, TRUE);
237 if (lpp->TypeToShow & TYPE_USER)
239 CB_AddItem (hCombo, IDS_SHOW_USERS, TYPE_USER);
241 lpSelect = TYPE_USER;
244 if (lpp->TypeToShow & TYPE_GROUP)
246 CB_AddItem (hCombo, IDS_SHOW_GROUPS, TYPE_GROUP);
248 lpSelect = TYPE_GROUP;
251 CB_EndChange (hCombo, lpSelect);
254 // If the caller requested that we disallow multiple selection,
255 // change the fastlist's styles...
257 if (!lpp->fAllowMultiple)
259 DWORD dwStyle = GetWindowLong (GetDlgItem (hDlg, IDC_BROWSE_LIST), GWL_STYLE);
260 dwStyle &= ~(FLS_SELECTION_MULTIPLE);
261 SetWindowLong (GetDlgItem (hDlg, IDC_BROWSE_LIST), GWL_STYLE, dwStyle);
264 // Finally, update the listbox to show a valid list of users/groups.
265 // Oh--since we're in initdialog, add an imagelist to the window too.
267 FastList_SetImageLists (GetDlgItem (hDlg, IDC_BROWSE_LIST), AfsAppLib_CreateImageList(FALSE), NULL);
268 Browse_UpdateDialog (hDlg);
273 void Browse_OnSelect (HWND hDlg)
276 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
280 HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
282 static TCHAR szSeparator[ cchRESOURCE ] = TEXT("");
283 if (szSeparator[0] == TEXT('\0'))
285 if (!GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SLIST, szSeparator, cchRESOURCE))
286 lstrcpy (szSeparator, TEXT(","));
287 lstrcat (szSeparator, TEXT(" "));
290 LPTSTR pszText = NULL;
292 HLISTITEM hItem = NULL;
293 while ((hItem = FastList_FindNextSelected (hList, hItem)) != NULL)
296 if ((pszName = FastList_GetItemText (hList, hItem, 0)) != NULL)
300 pszNew = FormatString (TEXT("%1%2%3"), TEXT("%s%s%s"), pszText, szSeparator, pszName);
302 pszNew = FormatString (TEXT("%1"), TEXT("%s"), pszName);
304 FreeString (pszText);
307 if (pszText && !lpp->fAllowMultiple)
311 SetDlgItemText (hDlg, IDC_BROWSE_NAMED, (pszText) ? pszText : TEXT(""));
313 FreeString (pszText);
319 void Browse_OnOK (HWND hDlg)
322 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
324 LPTSTR pszNames = GetEditText (GetDlgItem (hDlg, IDC_BROWSE_NAMED));
326 // Disable the controls on the dialog for a bit...
328 Browse_Enable (hDlg, FALSE);
330 // Start a background task to translate the typed list-of-names into
331 // a usable ASID list. When it comes back, we'll close the dialog.
333 LPLIST_TRANSLATE_PARAMS pTask = New (LIST_TRANSLATE_PARAMS);
334 pTask->Type = Browse_GetSelectedType (hDlg);
335 pTask->pszNames = pszNames;
336 StartTask (taskLIST_TRANSLATE, hDlg, pTask);
341 void Browse_OnEndTask_EnumObjects (HWND hDlg, LPTASKPACKET ptp)
345 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
347 HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
348 FastList_Begin (hList);
349 FastList_RemoveAll (hList);
351 // If we were successful, we now have a list of all objects of the
352 // appropriate type. However, the user may not want us to display
353 // items which are on our pObjectsToSkip list; if not, convert the
354 // later to a hashlist (for fast lookup) and remove the offending
355 // entries from the former.
357 if (ptp->rc && TASKDATA(ptp)->pAsidList)
359 if ((IsDlgButtonChecked (hDlg, IDC_BROWSE_CHECK)) && (lpp->pObjectsToSkip))
361 LPHASHLIST pListToSkip = New (HASHLIST);
363 for (ii = 0; ii < lpp->pObjectsToSkip->cEntries; ++ii)
364 pListToSkip->AddUnique ((PVOID)(lpp->pObjectsToSkip->aEntries[ii].idObject));
366 for (ii = 0; ii < TASKDATA(ptp)->pAsidList->cEntries; )
368 if (pListToSkip->fIsInList ((PVOID)(TASKDATA(ptp)->pAsidList->aEntries[ii].idObject)))
369 asc_AsidListRemoveEntryByIndex (&TASKDATA(ptp)->pAsidList, ii);
374 Delete (pListToSkip);
378 // OK, we're ready to go--populate that list!
380 for (ii = 0; ii < TASKDATA(ptp)->pAsidList->cEntries; ++ii)
383 ASOBJPROP Properties;
384 if (!asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, TASKDATA(ptp)->pAsidList->aEntries[ii].idObject, &Properties, &status))
387 TCHAR szName[ MAX_PATH ];
388 if (Properties.Type == TYPE_USER)
389 User_GetDisplayName (szName, &Properties);
391 lstrcpy (szName, Properties.szName);
393 FASTLISTADDITEM flai;
394 memset (&flai, 0x00, sizeof(flai));
395 flai.iFirstImage = (Properties.Type == TYPE_USER) ? imageUSER : (Properties.Type == TYPE_GROUP) ? imageGROUP : IMAGE_NOIMAGE;
396 flai.iSecondImage = IMAGE_NOIMAGE;
397 flai.pszText = szName;
398 FastList_AddItem (hList, &flai);
401 FastList_End (hList);
407 void Browse_OnEndTask_Translate (HWND hDlg, LPTASKPACKET ptp)
410 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
412 if (!ptp->rc || !TASKDATA(ptp)->pAsidList || !TASKDATA(ptp)->pAsidList->cEntries)
414 ErrorDialog (ptp->status, (TASKDATA(ptp)->Type == TYPE_USER) ? IDS_ERROR_CANT_TRANSLATE_USER : IDS_ERROR_CANT_TRANSLATE_GROUP);
415 Browse_Enable (hDlg, TRUE);
419 lpp->pObjectsSelected = TASKDATA(ptp)->pAsidList;
420 TASKDATA(ptp)->pAsidList = NULL; // don't let FreeTaskPacket free this
422 // Fill in {lpp->szName}, for convenience
424 lpp->szName[0] = TEXT('\0');
426 if (lpp->pObjectsSelected && lpp->pObjectsSelected->cEntries)
429 ASOBJPROP Properties;
430 if (asc_ObjectPropertiesGet_Fast (g.idClient, g.idCell, lpp->pObjectsSelected->aEntries[0].idObject, &Properties, &status))
431 lstrcpy (lpp->szName, Properties.szName);
434 EndDialog (hDlg, IDOK);
440 void Browse_UpdateDialog (HWND hDlg)
443 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
447 // First we'll need to empty the list, and add some non-selectable thing
448 // that says "querying"
450 HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
451 FastList_Begin (hList);
452 FastList_RemoveAll (hList);
454 TCHAR szText[ cchRESOURCE ];
455 GetString (szText, IDS_QUERYING_LONG);
457 FASTLISTADDITEM flai;
458 memset (&flai, 0x00, sizeof(flai));
459 flai.iFirstImage = IMAGE_NOIMAGE;
460 flai.iSecondImage = IMAGE_NOIMAGE;
461 flai.pszText = szText;
462 flai.dwFlags = FLIF_DISALLOW_SELECT;
463 FastList_AddItem (hList, &flai);
465 FastList_End (hList);
467 // Then start a background task to obtain the appropriate list
468 // of stuff to show. When that task completes, we'll populate the
471 TCHAR szPattern[ cchNAME ];
472 GetDlgItemText (hDlg, IDC_BROWSE_PATTERN, szPattern, cchNAME);
474 LPTSTR pszPattern = NULL;
475 if (szPattern[0] != TEXT('\0'))
476 pszPattern = CloneString (szPattern);
478 StartTask ((Browse_GetSelectedType (hDlg) == TYPE_USER) ? taskUSER_ENUM : taskGROUP_ENUM, hDlg, pszPattern);
483 void Browse_Enable (HWND hDlg, BOOL fEnable)
485 EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), fEnable);
486 EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_SELECT), fEnable);
487 EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_NAMED), fEnable);
488 EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CHECK), fEnable);
489 EnableWindow (GetDlgItem (hDlg, IDCANCEL), fEnable);
493 ASOBJTYPE Browse_GetSelectedType (HWND hDlg)
496 if ((hCombo = GetDlgItem (hDlg, IDC_BROWSE_COMBO)) != NULL)
498 return (ASOBJTYPE)CB_GetSelectedData (hCombo);
502 if ((lpp = (LPBROWSE_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
504 return lpp->TypeToShow;