source: trunk/src/HaliteListView.cpp @ 503

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

Cleaned up trunk alert handler code.

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        SafeLoadFromIni();
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, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
48        SetColumnSortType(1, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::State());
49        SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
50        SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
51        SetColumnSortType(4, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
52        SetColumnSortType(5, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
53        SetColumnSortType(6, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
54        SetColumnSortType(7, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
55        SetColumnSortType(8, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
56        SetColumnSortType(9, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
57        SetColumnSortType(10, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
58        SetColumnSortType(11, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
59        SetColumnSortType(12, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
60        SetColumnSortType(13, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
61        SetColumnSortType(14, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
62        SetColumnSortType(15, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
63        SetColumnSortType(16, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
64        SetColumnSortType(17, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
65        SetColumnSortType(18, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
66        SetColumnSortType(19, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
67        SetColumnSortType(20, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
68}
69
70void HaliteListViewCtrl::OnDestroy()
71{
72        saveSettings();
73}
74
75void HaliteListViewCtrl::saveSettings()
76{
77        GetListViewDetails();
78        save_to_ini();
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        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
122                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent, 
123                        &hal::bittorrent(), _1));
124       
125        return 0;
126}
127
128LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
129{       
130        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
131                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent, 
132                        &hal::bittorrent(), _1));
133       
134        return 0;
135}
136
137LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
138{
139        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
140                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent, 
141                        &hal::bittorrent(), _1));
142
143        return 0;
144}
145
146LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
147{
148        hal::bittorrent().remove_torrent(hal::to_utf8(manager_.selected()));
149
150        clearFocused(); 
151        return 0;
152}
153
154LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
155{
156        foreach(const list_value_type& val, std::make_pair(is_selected_begin(), is_selected_end()))
157        {
158                hal::bittorrent().remove_torrent(val.text().c_str());
159        }
160        clearSelected();
161
162        return 0;
163}
164
165LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
166{
167        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
168                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent, 
169                        &hal::bittorrent(), _1));       
170
171        return 0;
172}
173
174LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
175{
176        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
177                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
178        {
179                std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
180                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::remove_torrent_wipe_files, 
181                                &hal::bittorrent(), _1));
182               
183                clearSelected();
184        }
185        return 0;
186}
187
188LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
189{
190        HAL_DEV_MSG(L"OnDownloadFolder");
191
192        std::set<wpath> uniquePaths;
193
194        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
195                i != e; ++i)
196        {
197                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
198                HAL_DEV_MSG(wformat(L"Name %1%, Save dir: %2%.") % *i % saveDir);
199
200                uniquePaths.insert(saveDir);
201        }
202
203        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
204
205        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
206                i != e; ++i)
207        {       
208                wstring p = (*i).file_string();
209
210                HAL_DEV_MSG(wformat(L"Unique Save dir: %1%.") % p);
211
212                sei.lpDirectory = p.c_str();
213                sei.lpFile = p.c_str();
214                sei.lpVerb = L"open";
215                sei.nShow = true;
216
217                if (!::ShellExecuteEx(&sei))
218                        HAL_DEV_MSG(L"Fail");
219                else
220                        HAL_DEV_MSG(L"Success");
221        }       
222
223        return 0;
224}
225
226LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
227{
228        HAL_DEV_MSG(L"OnEditFolders");
229
230        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
231        {
232                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
233                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
234
235                bool useMoveTo = (L"" != moveToDirectory);
236                bool disableSaveDir = !t.in_session;
237
238                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
239                        useMoveTo, disableSaveDir);     
240               
241                if (IDOK == addTorrent.DoModal())
242                {
243                        if (!disableSaveDir) t.save_directory = saveDirectory;
244
245                        if (useMoveTo)
246                                t.move_to_directory = moveToDirectory;
247                        else
248                                t.move_to_directory = L"";
249                }
250        }
251
252        return 0;
253}
254
255//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
256//{
257//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
258//      T* pItem=(T*)GetItemData(pnmv->iItem);
259//      ATLASSERT(pItem);
260//      if (pItem)      // Delete attached structure
261//              delete pItem;
262//      return 0;
263//}
Note: See TracBrowser for help on using the repository browser.