source: trunk/src/HaliteListView.cpp @ 616

Revision 616, 11.8 KB checked in by Eoin, 12 years ago (diff)

Queue adjustment almost implemented, one last bit to link up.

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
22
23HaliteListViewCtrl::HaliteListViewCtrl(HaliteWindow& HalWindow) :
24        halWindow_(HalWindow),
25        iniClass("listviews/halite", "HaliteListView"),
26        queue_view_(false)
27{               
28        HalWindow.connectUiUpdate(bind(&HaliteListViewCtrl::uiUpdate, this, _1));
29}
30
31void HaliteListViewCtrl::OnShowWindow(UINT, INT)
32{
33        WTL::CMenuHandle menu;
34        BOOL menu_created = menu.LoadMenu(HAL_LISTVIEW_MENU);
35        InitialSetup(menu);     
36
37        std::vector<wstring> names;     
38        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
39       
40        boost::split(names, column_names, boost::is_any_of(L";"));
41       
42        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,30,45};
43        array<bool, NumberOfColumns_s> visible = {true,true,true,true,true,true,true,true,true,true,true,\
44                true,true,true,true,true,true,true,true,true,true,true,true};
45
46        for (int i=0, e=NumberOfColumns_s; i < e; ++i)
47        {
48                AddColumn(names[i].c_str(), i, visible[i], widths[i]);
49        }       
50
51
52
53
54        SafeLoadFromIni();
55       
56        SetColumnSortType(0, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Name());
57        SetColumnSortType(1, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::State());
58        SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Progress());
59        SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
60        SetColumnSortType(4, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
61        SetColumnSortType(5, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Peers());
62        SetColumnSortType(6, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Seeds());
63        SetColumnSortType(7, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ETA());
64        SetColumnSortType(8, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::DistributedCopies());
65        SetColumnSortType(9, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Tracker());
66        SetColumnSortType(10, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::UpdateTrackerIn());
67        SetColumnSortType(11, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Ratio());
68        SetColumnSortType(12, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::TotalWanted());
69        SetColumnSortType(13, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Completed());
70        SetColumnSortType(14, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Remaining());
71        SetColumnSortType(15, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Downloaded());
72        SetColumnSortType(16, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Uploaded());
73        SetColumnSortType(17, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::ActiveTime());
74        SetColumnSortType(18, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SeedingTime());
75        SetColumnSortType(19, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::StartTime());
76        SetColumnSortType(20, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::FinishTime());
77        SetColumnSortType(21, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Managed());
78        SetColumnSortType(22, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::QueuePosition());
79
80        queue_view_mode();
81       
82/*      int item_pos = AddItem(0, 0, L"Unmanaged", 0);
83        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
84                       
85        item_pos = AddItem(0, 0, L"Downloading", 0);
86        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);
87                       
88        item_pos = AddItem(0, 0, L"Seeding", 0);
89        SetItemData(item_pos, HAL_CUSTOMDRAW_TITLEDATA);*/
90}
91
92void HaliteListViewCtrl::OnDestroy()
93{
94        saveSettings();
95}
96
97void HaliteListViewCtrl::saveSettings()
98{
99        GetListViewDetails();
100        save_to_ini();
101}
102
103DWORD HaliteListViewCtrl::OnPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
104{
105        return CDRF_NOTIFYITEMDRAW;
106}
107
108DWORD HaliteListViewCtrl::OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCD)
109{
110        NMLVCUSTOMDRAW* pnmlv = (NMLVCUSTOMDRAW*) lpNMCD;
111
112        if (HAL_CUSTOMDRAW_TITLEDATA == pnmlv->nmcd.lItemlParam)
113        {
114                pnmlv->clrText = RGB(50,50,200);
115        }
116
117        return CDRF_DODEFAULT;
118}
119
120void HaliteListViewCtrl::uiUpdate(const hal::torrent_details_manager& tD)
121{
122        hal::try_update_lock<listClass> lock(*this);
123        if (lock) 
124        {
125
126#       if 0
127        if (GetItemCount() > 0)
128        {
129                LVITEM lvItem = { 0 };
130                lvItem.mask = LVIF_TEXT|LVIF_GROUPID|LVIF_COLUMNS;
131                lvItem.iItem = 0;
132                lvItem.iSubItem = 0;
133
134                hal::win_c_str<std::wstring> str(2048);
135
136                lvItem.pszText = str;
137                lvItem.cchTextMax = str.size();
138
139                GetItem(&lvItem);
140                DeleteItem(lvItem.iItem);
141
142                lvItem.iItem = GetItemCount();
143                InsertItem(&lvItem);
144        }
145#       endif
146
147        foreach (const hal::torrent_details_ptr td, tD.torrents()) 
148        {
149
150                LV_FINDINFO findInfo; 
151                findInfo.flags = LVFI_STRING;
152                findInfo.psz = const_cast<LPTSTR>(td->name().c_str());
153               
154                int itemPos = FindItem(&findInfo, -1);
155                if (itemPos < 0)
156                {
157                        LVITEM lvItem = { 0 };
158                        lvItem.mask = LVIF_TEXT;
159                        lvItem.iItem = 0;
160                        lvItem.iSubItem = 0;
161                        lvItem.pszText = (LPTSTR)td->name().c_str();
162
163                        if (IsGroupViewEnabled())
164                        {
165                                lvItem.mask |= LVIF_GROUPID|LVIF_COLUMNS;
166
167                                if (td->managed())
168                                        lvItem.iGroupId = HAL_AUTO_MANAGED;
169                                else
170                                        lvItem.iGroupId = HAL_UNMANAGED;
171                        }
172
173                        lvItem.mask |= LVIF_IMAGE;
174                        lvItem.iImage = 0;
175
176                        itemPos = InsertItem(&lvItem);
177                }
178
179                for (size_t i=1; i<NumberOfColumns_s; ++i)
180                {
181                        SetItemText(itemPos, i, getColumnAdapter(i)->print(td).c_str());
182                }
183        }
184       
185        int iCol = GetSortColumn();
186        if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize())
187                DoSortItems(iCol, IsSortDescending());
188       
189        }
190}
191
192HaliteListViewCtrl::tD HaliteListViewCtrl::CustomItemConversion(LVCompareParam* param, int iSortCol)
193{
194        boost::array<wchar_t, MAX_PATH> buffer;
195        GetItemText(param->iItem, 0, buffer.c_array(), buffer.size());         
196        wstring torrent = buffer.data();
197       
198        return hal::bittorrent().torrentDetails().get(torrent);
199}
200
201LRESULT HaliteListViewCtrl::OnResume(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
202{
203        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
204                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::resumeTorrent, 
205                        &hal::bittorrent(), _1));
206       
207        return 0;
208}
209
210LRESULT HaliteListViewCtrl::OnPause(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
211{       
212        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
213                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::pauseTorrent, 
214                        &hal::bittorrent(), _1));
215       
216        return 0;
217}
218
219LRESULT HaliteListViewCtrl::OnStop(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
220{
221        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
222                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::stopTorrent, 
223                        &hal::bittorrent(), _1));
224
225        return 0;
226}
227
228LRESULT HaliteListViewCtrl::OnRemoveFocused(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
229{
230        hal::bittorrent().remove_torrent(hal::to_utf8(manager_.selected()));
231
232        clearFocused(); 
233        return 0;
234}
235
236LRESULT HaliteListViewCtrl::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
237{
238        foreach(const list_value_type& val, std::make_pair(is_selected_begin(), is_selected_end()))
239        {
240                hal::bittorrent().remove_torrent(val.text().c_str());
241        }
242        clearSelected();
243
244        return 0;
245}
246
247LRESULT HaliteListViewCtrl::OnRecheck(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
248{
249        std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
250                bind((void (hal::bit::*)(const std::wstring&))&hal::bit::recheckTorrent, 
251                        &hal::bittorrent(), _1));       
252
253        return 0;
254}
255
256LRESULT HaliteListViewCtrl::OnRemoveWipeFiles(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
257{
258        if(MessageBox(hal::app().res_wstr(HAL_LISTVIEW_CONFIRMDELETE).c_str(), 
259                                hal::app().res_wstr(HAL_HALITE).c_str(), MB_YESNO) == IDYES)
260        {
261                std::for_each(manager().allSelected().begin(), manager().allSelected().end(),
262                        bind((void (hal::bit::*)(const std::wstring&))&hal::bit::remove_torrent_wipe_files, 
263                                &hal::bittorrent(), _1));
264               
265                clearSelected();
266        }
267        return 0;
268}
269
270LRESULT HaliteListViewCtrl::OnDownloadFolder(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
271{
272        HAL_DEV_MSG(L"OnDownloadFolder");
273
274        std::set<wpath> uniquePaths;
275
276        for(std::set<wstring>::const_iterator i=manager().allSelected().begin(), e=manager().allSelected().end();
277                i != e; ++i)
278        {
279                wpath saveDir = hal::bittorrent().get(*i).save_directory;               
280                HAL_DEV_MSG(hal::wform(L"Name %1%, Save dir: %2%.") % *i % saveDir);
281
282                uniquePaths.insert(saveDir);
283        }
284
285        SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
286
287        for(std::set<wpath>::const_iterator i=uniquePaths.begin(), e=uniquePaths.end();
288                i != e; ++i)
289        {       
290                wstring p = (*i).file_string();
291
292                HAL_DEV_MSG(hal::wform(L"Unique Save dir: %1%.") % p);
293
294                sei.lpDirectory = p.c_str();
295                sei.lpFile = p.c_str();
296                sei.lpVerb = L"open";
297                sei.nShow = true;
298
299                if (!::ShellExecuteEx(&sei))
300                        HAL_DEV_MSG(L"Fail");
301                else
302                        HAL_DEV_MSG(L"Success");
303        }       
304
305        return 0;
306}
307
308LRESULT HaliteListViewCtrl::OnEditFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
309{
310        HAL_DEV_MSG(L"OnEditFolders");
311
312        if (hal::bit::torrent t = hal::bittorrent().get(manager_.selected()))
313        {
314                wstring saveDirectory = static_cast<wpath>(t.save_directory).native_file_string();
315                wstring moveToDirectory = static_cast<wpath>(t.move_to_directory).native_file_string();
316
317                bool useMoveTo = (L"" != moveToDirectory);
318                bool disableSaveDir = !t.in_session;
319
320                HaliteListViewAdjustDlg addTorrent(hal::app().res_wstr(HAL_ADDT_TITLE), saveDirectory, moveToDirectory, 
321                        useMoveTo, disableSaveDir);     
322               
323                if (IDOK == addTorrent.DoModal())
324                {
325                        if (!disableSaveDir) t.save_directory = saveDirectory;
326
327                        if (useMoveTo)
328                                t.move_to_directory = moveToDirectory;
329                        else
330                                t.move_to_directory = L"";
331                }
332        }
333
334        return 0;
335}
336
337LRESULT HaliteListViewCtrl::OnQueueView(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
338{
339        queue_view_ ^= true;
340
341        queue_view_mode();
342       
343        return 0;
344}
345
346void HaliteListViewCtrl::queue_view_mode()
347{
348        DeleteAllItems();
349
350        if (queue_view_)
351        {
352                int ret = EnableGroupView(true);
353                if (IsGroupViewEnabled())
354                {
355                        LVGROUP lvg = { sizeof(LVGROUP) };
356
357                        lvg.mask = LVGF_HEADER|LVGF_GROUPID ;
358                        wstring unmanaged = hal::app().res_wstr(HAL_UNMANAGED);
359                        lvg.pszHeader = (LPWSTR)unmanaged.c_str();
360                        lvg.iGroupId = HAL_UNMANAGED;
361
362                        int grp = InsertGroup(-1, &lvg);
363
364                        lvg.mask = LVGF_HEADER|LVGF_GROUPID ;
365                        wstring managed_seed = hal::app().res_wstr(HAL_MANAGED_SEEDING);
366                        lvg.pszHeader = (LPWSTR)managed_seed.c_str();
367                        lvg.iGroupId = HAL_MANAGED_SEEDING;
368
369                        grp = InsertGroup(-1, &lvg);
370
371                        lvg.mask = LVGF_HEADER|LVGF_GROUPID ;
372                        wstring managed_down = hal::app().res_wstr(HAL_MANAGED_DOWNLOADING);
373                        lvg.pszHeader = (LPWSTR)managed_down.c_str();
374                        lvg.iGroupId = HAL_MANAGED_DOWNLOADING;
375
376                        grp = InsertGroup(-1, &lvg);
377
378                        lvg.mask = LVGF_HEADER|LVGF_GROUPID ;
379                        wstring auto_managed = hal::app().res_wstr(HAL_AUTO_MANAGED);
380                        lvg.pszHeader = (LPWSTR)auto_managed.c_str();
381                        lvg.iGroupId = HAL_AUTO_MANAGED;
382
383                        grp = InsertGroup(-1, &lvg);
384                }
385        }
386        else
387        {
388                RemoveAllGroups();
389                int ret = EnableGroupView(false);
390        }
391
392        MENUITEMINFO minfo = {sizeof(MENUITEMINFO)};
393       
394        minfo.fMask = MIIM_STATE;
395        minfo.fState = queue_view_ ? MFS_CHECKED : MFS_UNCHECKED;
396       
397        menu_.SetMenuItemInfo(HAL_LVM_QUEUE_VIEW, false, &minfo);
398}
399
400//LRESULT HaliteListViewCtrl::OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
401//{
402//      LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
403//      T* pItem=(T*)GetItemData(pnmv->iItem);
404//      ATLASSERT(pItem);
405//      if (pItem)      // Delete attached structure
406//              delete pItem;
407//      return 0;
408//}
Note: See TracBrowser for help on using the repository browser.