source: trunk/src/HaliteListView.cpp @ 604

Revision 604, 10.0 KB checked in by Eoin, 11 years ago (diff)

Supporting the new libtorrent interface to fast resume data. Not yet 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#include "stdAfx.hpp"
8
9#include <boost/iterator/filter_iterator.hpp>
10#include <winstl/controls/listview_sequence.hpp>
11
12#include "Halite.hpp"
13
14#include "HaliteListView.hpp"
15#include "HaliteWindow.hpp"
16#include "HaliteListViewDlg.hpp"
17
18#include "halTorrent.hpp"
19
20#define HAL_CUSTOMDRAW_TITLEDATA 1000000000
21
22HaliteListViewCtrl::HaliteListViewCtrl(HaliteWindow& HalWindow) :
23        halWindow_(HalWindow),
24        iniClass("listviews/halite", "HaliteListView")
25{               
26        HalWindow.connectUiUpdate(bind(&HaliteListViewCtrl::uiUpdate, this, _1));
27}
28
29void HaliteListViewCtrl::OnShowWindow(UINT, INT)
30{
31        WTL::CMenuHandle menu;
32        BOOL menu_created = menu.LoadMenu(HAL_LISTVIEW_MENU);
33        InitialSetup(menu);     
34
35        std::vector<wstring> names;     
36        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
37       
38        boost::split(names, column_names, boost::is_any_of(L";"));
39       
40        array<int, NumberOfColumns_s> widths = {100,110,60,60,60,42,45,61,45,45,45,45,45,45,45,45,45,45,45,45,45,45};
41        array<bool, NumberOfColumns_s> visible = {true,true,true,true,true,true,true,true,true,true,true,\
42                true,true,true,true,true,true,true,true,true,true,true};
43
44        for (int i=0, e=NumberOfColumns_s; i < e; ++i)
45        {
46                AddColumn(names[i].c_str(), i, visible[i], widths[i]);
47        }       
48
49
50//      int ret = EnableGroupView(true);
51        if (IsGroupViewEnabled())
52        {
53//              RemoveAllGroups();
54
55                LVGROUP lvg = { sizeof(LVGROUP) };
56
57                lvg.mask = LVGF_HEADER|LVGF_GROUPID|LVGF_STATE|LVGF_ALIGN ;
58                lvg.pszHeader = L"Eoin";
59                lvg.cchHeader = 5;
60                lvg.iGroupId = 1;
61                lvg.state = LVGS_NORMAL;
62                lvg.uAlign = LVGA_HEADER_LEFT;
63
64                int grp = InsertGroup(-1, &lvg);
65//              MoveItemToGroup(1, 1);
66        }
67
68        SafeLoadFromIni();
69       
70        SetColumnSortType(0, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
71        SetColumnSortType(1, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::State());
72        SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
73        SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
74        SetColumnSortType(4, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
75        SetColumnSortType(5, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
76        SetColumnSortType(6, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
77        SetColumnSortType(7, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
78        SetColumnSortType(8, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
79        SetColumnSortType(9, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
80        SetColumnSortType(10, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
81        SetColumnSortType(11, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
82        SetColumnSortType(12, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
83        SetColumnSortType(13, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
84        SetColumnSortType(14, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
85        SetColumnSortType(15, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
86        SetColumnSortType(16, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
87        SetColumnSortType(17, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
88        SetColumnSortType(18, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
89        SetColumnSortType(19, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
90        SetColumnSortType(20, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
91        SetColumnSortType(21, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::QueuePosition());
92
93       
94/*      int item_pos = AddItem(0, 0, L"Unmanaged", 0);
95        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
96                       
97        item_pos = AddItem(0, 0, L"Downloading", 0);
98        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
99                       
100        item_pos = AddItem(0, 0, L"Seeding", 0);
101        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);*/
102}
103
104void HaliteListViewCtrl::OnDestroy()
105{
106        saveSettings();
107}
108
109void HaliteListViewCtrl::saveSettings()
110{
111        GetListViewDetails();
112        save_to_ini();
113}
114
115DWORD HaliteListViewCtrl::OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
116{
117        return CDRF_NOTIFYITEMDRAW;
118}
119
120DWORD HaliteListViewCtrl::OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
121{
122        NMLVCUSTOMDRAW* pnmlv = (NMLVCUSTOMDRAW*) lpNMCD;
123
124        if (HAL_CUSTOMDRAW_TITLEDATA == pnmlv->nmcd.lItemlParam)
125        {
126                pnmlv->clrText = RGB(50,50,200);
127        }
128
129        return CDRF_DODEFAULT;
130}
131
132void HaliteListViewCtrl::uiUpdate(const hal::torrent_details_manager& tD)
133{
134        hal::try_update_lock<listClass> lock(*this);
135        if (lock) 
136        {
137       
138
139
140        foreach (const hal::torrent_details_ptr td, tD.torrents()) 
141        {
142                LV_FINDINFO findInfo; 
143                findInfo.flags = LVFI_STRING;
144                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
145               
146                int itemPos = FindItem(&findInfo, -1);
147                if (itemPos < 0)
148                {
149                                        LVITEM lvItem = { 0 };
150                lvItem.mask = LVIF_TEXT|LVIF_GROUPID;
151                lvItem.iItem = 0;
152                lvItem.iSubItem = 0;
153                lvItem.pszText = (LPTSTR)td->name().c_str();
154                lvItem.iGroupId = 0;
155
156                        lvItem.mask |= LVIF_IMAGE;
157                        lvItem.iImage = 0;
158
159                        itemPos =  InsertItem(&lvItem);
160
161                //      AddItem(0, 0, td->name().c_str(), 0);
162                //      MoveItemToGroup(itemPos, 0);
163                }
164
165                for (size_t i=1; i<NumberOfColumns_s; ++i)
166                {
167                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
168                }
169        }
170       
171        int iCol = GetSortColumn();
172        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
173                DoSortItems(iCol, IsSortDescending());
174       
175        }
176}
177
178HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
179{
180        boost::array<wchar_t, MAX_PATH> buffer;
181        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
182        wstring torrent = buffer.data();
183       
184        return hal::bittorrent().torrentDetails().get(torrent);
185}
186
187LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
188{
189        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
190                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent, 
191                        &hal::bittorrent(), _1));
192       
193        return 0;
194}
195
196LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
197{       
198        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
199                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent, 
200                        &hal::bittorrent(), _1));
201       
202        return 0;
203}
204
205LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
206{
207        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
208                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent, 
209                        &hal::bittorrent(), _1));
210
211        return 0;
212}
213
214LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
215{
216        hal::bittorrent().remove_torrent(hal::to_utf8(manager_.selected()));
217
218        clearFocused(); 
219        return 0;
220}
221
222LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
223{
224        foreach(const list_value_type& val, std::make_pair(is_selected_begin(), is_selected_end()))
225        {
226                hal::bittorrent().remove_torrent(val.text().c_str());
227        }
228        clearSelected();
229
230        return 0;
231}
232
233LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
234{
235        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
236                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent, 
237                        &hal::bittorrent(), _1));       
238
239        return 0;
240}
241
242LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
243{
244        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
245                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
246        {
247                std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
248                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::remove_torrent_wipe_files, 
249                                &hal::bittorrent(), _1));
250               
251                clearSelected();
252        }
253        return 0;
254}
255
256LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
257{
258        HAL_DEV_MSG(L"OnDownloadFolder");
259
260        std::set<wpath> uniquePaths;
261
262        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
263                i != e; ++i)
264        {
265                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
266                HAL_DEV_MSG(hal::wform(L"Name %1%, Save dir: %2%.") % *i % saveDir);
267
268                uniquePaths.insert(saveDir);
269        }
270
271        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
272
273        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
274                i != e; ++i)
275        {       
276                wstring p = (*i).file_string();
277
278                HAL_DEV_MSG(hal::wform(L"Unique Save dir: %1%.") % p);
279
280                sei.lpDirectory = p.c_str();
281                sei.lpFile = p.c_str();
282                sei.lpVerb = L"open";
283                sei.nShow = true;
284
285                if (!::ShellExecuteEx(&sei))
286                        HAL_DEV_MSG(L"Fail");
287                else
288                        HAL_DEV_MSG(L"Success");
289        }       
290
291        return 0;
292}
293
294LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
295{
296        HAL_DEV_MSG(L"OnEditFolders");
297
298        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
299        {
300                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
301                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
302
303                bool useMoveTo = (L"" != moveToDirectory);
304                bool disableSaveDir = !t.in_session;
305
306                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
307                        useMoveTo, disableSaveDir);     
308               
309                if (IDOK == addTorrent.DoModal())
310                {
311                        if (!disableSaveDir) t.save_directory = saveDirectory;
312
313                        if (useMoveTo)
314                                t.move_to_directory = moveToDirectory;
315                        else
316                                t.move_to_directory = L"";
317                }
318        }
319
320        return 0;
321}
322
323//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
324//{
325//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
326//      T* pItem=(T*)GetItemData(pnmv->iItem);
327//      ATLASSERT(pItem);
328//      if (pItem)      // Delete attached structure
329//              delete pItem;
330//      return 0;
331//}
Note: See TracBrowser for help on using the repository browser.