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
)GetWindowLongPtr (hDlg
, DWLP_USER
)) != NULL
)
82 if (AfsAppLib_HandleHelp (lpp
->iddForHelp
, hDlg
, msg
, wp
, lp
))
89 SetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_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
)GetWindowLongPtr (hDlg
, DWLP_USER
)) != NULL
)
504 return lpp
->TypeToShow
;