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