source: trunk/src/NewTorrentDialog.hpp @ 493

Revision 493, 10.4 KB checked in by Eoin, 12 years ago (diff)

Freedom from automatic ATL and/or WTL namespaces.

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_NEWTORRENT_BEGIN                             14000
10#define IDC_NEWTORRENT_SELECT_TEXT              ID_NEWTORRENT_BEGIN+1
11#define IDC_NEWTORRENT_TRACKERS_TEXT    ID_NEWTORRENT_BEGIN+2
12#define IDC_NEWTORRENT_CREATOR_TEXT             ID_NEWTORRENT_BEGIN+3
13#define IDC_NEWTORRENT_CREATOR                  ID_NEWTORRENT_BEGIN+4
14#define IDC_NEWTORRENT_COMMENT_TEXT             ID_NEWTORRENT_BEGIN+5
15#define IDC_NEWTORRENT_COMMENT                  ID_NEWTORRENT_BEGIN+6
16#define IDC_NEWTORRENT_PRIVATE                  ID_NEWTORRENT_BEGIN+7
17#define IDC_NEWT_FILE_BROWSE                    ID_NEWTORRENT_BEGIN+8
18#define IDC_NEWT_DIR_BROWSE                             ID_NEWTORRENT_BEGIN+9
19#define IDC_NEWT_LISTFILES                              ID_NEWTORRENT_BEGIN+10
20#define HAL_FILES_LISTVIEW_ADV                  ID_NEWTORRENT_BEGIN+11
21#define HAL_NEW_PANE_DLG                                ID_NEWTORRENT_BEGIN+12
22#define IDC_NEWT_TRACKERTIER                    ID_NEWTORRENT_BEGIN+13
23#define IDC_NEWTORRENT_PEERS_TEXT               ID_NEWTORRENT_BEGIN+14
24#define IDC_NEWT_LISTPEERS                              ID_NEWTORRENT_BEGIN+15
25#define HAL_SAVE_TEXT                                   ID_NEWTORRENT_BEGIN+16
26#define IDC_NEWT_OUT_BROWSE                             ID_NEWTORRENT_BEGIN+17
27#define IDC_NEWT_OUTFILE_TEXT                   ID_NEWTORRENT_BEGIN+18
28#define HAL_NEWT_SAVING_TORRENT                 ID_NEWTORRENT_BEGIN+19
29#define HAL_NEWT_DIALOG_TITLE                   ID_NEWTORRENT_BEGIN+20
30#define HAL_NEWT_FILE_NAME                              ID_NEWTORRENT_BEGIN+21
31#define HAL_NEWT_FILE_NAME_EDIT                 ID_NEWTORRENT_BEGIN+22
32#define HAL_NEWT_PIECESIZE_TEXT                 ID_NEWTORRENT_BEGIN+23
33#define HAL_NEWT_PIECESIZE                              ID_NEWTORRENT_BEGIN+24
34
35
36#ifndef RC_INVOKED
37
38#include <boost/function.hpp>
39#include "halTorrent.hpp"
40#include "halIni.hpp"
41#include "halEvent.hpp"
42#include "DdxEx.hpp"
43#include "HaliteSortListViewCtrl.hpp"
44#include "NewTorrentTrackerLV.hpp"
45#include "NewTorrentPeersLV.hpp"
46
47typedef boost::function<void (bool)> enable_save;
48
49class FilesListViewCtrl :
50        public CHaliteSortListViewCtrl<FilesListViewCtrl>,
51        public hal::IniBase<FilesListViewCtrl>,
52        private boost::noncopyable
53{
54
55        typedef hal::IniBase<FilesListViewCtrl> iniClass;
56        typedef CHaliteSortListViewCtrl<FilesListViewCtrl> listClass;
57
58        friend class listClass;
59       
60public:
61        enum { 
62                LISTVIEW_ID_MENU = 0,
63                LISTVIEW_ID_COLUMNNAMES = HAL_FILES_LISTVIEW_ADV,
64                LISTVIEW_ID_COLUMNWIDTHS = 0
65        };
66       
67        FilesListViewCtrl() :
68                iniClass("listviews/new_files", "NewFilesListView")
69        {
70                std::vector<wstring> names;     
71                wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
72
73                // "Tracker;Tier"
74                boost::split(names, column_names, boost::is_any_of(L";"));
75               
76                array<int, 3> widths = {50,287,50};
77                array<int, 3> order = {0,1,2};
78                array<bool, 3> visible = {true,true,true};
79               
80                SetDefaults(names, widths, order, visible, true);
81                load_from_ini();
82        }
83
84        BEGIN_MSG_MAP_EX(FilesListViewCtrl)
85                MSG_WM_DESTROY(OnDestroy)
86
87                CHAIN_MSG_MAP(listClass)
88                DEFAULT_REFLECTION_HANDLER()
89        END_MSG_MAP()
90
91        void uiUpdate(const hal::TorrentDetail_ptr pT);
92
93    friend class boost::serialization::access;
94    template<class Archive>
95    void serialize(Archive& ar, const unsigned int version)
96    {
97                ar & boost::serialization::make_nvp("listview", boost::serialization::base_object<listClass>(*this));
98    }
99
100private:
101        void OnAttach();
102        void OnDestroy();
103        void saveSettings();
104
105        boost::signal<void ()> listEdited_;
106};
107
108typedef FilesListViewCtrl::SelectionManager FilesListViewManager;
109
110class DetailsSheet :
111        public WTL::CPropertyPageImpl<DetailsSheet>,
112        public CWinDataExchangeEx<DetailsSheet>,
113        public ATL::CAutoSizeWindow<DetailsSheet, false>
114{
115protected:
116        typedef DetailsSheet thisClass;
117        typedef WTL::CPropertyPageImpl<thisClass> sheetClass;
118        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
119
120public:
121        DetailsSheet(enable_save enableSave) :
122                EnableSave_(enableSave), 
123                private_(false)
124        {}
125       
126        enum { IDD = IDD_NEWTORRENT };
127
128    BEGIN_MSG_MAP_EX(thisClass)
129                MSG_WM_INITDIALOG(onInitDialog)
130                MSG_WM_DESTROY(OnDestroy)
131
132                COMMAND_ID_HANDLER_EX(IDC_NEWT_OUT_BROWSE, OnOutBrowse)
133
134                CHAIN_MSG_MAP(autosizeClass)
135                CHAIN_MSG_MAP(sheetClass)
136                REFLECT_NOTIFICATIONS()
137    END_MSG_MAP()
138       
139    BEGIN_DDX_MAP(thisClass)
140                DDX_EX_STDWSTRING(IDC_NEWTORRENT_CREATOR, creator_);
141                DDX_EX_STDWSTRING(IDC_NEWTORRENT_COMMENT, comment_);
142                DDX_EX_STDWSTRING(IDC_NEWT_FILE, outFile_);
143                DDX_INT(HAL_NEWT_PIECESIZE, pieceSize_);
144        DDX_CHECK(IDC_NEWTORRENT_PRIVATE, private_)
145    END_DDX_MAP()
146
147        static CWindowMapStruct* GetWindowMap();
148       
149        BOOL PreTranslateMessage(MSG* pMsg)
150        {
151                return this->IsDialogMessage(pMsg);
152        }
153       
154        void OnOutBrowse(UINT, int, HWND hWnd);
155
156        LRESULT onInitDialog(HWND, LPARAM);
157        void OnDestroy() {};
158
159        wpath OutputFile();
160        wstring Creator();
161        int PieceSize();
162        wstring Comment();
163        bool Private();
164       
165private:
166        enable_save EnableSave_;
167
168        wstring creator_;
169        wstring comment_;
170        int pieceSize_;
171        wstring outFile_;
172        bool private_;
173};
174
175class FilesSheet :
176        public WTL::CPropertyPageImpl<FilesSheet>,
177        public ATL::CAutoSizeWindow<FilesSheet, false>
178{
179protected:
180        typedef FilesSheet thisClass;
181        typedef WTL::CPropertyPageImpl<thisClass> sheetClass;
182        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
183
184public: 
185        enum { IDD = IDD_NEWT_FILES };
186
187    BEGIN_MSG_MAP_EX(thisClass)
188                MSG_WM_INITDIALOG(onInitDialog)
189                MSG_WM_DESTROY(OnDestroy)
190
191                COMMAND_ID_HANDLER_EX(IDC_NEWT_FILE_BROWSE, OnFileBrowse)
192                COMMAND_ID_HANDLER_EX(IDC_NEWT_DIR_BROWSE, OnDirBrowse)
193
194                CHAIN_MSG_MAP(autosizeClass)
195                CHAIN_MSG_MAP(sheetClass)
196                REFLECT_NOTIFICATIONS()
197    END_MSG_MAP()
198       
199        LRESULT onInitDialog(HWND, LPARAM)
200        {       
201                filesList_.Attach(GetDlgItem(IDC_NEWT_LISTFILES));     
202
203                return 0;
204        }
205
206        void OnDestroy() {}
207
208        static CWindowMapStruct* GetWindowMap();
209
210        void OnFileBrowse(UINT, int, HWND hWnd);
211        void OnDirBrowse(UINT, int, HWND hWnd);
212
213        wpath FileFullPath() const;
214        hal::file_size_pairs_t FileSizePairs() const;
215       
216        BOOL PreTranslateMessage(MSG* pMsg)
217        {
218                return this->IsDialogMessage(pMsg);
219        }
220
221private:
222        void UpdateFileList();
223
224        FilesListViewCtrl filesList_;
225       
226        wpath fileRoot_;
227        std::vector<wpath> files_;
228};
229
230class TrackerSheet :
231        public WTL::CPropertyPageImpl<TrackerSheet>,
232        public ATL::CAutoSizeWindow<TrackerSheet, false>
233{
234protected:
235        typedef TrackerSheet thisClass;
236        typedef WTL::CPropertyPageImpl<thisClass> sheetClass;
237        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
238
239public: 
240        enum { IDD = IDD_NEWT_TRACKERS };
241
242    BEGIN_MSG_MAP_EX(thisClass)
243                MSG_WM_INITDIALOG(onInitDialog)
244                MSG_WM_DESTROY(OnDestroy)
245
246                CHAIN_MSG_MAP(autosizeClass)
247                CHAIN_MSG_MAP(sheetClass)
248                REFLECT_NOTIFICATIONS()
249    END_MSG_MAP()
250
251        static CWindowMapStruct* GetWindowMap();
252       
253        BOOL PreTranslateMessage(MSG* pMsg)
254        {
255                return this->IsDialogMessage(pMsg);
256        }
257       
258        LRESULT onInitDialog(HWND, LPARAM)
259        {       
260                trackerList_.Attach(GetDlgItem(IDC_NEWT_LISTTRACKERS)); 
261
262                return 0;
263        }
264
265        void OnDestroy() {}
266
267        hal::tracker_details_t Trackers() const;
268       
269private:
270        NewTorrent_TrackerListViewCtrl trackerList_;
271};
272
273class PeersSheet :
274        public WTL::CPropertyPageImpl<PeersSheet>,
275        public ATL::CAutoSizeWindow<PeersSheet, false>
276{
277protected:
278        typedef PeersSheet thisClass;
279        typedef WTL::CPropertyPageImpl<thisClass> sheetClass;
280        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
281
282public: 
283        enum { IDD = IDD_NEWT_PEERS };
284
285    BEGIN_MSG_MAP_EX(thisClass)
286                MSG_WM_INITDIALOG(onInitDialog)
287                MSG_WM_DESTROY(OnDestroy)
288
289                CHAIN_MSG_MAP(autosizeClass)
290                CHAIN_MSG_MAP(sheetClass)
291                REFLECT_NOTIFICATIONS()
292    END_MSG_MAP()
293
294        static CWindowMapStruct* GetWindowMap();
295       
296        BOOL PreTranslateMessage(MSG* pMsg)
297        {
298                return this->IsDialogMessage(pMsg);
299        }
300
301        LRESULT onInitDialog(HWND, LPARAM)
302        {       
303                peersList_.Attach(GetDlgItem(IDC_NEWT_LISTPEERS));     
304
305                return 0;
306        }
307
308        void OnDestroy() {}
309       
310        hal::dht_node_details_t DhtNodes() const;       
311        hal::web_seed_details_t WebSeeds() const;
312       
313private:
314        NewTorrent_PeersListViewCtrl peersList_;
315};
316
317class NewTorrentDialog :
318        public WTL::CPropertySheet,
319        public hal::IniBase<NewTorrentDialog>,
320        public WTL::CDialogResize<NewTorrentDialog>
321{
322        typedef NewTorrentDialog thisClass;
323        typedef hal::IniBase<thisClass> iniClass;
324        typedef WTL::CDialogResize<thisClass> resizeClass;
325
326public:
327    NewTorrentDialog(LPCTSTR title = (LPCTSTR)NULL,
328                        UINT uStartPage = 0, HWND hWndParent = NULL) :
329        CPropertySheet(title, uStartPage, hWndParent),
330                iniClass("NewTorrentDialog", "Dialog"),
331                inited_(false),
332                rect_(0,0,0,0),
333                fileSheet_(bind(&NewTorrentDialog::EnableSave, this, _1))
334    {
335                load_from_ini();
336
337                AddPage(fileSheet_);
338                AddPage(filesSheet_);
339                AddPage(trackerSheet_);
340                AddPage(detailsSheet_);         
341        }
342
343    BEGIN_MSG_MAP_EX(thisClass)
344        MSG_WM_SHOWWINDOW(OnShowWindow)
345                MSG_WM_SIZE(OnSize)
346                MSG_WM_CLOSE(OnClose)   
347                MSG_WM_DESTROY(OnDestroy)
348               
349                COMMAND_ID_HANDLER(0x1, OnSave)
350
351                CHAIN_MSG_MAP(resizeClass)
352        CHAIN_MSG_MAP(CPropertySheet)
353    END_MSG_MAP()
354
355    BEGIN_DLGRESIZE_MAP(thisClass)
356                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
357
358                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
359                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
360                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
361        END_DLGRESIZE_MAP()
362
363    void OnShowWindow(BOOL bShow, UINT nStatus);
364
365        void OnSize(UINT, WTL::CSize)
366        {
367        SetMsgHandled(false);
368
369                resizeActiveSheet();
370        }
371       
372        void OnClose()
373        {
374                SetMsgHandled(false);
375
376                OnDestroy();
377        }
378
379        void OnDestroy() 
380        {
381                SetMsgHandled(false);
382
383                GetWindowRect(rect_);
384                save_to_ini();
385        }
386
387        void EnableSave(bool enable)
388        {
389                ::EnableWindow(GetDlgItem(0x1), enable);
390        }
391       
392        LRESULT OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
393
394        friend class boost::serialization::access;
395    template<class Archive>
396    void serialize(Archive& ar, const unsigned int version)
397        {
398                ar & BOOST_SERIALIZATION_NVP(rect_);
399        }
400
401private:
402        bool inited_;
403        WTL::CRect rect_;
404
405        void resizeActiveSheet()
406        {
407        HWND propTabs = GetDlgItem(0x3020);
408
409                RECT rect;
410                ::GetWindowRect(propTabs, &rect);
411
412                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
413                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
414
415                ::MoveWindow(GetActivePage(), rect.left, rect.top,
416            rect.right-rect.left, rect.bottom-rect.top, true);
417        }
418
419        DetailsSheet fileSheet_;
420        FilesSheet filesSheet_;
421        TrackerSheet trackerSheet_;
422        PeersSheet detailsSheet_;
423};
424
425#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.