672c45f45fe2539cd4678ecb6964ba4ca534e195
[openafs.git] / src / WINNT / afsapplib / al_browseset.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
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
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include <WINNT/afsapplib.h>
16
17 #define WM_FOUNDNAME   (WM_USER +100)
18 #define WM_THREADSTART (WM_USER +101)
19 #define WM_THREADDONE  (WM_USER +102)
20
21
22 /*
23  * VARIABLES __________________________________________________________________
24  *
25  */
26
27
28 /*
29  * PROTOTYPES _________________________________________________________________
30  *
31  */
32
33 HRESULT CALLBACK BrowseSet_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34 void BrowseSet_OnInitDialog (HWND hDlg, LPBROWSESETDLG_PARAMS pszFilename);
35 void BrowseSet_OnDestroy (HWND hDlg);
36 void BrowseSet_OnAddString (HWND hDlg, LPTSTR pszString);
37 void BrowseSet_OnSelectedEntry (HWND hDlg);
38
39 void BrowseSet_StartSearch (HWND hDlg, LPBROWSESETDLG_PARAMS lpp);
40 void BrowseSet_OnSearchStart (HWND hDlg);
41 void BrowseSet_OnSearchDone (HWND hDlg);
42 void BrowseSet_EmptyList (HWND hDlg);
43 DWORD WINAPI BrowseSet_Init_ThreadProc (LPARAM lp);
44
45
46 /*
47  * ROUTINES ___________________________________________________________________
48  *
49  */
50
51 BOOL AfsAppLib_ShowBrowseFilesetDialog (LPBROWSESETDLG_PARAMS lpp)
52 {
53    return (ModalDialogParam (IDD_APPLIB_BROWSE_FILESET, lpp->hParent, (DLGPROC)BrowseSet_DlgProc, (LPARAM)lpp) == IDOK) ? TRUE : FALSE;
54 }
55
56
57 HRESULT CALLBACK BrowseSet_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
58 {
59    if (AfsAppLib_HandleHelp (IDD_APPLIB_BROWSE_FILESET, hDlg, msg, wp, lp))
60       return TRUE;
61
62    if (msg == WM_INITDIALOG)
63       SetWindowLongPtr (hDlg, DWLP_USER, lp);
64
65    LPBROWSESETDLG_PARAMS lpp;
66    if ((lpp = (LPBROWSESETDLG_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
67       {
68       switch (msg)
69          {
70          case WM_INITDIALOG:
71             lpp->pInternal = (PVOID)hDlg;
72             BrowseSet_OnInitDialog (hDlg, lpp);
73             break;
74
75          case WM_DESTROY:
76             BrowseSet_OnDestroy (hDlg);
77             lpp->pInternal = NULL;
78             break;
79
80          case WM_THREADSTART:
81             BrowseSet_OnSearchStart (hDlg);
82             break;
83
84          case WM_THREADDONE:
85             BrowseSet_OnSearchDone (hDlg);
86             break;
87
88          case WM_FOUNDNAME:
89             BrowseSet_OnAddString (hDlg, (LPTSTR)wp);
90             break;
91
92          case WM_COMMAND:
93             switch (LOWORD(wp))
94                {
95                case IDOK:
96                   GetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szFileset, cchNAME);
97                case IDCANCEL:
98                   EndDialog (hDlg, LOWORD(wp));
99                   break;
100
101                case IDC_BROWSE_CELL:
102                   if (HIWORD(wp) == CBN_SELCHANGE)
103                      {
104                      GetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell, cchNAME);
105                      BrowseSet_StartSearch (hDlg, lpp);
106                      }
107                   break;
108
109                case IDC_BROWSE_NAMED:
110                   if (HIWORD(wp) == EN_UPDATE)  // has the user hit Enter here?
111                      {
112                      TCHAR szTest[ cchRESOURCE ];
113                      GetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest, cchRESOURCE);
114
115                      if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\n')) )
116                         {
117                         szTest[ lstrlen(szTest)-1 ] = TEXT('\0');
118
119                         if ( (lstrlen (szTest) > 0) && (szTest[ lstrlen(szTest)-1 ] == TEXT('\r')) )
120                            szTest[ lstrlen(szTest)-1 ] = TEXT('\0');
121
122                         SetDlgItemText (hDlg, IDC_BROWSE_NAMED, szTest);
123                         PostMessage (hDlg, WM_COMMAND, MAKELONG(IDOK,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDOK));
124                         }
125                      }
126                   break;
127
128                case IDC_BROWSE_RESTART:
129                   GetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell, cchNAME);
130                   BrowseSet_StartSearch (hDlg, lpp);
131                   PostMessage (hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem (hDlg, IDC_BROWSE_NAMED), (LPARAM)TRUE);
132                   break;
133                }
134             break;
135
136          case WM_NOTIFY:
137             switch (((LPNMHDR)lp)->code)
138                {
139                case LVN_ITEMCHANGED:
140                   if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED )
141                      BrowseSet_OnSelectedEntry (hDlg);
142                   break;
143
144                case NM_DBLCLK:
145                   PostMessage (hDlg, WM_COMMAND, MAKELONG(IDOK,BN_CLICKED), (LPARAM)GetDlgItem(hDlg,IDOK));
146                   break;
147                }
148             break;
149          }
150       }
151
152    return FALSE;
153 }
154
155
156 void BrowseSet_OnInitDialog (HWND hDlg, LPBROWSESETDLG_PARAMS lpp)
157 {
158    if (lpp->idsTitle)
159       {
160       TCHAR szText[ cchRESOURCE ];
161       GetString (szText, lpp->idsTitle);
162       SetWindowText (hDlg, szText);
163       }
164
165    if (lpp->idsPrompt)
166       {
167       TCHAR szText[ cchRESOURCE ];
168       GetString (szText, lpp->idsPrompt);
169       SetDlgItemText (hDlg, IDC_BROWSE_TYPE, szText);
170       }
171
172    ListView_SetImageList (GetDlgItem (hDlg, IDC_BROWSE_LIST), AfsAppLib_CreateImageList(FALSE), LVSIL_SMALL);
173    SetDlgItemText (hDlg, IDC_BROWSE_NAMED, lpp->szFileset);
174
175    if (!lpp->lpcl)
176       {
177       EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_CELL), FALSE);
178       }
179    else
180       {
181       CB_StartChange (GetDlgItem (hDlg, IDC_BROWSE_CELL));
182       for (size_t ii = 0; ii < lpp->lpcl->nCells; ++ii)
183          CB_AddItem (GetDlgItem (hDlg, IDC_BROWSE_CELL), lpp->lpcl->aCells[ii], 1+ii);
184       CB_EndChange (GetDlgItem (hDlg, IDC_BROWSE_CELL), 1);
185       }
186    if (lpp->szCell[0] != TEXT('\0'))
187       {
188       SetDlgItemText (hDlg, IDC_BROWSE_CELL, lpp->szCell);
189       }
190
191    BrowseSet_StartSearch (hDlg, lpp);
192
193    // There's a default pushbutton on this dialog, so that hitting
194    // RETURN when you're in the Cell combobox will restart the search
195    // (a default pushbutton always gets called when RETURN is hit,
196    // unless your control traps it).  But the user doesn't want to *see*
197    // that thing, so move it way off the dialog's client area.
198    //
199    RECT r;
200    GetWindowRect (GetDlgItem (hDlg, IDC_BROWSE_RESTART), &r);
201    SetWindowPos (GetDlgItem (hDlg, IDC_BROWSE_RESTART), NULL,
202                  0 - (r.right-r.left), 0 - (r.bottom-r.top), 0, 0,
203                  SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
204 }
205
206
207 void BrowseSet_OnDestroy (HWND hDlg)
208 {
209    BrowseSet_EmptyList (hDlg);
210 }
211
212
213 void BrowseSet_OnSelectedEntry (HWND hDlg)
214 {
215    HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
216    LPTSTR pszString = (LPTSTR)LV_GetSelectedData (hList);
217    if (pszString != NULL)
218       {
219       SetDlgItemText (hDlg, IDC_BROWSE_NAMED, pszString);
220       }
221 }
222
223
224 void BrowseSet_StartSearch (HWND hDlg, LPBROWSESETDLG_PARAMS lpp)
225 {
226    BrowseSet_EmptyList (hDlg);
227
228    LPBROWSESETDLG_PARAMS lppNew = New (BROWSESETDLG_PARAMS);
229    memcpy (lppNew, lpp, sizeof(BROWSESETDLG_PARAMS));
230
231    DWORD dwThreadID;
232    HANDLE hThread;
233    if ((hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)BrowseSet_Init_ThreadProc, (PVOID)lppNew, 0, &dwThreadID)) == INVALID_HANDLE_VALUE)
234       {
235       EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), FALSE);
236       Delete (lppNew);
237       }
238 }
239
240
241 void BrowseSet_OnSearchStart (HWND hDlg)
242 {
243    TCHAR szWait[ cchRESOURCE ];
244    GetString (szWait, IDS_BROWSE_WAITING);
245    SetDlgItemText (hDlg, IDC_BROWSE_STATUS, szWait);
246 }
247
248
249 void BrowseSet_OnSearchDone (HWND hDlg)
250 {
251    SetDlgItemText (hDlg, IDC_BROWSE_STATUS, TEXT(""));
252    EnableWindow (GetDlgItem (hDlg, IDC_BROWSE_LIST), TRUE);
253 }
254
255
256 void BrowseSet_OnAddString (HWND hDlg, LPTSTR pszString)
257 {
258    HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
259    LV_AddItem (hList, 1, INDEX_SORT, (LPARAM)pszString, imageFILESET, pszString);
260    // string freed when list destroyed
261 }
262
263
264 void BrowseSet_EmptyList (HWND hDlg)
265 {
266    HWND hList = GetDlgItem (hDlg, IDC_BROWSE_LIST);
267
268    int iiMax = ListView_GetItemCount (hList);
269    for (int ii = 0; ii < iiMax; ++ii)
270       {
271       LV_ITEM lvi;
272       memset (&lvi, 0x00, sizeof(LV_ITEM));
273       lvi.mask = LVIF_PARAM;
274       lvi.iItem = ii;
275       if (ListView_GetItem (hList, &lvi))
276          {
277          LPTSTR psz;
278          if ((psz = (LPTSTR)lvi.lParam) != NULL)
279             {
280             lvi.mask = LVIF_PARAM;
281             lvi.iItem = ii;
282             lvi.lParam = 0;
283             ListView_SetItem (hList, &lvi);
284             FreeString (psz);
285             }
286          }
287       }
288 }
289
290
291 DWORD WINAPI BrowseSet_Init_ThreadProc (LPARAM lp)
292 {
293    LPBROWSESETDLG_PARAMS lpp = (LPBROWSESETDLG_PARAMS)lp;
294
295    char szCellA[ cchNAME ];
296    CopyStringToAnsi (szCellA, lpp->szCell);
297
298    if (IsWindow ((HWND)(lpp->pInternal)))
299       PostMessage ((HWND)(lpp->pInternal), WM_THREADSTART, 0, 0);
300
301    // Fill in hList with the names of all filesets in the cell.
302    //
303    ULONG status = 0;
304 #if 0
305    // TODO
306    if (OpenFTS (&status))
307       {
308       PVOID hCell;
309       if ((status = FtsOpenCell (szCellA, &hCell)) == 0)
310          {
311          fldb_short_ft_info_t *fti;
312          if ((status = FtsAllocateShortFtInfoBuffer (&fti)) == 0)
313             {
314             PVOID cookie = 0;
315             ULONG nEntries;
316
317             while ( (FtsListFilesetsFromFldb (hCell, fti, &nEntries, &cookie) == 0) && (nEntries > 0) )
318                {
319                if (!IsWindow ((HWND)(lpp->pInternal)))
320                   break;
321
322                for (ULONG ii = 0; ii < nEntries; ++ii)
323                   {
324 #define DECODE_SHINFO_TYPE_FLAGS(_fl) ((_fl) >> 12)
325                   if (DECODE_SHINFO_TYPE_FLAGS(fti[ ii ].flags) & FTS_FT_SHINFO_TYPE_RW)
326                      {
327                      LPTSTR pszFileset;
328                      if ((pszFileset = CloneString (fti[ii].name)) != NULL)
329                         {
330                         PostMessage ((HWND)(lpp->pInternal), WM_FOUNDNAME, (WPARAM)pszFileset, 0);
331                         // string memory is freed by recipient of message
332                         }
333                      }
334                   }
335                }
336             FtsFreeShortFtInfoBuffer (fti);
337             }
338          FtsCloseCell (hCell);
339          }
340       CloseFTS();
341       }
342 #endif
343
344    if (IsWindow ((HWND)(lpp->pInternal)))
345       PostMessage ((HWND)(lpp->pInternal), WM_THREADDONE, status, 0);
346
347    Delete (lpp);
348    return 0;
349 }
350