source: trunk/src/NewTorrentDialog.hpp @ 432

Revision 432, 9.1 KB checked in by Eoin, 12 years ago (diff)

Torrent creation is working!

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