source: trunk/src/HaliteListView.cpp @ 656

Revision 656, 12.9 KB checked in by Eoin, 11 years ago (diff)

Halite ListView? sorting fully working. Clean up to follow.

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