source: trunk/src/NewTorrentDialog.hpp @ 419

Revision 419, 9.0 KB checked in by Eoin, 12 years ago (diff)

Factored out base code for adding and editing items in ListViews?. Made the NewTorrent? Tracker ListView? editable.

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