OSDN Git Service

Rewrite code to handle titles and names of applications in CProfile
[xkeymacs/xkeymacs.git] / xkeymacs / properties.cpp
1 // Properties.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "xkeymacs.h"\r
6 #include "Profile.h"\r
7 #include "Properties.h"\r
8 \r
9 #ifdef _DEBUG\r
10 #define new DEBUG_NEW\r
11 #undef THIS_FILE\r
12 static char THIS_FILE[] = __FILE__;\r
13 #endif\r
14 \r
15 /////////////////////////////////////////////////////////////////////////////\r
16 // CProperties dialog\r
17 \r
18 \r
19 CProperties::CProperties(CWnd* pParent /*=NULL*/)\r
20         : CDialog(CProperties::IDD, pParent)\r
21 {\r
22         m_nAppID = 0;\r
23         //{{AFX_DATA_INIT(CProperties)\r
24         m_nSettingStyle = -1;\r
25         m_nKillRingMax = 0;\r
26         //}}AFX_DATA_INIT\r
27 }\r
28 \r
29 \r
30 void CProperties::DoDataExchange(CDataExchange* pDX)\r
31 {\r
32         CDialog::DoDataExchange(pDX);\r
33         //{{AFX_DATA_MAP(CProperties)\r
34         DDX_Control(pDX, IDC_WINDOW_TEXT, m_cWindowText);\r
35         DDX_Control(pDX, IDC_KILL_RING_MAX, m_cKillRingMax);\r
36         DDX_Control(pDX, IDC_USE_DIALOG_SETTING, m_cUseDialogSetting);\r
37         DDX_Control(pDX, IDC_SELECT_ALL, m_cSelectAll);\r
38         DDX_Control(pDX, IDC_CLEAR_ALL, m_cClearAll);\r
39         DDX_Control(pDX, IDC_LOAD_DEFAULT, m_cLoadDefault);\r
40         DDX_Control(pDX, IDC_APPLICATION, m_cAppList);\r
41         DDX_Radio(pDX, IDC_SETTING_DEFAULT, m_nSettingStyle);\r
42         DDX_Text(pDX, IDC_KILL_RING_MAX, m_nKillRingMax);\r
43         DDV_MinMaxInt(pDX, m_nKillRingMax, 0, 2147483647);\r
44         //}}AFX_DATA_MAP\r
45 }\r
46 \r
47 \r
48 BEGIN_MESSAGE_MAP(CProperties, CDialog)\r
49         //{{AFX_MSG_MAP(CProperties)\r
50         ON_CBN_DROPDOWN(IDC_APPLICATION, OnDropdownApplication)\r
51         ON_CBN_SELCHANGE(IDC_APPLICATION, OnSelchangeApplication)\r
52         ON_BN_CLICKED(IDC_APPLY, OnApply)\r
53         ON_BN_CLICKED(IDC_LOAD_DEFAULT, OnLoadDefault)\r
54         ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)\r
55         ON_BN_CLICKED(IDC_CLEAR_ALL, OnClearAll)\r
56         ON_BN_CLICKED(IDC_SETTING_DEFAULT, OnSettingDefault)\r
57         ON_BN_CLICKED(IDC_SETTING_DISABLE, OnSettingDisable)\r
58         ON_BN_CLICKED(IDC_SETTING_SPECIFIC, OnSettingSpecific)\r
59         //}}AFX_MSG_MAP\r
60 END_MESSAGE_MAP()\r
61 \r
62 /////////////////////////////////////////////////////////////////////////////\r
63 // CProperties message handlers\r
64 \r
65 BOOL CProperties::OnInitDialog() \r
66 {\r
67         CDialog::OnInitDialog();\r
68         \r
69         while (m_sheet.GetPageCount()) {\r
70                 m_sheet.RemovePage(0);\r
71         }\r
72 \r
73         m_sheet.AddPage(&m_basic);\r
74         m_sheet.AddPage(&m_advanced);\r
75         m_sheet.AddPage(&m_list);\r
76 \r
77         m_sheet.Create(this, WS_CHILD | WS_VISIBLE, 0);\r
78         m_sheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT);\r
79         m_sheet.ModifyStyle( 0, WS_TABSTOP );\r
80 \r
81         CRect rcSheet;\r
82         GetDlgItem(IDC_TAB)->GetWindowRect(&rcSheet);\r
83         ScreenToClient(&rcSheet);\r
84         m_sheet.SetWindowPos(NULL, rcSheet.left - 11, rcSheet.top - 8, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);\r
85 \r
86         SetForegroundWindow();\r
87 \r
88         InitAppList();\r
89 \r
90         CProfile::LoadData();\r
91         m_appName.LoadString(IDS_DEFAULT);\r
92         SetDialogData();\r
93         EnableUseDefaultButton(FALSE);\r
94         EnableLoadDefaultButton(FALSE);\r
95 \r
96         EnableControl(BASIC_TAB);\r
97 \r
98         return TRUE;  // return TRUE unless you set the focus to a control\r
99                       // EXCEPTION: OCX Property Pages should return FALSE\r
100 }\r
101 \r
102 void CProperties::OnDropdownApplication() \r
103 {\r
104         InitAppList();\r
105         int i;\r
106         for (i = 0; i < m_cAppList.GetCount(); ++i) {\r
107                 CString appTitle, appName;\r
108                 GetAppTitleAndName(i, appTitle, appName);\r
109                 if (m_appName == appName)\r
110                         m_cAppList.SetCurSel(i);\r
111         }\r
112         if (i == m_cAppList.GetCount()) {\r
113                 m_appTitle.LoadString(IDS_DEFAULT_TITLE);\r
114                 m_cAppList.SelectString(-1, m_appTitle);\r
115                 SetDialogData();\r
116         }\r
117 }\r
118 \r
119 void CProperties::OnSelchangeApplication() \r
120 {\r
121         GetAppTitleAndName(m_cAppList.GetCurSel(), m_appTitle, m_appName);\r
122         SetDialogData();\r
123         EnableControl(ACTIVE_TAB);\r
124 }\r
125 \r
126 void CProperties::InitAppList()\r
127 {\r
128         m_cAppList.ResetContent();\r
129         CProfile::InitAppList(*this);\r
130         // Add Dialog\r
131         m_cAppList.InsertString(0, CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE)));\r
132         // Add Default\r
133         m_cAppList.InsertString( 0, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
134         m_cAppList.SelectString(-1, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
135 }\r
136 \r
137 void CProperties::GetDialogData()\r
138 {\r
139         UpdateData();\r
140         if (m_nSettingStyle == SETTING_DEFAULT) {\r
141                 CProfile::ClearData(m_appName);\r
142                 return;\r
143         }\r
144         m_nAppID = CProfile::AssignAppID(m_appName);\r
145         CProfile::SetSettingStyle(m_nAppID, m_nSettingStyle);\r
146         CProfile::SetAppTitle(m_nAppID, m_appTitle);\r
147         CProfile::SetKillRingMax(m_nAppID, m_nKillRingMax);\r
148         CProfile::SetUseDialogSetting(m_nAppID, m_cUseDialogSetting.GetCheck() == BST_CHECKED);\r
149         CString szWindowText;\r
150         m_cWindowText.GetWindowText(szWindowText);\r
151         CProfile::SetWindowText(m_nAppID, szWindowText);\r
152 \r
153         if (m_sheet.GetActivePage() == &m_basic) // FIXME\r
154                 m_basic.GetDialogData();\r
155         else if (m_sheet.GetActivePage() == &m_advanced)\r
156                 m_advanced.GetDialogData();\r
157         else if (m_sheet.GetActivePage() ==  &m_list)\r
158                 m_list.GetDialogData();\r
159 }\r
160 \r
161 void CProperties::SetDialogData()\r
162 {\r
163         m_nAppID = CProfile::GetAppID(m_appName);\r
164         m_nSettingStyle = CProfile::GetSettingStyle(m_nAppID);\r
165         if (m_nAppID == MAX_APP)\r
166                 m_nAppID = CProfile::DefaultAppID(); // fall back to the default\r
167         EnableUseDefaultButton(m_appName != CString(MAKEINTRESOURCE(IDS_DEFAULT)) &&\r
168                                                         m_appName != CString(MAKEINTRESOURCE(IDS_DIALOG)));\r
169         m_nKillRingMax = CProfile::GetKillRingMax(m_nAppID);\r
170         m_cUseDialogSetting.SetCheck(CProfile::GetUseDialogSetting(m_nAppID) ? BST_CHECKED : BST_UNCHECKED);\r
171         m_cWindowText.SetWindowText(CProfile::GetWindowText(m_nAppID));\r
172         UpdateData(FALSE);\r
173 \r
174         if (m_sheet.GetActivePage() == &m_basic) // FIXME\r
175                 m_basic.SetDialogData();\r
176         else if (m_sheet.GetActivePage() == &m_advanced)\r
177                 m_advanced.SetDialogData();\r
178         else if (m_sheet.GetActivePage() ==  &m_list)\r
179                 m_list.SetDialogData();\r
180 }\r
181 \r
182 void CProperties::AddItem(const CString& appTitle, const CString& appName)\r
183 {\r
184         for (int i = 0; i < m_cAppList.GetCount(); ++i) {\r
185                 CString tmpTitle, tmpName;\r
186                 GetAppTitleAndName(i, tmpTitle, tmpName);\r
187                 if (appName == tmpName)\r
188                         return;\r
189         }\r
190         CString item;\r
191         item.Format(IDS_APPLICATION_LIST_ITEM, appTitle, appName);\r
192         m_cAppList.AddString(item);\r
193 }\r
194 \r
195 void CProperties::GetAppTitleAndName(const int nSel, CString& appTitle, CString& appName)\r
196 {\r
197         appTitle.Empty();\r
198         appName.Empty();\r
199         CString item;\r
200         if (nSel < 0)\r
201                 m_cAppList.GetWindowText(item);\r
202         else\r
203                 m_cAppList.GetLBText(nSel, item);\r
204 \r
205         if (item == CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE))) {\r
206                 appName.LoadString(IDS_DEFAULT);\r
207                 return;\r
208         }\r
209         if (item == CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE))) {\r
210                 appName.LoadString(IDS_DIALOG);\r
211                 return;\r
212         }\r
213         int nParen = item.ReverseFind(_T('('));\r
214         if (nParen < 0)\r
215                 return;\r
216         appTitle = item.Left(nParen);\r
217         appName = item.Mid(nParen + 1, item.GetLength() - nParen -2);\r
218 }\r
219 \r
220 void CProperties::EnableControl(TAB_NAME tab)\r
221 {\r
222         if (tab & ACTIVE_TAB) {\r
223                 if (m_sheet.GetActivePage() == &m_basic) {      // FIXME\r
224                         tab = BASIC_TAB;\r
225                 } else if (m_sheet.GetActivePage() == &m_advanced) {\r
226                         tab = ADVANCED_TAB;\r
227                 } else if (m_sheet.GetActivePage() == &m_list) {\r
228                         tab = LIST_TAB;\r
229                 }\r
230         }\r
231 \r
232         BOOL bEnable = (m_nSettingStyle == SETTING_SPECIFIC);\r
233 \r
234         m_cKillRingMax.EnableWindow(bEnable);\r
235         EnableLoadDefaultButton(bEnable);\r
236 \r
237         m_cSelectAll.EnableWindow(bEnable && tab & BASIC_TAB);\r
238         m_cClearAll.EnableWindow(bEnable && tab & BASIC_TAB);\r
239 \r
240         EnableUseDialogSettingButton(bEnable);\r
241 \r
242         m_cWindowText.EnableWindow(bEnable);\r
243 \r
244         if (tab & BASIC_TAB) {\r
245                 m_basic.EnableControl();\r
246         }\r
247         if (tab & ADVANCED_TAB) {\r
248                 m_advanced.EnableControl();\r
249         }\r
250         if (tab & LIST_TAB) {\r
251                 m_list.EnableControl();\r
252         }\r
253 }\r
254 \r
255 void CProperties::EnableUseDialogSettingButton(BOOL bEnable)\r
256 {\r
257         m_cUseDialogSetting.EnableWindow(bEnable);\r
258         if (m_appName == CString(MAKEINTRESOURCE(IDS_DIALOG)))\r
259                 m_cUseDialogSetting.EnableWindow(FALSE);\r
260 }\r
261 \r
262 void CProperties::EnableLoadDefaultButton(BOOL bEnable)\r
263 {\r
264         m_cLoadDefault.EnableWindow(bEnable);\r
265         if (m_appName == CString(MAKEINTRESOURCE(IDS_DEFAULT)))\r
266                 m_cLoadDefault.EnableWindow(FALSE);\r
267 }\r
268 \r
269 void CProperties::EnableUseDefaultButton(BOOL bEnable)\r
270 {\r
271         if (GetDlgItem(IDC_SETTING_DEFAULT)) {\r
272                 GetDlgItem(IDC_SETTING_DEFAULT)->EnableWindow(bEnable);\r
273         }\r
274 }\r
275 \r
276 void CProperties::OnOK() \r
277 {\r
278         OnApply();\r
279 \r
280         CDialog::OnOK();\r
281 }\r
282 \r
283 void CProperties::OnCancel() \r
284 {\r
285         CProfile::LoadData();\r
286 \r
287         CDialog::OnCancel();\r
288 }\r
289 \r
290 void CProperties::OnApply() \r
291 {\r
292         GetDialogData();\r
293         CProfile::SaveData();\r
294 }\r
295 \r
296 void CProperties::OnLoadDefault() \r
297 {\r
298         CProfile::CopyData(m_appName, CString(MAKEINTRESOURCE(IDS_DEFAULT)));\r
299         SetDialogData();\r
300 }\r
301 \r
302 void CProperties::OnSelectAll() \r
303 {\r
304         m_basic.SetAllDialogData(1, TRUE);\r
305 }\r
306 \r
307 void CProperties::OnClearAll() \r
308 {\r
309         m_basic.SetAllDialogData(0, TRUE);\r
310 }\r
311 \r
312 int CProperties::GetApplicationID()\r
313 {\r
314         return m_nAppID;\r
315 }\r
316 \r
317 CString CProperties::GetCurrentApplication()\r
318 {\r
319         return m_appName;\r
320 }\r
321 \r
322 void CProperties::OnSettingDefault() \r
323 {\r
324         UpdateData(); // get data\r
325         EnableControl(ACTIVE_TAB);\r
326 }\r
327 \r
328 void CProperties::OnSettingDisable() \r
329 {\r
330         UpdateData();\r
331         EnableControl(ACTIVE_TAB);\r
332 }\r
333 \r
334 void CProperties::OnSettingSpecific() \r
335 {\r
336         UpdateData();\r
337         EnableControl(ACTIVE_TAB);\r
338 \r
339         if (CProfile::GetAppID(m_appName) == MAX_APP) {\r
340                 CProfile::CopyData(m_appName, CString(MAKEINTRESOURCE(IDS_DEFAULT)));\r
341                 SetDialogData();\r
342         }\r
343 }\r
344 \r
345 BOOL CProperties::IsEnableControl()\r
346 {\r
347         return m_nSettingStyle == SETTING_SPECIFIC;\r
348 }\r