source: src/ConfigOptions.hpp @ 268

Revision 268, 14.5 KB checked in by Eoin, 12 years ago (diff)

Added copyright eventually.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#include "stdAfx.hpp"
10
11#include "Halite.hpp"
12#include "halConfig.hpp"
13#include "HaliteWindow.hpp"
14#include "DdxEx.hpp"
15#include "CSSFileDialog.hpp"
16
17class GeneralOptions :
18    public CPropertyPageImpl<GeneralOptions>,
19    public CWinDataExchange<GeneralOptions>
20{
21public:
22    enum { IDD = IDD_CONFIGGENERAL };
23
24        GeneralOptions(HaliteWindow* haliteWindow) :
25                haliteWindow_(haliteWindow)
26        {}
27
28        ~GeneralOptions()
29        {}
30
31    BEGIN_MSG_MAP_EX(GeneralOptions)
32                MSG_WM_INITDIALOG(OnInitDialog)
33        CHAIN_MSG_MAP(CPropertyPageImpl<GeneralOptions>)
34    END_MSG_MAP()
35
36    BEGIN_DDX_MAP(GeneralOptions)
37        DDX_CHECK(IDC_GENERAL_ONEINST, halite().oneInst)
38        DDX_CHECK(IDC_GENERAL_TRAY, haliteWindow_->use_tray)
39        DDX_CHECK(IDC_GENERAL_ADVGUI, haliteWindow_->advancedUI)
40    END_DDX_MAP()
41
42    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam);
43
44    int OnApply()
45        {       
46                size_t length = lang_list_.GetTextLen(lang_list_.GetCurSel());
47                boost::scoped_array<wchar_t> buffer(new wchar_t[length+1]);
48               
49                lang_list_.GetText(lang_list_.GetCurSel(), buffer.get());
50                std::wstring language(buffer.get(), length);
51               
52                if (language == L"English")
53                {
54                        halite().dll_ = L"";
55                        hal::app().revert_res();
56                }
57                else
58                {
59                        halite().dll_ = lang_map_[language].external_file_string();
60                        hal::app().set_res_dll(lang_map_[language].external_file_string());
61                }
62               
63                return DoDataExchange(true);
64        }
65
66private:
67        CListBox lang_list_;
68        std::map<wstring, wpath> lang_map_;
69        HaliteWindow* haliteWindow_;
70};
71
72class BitTorrentOptions :
73    public CPropertyPageImpl<BitTorrentOptions>,
74    public CWinDataExchangeEx<BitTorrentOptions>
75{
76public:
77    enum { IDD = IDD_CONFIGBIT };
78
79        BitTorrentOptions()
80        {}
81
82        ~BitTorrentOptions()
83        {}
84
85    BEGIN_MSG_MAP_EX(BitTorrentOptions)
86        MSG_WM_INITDIALOG(OnInitDialog)
87                COMMAND_ID_HANDLER_EX(IDC_BC_PORTCHECK, onPortCheck)
88                COMMAND_ID_HANDLER_EX(IDC_BC_HALFCONN_CHECK, onHalfCheck)
89                COMMAND_ID_HANDLER_EX(IDC_BC_DHT, onDHTCheck)
90        CHAIN_MSG_MAP(CPropertyPageImpl<BitTorrentOptions>)
91    END_MSG_MAP()
92
93    BEGIN_DDX_MAP(BitTorrentOptions)
94        DDX_CHECK(IDC_BC_PORTCHECK, hal::config().portRange)
95        DDX_INT(IDC_BC_PORTFROM, hal::config().portFrom)
96        DDX_INT(IDC_BC_PORTTO, hal::config().portTo)           
97        DDX_CHECK(IDC_BC_HALFCONN_CHECK, hal::config().halfConn)
98        DDX_EX_INT_POSITIVE(IDC_BC_HALFCONN_NUM, hal::config().halfConnLimit)
99        DDX_CHECK(IDC_BC_DHT, hal::config().enableDHT)
100        DDX_INT(IDC_BC_DHTPORT, hal::config().dhtServicePort)
101    END_DDX_MAP()
102
103    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
104        {       
105                helpLink.SubclassWindow(GetDlgItem(IDC_BC_HELP_LINK));
106                helpLink.SetHyperLink(L"http://www.binarynotions.com/");
107               
108                whyHalfConn.SubclassWindow(GetDlgItem(IDC_BC_CON_WHY));
109                whyHalfConn.SetHyperLink(L"http://www.binarynotions.com/");
110               
111                BOOL retval = DoDataExchange(false);
112
113                onHalfCheck(0, 0, GetDlgItem(IDC_BC_HALFCONN_CHECK));
114                onPortCheck(0, 0, GetDlgItem(IDC_BC_PORTCHECK));
115                onDHTCheck(0, 0, GetDlgItem(IDC_BC_DHT));
116
117                return retval;
118        }
119
120    int OnApply()
121        {
122                return DoDataExchange(true);
123        }
124
125        void onDHTCheck(UINT, int, HWND hWnd)
126        {
127                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
128
129                if (result == BST_CHECKED)
130                {
131                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT), true);
132                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT_S), true);
133                }
134                else
135                {
136                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT), false);
137                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT_S), false);
138                }
139        }
140
141        void onPortCheck(UINT, int, HWND hWnd)
142        {
143                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
144
145                if (result == BST_CHECKED)
146                {
147                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), true);
148                }
149                else
150                {
151                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), false);
152                        boost::array<wchar_t, MAX_PATH> buffer;
153                        GetDlgItemText(IDC_BC_PORTFROM, buffer.elems, MAX_PATH);
154                        SetDlgItemText(IDC_BC_PORTTO, buffer.elems);
155                }
156        }
157
158        void onHalfCheck(UINT, int, HWND hWnd)
159        {
160                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
161
162                if (result == BST_CHECKED)
163                {
164                        ::EnableWindow(GetDlgItem(IDC_BC_HALFCONN_NUM), true);
165                }
166                else
167                {
168                        ::EnableWindow(GetDlgItem(IDC_BC_HALFCONN_NUM), false);
169                        SetDlgItemText(IDC_BC_HALFCONN_NUM, L"∞");
170                }
171        }
172private:
173        CHyperLink helpLink;
174        CHyperLink whyHalfConn;
175};
176
177class ProxyOptions :
178    public CPropertyPageImpl<ProxyOptions>,
179    public CWinDataExchangeEx<ProxyOptions>
180{
181public:
182    enum { IDD = IDD_CONFIGPROXY };
183
184        ProxyOptions()
185        {}
186
187        ~ProxyOptions()
188        {}
189
190    BEGIN_MSG_MAP_EX(ProxyOptions)
191        MSG_WM_INITDIALOG(OnInitDialog)
192                COMMAND_ID_HANDLER_EX(IDC_BC_PROXYCHECK, onProxyCheck)
193        CHAIN_MSG_MAP(CPropertyPageImpl<ProxyOptions>)
194    END_MSG_MAP()
195
196    BEGIN_DDX_MAP(ProxyOptions)
197       
198    END_DDX_MAP()
199
200    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
201        {
202                BOOL retval =  DoDataExchange(false);
203
204                onProxyCheck(0, 0, GetDlgItem(IDC_BC_PROXYCHECK));
205
206                return retval;
207        }
208
209    int OnApply()
210        {
211                return DoDataExchange(true);
212        }
213
214        void onPortCheck(UINT, int, HWND hWnd)
215        {
216                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
217
218                if (result == BST_CHECKED)
219                {
220                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), true);
221                }
222                else
223                {
224                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), false);
225                        boost::array<wchar_t, MAX_PATH> buffer;
226                        GetDlgItemText(IDC_BC_PORTFROM, buffer.elems, MAX_PATH);
227                        SetDlgItemText(IDC_BC_PORTTO, buffer.elems);
228                }
229        }
230
231        void onProxyCheck(UINT, int, HWND hWnd)
232        {
233                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
234
235                if (result == BST_CHECKED)
236                {
237                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP), true);
238                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT), true);
239                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER), true);
240                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS), true);
241                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP_S), true);
242                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT_S), true);
243                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER_S), true);
244                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS_S), true);
245                }
246                else
247                {
248                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP), false);
249                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT), false);
250                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER), false);
251                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS), false);
252                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP_S), false);
253                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT_S), false);
254                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER_S), false);
255                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS_S), false);
256                }
257        }
258};
259
260class SecurityOptions :
261    public CPropertyPageImpl<SecurityOptions>,
262    public CWinDataExchangeEx<SecurityOptions>
263{
264        typedef SecurityOptions thisClass;
265public:
266    enum { IDD = IDD_CONFIGSECURITY };
267
268        SecurityOptions()
269        {}
270
271        ~SecurityOptions()
272        {}
273
274    BEGIN_MSG_MAP_EX(thisClass)
275        MSG_WM_INITDIALOG(OnInitDialog)
276               
277                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERLOAD, onFilterImport)
278                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERCLEAR, onFilterClear)
279                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERCHECK, onFilterCheck)
280               
281                COMMAND_ID_HANDLER_EX(IDC_SC_ENABLE_PE, onPeCheck)
282               
283        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
284    END_MSG_MAP()
285
286    BEGIN_DDX_MAP(thisClass)
287        DDX_CHECK(IDC_BC_FILTERCHECK, hal::config().enableIPFilter)
288        DDX_CHECK(IDC_SC_ENABLE_PE, hal::config().enablePe)
289        DDX_RADIO(IDC_SC_PE_ENC_PLAIN, hal::config().peEncLevel)
290        DDX_CHECK(IDC_SC_PE_ENC_RC4_PERFER, hal::config().pePerferRc4)
291        DDX_RADIO(IDC_SC_PE_CP_IN_FORCED, hal::config().peConInPolicy)
292        DDX_RADIO(IDC_SC_PE_CP_OUT_FORCED, hal::config().peConOutPolicy)
293    END_DDX_MAP()
294
295    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
296        {
297                helpLink.SubclassWindow(GetDlgItem(IDC_SC_HELP_LINK));
298                helpLink.SetHyperLink(L"http://www.binarynotions.com/");
299               
300                BOOL retval =  DoDataExchange(false);
301
302                onFilterCheck(0, 0, GetDlgItem(IDC_BC_FILTERCHECK));
303                onPeCheck(0, 0, GetDlgItem(IDC_SC_ENABLE_PE));
304
305                return retval;
306        }
307
308    int OnApply()
309        {
310                return DoDataExchange(true);
311        }
312
313        void onFilterCheck(UINT, int, HWND hWnd)
314        {
315                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
316
317                if (result == BST_CHECKED)
318                {
319                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERCLEAR), true);
320                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERLOAD), true);
321                }
322                else
323                {
324                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERCLEAR), false);
325                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERLOAD), false);
326                }
327        }
328
329        void onPeCheck(UINT, int, HWND hWnd)
330        {
331                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
332
333                if (result == BST_CHECKED)
334                {
335                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_BOTH), true);
336                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4), true);
337                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_PLAIN), true);
338                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4_PERFER), true);
339                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_FORCED), true);
340                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_DISABLED), true);
341                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_ENABLED), true);
342                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_DISABLED), true);
343                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_ENABLED), true);
344                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_FORCED), true);
345                }
346                else
347                {
348                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_BOTH), false);
349                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4), false);
350                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_PLAIN), false);
351                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4_PERFER), false);
352                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_FORCED), false);
353                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_DISABLED), false);
354                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_ENABLED), false);
355                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_DISABLED), false);
356                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_ENABLED), false);
357                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_FORCED), false);
358                }
359        }
360
361        void onFilterClear(UINT, int, HWND hWnd)
362        {
363                hal::bittorrent().clearIpFilter();
364        }
365
366        void onFilterImport(UINT, int, HWND hWnd);
367
368private:
369        CHyperLink helpLink;
370};
371
372class TorrentsOptions :
373    public CPropertyPageImpl<TorrentsOptions>,
374    public CWinDataExchangeEx<TorrentsOptions>
375{
376public:
377    enum { IDD = IDD_CONFIGTORRENT };
378
379    BEGIN_MSG_MAP_EX(TorrentsOptions)
380        MSG_WM_INITDIALOG(OnInitDialog)
381                COMMAND_ID_HANDLER_EX(IDC_BC_SAVEBROWSE, onFolderBrowse)
382        CHAIN_MSG_MAP(CPropertyPageImpl<TorrentsOptions>)
383    END_MSG_MAP()
384
385    BEGIN_DDX_MAP(TorrentsOptions)
386        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_MAXCONN, hal::config().maxConnections, 2, true)
387        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_MAXUP, hal::config().maxUploads, 2, true)
388        DDX_EX_FLOAT_POSITIVE(IDC_BC_DOWNRATE, hal::config().downRate)
389        DDX_EX_FLOAT_POSITIVE(IDC_BC_UPRATE, hal::config().upRate)
390
391        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_TMAXCONN, hal::config().torrentMaxConnections, 2, true)
392        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_TMAXUP, hal::config().torrentMaxUploads, 2, true)
393        DDX_EX_FLOAT_POSITIVE(IDC_BC_TDOWNRATE, hal::config().torrentDownRate)
394        DDX_EX_FLOAT_POSITIVE(IDC_BC_TUPRATE, hal::config().torrentUpRate)
395
396                DDX_EX_STDWSTRING(IDC_BC_SAVEFOLDER, hal::config().defaultSaveFolder);
397        DDX_CHECK(IDC_BC_PROMPTSAVE, hal::config().savePrompt)
398    END_DDX_MAP()
399
400    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
401        {
402                BOOL retval =  DoDataExchange(false);
403
404                return retval;
405        }
406
407        void onFolderBrowse(UINT, int, HWND hWnd)
408        {
409                hal::bittorrent().clearIpFilter();
410
411                CFolderDialog fldDlg (NULL, hal::app().res_wstr(HAL_FOLDER_SELECT).c_str(),
412                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE );
413
414                if (IDOK == fldDlg.DoModal())
415                        SetDlgItemText(IDC_BC_SAVEFOLDER, fldDlg.m_szFolderPath);
416        }
417
418    int OnApply()
419        {
420                return DoDataExchange(true);
421        }
422};
423
424class RemoteOptions :
425    public CPropertyPageImpl<RemoteOptions>,
426    public CWinDataExchange<RemoteOptions>
427{
428public:
429    enum { IDD = IDD_CONFIGREMOTE };
430
431        RemoteOptions()
432        {}
433
434        ~RemoteOptions()
435        {}
436
437    BEGIN_MSG_MAP_EX(RemoteOptions)
438                MSG_WM_INITDIALOG(OnInitDialog)
439        CHAIN_MSG_MAP(CPropertyPageImpl<RemoteOptions>)
440    END_MSG_MAP()
441
442    BEGIN_DDX_MAP(RemoteOptions)
443//      DDX_CHECK(IDC_REMOTECTRL, INI().remoteConfig().isEnabled)
444//      DDX_INT(IDC_REMOTEPORT, INI().remoteConfig().port)
445    END_DDX_MAP()
446
447    BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam )
448        {
449                return DoDataExchange(false);
450        }
451
452    int OnApply()
453        {
454                return DoDataExchange(true);
455        }
456};
457
458class AboutOptions :
459    public CPropertyPageImpl<AboutOptions>
460{
461public:
462    enum { IDD = IDD_ABOUT };
463       
464    BEGIN_MSG_MAP_EX(RemoteOptions)
465                MSG_WM_INITDIALOG(OnInitDialog)
466    END_MSG_MAP()
467
468    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
469        {
470                richEdit_.Attach(GetDlgItem(IDC_RICHEDITABOUT));
471               
472                std::pair<void*, size_t> res = hal::app().find_lock_res(IDR_ABOUT_TEXT, HALITE_RTF_RES_TYPE);
473               
474                string rtf(static_cast<char*>(res.first), res.second);         
475                wstring wrtf = hal::safe_from_utf8(rtf);
476               
477                richEdit_.SendMessage(WM_SETTEXT, 0, (LPARAM)wrtf.c_str());             
478                richEdit_.SetSelNone();
479               
480                return true;
481        }
482       
483private:
484        CRichEditCtrl richEdit_;
485};
486
487class ConfigOptionsProp :
488        public CPropertySheet
489{
490private:
491    bool m_bCentered;
492
493public:
494    ConfigOptionsProp(HaliteWindow* haliteWindow, LPCTSTR title = (LPCTSTR)NULL,
495                UINT uStartPage = 0, HWND hWndParent = NULL) :
496        CPropertySheet(title, uStartPage, hWndParent),
497                m_bCentered(false),
498                generalOptions(haliteWindow)
499    {
500                AddPage(generalOptions);
501                AddPage(bitTorrentOptions);
502                AddPage(securityOptions);
503                AddPage(torrentsOptions);
504                AddPage(remoteControlOptions);
505                AddPage(aboutOptions);
506    }
507
508    BEGIN_MSG_MAP_EX(ConfigOptionsProp)
509        MESSAGE_HANDLER(WM_SHOWWINDOW, OnShowWindow)
510        CHAIN_MSG_MAP(CPropertySheet)
511    END_MSG_MAP()
512
513    LRESULT OnShowWindow(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
514    {
515        if (wParam == TRUE)
516            Center();
517
518        bHandled = FALSE;
519        return 0;
520    }
521
522    void Center(void)
523    {
524        if (!m_bCentered)
525        {
526            CenterWindow();
527            m_bCentered = true;
528        }
529    }
530
531        GeneralOptions generalOptions;
532        BitTorrentOptions bitTorrentOptions;
533        SecurityOptions securityOptions;
534        TorrentsOptions torrentsOptions;
535        RemoteOptions remoteControlOptions;
536        AboutOptions aboutOptions;
537};
Note: See TracBrowser for help on using the repository browser.