source: trunk/src/HaliteDialog.cpp @ 659

Revision 659, 17.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 <algorithm>
8#include <boost/format.hpp>
9#include <boost/array.hpp>
10
11#include "stdAfx.hpp"
12#include "HaliteDialog.hpp"
13#include "HaliteWindow.hpp"
14#include "HaliteListView.hpp"
15#include "halEvent.hpp"
16
17HaliteDialog::HaliteDialog(HaliteWindow& halWindow) :
18        dialogBaseClass(halWindow)
19{}
20
21LRESULT HaliteDialog::OnInitDialog(HWND, LPARAM)
22{
23
24//              MARGINS m = {20, 20, 0, 100};
25//              SetMargins(m);
26
27        m_prog.Attach(GetDlgItem(TORRENTPROG));
28        m_prog.SetRange(0, 100);
29       
30        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
31       
32        totalConnections_.Attach(GetDlgItem(HAL_EDITNCD));
33        uploadConnections_.Attach(GetDlgItem(HAL_EDITNCU));
34        downloadRate_.Attach(GetDlgItem(HAL_EDITTLD));
35        uploadRate_.Attach(GetDlgItem(HAL_EDITTLU));
36       
37        totalConnections_ = -1;
38        uploadConnections_ = -1;
39        downloadRate_ = -1;
40        uploadRate_ = -1;       
41       
42        DoDataExchange(false);
43
44        return 0;
45}
46
47HaliteDialog::CWindowMapStruct* HaliteDialog::GetWindowMap()
48{
49#define TORRENT_LIMITS_LAYOUT \
50        WMB_HEAD(WMB_COL(_exp|20), WMB_COL(_exp|30), WMB_COL(_exp|20), WMB_COL(_exp|30)), \
51                WMB_ROW(10,     HAL_TL, _r, _r, _r), \
52                WMB_ROW(11,     HAL_TLD, HAL_EDITTLD, HAL_TLU, HAL_EDITTLU), \
53                WMB_ROW(10,     HAL_NC, _r, _r, _r), \
54                WMB_ROW(11,     HAL_NCD, HAL_EDITNCD, HAL_NCU, HAL_EDITNCU), \
55        WMB_END()
56
57#define TORRENT_STATUS_LAYOUT \
58        WMB_HEAD(WMB_COL(45), WMB_COLNOMIN(_exp|100), WMB_COL(_eq|0), WMB_COL(_exp|200)), \
59                WMB_ROW(_gap), \
60                WMB_ROW(_auto,  HAL_NAME_STATIC, HAL_NAME, _r, _r), \
61                WMB_ROW(_auto,  HAL_TRACKER_STATIC, HAL_TRACKER, _r, _r), \
62                WMB_ROW(_auto,  HAL_STATUS_STATIC, HAL_STATUS, _r, _r), \
63                WMB_ROW(_auto,  HAL_TIME_STATIC, HAL_AVAIL, HAL_COMPLETED_STATIC, HAL_COMPLETE), \
64        WMB_END()
65       
66#define TORRENT_BUTTON_LAYOUT \
67        WMB_HEAD(WMB_COL(_exp)), \
68                WMB_ROW(_gap), \
69                WMB_ROWMINNOMAX(_exp, 13, BTNPAUSE), \
70                WMB_ROWMINNOMAX(_exp, 13, BTNREANNOUNCE), \
71                WMB_ROWMINNOMAX(_exp, 13, BTNREMOVE), \
72        WMB_END()       
73
74        BEGIN_WINDOW_MAP_INLINE(HaliteDialog, 6, 0, 3, 3)
75                WMB_HEAD(WMB_COL(_gap), WMB_COL(_exp), WMB_COL(120), WMB_COL(60), WMB_COL(_gap)), 
76                        WMB_ROW(_gap,   HAL_DETAILS_GROUP, _r, _r, _r, _r), 
77                        WMB_ROW(_auto,  _d, TORRENT_STATUS_LAYOUT, TORRENT_LIMITS_LAYOUT, TORRENT_BUTTON_LAYOUT), 
78                        WMB_ROW(_gap, _d),
79                        WMB_ROWMIN(_auto, 8, _d, TORRENTPROG, _r, _r), 
80                        WMB_ROW(_gap, _d), 
81                        WMB_ROWNOMAX(_exp, _d, LISTPEERS, _r, _r), 
82                        WMB_ROW(_gap, _d), 
83                        WMB_ROW(_gap|3), 
84                WMB_END() 
85        END_WINDOW_MAP_INLINE() 
86}
87
88void HaliteDialog::saveStatus()
89{
90        m_list.saveSettings();
91}
92
93void HaliteDialog::OnClose()
94{
95        saveStatus();
96       
97        if(::IsWindow(m_hWnd)) 
98        {
99                ::DestroyWindow(m_hWnd);
100        }
101}
102
103void HaliteDialog::OnPause(UINT, int, HWND)
104{
105        if (hal::torrent_details_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
106        {
107                string torrentName = hal::to_utf8(torrent->name());
108               
109                if (!hal::bittorrent().is_torrent_active(torrentName))
110                {
111                        SetDlgItemText(BTNPAUSE,L"Pause");
112                        hal::bittorrent().resume_torrent(torrentName);
113                }
114                else
115                {
116                        SetDlgItemText(BTNPAUSE,L"Resume");
117                        hal::bittorrent().pause_torrent(torrentName);
118                }
119               
120                requestUiUpdate();
121        }
122}
123
124void HaliteDialog::OnReannounce(UINT, int, HWND)
125{
126        if (hal::torrent_details_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
127                hal::bittorrent().reannounce_torrent(hal::to_utf8(torrent->name()));
128}
129
130void HaliteDialog::OnRemove(UINT, int, HWND)
131{
132        if (hal::torrent_details_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
133        {
134                string torrentName = hal::to_utf8(torrent->name());
135
136                hal::bittorrent().remove_torrent(torrentName);
137                torrentsList().clearFocused();
138        }
139}
140
141LRESULT HaliteDialog::OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam)
142{
143        if (hal::bit::torrent t = hal::bittorrent().get(focusedTorrent()))
144        {
145                t.rate_limits = std::pair<float, float>(downloadRate_, uploadRate_);
146                t.connection_limits = std::pair<int, int>(totalConnections_, uploadConnections_);
147        }
148       
149        return 0;
150}
151
152LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
153{       
154        ::SetTextColor(hDC, RGB(255, 0, 255)); 
155       
156        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
157}
158
159void HaliteDialog::DialogListView::uiUpdate(const hal::torrent_details_manager& tD) 
160{       
161        hal::try_update_lock<listClass> lock(*this);
162        if (lock) 
163        {               
164                peer_details_ = tD.focusedTorrent()->get_peer_details();
165               
166                std::sort(peer_details_.begin(), peer_details_.end());
167               
168                // Wipe details not present
169                for(int i = 0; i < GetItemCount(); /*nothing here*/)
170                {
171                        boost::array<wchar_t, MAX_PATH> ip_address;
172                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
173                       
174                        hal::peer_detail ip(ip_address.data());
175                        hal::peer_details_vec::iterator iter = 
176                                std::lower_bound(peer_details_.begin(), peer_details_.end(), ip);
177                       
178                        if (iter == peer_details_.end() || !((*iter) == ip))
179                        {
180                                DeleteItem(i);
181                        }
182                        else
183                        {
184                                SetItemData(i, std::distance(peer_details_.begin(), iter));
185                                ++i;
186                        }
187                }
188               
189                // Add additional details
190                for (hal::peer_details_vec::iterator i=peer_details_.begin(), e=peer_details_.end();
191                        i != e; ++i)
192                {                       
193                        LV_FINDINFO findInfo; 
194                        findInfo.flags = LVFI_STRING;
195                        findInfo.psz = const_cast<LPTSTR>((*i).ip_address.c_str());
196                       
197                        int itemPos = FindItem(&findInfo, -1);
198                        if (itemPos < 0)
199                                itemPos = AddItem(GetItemCount(), 0, (*i).ip_address.c_str(), 0);
200                       
201                        SetItemData(itemPos, std::distance(peer_details_.begin(), i));
202                       
203                        SetItemText(itemPos, 1, (*i).country.c_str());
204                       
205                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
206                       
207                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
208                       
209                        if ((*i).seed)
210                                SetItemText(itemPos, 4, L"Seed");
211                       
212                        SetItemText(itemPos, 5, (*i).client.c_str());
213                }
214               
215//              ConditionallyDoAutoSort();
216        }
217}
218
219void HaliteDialog::focusChanged(const hal::torrent_details_ptr pT)
220{
221        std::pair<float, float> tranLimit(-1.0, -1.0);
222        std::pair<int, int> connLimit(-1, -1);
223       
224        if (hal::bit::torrent t = hal::bittorrent().get(focusedTorrent()))
225        {
226                tranLimit = t.rate_limits;
227                connLimit = t.connection_limits;
228               
229                if (!t.is_active)
230                        SetDlgItemText(BTNPAUSE, L"Resume");
231                else           
232                        SetDlgItemText(BTNPAUSE, L"Pause");
233               
234                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
235                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
236                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
237               
238                ::EnableWindow(GetDlgItem(HAL_EDITTLD), true);
239                ::EnableWindow(GetDlgItem(HAL_EDITTLU), true);
240                ::EnableWindow(GetDlgItem(HAL_EDITNCD), true);
241                ::EnableWindow(GetDlgItem(HAL_EDITNCU), true);
242        }
243        else
244        {
245                SetDlgItemText(HAL_NAME, hal::app().res_wstr(HAL_NA).c_str());
246                SetDlgItemText(HAL_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
247                SetDlgItemText(HAL_STATUS, hal::app().res_wstr(HAL_NA).c_str());
248                SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
249                SetDlgItemText(HAL_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
250               
251                SetDlgItemText(BTNPAUSE, L"Pause");             
252                m_prog.SetPos(0);
253               
254                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
255                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
256                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
257               
258                ::EnableWindow(GetDlgItem(HAL_EDITTLD), false);
259                ::EnableWindow(GetDlgItem(HAL_EDITTLU), false);
260                ::EnableWindow(GetDlgItem(HAL_EDITNCD), false);
261                ::EnableWindow(GetDlgItem(HAL_EDITNCU), false);
262        }
263       
264        totalConnections_ = connLimit.first;
265        uploadConnections_ = connLimit.second;
266        downloadRate_ = tranLimit.first;
267        uploadRate_ = tranLimit.second;
268       
269        m_list.clearAll();
270       
271        DoDataExchange(false);
272}
273
274void HaliteDialog::uiUpdate(const hal::torrent_details_manager& tD)
275{       
276        std::pair<float, float> tranLimit(-1.0, -1.0);
277        std::pair<int, int> connLimit(-1, -1);
278       
279        if (hal::torrent_details_ptr torrent = tD.focusedTorrent())     
280        {       
281                string torrent_name = hal::to_utf8(torrent->name());
282               
283                SetDlgItemText(HAL_NAME, torrent->name().c_str());
284                SetDlgItemText(HAL_TRACKER, torrent->current_tracker().c_str());
285                SetDlgItemText(HAL_STATUS, torrent->state().c_str());
286                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
287               
288                if (!torrent->estimated_time_left().is_special())
289                {
290                        SetDlgItemText(HAL_AVAIL,
291                                (hal::from_utf8(boost::posix_time::to_simple_string(
292                                        torrent->estimated_time_left())).c_str()));
293                }
294                else
295                {
296                        SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
297                }
298               
299                SetDlgItemText(HAL_COMPLETE,
300                        (hal::wform(L"%1$.2fmb of %2$.2fmb") 
301                                % (static_cast<float>(torrent->total_wanted_done())/(1024*1024))
302                                % (static_cast<float>(torrent->total_wanted())/(1024*1024))
303                        ).str().c_str());
304               
305                m_list.uiUpdate(tD);
306        }
307}
Note: See TracBrowser for help on using the repository browser.