source: trunk/src/HaliteListView.cpp @ 530

Revision 530, 9.3 KB checked in by Eoin, 11 years ago (diff)
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        SafeLoadFromIni();
50       
51        SetColumnSortType(0, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
52        SetColumnSortType(1, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::State());
53        SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
54        SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
55        SetColumnSortType(4, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
56        SetColumnSortType(5, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
57        SetColumnSortType(6, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
58        SetColumnSortType(7, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
59        SetColumnSortType(8, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
60        SetColumnSortType(9, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
61        SetColumnSortType(10, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
62        SetColumnSortType(11, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
63        SetColumnSortType(12, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
64        SetColumnSortType(13, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
65        SetColumnSortType(14, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
66        SetColumnSortType(15, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
67        SetColumnSortType(16, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
68        SetColumnSortType(17, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
69        SetColumnSortType(18, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
70        SetColumnSortType(19, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
71        SetColumnSortType(20, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
72        SetColumnSortType(21, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::QueuePosition());
73
74       
75        int item_pos = AddItem(0, 0, L"Unmanaged", 0);
76        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
77                       
78        item_pos = AddItem(0, 0, L"Downloading", 0);
79        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
80                       
81        item_pos = AddItem(0, 0, L"Seeding", 0);
82        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
83}
84
85void HaliteListViewCtrl::OnDestroy()
86{
87        saveSettings();
88}
89
90void HaliteListViewCtrl::saveSettings()
91{
92        GetListViewDetails();
93        save_to_ini();
94}
95
96DWORD HaliteListViewCtrl::OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
97{
98        return CDRF_NOTIFYITEMDRAW;
99}
100
101DWORD HaliteListViewCtrl::OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
102{
103        NMLVCUSTOMDRAW* pnmlv = (NMLVCUSTOMDRAW*) lpNMCD;
104
105        if (HAL_CUSTOMDRAW_TITLEDATA == pnmlv->nmcd.lItemlParam)
106        {
107                pnmlv->clrText = RGB(50,50,200);
108        }
109
110        return CDRF_DODEFAULT;
111}
112
113void HaliteListViewCtrl::uiUpdate(const hal::torrent_details_manager& tD)
114{
115        hal::try_update_lock<listClass> lock(*this);
116        if (lock) 
117        {
118       
119        foreach (const hal::torrent_details_ptr td, tD.torrents()) 
120        {
121                LV_FINDINFO findInfo; 
122                findInfo.flags = LVFI_STRING;
123                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
124               
125                int itemPos = FindItem(&findInfo, -1);
126                if (itemPos < 0)
127                        itemPos = AddItem(0, 0, td->name().c_str(), 0);
128
129                for (size_t i=1; i<NumberOfColumns_s; ++i)
130                {
131                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
132                }
133        }
134       
135        int iCol = GetSortColumn();
136        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
137                DoSortItems(iCol, IsSortDescending());
138       
139        }
140}
141
142HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
143{
144        boost::array<wchar_t, MAX_PATH> buffer;
145        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
146        wstring torrent = buffer.data();
147       
148        return hal::bittorrent().torrentDetails().get(torrent);
149}
150
151LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
152{
153        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
154                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent, 
155                        &hal::bittorrent(), _1));
156       
157        return 0;
158}
159
160LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
161{       
162        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
163                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent, 
164                        &hal::bittorrent(), _1));
165       
166        return 0;
167}
168
169LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
170{
171        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
172                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent, 
173                        &hal::bittorrent(), _1));
174
175        return 0;
176}
177
178LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
179{
180        hal::bittorrent().remove_torrent(hal::to_utf8(manager_.selected()));
181
182        clearFocused(); 
183        return 0;
184}
185
186LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
187{
188        foreach(const list_value_type& val, std::make_pair(is_selected_begin(), is_selected_end()))
189        {
190                hal::bittorrent().remove_torrent(val.text().c_str());
191        }
192        clearSelected();
193
194        return 0;
195}
196
197LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
198{
199        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
200                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent, 
201                        &hal::bittorrent(), _1));       
202
203        return 0;
204}
205
206LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
207{
208        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
209                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
210        {
211                std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
212                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::remove_torrent_wipe_files, 
213                                &hal::bittorrent(), _1));
214               
215                clearSelected();
216        }
217        return 0;
218}
219
220LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
221{
222        HAL_DEV_MSG(L"OnDownloadFolder");
223
224        std::set<wpath> uniquePaths;
225
226        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
227                i != e; ++i)
228        {
229                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
230                HAL_DEV_MSG(wformat(L"Name %1%, Save dir: %2%.") % *i % saveDir);
231
232                uniquePaths.insert(saveDir);
233        }
234
235        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
236
237        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
238                i != e; ++i)
239        {       
240                wstring p = (*i).file_string();
241
242                HAL_DEV_MSG(wformat(L"Unique Save dir: %1%.") % p);
243
244                sei.lpDirectory = p.c_str();
245                sei.lpFile = p.c_str();
246                sei.lpVerb = L"open";
247                sei.nShow = true;
248
249                if (!::ShellExecuteEx(&sei))
250                        HAL_DEV_MSG(L"Fail");
251                else
252                        HAL_DEV_MSG(L"Success");
253        }       
254
255        return 0;
256}
257
258LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
259{
260        HAL_DEV_MSG(L"OnEditFolders");
261
262        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
263        {
264                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
265                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
266
267                bool useMoveTo = (L"" != moveToDirectory);
268                bool disableSaveDir = !t.in_session;
269
270                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
271                        useMoveTo, disableSaveDir);     
272               
273                if (IDOK == addTorrent.DoModal())
274                {
275                        if (!disableSaveDir) t.save_directory = saveDirectory;
276
277                        if (useMoveTo)
278                                t.move_to_directory = moveToDirectory;
279                        else
280                                t.move_to_directory = L"";
281                }
282        }
283
284        return 0;
285}
286
287//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
288//{
289//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
290//      T* pItem=(T*)GetItemData(pnmv->iItem);
291//      ATLASSERT(pItem);
292//      if (pItem)      // Delete attached structure
293//              delete pItem;
294//      return 0;
295//}
Note: See TracBrowser for help on using the repository browser.