e64a498f0c023a94983a4dd40cef01e8f89c7f9d
[openafs.git] / src / WINNT / afssvrmgr / set_create.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 "svrmgr.h"
16 #include "set_create.h"
17 #include "set_general.h"
18 #include "propcache.h"
19 #include "columns.h"
20 #include "svr_window.h"
21 #include "display.h"
22
23
24 /*
25  * PROTOTYPES _________________________________________________________________
26  *
27  */
28
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);
36
37
38 /*
39  * ROUTINES ___________________________________________________________________
40  *
41  */
42
43 void Filesets_Create (LPIDENT lpiParent)
44 {
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;
51
52    // Show the Create dialog.
53    //
54    INT_PTR rc = ModalDialogParam (IDD_SET_CREATE, GetActiveWindow(), (DLGPROC)Filesets_Create_DlgProc, (LPARAM)pscp);
55
56    if (rc != IDOK)
57       {
58       Delete (pscp);
59       }
60    else if (!ASSERT( pscp->lpiParent && pscp->lpiParent->fIsAggregate() ))
61       {
62       Delete (pscp);
63       }
64    else if (!ASSERT( pscp->szName[0] != TEXT('\0') ))
65       {
66       Delete (pscp);
67       }
68    else
69       {
70       StartTask (taskSET_CREATE, NULL, pscp);
71       }
72 }
73
74
75 BOOL CALLBACK Filesets_Create_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
76 {
77    static LPSET_CREATE_PARAMS pscp = NULL;
78    if (msg == WM_INITDIALOG)
79       pscp = (LPSET_CREATE_PARAMS)lp;
80
81    if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggCreate))
82       return FALSE;
83
84    if (AfsAppLib_HandleHelp (IDD_SET_CREATE, hDlg, msg, wp, lp))
85       return TRUE;
86
87    if (pscp != NULL)
88       {
89       switch (msg)
90          {
91          case WM_INITDIALOG:
92             FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, &gr.viewAggCreate);
93             Filesets_Create_OnInitDialog (hDlg, pscp);
94             break;
95
96          case WM_CONTEXTMENU:
97             HWND hList;
98             hList = GetDlgItem (hDlg, IDC_AGG_LIST);
99
100             POINT ptScreen;
101             POINT ptClient;
102             ptScreen.x = LOWORD(lp);
103             ptScreen.y = HIWORD(lp);
104
105             ptClient = ptScreen;
106             ScreenToClient (hList, &ptClient);
107
108             if (FL_HitTestForHeaderBar (hList, ptClient))
109                {
110                HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
111                DisplayContextMenu (hm, ptScreen, hList);
112                }
113             break;
114
115          case WM_ENDTASK: 
116             LPTASKPACKET ptp;
117             if ((ptp = (LPTASKPACKET)lp) != NULL)
118                {
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)
124                   {
125                   EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE);
126                   Filesets_Create_StartDisplay_Aggregates (hDlg, &pscp->lpiParent);
127                   }
128                FreeTaskPacket (ptp);
129                }
130             break;
131
132          case WM_COLUMNS_CHANGED:
133             LPARAM lpSel;
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);
137             break;
138
139          case WM_COMMAND:
140             switch (LOWORD(wp))
141                {
142                case IDOK:
143                   if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
144                      EndDialog (hDlg, LOWORD(wp));
145                   break;
146
147                case IDCANCEL:
148                   EndDialog (hDlg, LOWORD(wp));
149                   break;
150
151                case IDC_SET_SERVER:
152                   if (HIWORD(wp) == CBN_SELCHANGE)
153                      Filesets_Create_OnSelectServer (hDlg, &pscp->lpiParent);
154                   break;
155
156                case IDC_SET_NAME:
157                   GetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName, cchNAME);
158                   Filesets_Create_EnableOK (hDlg, pscp);
159                   break;
160
161                case IDC_SET_QUOTA:
162                   if (HIWORD(wp) == SPN_UPDATE)
163                      {
164                      pscp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA));
165                      if (gr.cbQuotaUnits == cb1MB)
166                         pscp->ckQuota *= ck1MB;
167                      }
168                   break;
169
170                case IDC_SET_QUOTA_UNITS:
171                   if (HIWORD(wp) == CBN_SELCHANGE)
172                      {
173                      gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS));
174                      StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
175                      }
176                   break;
177
178                case IDC_SET_CLONE:
179                   pscp->fCreateClone = IsDlgButtonChecked (hDlg, IDC_SET_CLONE);
180                   break;
181                }
182             break;
183
184          case WM_DESTROY:
185             FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
186             pscp = NULL;
187             break;
188
189          case WM_NOTIFY: 
190             switch (((LPNMHDR)lp)->code)
191                { 
192                case FLN_ITEMSELECT:
193                   LPIDENT lpi;
194                   if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL)
195                      {
196                      pscp->lpiParent = lpi;
197
198                      StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
199                      Filesets_Create_EnableOK (hDlg, pscp);
200                      }
201                   break;
202                }
203             break;
204          }
205       }
206
207    return FALSE;
208 }
209
210
211 static LONG_PTR procFilesetsCreateList = 0;
212
213 LRESULT CALLBACK Filesets_Create_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
214 {
215    LRESULT rc;
216
217    if (procFilesetsCreateList == 0)
218       rc = DefWindowProc (hList, msg, wp, lp);
219    else
220       rc = CallWindowProc ((WNDPROC)procFilesetsCreateList, hList, msg, wp, lp);
221
222    switch (msg)
223       {
224       case WM_DESTROY:
225          if (procFilesetsCreateList != 0)
226             SetWindowLongPtr (hList, GWLP_WNDPROC, procFilesetsCreateList);
227          break;
228
229       case WM_COMMAND: 
230          switch (LOWORD(wp))
231             {
232             case M_COLUMNS:
233                ShowColumnsDialog (GetParent (hList), &gr.viewAggCreate);
234                break;
235             }
236          break; 
237       }
238
239    return rc;
240 }
241
242
243 void Filesets_Create_OnInitDialog (HWND hDlg, LPSET_CREATE_PARAMS pscp)
244 {
245    HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST);
246    if (procFilesetsCreateList == 0)
247       procFilesetsCreateList = GetWindowLongPtr (hList, GWLP_WNDPROC);
248    SetWindowLongPtr (hList, GWLP_WNDPROC, (LONG_PTR)Filesets_Create_SubclassListProc);
249
250    if (gr.viewAggCreate.lvsView == 0)  // never initialized this?
251       {
252       if (gr.viewAggMove.lvsView == 0)
253          memcpy (&gr.viewAggCreate, &gr.viewAgg, sizeof(VIEWINFO));
254       else
255          memcpy (&gr.viewAggCreate, &gr.viewAggMove, sizeof(VIEWINFO));
256       }
257    FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggCreate);
258
259    SetDlgItemText (hDlg, IDC_SET_NAME, pscp->szName);
260
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);
265
266    CheckDlgButton (hDlg, IDC_SET_CLONE, pscp->fCreateClone);
267
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.
271    //
272    StartTask (taskAGG_FIND_QUOTA_LIMITS, hDlg, pscp->lpiParent);
273
274    // Fill in the Servers combobox, and select the default server
275    // (if one was specified).
276    //
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);
281
282    EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE);
283    EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE);
284    EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
285 }
286
287
288 void Filesets_Create_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget)
289 {
290    EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
291
292    Filesets_Create_StartDisplay_Aggregates (hDlg, plpiTarget);
293 }
294
295
296 void Filesets_Create_StartDisplay_Aggregates (HWND hDlg, LPIDENT *plpiTarget)
297 {
298    LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER));
299
300    if (*plpiTarget && (*plpiTarget)->fIsServer())
301       *plpiTarget = NULL;
302    if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew))
303       *plpiTarget = NULL;
304
305    SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)lpiServerNew);
306
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);
313 }
314
315
316 void Filesets_Create_OnEndTask_EnumAggregates (HWND hDlg)
317 {
318    EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE);
319 }
320
321
322 void Filesets_Create_EnableOK (HWND hDlg, LPSET_CREATE_PARAMS pscp)
323 {
324    if (pscp->lpiParent && pscp->lpiParent->fIsAggregate() && pscp->szName[0])
325       EnableWindow (GetDlgItem (hDlg, IDOK), TRUE);
326    else
327       EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
328 }
329
330
331 void Filesets_Create_OnEndTask_FindQuotaLimits (HWND hDlg, LPTASKPACKET ptp, LPSET_CREATE_PARAMS pscp)
332 {
333    size_t cMin = TASKDATA(ptp)->ckMin;
334    size_t cNow = pscp->ckQuota;
335    size_t cMax = TASKDATA(ptp)->ckMax;
336
337    if (gr.cbQuotaUnits == cb1MB)
338       {
339       cMin /= ck1MB;
340       cNow /= ck1MB;
341       cMax /= ck1MB;
342       }
343
344    HWND hQuota = GetDlgItem (hDlg, IDC_SET_QUOTA);
345    if (!fHasSpinner (hQuota))
346       {
347       CreateSpinner (hQuota, 10, FALSE, (DWORD)cMin, (DWORD)cNow, (DWORD)cMax);
348       }
349    else
350       {
351       SP_SetRange (hQuota, cMin, cMax);
352       SP_SetPos (hQuota, cNow);
353       }
354 }
355