source: trunk/src/HaliteListView.cpp @ 384

Revision 384, 7.3 KB checked in by Eoin, 12 years ago (diff)

Added 'Open Download Folder'.

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 "HaliteListView.hpp"
8#include "HaliteWindow.hpp"
9#include "halTorrent.hpp"
10
11HaliteListViewCtrl::HaliteListViewCtrl(HaliteWindow& HalWindow) :
12        halWindow_(HalWindow),
13        iniClass("listviews/halite", "HaliteListView"),
14        listClass(true, false, false)
15{               
16        HalWindow.connectUiUpdate(bind(&HaliteListViewCtrl::uiUpdate, this, _1));
17       
18        std::vector<wstring> names;     
19        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
20       
21        // "Name;Status;Progress;Download;Upload;Peers;Seeds;ETA;Copies;Tracker;Reannounce;Ratio;Total;Completed;Remaining;Downloaded;Uploaded;Active;Seeding;Start Time;Finish Time"
22        boost::split(names, column_names, boost::is_any_of(L";"));
23       
24        array<int, 21> widths = {100,110,60,60,60,42,45,61,45,45,45,45,45,45,45,45,45,45,45,45,45};
25        array<int, 21> order = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
26        array<bool, 21> visible = {true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true};
27       
28        SetDefaults(names, widths, order, visible);
29        Load();
30}
31       
32void HaliteListViewCtrl::OnShowWindow(UINT, INT)
33{
34        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER);
35        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
36       
37        ApplyDetails();
38       
39        SetColumnSortType(0, LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
40        SetColumnSortType(1, LVCOLSORT_CUSTOM, new ColumnAdapters::State());
41        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
42        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
43        SetColumnSortType(4, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
44        SetColumnSortType(5, LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
45        SetColumnSortType(6, LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
46        SetColumnSortType(7, LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
47        SetColumnSortType(8, LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
48        SetColumnSortType(9, LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
49        SetColumnSortType(10, LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
50        SetColumnSortType(11, LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
51        SetColumnSortType(12, LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
52        SetColumnSortType(13, LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
53        SetColumnSortType(14, LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
54        SetColumnSortType(15, LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
55        SetColumnSortType(16, LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
56        SetColumnSortType(17, LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
57        SetColumnSortType(18, LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
58        SetColumnSortType(19, LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
59        SetColumnSortType(20, LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
60}
61
62void HaliteListViewCtrl::OnDestroy()
63{
64        saveSettings();
65}
66
67void HaliteListViewCtrl::saveSettings()
68{
69        GetListViewDetails();
70        Save();
71}
72
73void HaliteListViewCtrl::uiUpdate(const hal::TorrentDetails& tD)
74{
75        TryUpdateLock<listClass> lock(*this);
76        if (lock) 
77        {
78       
79        foreach (const hal::TorrentDetail_ptr td, tD.torrents()) 
80        {
81                LV_FINDINFO findInfo; 
82                findInfo.flags = LVFI_STRING;
83                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
84               
85                int itemPos = FindItem(&findInfo, -1);
86                if (itemPos < 0)
87                        itemPos = AddItem(0, 0, td->name().c_str(), 0);
88
89                for (size_t i=1; i<HaliteListViewCtrl::NumberOfColumns_s; ++i)
90                {
91                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
92                }
93        }
94       
95        int iCol = GetSortColumn();
96        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
97                DoSortItems(iCol, IsSortDescending());
98       
99        }
100}
101
102HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
103{
104        boost::array<wchar_t, MAX_PATH> buffer;
105        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
106        wstring torrent = buffer.data();
107       
108        return hal::bittorrent().torrentDetails().get(torrent);
109}
110
111LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
112{
113        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
114                bind((void (hal::BitTorrent::*)(const std::wstring&))&hal::BitTorrent::resumeTorrent, 
115                        &hal::bittorrent(), _1));
116       
117        return 0;
118}
119
120LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
121{       
122        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
123                bind((void (hal::BitTorrent::*)(const std::wstring&))&hal::BitTorrent::pauseTorrent,
124                        &hal::bittorrent(), _1));
125       
126        return 0;
127}
128
129LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
130{
131        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
132                bind((void (hal::BitTorrent::*)(const std::wstring&))&hal::BitTorrent::stopTorrent, 
133                        &hal::bittorrent(), _1));
134       
135        return 0;
136}
137
138LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
139{
140        hal::bittorrent().removeTorrent(hal::to_utf8(manager_.selected()));
141
142        clearFocused(); 
143        return 0;
144}
145
146LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
147{
148        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
149                bind((void (hal::BitTorrent::*)(const std::wstring&))&hal::BitTorrent::removeTorrent, 
150                        &hal::bittorrent(), _1));
151
152        clearSelected();       
153        return 0;
154}
155
156LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
157{
158        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
159                bind((void (hal::BitTorrent::*)(const std::wstring&))&hal::BitTorrent::removeTorrentWipeFiles, 
160                        &hal::bittorrent(), _1));
161       
162        clearSelected();
163        return 0;
164}
165
166LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
167{
168        HAL_DEV_MSG(L"OnDownloadFolder");
169
170        std::set<wpath> uniquePaths;
171
172        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
173                i != e; ++i)
174        {
175                wstring saveDir = hal::bittorrent().torrentDetails().get(*i)->saveDirectory();         
176                HAL_DEV_MSG(wformat(L"Name %1%, Save dir: %2%.") % *i % saveDir);
177
178                uniquePaths.insert(saveDir);
179        }
180
181        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
182
183        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
184                i != e; ++i)
185        {       
186                HAL_DEV_MSG(wformat(L"Unique Save dir: %1%.") % *i);
187
188                sei.lpDirectory = (*i).string().c_str();
189                sei.lpFile = (*i).string().c_str();
190                sei.lpVerb = L"open";
191                sei.nShow = true;
192
193                if (!::ShellExecuteEx(&sei))
194                {
195                        HAL_DEV_MSG(L"Fail");
196                }
197                else
198                {
199                        HAL_DEV_MSG(L"Success");
200                }
201        }       
202
203        return 0;
204}
205
206//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
207//{
208//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
209//      T* pItem=(T*)GetItemData(pnmv->iItem);
210//      ATLASSERT(pItem);
211//      if (pItem)      // Delete attached structure
212//              delete pItem;
213//      return 0;
214//}
Note: See TracBrowser for help on using the repository browser.