source: trunk/src/NewTorrentDialog.hpp @ 420

Revision 420, 9.2 KB checked in by Eoin, 12 years ago (diff)

Framework for Web seeds and DHT nodes in torrent creation in place.

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