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>
17 #include "propcache.h"
20 #define REGVAL_INCLUSIVE TEXT("Inclusive List")
23 * PROTOTYPES _________________________________________________________________
27 BOOL CALLBACK Subsets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
28 void Subsets_OnInitDialog (HWND hDlg, LPSUBSET sub);
29 void Subsets_OnApply (HWND hDlg, LPSUBSET sub);
30 LPSUBSET Subsets_OnLoad (HWND hDlg, LPSUBSET sub);
31 void Subsets_OnSave (HWND hDlg, LPSUBSET sub);
32 void Subsets_SetName (HWND hDlg, LPSUBSET sub);
33 void Subsets_PutSubsetOnDialog (HWND hDlg, LPSUBSET sub);
34 void Subsets_GetSubsetFromDialog (HWND hDlg, LPSUBSET sub);
35 LPSUBSET Subsets_OnCheck (HWND hDlg, int iSel, LPSUBSET subOld);
36 LPSUBSET Subsets_OnCheckAll (HWND hDlg, LPSUBSET subOld, BOOL fCheck);
38 BOOL Subsets_GetLoadName (HWND hParent, LPTSTR pszSubset);
39 BOOL Subsets_GetSaveName (HWND hParent, LPTSTR pszSubset);
43 * ROUTINES ___________________________________________________________________
47 BOOL Subsets_fMonitorServer (LPSUBSET sub, LPIDENT lpiServer)
51 TCHAR szLong[ cchNAME ];
52 TCHAR szShort[ cchNAME ];
53 lpiServer->GetLongServerName (szLong);
54 lpiServer->GetShortServerName (szShort);
58 if (sub->pszMonitored)
60 fMonitor = FALSE; // unless it shows up here.
62 for (LPTSTR psz = sub->pszMonitored; !fMonitor && *psz; psz += 1+lstrlen(psz))
64 if (!lstrcmpi (psz, szLong))
66 else if (!lstrcmpi (psz, szShort))
70 else if (sub->pszUnmonitored)
72 for (LPTSTR psz = sub->pszUnmonitored; fMonitor && *psz; psz += 1+lstrlen(psz))
74 if (!lstrcmpi (psz, szLong))
76 else if (!lstrcmpi (psz, szShort))
86 LPSUBSET Subsets_SetMonitor (LPSUBSET sub, LPIDENT lpiServer, BOOL fMonitor)
91 memset (sub, 0x00, sizeof(SUBSET));
94 if (fMonitor != Subsets_fMonitorServer (sub, lpiServer))
96 sub->fModified = TRUE;
98 TCHAR szLong[ cchNAME ];
99 TCHAR szShort[ cchNAME ];
100 lpiServer->GetShortServerName (szShort);
101 lpiServer->GetLongServerName (szLong);
103 // First ensure that the server name doesn't appear anywhere
106 LPTSTR pszMonitoredNew = NULL;
107 LPTSTR pszUnmonitoredNew = NULL;
109 if (sub->pszMonitored)
111 for (LPTSTR psz = sub->pszMonitored; *psz; psz += 1+lstrlen(psz))
113 if (lstrcmpi (psz, szLong) && lstrcmpi (psz, szShort))
115 FormatMultiString (&pszMonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), psz);
119 else if (sub->pszUnmonitored)
121 for (LPTSTR psz = sub->pszUnmonitored; *psz; psz += 1+lstrlen(psz))
123 if (lstrcmpi (psz, szLong) && lstrcmpi (psz, szShort))
125 FormatMultiString (&pszUnmonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), psz);
130 // Then ensure it shows up only where necessary.
132 if (sub->pszMonitored && fMonitor)
134 FormatMultiString (&pszMonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), szLong);
136 else if (!sub->pszMonitored && !fMonitor)
138 FormatMultiString (&pszUnmonitoredNew, TRUE, TEXT("%1"), TEXT("%s"), szLong);
141 if (sub->pszMonitored && !pszMonitoredNew)
143 pszMonitoredNew = AllocateString (2);
144 pszMonitoredNew[0] = TEXT('\0');
145 pszMonitoredNew[1] = TEXT('\0');
147 if (sub->pszUnmonitored && !pszUnmonitoredNew)
149 pszUnmonitoredNew = AllocateString (2);
150 pszUnmonitoredNew[0] = TEXT('\0');
151 pszUnmonitoredNew[1] = TEXT('\0');
154 // Finally, update the subset's members.
156 if (sub->pszMonitored)
157 FreeString (sub->pszMonitored);
158 if (sub->pszUnmonitored)
159 FreeString (sub->pszUnmonitored);
161 sub->pszMonitored = pszMonitoredNew;
162 sub->pszUnmonitored = pszUnmonitoredNew;
169 void ShowSubsetsDialog (void)
171 LPPROPSHEET psh = PropSheet_Create (IDS_SUBSET_TAB, FALSE);
172 psh->sh.hwndParent = g.hMain;
174 LPSUBSET sub = Subsets_CopySubset (g.sub);
175 PropSheet_AddTab (psh, 0, IDD_SUBSETS, (DLGPROC)Subsets_DlgProc, (LPARAM)sub, TRUE);
176 PropSheet_ShowModal (psh, PumpMessage);
180 BOOL CALLBACK Subsets_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
182 if (AfsAppLib_HandleHelp (IDD_SUBSETS, hDlg, msg, wp, lp))
185 if (msg == WM_INITDIALOG)
186 SetWindowLongPtr (hDlg, DWLP_USER, ((LPPROPSHEETPAGE)lp)->lParam);
188 LPSUBSET sub = (LPSUBSET)GetWindowLongPtr (hDlg, DWLP_USER);
192 case WM_INITDIALOG_SHEET:
193 PropCache_Add (pcGENERAL, NULL, hDlg);
196 case WM_DESTROY_SHEET:
197 PropCache_Delete (hDlg);
201 Subsets_OnInitDialog (hDlg, sub);
208 Subsets_OnApply (hDlg, sub);
213 EndDialog (hDlg, LOWORD(wp));
216 case IDC_SUBSET_LOAD:
218 subNew = Subsets_OnLoad (hDlg, sub);
222 Subsets_FreeSubset (sub);
223 SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)subNew);
227 case IDC_SUBSET_LIST:
228 if (HIWORD(wp) == LBN_CLICKED) // checked or unchecked?
230 int iSel = LB_GetSelected (GetDlgItem (hDlg, IDC_SUBSET_LIST));
231 subNew = Subsets_OnCheck (hDlg, iSel, sub);
232 if (subNew && (subNew != sub))
235 Subsets_FreeSubset (sub);
236 SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)subNew);
241 case IDC_SUBSET_SAVE:
242 Subsets_OnSave (hDlg, sub);
246 case IDC_SUBSET_NONE:
247 subNew = Subsets_OnCheckAll (hDlg, sub, (LOWORD(wp) == IDC_SUBSET_ALL) ? TRUE : FALSE);
248 if (subNew && (subNew != sub))
251 Subsets_FreeSubset (sub);
252 SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)subNew);
263 void Subsets_OnInitDialog (HWND hDlg, LPSUBSET sub)
265 Subsets_SetName (hDlg, sub);
266 Subsets_PutSubsetOnDialog (hDlg, sub);
270 void Subsets_SetName (HWND hDlg, LPSUBSET sub)
274 BOOL fIsOneServer = FALSE;
275 if (sub && sub->pszMonitored && *(sub->pszMonitored))
277 LPTSTR pszNext = &sub->pszMonitored[ 1+lstrlen(sub->pszMonitored) ];
282 if (sub && sub->szSubset[0])
285 pszText = FormatString (IDS_SUBSET_CHANGED, TEXT("%s"), sub->szSubset);
287 pszText = FormatString (TEXT("%1"), TEXT("%s"), sub->szSubset);
289 else if (fIsOneServer)
291 pszText = FormatString (IDS_SUBSET_SERVERSUBSET, TEXT("%s"), sub->pszMonitored);
293 else if (sub) // && !sub->szSubset[0]
296 pszText = FormatString (IDS_SUBSET_CHANGED, TEXT("%m"), IDS_SUBSET_NONAME);
298 pszText = FormatString (TEXT("%1"), TEXT("%m"), IDS_SUBSET_NONAME);
300 else // no current subset specified
302 pszText = FormatString (TEXT("%1"), TEXT("%m"), IDS_SUBSET_NOSUBSET);
305 SetDlgItemText (hDlg, IDC_SUBSET_NAME, pszText);
306 FreeString (pszText);
310 void Subsets_PutSubsetOnDialog (HWND hDlg, LPSUBSET sub)
312 LPSUBSET_TO_LIST_PACKET lpp = New (SUBSET_TO_LIST_PACKET);
313 memset (lpp, 0x00, sizeof(SUBSET_TO_LIST_PACKET));
315 lpp->hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
316 lpp->sub = Subsets_CopySubset (sub);
318 StartTask (taskSUBSET_TO_LIST, NULL, lpp);
322 void Subsets_GetSubsetFromDialog (HWND hDlg, LPSUBSET sub)
324 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
326 if (sub->pszMonitored)
328 FreeString (sub->pszMonitored);
329 sub->pszMonitored = NULL;
331 if (sub->pszUnmonitored)
333 FreeString (sub->pszUnmonitored);
334 sub->pszUnmonitored = NULL;
337 // Is there only one server box checked?
339 int iiMax = (int) SendMessage (hList, LB_GETCOUNT, 0, 0);
343 for (int ii = 0; ii < iiMax; ++ii)
345 if (LB_GetCheck (hList, ii))
348 if ((++cChecked) > 1)
352 if (cChecked == 1) // Only one is checked--use pszMonitored.
354 TCHAR szServer[ cchNAME ];
355 SendMessage (hList, LB_GETTEXT, iiChecked, (LPARAM)szServer);
356 FormatMultiString (&sub->pszMonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer);
358 else // Use pszUnmonitored.
360 for (int ii = 0; ii < iiMax; ++ii)
362 if (!LB_GetCheck (hList, ii))
364 TCHAR szServer[ cchNAME ];
365 SendMessage (hList, LB_GETTEXT, ii, (LPARAM)szServer);
366 FormatMultiString (&sub->pszUnmonitored, TRUE, TEXT("%1"), TEXT("%s"), szServer);
373 LPSUBSET Subsets_OnCheck (HWND hDlg, int iSel, LPSUBSET subOld)
375 LPSUBSET sub = subOld;
376 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
378 if (!LB_GetCheck (hList, iSel)) // unchecked?
383 memset (sub, 0x00, sizeof(SUBSET));
389 sub->fModified = TRUE;
390 Subsets_GetSubsetFromDialog (hDlg, sub);
391 Subsets_SetName (hDlg, sub);
392 PropSheetChanged (hDlg);
399 LPSUBSET Subsets_OnCheckAll (HWND hDlg, LPSUBSET subOld, BOOL fCheck)
401 LPSUBSET sub = subOld;
402 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
404 if (!fCheck) // unchecking things?
409 memset (sub, 0x00, sizeof(SUBSET));
413 int iiMax = (int) SendMessage (hList, LB_GETCOUNT, 0, 0);
415 for (int ii = 0; ii < iiMax; ++ii)
417 if (LB_GetCheck (hList, ii) != fCheck)
419 LB_SetCheck (hList, ii, fCheck);
425 sub->fModified = TRUE;
426 Subsets_GetSubsetFromDialog (hDlg, sub);
427 Subsets_SetName (hDlg, sub);
428 PropSheetChanged (hDlg);
435 LPSUBSET Subsets_OnLoad (HWND hDlg, LPSUBSET subOld)
437 LPSUBSET subNew = NULL;
439 TCHAR szSubset[ cchNAME ] = TEXT("");
441 lstrcpy (szSubset, subOld->szSubset);
443 if (Subsets_GetLoadName (hDlg, szSubset))
445 if ((subNew = Subsets_LoadSubset (NULL, szSubset)) != NULL)
447 Subsets_SetName (hDlg, subNew);
448 Subsets_PutSubsetOnDialog (hDlg, subNew);
449 PropSheetChanged (hDlg);
457 void Subsets_OnSave (HWND hDlg, LPSUBSET sub)
461 TCHAR szSubset[ cchNAME ];
462 lstrcpy (szSubset, sub->szSubset);
464 if (Subsets_GetSaveName (hDlg, szSubset))
466 Subsets_GetSubsetFromDialog (hDlg, sub);
468 if (Subsets_SaveSubset (NULL, szSubset, sub))
470 lstrcpy (sub->szSubset, szSubset);
471 sub->fModified = FALSE;
473 Subsets_SetName (hDlg, sub);
480 void Subsets_OnApply (HWND hDlg, LPSUBSET sub)
483 if ((subCopy = Subsets_CopySubset (sub, TRUE)) != NULL)
485 Subsets_GetSubsetFromDialog (hDlg, subCopy);
488 LPSUBSET subOld = g.sub;
491 Subsets_FreeSubset (subOld);
493 StartTask (taskAPPLY_SUBSET, NULL, sub);
497 BOOL Subsets_SaveIfDirty (LPSUBSET sub)
499 if (!sub || !sub->fModified)
503 rc = Message (MB_YESNOCANCEL | MB_ICONQUESTION, IDS_SUBSET_DISCARD_TITLE, IDS_SUBSET_DISCARD_DESC);
507 sub->fModified = FALSE;
508 sub->szSubset[0] = TEXT('\0');
510 else if (rc == IDYES)
512 TCHAR szSubset[ cchNAME ];
513 lstrcpy (szSubset, sub->szSubset);
515 if (!Subsets_GetSaveName (g.hMain, szSubset))
518 if (!Subsets_SaveSubset (NULL, szSubset, sub))
521 sub->fModified = FALSE;
522 lstrcpy (sub->szSubset, szSubset);
524 else // (rc == IDCANCEL)
533 BOOL Subsets_EnumSubsets (LPTSTR pszCell, size_t iIndex, LPTSTR pszSubset)
538 if ((hk = OpenSubsetsKey (pszCell, FALSE)) != NULL)
540 if (RegEnumKey (hk, (DWORD)iIndex, pszSubset, cchNAME) == 0)
550 BOOL Subsets_SaveSubset (LPTSTR pszCell, LPTSTR pszSubset, LPSUBSET sub)
554 if (sub && pszSubset && *pszSubset)
557 if ((hk = OpenSubsetsSubKey (pszCell, pszSubset, TRUE)) != NULL)
559 DWORD dwMonitored = (sub->pszMonitored) ? 1 : 0;
560 RegSetValueEx (hk, REGVAL_INCLUSIVE, 0, REG_DWORD, (LPBYTE)&dwMonitored, sizeof(DWORD));
562 for (LPTSTR psz = (sub->pszMonitored) ? sub->pszMonitored : sub->pszUnmonitored;
564 psz += 1+lstrlen(psz))
566 RegSetValueEx (hk, psz, 0, REG_SZ, (PBYTE)TEXT("X"), sizeof(TCHAR)*2);
579 LPSUBSET Subsets_LoadSubset (LPTSTR pszCell, LPTSTR pszSubset)
584 if ((hk = OpenSubsetsSubKey (pszCell, pszSubset, FALSE)) != NULL)
589 dwSize = sizeof(dwMonitored);
590 if (RegQueryValueEx (hk, REGVAL_INCLUSIVE, 0, &dwType, (LPBYTE)&dwMonitored, &dwSize) == 0)
593 memset (sub, 0x00, sizeof(SUBSET));
594 lstrcpy (sub->szSubset, pszSubset);
595 sub->fModified = FALSE;
598 ppsz = (dwMonitored) ? &sub->pszMonitored : &sub->pszUnmonitored;
600 for (size_t iIndex = 0; ; ++iIndex)
602 TCHAR szServer[ cchNAME ];
603 dwSize = sizeof(szServer);
605 if (RegEnumValue (hk, (DWORD)iIndex, szServer, &dwSize, 0, NULL, NULL, NULL) != 0)
608 if (szServer[0] && lstrcmpi (szServer, REGVAL_INCLUSIVE))
609 FormatMultiString (ppsz, FALSE, TEXT("%1"), TEXT("%s"), szServer);
612 if (dwMonitored && !sub->pszMonitored)
614 sub->pszMonitored = AllocateString(2);
615 sub->pszMonitored[0] = TEXT('\0');
616 sub->pszMonitored[1] = TEXT('\0');
627 LPSUBSET Subsets_CopySubset (LPSUBSET sub, BOOL fCreateIfNULL)
629 LPSUBSET subCopy = NULL;
633 subCopy = New (SUBSET);
634 memset (subCopy, 0x00, sizeof(SUBSET));
635 lstrcpy (subCopy->szSubset, sub->szSubset);
636 subCopy->fModified = sub->fModified;
639 if (sub->pszMonitored)
642 for (LPTSTR psz = sub->pszMonitored; *psz; psz += 1+lstrlen(psz))
643 cch += 1+lstrlen(psz);
644 subCopy->pszMonitored = AllocateString (cch);
645 memcpy (subCopy->pszMonitored, sub->pszMonitored, sizeof(TCHAR)*cch);
648 if (sub->pszUnmonitored)
651 for (LPTSTR psz = sub->pszUnmonitored; *psz; psz += 1+lstrlen(psz))
652 cch += 1+lstrlen(psz);
653 subCopy->pszUnmonitored = AllocateString (cch);
654 memcpy (subCopy->pszUnmonitored, sub->pszUnmonitored, sizeof(TCHAR)*cch);
657 else if (fCreateIfNULL)
659 subCopy = New (SUBSET);
660 memset (subCopy, 0x00, sizeof(SUBSET));
667 void Subsets_FreeSubset (LPSUBSET sub)
671 if (sub->pszMonitored)
672 FreeString (sub->pszMonitored);
673 if (sub->pszUnmonitored)
674 FreeString (sub->pszUnmonitored);
682 * SUBSET OPEN/SAVE DIALOG ____________________________________________________
689 TCHAR szCell[ cchNAME ];
690 TCHAR szSubset[ cchNAME ];
691 } SUBSET_OPENSAVE_PARAMS, *LPSUBSET_OPENSAVE_PARAMS;
693 BOOL CALLBACK Subsets_OpenSave_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
694 void Subsets_OpenSave_OnInitDialog (HWND hDlg, LPSUBSET_OPENSAVE_PARAMS lpp);
695 void Subsets_OpenSave_OnSelect (HWND hDlg);
696 void Subsets_OpenSave_Populate (HWND hDlg);
697 void Subsets_OpenSave_OnDelete (HWND hDlg);
698 void Subsets_OpenSave_OnRename (HWND hDlg);
701 BOOL Subsets_GetLoadName (HWND hParent, LPTSTR pszSubset)
703 SUBSET_OPENSAVE_PARAMS lpp;
705 lpp.szCell[0] = TEXT('\0');
706 lstrcpy (lpp.szSubset, pszSubset);
709 g.lpiCell->GetCellName (lpp.szCell);
711 INT_PTR rc = ModalDialogParam (IDD_SUBSET_LOADSAVE,
712 hParent, (DLGPROC)Subsets_OpenSave_DlgProc,
717 lstrcpy (pszSubset, lpp.szSubset);
720 return (rc == IDOK) ? TRUE : FALSE;
724 BOOL Subsets_GetSaveName (HWND hParent, LPTSTR pszSubset)
726 SUBSET_OPENSAVE_PARAMS lpp;
728 lpp.szCell[0] = TEXT('\0');
729 lstrcpy (lpp.szSubset, pszSubset);
732 g.lpiCell->GetCellName (lpp.szCell);
734 INT_PTR rc = ModalDialogParam (IDD_SUBSET_LOADSAVE,
735 hParent, (DLGPROC)Subsets_OpenSave_DlgProc,
740 lstrcpy (pszSubset, lpp.szSubset);
743 return (rc == IDOK) ? TRUE : FALSE;
747 BOOL CALLBACK Subsets_OpenSave_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
749 static BOOL fEditing = FALSE;
751 if (msg == WM_INITDIALOG)
752 SetWindowLongPtr (hDlg, DWLP_USER, lp);
754 LPSUBSET_OPENSAVE_PARAMS lpp;
755 if ((lpp = (LPSUBSET_OPENSAVE_PARAMS)GetWindowLongPtr (hDlg, DWLP_USER)) != NULL)
761 Subsets_OpenSave_OnInitDialog (hDlg, lpp);
770 EndDialog (hDlg, IDCANCEL);
774 GetDlgItemText (hDlg, IDC_SUBSET_NAME, lpp->szSubset, cchNAME);
775 if (lpp->szSubset[0] != TEXT('\0'))
782 if ((hk = OpenSubsetsSubKey (NULL, lpp->szSubset, FALSE)) != NULL)
786 int rc = Message (MB_YESNO | MB_ICONASTERISK, IDS_SUBSET_SAVE_TITLE, IDS_SUBSET_SAVE_DESC, TEXT("%s"), lpp->szSubset);
793 EndDialog (hDlg, IDOK);
797 case IDC_SUBSET_DELETE:
798 Subsets_OpenSave_OnDelete (hDlg);
801 case IDC_SUBSET_RENAME:
802 Subsets_OpenSave_OnRename (hDlg);
809 switch (((LPNMHDR)lp)->code)
811 case LVN_ITEMCHANGED:
814 if ( ((LPNM_LISTVIEW)lp)->uNewState & LVIS_SELECTED )
815 Subsets_OpenSave_OnSelect (hDlg);
822 if (((LPNMHDR)lp)->hwndFrom == GetDlgItem (hDlg, IDC_SUBSET_LIST))
824 Subsets_OpenSave_OnSelect (hDlg);
825 PostMessage (hDlg, WM_COMMAND, IDOK, 0);
830 case LVN_BEGINLABELEDIT:
832 return FALSE; // okay to edit label
834 case LVN_ENDLABELEDIT:
836 if ((plvdi = (LV_DISPINFO*)lp) != NULL)
838 if ((plvdi->item.iItem != -1) &&
839 (plvdi->item.pszText != NULL))
841 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
842 TCHAR szOldName[ cchNAME ];
843 LV_GetItemText (hList, plvdi->item.iItem, 0, szOldName);
845 if (lstrcmpi (szOldName, plvdi->item.pszText))
848 BOOL fRepopulate = FALSE;
851 if ((hk = OpenSubsetsSubKey (NULL, plvdi->item.pszText, FALSE)) != NULL)
855 int rc = Message (MB_YESNO | MB_ICONASTERISK, IDS_SUBSET_SAVE_TITLE, IDS_SUBSET_SAVE_DESC, TEXT("%s"), lpp->szSubset);
865 if ((subRename = Subsets_LoadSubset (NULL, szOldName)) != NULL)
867 if (Subsets_SaveSubset (NULL, plvdi->item.pszText, subRename))
869 (void)OpenSubsetsSubKey (NULL, szOldName, 2); // 0=open,1=create,2=delete
872 Subsets_OpenSave_Populate (hDlg);
875 LV_SetItemText (hList, plvdi->item.iItem, 0, plvdi->item.pszText);
876 Subsets_OpenSave_OnSelect (hDlg);
879 Subsets_FreeSubset (subRename);
898 void Subsets_OpenSave_OnInitDialog (HWND hDlg, LPSUBSET_OPENSAVE_PARAMS lpp)
900 // Fix the buttons in the toolbar, so that they looks pretty
902 HWND hButton = GetDlgItem (hDlg, IDC_SUBSET_DELETE);
903 HICON hi = TaLocale_LoadIcon (IDI_BTN_DELETE);
904 SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi);
906 hButton = GetDlgItem (hDlg, IDC_SUBSET_RENAME);
907 hi = TaLocale_LoadIcon (IDI_BTN_RENAME);
908 SendMessage (hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hi);
910 // Set up an ImageList so we'll have icons in the ListView
912 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
913 HIMAGELIST hil = ImageList_Create (16, 16, ILC_COLOR4 | ILC_MASK, 1, 1);
915 hi = TaLocale_LoadIcon (IDI_SUBSET);
916 ImageList_AddIcon (hil, hi);
918 ListView_SetImageList (hList, hil, LVSIL_SMALL);
920 // Then populate the ListView with the names of the subsets
921 // defined for this cell
923 Subsets_OpenSave_Populate (hDlg);
924 // Finally, fill in the rest of the dialog.
926 SetDlgItemText (hDlg, IDC_SUBSET_NAME, lpp->szSubset);
928 TCHAR szText[ cchRESOURCE ];
929 GetString (szText, (lpp->fOpen) ? IDS_SUBSET_TITLE_LOAD : IDS_SUBSET_TITLE_SAVE);
930 SetWindowText (hDlg, szText);
932 GetString (szText, (lpp->fOpen) ? IDS_BUTTON_OPEN : IDS_BUTTON_SAVE);
933 SetDlgItemText (hDlg, IDOK, szText);
937 void Subsets_OpenSave_Populate (HWND hDlg)
939 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
940 LV_StartChange (hList, TRUE);
942 TCHAR szSubset[ cchNAME ];
943 for (size_t iIndex = 0; Subsets_EnumSubsets (NULL, iIndex, szSubset); ++iIndex)
945 LV_AddItem (hList, 1, 0, 0, 0, szSubset);
948 LV_EndChange (hList);
952 void Subsets_OpenSave_OnSelect (HWND hDlg)
954 TCHAR szSubset[ cchNAME ];
956 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
957 short idxSelected = LV_GetSelected (hList);
959 if (idxSelected == -1)
960 szSubset[0] = TEXT('\0');
962 LV_GetItemText (hList, idxSelected, 0, szSubset);
964 SetDlgItemText (hDlg, IDC_SUBSET_NAME, szSubset);
968 void Subsets_OpenSave_OnDelete (HWND hDlg)
970 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
971 short idxSelected = LV_GetSelected (hList);
973 if (idxSelected != -1)
975 TCHAR szSubset[ cchNAME ];
976 LV_GetItemText (hList, idxSelected, 0, szSubset);
978 if (Message (MB_ICONASTERISK | MB_YESNO, IDS_SUBSET_DELETE_TITLE, IDS_SUBSET_DELETE_DESC, TEXT("%s"), szSubset) == IDYES)
980 (void)OpenSubsetsSubKey (NULL, szSubset, 2); // 0=open,1=create,2=delete
981 Subsets_OpenSave_Populate (hDlg);
987 void Subsets_OpenSave_OnRename (HWND hDlg)
989 HWND hList = GetDlgItem (hDlg, IDC_SUBSET_LIST);
990 short idxSelected = LV_GetSelected (hList);
992 if (idxSelected != -1)
995 ListView_EditLabel (hList, idxSelected);