[USETUP] Loop over MUI entries of the same ID
[reactos.git] / dll / shellext / acppage / CEditCompatModes.cpp
1 /*
2 * PROJECT: ReactOS Compatibility Layer Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: CEditCompatModes implementation
5 * COPYRIGHT: Copyright 2015-2019 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8 #include "precomp.h"
9 #include <windowsx.h>
10
11
12 class CEditCompatModes : public CDialogImpl<CEditCompatModes>
13 {
14 private:
15 CLayerUIPropPage* m_pPage;
16 HWND m_hListAdd;
17 HWND m_hListActive;
18
19 CStringW GetListText(HWND ListBox, int Cur)
20 {
21 CStringW Str;
22 int Length = ListBox_GetTextLen(ListBox, Cur);
23 LPWSTR Buffer = Str.GetBuffer(Length + 1);
24 ListBox_GetText(ListBox, Cur, Buffer);
25 Str.ReleaseBuffer(Length);
26 return Str;
27 }
28
29 public:
30 CEditCompatModes(CLayerUIPropPage* page)
31 : m_pPage(page)
32 {
33 m_pPage->AddRef();
34 }
35
36 ~CEditCompatModes()
37 {
38 m_pPage->Release();
39 }
40
41 LRESULT OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
42 {
43 CenterWindow(GetParent());
44
45 m_hListActive = GetDlgItem(IDC_COMPATIBILITYMODE);
46 m_hListAdd = GetDlgItem(IDC_NEWCOMPATIBILITYMODE);
47
48 CComObject<CLayerStringList> pList;
49
50 while (TRUE)
51 {
52 CComHeapPtr<OLECHAR> str;
53 HRESULT hr = pList.Next(1, &str, NULL);
54 if (hr != S_OK)
55 break;
56 ListBox_AddString(m_hListAdd, str);
57 }
58
59 for (int n = 0; n < m_pPage->m_CustomLayers.GetSize(); ++n)
60 {
61 const WCHAR* Str = m_pPage->m_CustomLayers[n].GetString();
62 int Index = ListBox_FindStringExact(m_hListActive, -1, Str);
63 if (Index == LB_ERR)
64 Index = ListBox_AddString(m_hListActive, Str);
65 }
66
67 OnListboxUpdated(0, 0, 0, bHandled);
68 return 0;
69 }
70
71 LRESULT OnButton(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
72 {
73 if (wID == IDOK)
74 {
75 int Count = ListBox_GetCount(m_hListActive);
76 m_pPage->m_CustomLayers.RemoveAll();
77 for (int Cur = 0; Cur < Count; ++Cur)
78 {
79 CString Str = GetListText(m_hListActive, Cur);
80 m_pPage->m_CustomLayers.Add(Str);
81 }
82 }
83 EndDialog(wID);
84 return 0;
85 }
86
87 LRESULT OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
88 {
89 int Sel = ListBox_GetCurSel(m_hListAdd);
90 CStringW Str = GetListText(m_hListAdd, Sel);
91
92 int Index = ListBox_FindStringExact(m_hListActive, -1, Str);
93 if (Index == LB_ERR)
94 Index = ListBox_AddString(m_hListActive, Str);
95
96 ::SetFocus(m_hListAdd);
97 return 0;
98 }
99
100 LRESULT OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
101 {
102 int Sel = ListBox_GetCurSel(m_hListActive);
103 CStringW Str = GetListText(m_hListActive, Sel);
104
105 ListBox_DeleteString(m_hListActive, Sel);
106 int Index = ListBox_FindStringExact(m_hListAdd, -1, Str);
107 if (Index != LB_ERR)
108 Index = ListBox_SetCurSel(m_hListAdd, Index);
109 OnListboxUpdated(wNotifyCode, wID, hWndCtl, bHandled);
110 return 0;
111 }
112
113 LRESULT OnRemoveAll(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
114 {
115 ListBox_ResetContent(m_hListActive);
116 OnListboxUpdated(wNotifyCode, wID, hWndCtl, bHandled);
117 return 0;
118 }
119
120 LRESULT OnListboxUpdated(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
121 {
122 if (m_hListAdd == hWndCtl)
123 ListBox_SetCurSel(m_hListActive, -1);
124 else if (m_hListActive == hWndCtl)
125 ListBox_SetCurSel(m_hListAdd, -1);
126
127 ::EnableWindow(GetDlgItem(IDC_ADD), ListBox_GetCurSel(m_hListAdd) >= 0);
128 ::EnableWindow(GetDlgItem(IDC_REMOVE), ListBox_GetCurSel(m_hListActive) >= 0);
129 ::EnableWindow(GetDlgItem(IDC_REMOVEALL), ListBox_GetCount(m_hListActive) > 0);
130 bHandled = TRUE;
131 return 0;
132 }
133
134 public:
135 enum { IDD = IDD_EDITCOMPATIBILITYMODES };
136
137 BEGIN_MSG_MAP(CEditCompatModes)
138 MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
139 COMMAND_ID_HANDLER(IDC_ADD, OnAdd)
140 COMMAND_ID_HANDLER(IDC_REMOVE, OnRemove)
141 COMMAND_ID_HANDLER(IDC_REMOVEALL, OnRemoveAll)
142
143 COMMAND_ID_HANDLER(IDOK, OnButton)
144 COMMAND_ID_HANDLER(IDCANCEL, OnButton)
145 COMMAND_ID_HANDLER(IDC_COMPATIBILITYMODE, OnListboxUpdated)
146 COMMAND_ID_HANDLER(IDC_NEWCOMPATIBILITYMODE, OnListboxUpdated)
147 END_MSG_MAP()
148 };
149
150
151 BOOL ShowEditCompatModes(HWND hWnd, CLayerUIPropPage* page)
152 {
153 CEditCompatModes modes(page);
154 INT_PTR Result = modes.DoModal(hWnd);
155 return Result == IDOK;
156 }
157
158