source: trunk/src/HaliteDialog.cpp @ 531

Revision 531, 17.3 KB checked in by Eoin, 12 years ago (diff)

Switched trunk to hal::wform.

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