source: trunk/src/HaliteDialog.cpp @ 726

Revision 726, 18.8 KB checked in by Eoin, 11 years ago (diff)

Fixed the sorting on the HaliteDialog?.

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().torrentDetails().focusedTorrent()) 
103        {
104                string torrentName = hal::to_utf8(torrent->name());
105               
106                if (!hal::bittorrent().is_torrent_active(torrentName))
107                {
108                        SetDlgItemText(BTNPAUSE,L"Pause");
109                        hal::bittorrent().resume_torrent(torrentName);
110                }
111                else
112                {
113                        SetDlgItemText(BTNPAUSE,L"Resume");
114                        hal::bittorrent().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().torrentDetails().focusedTorrent())
124//              hal::bittorrent().reannounce_torrent(hal::to_utf8(torrent->name()));
125}
126
127void HaliteDialog::OnRemove(UINT, int, HWND)
128{
129/*      if (hal::torrent_details_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent())
130        {
131                string torrentName = hal::to_utf8(torrent->name());
132
133                hal::bittorrent().remove_torrent(torrentName);
134//              torrentsList().clearFocused();
135        }*/
136}
137
138LRESULT HaliteDialog::OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam)
139{
140        if (hal::bit::torrent t = hal::bittorrent().get(focusedTorrent()))
141        {
142                t.rate_limits = std::pair<float, float>(downloadRate_, uploadRate_);
143                t.connection_limits = std::pair<int, int>(totalConnections_, uploadConnections_);
144        }
145       
146        return 0;
147}
148
149LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
150{       
151        ::SetTextColor(hDC, RGB(255, 0, 255)); 
152       
153        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
154}
155
156bool HaliteDialog::DialogListView::sort_list_comparison(std::wstring l, std::wstring r, size_t index, bool ascending)
157{
158        hal::peer_details_vec::optional_type pdl = peer_details_.find_peer(l);
159        hal::peer_details_vec::optional_type pdr = peer_details_.find_peer(r);
160
161        if (pdl && pdr) 
162                return hal::hal_details_ptr_compare(pdl, pdr, index, ascending);
163        else
164                return false;
165}
166
167LRESULT HaliteDialog::DialogListView::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&)
168{       
169        NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh;
170
171        HAL_DEV_SORT_MSG(hal::wform(L"OnGetDispInfo index = %1% size = %2%") % pdi->item.iItem % peer_details_.size());
172
173        hal::try_update_lock<listClass> lock(*this);
174        if (lock && peer_details_.size() >= pdi->item.iItem) 
175        {       
176
177        hal::peer_details_vec::optional_type pd = peer_details_.find_peer(key_from_index(pdi->item.iItem));
178
179        if (pd && pdi->item.mask & LVIF_TEXT)
180        {
181                wstring str = pd->to_wstring(pdi->item.iSubItem);
182               
183                size_t len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, static_cast<int>(str.size())));
184                pdi->item.pszText[len] = '\0';
185        }
186
187        }
188       
189        return 0;
190}
191
192void HaliteDialog::DialogListView::uiUpdate(const hal::torrent_details_manager& tD) 
193{       
194        hal::try_update_lock<listClass> lock(*this);
195        if (lock) 
196        {               
197                selection_from_listview();
198               
199                peer_details_.clear();
200               
201                foreach (const hal::torrent_details_ptr torrent, tD.selectedTorrents())
202                {
203                        std::copy(torrent->get_peer_details().begin(), torrent->get_peer_details().end(), 
204                                std::inserter(peer_details_, peer_details_.begin()));
205                }
206               
207                std::set<std::wstring> ip_set;
208                foreach (hal::peer_detail& pd,  peer_details_)
209                        ip_set.insert(pd.ip_address);
210               
211                erase_based_on_set(ip_set, true);
212
213                if (IsSortOnce() || AutoSort())
214                {
215                        if (GetSecondarySortColumn() != -1)
216                        {
217                                int index = GetColumnSortType(GetSecondarySortColumn());                                       
218                                if (index > WTL::LVCOLSORT_LAST)
219                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSecondarySortDescending());
220                        }
221
222                        if (GetSortColumn() != -1)
223                        {               
224                                int index = GetColumnSortType(GetSortColumn());                         
225                                if (index > WTL::LVCOLSORT_LAST)
226                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSortDescending());
227                        }
228                }
229               
230                set_keys(ip_set);               
231                InvalidateRect(NULL,true);
232        }
233}
234
235LRESULT HaliteDialog::DialogListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&)
236{
237       
238        return 0;
239}
240
241void HaliteDialog::focusChanged(const hal::torrent_details_ptr pT)
242{
243        std::pair<float, float> tranLimit(-1.0, -1.0);
244        std::pair<int, int> connLimit(-1, -1);
245       
246        if (hal::bit::torrent t = hal::bittorrent().get(focusedTorrent()))
247        {
248                tranLimit = t.rate_limits;
249                connLimit = t.connection_limits;
250               
251                if (!t.is_active)
252                        SetDlgItemText(BTNPAUSE, L"Resume");
253                else           
254                        SetDlgItemText(BTNPAUSE, L"Pause");
255               
256                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
257                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
258                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
259               
260                ::EnableWindow(GetDlgItem(HAL_EDITTLD), true);
261                ::EnableWindow(GetDlgItem(HAL_EDITTLU), true);
262                ::EnableWindow(GetDlgItem(HAL_EDITNCD), true);
263                ::EnableWindow(GetDlgItem(HAL_EDITNCU), true);
264        }
265        else
266        {
267                SetDlgItemText(HAL_NAME, hal::app().res_wstr(HAL_NA).c_str());
268                SetDlgItemText(HAL_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
269                SetDlgItemText(HAL_STATUS, hal::app().res_wstr(HAL_NA).c_str());
270                SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
271                SetDlgItemText(HAL_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
272               
273                SetDlgItemText(BTNPAUSE, L"Pause");             
274                m_prog.SetPos(0);
275               
276                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
277                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
278                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
279               
280                ::EnableWindow(GetDlgItem(HAL_EDITTLD), false);
281                ::EnableWindow(GetDlgItem(HAL_EDITTLU), false);
282                ::EnableWindow(GetDlgItem(HAL_EDITNCD), false);
283                ::EnableWindow(GetDlgItem(HAL_EDITNCU), false);
284        }
285       
286        totalConnections_ = connLimit.first;
287        uploadConnections_ = connLimit.second;
288        downloadRate_ = tranLimit.first;
289        uploadRate_ = tranLimit.second;
290               
291        DoDataExchange(false);
292}
293
294void HaliteDialog::uiUpdate(const hal::torrent_details_manager& tD)
295{       
296        std::pair<float, float> tranLimit(-1.0, -1.0);
297        std::pair<int, int> connLimit(-1, -1);
298       
299        if (hal::torrent_details_ptr torrent = tD.focusedTorrent())     
300        {       
301                string torrent_name = hal::to_utf8(torrent->name());
302               
303                SetDlgItemText(HAL_NAME, torrent->name().c_str());
304                SetDlgItemText(HAL_TRACKER, torrent->current_tracker().c_str());
305                SetDlgItemText(HAL_STATUS, torrent->state().c_str());
306                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
307               
308                if (!torrent->estimated_time_left().is_special())
309                {
310                        SetDlgItemText(HAL_AVAIL,
311                                (hal::from_utf8(boost::posix_time::to_simple_string(
312                                        torrent->estimated_time_left())).c_str()));
313                }
314                else
315                {
316                        SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
317                }
318               
319                SetDlgItemText(HAL_COMPLETE,
320                        (hal::wform(L"%1$.2fmb of %2$.2fmb") 
321                                % (static_cast<float>(torrent->total_wanted_done())/(1024*1024))
322                                % (static_cast<float>(torrent->total_wanted())/(1024*1024))
323                        ).str().c_str());
324               
325                m_list.uiUpdate(tD);
326        }
327}
Note: See TracBrowser for help on using the repository browser.