source: trunk/src/HaliteListView.cpp @ 651

Revision 651, 13.7 KB checked in by Eoin, 11 years ago (diff)

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