source: trunk/src/NewTorrentDialog.hpp @ 509

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