source: trunk/src/HaliteListView.cpp @ 508

Revision 508, 8.6 KB checked in by Eoin, 11 years ago (diff)

Major SortList? de-blobbing.

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