source: trunk/src/HaliteDialog.cpp @ 358

Revision 358, 17.0 KB checked in by Eoin, 13 years ago (diff)

0.3 rc

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        m_prog.Attach(GetDlgItem(TORRENTPROG));
24        m_prog.SetRange(0, 100);
25       
26        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
27       
28        NoConnDown = -1;
29        NoConnUp = -1;
30        TranLimitDown = -1;
31        TranLimitUp = -1;       
32       
33        DoDataExchange(false);
34        return 0;
35}
36
37HaliteDialog::CWindowMapStruct* HaliteDialog::GetWindowMap()
38{
39#define TORRENT_LIMITS_LAYOUT \
40        WMB_HEAD(WMB_COL(_exp|20), WMB_COL(_exp|30), WMB_COL(_exp|20), WMB_COL(_exp|30)), \
41                WMB_ROW(10,     IDC_TL, _r, _r, _r), \
42                WMB_ROW(11,     IDC_TLD, IDC_EDITTLD, IDC_TLU, IDC_EDITTLU), \
43                WMB_ROW(10,     IDC_NC, _r, _r, _r), \
44                WMB_ROW(11,     IDC_NCD, IDC_EDITNCD, IDC_NCU, IDC_EDITNCU), \
45        WMB_END()
46
47#define TORRENT_STATUS_LAYOUT \
48        WMB_HEAD(WMB_COL(45), WMB_COLNOMIN(_exp|100), WMB_COL(_eq|0), WMB_COL(_exp|200)), \
49                WMB_ROW(_auto,  IDC_NAME_STATIC, IDC_NAME, _r, _r), \
50                WMB_ROW(_auto,  IDC_TRACKER_STATIC, IDC_TRACKER, _r, _r), \
51                WMB_ROW(_gap), \
52                WMB_ROW(_auto,  IDC_STATUS_STATIC, IDC_STATUS, _r, _r), \
53                WMB_ROW(_auto,  IDC_TIME_STATIC, IDC_AVAIL, IDC_COMPLETED_STATIC, IDC_COMPLETE), \
54        WMB_END()
55       
56#define TORRENT_BUTTON_LAYOUT \
57        WMB_HEAD(WMB_COL(_exp)), \
58                WMB_ROW(_gap), \
59                WMB_ROWMINNOMAX(_exp, 13, BTNPAUSE), \
60                WMB_ROWMINNOMAX(_exp, 13, BTNREANNOUNCE), \
61                WMB_ROWMINNOMAX(_exp, 13, BTNREMOVE), \
62        WMB_END()       
63
64        BEGIN_WINDOW_MAP_INLINE(HaliteDialog, 6, 0, 3, 3)
65                WMB_HEAD(WMB_COL(_gap), WMB_COL(_exp), WMB_COL(120), WMB_COL(60), WMB_COL(_gap)), 
66                        WMB_ROW(_gap,   IDC_DETAILS_GROUP, _r, _r, _r, _r), 
67                        WMB_ROW(_auto,  _d, TORRENT_STATUS_LAYOUT, TORRENT_LIMITS_LAYOUT, TORRENT_BUTTON_LAYOUT), 
68                        WMB_ROW(_gap, _d),
69                        WMB_ROWMIN(_auto, 8, _d, TORRENTPROG, _r, _r), 
70                        WMB_ROW(_gap, _d), 
71                        WMB_ROWNOMAX(_exp, _d, LISTPEERS, _r, _r), 
72                        WMB_ROW(_gap, _d), 
73                        WMB_ROW(_gap|3), 
74                WMB_END() 
75        END_WINDOW_MAP_INLINE() 
76}
77
78void HaliteDialog::saveStatus()
79{
80        m_list.saveSettings();
81}
82
83void HaliteDialog::OnClose()
84{
85        saveStatus();
86       
87        if(::IsWindow(m_hWnd)) 
88        {
89                ::DestroyWindow(m_hWnd);
90        }
91}
92
93void HaliteDialog::OnPause(UINT, int, HWND)
94{
95        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
96        {
97                string torrentName = hal::to_utf8(torrent->name());
98               
99                if (!hal::bittorrent().isTorrentActive(torrentName))
100                {
101                        SetDlgItemText(BTNPAUSE,L"Pause");
102                        hal::bittorrent().resumeTorrent(torrentName);
103                }
104                else
105                {
106                        SetDlgItemText(BTNPAUSE,L"Resume");
107                        hal::bittorrent().pauseTorrent(torrentName);
108                }
109               
110                requestUiUpdate();
111        }
112}
113
114void HaliteDialog::OnReannounce(UINT, int, HWND)
115{
116        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
117                hal::bittorrent().reannounceTorrent(hal::to_utf8(torrent->name()));
118}
119
120void HaliteDialog::OnRemove(UINT, int, HWND)
121{
122        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
123        {
124                string torrentName = hal::to_utf8(torrent->name());
125
126                hal::bittorrent().removeTorrent(torrentName);
127                torrentsList().clearFocused();
128        }
129}
130
131LRESULT HaliteDialog::OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl)
132{
133        DoDataExchange(true);
134       
135        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
136        {
137                string torrentName = hal::to_utf8(torrent->name());
138               
139                hal::bittorrent().setTorrentSpeed(torrentName, TranLimitDown, TranLimitUp);
140                hal::bittorrent().setTorrentLimit(torrentName, NoConnDown, NoConnUp);
141        }
142       
143        return 0;
144}
145
146LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
147{       
148        ::SetTextColor(hDC, RGB(255, 0, 255)); 
149       
150        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
151}
152
153void HaliteDialog::DialogListView::uiUpdate(const hal::TorrentDetails& tD) 
154{       
155        TryUpdateLock<listClass> lock(*this);
156        if (lock) 
157        {               
158                peerDetails_ = tD.focusedTorrent()->peerDetails();
159               
160                std::sort(peerDetails_.begin(), peerDetails_.end());
161               
162                // Wipe details not present
163                for(int i = 0; i < GetItemCount(); /*nothing here*/)
164                {
165                        boost::array<wchar_t, MAX_PATH> ip_address;
166                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
167                       
168                        hal::PeerDetail ip(ip_address.data());
169                        hal::PeerDetails::iterator iter = 
170                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip);
171                       
172                        if (iter == peerDetails_.end() || !((*iter) == ip))
173                        {
174                                DeleteItem(i);
175                        }
176                        else
177                        {
178                                SetItemData(i, std::distance(peerDetails_.begin(), iter));
179                                ++i;
180                        }
181                }
182               
183                // Add additional details
184                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end();
185                        i != e; ++i)
186                {                       
187                        LV_FINDINFO findInfo; 
188                        findInfo.flags = LVFI_STRING;
189                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
190                       
191                        int itemPos = FindItem(&findInfo, -1);
192                        if (itemPos < 0)
193                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0);
194                       
195                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i));
196                       
197                        SetItemText(itemPos, 1, (*i).country.c_str());
198                       
199                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
200                       
201                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
202                       
203                        if ((*i).seed)
204                                SetItemText(itemPos, 4, L"Seed");
205                       
206                        SetItemText(itemPos, 5, (*i).client.c_str());
207                }
208               
209                ConditionallyDoAutoSort();
210        }
211}
212
213void HaliteDialog::focusChanged(const hal::TorrentDetail_ptr pT)
214{
215        std::pair<float, float> tranLimit(-1.0, -1.0);
216        std::pair<int, int> connLimit(-1, -1);
217       
218        if (pT)
219        {
220                tranLimit = hal::bittorrent().getTorrentSpeed(pT->name());
221                connLimit = hal::bittorrent().getTorrentLimit(pT->name());
222               
223                if (!hal::bittorrent().isTorrentActive(pT->name()))
224                        SetDlgItemText(BTNPAUSE, L"Resume");
225                else           
226                        SetDlgItemText(BTNPAUSE, L"Pause");
227               
228                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
229                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
230                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
231               
232                ::EnableWindow(GetDlgItem(IDC_EDITTLD), true);
233                ::EnableWindow(GetDlgItem(IDC_EDITTLU), true);
234                ::EnableWindow(GetDlgItem(IDC_EDITNCD), true);
235                ::EnableWindow(GetDlgItem(IDC_EDITNCU), true);
236        }
237        else
238        {
239                SetDlgItemText(IDC_NAME, hal::app().res_wstr(HAL_NA).c_str());
240                SetDlgItemText(IDC_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
241                SetDlgItemText(IDC_STATUS, hal::app().res_wstr(HAL_NA).c_str());
242                SetDlgItemText(IDC_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
243                SetDlgItemText(IDC_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
244               
245                SetDlgItemText(BTNPAUSE, L"Pause");             
246                m_prog.SetPos(0);
247               
248                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
249                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
250                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
251               
252                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
253                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
254                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
255                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
256        }
257       
258        NoConnDown = connLimit.first;
259        NoConnUp = connLimit.second;
260        TranLimitDown = tranLimit.first;
261        TranLimitUp = tranLimit.second;
262       
263        m_list.clearAll();
264       
265        DoDataExchange(false); 
266}
267
268void HaliteDialog::uiUpdate(const hal::TorrentDetails& tD) 
269{       
270        std::pair<float, float> tranLimit(-1.0, -1.0);
271        std::pair<int, int> connLimit(-1, -1);
272       
273        if (hal::TorrentDetail_ptr torrent = tD.focusedTorrent())       
274        {       
275                string torrent_name = hal::to_utf8(torrent->name());
276               
277                SetDlgItemText(IDC_NAME, torrent->name().c_str());
278                SetDlgItemText(IDC_TRACKER, torrent->currentTracker().c_str());
279                SetDlgItemText(IDC_STATUS, torrent->state().c_str());
280                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
281               
282                if (!torrent->estimatedTimeLeft().is_special())
283                {
284                        SetDlgItemText(IDC_AVAIL,
285                                (hal::from_utf8(boost::posix_time::to_simple_string(
286                                        torrent->estimatedTimeLeft())).c_str()));
287                }
288                else
289                {
290                        SetDlgItemText(IDC_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
291                }
292               
293                SetDlgItemText(IDC_COMPLETE,
294                        (wformat(L"%1$.2fmb of %2$.2fmb") 
295                                % (static_cast<float>(torrent->totalWantedDone())/(1024*1024))
296                                % (static_cast<float>(torrent->totalWanted())/(1024*1024))
297                        ).str().c_str());
298               
299                m_list.uiUpdate(tD);
300        }
301}
Note: See TracBrowser for help on using the repository browser.