source: trunk/src/ConfigOptions.hpp @ 506

Revision 506, 72.9 KB checked in by Eoin, 12 years ago (diff)

Queue configuration applies correctly.

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 HAL_SECURITY_IPF_GB             ID_CONFIG_BEGIN + 1
11#define HAL_SECURITY_PE_GB                      ID_CONFIG_BEGIN + 2
12#define HAL_SECURITY_CP_GB                      ID_CONFIG_BEGIN + 3
13#define HAL_SECURITY_EL_GB                      ID_CONFIG_BEGIN + 4
14#define HAL_SECURITY_OUTGOING           ID_CONFIG_BEGIN + 5
15#define HAL_SECURITY_INCOMING           ID_CONFIG_BEGIN + 6
16#define HAL_SECURITY_ENABLED            ID_CONFIG_BEGIN + 7
17#define HAL_SECURITY_FORCED                     ID_CONFIG_BEGIN + 8
18#define HAL_SECURITY_DISABLED           ID_CONFIG_BEGIN + 9
19#define HAL_BITT_OPENPORT                       ID_CONFIG_BEGIN + 10
20#define HAL_BITT_GDHT                           ID_CONFIG_BEGIN + 11
21#define HAL_BITT_DHT_NOTE                       ID_CONFIG_BEGIN + 12
22#define HAL_BITT_GSETTINGS                      ID_CONFIG_BEGIN + 13
23#define HAL_BITT_SELECT_TEXT            ID_CONFIG_BEGIN + 14
24#define HAL_CONFIGT_TOTALMAX            ID_CONFIG_BEGIN + 15
25#define HAL_CONFIGT_TOTALUP                     ID_CONFIG_BEGIN + 16
26#define HAL_CONFIGT_DOWNRATE            ID_CONFIG_BEGIN + 17
27#define HAL_CONFIGT_UPRATE                      ID_CONFIG_BEGIN + 18
28#define HAL_CONFIGT_TORMAX                      ID_CONFIG_BEGIN + 19
29#define HAL_CONFIGT_TORUP                       ID_CONFIG_BEGIN + 20
30#define HAL_CONFIGT_TORDOWNRATE         ID_CONFIG_BEGIN + 21
31#define HAL_CONFIGT_TORUPRATE           ID_CONFIG_BEGIN + 22
32#define HAL_CONFIGT_GLOBAL_TEXT         ID_CONFIG_BEGIN + 23
33#define HAL_CONFIGT_TOR_TEXT            ID_CONFIG_BEGIN + 24
34#define HAL_CONFIGT_DEF_FOLDER          ID_CONFIG_BEGIN + 25
35#define HAL_CONFIGT_GLOBALG             ID_CONFIG_BEGIN + 26
36#define HAL_CONFIGT_TORRENTG            ID_CONFIG_BEGIN + 27
37#define HAL_CONFIGT_TDOWNRATE           ID_CONFIG_BEGIN + 28
38#define HAL_GENERAL_GROUP                       ID_CONFIG_BEGIN + 29
39#define HAL_GENERAL_LANG                        ID_CONFIG_BEGIN + 30
40#define HAL_GENERAL_CLOSETRAY           ID_CONFIG_BEGIN + 31
41#define HAL_GENERAL_CONFIRMCLOSE        ID_CONFIG_BEGIN + 32
42#define HAL_ABOUT_GROUP                 ID_CONFIG_BEGIN + 33
43#define HAL_ABOUT_VERSION               ID_CONFIG_BEGIN + 34
44#define HAL_BITT_GPORTFORWARDING        ID_CONFIG_BEGIN + 35
45#define HAL_BITT_GPORTFORWARD_NONE      ID_CONFIG_BEGIN + 36
46#define HAL_BITT_GPORTFORWARD_UPNG      ID_CONFIG_BEGIN + 37
47#define HAL_BIT_GPORTFORWARD_NATPMP     ID_CONFIG_BEGIN + 38
48#define HAL_BITT_GPORTFORWARD_TEST      ID_CONFIG_BEGIN + 39
49#define HAL_BITT_GPORTFORWARD_LIST      ID_CONFIG_BEGIN + 40
50#define HAL_BC_MOVETO_FOLDER            ID_CONFIG_BEGIN + 41
51#define HAL_BC_MOVETO_BROWSE            ID_CONFIG_BEGIN + 42
52#define HAL_BC_MOVETO_TEXT                      ID_CONFIG_BEGIN + 43
53#define HAL_BC_MOVETO_CHECK                     ID_CONFIG_BEGIN + 44
54#define HAL_BC_DHT_EXT                          ID_CONFIG_BEGIN + 45
55#define HAL_BC_METADATADHT_EXT          ID_CONFIG_BEGIN + 46
56#define HAL_BC_uT_METADATA_EXT          ID_CONFIG_BEGIN + 47
57#define HAL_BC_uT_PEEER_EX_EXT          ID_CONFIG_BEGIN + 48
58#define HAL_BC_SMART_BAN_PLUGIN_EXT     ID_CONFIG_BEGIN + 49
59#define HAL_BC_EXT_GROUP                        ID_CONFIG_BEGIN + 50
60
61#define HAL_CGLOBAL_QUEUEG                      ID_CONFIG_BEGIN + 51
62#define HAL_CGLOBAL_ACTDOWNT            ID_CONFIG_BEGIN + 52
63#define HAL_CGLOBAL_ACTDOWN                     ID_CONFIG_BEGIN + 53
64#define HAL_CGLOBAL_ACTSEEDT            ID_CONFIG_BEGIN + 54
65#define HAL_CGLOBAL_ACTSEED                     ID_CONFIG_BEGIN + 55
66#define HAL_CGLOBAL_DISCOUNTSLOW        ID_CONFIG_BEGIN + 56
67#define HAL_CGLOBAL_ACTSEEDHARDT        ID_CONFIG_BEGIN + 57
68#define HAL_CGLOBAL_ACTSEEDHARD         ID_CONFIG_BEGIN + 58
69#define HAL_CGLOBAL_SEEDINGG            ID_CONFIG_BEGIN + 59
70#define HAL_CGLOBAL_SHARERATIOT         ID_CONFIG_BEGIN + 60
71#define HAL_CGLOBAL_SHARERATIO          ID_CONFIG_BEGIN + 61
72#define HAL_CGLOBAL_SHARERATIOTIMET     ID_CONFIG_BEGIN + 62
73#define HAL_CGLOBAL_SHARERATIOTIME      ID_CONFIG_BEGIN + 63
74#define HAL_CGLOBAL_SHARETIMET          ID_CONFIG_BEGIN + 64
75#define HAL_CGLOBAL_SHARETIME           ID_CONFIG_BEGIN + 65
76
77#ifndef RC_INVOKED
78
79#include "stdAfx.hpp"
80
81#include "Halite.hpp"
82#include "halConfig.hpp"
83#include "HaliteWindow.hpp"
84#include "HaliteEditCtrl.hpp"
85
86#include "DdxEx.hpp"
87#include "CSSFileDialog.hpp"
88#include "AtlAutosizeDlg.h"
89
90class GeneralOptions :
91    public WTL::CPropertyPageImpl<GeneralOptions>,
92        public ATL::CAutoSizeWindow<GeneralOptions, false>,
93    public WTL::CWinDataExchange<GeneralOptions>
94{
95        typedef GeneralOptions thisClass;
96        typedef WTL::CPropertyPageImpl<thisClass> propPageClass;
97        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
98       
99public:
100    enum { IDD = HAL_CONFIGGENERAL };
101
102        GeneralOptions(HaliteWindow* haliteWindow) :
103                haliteWindow_(haliteWindow)
104        {}
105
106        ~GeneralOptions()
107        {}
108
109    BEGIN_MSG_MAP_EX(GeneralOptions)
110                MSG_WM_INITDIALOG(OnInitDialog)
111        CHAIN_MSG_MAP(CPropertyPageImpl<GeneralOptions>)
112        CHAIN_MSG_MAP(autosizeClass)
113    END_MSG_MAP()
114
115    BEGIN_DDX_MAP(GeneralOptions)
116        DDX_CHECK(HAL_GENERAL_ONEINST, halite().oneInst)
117        DDX_CHECK(HAL_GENERAL_TRAY, haliteWindow_->use_tray)
118        DDX_CHECK(HAL_GENERAL_ADVGUI, haliteWindow_->advancedUI)
119        DDX_CHECK(HAL_GENERAL_CLOSETRAY, haliteWindow_->closeToTray)
120        DDX_CHECK(HAL_GENERAL_CONFIRMCLOSE, haliteWindow_->confirmClose)
121    END_DDX_MAP()
122
123#define GENERAL_CONFIG_LAYOUT \
124        WMB_HEAD(WMB_COLNOMAX(_exp)), \
125                WMB_ROW(_gap,   _d), \
126                WMB_ROW(_auto,  HAL_GENERAL_ONEINST), \
127                WMB_ROW(_auto,  HAL_GENERAL_ADVGUI), \
128                WMB_ROW(_auto,  HAL_GENERAL_TRAY), \
129                WMB_ROW(_auto,  HAL_GENERAL_CLOSETRAY), \
130                WMB_ROW(_auto,  HAL_GENERAL_CONFIRMCLOSE), \
131        WMB_END()
132
133#define GENERAL_LANGUAGE_LAYOUT \
134        WMB_HEAD(WMB_COLNOMAX(_exp)), \
135                WMB_ROW(_auto,  HAL_GENERAL_LANG), \
136                WMB_ROW(_auto,  HAL_LANGLIST), \
137        WMB_END()
138
139        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
140                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
141                        WMB_ROW(_gap|3, HAL_GENERAL_GROUP, _r, _r, _r), 
142                        WMB_ROW(_auto,  _d, GENERAL_CONFIG_LAYOUT, GENERAL_LANGUAGE_LAYOUT), 
143                        WMB_ROW(_gap,   _d),
144                WMB_END()
145        END_WINDOW_MAP()       
146
147    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam);
148
149    int OnApply()
150        {       
151                hal::event_log.post(shared_ptr<hal::EventDetail>(
152                        new hal::EventMsg(L"Applying general options.", hal::event_logger::info)));
153
154                size_t length = lang_list_.GetTextLen(lang_list_.GetCurSel());
155                boost::scoped_array<wchar_t> buffer(new wchar_t[length+1]);
156               
157                lang_list_.GetText(lang_list_.GetCurSel(), buffer.get());
158                std::wstring language(buffer.get(), length);
159
160                if (language == L"English")
161                {
162                        halite().dll_ = L"";
163                        hal::app().res_revert();
164                }
165                else
166                {
167                        halite().dll_ = lang_map_[language].external_file_string();
168                        hal::app().res_set_dll(lang_map_[language].external_file_string());
169                }
170               
171                return DoDataExchange(true);
172        }
173
174private:
175        WTL::CListBox lang_list_;
176        std::map<wstring, wpath> lang_map_;
177        HaliteWindow* haliteWindow_;
178};
179
180class BitTorrentOptions :
181    public WTL::CPropertyPageImpl<BitTorrentOptions>,
182        public ATL::CAutoSizeWindow<BitTorrentOptions, false>,
183    public CWinDataExchangeEx<BitTorrentOptions>
184{
185        typedef BitTorrentOptions thisClass;
186        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
187       
188public:
189    enum { IDD = HAL_CONFIGBIT };
190
191        BitTorrentOptions()
192        {}
193
194    BEGIN_MSG_MAP_EX(thisClass)
195        MSG_WM_INITDIALOG(OnInitDialog)
196               
197        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
198        CHAIN_MSG_MAP(autosizeClass)
199    END_MSG_MAP()
200
201    BEGIN_DDX_MAP(thisClass)
202        DDX_CHECK(HAL_BC_PORTCHECK, hal::config().portRange)
203        DDX_INT(HAL_BC_PORTFROM, hal::config().portFrom)
204        DDX_INT(HAL_BC_PORTTO, hal::config().portTo)           
205        DDX_CHECK(HAL_BC_HALFCONN_CHECK, hal::config().halfConn)
206        DDX_EX_INT_POSITIVE(HAL_BC_HALFCONN_NUM, hal::config().halfConnLimit)
207        DDX_CHECK(HAL_BC_DHT, hal::config().enableDHT)
208        DDX_INT(HAL_BC_DHTPORT, hal::config().dhtServicePort)
209        DDX_RADIO(HAL_BITT_GPORTFORWARD_NONE, hal::config().mappingType)
210    END_DDX_MAP()
211
212#define BITT_EXT_LAYOUT \
213                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
214                WMB_ROW(_gap|3, HAL_BC_EXT_GROUP, _r, _r), \
215                WMB_ROW(_auto,  _d, HAL_BC_METADATADHT_EXT), \
216                WMB_ROW(_auto,  _d, HAL_BC_uT_METADATA_EXT), \
217                WMB_ROW(_auto,  _d, HAL_BC_uT_PEEER_EX_EXT), \
218                WMB_ROW(_auto,  _d, HAL_BC_SMART_BAN_PLUGIN_EXT), \
219                WMB_ROW(_gap,   _d), \
220        WMB_END()
221
222        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
223                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
224                        WMB_ROW(_auto,  BITT_EXT_LAYOUT, _r, _r), 
225                        WMB_ROW(_gap,   _d),
226                WMB_END()
227        END_WINDOW_MAP()
228
229    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
230        {                       
231                BOOL retval = DoDataExchange(false);
232
233                autosizeClass::CtrlsArrange();
234                return retval;
235        }
236
237    int OnApply()
238        {
239                hal::event_log.post(shared_ptr<hal::EventDetail>(
240                        new hal::EventMsg(L"Applying bittorrent options.", hal::event_logger::info)));
241
242
243                return DoDataExchange(true);
244        }
245
246
247private:
248//      WTL::CHyperLink helpLink;
249//      WTL::CHyperLink whyHalfConn;
250};
251
252class PortOptions :
253    public WTL::CPropertyPageImpl<PortOptions>,
254        public ATL::CAutoSizeWindow<PortOptions, false>,
255    public CWinDataExchangeEx<PortOptions>
256{
257        typedef PortOptions thisClass;
258        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
259       
260public:
261    enum { IDD = HAL_CONFIGPORTS };
262
263        PortOptions()
264        {}
265
266    BEGIN_MSG_MAP_EX(thisClass)
267        MSG_WM_INITDIALOG(OnInitDialog)
268                COMMAND_ID_HANDLER_EX(HAL_BC_PORTCHECK, onPortCheck)
269                COMMAND_ID_HANDLER_EX(HAL_BC_HALFCONN_CHECK, onHalfCheck)
270                COMMAND_ID_HANDLER_EX(HAL_BC_DHT, onDHTCheck)
271               
272        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
273        CHAIN_MSG_MAP(autosizeClass)
274    END_MSG_MAP()
275
276    BEGIN_DDX_MAP(thisClass)
277        DDX_CHECK(HAL_BC_PORTCHECK, hal::config().portRange)
278        DDX_INT(HAL_BC_PORTFROM, hal::config().portFrom)
279        DDX_INT(HAL_BC_PORTTO, hal::config().portTo)           
280        DDX_CHECK(HAL_BC_HALFCONN_CHECK, hal::config().halfConn)
281        DDX_EX_INT_POSITIVE(HAL_BC_HALFCONN_NUM, hal::config().halfConnLimit)
282        DDX_CHECK(HAL_BC_DHT, hal::config().enableDHT)
283        DDX_INT(HAL_BC_DHTPORT, hal::config().dhtServicePort)
284        DDX_RADIO(HAL_BITT_GPORTFORWARD_NONE, hal::config().mappingType)
285    END_DDX_MAP()
286       
287#define BITT_GS_LAYOUT \
288        WMB_HEAD(WMB_COLNOMAX(_exp|250), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
289                WMB_ROW(_auto,  HAL_BITT_SELECT_TEXT, _r, _r, _r), \
290                WMB_ROW(_auto,  HAL_BITT_OPENPORT, HAL_BC_PORTFROM, HAL_BC_PORTCHECK, HAL_BC_PORTTO), \
291                WMB_ROW(_auto,  HAL_BC_HALFCONN_CHECK, _r, HAL_BC_HALFCONN_NUM), \
292        WMB_END()
293
294#define BITT_DHT_LAYOUT \
295        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
296                WMB_ROW(_auto,  HAL_BC_DHT, HAL_BITT_DHT_NOTE, _r), \
297                WMB_ROW(_auto,  HAL_BC_DHT_EXT, HAL_BC_DHTPORT_S, HAL_BC_DHTPORT), \
298        WMB_END()
299
300#define BITT_FOR_LAYOUT \
301        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
302                WMB_ROW(_gap|3, HAL_BITT_GPORTFORWARDING, _r, _r, _r),\
303                WMB_ROW(_auto,  _d, HAL_BITT_GPORTFORWARD_NONE, _r), \
304                WMB_ROW(_auto,  _d, HAL_BITT_GPORTFORWARD_UPNG, HAL_BITT_GPORTFORWARD_TEST), \
305                WMB_ROW(_auto,  _d, HAL_BIT_GPORTFORWARD_NATPMP, _r), \
306                WMB_ROW(_gap,   _d), \
307        WMB_END()
308
309        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
310                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)),
311                        WMB_ROW(_gap|3, HAL_BITT_GSETTINGS, _r, _r), 
312                        WMB_ROW(_auto,  _d, BITT_GS_LAYOUT),
313                        WMB_ROW(_gap,   _d),
314                        WMB_ROW(_gap|3, HAL_BITT_GDHT, _r, _r,  HAL_BITT_GDHT, _r, _r),
315                        WMB_ROW(_auto,  _d, BITT_DHT_LAYOUT), 
316                        WMB_ROW(_gap,   _d),
317                        WMB_ROW(_auto,  BITT_FOR_LAYOUT, _r, _r), 
318                        WMB_ROW(_gap,   _d),
319                WMB_END()
320        END_WINDOW_MAP()
321
322    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
323        {       
324//              helpLink.SubclassWindow(GetDlgItem(HAL_BC_EXT_GROUP));
325//              helpLink.SetHyperLink(L"http://www.binarynotions.com/");
326               
327//              whyHalfConn.SubclassWindow(GetDlgItem(HAL_BC_CON_WHY));
328//              whyHalfConn.SetHyperLink(L"http://www.binarynotions.com/");
329               
330                BOOL retval = DoDataExchange(false);
331
332                onHalfCheck(0, 0, GetDlgItem(HAL_BC_HALFCONN_CHECK));
333                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
334                onDHTCheck(0, 0, GetDlgItem(HAL_BC_DHT));
335
336                autosizeClass::CtrlsArrange();
337                return retval;
338        }
339
340    int OnApply()
341        {
342                hal::event_log.post(shared_ptr<hal::EventDetail>(
343                        new hal::EventMsg(L"Applying bittorrent options.", hal::event_logger::info)));
344
345                onPortCheck(0, 0, GetDlgItem(HAL_BC_PORTCHECK));
346
347                return DoDataExchange(true);
348        }
349
350        void onDHTCheck(UINT, int, HWND hWnd)
351        {
352                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
353
354                if (result == BST_CHECKED)
355                {
356                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), true);
357                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), true);
358                }
359                else
360                {
361                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT), false);
362                        ::EnableWindow(GetDlgItem(HAL_BC_DHTPORT_S), false);
363                }
364        }
365
366        void onPortCheck(UINT, int, HWND hWnd)
367        {
368                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
369
370                if (result == BST_CHECKED)
371                {
372                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), true);
373                }
374                else
375                {
376                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
377                        boost::array<wchar_t, MAX_PATH> buffer;
378                        GetDlgItemText(HAL_BC_PORTFROM, buffer.elems, MAX_PATH);
379                        SetDlgItemText(HAL_BC_PORTTO, buffer.elems);
380                }
381        }
382
383        void onHalfCheck(UINT, int, HWND hWnd)
384        {
385                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
386
387                if (result == BST_CHECKED)
388                {
389                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), true);
390                }
391                else
392                {
393                        ::EnableWindow(GetDlgItem(HAL_BC_HALFCONN_NUM), false);
394                        SetDlgItemText(HAL_BC_HALFCONN_NUM, L"");
395                }
396        }
397
398private:
399//      WTL::CHyperLink helpLink;
400//      WTL::CHyperLink whyHalfConn;
401};
402
403class ProxyOptions :
404    public WTL::CPropertyPageImpl<ProxyOptions>,
405    public CWinDataExchangeEx<ProxyOptions>
406{
407public:
408    enum { IDD = HAL_CONFIGPROXY };
409
410        ProxyOptions()
411        {}
412
413        ~ProxyOptions()
414        {}
415
416    BEGIN_MSG_MAP_EX(ProxyOptions)
417        MSG_WM_INITDIALOG(OnInitDialog)
418                COMMAND_ID_HANDLER_EX(HAL_BC_PROXYCHECK, onProxyCheck)
419        CHAIN_MSG_MAP(CPropertyPageImpl<ProxyOptions>)
420    END_MSG_MAP()
421
422    BEGIN_DDX_MAP(ProxyOptions)
423       
424    END_DDX_MAP()
425
426    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
427        {
428                BOOL retval =  DoDataExchange(false);
429
430                onProxyCheck(0, 0, GetDlgItem(HAL_BC_PROXYCHECK));
431
432                return retval;
433        }
434
435    int OnApply()
436        {
437                hal::event_log.post(shared_ptr<hal::EventDetail>(
438                        new hal::EventMsg(L"Applying proxy options.", hal::event_logger::info)));
439
440                return DoDataExchange(true);
441        }
442
443        void onPortCheck(UINT, int, HWND hWnd)
444        {
445                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
446
447                if (result == BST_CHECKED)
448                {
449                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), true);
450                }
451                else
452                {
453                        ::EnableWindow(GetDlgItem(HAL_BC_PORTTO), false);
454                        boost::array<wchar_t, MAX_PATH> buffer;
455                        GetDlgItemText(HAL_BC_PORTFROM, buffer.elems, MAX_PATH);
456                        SetDlgItemText(HAL_BC_PORTTO, buffer.elems);
457                }
458        }
459
460        void onProxyCheck(UINT, int, HWND hWnd)
461        {
462                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
463
464                if (result == BST_CHECKED)
465                {
466                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), true);
467                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), true);
468                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), true);
469                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), true);
470                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), true);
471                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), true);
472                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), true);
473                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), true);
474                }
475                else
476                {
477                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP), false);
478                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT), false);
479                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER), false);
480                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS), false);
481                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYIP_S), false);
482                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPORT_S), false);
483                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYUSER_S), false);
484                        ::EnableWindow(GetDlgItem(HAL_BC_PROXYPASS_S), false);
485                }
486        }
487};
488
489class SecurityOptions :
490    public WTL::CPropertyPageImpl<SecurityOptions>,
491        public ATL::CAutoSizeWindow<SecurityOptions, false>,
492    public CWinDataExchangeEx<SecurityOptions>
493{
494        typedef SecurityOptions thisClass;
495        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
496       
497public:
498    enum { IDD = HAL_CONFIGSECURITY };
499
500    BEGIN_MSG_MAP_EX(thisClass)
501        MSG_WM_INITDIALOG(OnInitDialog)
502               
503                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERLOAD, onFilterImport)
504                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCLEAR, onFilterClear)
505                COMMAND_ID_HANDLER_EX(HAL_BC_FILTERCHECK, onFilterCheck)
506               
507                COMMAND_ID_HANDLER_EX(HAL_SC_ENABLE_PE, onPeCheck)
508               
509        CHAIN_MSG_MAP(autosizeClass)
510        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
511//              MSG_WM_SIZE(OnSize)
512    END_MSG_MAP()
513
514    BEGIN_DDX_MAP(thisClass)
515        DDX_CHECK(HAL_BC_FILTERCHECK, hal::config().enableIPFilter)
516        DDX_CHECK(HAL_SC_ENABLE_PE, hal::config().enablePe)
517        DDX_RADIO(HAL_SC_PE_ENC_PLAIN, hal::config().peEncLevel)
518        DDX_CHECK(HAL_SC_PE_ENC_RC4_PERFER, hal::config().pePerferRc4)
519        DDX_RADIO(HAL_SC_PE_CP_IN_FORCED, hal::config().peConInPolicy)
520        DDX_RADIO(HAL_SC_PE_CP_OUT_FORCED, hal::config().peConOutPolicy)
521    END_DDX_MAP()
522       
523/*      void OnSize(UINT type, CSize)
524        {
525               
526                SetMsgHandled(false);
527        }
528*/
529#define SECURITY_IPF_LAYOUT \
530        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp)), \
531                WMB_ROW(_auto,  HAL_BC_FILTERCHECK,     HAL_BC_FILTERCLEAR, HAL_BC_FILTERLOAD), \
532        WMB_END()
533
534#define SECURITY_ENCODING_LAYOUT \
535        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
536                WMB_ROW(_auto,  HAL_SC_ENABLE_PE,       _r,_r,_r), \
537                WMB_ROW(_gap|3, HAL_SECURITY_EL_GB,     _r,_r,_r), \
538                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_PLAIN, _r), \
539                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_RC4, _r), \
540                WMB_ROW(_auto,  _d,     HAL_SC_PE_ENC_BOTH, HAL_SC_PE_ENC_RC4_PERFER), \
541                WMB_ROW(_gap,   _d), \
542        WMB_END()
543
544#define SECURITY_CONNECTION_LAYOUT \
545        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp), WMB_COL(_gap)), \
546                WMB_ROW(_gap|4, HAL_SECURITY_CP_GB,     _r, _r, _r, _r, _r), \
547                WMB_ROW(_auto,  _d,     HAL_SECURITY_INCOMING, _r, HAL_SECURITY_OUTGOING, _r), \
548                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_FORCED, HAL_SECURITY_FORCED, _r, HAL_SC_PE_CP_OUT_FORCED), \
549                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_ENABLED, HAL_SECURITY_ENABLED, _r, HAL_SC_PE_CP_OUT_ENABLED), \
550                WMB_ROW(_auto,  _d,     HAL_SC_PE_CP_IN_DISABLED, HAL_SECURITY_DISABLED, _r, HAL_SC_PE_CP_OUT_DISABLED), \
551                WMB_ROW(_gap,   _d), \
552        WMB_END()
553       
554#define SECURITY_PE_LAYOUT \
555        WMB_HEAD(WMB_COLNOMAX(_exp|150), WMB_COLNOMAX(_exp)), \
556                WMB_ROW(_auto,  SECURITY_ENCODING_LAYOUT, SECURITY_CONNECTION_LAYOUT), \
557        WMB_END()
558
559        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
560                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
561                        WMB_ROW(_gap|3, HAL_SECURITY_IPF_GB, _r, _r), 
562                        WMB_ROW(_auto,  _d, SECURITY_IPF_LAYOUT), 
563                        WMB_ROW(_gap,   _d), 
564                        WMB_ROW(_gap|3, HAL_SECURITY_PE_GB, _r, _r), 
565                        WMB_ROW(_auto,  _d, SECURITY_PE_LAYOUT),
566                        WMB_ROW(_gap,   _d),
567                WMB_END()
568        END_WINDOW_MAP()       
569
570    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
571        {
572        //      helpLink.SubclassWindow(GetDlgItem(HAL_SC_HELP_LINK));
573        //      helpLink.SetHyperLink(L"http://www.binarynotions.com/");
574
575                BOOL retval =  DoDataExchange(false);
576
577                onFilterCheck(0, 0, GetDlgItem(HAL_BC_FILTERCHECK));
578                onPeCheck(0, 0, GetDlgItem(HAL_SC_ENABLE_PE));
579
580                autosizeClass::CtrlsArrange();
581                return retval;
582        }
583
584    int OnApply()
585        {
586                hal::event_log.post(shared_ptr<hal::EventDetail>(
587                        new hal::EventMsg(L"Applying security options.", hal::event_logger::info)));
588
589                return DoDataExchange(true);
590        }
591
592        void onFilterCheck(UINT, int, HWND hWnd)
593        {
594                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
595
596                if (result == BST_CHECKED)
597                {
598                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), true);
599                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), true);
600                }
601                else
602                {
603                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERCLEAR), false);
604                        ::EnableWindow(GetDlgItem(HAL_BC_FILTERLOAD), false);
605                }
606        }
607
608        void onPeCheck(UINT, int, HWND hWnd)
609        {
610                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
611
612                if (result == BST_CHECKED)
613                {
614                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), true);
615                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), true);
616                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), true);
617                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), true);
618                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), true);
619                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), true);
620                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), true);
621                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), true);
622                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), true);
623                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), true);
624                }
625                else
626                {
627                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_BOTH), false);
628                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4), false);
629                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_PLAIN), false);
630                        ::EnableWindow(GetDlgItem(HAL_SC_PE_ENC_RC4_PERFER), false);
631                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_FORCED), false);
632                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_DISABLED), false);
633                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_IN_ENABLED), false);
634                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_DISABLED), false);
635                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_ENABLED), false);
636                        ::EnableWindow(GetDlgItem(HAL_SC_PE_CP_OUT_FORCED), false);
637                }
638        }
639
640        void onFilterClear(UINT, int, HWND hWnd)
641        {
642                hal::bittorrent().clear_ip_filter();
643        }
644
645        void onFilterImport(UINT, int, HWND hWnd);
646
647private:
648        WTL::CHyperLink helpLink;
649};
650
651class GlobalOptions :
652    public WTL::CPropertyPageImpl<GlobalOptions>,
653        public ATL::CAutoSizeWindow<GlobalOptions, false>,
654    public CWinDataExchangeEx<GlobalOptions>
655{
656        typedef GlobalOptions thisClass;
657        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
658public:
659    enum { IDD = HAL_CONFIGGLOBAL };
660       
661        GlobalOptions() :
662                gTotalConnections_(0, false, false),
663                gUploadConnections_(0, false, false),
664                gDownloadRate_(0, false, false),
665                gUploadRate_(0, false, false)
666        {}
667
668    BEGIN_MSG_MAP_EX(thisClass)
669        MSG_WM_INITDIALOG(OnInitDialog)
670
671        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
672        CHAIN_MSG_MAP(autosizeClass)
673           REFLECT_NOTIFICATIONS()
674    END_MSG_MAP()
675       
676#define CONFIGT_GLOBAL_LAYOUT \
677        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
678                WMB_ROW(_auto,  HAL_CONFIGT_GLOBAL_TEXT, _r, _r, _r), \
679                WMB_ROW(_auto,  HAL_CONFIGT_TOTALMAX, HAL_BC_MAXCONN, HAL_CONFIGT_DOWNRATE, HAL_BC_DOWNRATE), \
680                WMB_ROW(_auto,  HAL_CONFIGT_TOTALUP, HAL_BC_MAXUP, HAL_CONFIGT_UPRATE, HAL_BC_UPRATE), \
681        WMB_END()
682
683#define CONFIGT_ACTIVE_LAYOUT \
684        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|70)), \
685                WMB_ROW(_gap|3), \
686                WMB_ROW(_auto, HAL_CGLOBAL_ACTDOWNT, HAL_CGLOBAL_ACTDOWN), \
687                WMB_ROW(_auto, HAL_CGLOBAL_ACTSEEDT, HAL_CGLOBAL_ACTSEED), \
688                WMB_ROW(_auto, HAL_CGLOBAL_ACTSEEDHARDT, HAL_CGLOBAL_ACTSEEDHARD), \
689        WMB_END()
690
691#define CONFIGT_SEEDING_LAYOUT \
692        WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|70), WMB_COL(_gap)), \
693                WMB_ROW(_gap|3, HAL_CGLOBAL_SEEDINGG, _r, _r, _r), \
694                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARERATIOT, HAL_CGLOBAL_SHARERATIO), \
695                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARERATIOTIMET, HAL_CGLOBAL_SHARERATIOTIME), \
696                WMB_ROW(_auto,  _d, HAL_CGLOBAL_SHARETIMET, HAL_CGLOBAL_SHARETIME), \
697                WMB_ROW(_gap,   _d), \
698        WMB_END()
699
700#define CONFIGT_QUEUE_LAYOUT \
701        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COL(_gap), WMB_COLNOMAX(_exp)), \
702                WMB_ROW(_auto, CONFIGT_ACTIVE_LAYOUT, 0,  CONFIGT_SEEDING_LAYOUT), \
703                WMB_ROW(_auto, HAL_CGLOBAL_DISCOUNTSLOW, _r, _r), \
704        WMB_END()
705
706        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
707                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
708                        WMB_ROW(_gap|3, HAL_CONFIGT_GLOBALG, _r, _r), 
709                        WMB_ROW(_auto,  _d, CONFIGT_GLOBAL_LAYOUT), 
710                        WMB_ROW(_gap,   _d),
711                        WMB_ROW(_gap|3, HAL_CGLOBAL_QUEUEG, _r, _r), 
712                        WMB_ROW(_auto,  _d, CONFIGT_QUEUE_LAYOUT), 
713                        WMB_ROW(_gap,   _d),
714                WMB_END()
715        END_WINDOW_MAP()
716
717    BEGIN_DDX_MAP(thisClass)
718        DDX_CHECK(HAL_CGLOBAL_DISCOUNTSLOW, hal::config().queue_settings_.dont_count_slow_torrents);
719    END_DDX_MAP()       
720
721    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
722        {
723                gTotalConnections_.Attach(GetDlgItem(HAL_BC_MAXCONN));
724                gUploadConnections_.Attach(GetDlgItem(HAL_BC_MAXUP));
725                gDownloadRate_.Attach(GetDlgItem(HAL_BC_DOWNRATE));
726                gUploadRate_.Attach(GetDlgItem(HAL_BC_UPRATE));
727
728                gTotalConnections_ = hal::config().maxConnections;
729                gUploadConnections_ = hal::config().maxUploads;
730                gDownloadRate_ = hal::config().downRate;
731                gUploadRate_ = hal::config().upRate;
732
733                active_downloads_.Attach(GetDlgItem(HAL_CGLOBAL_ACTDOWN));
734                active_seeds_.Attach(GetDlgItem(HAL_CGLOBAL_ACTSEED));
735                seeds_hard_limit_.Attach(GetDlgItem(HAL_CGLOBAL_ACTSEEDHARD));
736
737                seed_ratio_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARERATIO));
738                seed_ratio_time_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARERATIOTIME));
739                seed_time_limit_.Attach(GetDlgItem(HAL_CGLOBAL_SHARETIME));             
740       
741                active_downloads_ = hal::config().queue_settings_.active_downloads;
742                active_seeds_ = hal::config().queue_settings_.active_seeds;
743                seeds_hard_limit_ = hal::config().queue_settings_.seeds_hard_limit;
744                seed_ratio_limit_ = hal::config().queue_settings_.seed_ratio_limit;
745                seed_ratio_time_limit_ = hal::config().queue_settings_.seed_ratio_time_limit;
746                seed_time_limit_ = hal::config().queue_settings_.seed_time_limit;
747
748                BOOL retval =  DoDataExchange(false);
749
750                autosizeClass::CtrlsArrange();
751                return retval;
752        }
753
754    int OnApply()
755        {
756                hal::event_log.post(shared_ptr<hal::EventDetail>(
757                        new hal::EventMsg(L"Applying torrent options.", hal::event_logger::info)));
758
759                hal::config().maxConnections = gTotalConnections_;
760                hal::config().maxUploads = gUploadConnections_;
761                hal::config().downRate = gDownloadRate_;
762                hal::config().upRate = gUploadRate_;
763       
764                hal::config().queue_settings_.active_downloads = active_downloads_;
765                hal::config().queue_settings_.active_seeds = active_seeds_;
766                hal::config().queue_settings_.seeds_hard_limit = seeds_hard_limit_;
767                hal::config().queue_settings_.seed_ratio_limit = seed_ratio_limit_;
768                hal::config().queue_settings_.seed_ratio_time_limit = seed_ratio_time_limit_;
769                hal::config().queue_settings_.seed_time_limit = seed_time_limit_;
770               
771                return DoDataExchange(true);
772        }
773       
774private:
775        CHaliteEditCtrl<int> gTotalConnections_;
776        CHaliteEditCtrl<int> gUploadConnections_;
777        CHaliteEditCtrl<float> gDownloadRate_;
778        CHaliteEditCtrl<float> gUploadRate_;
779
780        CHaliteEditCtrl<int> active_downloads_;
781        CHaliteEditCtrl<int> active_seeds_;
782        CHaliteEditCtrl<int> seeds_hard_limit_;
783        CHaliteEditCtrl<float> seed_ratio_limit_;
784        CHaliteEditCtrl<float> seed_ratio_time_limit_;
785        CHaliteEditCtrl<int> seed_time_limit_;
786};
787
788class TorrentsOptions :
789    public WTL::CPropertyPageImpl<TorrentsOptions>,
790        public ATL::CAutoSizeWindow<TorrentsOptions, false>,
791    public CWinDataExchangeEx<TorrentsOptions>
792{
793        typedef TorrentsOptions thisClass;
794        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
795public:
796    enum { IDD = HAL_CONFIGTORRENT };
797       
798        TorrentsOptions() :
799                tTotalConnections_(0, false, false),
800                tUploadConnections_(0, false, false),
801                tDownloadRate_(0, false, false),
802                tUploadRate_(0, false, false)
803        {}
804
805    BEGIN_MSG_MAP_EX(TorrentsOptions)
806        MSG_WM_INITDIALOG(OnInitDialog)
807
808                COMMAND_ID_HANDLER_EX(HAL_BC_SAVEBROWSE, onFolderBrowse)
809                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_BROWSE, onMoveToFolderBrowse)
810                COMMAND_ID_HANDLER_EX(HAL_BC_MOVETO_CHECK, onMoveToCheck)
811
812        CHAIN_MSG_MAP(CPropertyPageImpl<TorrentsOptions>)
813        CHAIN_MSG_MAP(autosizeClass)
814           REFLECT_NOTIFICATIONS()
815    END_MSG_MAP()
816
817#define CONFIGT_TORRENT_LAYOUT \
818        WMB_HEAD(WMB_COLNOMAX(_exp), WMB_COLNOMAX(_exp|30), WMB_COLNOMAX(_eq|0), WMB_COLNOMAX(_eq|1)), \
819                WMB_ROW(_auto,  HAL_CONFIGT_TOR_TEXT, _r, _r, _r), \
820                WMB_ROW(_auto,  HAL_CONFIGT_TORMAX, HAL_BC_TMAXCONN, HAL_CONFIGT_TDOWNRATE, HAL_BC_TDOWNRATE), \
821                WMB_ROW(_auto,  HAL_CONFIGT_TORUP, HAL_BC_TMAXUP, HAL_CONFIGT_TORUPRATE, HAL_BC_TUPRATE), \
822        WMB_END()
823
824#define CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT \
825        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMAX(_exp|50)), \
826                WMB_ROW(_auto,  HAL_BC_MOVETO_CHECK, HAL_BC_MOVETO_TEXT), \
827        WMB_END()
828
829#define CONFIGT_TORRENT_FOLDER_LAYOUT \
830        WMB_HEAD( WMB_COLNOMAX(_exp|50), WMB_COLNOMAX(_exp), WMB_COLNOMAX(_auto)), \
831                WMB_ROW(_auto,  HAL_CONFIGT_DEF_FOLDER, HAL_BC_SAVEFOLDER, HAL_BC_SAVEBROWSE), \
832                WMB_ROW(_auto,  CONFIGT_TORRENT_FOLDER_MOVETO_LAYOUT, HAL_BC_MOVETO_FOLDER, HAL_BC_MOVETO_BROWSE), \
833                WMB_ROW(_auto, 0, HAL_BC_PROMPTSAVE, _r), \
834        WMB_END()
835
836        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
837                WMB_HEAD(WMB_COL(_gap), WMB_COLNOMAX(_exp), WMB_COL(_gap)), 
838                        WMB_ROW(_gap|3, HAL_CONFIGT_TORRENTG, _r, _r),
839                        WMB_ROW(_auto,  _d, CONFIGT_TORRENT_LAYOUT),
840                        WMB_ROW(_gap,   _d),
841                        WMB_ROW(_auto,  CONFIGT_TORRENT_FOLDER_LAYOUT, _r, _r), 
842                WMB_END()
843        END_WINDOW_MAP()
844
845    BEGIN_DDX_MAP(TorrentsOptions)
846/*      DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXCONN, hal::config().maxConnections, 2, true)
847        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_MAXUP, hal::config().maxUploads, 2, true)
848        DDX_EX_FLOAT_POSITIVE(HAL_BC_DOWNRATE, hal::config().downRate)
849        DDX_EX_FLOAT_POSITIVE(HAL_BC_UPRATE, hal::config().upRate)
850
851        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXCONN, hal::config().torrentMaxConnections, 2, true)
852        DDX_EX_INT_POSITIVE_LIMIT(HAL_BC_TMAXUP, hal::config().torrentMaxUploads, 2, true)
853        DDX_EX_FLOAT_POSITIVE(HAL_BC_TDOWNRATE, hal::config().torrentDownRate)
854        DDX_EX_FLOAT_POSITIVE(HAL_BC_TUPRATE, hal::config().torrentUpRate)
855*/
856                DDX_EX_STDWSTRING(HAL_BC_SAVEFOLDER, hal::config().defaultSaveFolder);
857                DDX_EX_STDWSTRING(HAL_BC_MOVETO_FOLDER, hal::config().defaultMoveToFolder);
858        DDX_CHECK(HAL_BC_MOVETO_CHECK, hal::config().useMoveTo);
859        DDX_CHECK(HAL_BC_PROMPTSAVE, hal::config().savePrompt);
860    END_DDX_MAP()       
861
862    BOOL OnInitDialog(HWND hwndFocus, LPARAM lParam)
863        {
864                tTotalConnections_.Attach(GetDlgItem(HAL_BC_TMAXCONN));
865                tUploadConnections_.Attach(GetDlgItem(HAL_BC_TMAXUP));
866                tDownloadRate_.Attach(GetDlgItem(HAL_BC_TDOWNRATE));
867                tUploadRate_.Attach(GetDlgItem(HAL_BC_TUPRATE));
868       
869                tTotalConnections_ = hal::config().torrentMaxConnections;
870                tUploadConnections_ = hal::config().torrentMaxUploads;
871                tDownloadRate_ = hal::config().torrentDownRate;
872                tUploadRate_ = hal::config().torrentUpRate;
873       
874                BOOL retval =  DoDataExchange(false);
875                onMoveToCheck(0, 0, GetDlgItem(HAL_BC_MOVETO_CHECK));
876
877                autosizeClass::CtrlsArrange();
878                return retval;
879        }
880
881        void onFolderBrowse(UINT, int, HWND hWnd)
882        {               
883                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
884
885                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
886                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
887
888                if (IDOK == fldDlg.DoModal())
889                        SetDlgItemText(HAL_BC_SAVEFOLDER, fldDlg.m_szFolderPath);
890        }
891
892        void onMoveToFolderBrowse(UINT, int, HWND hWnd)
893        {               
894                wstring folderSelect = hal::app().res_wstr(HAL_FOLDER_SELECT);
895
896                WTL::CFolderDialog fldDlg (NULL, folderSelect.c_str(),
897                        BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
898
899                if (IDOK == fldDlg.DoModal())
900                        SetDlgItemText(HAL_BC_MOVETO_FOLDER, fldDlg.m_szFolderPath);
901        }
902
903        void onMoveToCheck(UINT, int, HWND hWnd)
904        {
905                LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0);
906
907                if (result == BST_CHECKED)
908                {
909                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), true);
910                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), true);
911                }
912                else
913                {
914                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_FOLDER), false);
915                        ::EnableWindow(GetDlgItem(HAL_BC_MOVETO_BROWSE), false);
916                }               
917        }
918
919    int OnApply()
920        {
921                hal::event_log.post(shared_ptr<hal::EventDetail>(
922                        new hal::EventMsg(L"Applying torrent options.", hal::event_logger::info)));
923
924                hal::config().torrentMaxConnections = tTotalConnections_;
925                hal::config().torrentMaxUploads = tUploadConnections_;
926                hal::config().torrentDownRate = tDownloadRate_;
927                hal::config().torrentUpRate = tUploadRate_;
928               
929                return DoDataExchange(true);
930        }
931       
932private:       
933        CHaliteEditCtrl<int> tTotalConnections_;
934        CHaliteEditCtrl<int> tUploadConnections_;
935        CHaliteEditCtrl<float> tDownloadRate_;
936        CHaliteEditCtrl<float> tUploadRate_;
937};
938
939class RemoteOptions :
940    public WTL::CPropertyPageImpl<RemoteOptions>,
941    public WTL::CWinDataExchange<RemoteOptions>
942{
943public:
944    enum { IDD = HAL_CONFIGREMOTE };
945
946        RemoteOptions()
947        {}
948
949        ~RemoteOptions()
950        {}
951
952    BEGIN_MSG_MAP_EX(RemoteOptions)
953                MSG_WM_INITDIALOG(OnInitDialog)
954        CHAIN_MSG_MAP(CPropertyPageImpl<RemoteOptions>)
955    END_MSG_MAP()
956
957    BEGIN_DDX_MAP(RemoteOptions)
958//      DDX_CHECK(HAL_REMOTECTRL, INI().remoteConfig().isEnabled)
959//      DDX_INT(HAL_REMOTEPORT, INI().remoteConfig().port)
960    END_DDX_MAP()
961
962    BOOL OnInitDialog ( HWND hwndFocus, LPARAM lParam )
963        {
964                return DoDataExchange(false);
965        }
966
967    int OnApply()
968        {
969                hal::event_log.post(shared_ptr<hal::EventDetail>(
970                        new hal::EventMsg(L"Applying remote options.", hal::event_logger::info)));
971
972                return DoDataExchange(true);
973        }
974};
975
976class AboutOptions :
977    public WTL::CPropertyPageImpl<AboutOptions>,
978        public WTL::CDialogResize<AboutOptions>
979{
980        typedef AboutOptions thisClass;
981        typedef WTL::CDialogResize<thisClass> resizeClass;
982
983public:
984    enum { IDD = HAL_ABOUT };
985
986    BEGIN_MSG_MAP_EX(thisClass)
987                MSG_WM_INITDIALOG(OnInitDialog)
988                CHAIN_MSG_MAP(resizeClass)
989        CHAIN_MSG_MAP(CPropertyPageImpl<thisClass>)
990    END_MSG_MAP()
991
992    BEGIN_DLGRESIZE_MAP(thisClass)
993                DLGRESIZE_CONTROL(HAL_RICHEDITABOUT, DLSZ_SIZE_X|DLSZ_SIZE_Y)
994                DLGRESIZE_CONTROL(HAL_ABOUT_VERSION, DLSZ_MOVE_X|DLSZ_MOVE_Y)
995        END_DLGRESIZE_MAP()
996
997    BOOL OnInitDialog (HWND hwndFocus, LPARAM lParam)
998        {
999                richEdit_.Attach(GetDlgItem(HAL_RICHEDITABOUT));
1000
1001                std::pair<void*, size_t> res = hal::app().res_find_lock(HAL_ABOUT_TEXT, HALITE_RTF_RES_TYPE);
1002
1003                string rtf(static_cast<char*>(res.first), res.second);
1004                wstring wrtf = hal::from_utf8_safe(rtf);
1005
1006                richEdit_.SendMessage(WM_SETTEXT, 0, (LPARAM)wrtf.c_str());
1007                richEdit_.SetSelNone();
1008//              richEdit_.SetEventMask(ENM_REQUESTRESIZE);
1009
1010        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
1011
1012                return true;
1013        }
1014
1015private:
1016
1017        WTL::CRichEditCtrl richEdit_;
1018        RECT richRect_;
1019};
1020
1021class ConfigOptionsProp :
1022        public WTL::CPropertySheet,
1023        public WTL::CDialogResize<ConfigOptionsProp>
1024{
1025        typedef ConfigOptionsProp thisClass;
1026        typedef WTL::CDialogResize<thisClass> resizeClass;
1027
1028public:
1029    ConfigOptionsProp(HaliteWindow* haliteWindow, LPCTSTR title = (LPCTSTR)NULL,
1030                UINT uStartPage = 0, HWND hWndParent = NULL) :
1031        CPropertySheet(title, uStartPage, hWndParent),
1032                m_bCentered(false),
1033                generalOptions(haliteWindow)
1034    {
1035                AddPage(generalOptions);
1036                AddPage(bitTorrentOptions);
1037                AddPage(portOptions);
1038                AddPage(globalOptions);
1039                AddPage(securityOptions);
1040                AddPage(torrentsOptions);
1041        //      AddPage(remoteControlOptions);
1042                AddPage(aboutOptions);
1043    }
1044
1045    BEGIN_MSG_MAP_EX(ConfigOptionsProp)
1046        MESSAGE_HANDLER(WM_SHOWWINDOW, OnShowWindow)
1047                MSG_WM_SIZE(OnSize)
1048                CHAIN_MSG_MAP(resizeClass)
1049        CHAIN_MSG_MAP(CPropertySheet)
1050    END_MSG_MAP()
1051
1052    BEGIN_DLGRESIZE_MAP(thisClass)
1053                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
1054
1055                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1056                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1057                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
1058        END_DLGRESIZE_MAP()
1059
1060        void OnSize(UINT, WTL::CSize)
1061        {
1062        SetMsgHandled(false);
1063
1064        HWND propTabs = GetDlgItem(0x3020);
1065
1066                RECT rect;
1067                ::GetWindowRect(propTabs, &rect);
1068
1069                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
1070                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
1071
1072                ::MoveWindow(GetActivePage(), rect.left, rect.top,
1073            rect.right-rect.left, rect.bottom-rect.top, true);
1074        }
1075
1076    LRESULT OnShowWindow(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
1077    {
1078        if (wParam == TRUE)
1079        {
1080            WTL::CMenuHandle pSysMenu = GetSystemMenu(FALSE);
1081
1082                if (pSysMenu != NULL)
1083                pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
1084
1085            ModifyStyle(0, WS_THICKFRAME, 0);
1086            Center();
1087
1088            resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
1089        }
1090               
1091                bHandled = FALSE;
1092               
1093        return 0;
1094    }
1095
1096    void Center(void)
1097    {
1098        if (!m_bCentered)
1099        {
1100            CenterWindow();
1101            m_bCentered = true;
1102        }
1103    }
1104
1105private:
1106    bool m_bCentered;
1107
1108        GeneralOptions generalOptions;
1109        BitTorrentOptions bitTorrentOptions;
1110        PortOptions portOptions;
1111        GlobalOptions globalOptions;
1112        SecurityOptions securityOptions;
1113        TorrentsOptions torrentsOptions;
1114        RemoteOptions remoteControlOptions;
1115        AboutOptions aboutOptions;
1116};
1117
1118#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.