source: trunk/src/ConfigOptions.hpp @ 625

Revision 625, 76.7 KB checked in by Eoin, 12 years ago (diff)

Cache setting GUI in progress

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