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>
16 #include "set_create.h"
17 #include "set_general.h"
18 #include "propcache.h"
20 #include "svr_window.h"
25 * PROTOTYPES _________________________________________________________________
29 BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp);
31 void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget);
32 void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp);
33 void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg);
34 void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget);
35 void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp);
39 * ROUTINES ___________________________________________________________________
43 void Filesets_Create (LPIDENT lpiParent)
45 LPSET_CREATE_PARAMS pscp = New (SET_CREATE_PARAMS);
46 memset (pscp, 0x00, sizeof(SET_CREATE_PARAMS));
47 pscp->lpiParent = lpiParent;
48 pscp->szName[0] = TEXT('\0');
49 pscp->fCreateClone = FALSE;
50 pscp->ckQuota = ckQUOTA_DEFAULT;
52 // Show the Create dialog.
54 int rc = ModalDialogParam (IDD_SET_CREATE, GetActiveWindow(), (DLGPROC)Filesets_Create_DlgProc, (LPARAM)pscp);
60 else if (!ASSERT( pscp->lpiParent && pscp->lpiParent->fIsAggregate() ))
64 else if (!ASSERT( pscp->szName[0] != TEXT('\0') ))
70 StartTask (taskSET_CREATE, NULL, pscp);
75 BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
77 static LPSET_CREATE_PARAMS pscp = NULL;
78 if (msg == WM_INITDIALOG)
79 pscp = (LPSET_CREATE_PARAMS)lp;
81 if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggCreate))
84 if (AfsAppLib_HandleHelp (IDD_SET_CREATE, hDlg, msg, wp, lp))
92 FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggCreate);
93 Filesets_Create_OnInitDialog (hDlg, pscp);
98 hList = GetDlgItem (hDlg, IDC_AGG_LIST);
102 ptScreen.x = LOWORD(lp);
103 ptScreen.y = HIWORD(lp);
106 ScreenToClient (hList, &ptClient);
108 if (FL_HitTestForHeaderBar (hList, ptClient))
110 HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
111 DisplayContextMenu (hm, ptScreen, hList);
117 if ((ptp = (LPTASKPACKET)lp) != NULL)
119 if (ptp->idTask == taskAGG_FIND_QUOTA_LIMITS)
120 Filesets_Create_OnEndTask_FindQuotaLimits (hDlg, ptp, pscp);
121 else if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW)
122 Filesets_Create_OnEndTask_EnumAggregates (hDlg);
123 else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
125 EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE);
126 Filesets_Create_StartDisplay_Aggregates (hDlg, &pscp->lpiParent);
128 FreeTaskPacket (ptp);
132 case WM_COLUMNS_CHANGED:
134 lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST));
135 FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
136 Filesets_Create_OnSelectServer (hDlg, (LPIDENT*)&lpSel);
143 if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
144 EndDialog (hDlg, LOWORD(wp));
148 EndDialog (hDlg, LOWORD(wp));
152 if (HIWORD(wp) == CBN_SELCHANGE)
153 Filesets_Create_OnSelectServer (hDlg, &pscp->lpiParent);
157 GetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName, cchNAME);
158 Filesets_Create_EnableOK (hDlg, pscp);
162 if (HIWORD(wp) == SPN_UPDATE)
164 pscp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA));
165 if (gr.cbQuotaUnits == cb1MB)
166 pscp->ckQuota *= ck1MB;
170 case IDC_SET_QUOTA_UNITS:
171 if (HIWORD(wp) == CBN_SELCHANGE)
173 gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS));
174 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
179 pscp->fCreateClone = IsDlgButtonChecked (hDlg, IDC_SET_CLONE);
185 FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
190 switch (((LPNMHDR)lp)->code)
194 if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL)
196 pscp->lpiParent = lpi;
198 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
199 Filesets_Create_EnableOK (hDlg, pscp);
211 static LONG procFilesetsCreateList = 0;
213 LRESULT CALLBACK Filesets_Create_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
217 if (procFilesetsCreateList == 0)
218 rc = DefWindowProc (hList, msg, wp, lp);
220 rc = CallWindowProc ((WNDPROC)procFilesetsCreateList, hList, msg, wp, lp);
225 if (procFilesetsCreateList != 0)
226 SetWindowLong (hList, GWL_WNDPROC, procFilesetsCreateList);
233 ShowColumnsDialog (GetParent (hList), &gr.viewAggCreate);
243 void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp)
245 HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST);
246 if (procFilesetsCreateList == 0)
247 procFilesetsCreateList = GetWindowLong (hList, GWL_WNDPROC);
248 SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_Create_SubclassListProc);
250 if (gr.viewAggCreate.lvsView == 0) // never initialized this?
252 if (gr.viewAggMove.lvsView == 0)
253 memcpy (&gr.viewAggCreate, &gr.viewAgg, sizeof(VIEWINFO));
255 memcpy (&gr.viewAggCreate, &gr.viewAggMove, sizeof(VIEWINFO));
257 FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
259 SetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName);
261 CB_StartChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), TRUE);
262 CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_KB, (LPARAM)cb1KB);
263 CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_MB, (LPARAM)cb1MB);
264 CB_EndChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), (LPARAM)gr.cbQuotaUnits);
266 CheckDlgButton (hDlg, IDC_SET_CLONE, pscp->fCreateClone);
268 // Create a spinner, and give it an appropriate min/max range. We'll
269 // have to *find* that range in a separate thread, 'cause it involves
270 // getting the status of an aggregate.
272 StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
274 // Fill in the Servers combobox, and select the default server
275 // (if one was specified).
277 LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
278 lpp->hCombo = GetDlgItem (hDlg, IDC_SET_SERVER);
279 lpp->lpiSelect = (pscp->lpiParent) ? pscp->lpiParent->GetServer() : NULL;
280 StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
282 EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE);
283 EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE);
284 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
288 void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget)
290 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
292 Filesets_Create_StartDisplay_Aggregates (hDlg, plpiTarget);
296 void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget)
298 LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER));
300 if (*plpiTarget && (*plpiTarget)->fIsServer())
302 if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew))
305 SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew);
307 LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET);
308 lpp->lpiServer = lpiServerNew;
309 lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST);
310 lpp->lpiSelect = *plpiTarget;
311 lpp->lpvi = &gr.viewAggCreate;
312 StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp);
316 void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg)
318 EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE);
322 void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp)
324 if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
325 EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
327 EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
331 void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp)
333 size_t cMin = TASKDATA(ptp)->ckMin;
334 size_t cNow = pscp->ckQuota;
335 size_t cMax = TASKDATA(ptp)->ckMax;
337 if (gr.cbQuotaUnits == cb1MB)
344 HWND hQuota = GetDlgItem (hDlg, IDC_SET_QUOTA);
345 if (!fHasSpinner (hQuota))
347 CreateSpinner (hQuota, 10, FALSE, cMin, cNow, cMax);
351 SP_SetRange (hQuota, cMin, cMax);
352 SP_SetPos (hQuota, cNow);