source: trunk/src/HaliteListView.cpp @ 657

Revision 657, 12.3 KB checked in by Eoin, 11 years ago (diff)

Classic sorting and external sorting not playing nice together.

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