source: trunk/src/HaliteListView.cpp @ 519

Revision 519, 9.3 KB checked in by Eoin, 11 years ago (diff)

Adding a 'queued view' mode to main listview.

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                pnmlv->clrText = RGB(50,50,200);
107
108        return CDRF_DODEFAULT;
109}
110
111void HaliteListViewCtrl::uiUpdate(const hal::torrent_details_manager& tD)
112{
113        hal::try_update_lock<listClass> lock(*this);
114        if (lock) 
115        {
116       
117        foreach (const hal::torrent_details_ptr td, tD.torrents()) 
118        {
119                LV_FINDINFO findInfo; 
120                findInfo.flags = LVFI_STRING;
121                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
122               
123                int itemPos = FindItem(&findInfo, -1);
124                if (itemPos < 0)
125                        itemPos = AddItem(0, 0, td->name().c_str(), 0);
126
127                for (size_t i=1; i<NumberOfColumns_s; ++i)
128                {
129                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
130                }
131        }
132       
133        int iCol = GetSortColumn();
134        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
135                DoSortItems(iCol, IsSortDescending());
136       
137        }
138}
139
140HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
141{
142        boost::array<wchar_t, MAX_PATH> buffer;
143        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
144        wstring torrent = buffer.data();
145       
146        return hal::bittorrent().torrentDetails().get(torrent);
147}
148
149LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
150{
151        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
152                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent, 
153                        &hal::bittorrent(), _1));
154       
155        return 0;
156}
157
158LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
159{       
160        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
161                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent, 
162                        &hal::bittorrent(), _1));
163       
164        return 0;
165}
166
167LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
168{
169        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
170                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent, 
171                        &hal::bittorrent(), _1));
172
173        return 0;
174}
175
176LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
177{
178        hal::bittorrent().remove_torrent(hal::to_utf8(manager_.selected()));
179
180        clearFocused(); 
181        return 0;
182}
183
184LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
185{
186        foreach(const list_value_type& val, std::make_pair(is_selected_begin(), is_selected_end()))
187        {
188                hal::bittorrent().remove_torrent(val.text().c_str());
189        }
190        clearSelected();
191
192        return 0;
193}
194
195LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
196{
197        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
198                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent, 
199                        &hal::bittorrent(), _1));       
200
201        return 0;
202}
203
204LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
205{
206        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
207                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
208        {
209                std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
210                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::remove_torrent_wipe_files, 
211                                &hal::bittorrent(), _1));
212               
213                clearSelected();
214        }
215        return 0;
216}
217
218LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
219{
220        HAL_DEV_MSG(L"OnDownloadFolder");
221
222        std::set<wpath> uniquePaths;
223
224        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
225                i != e; ++i)
226        {
227                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
228                HAL_DEV_MSG(wformat(L"Name %1%, Save dir: %2%.") % *i % saveDir);
229
230                uniquePaths.insert(saveDir);
231        }
232
233        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
234
235        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
236                i != e; ++i)
237        {       
238                wstring p = (*i).file_string();
239
240                HAL_DEV_MSG(wformat(L"Unique Save dir: %1%.") % p);
241
242                sei.lpDirectory = p.c_str();
243                sei.lpFile = p.c_str();
244                sei.lpVerb = L"open";
245                sei.nShow = true;
246
247                if (!::ShellExecuteEx(&sei))
248                        HAL_DEV_MSG(L"Fail");
249                else
250                        HAL_DEV_MSG(L"Success");
251        }       
252
253        return 0;
254}
255
256LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
257{
258        HAL_DEV_MSG(L"OnEditFolders");
259
260        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
261        {
262                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
263                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
264
265                bool useMoveTo = (L"" != moveToDirectory);
266                bool disableSaveDir = !t.in_session;
267
268                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
269                        useMoveTo, disableSaveDir);     
270               
271                if (IDOK == addTorrent.DoModal())
272                {
273                        if (!disableSaveDir) t.save_directory = saveDirectory;
274
275                        if (useMoveTo)
276                                t.move_to_directory = moveToDirectory;
277                        else
278                                t.move_to_directory = L"";
279                }
280        }
281
282        return 0;
283}
284
285//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
286//{
287//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
288//      T* pItem=(T*)GetItemData(pnmv->iItem);
289//      ATLASSERT(pItem);
290//      if (pItem)      // Delete attached structure
291//              delete pItem;
292//      return 0;
293//}
Note: See TracBrowser for help on using the repository browser.