2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
16 #include "svr_window.h"
17 #include "svr_general.h"
20 #include "agg_general.h"
22 #include "set_general.h"
24 #include "set_repprop.h"
25 #include "set_createrep.h"
32 * RESIZING WINDOWS ___________________________________________________________
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 }
48 * VARIABLES __________________________________________________________________
56 HIMAGELIST hDragImage;
60 HLISTITEM hItemTarget;
65 * PROTOTYPES _________________________________________________________________
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);
76 void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns);
78 LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget);
80 void Filesets_SubclassList (HWND hDlg);
81 void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp);
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);
88 void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen);
92 * ROUTINES ___________________________________________________________________
96 BOOL CALLBACK Filesets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
98 if (HandleColumnNotify (hDlg, msg, wp, lp, &gr.viewSet))
106 GetClientRect (GetParent(hDlg), &rTab);
107 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
108 ResizeWindow (hDlg, awdFilesets, rwaMoveToHere, &rTab);
110 FL_RestoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet);
111 FastList_SetTextCallback (GetDlgItem (hDlg, IDC_SET_LIST), GetItemText, (DWORD)&gr.viewSet);
113 Filesets_SubclassList (hDlg);
115 Filesets_OnView (hDlg);
116 Filesets_OnSelect (hDlg);
121 WinHelp (hDlg, cszHELPFILENAME, HELP_FINDER, 0);
125 FL_StoreView (GetDlgItem (hDlg, IDC_SET_LIST), &gr.viewSet);
126 DontNotifyMeEver (hDlg);
130 // if (lp==0), we're minimizing--don't call ResizeWindow().
133 ResizeWindow (hDlg, awdFilesets, rwaFixupGuts);
140 ptScreen.x = LOWORD(lp);
141 ptScreen.y = HIWORD(lp);
144 ScreenToClient ((HWND)wp, &ptClient);
146 if ((HWND)wp == GetDlgItem (hDlg, IDC_SET_LIST))
147 Filesets_ShowPopupMenu ((HWND)wp, ptClient, ptScreen);
151 case WM_SERVER_CHANGED:
153 LPIDENT lpiServer = Server_GetServerForChild (hDlg);
154 DontNotifyMeEver (hDlg);
155 NotifyMe (WHEN_OBJECT_CHANGES, NULL, hDlg, 0);
157 // Fix the text at the top of the Aggregates tab:
159 TCHAR szName[ cchRESOURCE ];
162 if (lpiServer != NULL)
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);
169 pszText = FormatString (IDS_FILESETS_IN_SERVER, TEXT("%s"), szName);
171 else if (g.lpiCell != NULL)
173 g.lpiCell->GetCellName (szName);
175 pszText = FormatString (IDS_FILESET_SOME, TEXT("%s"), szName);
177 pszText = FormatString (IDS_FILESETS_IN_CELL, TEXT("%s"), szName);
181 pszText = FormatString (IDS_FILESETS_IN_NOTHING);
184 SetDlgItemText (hDlg, IDC_SET_DESC, pszText);
185 FreeString (pszText);
187 UpdateDisplay_Filesets (FALSE, GetDlgItem (hDlg, IDC_SET_LIST), NULL, 0, NULL, NULL, NULL);
191 case WM_NOTIFY_FROM_DISPATCH:
192 Filesets_OnNotifyFromDispatch ((LPNOTIFYSTRUCT)lp);
193 Delete ((LPNOTIFYSTRUCT)lp);
200 SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_CREATE, 0);
204 SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_DELETE, 0);
208 SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_REPLICATION, 0);
211 case IDC_SET_SETQUOTA:
212 SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_SETQUOTA, 0);
218 Filesets_ContinueDrag (hDlg);
222 if (l.fDragging && l.fRightBtn)
223 Filesets_FinishDrag (hDlg, FALSE, FALSE);
227 if (l.fDragging && !l.fRightBtn)
228 Filesets_FinishDrag (hDlg, FALSE, FALSE);
232 if (l.fDragging && !l.fRightBtn)
233 Filesets_FinishDrag (hDlg, TRUE, FALSE);
237 if (l.fDragging && l.fRightBtn)
238 Filesets_FinishDrag (hDlg, TRUE, TRUE);
243 if ((ptp = (LPTASKPACKET)lp) != NULL)
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);
258 switch (((LPNMHDR)lp)->code)
261 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
263 Filesets_OnSelect (hDlg);
268 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
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;
274 if (lpi && lpi->fIsServer())
277 if ((lpsp = (LPSERVER_PREF)lpi->GetUserParam()) != NULL)
279 lpsp->fExpandTree = fExpanded;
280 Server_SavePreferences (lpi);
283 else if (lpi && lpi->fIsAggregate())
285 LPAGGREGATE_PREF lpap;
286 if ((lpap = (LPAGGREGATE_PREF)lpi->GetUserParam()) != NULL)
288 lpap->fExpandTree = fExpanded;
289 Aggregates_SavePreferences (lpi);
296 return Filesets_BeginDrag (hDlg, ((LPFLN_DRAG_PARAMS)lp)->fRightButton);
299 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SET_LIST))
301 BOOL fShowProperties = TRUE;
304 if ((hItem = FastList_GetFocus (GetDlgItem (hDlg, IDC_SET_LIST))) != NULL)
306 if (FastList_FindFirstChild (GetDlgItem (hDlg, IDC_SET_LIST), hItem))
307 fShowProperties = FALSE;
310 LPIDENT lpi = Filesets_GetFocused (hDlg);
311 if (lpi && !lpi->fIsCell() && fShowProperties)
313 PostMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_PROPERTIES, 0);
326 void Filesets_OnSelect (HWND hDlg)
328 LPIDENT lpi = Filesets_GetSelected (hDlg);
330 if (!lpi || !lpi->fIsFileset())
332 EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE);
333 EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE);
334 EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE);
338 StartTask (taskSET_SELECT, hDlg, lpi);
343 void Filesets_OnEndTask_Select (HWND hDlg, LPTASKPACKET ptp)
345 LPIDENT lpi = (LPIDENT)(ptp->lpUser);
348 EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), FALSE);
350 EnableWindow (GetDlgItem (hDlg, IDC_SET_DELETE), TRUE);
352 if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type == ftCLONE))
353 EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), FALSE);
355 EnableWindow (GetDlgItem (hDlg, IDC_SET_REP), TRUE);
357 if ((!ptp->rc) || (TASKDATA(ptp)->fs.Type != ftREADWRITE))
358 EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), FALSE);
360 EnableWindow (GetDlgItem (hDlg, IDC_SET_SETQUOTA), TRUE);
364 void Filesets_OnNotifyFromDispatch (LPNOTIFYSTRUCT lpns)
368 case evtRefreshFilesetsEnd:
369 case evtRefreshStatusEnd:
370 case evtAlertsChanged:
372 if ( (!lpns->Params.lpi1) ||
373 (lpns->Params.lpi1->fIsServer()) ||
374 (lpns->Params.lpi1->fIsAggregate()) ||
375 (lpns->Params.lpi1->fIsFileset()) )
377 UpdateDisplay_Filesets (FALSE, GetDlgItem (lpns->hwndTarget, IDC_SET_LIST), lpns->Params.lpi1, lpns->Params.status, NULL, NULL, NULL);
384 static LONG procFilesetsList = 0;
386 LRESULT CALLBACK Filesets_SubclassListProc (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
390 if (procFilesetsList == 0)
391 rc = DefWindowProc (hList, msg, wp, lp);
393 rc = CallWindowProc ((WNDPROC)procFilesetsList, hList, msg, wp, lp);
398 if (procFilesetsList != 0)
399 SetWindowLong (hList, GWL_WNDPROC, procFilesetsList);
403 Filesets_Subclass_OnCommand (hList, msg, wp, lp);
411 void Filesets_Subclass_OnCommand (HWND hList, UINT msg, WPARAM wp, LPARAM lp)
413 HWND hChild = GetParent (hList);
414 LPIDENT lpi = Filesets_GetSelected (hChild);
419 ShowColumnsDialog (hChild, &gr.viewSet);
422 case M_SET_VIEW_TREELIST:
423 gr.viewSet.lvsView = FLS_VIEW_TREELIST;
424 Filesets_OnView (hChild);
427 case M_SET_VIEW_TREE:
428 gr.viewSet.lvsView = FLS_VIEW_TREE;
429 Filesets_OnView (hChild);
432 case M_SET_VIEW_REPORT:
433 gr.viewSet.lvsView = FLS_VIEW_LIST;
434 Filesets_OnView (hChild);
438 if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget)
439 Filesets_ShowMoveTo (l.lpiDrag, l.lpiTarget);
443 if (l.lpiDrag && l.lpiDrag->fIsFileset() && l.lpiTarget)
445 Filesets_CreateReplica (l.lpiDrag, l.lpiTarget);
450 StartContextCommand (Server_GetWindowForChild (GetParent(hList)),
451 Server_GetServerForChild (GetParent(hList)),
459 void Filesets_SubclassList (HWND hDlg)
461 HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
462 procFilesetsList = GetWindowLong (hList, GWL_WNDPROC);
463 SetWindowLong (hList, GWL_WNDPROC, (LONG)Filesets_SubclassListProc);
467 void Filesets_OnView (HWND hDlg)
469 HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
471 DWORD dwStyle = GetWindowLong (hList, GWL_STYLE);
472 dwStyle &= (~FLS_VIEW_MASK);
473 dwStyle |= gr.viewSet.lvsView;
475 SetWindowLong (hList, GWL_STYLE, dwStyle);
479 BOOL Filesets_BeginDrag (HWND hDlg, BOOL fRightBtn)
481 LPIDENT lpi = Filesets_GetFocused (hDlg);
483 if (!lpi || !lpi->fIsFileset()) // can only drag filesets!
486 l.fRightBtn = fRightBtn;
487 StartTask (taskSET_BEGINDRAG, hDlg, lpi);
492 void Filesets_OnEndTask_BeginDrag (HWND hDlg, LPTASKPACKET ptp)
494 LPIDENT lpi = (LPIDENT)(ptp->lpUser);
496 if (ptp->rc && TASKDATA(ptp)->fs.Type != ftCLONE)
498 HWND hList = GetDlgItem (hDlg, IDC_SET_LIST);
499 HLISTITEM hItem = FL_GetSelected (hList);
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.
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);
513 l.hDragImage = FastList_CreateDragImage (hList, hItem);
515 FastList_SetItemFirstImage (hList, hItem, iImage1);
516 FastList_SetItemSecondImage (hList, hItem, iImage2);
517 FastList_End (hList);
519 // Now we've got a drag image; start dragging.
524 DWORD dw = GetMessagePos();
525 POINT pt = { LOWORD(dw), HIWORD(dw) };
526 ScreenToClient (NULL, &pt);
528 ImageList_BeginDrag (l.hDragImage, 0, 8, 8);
529 ImageList_DragEnter (NULL, pt.x, pt.y);
534 void Filesets_ContinueDrag (HWND hDlg)
539 HLISTITEM hItemTarget;
541 DWORD dw = GetMessagePos();
542 POINT pt = { LOWORD(dw), HIWORD(dw) };
543 HWND hTarget = WindowFromPoint (pt);
548 ScreenToClient (hTarget, &ptClient);
550 if ((lpi = IdentifyPoint (hTarget, ptClient, &hItemTarget)) != NULL)
552 if (!lpi->fIsServer() && !lpi->fIsAggregate())
557 if (lpi != l.lpiTarget)
559 ImageList_DragLeave (NULL);
563 DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget);
564 FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT));
565 l.hItemTarget = NULL;
569 if ((l.lpiTarget = lpi) != NULL)
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);
577 ScreenToClient (NULL, &pt);
578 ImageList_DragEnter (NULL, pt.x, pt.y);
581 ImageList_DragMove (LOWORD(dw), HIWORD(dw));
586 void Filesets_FinishDrag (HWND hDlg, BOOL fDropped, BOOL fMenu)
590 Filesets_ContinueDrag (hDlg);
594 ImageList_EndDrag ();
595 ImageList_DragLeave (NULL);
598 if (l.lpiTarget != NULL)
602 Filesets_CancelDrag (hDlg);
604 else if (fDropped && !fMenu)
606 SendMessage (GetDlgItem (hDlg, IDC_SET_LIST), WM_COMMAND, M_SET_MOVEHERE, 0);
607 Filesets_CancelDrag (hDlg);
609 else // (fDropped && fMenu)
611 DWORD dw = GetMessagePos();
612 POINT pt = { LOWORD(dw), HIWORD(dw) };
614 LPMENUTASK lpp = New (MENUTASK);
615 lpp->hParent = GetDlgItem (hDlg, IDC_SET_LIST);
617 lpp->lpi = l.lpiDrag;
619 StartTask (taskSET_DRAGMENU, hDlg, lpp);
626 void Filesets_OnEndTask_DragMenu (HWND hDlg, LPTASKPACKET ptp)
628 HMENU hm = TaLocale_LoadMenu (MENU_SET_DRAGDROP);
631 EnableMenu (hm, M_SET_MOVEHERE, FALSE);
633 if (!ptp->rc || (TASKDATA(ptp)->fs.Type != ftREADWRITE))
634 EnableMenu (hm, M_SET_REPHERE, FALSE);
636 DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent);
637 Filesets_CancelDrag (hDlg);
641 void Filesets_CancelDrag (HWND hDlg)
643 if (l.hItemTarget != NULL)
645 DWORD dwFlags = FastList_GetItemFlags (l.hwndTarget, l.hItemTarget);
646 FastList_SetItemFlags (l.hwndTarget, l.hItemTarget, dwFlags & (~FLIF_DROPHIGHLIGHT));
647 l.hItemTarget = NULL;
652 LPIDENT IdentifyPoint (HWND hTarget, POINT ptClient, HLISTITEM *phItemTarget)
654 if ((*phItemTarget = FastList_ItemFromPoint (hTarget, &ptClient, TRUE)) == NULL)
657 return (LPIDENT)FL_GetData (hTarget, *phItemTarget);
661 void Filesets_ShowPopupMenu (HWND hList, POINT ptList, POINT ptScreen)
663 if (!ptScreen.x && !ptScreen.y)
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);
671 else if (FL_HitTestForHeaderBar (hList, ptList))
673 HMENU hm = TaLocale_LoadMenu (MENU_COLUMNS);
674 DisplayContextMenu (hm, ptScreen, hList);
678 LPIDENT lpi = Filesets_GetFocused (GetParent (hList), &ptList);
679 if (lpi && (lpi != Filesets_GetSelected (GetParent (hList))))
681 lpi = NULL; // right-click on item other than highlighted one?
684 if (lpi && lpi->fIsFileset())
686 Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi);
688 else if (lpi && lpi->fIsAggregate())
690 Aggregates_ShowParticularPopupMenu (hList, ptScreen, lpi);
692 else if (lpi && lpi->fIsServer())
694 Server_ShowParticularPopupMenu (hList, ptScreen, lpi);
696 else if (!lpi) // display the _NONE menu? (no menu if it's a cell ident)
698 Filesets_ShowParticularPopupMenu (hList, ptScreen, lpi);
704 void Filesets_ShowParticularPopupMenu (HWND hParent, POINT ptScreen, LPIDENT lpiFileset)
707 if ((pmt = New (MENUTASK)) != NULL)
709 pmt->hParent = hParent;
710 pmt->ptScreen = ptScreen;
711 pmt->lpi = lpiFileset;
712 StartTask (taskSET_MENU, GetParent(hParent), pmt);
717 void Filesets_OnEndTask_Menu (HWND hDlg, LPTASKPACKET ptp)
719 LPIDENT lpiFileset = (LPIDENT)(TASKDATA(ptp)->mt.lpi);
722 if (lpiFileset != NULL)
723 hm = TaLocale_LoadMenu (MENU_SET);
725 hm = TaLocale_LoadMenu (MENU_SET_NONE);
729 if (lpiFileset == NULL)
731 HMENU hmView = GetSubMenu (hm, 0);
732 DWORD dwStyle = GetWindowLong (TASKDATA(ptp)->mt.hParent, GWL_STYLE);
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,
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,
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);
760 if (TASKDATA(ptp)->fs.Type == ftCLONE)
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);
768 if (TASKDATA(ptp)->fs.Type != ftREADWRITE)
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);
778 DisplayContextMenu (hm, TASKDATA(ptp)->mt.ptScreen, TASKDATA(ptp)->mt.hParent);