source: trunk/src/ConfigOptions.hpp @ 374

Revision 374, 53.5 KB checked in by Eoin, 12 years ago (diff)
Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
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#define ID_CONFIG_BEGIN                         12000
10#define IDC_SECURITY_IPF_GB             ID_CONFIG_BEGIN + 1
11#define IDC_SECURITY_PE_GB                      ID_CONFIG_BEGIN + 2
12#define IDC_SECURITY_CP_GB                      ID_CONFIG_BEGIN + 3
13#define IDC_SECURITY_EL_GB                      ID_CONFIG_BEGIN + 4
14#define IDC_SECURITY_OUTGOING           ID_CONFIG_BEGIN + 5
15#define IDC_SECURITY_INCOMING           ID_CONFIG_BEGIN + 6
16#define IDC_SECURITY_ENABLED            ID_CONFIG_BEGIN + 7
17#define IDC_SECURITY_FORCED                     ID_CONFIG_BEGIN + 8
18#define IDC_SECURITY_DISABLED           ID_CONFIG_BEGIN + 9
19#define IDC_BITT_OPENPORT                       ID_CONFIG_BEGIN + 10
20#define IDC_BITT_GDHT                           ID_CONFIG_BEGIN + 11
21#define IDC_BITT_DHT_NOTE                       ID_CONFIG_BEGIN + 12
22#define IDC_BITT_GSETTINGS                      ID_CONFIG_BEGIN + 13
23#define IDC_BITT_SELECT_TEXT            ID_CONFIG_BEGIN + 14
24#define IDC_CONFIGT_TOTALMAX            ID_CONFIG_BEGIN + 15
25#define IDC_CONFIGT_TOTALUP                     ID_CONFIG_BEGIN + 16
26#define IDC_CONFIGT_DOWNRATE            ID_CONFIG_BEGIN + 17
27#define IDC_CONFIGT_UPRATE                      ID_CONFIG_BEGIN + 18
28#define IDC_CONFIGT_TORMAX                      ID_CONFIG_BEGIN + 19
29#define IDC_CONFIGT_TORUP                       ID_CONFIG_BEGIN + 20
30#define IDC_CONFIGT_TORDOWNRATE         ID_CONFIG_BEGIN + 21
31#define IDC_CONFIGT_TORUPRATE           ID_CONFIG_BEGIN + 22
32#define IDC_CONFIGT_GLOBAL_TEXT         ID_CONFIG_BEGIN + 23
33#define IDC_CONFIGT_TOR_TEXT            ID_CONFIG_BEGIN + 24
34#define IDC_CONFIGT_DEF_FOLDER          ID_CONFIG_BEGIN + 25
35#define IDC_CONFIGT_GLOBALG             ID_CONFIG_BEGIN + 26
36#define IDC_CONFIGT_TORRENTG            ID_CONFIG_BEGIN + 27
37#define IDC_CONFIGT_TDOWNRATE           ID_CONFIG_BEGIN + 28
38#define IDC_GENERAL_GROUP                       ID_CONFIG_BEGIN + 29
39#define IDC_GENERAL_LANG                        ID_CONFIG_BEGIN + 30
40#define IDC_GENERAL_CLOSETRAY           ID_CONFIG_BEGIN + 31
41#define IDC_GENERAL_CONFIRMCLOSE        ID_CONFIG_BEGIN + 32
42#define IDC_ABOUT_GROUP                 ID_CONFIG_BEGIN + 33
43#define IDC_ABOUT_VERSION               ID_CONFIG_BEGIN + 34
44
45#ifndef RC_INVOKED
46
47#include "stdAfx.hpp"
48
49#include "Halite.hpp"
50#include "halConfig.hpp"
51#include "HaliteWindow.hpp"
52#include "HaliteEditCtrl.hpp"
53#include "DdxEx.hpp"
54#include "CSSFileDialog.hpp"
55
56class GeneralOptions :
57    public CPropertyPageImpl<GeneralOptions>,
58        public CAutoSizeWindow<GeneralOptions, false>,
59    public CWinDataExchange<GeneralOptions>
60{
61        typedef GeneralOptions thisClass;
62        typedef CPropertyPageImpl propPageClass;
63        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
64       
65public:
66    enum { IDD = IDD_CONFIGGENERAL };
67
68        GeneralOptions(HaliteWindow* haliteWindow) :
69                haliteWindow_(haliteWindow)
70        {}
71
72        ~GeneralOptions()
73        {}
74
75    BEGIN_MSG_MAP_EX(GeneralOptions)
76                MSG_WM_INITDIALOG(OnInitDialog)
77        CHAIN_MSG_MAP(CPropertyPageImpl<GeneralOptions>)
78        CHAIN_MSG_MAP(autosizeClass)
79    END_MSG_MAP()
80
81    BEGIN_DDX_MAP(GeneralOptions)
82        DDX_CHECK(IDC_GENERAL_ONEINST, halite().oneInst)
83        DDX_CHECK(IDC_GENERAL_TRAY, haliteWindow_->use_tray)
84        DDX_CHECK(IDC_GENERAL_ADVGUI, haliteWindow_->advancedUI)
85        DDX_CHECK(IDC_GENERAL_CLOSETRAY, haliteWindow_->closeToTray)
86        DDX_CHECK(IDC_GENERAL_CONFIRMCLOSE, haliteWindow_->confirmClose)
87    END_DDX_MAP()
88
89#define GENERAL_CONFIG_LAYOUT \
90        WMB_HEAD(WMB_COLNOMAX(_exp)), \
91                WMB_ROW(_gap,   _d), \
92                WMB_ROW(_auto,  IDC_GENERAL_ONEINST), \
93                WMB_ROW(_auto,  IDC_GENERAL_ADVGUI), \
94                WMB_ROW(_auto,  IDC_GENERAL_TRAY), \
95                WMB_ROW(_auto,  IDC_GENERAL_CLOSETRAY), \
96                WMB_ROW(_auto,  IDC_GENERAL_CONFIRMCLOSE), \
97        WMB_END()
98
99#define GENERAL_LANGUAGE_LAYOUT \
100        WMB_HEAD(WMB_COLNOMAX(_exp)), \
101                WMB_ROW(_auto,  IDC_GENERAL_LANG), \
102                WMB_ROW(_auto,  IDC_LANGLIST), \
103        WMB_END()
104
105        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
106                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
107                        WMB_ROW(_gap|3, IDC_GENERAL_GROUP, _r, _r, _r), 
108                        WMB_ROW(_auto,  _d, GENERAL_CONFIG_LAYOUT, GENERAL_LANGUAGE_LAYOUT), 
109                        WMB_ROW(_gap,   _d),
110                WMB_END()
111        END_WINDOW_MAP()       
112
113    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam);
114
115    int OnApply()
116        {       
117                hal::event().post(shared_ptr<hal::EventDetail>(
118                        new hal::EventMsg(L"Applying general options.", hal::Event::info)));
119
120                size_t length = lang_list_.GetTextLen(lang_list_.GetCurSel());
121                boost::scoped_array<wchar_t> buffer(new wchar_t[length+1]);
122               
123                lang_list_.GetText(lang_list_.GetCurSel(), buffer.get());
124                std::wstring language(buffer.get(), length);
125
126                if (language == L"English")
127                {
128                        halite().dll_ = L"";
129                        hal::app().res_revert();
130                }
131                else
132                {
133                        halite().dll_ = lang_map_[language].external_file_string();
134                        hal::app().res_set_dll(lang_map_[language].external_file_string());
135                }
136               
137                return DoDataExchange(true);
138        }
139
140private:
141        CListBox lang_list_;
142        std::map<wstring, wpath> lang_map_;
143        HaliteWindow* haliteWindow_;
144};
145
146class BitTorrentOptions :
147    public CPropertyPageImpl<BitTorrentOptions>,
148        public CAutoSizeWindow<BitTorrentOptions, false>,
149    public CWinDataExchangeEx<BitTorrentOptions>
150{
151        typedef BitTorrentOptions thisClass;
152        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
153       
154public:
155    enum { IDD = IDD_CONFIGBIT };
156
157        BitTorrentOptions()
158        {}
159
160        ~BitTorrentOptions()
161        {}
162
163    BEGIN_MSG_MAP_EX(BitTorrentOptions)
164        MSG_WM_INITDIALOG(OnInitDialog)
165                COMMAND_ID_HANDLER_EX(IDC_BC_PORTCHECK, onPortCheck)
166                COMMAND_ID_HANDLER_EX(IDC_BC_HALFCONN_CHECK, onHalfCheck)
167                COMMAND_ID_HANDLER_EX(IDC_BC_DHT, onDHTCheck)
168               
169        CHAIN_MSG_MAP(CPropertyPageImpl<BitTorrentOptions>)
170        CHAIN_MSG_MAP(autosizeClass)
171    END_MSG_MAP()
172
173    BEGIN_DDX_MAP(BitTorrentOptions)
174        DDX_CHECK(IDC_BC_PORTCHECK, hal::config().portRange)
175        DDX_INT(IDC_BC_PORTFROM, hal::config().portFrom)
176        DDX_INT(IDC_BC_PORTTO, hal::config().portTo)           
177        DDX_CHECK(IDC_BC_HALFCONN_CHECK, hal::config().halfConn)
178        DDX_EX_INT_POSITIVE(IDC_BC_HALFCONN_NUM, hal::config().halfConnLimit)
179        DDX_CHECK(IDC_BC_DHT, hal::config().enableDHT)
180        DDX_INT(IDC_BC_DHTPORT, hal::config().dhtServicePort)
181    END_DDX_MAP()
182       
183#define BITT_GS_LAYOUT \
184        WMB_HEAD(WMB_COLNOMAX(_exp|250), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
185                WMB_ROW(_auto,  IDC_BITT_SELECT_TEXT, _r, _r, _r), \
186                WMB_ROW(_auto,  IDC_BITT_OPENPORT, IDC_BC_PORTFROM, IDC_BC_PORTCHECK, IDC_BC_PORTTO), \
187                WMB_ROW(_auto,  IDC_BC_HALFCONN_CHECK, _r, IDC_BC_HALFCONN_NUM), \
188        WMB_END()
189
190#define BITT_DHT_LAYOUT \
191        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
192                WMB_ROW(_auto,  IDC_BC_DHT, IDC_BC_DHTPORT_S, IDC_BC_DHTPORT), \
193                WMB_ROW(_auto,  IDC_BITT_DHT_NOTE, _r, _r), \
194        WMB_END()
195
196        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
197                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
198                        WMB_ROW(_gap|3, IDC_BITT_GSETTINGS, _r, _r), 
199                        WMB_ROW(_auto,  _d, BITT_GS_LAYOUT),
200                        WMB_ROW(_gap,   _d),
201                        WMB_ROW(_gap|3, IDC_BITT_GDHT, _r, _r),
202                        WMB_ROW(_auto,  _d, BITT_DHT_LAYOUT), 
203                        WMB_ROW(_gap,   _d),
204                WMB_END()
205        END_WINDOW_MAP()
206
207    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
208        {       
209        //      helpLink.SubclassWindow(GetDlgItem(IDC_BC_HELP_LINK));
210        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
211               
212        //      whyHalfConn.SubclassWindow(GetDlgItem(IDC_BC_CON_WHY));
213        //      whyHalfConn.SetHyperLink(L"http://www.binarynotions.com/");
214               
215                BOOL retval = DoDataExchange(false);
216
217                onHalfCheck(0, 0, GetDlgItem(IDC_BC_HALFCONN_CHECK));
218                onPortCheck(0, 0, GetDlgItem(IDC_BC_PORTCHECK));
219                onDHTCheck(0, 0, GetDlgItem(IDC_BC_DHT));
220
221                autosizeClass::CtrlsArrange();
222                return retval;
223        }
224
225    int OnApply()
226        {
227                hal::event().post(shared_ptr<hal::EventDetail>(
228                        new hal::EventMsg(L"Applying bittorrent options.", hal::Event::info)));
229
230                return DoDataExchange(true);
231        }
232
233        void onDHTCheck(UINT, int, HWND hWnd)
234        {
235                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
236
237                if (result == BST_CHECKED)
238                {
239                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT), true);
240                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT_S), true);
241                }
242                else
243                {
244                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT), false);
245                        ::EnableWindow(GetDlgItem(IDC_BC_DHTPORT_S), false);
246                }
247        }
248
249        void onPortCheck(UINT, int, HWND hWnd)
250        {
251                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
252
253                if (result == BST_CHECKED)
254                {
255                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), true);
256                }
257                else
258                {
259                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), false);
260                        boost::array<wchar_t, MAX_PATH> buffer;
261                        GetDlgItemText(IDC_BC_PORTFROM, buffer.elems, MAX_PATH);
262                        SetDlgItemText(IDC_BC_PORTTO, buffer.elems);
263                }
264        }
265
266        void onHalfCheck(UINT, int, HWND hWnd)
267        {
268                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
269
270                if (result == BST_CHECKED)
271                {
272                        ::EnableWindow(GetDlgItem(IDC_BC_HALFCONN_NUM), true);
273                }
274                else
275                {
276                        ::EnableWindow(GetDlgItem(IDC_BC_HALFCONN_NUM), false);
277                        SetDlgItemText(IDC_BC_HALFCONN_NUM, L"");
278                }
279        }
280private:
281        CHyperLink helpLink;
282        CHyperLink whyHalfConn;
283};
284
285class ProxyOptions :
286    public CPropertyPageImpl<ProxyOptions>,
287    public CWinDataExchangeEx<ProxyOptions>
288{
289public:
290    enum { IDD = IDD_CONFIGPROXY };
291
292        ProxyOptions()
293        {}
294
295        ~ProxyOptions()
296        {}
297
298    BEGIN_MSG_MAP_EX(ProxyOptions)
299        MSG_WM_INITDIALOG(OnInitDialog)
300                COMMAND_ID_HANDLER_EX(IDC_BC_PROXYCHECK, onProxyCheck)
301        CHAIN_MSG_MAP(CPropertyPageImpl<ProxyOptions>)
302    END_MSG_MAP()
303
304    BEGIN_DDX_MAP(ProxyOptions)
305       
306    END_DDX_MAP()
307
308    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
309        {
310                BOOL retval =  DoDataExchange(false);
311
312                onProxyCheck(0, 0, GetDlgItem(IDC_BC_PROXYCHECK));
313
314                return retval;
315        }
316
317    int OnApply()
318        {
319                hal::event().post(shared_ptr<hal::EventDetail>(
320                        new hal::EventMsg(L"Applying proxy options.", hal::Event::info)));
321
322                return DoDataExchange(true);
323        }
324
325        void onPortCheck(UINT, int, HWND hWnd)
326        {
327                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
328
329                if (result == BST_CHECKED)
330                {
331                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), true);
332                }
333                else
334                {
335                        ::EnableWindow(GetDlgItem(IDC_BC_PORTTO), false);
336                        boost::array<wchar_t, MAX_PATH> buffer;
337                        GetDlgItemText(IDC_BC_PORTFROM, buffer.elems, MAX_PATH);
338                        SetDlgItemText(IDC_BC_PORTTO, buffer.elems);
339                }
340        }
341
342        void onProxyCheck(UINT, int, HWND hWnd)
343        {
344                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
345
346                if (result == BST_CHECKED)
347                {
348                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP), true);
349                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT), true);
350                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER), true);
351                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS), true);
352                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP_S), true);
353                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT_S), true);
354                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER_S), true);
355                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS_S), true);
356                }
357                else
358                {
359                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP), false);
360                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT), false);
361                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER), false);
362                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS), false);
363                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYIP_S), false);
364                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPORT_S), false);
365                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYUSER_S), false);
366                        ::EnableWindow(GetDlgItem(IDC_BC_PROXYPASS_S), false);
367                }
368        }
369};
370
371class SecurityOptions :
372    public CPropertyPageImpl<SecurityOptions>,
373        public CAutoSizeWindow<SecurityOptions, false>,
374    public CWinDataExchangeEx<SecurityOptions>
375{
376        typedef SecurityOptions thisClass;
377        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
378       
379public:
380    enum { IDD = IDD_CONFIGSECURITY };
381
382    BEGIN_MSG_MAP_EX(thisClass)
383        MSG_WM_INITDIALOG(OnInitDialog)
384               
385                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERLOAD, onFilterImport)
386                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERCLEAR, onFilterClear)
387                COMMAND_ID_HANDLER_EX(IDC_BC_FILTERCHECK, onFilterCheck)
388               
389                COMMAND_ID_HANDLER_EX(IDC_SC_ENABLE_PE, onPeCheck)
390               
391        CHAIN_MSG_MAP(autosizeClass)
392        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
393//              MSG_WM_SIZE(OnSize)
394    END_MSG_MAP()
395
396    BEGIN_DDX_MAP(thisClass)
397        DDX_CHECK(IDC_BC_FILTERCHECK, hal::config().enableIPFilter)
398        DDX_CHECK(IDC_SC_ENABLE_PE, hal::config().enablePe)
399        DDX_RADIO(IDC_SC_PE_ENC_PLAIN, hal::config().peEncLevel)
400        DDX_CHECK(IDC_SC_PE_ENC_RC4_PERFER, hal::config().pePerferRc4)
401        DDX_RADIO(IDC_SC_PE_CP_IN_FORCED, hal::config().peConInPolicy)
402        DDX_RADIO(IDC_SC_PE_CP_OUT_FORCED, hal::config().peConOutPolicy)
403    END_DDX_MAP()
404       
405/*      void OnSize(UINT type, CSize)
406        {
407               
408                SetMsgHandled(false);
409        }
410*/
411#define SECURITY_IPF_LAYOUT \
412        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
413                WMB_ROW(_auto,  IDC_BC_FILTERCHECK,     IDC_BC_FILTERCLEAR, IDC_BC_FILTERLOAD), \
414        WMB_END()
415
416#define SECURITY_ENCODING_LAYOUT \
417        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
418                WMB_ROW(_auto,  IDC_SC_ENABLE_PE,       _r,_r,_r), \
419                WMB_ROW(_gap|3, IDC_SECURITY_EL_GB,     _r,_r,_r), \
420                WMB_ROW(_auto,  _d,     IDC_SC_PE_ENC_PLAIN, _r), \
421                WMB_ROW(_auto,  _d,     IDC_SC_PE_ENC_RC4, _r), \
422                WMB_ROW(_auto,  _d,     IDC_SC_PE_ENC_BOTH, IDC_SC_PE_ENC_RC4_PERFER), \
423                WMB_ROW(_gap,   _d), \
424        WMB_END()
425
426#define SECURITY_CONNECTION_LAYOUT \
427        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
428                WMB_ROW(_gap|4, IDC_SECURITY_CP_GB,     _r, _r, _r, _r, _r), \
429                WMB_ROW(_auto,  _d,     IDC_SECURITY_INCOMING, _r, IDC_SECURITY_OUTGOING, _r), \
430                WMB_ROW(_auto,  _d,     IDC_SC_PE_CP_IN_FORCED, IDC_SECURITY_FORCED, _r, IDC_SC_PE_CP_OUT_FORCED), \
431                WMB_ROW(_auto,  _d,     IDC_SC_PE_CP_IN_ENABLED, IDC_SECURITY_ENABLED, _r, IDC_SC_PE_CP_OUT_ENABLED), \
432                WMB_ROW(_auto,  _d,     IDC_SC_PE_CP_IN_DISABLED, IDC_SECURITY_DISABLED, _r, IDC_SC_PE_CP_OUT_DISABLED), \
433                WMB_ROW(_gap,   _d), \
434        WMB_END()
435       
436#define SECURITY_PE_LAYOUT \
437        WMB_HEAD(WMB_COLNOMAX(_exp|150), WMB_COLNOMAX(_exp)), \
438                WMB_ROW(_auto,  SECURITY_ENCODING_LAYOUT, SECURITY_CONNECTION_LAYOUT), \
439        WMB_END()
440
441        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
442                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
443                        WMB_ROW(_gap|3, IDC_SECURITY_IPF_GB, _r, _r), 
444                        WMB_ROW(_auto,  _d, SECURITY_IPF_LAYOUT), 
445                        WMB_ROW(_gap,   _d), 
446                        WMB_ROW(_gap|3, IDC_SECURITY_PE_GB, _r, _r), 
447                        WMB_ROW(_auto,  _d, SECURITY_PE_LAYOUT),
448                        WMB_ROW(_gap,   _d),
449                WMB_END()
450        END_WINDOW_MAP()       
451
452    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
453        {
454        //      helpLink.SubclassWindow(GetDlgItem(IDC_SC_HELP_LINK));
455        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
456
457                BOOL retval =  DoDataExchange(false);
458
459                onFilterCheck(0, 0, GetDlgItem(IDC_BC_FILTERCHECK));
460                onPeCheck(0, 0, GetDlgItem(IDC_SC_ENABLE_PE));
461
462                autosizeClass::CtrlsArrange();
463                return retval;
464        }
465
466    int OnApply()
467        {
468                hal::event().post(shared_ptr<hal::EventDetail>(
469                        new hal::EventMsg(L"Applying security options.", hal::Event::info)));
470
471                return DoDataExchange(true);
472        }
473
474        void onFilterCheck(UINT, int, HWND hWnd)
475        {
476                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
477
478                if (result == BST_CHECKED)
479                {
480                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERCLEAR), true);
481                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERLOAD), true);
482                }
483                else
484                {
485                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERCLEAR), false);
486                        ::EnableWindow(GetDlgItem(IDC_BC_FILTERLOAD), false);
487                }
488        }
489
490        void onPeCheck(UINT, int, HWND hWnd)
491        {
492                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
493
494                if (result == BST_CHECKED)
495                {
496                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_BOTH), true);
497                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4), true);
498                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_PLAIN), true);
499                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4_PERFER), true);
500                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_FORCED), true);
501                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_DISABLED), true);
502                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_ENABLED), true);
503                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_DISABLED), true);
504                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_ENABLED), true);
505                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_FORCED), true);
506                }
507                else
508                {
509                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_BOTH), false);
510                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4), false);
511                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_PLAIN), false);
512                        ::EnableWindow(GetDlgItem(IDC_SC_PE_ENC_RC4_PERFER), false);
513                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_FORCED), false);
514                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_DISABLED), false);
515                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_IN_ENABLED), false);
516                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_DISABLED), false);
517                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_ENABLED), false);
518                        ::EnableWindow(GetDlgItem(IDC_SC_PE_CP_OUT_FORCED), false);
519                }
520        }
521
522        void onFilterClear(UINT, int, HWND hWnd)
523        {
524                hal::bittorrent().clearIpFilter();
525        }
526
527        void onFilterImport(UINT, int, HWND hWnd);
528
529private:
530        CHyperLink helpLink;
531};
532
533class TorrentsOptions :
534    public CPropertyPageImpl<TorrentsOptions>,
535        public CAutoSizeWindow<TorrentsOptions, false>,
536    public CWinDataExchangeEx<TorrentsOptions>
537{
538        typedef TorrentsOptions thisClass;
539        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
540public:
541    enum { IDD = IDD_CONFIGTORRENT };
542       
543        TorrentsOptions() :
544                gTotalConnections_(0, false, false),
545                gUploadConnections_(0, false, false),
546                gDownloadRate_(0, false, false),
547                gUploadRate_(0, false, false),
548                tTotalConnections_(0, false, false),
549                tUploadConnections_(0, false, false),
550                tDownloadRate_(0, false, false),
551                tUploadRate_(0, false, false)
552        {}
553
554    BEGIN_MSG_MAP_EX(TorrentsOptions)
555        MSG_WM_INITDIALOG(OnInitDialog)
556                COMMAND_ID_HANDLER_EX(IDC_BC_SAVEBROWSE, onFolderBrowse)
557        CHAIN_MSG_MAP(CPropertyPageImpl<TorrentsOptions>)
558        CHAIN_MSG_MAP(autosizeClass)
559           REFLECT_NOTIFICATIONS()
560    END_MSG_MAP()
561       
562#define CONFIGT_GLOBAL_LAYOUT \
563        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
564                WMB_ROW(_auto,  IDC_CONFIGT_GLOBAL_TEXT, _r, _r, _r), \
565                WMB_ROW(_auto,  IDC_CONFIGT_TOTALMAX, IDC_BC_MAXCONN, IDC_CONFIGT_DOWNRATE, IDC_BC_DOWNRATE), \
566                WMB_ROW(_auto,  IDC_CONFIGT_TOTALUP, IDC_BC_MAXUP, IDC_CONFIGT_UPRATE, IDC_BC_UPRATE), \
567        WMB_END()
568
569#define CONFIGT_TORRENT_LAYOUT \
570        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
571                WMB_ROW(_auto,  IDC_CONFIGT_TOR_TEXT, _r, _r, _r), \
572                WMB_ROW(_auto,  IDC_CONFIGT_TORMAX, IDC_BC_TMAXCONN, IDC_CONFIGT_TDOWNRATE, IDC_BC_TDOWNRATE), \
573                WMB_ROW(_auto,  IDC_CONFIGT_TORUP, IDC_BC_TMAXUP, IDC_CONFIGT_TORUPRATE, IDC_BC_TUPRATE), \
574        WMB_END()
575
576#define CONFIGT_TORRENT_FOLDER_LAYOUT \
577        WMB_HEAD(WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_auto)), \
578                WMB_ROW(_auto,  IDC_CONFIGT_DEF_FOLDER, IDC_BC_SAVEFOLDER, IDC_BC_SAVEBROWSE), \
579                WMB_ROW(_auto, 0, IDC_BC_PROMPTSAVE, _r), \
580        WMB_END()
581
582        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
583                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
584                        WMB_ROW(_gap|3, IDC_CONFIGT_GLOBALG, _r, _r), 
585                        WMB_ROW(_auto,  _d, CONFIGT_GLOBAL_LAYOUT), 
586                        WMB_ROW(_gap,   _d), 
587                        WMB_ROW(_gap|3, IDC_CONFIGT_TORRENTG, _r, _r),
588                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_LAYOUT),
589                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_FOLDER_LAYOUT), 
590                        WMB_ROW(_gap,   _d),
591                WMB_END()
592        END_WINDOW_MAP()
593
594    BEGIN_DDX_MAP(TorrentsOptions)
595/*        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_MAXCONN, hal::config().maxConnections, 2, true)
596        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_MAXUP, hal::config().maxUploads, 2, true)
597        DDX_EX_FLOAT_POSITIVE(IDC_BC_DOWNRATE, hal::config().downRate)
598        DDX_EX_FLOAT_POSITIVE(IDC_BC_UPRATE, hal::config().upRate)
599
600        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_TMAXCONN, hal::config().torrentMaxConnections, 2, true)
601        DDX_EX_INT_POSITIVE_LIMIT(IDC_BC_TMAXUP, hal::config().torrentMaxUploads, 2, true)
602        DDX_EX_FLOAT_POSITIVE(IDC_BC_TDOWNRATE, hal::config().torrentDownRate)
603        DDX_EX_FLOAT_POSITIVE(IDC_BC_TUPRATE, hal::config().torrentUpRate)
604*/
605                DDX_EX_STDWSTRING(IDC_BC_SAVEFOLDER, hal::config().defaultSaveFolder);
606        DDX_CHECK(IDC_BC_PROMPTSAVE, hal::config().savePrompt)
607    END_DDX_MAP()       
608
609    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
610        {
611                gTotalConnections_.Attach(GetDlgItem(IDC_BC_MAXCONN));
612                gUploadConnections_.Attach(GetDlgItem(IDC_BC_MAXUP));
613                gDownloadRate_.Attach(GetDlgItem(IDC_BC_DOWNRATE));
614                gUploadRate_.Attach(GetDlgItem(IDC_BC_UPRATE));
615       
616                tTotalConnections_.Attach(GetDlgItem(IDC_BC_TMAXCONN));
617                tUploadConnections_.Attach(GetDlgItem(IDC_BC_TMAXUP));
618                tDownloadRate_.Attach(GetDlgItem(IDC_BC_TDOWNRATE));
619                tUploadRate_.Attach(GetDlgItem(IDC_BC_TUPRATE));
620
621                gTotalConnections_ = hal::config().maxConnections;
622                gUploadConnections_ = hal::config().maxUploads;
623                gDownloadRate_ = hal::config().downRate;
624                gUploadRate_ = hal::config().upRate;
625       
626                tTotalConnections_ = hal::config().torrentMaxConnections;
627                tUploadConnections_ = hal::config().torrentMaxUploads;
628                tDownloadRate_ = hal::config().torrentDownRate;
629                tUploadRate_ = hal::config().torrentUpRate;
630       
631                BOOL retval =  DoDataExchange(false);
632
633                autosizeClass::CtrlsArrange();
634                return retval;
635        }
636
637        void onFolderBrowse(UINT, int, HWND hWnd)
638        {
639                hal::bittorrent().clearIpFilter();
640               
641                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
642
643                CFolderDialog fldDlg (NULL, folderSelect.c_str(),
644                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
645
646                if (IDOK == fldDlg.DoModal())
647                        SetDlgItemText(IDC_BC_SAVEFOLDER, fldDlg.m_szFolderPath);
648        }
649
650    int OnApply()
651        {
652                hal::event().post(shared_ptr<hal::EventDetail>(
653                        new hal::EventMsg(L"Applying torrent options.", hal::Event::info)));
654
655                hal::config().maxConnections = gTotalConnections_;
656                hal::config().maxUploads = gUploadConnections_;
657                hal::config().downRate = gDownloadRate_;
658                hal::config().upRate = gUploadRate_;
659
660                hal::config().torrentMaxConnections = tTotalConnections_;
661                hal::config().torrentMaxUploads = tUploadConnections_;
662                hal::config().torrentDownRate = tDownloadRate_;
663                hal::config().torrentUpRate = tUploadRate_;
664               
665                return DoDataExchange(true);
666        }
667       
668private:
669        CHaliteEditCtrl<int> gTotalConnections_;
670        CHaliteEditCtrl<int> gUploadConnections_;
671        CHaliteEditCtrl<float> gDownloadRate_;
672        CHaliteEditCtrl<float> gUploadRate_;
673       
674        CHaliteEditCtrl<int> tTotalConnections_;
675        CHaliteEditCtrl<int> tUploadConnections_;
676        CHaliteEditCtrl<float> tDownloadRate_;
677        CHaliteEditCtrl<float> tUploadRate_;
678};
679
680class RemoteOptions :
681    public CPropertyPageImpl<RemoteOptions>,
682    public CWinDataExchange<RemoteOptions>
683{
684public:
685    enum { IDD = IDD_CONFIGREMOTE };
686
687        RemoteOptions()
688        {}
689
690        ~RemoteOptions()
691        {}
692
693    BEGIN_MSG_MAP_EX(RemoteOptions)
694                MSG_WM_INITDIALOG(OnInitDialog)
695        CHAIN_MSG_MAP(CPropertyPageImpl<RemoteOptions>)
696    END_MSG_MAP()
697
698    BEGIN_DDX_MAP(RemoteOptions)
699//      DDX_CHECK(IDC_REMOTECTRL, INI().remoteConfig().isEnabled)
700//      DDX_INT(IDC_REMOTEPORT, INI().remoteConfig().port)
701    END_DDX_MAP()
702
703    BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam )
704        {
705                return DoDataExchange(false);
706        }
707
708    int OnApply()
709        {
710                hal::event().post(shared_ptr<hal::EventDetail>(
711                        new hal::EventMsg(L"Applying remote options.", hal::Event::info)));
712
713                return DoDataExchange(true);
714        }
715};
716
717class AboutOptions :
718    public CPropertyPageImpl<AboutOptions>,
719        public CDialogResize<AboutOptions>
720{
721        typedef AboutOptions thisClass;
722        typedef CDialogResize<thisClass> resizeClass;
723
724public:
725    enum { IDD = IDD_ABOUT };
726
727    BEGIN_MSG_MAP_EX(thisClass)
728                MSG_WM_INITDIALOG(OnInitDialog)
729                CHAIN_MSG_MAP(resizeClass)
730        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
731    END_MSG_MAP()
732
733    BEGIN_DLGRESIZE_MAP(thisClass)
734                DLGRESIZE_CONTROL(IDC_RICHEDITABOUT, DLSZ_SIZE_X|DLSZ_SIZE_Y)
735                DLGRESIZE_CONTROL(IDC_ABOUT_VERSION, DLSZ_MOVE_X|DLSZ_MOVE_Y)
736        END_DLGRESIZE_MAP()
737
738    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
739        {
740                richEdit_.Attach(GetDlgItem(IDC_RICHEDITABOUT));
741
742                std::pair<void*, size_t> res = hal::app().res_find_lock(IDR_ABOUT_TEXT, HALITE_RTF_RES_TYPE);
743
744                string rtf(static_cast<char*>(res.first), res.second);
745                wstring wrtf = hal::from_utf8_safe(rtf);
746
747                richEdit_.SendMessage(WM_SETTEXT, 0, (LPARAM)wrtf.c_str());
748                richEdit_.SetSelNone();
749//              richEdit_.SetEventMask(ENM_REQUESTRESIZE);
750
751        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
752
753                return true;
754        }
755
756private:
757
758        CRichEditCtrl richEdit_;
759        RECT richRect_;
760};
761
762class ConfigOptionsProp :
763        public CPropertySheet,
764        public CDialogResize<ConfigOptionsProp>
765{
766        typedef ConfigOptionsProp thisClass;
767        typedef CDialogResize<thisClass> resizeClass;
768
769public:
770    ConfigOptionsProp(HaliteWindow* haliteWindow, LPCTSTR title = (LPCTSTR)NULL,
771                UINT uStartPage = 0, HWND hWndParent = NULL) :
772        CPropertySheet(title, uStartPage, hWndParent),
773                m_bCentered(false),
774                generalOptions(haliteWindow)
775    {
776                AddPage(generalOptions);
777                AddPage(bitTorrentOptions);
778                AddPage(securityOptions);
779                AddPage(torrentsOptions);
780        //      AddPage(remoteControlOptions);
781                AddPage(aboutOptions);
782    }
783
784    BEGIN_MSG_MAP_EX(ConfigOptionsProp)
785        MESSAGE_HANDLER(WM_SHOWWINDOW, OnShowWindow)
786                MSG_WM_SIZE(OnSize)
787                CHAIN_MSG_MAP(resizeClass)
788        CHAIN_MSG_MAP(CPropertySheet)
789    END_MSG_MAP()
790
791    BEGIN_DLGRESIZE_MAP(thisClass)
792                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
793
794                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
795                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
796                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
797        END_DLGRESIZE_MAP()
798
799        void OnSize(UINT, CSize)
800        {
801        SetMsgHandled(false);
802
803        HWND propTabs = GetDlgItem(0x3020);
804
805                RECT rect;
806                ::GetWindowRect(propTabs, &rect);
807
808                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
809                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
810
811                ::MoveWindow(GetActivePage(), rect.left, rect.top,
812            rect.right-rect.left, rect.bottom-rect.top, true);
813        }
814
815    LRESULT OnShowWindow(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
816    {
817        if (wParam == TRUE)
818        {
819            CMenuHandle pSysMenu = GetSystemMenu(FALSE);
820
821                if (pSysMenu != NULL)
822                pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
823
824            ModifyStyle(0, WS_THICKFRAME, 0);
825            Center();
826
827            resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
828        }
829               
830                bHandled = FALSE;
831               
832        return 0;
833    }
834
835    void Center(void)
836    {
837        if (!m_bCentered)
838        {
839            CenterWindow();
840            m_bCentered = true;
841        }
842    }
843
844private:
845    bool m_bCentered;
846
847        GeneralOptions generalOptions;
848        BitTorrentOptions bitTorrentOptions;
849        SecurityOptions securityOptions;
850        TorrentsOptions torrentsOptions;
851        RemoteOptions remoteControlOptions;
852        AboutOptions aboutOptions;
853};
854
855#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.