source: src/HaliteDialog.hpp @ 253

Revision 253, 6.7 KB checked in by Eoin, 13 years ago (diff)
Line 
1
2#pragma once
3
4#include "stdAfx.hpp"
5#include "DdxEx.hpp"
6#include "HaliteSortListViewCtrl.hpp"
7#include "HaliteDialogBase.hpp"
8#include "HaliteIni.hpp"
9
10#include "halTorrent.hpp"
11#include "halEvent.hpp"
12
13class ui_signal;
14
15class HaliteDialog :
16        public CDialogImpl<HaliteDialog>,
17        public CDialogResize<HaliteDialog>,
18        public CWinDataExchangeEx<HaliteDialog>,
19        public CHaliteDialogBase<HaliteDialog>,
20        private boost::noncopyable
21{       
22
23        typedef HaliteDialog thisClass;
24        typedef CDialogImpl<HaliteDialog> baseClass;
25        typedef CDialogResize<HaliteDialog> resizeClass;
26        typedef CHaliteDialogBase<HaliteDialog> dialogBaseClass;
27               
28        class DialogListView :
29                public CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail>,
30                public CHaliteIni<DialogListView>,
31                private boost::noncopyable
32        {
33        protected:
34                typedef HaliteDialog::DialogListView thisClass;
35                typedef CHaliteIni<thisClass> iniClass;
36                typedef CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail> listClass;
37                typedef const hal::PeerDetail pD;
38       
39                friend class listClass;
40               
41                struct ColumnAdapters
42                {
43               
44                typedef listClass::ColumnAdapter ColAdapter_t;
45               
46                struct SpeedDown : public ColAdapter_t
47                {
48                        virtual bool less(pD& l, pD& r) { return l.speed.first < r.speed.first; }               
49                        virtual std::wstring print(pD& p) 
50                        {
51                                return (wformat(L"%1$.2fkb/s") % (p.speed.first/1024)).str(); 
52                        }               
53                };
54               
55                struct SpeedUp : public ColAdapter_t
56                {
57                        virtual bool less(pD& l, pD& r) { return l.speed.second < r.speed.second; }             
58                        virtual std::wstring print(pD& p) 
59                        {
60                                return (wformat(L"%1$.2fkb/s") % (p.speed.second/1024)).str(); 
61                        }               
62                };
63               
64                };
65       
66        public: 
67                enum { 
68                        LISTVIEW_ID_MENU = 0,
69                        LISTVIEW_ID_COLUMNNAMES = HAL_DIALOGPEER_LISTVIEW_COS,
70                        LISTVIEW_ID_COLUMNWIDTHS = HAL_DIALOGPEER_LISTVIEW_COS_DEFAULTS
71                };
72       
73                BEGIN_MSG_MAP_EX(thisClass)
74                        MSG_WM_DESTROY(OnDestroy)
75       
76                        CHAIN_MSG_MAP(listClass)
77                        DEFAULT_REFLECTION_HANDLER()
78                END_MSG_MAP()
79       
80                DialogListView() :
81                        iniClass("listviews/dialog", "DialogPeersList"),
82                        listClass(true,false,false)
83                {                                       
84                        std::vector<wstring> names;     
85                        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
86
87                        // "Peer;Country;Download;Upload;Type;Client"
88                        boost::split(names, column_names, boost::is_any_of(L";"));
89                       
90                        array<int, 6> widths = {100,20,70,70,70,100};
91                        array<int, 6> order = {0,1,2,3,4,5};
92                        array<bool, 6> visible = {true,true,true,true,true,true};
93                       
94                        SetDefaults(names, widths, order, visible);
95                        Load();
96                }
97               
98                void saveSettings()
99                {
100                        GetListViewDetails();
101                        save();
102                }
103               
104                void OnAttach()
105                {
106                        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
107                        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
108                       
109                        ApplyDetails();
110                       
111                        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
112                        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
113                }
114               
115                void OnDestroy()
116                {
117                        saveSettings();
118                }
119               
120                friend class boost::serialization::access;
121                template<class Archive>
122                void serialize(Archive& ar, const unsigned int version)
123                {
124                        ar & boost::serialization::make_nvp("listview", 
125                                boost::serialization::base_object<listClass>(*this));
126                }
127               
128                pD CustomItemConversion(LVCompareParam* param, int iSortCol)
129                {                       
130                //      hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"peerDetails get %1%, %2%. Item count %3%") % param->iItem % param->dwItemData % GetItemCount()).str().c_str())));
131                       
132                        return peerDetails_[param->dwItemData];
133                }               
134               
135                int CustomItemComparision(pD left, pD right, int iSortCol)
136                {
137                //      hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"peerDetails left %1%, right %2%") % left.ipAddress % right.ipAddress).str().c_str())));
138
139                        ColumnAdapter* pCA = getColumnAdapter(iSortCol);
140                       
141                        if (pCA)
142                                return (pCA->less(left, right)) ? 1 : -1;
143                        else 
144                                return 0;
145                }
146               
147                void uiUpdate(const hal::TorrentDetails& tD);
148               
149        private:
150                hal::PeerDetails peerDetails_;
151        };
152       
153public:
154        enum { IDD = IDD_HALITEDLG };
155
156        HaliteDialog(HaliteWindow& HalWindow);
157        BOOL PreTranslateMessage(MSG* pMsg)     { return this->IsDialogMessage(pMsg); }
158
159        void saveStatus();
160
161        BEGIN_MSG_MAP_EX(thisClass)
162                MSG_WM_INITDIALOG(onInitDialog)
163                MSG_WM_CLOSE(onClose)
164                COMMAND_RANGE_CODE_HANDLER_EX(IDC_EDITTLU, IDC_EDITNCU, EN_KILLFOCUS, OnEditKillFocus)
165
166                if(uMsg == WM_FORWARDMSG)
167                        if(PreTranslateMessage((LPMSG)lParam)) return TRUE;
168
169                COMMAND_ID_HANDLER_EX(BTNPAUSE, onPause)
170                COMMAND_ID_HANDLER_EX(BTNREANNOUNCE, onReannounce)
171                COMMAND_ID_HANDLER_EX(BTNREMOVE, onRemove)
172
173        //      MSG_WM_CTLCOLORSTATIC(OnCltColor)
174
175                CHAIN_MSG_MAP(resizeClass)
176                REFLECT_NOTIFICATIONS()
177        END_MSG_MAP()
178
179        BEGIN_DDX_MAP(thisClass)
180        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCD, NoConnDown, 2, true)
181        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCU, NoConnUp, 2, true)
182        DDX_EX_FLOAT_POSITIVE(IDC_EDITTLD, TranLimitDown)
183        DDX_EX_FLOAT_POSITIVE(IDC_EDITTLU, TranLimitUp)
184    END_DDX_MAP()
185
186        BEGIN_DLGRESIZE_MAP(thisClass)
187                DLGRESIZE_CONTROL(BTNPAUSE, (DLSZ_MOVE_X))
188                DLGRESIZE_CONTROL(BTNREANNOUNCE, (DLSZ_MOVE_X))
189                DLGRESIZE_CONTROL(BTNREMOVE, (DLSZ_MOVE_X))
190
191                DLGRESIZE_CONTROL(IDC_TL, (DLSZ_MOVE_X))
192                DLGRESIZE_CONTROL(IDC_NC, (DLSZ_MOVE_X))
193                DLGRESIZE_CONTROL(IDC_TLD, (DLSZ_MOVE_X))
194                DLGRESIZE_CONTROL(IDC_TLU, (DLSZ_MOVE_X))
195                DLGRESIZE_CONTROL(IDC_NCU, (DLSZ_MOVE_X))
196                DLGRESIZE_CONTROL(IDC_NCD, (DLSZ_MOVE_X))
197
198                DLGRESIZE_CONTROL(IDC_EDITNCD, (DLSZ_MOVE_X))
199                DLGRESIZE_CONTROL(IDC_EDITTLD, (DLSZ_MOVE_X))
200                DLGRESIZE_CONTROL(IDC_EDITTLU, (DLSZ_MOVE_X))
201                DLGRESIZE_CONTROL(IDC_EDITNCU, (DLSZ_MOVE_X))
202
203                DLGRESIZE_CONTROL(TORRENTPROG, (DLSZ_SIZE_X))
204
205                DLGRESIZE_CONTROL(IDC_NAME, (DLSZ_SIZE_X))
206                DLGRESIZE_CONTROL(IDC_TRACKER, (DLSZ_SIZE_X))
207                DLGRESIZE_CONTROL(IDC_STATUS, (DLSZ_SIZE_X))
208                DLGRESIZE_CONTROL(IDC_COMPLETE, (DLSZ_SIZE_X))
209
210                DLGRESIZE_CONTROL(LISTPEERS, (DLSZ_SIZE_X | DLSZ_SIZE_Y))
211                DLGRESIZE_CONTROL(IDC_DETAILS_GROUP, (DLSZ_SIZE_X | DLSZ_SIZE_Y))
212        END_DLGRESIZE_MAP()
213       
214        void selectionChanged(const string& torrent_name);
215        void updateDialog();
216        void uiUpdate(const hal::TorrentDetails& allTorrents); 
217       
218protected:
219        LRESULT onInitDialog(HWND, LPARAM);
220        void onClose();
221
222        void onPause(UINT, int, HWND);
223        void onReannounce(UINT, int, HWND);
224        void onRemove(UINT, int, HWND);
225
226        LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl);
227        LRESULT OnCltColor(HDC hDC, HWND hWnd);
228
229private:
230        CButton m_btn_start;
231        DialogListView m_list;
232        CContainedWindow m_wndNCD;
233        CProgressBarCtrl m_prog;
234
235        int NoConnDown, NoConnUp;
236        float TranLimitDown, TranLimitUp;
237};
Note: See TracBrowser for help on using the repository browser.