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
14 #include <afs/param.h>
19 #include "set_create.h"
20 #include "set_general.h"
21 #include "propcache.h"
23 #include "svr_window.h"
28 * PROTOTYPES _________________________________________________________________
32 BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
33 void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp);
34 void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget);
35 void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp);
36 void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg);
37 void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget);
38 void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp);
42 * ROUTINES ___________________________________________________________________
46 void Filesets_Create (LPIDENT lpiParent)
48 LPSET_CREATE_PARAMS pscp = New (SET_CREATE_PARAMS);
49 memset (pscp, 0x00, sizeof(SET_CREATE_PARAMS));
50 pscp->lpiParent = lpiParent;
51 pscp->szName[0] = TEXT('\0');
52 pscp->fCreateClone = FALSE;
53 pscp->ckQuota = ckQUOTA_DEFAULT;
55 // Show the Create dialog.
57 INT_PTR rc = ModalDialogParam (IDD_SET_CREATE, GetActiveWindow(), (DLGPROC)Filesets_Create_DlgProc, (LPARAM)pscp);
63 else if (!ASSERT( pscp->lpiParent && pscp->lpiParent->fIsAggregate() ))
67 else if (!ASSERT( pscp->szName[0] != TEXT('\0') ))
73 StartTask (taskSET_CREATE, NULL, pscp);
78 BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
80 static LPSET_CREATE_PARAMS pscp = NULL;
81 if (msg == WM_INITDIALOG)
82 pscp = (LPSET_CREATE_PARAMS)lp;
84 if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggCreate))
87 if (AfsAppLib_HandleHelp (IDD_SET_CREATE, hDlg, msg, wp, lp))
95 FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, &gr.viewAggCreate);
96 Filesets_Create_OnInitDialog (hDlg, pscp);
101 hList = GetDlgItem (hDlg, IDC_AGG_LIST);
105 ptScreen.x = LOWORD(lp);
106 ptScreen.y = HIWORD(lp);
109 ScreenToClient (hList, &ptClient);
111 if (FL_HitTestForHeaderBar (hList, ptClient))
113 HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
114 DisplayContextMenu (hm, ptScreen, hList);
120 if ((ptp = (LPTASKPACKET)lp) != NULL)
122 if (ptp->idTask == taskAGG_FIND_QUOTA_LIMITS)
123 Filesets_Create_OnEndTask_FindQuotaLimits (hDlg, ptp, pscp);
124 else if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW)
125 Filesets_Create_OnEndTask_EnumAggregates (hDlg);
126 else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
128 EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE);
129 Filesets_Create_StartDisplay_Aggregates (hDlg, &pscp->lpiParent);
131 FreeTaskPacket (ptp);
135 case WM_COLUMNS_CHANGED:
137 lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST));
138 FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
139 Filesets_Create_OnSelectServer (hDlg, (LPIDENT*)&lpSel);
146 if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
147 EndDialog (hDlg, LOWORD(wp));
151 EndDialog (hDlg, LOWORD(wp));
155 if (HIWORD(wp) == CBN_SELCHANGE)
156 Filesets_Create_OnSelectServer (hDlg, &pscp->lpiParent);
160 GetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName, cchNAME);
161 Filesets_Create_EnableOK (hDlg, pscp);
165 if (HIWORD(wp) == SPN_UPDATE)
167 pscp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA));
168 if (gr.cbQuotaUnits == cb1MB)
169 pscp->ckQuota *= ck1MB;
173 case IDC_SET_QUOTA_UNITS:
174 if (HIWORD(wp) == CBN_SELCHANGE)
176 gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS));
177 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
182 pscp->fCreateClone = IsDlgButtonChecked (hDlg, IDC_SET_CLONE);
188 FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
193 switch (((LPNMHDR)lp)->code)
197 if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL)
199 pscp->lpiParent = lpi;
201 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
202 Filesets_Create_EnableOK (hDlg, pscp);
214 static LONG_PTR procFilesetsCreateList = 0;
216 LRESULT CALLBACK Filesets_Create_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
220 if (procFilesetsCreateList == 0)
221 rc = DefWindowProc (hList, msg, wp, lp);
223 rc = CallWindowProc ((WNDPROC)procFilesetsCreateList, hList, msg, wp, lp);
228 if (procFilesetsCreateList != 0)
229 SetWindowLongPtr (hList, GWLP_WNDPROC, procFilesetsCreateList);
236 ShowColumnsDialog (GetParent (hList), &gr.viewAggCreate);
246 void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp)
248 HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST);
249 if (procFilesetsCreateList == 0)
250 procFilesetsCreateList = GetWindowLongPtr (hList, GWLP_WNDPROC);
251 SetWindowLongPtr (hList, GWLP_WNDPROC, (LONG_PTR)Filesets_Create_SubclassListProc);
253 if (gr.viewAggCreate.lvsView == 0) // never initialized this?
255 if (gr.viewAggMove.lvsView == 0)
256 memcpy (&gr.viewAggCreate, &gr.viewAgg, sizeof(VIEWINFO));
258 memcpy (&gr.viewAggCreate, &gr.viewAggMove, sizeof(VIEWINFO));
260 FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
262 SetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName);
264 CB_StartChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), TRUE);
265 CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_KB, (LPARAM)cb1KB);
266 CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_MB, (LPARAM)cb1MB);
267 CB_EndChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), (LPARAM)gr.cbQuotaUnits);
269 CheckDlgButton (hDlg, IDC_SET_CLONE, pscp->fCreateClone);
271 // Create a spinner, and give it an appropriate min/max range. We'll
272 // have to *find* that range in a separate thread, 'cause it involves
273 // getting the status of an aggregate.
275 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
277 // Fill in the Servers combobox, and select the default server
278 // (if one was specified).
280 LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
281 lpp->hCombo = GetDlgItem (hDlg, IDC_SET_SERVER);
282 lpp->lpiSelect = (pscp->lpiParent) ? pscp->lpiParent->GetServer() : NULL;
283 StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
285 EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE);
286 EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE);
287 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
291 void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget)
293 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
295 Filesets_Create_StartDisplay_Aggregates (hDlg, plpiTarget);
299 void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget)
301 LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER));
303 if (*plpiTarget && (*plpiTarget)->fIsServer())
305 if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew))
308 SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)lpiServerNew);
310 LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET);
311 lpp->lpiServer = lpiServerNew;
312 lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST);
313 lpp->lpiSelect = *plpiTarget;
314 lpp->lpvi = &gr.viewAggCreate;
315 StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp);
319 void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg)
321 EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE);
325 void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp)
327 if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
328 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
330 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
334 void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp)
336 size_t cMin = TASKDATA(ptp)->ckMin;
337 size_t cNow = pscp->ckQuota;
338 size_t cMax = TASKDATA(ptp)->ckMax;
340 if (gr.cbQuotaUnits == cb1MB)
347 HWND hQuota = GetDlgItem (hDlg, IDC_SET_QUOTA);
348 if (!fHasSpinner (hQuota))
350 CreateSpinner (hQuota, 10, FALSE, (DWORD)cMin, (DWORD)cNow, (DWORD)cMax);
354 SP_SetRange (hQuota, cMin, cMax);
355 SP_SetPos (hQuota, cNow);