source: src/HaliteDialog.cpp @ 333

Revision 333, 16.9 KB checked in by Eoin, 12 years ago (diff)

UI fully converted to Autosize.

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