source: trunk/src/HaliteDialog.cpp @ 745

Revision 745, 19.0 KB checked in by Eoin, 11 years ago (diff)
Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2009.
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        m_prog.Attach(GetDlgItem(TORRENTPROG));
25        m_prog.SetRange(0, 100);
26       
27        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
28       
29        totalConnections_.Attach(GetDlgItem(HAL_EDITNCD));
30        uploadConnections_.Attach(GetDlgItem(HAL_EDITNCU));
31        downloadRate_.Attach(GetDlgItem(HAL_EDITTLD));
32        uploadRate_.Attach(GetDlgItem(HAL_EDITTLU));
33       
34        totalConnections_ = -1;
35        uploadConnections_ = -1;
36        downloadRate_ = -1;
37        uploadRate_ = -1;       
38       
39        DoDataExchange(false);
40
41        return 0;
42}
43
44HaliteDialog::CWindowMapStruct* HaliteDialog::GetWindowMap()
45{
46#define TORRENT_LIMITS_LAYOUT \
47        WMB_HEAD(WMB_COL(_exp|20), WMB_COL(_exp|30), WMB_COL(_exp|20), WMB_COL(_exp|30)), \
48                WMB_ROW(10,     HAL_TL, _r, _r, _r), \
49                WMB_ROW(11,     HAL_TLD, HAL_EDITTLD, HAL_TLU, HAL_EDITTLU), \
50                WMB_ROW(10,     HAL_NC, _r, _r, _r), \
51                WMB_ROW(11,     HAL_NCD, HAL_EDITNCD, HAL_NCU, HAL_EDITNCU), \
52        WMB_END()
53
54#define TORRENT_STATUS_LAYOUT \
55        WMB_HEAD(WMB_COL(45), WMB_COLNOMIN(_exp|100), WMB_COL(_eq|0), WMB_COL(_exp|200)), \
56                WMB_ROW(_gap), \
57                WMB_ROW(_auto,  HAL_NAME_STATIC, HAL_NAME, _r, _r), \
58                WMB_ROW(_auto,  HAL_TRACKER_STATIC, HAL_TRACKER, _r, _r), \
59                WMB_ROW(_auto,  HAL_STATUS_STATIC, HAL_STATUS, _r, _r), \
60                WMB_ROW(_auto,  HAL_TIME_STATIC, HAL_AVAIL, HAL_COMPLETED_STATIC, HAL_COMPLETE), \
61        WMB_END()
62       
63#define TORRENT_BUTTON_LAYOUT \
64        WMB_HEAD(WMB_COL(_exp)), \
65                WMB_ROW(_gap), \
66                WMB_ROWMINNOMAX(_exp, 13, BTNPAUSE), \
67                WMB_ROWMINNOMAX(_exp, 13, BTNREANNOUNCE), \
68                WMB_ROWMINNOMAX(_exp, 13, BTNREMOVE), \
69        WMB_END()       
70
71        BEGIN_WINDOW_MAP_INLINE(HaliteDialog, 6, 0, 3, 3)
72                WMB_HEAD(WMB_COL(_gap), WMB_COL(_exp), WMB_COL(120), WMB_COL(60), WMB_COL(_gap)), 
73                        WMB_ROW(_gap,   HAL_DETAILS_GROUP, _r, _r, _r, _r), 
74                        WMB_ROW(_auto,  _d, TORRENT_STATUS_LAYOUT, TORRENT_LIMITS_LAYOUT, TORRENT_BUTTON_LAYOUT), 
75                        WMB_ROW(_gap, _d),
76                        WMB_ROWMIN(_auto, 8, _d, TORRENTPROG, _r, _r), 
77                        WMB_ROW(_gap, _d), 
78                        WMB_ROWNOMAX(_exp, _d, LISTPEERS, _r, _r), 
79                        WMB_ROW(_gap, _d), 
80                        WMB_ROW(_gap|3), 
81                WMB_END() 
82        END_WINDOW_MAP_INLINE() 
83}
84
85void HaliteDialog::saveStatus()
86{
87        m_list.saveSettings();
88}
89
90void HaliteDialog::OnClose()
91{
92        saveStatus();
93       
94        if(::IsWindow(m_hWnd)) 
95        {
96                ::DestroyWindow(m_hWnd);
97        }
98}
99
100void HaliteDialog::OnPause(UINT, int, HWND)
101{
102        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focusedTorrent()) 
103        {
104                string torrentName = hal::to_utf8(torrent->name());
105               
106                if (!hal::bittorrent::Instance().is_torrent_active(torrentName))
107                {
108                        SetDlgItemText(BTNPAUSE,L"Pause");
109                        hal::bittorrent::Instance().resume_torrent(torrentName);
110                }
111                else
112                {
113                        SetDlgItemText(BTNPAUSE,L"Resume");
114                        hal::bittorrent::Instance().pause_torrent(torrentName);
115                }
116               
117                requestUiUpdate();
118        }
119}
120
121void HaliteDialog::OnReannounce(UINT, int, HWND)
122{
123        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focusedTorrent()) 
124                hal::bittorrent::Instance().reannounce_torrent(torrent->name());
125}
126
127void HaliteDialog::OnRemove(UINT, int, HWND)
128{
129        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focusedTorrent()) 
130        {
131                hal::bittorrent::Instance().remove_torrent(torrent->name());
132                torrentsList().erase_torrent_name(torrent->name());
133        }
134}
135
136LRESULT HaliteDialog::OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam)
137{
138        if (hal::bit::torrent t = hal::bittorrent::Instance().get(focusedTorrent()))
139        {
140                t.rate_limits = std::pair<float, float>(downloadRate_, uploadRate_);
141                t.connection_limits = std::pair<int, int>(totalConnections_, uploadConnections_);
142        }
143       
144        return 0;
145}
146
147LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
148{       
149        ::SetTextColor(hDC, RGB(255, 0, 255)); 
150       
151        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
152}
153
154bool HaliteDialog::DialogListView::sort_list_comparison(std::wstring l, std::wstring r, size_t index, bool ascending)
155{
156        hal::peer_details_vec::optional_type pdl = peer_details_.find_peer(l);
157        hal::peer_details_vec::optional_type pdr = peer_details_.find_peer(r);
158
159        if (pdl && pdr) 
160                return hal::hal_details_ptr_compare(pdl, pdr, index, ascending);
161        else
162                return false;
163}
164
165LRESULT HaliteDialog::DialogListView::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&)
166{       
167        NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh;
168
169        HAL_DEV_SORT_MSG(hal::wform(L"OnGetDispInfo index = %1% size = %2%") % pdi->item.iItem % peer_details_.size());
170
171        hal::try_update_lock<listClass> lock(*this);
172        if (lock && pdi->item.iItem >= 0 && peer_details_.size() >= numeric_cast<unsigned>(pdi->item.iItem)) 
173        {       
174
175        hal::peer_details_vec::optional_type pd = peer_details_.find_peer(key_from_index(pdi->item.iItem));
176
177        if (pd && pdi->item.mask & LVIF_TEXT)
178        {
179                wstring str = pd->to_wstring(pdi->item.iSubItem);
180               
181                size_t len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, static_cast<int>(str.size())));
182                pdi->item.pszText[len] = '\0';
183        }
184
185        }
186       
187        return 0;
188}
189
190void HaliteDialog::DialogListView::uiUpdate(const hal::torrent_details_manager& tD) 
191{       
192        hal::try_update_lock<listClass> lock(*this);
193        if (lock) 
194        {               
195                selection_from_listview();
196               
197                peer_details_.clear();
198               
199                foreach (const hal::torrent_details_ptr torrent, tD.selectedTorrents())
200                {
201                        std::copy(torrent->get_peer_details().begin(), torrent->get_peer_details().end(), 
202                                std::inserter(peer_details_, peer_details_.begin()));
203                }
204               
205                std::set<std::wstring> ip_set;
206                foreach (hal::peer_detail& pd,  peer_details_)
207                        ip_set.insert(pd.ip_address);
208               
209                erase_based_on_set(ip_set, true);
210
211                if (IsSortOnce() || AutoSort())
212                {
213                        if (GetSecondarySortColumn() != -1)
214                        {
215                                int index = GetColumnSortType(GetSecondarySortColumn());                                       
216                                if (index > WTL::LVCOLSORT_LAST)
217                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSecondarySortDescending());
218                        }
219
220                        if (GetSortColumn() != -1)
221                        {               
222                                int index = GetColumnSortType(GetSortColumn());                         
223                                if (index > WTL::LVCOLSORT_LAST)
224                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSortDescending());
225                        }
226                }
227               
228                set_keys(ip_set);               
229                InvalidateRect(NULL,true);
230        }
231}
232
233LRESULT HaliteDialog::DialogListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&)
234{
235       
236        return 0;
237}
238
239void HaliteDialog::focusChanged(const hal::torrent_details_ptr pT)
240{
241        std::pair<float, float> tranLimit(-1.0, -1.0);
242        std::pair<int, int> connLimit(-1, -1);
243       
244        if (hal::bit::torrent t = hal::bittorrent::Instance().get(focusedTorrent()))
245        {
246                tranLimit = t.rate_limits;
247                connLimit = t.connection_limits;
248               
249                if (!t.is_active)
250                        SetDlgItemText(BTNPAUSE, L"Resume");
251                else           
252                        SetDlgItemText(BTNPAUSE, L"Pause");
253               
254                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
255                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
256                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
257               
258                ::EnableWindow(GetDlgItem(HAL_EDITTLD), true);
259                ::EnableWindow(GetDlgItem(HAL_EDITTLU), true);
260                ::EnableWindow(GetDlgItem(HAL_EDITNCD), true);
261                ::EnableWindow(GetDlgItem(HAL_EDITNCU), true);
262        }
263        else
264        {
265                SetDlgItemText(HAL_NAME, hal::app().res_wstr(HAL_NA).c_str());
266                SetDlgItemText(HAL_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
267                SetDlgItemText(HAL_STATUS, hal::app().res_wstr(HAL_NA).c_str());
268                SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
269                SetDlgItemText(HAL_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
270               
271                SetDlgItemText(BTNPAUSE, L"Pause");             
272                m_prog.SetPos(0);
273               
274                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
275                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
276                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
277               
278                ::EnableWindow(GetDlgItem(HAL_EDITTLD), false);
279                ::EnableWindow(GetDlgItem(HAL_EDITTLU), false);
280                ::EnableWindow(GetDlgItem(HAL_EDITNCD), false);
281                ::EnableWindow(GetDlgItem(HAL_EDITNCU), false);
282        }
283       
284        totalConnections_ = connLimit.first;
285        uploadConnections_ = connLimit.second;
286        downloadRate_ = tranLimit.first;
287        uploadRate_ = tranLimit.second;
288               
289        DoDataExchange(false);
290}
291
292void HaliteDialog::uiUpdate(const hal::torrent_details_manager& tD)
293{       
294        std::pair<float, float> tranLimit(-1.0, -1.0);
295        std::pair<int, int> connLimit(-1, -1);
296       
297        if (hal::torrent_details_ptr torrent = tD.focusedTorrent())     
298        {       
299                string torrent_name = hal::to_utf8(torrent->name());
300               
301                SetDlgItemText(HAL_NAME, torrent->name().c_str());
302                SetDlgItemText(HAL_TRACKER, torrent->current_tracker().c_str());
303                SetDlgItemText(HAL_STATUS, torrent->state().c_str());
304                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
305               
306                if (!torrent->estimated_time_left().is_special())
307                {
308                        SetDlgItemText(HAL_AVAIL,
309                                (hal::from_utf8(boost::posix_time::to_simple_string(
310                                        torrent->estimated_time_left())).c_str()));
311                }
312                else
313                {
314                        SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
315                }
316               
317                SetDlgItemText(HAL_COMPLETE,
318                        (hal::wform(L"%1$.2fmb of %2$.2fmb") 
319                                % (static_cast<float>(torrent->total_wanted_done())/(1024*1024))
320                                % (static_cast<float>(torrent->total_wanted())/(1024*1024))
321                        ).str().c_str());
322               
323                m_list.uiUpdate(tD);
324        }
325}
Note: See TracBrowser for help on using the repository browser.