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