source: trunk/src/HaliteListView.cpp @ 614

Revision 614, 10.9 KB checked in by Eoin, 11 years ago (diff)

ListView? grouping works. But a lacking on the API side means it's incompatible with sorting!

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