source: trunk/src/NewTorrentDialog.hpp @ 508

Revision 508, 10.1 KB checked in by Eoin, 12 years ago (diff)

Major SortList? de-blobbing.

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