source: trunk/src/advtabs/Peers.cpp @ 658

Revision 658, 2.8 KB checked in by Eoin, 11 years ago (diff)

All sorting playing nice. Now gotta expand code to other listviews.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
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 "../HaliteWindow.hpp"
10#include "../HaliteListView.hpp"
11#include "../global/logger.hpp"
12
13#include "Peers.hpp"
14
15void PeerListView::uiUpdate(const hal::torrent_details_manager& tD)
16{
17        hal::try_update_lock<listClass> lock(*this);
18        if (lock) 
19        {               
20                peerDetails_.clear();
21               
22                foreach (const hal::torrent_details_ptr torrent, tD.selectedTorrents())
23                {
24                        std::copy(torrent->peerDetails().begin(), torrent->peerDetails().end(), 
25                                std::back_inserter(peerDetails_));
26                }
27               
28                std::sort(peerDetails_.begin(), peerDetails_.end());
29               
30                // Wipe details not present
31                for(int i = 0; i < GetItemCount(); /*nothing here*/)
32                {
33                        boost::array<wchar_t, MAX_PATH> ip_address;
34                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
35                       
36                        hal::PeerDetail ip(ip_address.data());
37                        hal::PeerDetails::iterator iter = 
38                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip);
39                       
40                        if (iter == peerDetails_.end() || !((*iter) == ip))
41                        {
42                                DeleteItem(i);
43                        }
44                        else
45                        {
46                                SetItemData(i, std::distance(peerDetails_.begin(), iter));
47                                ++i;
48                        }
49                }
50               
51                int col_sort_index = GetSortColumn();
52
53                // Add additional details
54                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end();
55                        i != e; ++i)
56                {                       
57                        LV_FINDINFO findInfo; 
58                        findInfo.flags = LVFI_STRING;
59                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
60                       
61                        int itemPos = FindItem(&findInfo, -1);
62                        if (itemPos < 0)
63                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0);
64                       
65                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i));
66                       
67                        SetItemText(itemPos, 1, (*i).country.c_str());
68                       
69                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
70                       
71                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
72                       
73                        if ((*i).seed)
74                                SetItemText(itemPos, 4, L"Seed");
75                       
76                        SetItemText(itemPos, 5, (*i).client.c_str());
77                       
78                        SetItemText(itemPos, 6, (*i).status.c_str());
79                }
80               
81                if (AutoSort() && col_sort_index >= 0 && col_sort_index < m_arrColSortType.GetSize())
82                {
83                        if (GetColumnSortType(col_sort_index) <= WTL::LVCOLSORT_CUSTOM)
84                                DoSortItems(col_sort_index, IsSortDescending());
85                }
86        }
87}
88
89void AdvPeerDialog::uiUpdate(const hal::torrent_details_manager& tD)
90{
91        peerList_.uiUpdate(tD);
92}
93
94LRESULT AdvPeerDialog::OnInitDialog(HWND, LPARAM)
95{       
96        peerList_.SubclassWindow(GetDlgItem(HAL_PEERLIST));
97       
98        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);     
99       
100        return 0;
101}
102
103void AdvPeerDialog::OnClose()
104{
105        if(::IsWindow(m_hWnd)) 
106        {
107                ::DestroyWindow(m_hWnd);
108        }
109}
Note: See TracBrowser for help on using the repository browser.