Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afssvrmgr / set_createrep.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "svrmgr.h"
7 #include "set_createrep.h"
8 #include "columns.h"
9 #include "svr_window.h"
10 #include "display.h"
11
12
13 /*
14  * PROTOTYPES _________________________________________________________________
15  *
16  */
17
18 BOOL CALLBACK Filesets_CreateReplica_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
19 void Filesets_CreateReplica_OnInitDialog (HWND hDlg, LPSET_CREATEREP_PARAMS pscp);
20 void Filesets_CreateReplica_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget);
21 void Filesets_CreateReplica_OnEndTask_EnumAggregates (HWND hDlg, LPSET_CREATEREP_PARAMS pscp);
22 void Filesets_CreateReplica_EnableOK (HWND hDlg, LPSET_CREATEREP_PARAMS pscp);
23 void Filesets_CreateReplica_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget);
24
25
26 /*
27  * ROUTINES ___________________________________________________________________
28  *
29  */
30
31 void Filesets_CreateReplica (LPIDENT lpiSource, LPIDENT lpiTarget)
32 {
33    LPSET_CREATEREP_PARAMS pscp = New (SET_CREATEREP_PARAMS);
34    pscp->lpiSource = lpiSource;
35    pscp->lpiTarget = lpiTarget;
36
37    int rc = ModalDialogParam (IDD_SET_CREATEREP, NULL, (DLGPROC)Filesets_CreateReplica_DlgProc, (LPARAM)pscp);
38    if (rc != IDOK)
39       {
40       Delete (pscp);
41       }
42    else if (!ASSERT( pscp->lpiTarget && pscp->lpiTarget->fIsAggregate() ))
43       {
44       Delete (pscp);
45       }
46    else
47       {
48       StartTask (taskSET_CREATEREP, NULL, pscp);
49       }
50 }
51
52
53 BOOL CALLBACK Filesets_CreateReplica_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
54 {
55    static LPSET_CREATEREP_PARAMS pscp = NULL;
56    if (msg == WM_INITDIALOG)
57       pscp = (LPSET_CREATEREP_PARAMS)lp;
58
59    if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewAggMove))
60       return FALSE;
61
62    if (AfsAppLib_HandleHelp (IDD_SET_CREATEREP, hDlg, msg, wp, lp))
63       return TRUE;
64
65    if (pscp != NULL)
66       {
67       switch (msg)
68          {
69          case WM_INITDIALOG:
70             FastList_SetTextCallback (GetDlgItem (hDlg, IDC_AGG_LIST), GetItemText, (DWORD)&gr.viewAggMove);
71             Filesets_CreateReplica_OnInitDialog (hDlg, pscp);
72             break;
73
74          case WM_ENDTASK:
75             LPTASKPACKET ptp;
76             if ((ptp = (LPTASKPACKET)lp) != NULL)
77                {
78                if (ptp->idTask == taskAGG_ENUM_TO_LISTVIEW)
79                   Filesets_CreateReplica_OnEndTask_EnumAggregates (hDlg, pscp);
80                else if (ptp->idTask == taskSVR_ENUM_TO_COMBOBOX)
81                   {
82                   EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), TRUE);
83                   Filesets_CreateReplica_OnSelectServer (hDlg, &pscp->lpiTarget);
84                   }
85                FreeTaskPacket (ptp);
86                }
87             break; 
88
89          case WM_CONTEXTMENU:
90             HWND hList;
91             hList = GetDlgItem (hDlg, IDC_AGG_LIST);
92
93             POINT ptScreen;
94             POINT ptClient;
95             ptScreen.x = LOWORD(lp);
96             ptScreen.y = HIWORD(lp);
97
98             ptClient = ptScreen;
99             ScreenToClient (hList, &ptClient);
100
101             if (FL_HitTestForHeaderBar (hList, ptClient))
102                {
103                HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
104                DisplayContextMenu (hm, ptScreen, hList);
105                }
106             break;
107
108          case WM_COLUMNS_CHANGED:
109             LPARAM lpSel;
110             lpSel = FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST));
111             FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove);
112             Filesets_CreateReplica_OnSelectServer (hDlg, (LPIDENT*)&lpSel);
113             break;
114
115          case WM_COMMAND:
116             switch (LOWORD(wp))
117                {
118                case IDOK:
119                   if (pscp->lpiTarget)
120                      EndDialog (hDlg, LOWORD(wp));
121                   break;
122
123                case IDCANCEL:
124                   EndDialog (hDlg, LOWORD(wp));
125                   break;
126
127                case IDC_SET_SERVER:
128                   if (HIWORD(wp) == CBN_SELCHANGE)
129                      Filesets_CreateReplica_OnSelectServer (hDlg, &pscp->lpiTarget);
130                   break;
131                }
132             break;
133
134          case WM_DESTROY:
135             FL_StoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove);
136             pscp = NULL;
137             break;
138
139          case WM_NOTIFY: 
140             switch (((LPNMHDR)lp)->code)
141                { 
142                case FLN_ITEMSELECT:
143                   LPIDENT lpi;
144                   if ((lpi = (LPIDENT)FL_GetSelectedData (GetDlgItem (hDlg, IDC_AGG_LIST))) != NULL)
145                      {
146                      pscp->lpiTarget = lpi;
147                      Filesets_CreateReplica_EnableOK (hDlg, pscp);
148                      }
149                   break;
150                }
151             break;
152          }
153       }
154
155    return FALSE;
156 }
157
158
159 static LONG procFilesetsCreateReplicaList = 0;
160
161 LRESULT CALLBACK Filesets_CreateReplica_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
162 {
163    LRESULT rc;
164
165    if (procFilesetsCreateReplicaList == 0)
166       rc = DefWindowProc (hList, msg, wp, lp);
167    else
168       rc = CallWindowProc ((WNDPROC)procFilesetsCreateReplicaList, hList, msg, wp, lp);
169
170    switch (msg)
171       {
172       case WM_DESTROY:
173          if (procFilesetsCreateReplicaList != 0)
174             SetWindowLong (hList, GWL_WNDPROC, procFilesetsCreateReplicaList);
175          break;
176
177       case WM_COMMAND: 
178          switch (LOWORD(wp))
179             {
180             case M_COLUMNS:
181                ShowColumnsDialog (GetParent (hList), &gr.viewAggMove);
182                break;
183             }
184          break; 
185       }
186
187    return rc;
188 }
189
190
191 void Filesets_CreateReplica_OnInitDialog (HWND hDlg, LPSET_CREATEREP_PARAMS pscp)
192 {
193    TCHAR szServer[ cchNAME ];
194    TCHAR szAggregate[ cchNAME ];
195    TCHAR szFileset[ cchNAME ];
196    pscp->lpiSource->GetServerName (szServer);
197    pscp->lpiSource->GetAggregateName (szAggregate);
198    pscp->lpiSource->GetFilesetName (szFileset);
199
200    TCHAR szText[ cchRESOURCE ];
201    GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE);
202    LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset);
203    SetDlgItemText (hDlg, IDC_SET_NAME, pszText);
204    FreeString (pszText);
205
206    HWND hList = GetDlgItem (hDlg, IDC_AGG_LIST);
207    if (procFilesetsCreateReplicaList == 0)
208       procFilesetsCreateReplicaList = GetWindowLong (hList, GWL_WNDPROC);
209    SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_CreateReplica_SubclassListProc);
210
211    if (gr.viewAggMove.lvsView == 0) // never initialized this?
212       {
213       if (gr.viewAggCreate.lvsView == 0)
214          memcpy (&gr.viewAggMove, &gr.viewAgg, sizeof(VIEWINFO));
215       else
216          memcpy (&gr.viewAggMove, &gr.viewAggCreate, sizeof(VIEWINFO));
217       }
218    FL_RestoreView (GetDlgItem (hDlg, IDC_AGG_LIST), &gr.viewAggMove);
219
220    EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
221    EnableWindow (GetDlgItem (hDlg, IDC_SET_SERVER), FALSE);
222    EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), FALSE);
223
224    // Fill in the Servers combobox, and select the default server
225    // (if one was specified).
226    //
227    LPSVR_ENUM_TO_COMBOBOX_PACKET lpp = New (SVR_ENUM_TO_COMBOBOX_PACKET);
228    lpp->hCombo = GetDlgItem (hDlg, IDC_SET_SERVER);
229    lpp->lpiSelect = (pscp->lpiTarget) ? pscp->lpiTarget->GetServer() : NULL;
230    StartTask (taskSVR_ENUM_TO_COMBOBOX, hDlg, lpp);
231 }
232
233
234 void Filesets_CreateReplica_OnSelectServer (HWND hDlg, LPIDENT *plpiTarget)
235 {
236    LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER));
237
238    SetWindowLong (hDlg, DWL_USER, (LONG)lpiServerNew);
239
240    if (*plpiTarget && (*plpiTarget)->fIsServer())
241       *plpiTarget = NULL;
242    if (*plpiTarget && ((*plpiTarget)->GetServer() != lpiServerNew))
243       *plpiTarget = NULL;
244
245    Filesets_CreateReplica_StartDisplay_Aggregates (hDlg, *plpiTarget);
246 }
247
248
249 void Filesets_CreateReplica_OnEndTask_EnumAggregates (HWND hDlg, LPSET_CREATEREP_PARAMS pscp)
250 {
251    EnableWindow (GetDlgItem (hDlg, IDC_AGG_LIST), TRUE);
252    Filesets_CreateReplica_EnableOK (hDlg, pscp);
253 }
254
255
256 void Filesets_CreateReplica_EnableOK (HWND hDlg, LPSET_CREATEREP_PARAMS pscp)
257 {
258    EnableWindow (GetDlgItem (hDlg, IDOK), (pscp->lpiTarget) ? TRUE : FALSE);
259 }
260
261
262 void Filesets_CreateReplica_StartDisplay_Aggregates (HWND hDlg, LPIDENT lpiTarget)
263 {
264    LPIDENT lpiServerNew = (LPIDENT)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_SERVER));
265
266    EnableWindow (GetDlgItem (hDlg, IDOK), FALSE);
267
268    LPAGG_ENUM_TO_LISTVIEW_PACKET lpp = New (AGG_ENUM_TO_LISTVIEW_PACKET);
269    lpp->hList = GetDlgItem (hDlg, IDC_AGG_LIST);
270    lpp->lpiServer = lpiServerNew;
271    lpp->lpiSelect = lpiTarget;
272    lpp->lpvi = &gr.viewAggMove;
273    StartTask (taskAGG_ENUM_TO_LISTVIEW, hDlg, lpp);
274 }
275