Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afssvrmgr / set_tab.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "svrmgr.h"
7 #include "svr_window.h"
8 #include "svr_general.h"
9 #include "svc_tab.h"
10 #include "agg_tab.h"
11 #include "agg_general.h"
12 #include "set_tab.h"
13 #include "set_general.h"
14 #include "set_move.h"
15 #include "set_repprop.h"
16 #include "set_createrep.h"
17 #include "display.h"
18 #include "columns.h"
19 #include "command.h"
20
21
22 /*
23  * RESIZING WINDOWS ___________________________________________________________
24  *
25  */
26
27 rwWindowData awdFilesets[] = {
28     { IDC_SET_DESC,        raSizeX           },
29     { IDC_SET_LIST,        raSizeX | raSizeY },
30     { IDC_SET_CREATE,      raMoveX | raMoveY },
31     { IDC_SET_DELETE,      raMoveX | raMoveY },
32     { IDC_SET_REP,         raMoveX | raMoveY },
33     { IDC_SET_SETQUOTA,    raMoveX | raMoveY },
34     { idENDLIST,           0                 }
35  };
36
37
38 /*
39  * VARIABLES __________________________________________________________________
40  *
41  */
42
43 static struct // l
44    {
45    BOOL fDragging;
46    BOOL fRightBtn;
47    HIMAGELIST hDragImage;
48    LPIDENT lpiDrag;
49    LPIDENT lpiTarget;
50    HWND hwndTarget;
51    HLISTITEM hItemTarget;
52    } l;
53
54
55 /*
56  * PROTOTYPES _________________________________________________________________
57  *
58  */
59
60 void Filesets_OnView (HWND hDlg);
61 void Filesets_OnSelect (HWND hDlg);
62 void Filesets_OnEndTask_Select (HWND hDlg, LPTASKPACKET ptp);
63 void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp);
64 void Filesets_OnEndTask_DragMenu (HWND hDlg, LPTASKPACKET ptp);
65 void Filesets_OnEndTask_Menu (HWND hDlg, LPTASKPACKET ptp);
66
67 void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns);
68
69 LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget);
70
71 void Filesets_SubclassList (HWND hDlg);
72 void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp);
73
74 BOOL Filesets_BeginDrag (HWND hDlg, BOOL fRightBtn);
75 void Filesets_ContinueDrag (HWND hDlg);
76 void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu);
77 void Filesets_CancelDrag (HWND hDlg);
78
79 void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen);
80
81
82 /*
83  * ROUTINES ___________________________________________________________________
84  *
85  */
86
87 BOOL CALLBACK Filesets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
88 {
89    if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewSet))
90       return FALSE;
91
92    switch (msg)
93       {
94       case WM_INITDIALOG:
95          {
96          RECT rTab;
97          GetClientRect (GetParent(hDlg), &rTab);
98          TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); 
99          ResizeWindow (hDlg, awdFilesets, rwaMoveToHere, &rTab);
100
101          FL_RestoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet);
102          FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SET_LIST), GetItemText, (DWORD)&gr.viewSet);
103
104          Filesets_SubclassList (hDlg);
105
106          Filesets_OnView (hDlg);
107          Filesets_OnSelect (hDlg);
108          }
109          break;
110
111       case WM_HELP:
112          WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0);
113          break;
114
115       case WM_DESTROY:
116          FL_StoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet);
117          DontNotifyMeEver (hDlg);
118          break;
119
120       case WM_SIZE:
121          // if (lp==0), we're minimizing--don't call ResizeWindow().
122          //
123          if (lp != 0)
124             ResizeWindow (hDlg, awdFilesets, rwaFixupGuts);
125          break;
126
127       case WM_CONTEXTMENU:
128          {
129          POINT ptScreen;
130          POINT ptClient;
131          ptScreen.x = LOWORD(lp);
132          ptScreen.y = HIWORD(lp);
133
134          ptClient = ptScreen;
135          ScreenToClient ((HWND)wp, &ptClient);
136
137          if ((HWND)wp == GetDlgItem (hDlg, IDC_SET_LIST))
138             Filesets_ShowPopupMenu ((HWND)wp, ptClient, ptScreen);
139          }
140          break; 
141
142       case WM_SERVER_CHANGED:
143          {
144          LPIDENT lpiServer = Server_GetServerForChild (hDlg);
145          DontNotifyMeEver (hDlg);
146          NotifyMe (WHEN_OBJECT_CHANGES, NULL, hDlg, 0);
147
148          // Fix the text at the top of the Aggregates tab:
149          //
150          TCHAR szName[ cchRESOURCE ];
151          LPTSTR pszText;
152
153          if (lpiServer != NULL)
154             {
155             LPSERVER_PREF lpsp = (LPSERVER_PREF)lpiServer->GetUserParam();
156             lpiServer->GetServerName (szName);
157             if (lpsp && !lpsp->fIsMonitored)
158                pszText = FormatString (IDS_FILESET_UNMON, TEXT("%s"), szName);
159             else
160                pszText = FormatString (IDS_FILESETS_IN_SERVER, TEXT("%s"), szName);
161             }
162          else if (g.lpiCell != NULL)
163             {
164             g.lpiCell->GetCellName (szName);
165             if (g.sub)
166                pszText = FormatString (IDS_FILESET_SOME, TEXT("%s"), szName);
167             else
168                pszText = FormatString (IDS_FILESETS_IN_CELL, TEXT("%s"), szName);
169             }
170          else
171             {
172             pszText = FormatString (IDS_FILESETS_IN_NOTHING);
173             }
174
175          SetDlgItemText (hDlg, IDC_SET_DESC, pszText);
176          FreeString (pszText);
177
178          UpdateDisplay_Filesets (FALSE, GetDlgItem (hDlg, IDC_SET_LIST), NULL, 0, NULL, NULL, NULL);
179          }
180          break;
181
182       case WM_NOTIFY_FROM_DISPATCH:
183          Filesets_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp);
184          Delete ((LPNOTIFYSTRUCT)lp);
185          break;
186
187       case WM_COMMAND:
188          switch (LOWORD(wp))
189             {
190             case IDC_SET_CREATE:
191                SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_CREATE, 0);
192                break;
193
194             case IDC_SET_DELETE:
195                SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_DELETE, 0);
196                break;
197
198             case IDC_SET_REP:
199                SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_REPLICATION, 0);
200                break;
201
202             case IDC_SET_SETQUOTA:
203                SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_SETQUOTA, 0);
204                break;
205             }
206          break;
207
208       case WM_MOUSEMOVE:
209          Filesets_ContinueDrag (hDlg);
210          break;
211
212       case WM_LBUTTONDOWN:
213          if (l.fDragging && l.fRightBtn)
214             Filesets_FinishDrag (hDlg, FALSE, FALSE);
215          break;
216
217       case WM_RBUTTONDOWN:
218          if (l.fDragging && !l.fRightBtn)
219             Filesets_FinishDrag (hDlg, FALSE, FALSE);
220          break;
221
222       case WM_LBUTTONUP:
223          if (l.fDragging && !l.fRightBtn)
224             Filesets_FinishDrag (hDlg, TRUE, FALSE);
225          break;
226
227       case WM_RBUTTONUP:
228          if (l.fDragging && l.fRightBtn)
229             Filesets_FinishDrag (hDlg, TRUE, TRUE);
230          break;
231
232       case WM_ENDTASK:
233          LPTASKPACKET ptp;
234          if ((ptp = (LPTASKPACKET)lp) != NULL)
235             {
236             if (ptp->idTask == taskSET_SELECT)
237                Filesets_OnEndTask_Select (hDlg, ptp);
238             else if (ptp->idTask == taskSET_BEGINDRAG)
239                Filesets_OnEndTask_BeginDrag (hDlg, ptp);
240             else if (ptp->idTask == taskSET_DRAGMENU)
241                Filesets_OnEndTask_DragMenu (hDlg, ptp);
242             else if (ptp->idTask == taskSET_MENU)
243                Filesets_OnEndTask_Menu (hDlg, ptp);
244             FreeTaskPacket (ptp);
245             }
246          break;
247
248       case WM_NOTIFY:
249          switch (((LPNMHDR)lp)->code)
250             { 
251             case FLN_ITEMSELECT:
252                if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
253                   {
254                   Filesets_OnSelect (hDlg);
255                   }
256                break;
257
258             case FLN_ITEMEXPAND:
259                if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
260                   {
261                   HLISTITEM hItem = ((LPFLN_ITEMEXPAND_PARAMS)lp)->hItem;
262                   LPIDENT lpi = (LPIDENT)FastList_GetItemParam (GetDlgItem (hDlg, IDC_SET_LIST), hItem);
263                   BOOL fExpanded = ((LPFLN_ITEMEXPAND_PARAMS)lp)->fExpanded;
264
265                   if (lpi && lpi->fIsServer())
266                      {
267                      LPSERVER_PREF lpsp;
268                      if ((lpsp = (LPSERVER_PREF)lpi->GetUserParam()) != NULL)
269                         {
270                         lpsp->fExpandTree = fExpanded;
271                         Server_SavePreferences (lpi);
272                         }
273                      }
274                   else if (lpi && lpi->fIsAggregate())
275                      {
276                      LPAGGREGATE_PREF lpap;
277                      if ((lpap = (LPAGGREGATE_PREF)lpi->GetUserParam()) != NULL)
278                         {
279                         lpap->fExpandTree = fExpanded;
280                         Aggregates_SavePreferences (lpi);
281                         }
282                      }
283                   }
284                break;
285
286             case FLN_BEGINDRAG:
287                return Filesets_BeginDrag (hDlg, ((LPFLN_DRAG_PARAMS)lp)->fRightButton);
288
289             case FLN_LDBLCLICK:
290                if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
291                   {
292                   BOOL fShowProperties = TRUE;
293
294                   HLISTITEM hItem;
295                   if ((hItem = FastList_GetFocus (GetDlgItem (hDlg, IDC_SET_LIST))) != NULL)
296                      {
297                      if (FastList_FindFirstChild (GetDlgItem (hDlg, IDC_SET_LIST), hItem))
298                         fShowProperties = FALSE;
299                      }
300
301                   LPIDENT lpi = Filesets_GetFocused (hDlg);
302                   if (lpi && !lpi->fIsCell() && fShowProperties)
303                      {
304                      PostMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_PROPERTIES, 0);
305                      return TRUE;
306                      }
307                   }
308                break;
309             }
310          break;
311       }
312
313    return FALSE;
314 }
315
316
317 void Filesets_OnSelect (HWND hDlg)
318 {
319    LPIDENT lpi = Filesets_GetSelected (hDlg);
320
321    if (!lpi || !lpi->fIsFileset())
322       {
323       EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE);
324       EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE);
325       EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE);
326       }
327    else
328       {
329       StartTask (taskSET_SELECT, hDlg, lpi);
330       }
331 }
332
333
334 void Filesets_OnEndTask_Select (HWND hDlg, LPTASKPACKET ptp)
335 {
336    LPIDENT lpi = (LPIDENT)(ptp->lpUser);
337
338    if (!ptp->rc)
339       EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE);
340    else
341       EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), TRUE);
342
343    if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type == ftCLONE))
344       EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE);
345    else
346       EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), TRUE);
347
348    if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type != ftREADWRITE))
349       EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE);
350    else
351       EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), TRUE);
352 }
353
354
355 void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns)
356 {
357    switch (lpns->evt)
358       {
359       case evtRefreshFilesetsEnd:
360       case evtRefreshStatusEnd:
361       case evtAlertsChanged:
362       case evtDestroy:
363          if ( (!lpns->Params.lpi1) ||
364               (lpns->Params.lpi1->fIsServer()) ||
365               (lpns->Params.lpi1->fIsAggregate()) ||
366               (lpns->Params.lpi1->fIsFileset()) )
367             {
368             UpdateDisplay_Filesets (FALSE, GetDlgItem (lpns->hwndTarget, IDC_SET_LIST), lpns->Params.lpi1, lpns->Params.status, NULL, NULL, NULL);
369             }
370          break;
371       }
372 }
373
374
375 static LONG procFilesetsList = 0;
376
377 LRESULT CALLBACK Filesets_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
378 {
379    LRESULT rc;
380
381    if (procFilesetsList == 0)
382       rc = DefWindowProc (hList, msg, wp, lp);
383    else
384       rc = CallWindowProc ((WNDPROC)procFilesetsList, hList, msg, wp, lp);
385
386    switch (msg)
387       {
388       case WM_DESTROY:
389          if (procFilesetsList != 0)
390             SetWindowLong (hList, GWL_WNDPROC, procFilesetsList);
391          break;
392
393       case WM_COMMAND: 
394          Filesets_Subclass_OnCommand (hList, msg, wp, lp);
395          break; 
396       }
397
398    return rc;
399 }
400
401
402 void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
403 {
404    HWND hChild = GetParent (hList);
405    LPIDENT lpi = Filesets_GetSelected (hChild);
406
407    switch (LOWORD(wp))
408       {
409       case M_COLUMNS:
410          ShowColumnsDialog (hChild, &gr.viewSet);
411          break;
412
413       case M_SET_VIEW_TREELIST:
414          gr.viewSet.lvsView = FLS_VIEW_TREELIST;
415          Filesets_OnView (hChild);
416          break;
417
418       case M_SET_VIEW_TREE:
419          gr.viewSet.lvsView = FLS_VIEW_TREE;
420          Filesets_OnView (hChild);
421          break;
422
423       case M_SET_VIEW_REPORT:
424          gr.viewSet.lvsView = FLS_VIEW_LIST;
425          Filesets_OnView (hChild);
426          break;
427
428       case M_SET_MOVEHERE:
429          if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget)
430             Filesets_ShowMoveTo (l.lpiDrag, l.lpiTarget);
431          break;
432
433       case M_SET_REPHERE:
434          if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget)
435             {
436             Filesets_CreateReplica (l.lpiDrag, l.lpiTarget);
437             }
438          break;
439
440       default:
441          StartContextCommand (Server_GetWindowForChild (GetParent(hList)),
442                               Server_GetServerForChild (GetParent(hList)),
443                               lpi,
444                               LOWORD(wp));
445          break;
446       }
447 }
448
449
450 void Filesets_SubclassList (HWND hDlg)
451 {
452    HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
453    procFilesetsList = GetWindowLong (hList, GWL_WNDPROC);
454    SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_SubclassListProc);
455 }
456
457
458 void Filesets_OnView (HWND hDlg)
459 {
460    HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
461
462    DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
463    dwStyle &= (~FLS_VIEW_MASK);
464    dwStyle |= gr.viewSet.lvsView;
465
466    SetWindowLong (hList, GWL_STYLE, dwStyle);
467 }
468
469
470 BOOL Filesets_BeginDrag (HWND hDlg, BOOL fRightBtn)
471 {
472    LPIDENT lpi = Filesets_GetFocused (hDlg);
473
474    if (!lpi || !lpi->fIsFileset())  // can only drag filesets!
475       return FALSE;
476
477    l.fRightBtn = fRightBtn;
478    StartTask (taskSET_BEGINDRAG, hDlg, lpi);
479    return TRUE;
480 }
481
482
483 void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp)
484 {
485    LPIDENT lpi = (LPIDENT)(ptp->lpUser);
486
487    if (ptp->rc && TASKDATA(ptp)->fs.Type != ftCLONE)
488       {
489       HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
490       HLISTITEM hItem = FL_GetSelected (hList);
491
492       // When creating a drag image, we'll temporarily reset the object's
493       // images so we can be sure it'll draw just the Fileset icon.
494       //
495       FastList_Begin (hList);
496       int iImage1 = FastList_GetItemFirstImage (hList, hItem);
497       int iImage2 = FastList_GetItemSecondImage (hList, hItem);
498       FastList_SetItemFirstImage (hList, hItem, imageFILESET);
499       FastList_SetItemSecondImage (hList, hItem, IMAGE_NOIMAGE);
500
501       l.lpiDrag = lpi;
502       l.lpiTarget = NULL;
503       l.fDragging = TRUE;
504       l.hDragImage = FastList_CreateDragImage (hList, hItem);
505
506       FastList_SetItemFirstImage (hList, hItem, iImage1);
507       FastList_SetItemSecondImage (hList, hItem, iImage2);
508       FastList_End (hList);
509
510       // Now we've got a drag image; start dragging.
511       //
512       ShowCursor (FALSE);
513       SetCapture (hDlg);
514
515       DWORD dw = GetMessagePos();
516       POINT pt = { LOWORD(dw), HIWORD(dw) };
517       ScreenToClient (NULL, &pt);
518
519       ImageList_BeginDrag (l.hDragImage, 0, 8, 8);
520       ImageList_DragEnter (NULL, pt.x, pt.y);
521       }
522 }
523
524
525 void Filesets_ContinueDrag (HWND hDlg)
526 {
527    if (l.fDragging)
528       {
529       LPIDENT lpi = NULL;
530       HLISTITEM hItemTarget;
531
532       DWORD dw = GetMessagePos();
533       POINT pt = { LOWORD(dw), HIWORD(dw) };
534       HWND hTarget = WindowFromPoint (pt);
535
536       if (hTarget != NULL)
537          {
538          POINT ptClient = pt;
539          ScreenToClient (hTarget, &ptClient);
540
541          if ((lpi = IdentifyPoint (hTarget, ptClient, &hItemTarget)) != NULL)
542             {
543             if (!lpi->fIsServer() && !lpi->fIsAggregate())
544                lpi = NULL;
545             }
546          }
547
548       if (lpi != l.lpiTarget)
549          {
550          ImageList_DragLeave (NULL);
551
552          if (l.hItemTarget)
553             {
554             DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget);
555             FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT));
556             l.hItemTarget = NULL;
557             l.lpiTarget = NULL;
558             }
559
560          if ((l.lpiTarget = lpi) != NULL)
561             {
562             l.hwndTarget = hTarget;
563             l.hItemTarget = hItemTarget;
564             DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget);
565             FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags | FLIF_DROPHIGHLIGHT);
566             }
567
568          ScreenToClient (NULL, &pt);
569          ImageList_DragEnter (NULL, pt.x, pt.y);
570          }
571
572       ImageList_DragMove (LOWORD(dw), HIWORD(dw));
573       }
574 }
575
576
577 void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu)
578 {
579    if (l.fDragging)
580       {
581       Filesets_ContinueDrag (hDlg);
582       ReleaseCapture();
583       l.fDragging = FALSE;
584
585       ImageList_EndDrag ();
586       ImageList_DragLeave (NULL);
587       ShowCursor (TRUE);
588
589       if (l.lpiTarget != NULL)
590          {
591          if (!fDropped)
592             {
593             Filesets_CancelDrag (hDlg);
594             }
595          else if (fDropped && !fMenu)
596             {
597             SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_MOVEHERE, 0);
598             Filesets_CancelDrag (hDlg);
599             }
600          else // (fDropped && fMenu)
601             {
602             DWORD dw = GetMessagePos();
603             POINT pt = { LOWORD(dw), HIWORD(dw) };
604
605             LPMENUTASK lpp = New (MENUTASK);
606             lpp->hParent = GetDlgItem (hDlg, IDC_SET_LIST);
607             lpp->ptScreen = pt;
608             lpp->lpi = l.lpiDrag;
609
610             StartTask (taskSET_DRAGMENU, hDlg, lpp);
611             }
612          }
613       }
614 }
615
616
617 void Filesets_OnEndTask_DragMenu (HWND hDlg, LPTASKPACKET ptp)
618 {
619    HMENU hm = TaLocale_LoadMenu (MENU_SET_DRAGDROP);
620
621    if (!ptp->rc)
622       EnableMenu (hm, M_SET_MOVEHERE, FALSE);
623
624    if (!ptp->rc || (TASKDATA(ptp)->fs.Type != ftREADWRITE))
625       EnableMenu (hm, M_SET_REPHERE, FALSE);
626
627    DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent);
628    Filesets_CancelDrag (hDlg);
629 }
630
631
632 void Filesets_CancelDrag (HWND hDlg)
633 {
634    if (l.hItemTarget != NULL)
635       {
636       DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget);
637       FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT));
638       l.hItemTarget = NULL;
639       }
640 }
641
642
643 LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget)
644 {
645    if ((*phItemTarget = FastList_ItemFromPoint (hTarget, &ptClient, TRUE)) == NULL)
646       return NULL;
647
648    return (LPIDENT)FL_GetData (hTarget, *phItemTarget);
649 }
650
651
652 void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen)
653 {
654    if (!ptScreen.x && !ptScreen.y)
655       {
656       RECT rWindow;
657       GetWindowRect (hList, &rWindow);
658       ptScreen.x = rWindow.left + (rWindow.right -rWindow.left)/2;
659       ptScreen.y = rWindow.top + (rWindow.bottom -rWindow.top)/2;
660       Filesets_ShowParticularPopupMenu (hList, ptScreen, NULL);
661       }
662    else if (FL_HitTestForHeaderBar (hList, ptList))
663       {
664       HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
665       DisplayContextMenu (hm, ptScreen, hList);
666       }
667    else
668       {
669       LPIDENT lpi = Filesets_GetFocused (GetParent (hList), &ptList);
670       if (lpi && (lpi != Filesets_GetSelected (GetParent (hList))))
671          {
672          lpi = NULL; // right-click on item other than highlighted one?
673          }
674
675       if (lpi && lpi->fIsFileset())
676          {
677          Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi);
678          }
679       else if (lpi && lpi->fIsAggregate())
680          {
681          Aggregates_ShowParticularPopupMenu (hList, ptScreen, lpi);
682          }
683       else if (lpi && lpi->fIsServer())
684          {
685          Server_ShowParticularPopupMenu (hList, ptScreen, lpi);
686          }
687       else if (!lpi) // display the _NONE menu? (no menu if it's a cell ident)
688          {
689          Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi);
690          }
691       }
692 }
693
694
695 void Filesets_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiFileset)
696 {
697    LPMENUTASK pmt;
698    if ((pmt = New (MENUTASK)) != NULL)
699       {
700       pmt->hParent = hParent;
701       pmt->ptScreen = ptScreen;
702       pmt->lpi = lpiFileset;
703       StartTask (taskSET_MENU, GetParent(hParent), pmt);
704       }
705 }
706
707
708 void Filesets_OnEndTask_Menu (HWND hDlg, LPTASKPACKET ptp)
709 {
710    LPIDENT lpiFileset = (LPIDENT)(TASKDATA(ptp)->mt.lpi);
711
712    HMENU hm;
713    if (lpiFileset != NULL)
714       hm = TaLocale_LoadMenu (MENU_SET);
715    else
716       hm = TaLocale_LoadMenu (MENU_SET_NONE);
717
718    if (hm != NULL)
719       {
720       if (lpiFileset == NULL)
721          {
722          HMENU hmView = GetSubMenu (hm, 0);
723          DWORD dwStyle = GetWindowLong (TASKDATA(ptp)->mt.hParent, GWL_STYLE);
724
725          CheckMenuRadioItem (hmView,
726                              M_SET_VIEW_REPORT, M_SET_VIEW_TREE,
727                              ((dwStyle & FLS_VIEW_MASK) == FLS_VIEW_TREELIST) ? M_SET_VIEW_TREELIST :
728                              ((dwStyle & FLS_VIEW_MASK) == FLS_VIEW_TREE)     ? M_SET_VIEW_TREE : M_SET_VIEW_REPORT,
729                              MF_BYCOMMAND);
730
731          CheckMenuRadioItem (hmView,
732                              M_VIEW_ONEICON, M_VIEW_STATUS,
733                              (gr.ivSet == ivTWOICONS) ? M_VIEW_TWOICONS :
734                              (gr.ivSet == ivONEICON)  ? M_VIEW_ONEICON : M_VIEW_STATUS,
735                              MF_BYCOMMAND);
736          }
737       else
738          {
739          if (!ptp->rc)
740             {
741             EnableMenu (hm, M_SET_REPLICATION, FALSE);
742             EnableMenu (hm, M_SET_SETQUOTA,    FALSE);
743             EnableMenu (hm, M_SET_RELEASE,     FALSE);
744             EnableMenu (hm, M_SET_CLONE,       FALSE);
745             EnableMenu (hm, M_SET_MOVETO,      FALSE);
746             EnableMenu (hm, M_SET_DUMP,        FALSE);
747             EnableMenu (hm, M_SET_RESTORE,     FALSE);
748             }
749          else
750             {
751             if (TASKDATA(ptp)->fs.Type == ftCLONE)
752                {
753                EnableMenu (hm, M_SET_REPLICATION, FALSE);
754                EnableMenu (hm, M_SET_RELEASE,     FALSE);
755                EnableMenu (hm, M_SET_CLONE,       FALSE);
756                EnableMenu (hm, M_SET_MOVETO,      FALSE);
757                }
758
759             if (TASKDATA(ptp)->fs.Type != ftREADWRITE)
760                {
761                EnableMenu (hm, M_SET_CLONE, FALSE);
762                EnableMenu (hm, M_SET_RELEASE, FALSE);
763                EnableMenu (hm, M_SET_SETQUOTA, FALSE);
764                EnableMenu (hm, M_SET_RESTORE, FALSE);
765                }
766             }
767          }
768
769       DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent);
770       }
771 }
772