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

Revision 659, 3.5 KB checked in by Eoin, 11 years ago (diff)

Peer list sorting fixed and so more naming conventions consistency work.

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                peer_details_.clear();
21               
22                foreach (const hal::torrent_details_ptr torrent, tD.selectedTorrents())
23                {
24                        std::copy(torrent->get_peer_details().begin(), torrent->get_peer_details().end(), 
25                                std::back_inserter(peer_details_));
26                }
27               
28                std::sort(peer_details_.begin(), peer_details_.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::peer_detail ip(ip_address.data());
37                        hal::peer_details_vec::iterator iter = 
38                                std::lower_bound(peer_details_.begin(), peer_details_.end(), ip);
39                       
40                        if (iter == peer_details_.end() || !((*iter) == ip))
41                        {
42                                DeleteItem(i);
43                        }
44                        else
45                        {
46                                SetItemData(i, std::distance(peer_details_.begin(), iter));
47                                ++i;
48                        }
49                }
50                       
51                int col_sort_index = GetSortColumn();
52
53                if (col_sort_index != -1)
54                {               
55                        int index = GetColumnSortType(col_sort_index);
56                       
57                        HAL_DEV_MSG(hal::wform(L"col_sort_index() = %1%, index() = %2%") 
58                                % col_sort_index % index);
59
60                        if (index > WTL::LVCOLSORT_LAST)
61                                hal::peer_details_sort(peer_details_, index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), 
62                                        IsSortDescending());
63                }
64
65                bool sort_once = IsSortOnce();
66
67                // Add additional details       
68                for (size_t index = 0, e = peer_details_.size(); index < e; ++index)
69                {
70                        hal::peer_detail& pd = peer_details_[index];
71               
72                        int item_pos = index;
73               
74                        HAL_DEV_SORT_MSG(hal::wform(L"AutoSort() = %1%, SortOnce() = %2%, !AutoSort() && !SortOnce() = %3%") 
75                                % AutoSort() % sort_once % (!AutoSort() && !sort_once));
76
77                        if (!AutoSort() && !sort_once)
78                        {
79                                LV_FINDINFO findInfo; 
80                                findInfo.flags = LVFI_STRING;
81                                findInfo.psz = const_cast<LPTSTR>(pd.to_wstring(hal::peer_detail::ip_address_e).c_str());
82                               
83                                item_pos = FindItem(&findInfo, -1);
84                        }
85
86                        if (item_pos == -1 || item_pos > GetItemCount())
87                                item_pos = AddItem(GetItemCount(), 0, pd.to_wstring(hal::peer_detail::ip_address_e).c_str(), 0);
88                       
89                       
90                        HAL_DEV_SORT_MSG(hal::wform(L"item_pos = %1%") % item_pos);
91
92                        SetItemData(item_pos, index);                   
93
94                        for (size_t i = 0; i < 7; ++i)
95                        {
96                                SetItemText(item_pos, i, pd.to_wstring(i).c_str());
97                        }
98                }
99               
100                if (AutoSort() && col_sort_index >= 0 && col_sort_index < m_arrColSortType.GetSize())
101                {
102                        if (GetColumnSortType(col_sort_index) <= WTL::LVCOLSORT_CUSTOM)
103                                DoSortItems(col_sort_index, IsSortDescending());
104                }
105        }
106}
107
108LRESULT PeerListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&)
109{
110        halite_window_.issueUiUpdate();
111       
112        return 0;
113}
114
115void AdvPeerDialog::uiUpdate(const hal::torrent_details_manager& tD)
116{
117        peerList_.uiUpdate(tD);
118}
119
120LRESULT AdvPeerDialog::OnInitDialog(HWND, LPARAM)
121{       
122        peerList_.SubclassWindow(GetDlgItem(HAL_PEERLIST));
123       
124        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);     
125       
126        return 0;
127}
128
129void AdvPeerDialog::OnClose()
130{
131        if(::IsWindow(m_hWnd)) 
132        {
133                ::DestroyWindow(m_hWnd);
134        }
135}
Note: See TracBrowser for help on using the repository browser.