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