source: trunk/src/NewTorrentDialog.hpp @ 460

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

Fixed 'Close to Tray' bug. Added name properity to torrents.

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
31#ifndef RC_INVOKED
32
33#include <boost/function.hpp>
34#include "halTorrent.hpp"
35#include "halIni.hpp"
36#include "halEvent.hpp"
37#include "DdxEx.hpp"
38#include "ListViewEdit.hpp"
39#include "HaliteSortListViewCtrl.hpp"
40#include "NewTorrentTrackerLV.hpp"
41#include "NewTorrentPeersLV.hpp"
42
43typedef boost::function<void (bool)> enable_save;
44
45class FilesListViewCtrl :
46        public CHaliteSortListViewCtrl<FilesListViewCtrl>,
47        public hal::IniBase<FilesListViewCtrl>,
48        private boost::noncopyable
49{
50
51        typedef hal::IniBase<FilesListViewCtrl> iniClass;
52        typedef CHaliteSortListViewCtrl<FilesListViewCtrl> listClass;
53
54        friend class listClass;
55       
56public:
57        enum { 
58                LISTVIEW_ID_MENU = 0,
59                LISTVIEW_ID_COLUMNNAMES = HAL_FILES_LISTVIEW_ADV,
60                LISTVIEW_ID_COLUMNWIDTHS = 0
61        };
62       
63        FilesListViewCtrl() :
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        void UpdateFileList();
168
169        FilesListViewCtrl filesList_;
170        enable_save EnableSave_;
171       
172        wpath fileRoot_;
173        std::vector<wpath> files_;
174
175        wstring creator_;
176        wstring comment_;
177        wstring outFile_;
178        bool private_;
179};
180
181class FilesSheet :
182    public CPropertyPageImpl<FilesSheet>,
183        public CAutoSizeWindow<FilesSheet, false>
184{
185protected:
186        typedef FilesSheet thisClass;
187        typedef CPropertyPageImpl<thisClass> sheetClass;
188        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
189
190public: 
191        enum { IDD = IDD_NEWT_TRACKERS };
192
193    BEGIN_MSG_MAP_EX(thisClass)
194                MSG_WM_INITDIALOG(onInitDialog)
195                MSG_WM_DESTROY(OnDestroy)
196
197                CHAIN_MSG_MAP(autosizeClass)
198                CHAIN_MSG_MAP(sheetClass)
199                REFLECT_NOTIFICATIONS()
200    END_MSG_MAP()
201
202        static CWindowMapStruct* GetWindowMap();
203       
204        BOOL PreTranslateMessage(MSG* pMsg)
205        {
206                return this->IsDialogMessage(pMsg);
207        }
208       
209        LRESULT onInitDialog(HWND, LPARAM)
210        {       
211                trackerList_.Attach(GetDlgItem(IDC_NEWT_LISTTRACKERS)); 
212
213                return 0;
214        }
215
216        void OnDestroy() {}
217
218        hal::tracker_details_t Trackers() const;
219       
220private:
221        NewTorrent_TrackerListViewCtrl trackerList_;
222};
223
224class TrackerSheet :
225    public CPropertyPageImpl<TrackerSheet>,
226        public CAutoSizeWindow<TrackerSheet, false>
227{
228protected:
229        typedef TrackerSheet thisClass;
230        typedef CPropertyPageImpl<thisClass> sheetClass;
231        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
232
233public: 
234        enum { IDD = IDD_NEWT_TRACKERS };
235
236    BEGIN_MSG_MAP_EX(thisClass)
237                MSG_WM_INITDIALOG(onInitDialog)
238                MSG_WM_DESTROY(OnDestroy)
239
240                CHAIN_MSG_MAP(autosizeClass)
241                CHAIN_MSG_MAP(sheetClass)
242                REFLECT_NOTIFICATIONS()
243    END_MSG_MAP()
244
245        static CWindowMapStruct* GetWindowMap();
246       
247        BOOL PreTranslateMessage(MSG* pMsg)
248        {
249                return this->IsDialogMessage(pMsg);
250        }
251       
252        LRESULT onInitDialog(HWND, LPARAM)
253        {       
254                trackerList_.Attach(GetDlgItem(IDC_NEWT_LISTTRACKERS)); 
255
256                return 0;
257        }
258
259        void OnDestroy() {}
260
261        hal::tracker_details_t Trackers() const;
262       
263private:
264        NewTorrent_TrackerListViewCtrl trackerList_;
265};
266
267class PeersSheet :
268    public CPropertyPageImpl<PeersSheet>,
269        public CAutoSizeWindow<PeersSheet, false>
270{
271protected:
272        typedef PeersSheet thisClass;
273        typedef CPropertyPageImpl<thisClass> sheetClass;
274        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
275
276public: 
277        enum { IDD = IDD_NEWT_PEERS };
278
279    BEGIN_MSG_MAP_EX(thisClass)
280                MSG_WM_INITDIALOG(onInitDialog)
281                MSG_WM_DESTROY(OnDestroy)
282
283                CHAIN_MSG_MAP(autosizeClass)
284                CHAIN_MSG_MAP(sheetClass)
285                REFLECT_NOTIFICATIONS()
286    END_MSG_MAP()
287
288        static CWindowMapStruct* GetWindowMap();
289       
290        BOOL PreTranslateMessage(MSG* pMsg)
291        {
292                return this->IsDialogMessage(pMsg);
293        }
294
295        LRESULT onInitDialog(HWND, LPARAM)
296        {       
297                peersList_.Attach(GetDlgItem(IDC_NEWT_LISTPEERS));     
298
299                return 0;
300        }
301
302        void OnDestroy() {}
303       
304        hal::dht_node_details_t DhtNodes() const;       
305        hal::web_seed_details_t WebSeeds() const;
306       
307private:
308        NewTorrent_PeersListViewCtrl peersList_;
309};
310
311class NewTorrentDialog :
312        public CPropertySheet,
313        public hal::IniBase<NewTorrentDialog>,
314        public CDialogResize<NewTorrentDialog>
315{
316        typedef NewTorrentDialog thisClass;
317        typedef hal::IniBase<thisClass> iniClass;
318        typedef CDialogResize<thisClass> resizeClass;
319
320public:
321    NewTorrentDialog(LPCTSTR title = (LPCTSTR)NULL,
322                        UINT uStartPage = 0, HWND hWndParent = NULL) :
323        CPropertySheet(title, uStartPage, hWndParent),
324                iniClass("NewTorrentDialog", "Dialog"),
325                inited_(false),
326                rect_(0,0,0,0),
327                fileSheet_(bind(&NewTorrentDialog::EnableSave, this, _1))
328    {
329                Load();
330
331                AddPage(fileSheet_);
332                AddPage(trackerSheet_);
333                AddPage(detailsSheet_);         
334        }
335
336    BEGIN_MSG_MAP_EX(thisClass)
337        MSG_WM_SHOWWINDOW(OnShowWindow)
338                MSG_WM_SIZE(OnSize)
339                MSG_WM_CLOSE(OnClose)   
340                MSG_WM_DESTROY(OnDestroy)
341               
342                COMMAND_ID_HANDLER(0x1, OnSave)
343
344                CHAIN_MSG_MAP(resizeClass)
345        CHAIN_MSG_MAP(CPropertySheet)
346    END_MSG_MAP()
347
348    BEGIN_DLGRESIZE_MAP(thisClass)
349                DLGRESIZE_CONTROL(0x3020, DLSZ_SIZE_X|DLSZ_SIZE_Y)
350
351                DLGRESIZE_CONTROL(0x1, DLSZ_MOVE_X|DLSZ_MOVE_Y)
352                DLGRESIZE_CONTROL(0x2, DLSZ_MOVE_X|DLSZ_MOVE_Y)
353                DLGRESIZE_CONTROL(0x3021, DLSZ_MOVE_X|DLSZ_MOVE_Y)
354        END_DLGRESIZE_MAP()
355
356    void OnShowWindow(BOOL bShow, UINT nStatus);
357
358        void OnSize(UINT, CSize)
359        {
360        SetMsgHandled(false);
361
362                resizeActiveSheet();
363        }
364       
365        void OnClose()
366        {
367                SetMsgHandled(false);
368
369                OnDestroy();
370        }
371
372        void OnDestroy() 
373        {
374                SetMsgHandled(false);
375
376                GetWindowRect(rect_);
377                Save();
378        }
379
380        void EnableSave(bool enable)
381        {
382                ::EnableWindow(GetDlgItem(0x1), enable);
383        }
384       
385        LRESULT OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
386
387        friend class boost::serialization::access;
388    template<class Archive>
389    void serialize(Archive& ar, const unsigned int version)
390        {
391                ar & BOOST_SERIALIZATION_NVP(rect_);
392        }
393
394private:
395        bool inited_;
396        CRect rect_;
397
398        void resizeActiveSheet()
399        {
400        HWND propTabs = GetDlgItem(0x3020);
401
402                RECT rect;
403                ::GetWindowRect(propTabs, &rect);
404
405                ::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
406                ::SendMessage(propTabs, TCM_ADJUSTRECT, false, (LPARAM)&rect);
407
408                ::MoveWindow(GetActivePage(), rect.left, rect.top,
409            rect.right-rect.left, rect.bottom-rect.top, true);
410        }
411
412        FileSheet fileSheet_;
413        TrackerSheet trackerSheet_;
414        PeersSheet detailsSheet_;
415};
416
417#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.