source: trunk/src/HaliteListView.cpp @ 460

Revision 460, 9.2 KB checked in by Eoin, 11 years ago (diff)

Fixed 'Close to Tray' bug. Added name properity to torrents.

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
20HaliteListViewCtrl::HaliteListViewCtrl(HaliteWindow& HalWindow) :
21        halWindow_(HalWindow),
22        iniClass("listviews/halite", "HaliteListView")
23{               
24        HalWindow.connectUiUpdate(bind(&HaliteListViewCtrl::uiUpdate, this, _1));
25       
26        std::vector<wstring> names;     
27        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
28       
29        boost::split(names, column_names, boost::is_any_of(L";"));
30       
31        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};
32        array<int, NumberOfColumns_s> order = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
33        array<bool, NumberOfColumns_s> visible = {true,true,true,true,true,true,true,true,true,true,true,\
34                true,true,true,true,true,true,true,true,true,true};
35       
36        SetDefaults(names, widths, order, visible);
37        Load();
38}
39
40void HaliteListViewCtrl::OnShowWindow(UINT, INT)
41{
42        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER);
43        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
44       
45        ApplyDetails();
46       
47        SetColumnSortType(0, LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
48        SetColumnSortType(1, LVCOLSORT_CUSTOM, new ColumnAdapters::State());
49        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
50        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
51        SetColumnSortType(4, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
52        SetColumnSortType(5, LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
53        SetColumnSortType(6, LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
54        SetColumnSortType(7, LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
55        SetColumnSortType(8, LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
56        SetColumnSortType(9, LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
57        SetColumnSortType(10, LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
58        SetColumnSortType(11, LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
59        SetColumnSortType(12, LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
60        SetColumnSortType(13, LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
61        SetColumnSortType(14, LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
62        SetColumnSortType(15, LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
63        SetColumnSortType(16, LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
64        SetColumnSortType(17, LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
65        SetColumnSortType(18, LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
66        SetColumnSortType(19, LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
67        SetColumnSortType(20, LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
68}
69
70void HaliteListViewCtrl::OnDestroy()
71{
72        saveSettings();
73}
74
75void HaliteListViewCtrl::saveSettings()
76{
77        GetListViewDetails();
78        Save();
79}
80
81void HaliteListViewCtrl::uiUpdate(const hal::TorrentDetails& tD)
82{
83        hal::try_update_lock<listClass> lock(*this);
84        if (lock) 
85        {
86       
87        foreach (const hal::TorrentDetail_ptr td, tD.torrents()) 
88        {
89                LV_FINDINFO findInfo; 
90                findInfo.flags = LVFI_STRING;
91                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
92               
93                int itemPos = FindItem(&findInfo, -1);
94                if (itemPos < 0)
95                        itemPos = AddItem(0, 0, td->name().c_str(), 0);
96
97                for (size_t i=1; i<NumberOfColumns_s; ++i)
98                {
99                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
100                }
101        }
102       
103        int iCol = GetSortColumn();
104        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
105                DoSortItems(iCol, IsSortDescending());
106       
107        }
108}
109
110HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
111{
112        boost::array<wchar_t, MAX_PATH> buffer;
113        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
114        wstring torrent = buffer.data();
115       
116        return hal::bittorrent().torrentDetails().get(torrent);
117}
118
119LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
120{
121        typedef winstl::listview_sequence::sequence_value_type lv_val;
122        winstl::listview_sequence lv_seq(*this);
123
124/*      std::for_each(make_filter_iterator(&is_selected, lv_seq.begin(), lv_seq.end()),
125                                  make_filter_iterator(&is_selected, lv_seq.end(), lv_seq.end()),
126                                  bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent,
127                                      &hal::bittorrent(),
128                                          bind(&hal::to_wstr_shim<const lv_val>, _1)));
129*/     
130        return 0;
131}
132
133LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
134{       
135        typedef winstl::listview_sequence::sequence_value_type lv_val;
136        winstl::listview_sequence lv_seq(*this);
137
138/*      std::for_each(make_filter_iterator(&is_selected, lv_seq.begin(), lv_seq.end()),
139                                  make_filter_iterator(&is_selected, lv_seq.end(), lv_seq.end()),
140                                  bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent,
141                                      &hal::bittorrent(),
142                                          bind(&hal::to_wstr_shim<const lv_val>, _1)));
143*/     
144        return 0;
145}
146
147LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
148{
149        typedef winstl::listview_sequence::sequence_value_type lv_val;
150        winstl::listview_sequence lv_seq(*this);
151
152/*      std::for_each(make_filter_iterator(&is_selected, lv_seq.begin(), lv_seq.end()),
153                                  make_filter_iterator(&is_selected, lv_seq.end(), lv_seq.end()),
154                                  bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent,
155                                      &hal::bittorrent(),
156                                          bind(&hal::to_wstr_shim<const lv_val>, _1)));
157*/
158        return 0;
159}
160
161LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
162{
163        hal::bittorrent().removeTorrent(hal::to_utf8(manager_.selected()));
164
165        clearFocused(); 
166        return 0;
167}
168
169LRESULT HaliteListViewCtrl::OnRemove(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::removeTorrent,
173                        &hal::bittorrent(), _1));
174*/
175        clearSelected();       
176        return 0;
177}
178
179LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
180{
181/*      std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
182                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent,
183                        &hal::bittorrent(), _1));       
184*/
185        return 0;
186}
187
188LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
189{
190        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
191                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
192        {
193/*              std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
194                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::removeTorrentWipeFiles,
195                                &hal::bittorrent(), _1));
196               
197*/              clearSelected();
198        }
199        return 0;
200}
201
202LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
203{
204        HAL_DEV_MSG(L"OnDownloadFolder");
205
206        std::set<wpath> uniquePaths;
207
208        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
209                i != e; ++i)
210        {
211                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
212                HAL_DEV_MSG(wformat(L"Name %1%, Save dir: %2%.") % *i % saveDir);
213
214                uniquePaths.insert(saveDir);
215        }
216
217        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
218
219        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
220                i != e; ++i)
221        {       
222                wstring p = (*i).file_string();
223
224                HAL_DEV_MSG(wformat(L"Unique Save dir: %1%.") % p);
225
226                sei.lpDirectory = p.c_str();
227                sei.lpFile = p.c_str();
228                sei.lpVerb = L"open";
229                sei.nShow = true;
230
231                if (!::ShellExecuteEx(&sei))
232                        HAL_DEV_MSG(L"Fail");
233                else
234                        HAL_DEV_MSG(L"Success");
235        }       
236
237        return 0;
238}
239
240LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
241{
242        HAL_DEV_MSG(L"OnEditFolders");
243
244        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
245        {
246                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
247                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
248
249                bool useMoveTo = (L"" != moveToDirectory);
250                bool disableSaveDir = !t.in_session;
251
252                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
253                        useMoveTo, disableSaveDir);     
254               
255                if (IDOK == addTorrent.DoModal())
256                {
257                        if (!disableSaveDir) t.save_directory = saveDirectory;
258
259                        if (useMoveTo)
260                                t.move_to_directory = moveToDirectory;
261                        else
262                                t.move_to_directory = L"";
263                }
264        }
265
266        return 0;
267}
268
269//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
270//{
271//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
272//      T* pItem=(T*)GetItemData(pnmv->iItem);
273//      ATLASSERT(pItem);
274//      if (pItem)      // Delete attached structure
275//              delete pItem;
276//      return 0;
277//}
Note: See TracBrowser for help on using the repository browser.