source: trunk/src/NewTorrentDialog.cpp @ 438

Revision 438, 10.4 KB checked in by Eoin, 12 years ago (diff)

Cleaned up Progress Dialog and NewTorrent? Dialog.
Ruby language script now splits up ';' strings.
More ignores for language script.

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#include "stdAfx.hpp"
8#include "../res/resource.h"
9
10#include "ProgressDialog.hpp"
11#include "CSSFileDialog.hpp"
12
13#include "NewTorrentDialog.hpp"
14#include "NewTorrentPeersAD.hpp"
15
16void FilesListViewCtrl::OnAttach()
17{
18        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
19        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
20       
21        ApplyDetails();
22       
23        SetColumnSortType(0, LVCOLSORT_TEXTNOCASE);
24        SetColumnSortType(1, LVCOLSORT_TEXTNOCASE);
25        SetColumnSortType(2, LVCOLSORT_LONG);
26}
27
28void FilesListViewCtrl::OnDestroy()
29{
30        saveSettings();
31}
32
33void FilesListViewCtrl::saveSettings()
34{               
35        GetListViewDetails();
36        save();
37}
38
39void FileSheet::OnFileBrowse(UINT, int, HWND hWnd)
40{       
41        CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files (*.*)|*.*|", m_hWnd);
42
43        if (dlgOpen.DoModal() == IDOK) 
44        {
45                files_.clear();
46                wpath file = wpath(dlgOpen.m_ofn.lpstrFile);
47
48                fileRoot_ = file.branch_path();         
49                files_.push_back(file.leaf());
50
51                UpdateFileList();
52        }
53}
54
55void FileSheet::OnOutBrowse(UINT, int, HWND hWnd)
56{       
57        CSSFileDialog dlgOpen(false, NULL, NULL, OFN_HIDEREADONLY, L"Torrents. (*.torrent)|*.torrent|All Files (*.*)|*.*|", m_hWnd);
58
59        if (dlgOpen.DoModal() == IDOK) 
60        {
61                SetDlgItemText(IDC_NEWT_FILE, dlgOpen.m_ofn.lpstrFile);
62                EnableSave_(true);
63        }
64}
65
66void recurseDirectory(std::vector<wpath>& files, wpath baseDir, wpath relDir)
67{       
68        wpath currentDir(baseDir / relDir);
69
70        if (hal::fs::is_directory(currentDir))
71    {
72                for (hal::fs::wdirectory_iterator i(currentDir), end; i != end; ++i)
73                        recurseDirectory(files, baseDir, relDir / i->leaf());
74    }
75    else
76    {
77//              HAL_DEV_MSG(currentDir.string());
78                files.push_back(baseDir.leaf()/relDir);         
79    }
80}
81
82void FileSheet::OnDirBrowse(UINT, int, HWND hWnd)
83{       
84        CFolderDialog fldDlg(NULL, L"", BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE);
85
86        try
87        {
88
89        if (IDOK == fldDlg.DoModal())
90        {
91                files_.clear();
92
93                fileRoot_ = wpath(fldDlg.m_szFolderPath).branch_path();
94                recurseDirectory(files_, wpath(fldDlg.m_szFolderPath), L"");
95
96                UpdateFileList();
97        }
98
99        }
100        catch(const std::exception& e)
101        {
102                hal::event().post(shared_ptr<hal::EventDetail>(
103                        new hal::EventStdException(hal::Event::fatal, e, L"FileSheet::OnDirBrowse")));
104        }
105}
106
107void FileSheet::UpdateFileList()
108{
109        filesList_.DeleteAllItems();
110
111        foreach(wpath& file, files_)
112        {
113                int itemPos = filesList_.AddItem(0, 0, file.leaf().c_str(), 0);
114
115                filesList_.SetItemText(itemPos, 1, file.branch_path().file_string().c_str());
116                filesList_.SetItemText(itemPos, 2, lexical_cast<wstring>(
117                        hal::fs::file_size(fileRoot_/file)).c_str());
118        }
119}
120
121LRESULT FileSheet::onInitDialog(HWND, LPARAM)
122{       
123        filesList_.Attach(GetDlgItem(IDC_NEWT_LISTFILES));     
124
125        creator_ = L"Halite " + hal::app().res_wstr(HAL_VERSION_STRING);
126
127        BOOL retval =  DoDataExchange(false);
128        return 0;
129}
130       
131wpath FileSheet::FileFullPath() const
132{
133        return fileRoot_;
134}
135
136hal::file_size_pairs_t FileSheet::FileSizePairs() const
137{
138        hal::file_size_pairs_t filePairs;
139
140        try
141        {
142
143        for (int i=0, e=filesList_.GetItemCount(); i<e; ++i)
144        {
145                hal::win_c_str<std::wstring> name_buf(MAX_PATH);               
146                filesList_.GetItemText(i, 0, name_buf, name_buf.size());
147
148                hal::win_c_str<std::wstring> path_buf(MAX_PATH);               
149                filesList_.GetItemText(i, 1, path_buf, path_buf.size());
150
151                filePairs.push_back(hal::make_pair(
152                        wpath(wpath(path_buf.str()) / name_buf).string(), 
153                        hal::fs::file_size(fileRoot_ / path_buf / name_buf)));
154        }
155
156        }
157        catch(const std::exception& e)
158        {
159                hal::event().post(boost::shared_ptr<hal::EventDetail>(
160                        new hal::EventStdException(hal::Event::critical, e, 
161                                L"FileSheet::FileSizePairs")));
162        }
163
164        return filePairs;
165}
166
167wpath FileSheet::OutputFile()
168{
169        DoDataExchange(true);
170        return outFile_;
171}
172
173wstring FileSheet::Creator() 
174{ 
175        DoDataExchange(true);
176        return creator_; 
177}
178
179wstring FileSheet::Comment() 
180{       
181        DoDataExchange(true);
182        return comment_; 
183
184}
185bool FileSheet::Private() 
186{ 
187        DoDataExchange(true);
188        return private_;
189}
190
191hal::tracker_details_t TrackerSheet::Trackers() const
192{
193        hal::tracker_details_t trackers;
194
195        if (trackerList_)
196        {
197                for (int i=0, e=trackerList_.GetItemCount(); i<e; ++i)
198                {
199                        hal::win_c_str<std::wstring> str_buf(MAX_PATH);         
200                        trackerList_.GetItemText(i, 0, str_buf, str_buf.size());
201
202                        hal::win_c_str<std::wstring> tier_buf(MAX_PATH);               
203                        trackerList_.GetItemText(i, 1, tier_buf, tier_buf.size());
204
205                        trackers.push_back(hal::tracker_detail(
206                                str_buf, lexical_cast<unsigned>(tier_buf.str())));
207                }
208        }
209
210        return trackers;
211}
212
213hal::dht_node_details_t PeersSheet::DhtNodes() const
214{
215        hal::dht_node_details_t dht_nodes;
216
217        if (peersList_)
218        {
219                hal::win_c_str<std::wstring> str_url(MAX_PATH);
220                hal::win_c_str<std::wstring> str_port(MAX_PATH);
221                hal::win_c_str<std::wstring> str_type(MAX_PATH);
222
223                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
224                {
225                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
226                        peersList_.GetItemText(i, 1, str_port, str_port.size());
227                        peersList_.GetItemText(i, 2, str_type, str_type.size());
228
229                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_DHT) == str_type.str())
230                                dht_nodes.push_back(hal::dht_node_detail(str_url.str(), lexical_cast<unsigned>(str_port.str())));
231                }
232        }
233
234        return dht_nodes;
235}
236
237hal::web_seed_details_t PeersSheet::WebSeeds() const
238{
239        hal::web_seed_details_t web_seeds;
240
241        if (peersList_)
242        {
243                hal::win_c_str<std::wstring> str_url(MAX_PATH);
244                hal::win_c_str<std::wstring> str_type(MAX_PATH);
245
246                for (int i=0, e=peersList_.GetItemCount(); i<e; ++i)
247                {
248                        peersList_.GetItemText(i, 0, str_url, str_url.size()); 
249                        peersList_.GetItemText(i, 2, str_type, str_type.size());
250
251                        if (hal::app().res_wstr(HAL_NEWT_ADD_PEERS_WEB) == str_type.str())
252                                web_seeds.push_back(hal::web_seed_detail(str_url.str()));
253                }
254        }
255
256        return web_seeds;
257}
258
259#define NEWTORRENT_SELECT_LAYOUT \
260        WMB_HEAD(WMB_COLNOMIN(_exp|150), WMB_COL(_auto), WMB_COL(_auto)), \
261                WMB_ROW(_auto,  IDC_NEWTORRENT_SELECT_TEXT, IDC_NEWT_FILE_BROWSE, IDC_NEWT_DIR_BROWSE), \
262                WMB_ROWNOMAX(_exp|50,   IDC_NEWT_LISTFILES,  _r, _r), \
263        WMB_END()
264
265#define NEWTORRENT_BUTTONS_LAYOUT \
266        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
267                WMB_ROW(_auto,  IDC_NEWTORRENT_PRIVATE,  IDOK, IDCANCEL), \
268        WMB_END()
269
270#define NEWTORRENT_COMMENT_LAYOUT \
271        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
272                WMB_ROW(_auto,  IDC_NEWTORRENT_COMMENT_TEXT,  IDC_NEWTORRENT_COMMENT), \
273        WMB_END()
274
275#define NEWTORRENT_CREATOR_LAYOUT \
276        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp)), \
277                WMB_ROW(_auto,  IDC_NEWTORRENT_CREATOR_TEXT,  IDC_NEWTORRENT_CREATOR), \
278        WMB_END()
279
280#define NEWTORRENT_OUTPUT_LAYOUT \
281        WMB_HEAD(WMB_COL(_auto), WMB_COLNOMIN(_exp), WMB_COL(_auto)), \
282                WMB_ROW(_auto,  IDC_NEWT_OUTFILE_TEXT,  IDC_NEWT_FILE, IDC_NEWT_OUT_BROWSE), \
283        WMB_END()
284
285FileSheet::CWindowMapStruct* FileSheet::GetWindowMap()
286{
287        BEGIN_WINDOW_MAP_INLINE(FileSheet, 3, 3, 3, 3)
288                WMB_HEAD(WMB_COL(_exp)), 
289                WMB_ROWNOMIN(_exp, NEWTORRENT_SELECT_LAYOUT),
290                WMB_ROW(_auto, NEWTORRENT_OUTPUT_LAYOUT),
291                WMB_ROW(_auto, NEWTORRENT_CREATOR_LAYOUT),
292                WMB_ROW(_auto, NEWTORRENT_COMMENT_LAYOUT),
293                WMB_ROW(_auto, IDC_NEWTORRENT_PRIVATE),
294                WMB_END() 
295        END_WINDOW_MAP_INLINE() 
296}       
297
298#define NEWTORRENT_TRACKERS_LAYOUT \
299        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
300                WMB_ROW(_auto,  IDC_NEWTORRENT_TRACKERS_TEXT, _r, _r), \
301                WMB_ROWNOMAX(_exp|50,   IDC_NEWT_LISTTRACKERS,  _r, _r), \
302        WMB_END()
303
304TrackerSheet::CWindowMapStruct* TrackerSheet::GetWindowMap()
305{
306        BEGIN_WINDOW_MAP_INLINE(TrackerSheet, 3, 3, 3, 3)
307                WMB_HEAD(WMB_COL(_exp)), 
308                WMB_ROWNOMIN(_exp, NEWTORRENT_TRACKERS_LAYOUT),
309                WMB_END() 
310        END_WINDOW_MAP_INLINE() 
311}       
312
313#define NEWTORRENT_PEERS_LAYOUT \
314        WMB_HEAD(WMB_COLNOMIN(_exp), WMB_COL(_auto), WMB_COL(_auto)), \
315                WMB_ROW(_auto,  IDC_NEWTORRENT_PEERS_TEXT, _r, _r), \
316                WMB_ROWNOMAX(_exp|50,   IDC_NEWT_LISTPEERS,  _r, _r), \
317        WMB_END()
318
319PeersSheet::CWindowMapStruct* PeersSheet::GetWindowMap()
320{
321        BEGIN_WINDOW_MAP_INLINE(PeersSheet, 3, 3, 3, 3)
322                WMB_HEAD(WMB_COL(_exp)), 
323                WMB_ROWNOMIN(_exp, NEWTORRENT_PEERS_LAYOUT),
324                WMB_END() 
325        END_WINDOW_MAP_INLINE() 
326}       
327
328void NewTorrentDialog::OnShowWindow(BOOL bShow, UINT nStatus)
329{
330    resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
331
332        hal::event().post(shared_ptr<hal::EventDetail>(
333                new hal::EventMsg(L"NewTorrentDialog::OnShowWindow()")));
334
335    if (bShow && !inited_)
336    {
337        CMenuHandle pSysMenu = GetSystemMenu(FALSE);
338
339        if (pSysMenu != NULL)
340            pSysMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, SC_SIZE, L"&Size");
341
342        ModifyStyle(0, WS_THICKFRAME, 0);
343
344                if (rect_.left == rect_.right)
345                {
346                        CenterWindow();
347                }
348                else
349                {
350                        MoveWindow(rect_.left, rect_.top, 
351                                rect_.right-rect_.left, rect_.bottom-rect_.top, true); 
352                }
353
354                ::SetWindowText(GetDlgItem(0x1), hal::app().res_wstr(HAL_SAVE_TEXT).c_str());
355                ::EnableWindow(GetDlgItem(0x1), false);
356
357                inited_ = true;
358                resizeActiveSheet();
359    }
360        else
361        {
362                SetMsgHandled(false);
363        }
364}
365
366LRESULT NewTorrentDialog::OnSave(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
367{
368        try
369        {
370
371        hal::event().post(shared_ptr<hal::EventDetail>(
372                new hal::EventMsg(L"NewTorrentDialog::OnSave()")));
373
374        hal::create_torrent_params params;
375
376        params.file_size_pairs = fileSheet_.FileSizePairs();
377        params.root_path = fileSheet_.FileFullPath();
378
379        params.creator = fileSheet_.Creator();
380        params.comment = fileSheet_.Comment();
381        params.private_torrent = fileSheet_.Private();
382
383        params.trackers = trackerSheet_.Trackers();
384
385        params.dht_nodes = detailsSheet_.DhtNodes();
386        params.web_seeds = detailsSheet_.WebSeeds();
387
388        ProgressDialog progDlg(hal::app().res_wstr(HAL_NEWT_SAVING_TORRENT), bind(
389                &hal::bit::create_torrent, &hal::bittorrent(), params, fileSheet_.OutputFile(), _1));
390
391        int err_code = progDlg.DoModal();
392
393        HAL_DEV_MSG(wformat(L"progDlg err_code: %1%") % err_code);
394
395        if (err_code == 0) SendMessage(WM_CLOSE);
396
397        }
398        catch(const std::exception& e)
399        {
400                hal::event().post(boost::shared_ptr<hal::EventDetail>(
401                        new hal::EventStdException(hal::Event::critical, e, 
402                                L"NewTorrentDialog::OnSave")));
403        }
404
405        return 0;
406}
Note: See TracBrowser for help on using the repository browser.