source: trunk/src/HaliteDialog.hpp @ 531

Revision 531, 11.3 KB checked in by Eoin, 11 years ago (diff)

Switched trunk to hal::wform.

Line 
1
2//         Copyright Eoin O'Callaghan 2006 - 2008.
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#pragma once
8
9#define HAL_NAME_STATIC                 15012
10#define HAL_TRACKER_STATIC              15013
11#define HAL_STATUS_STATIC               15014
12#define HAL_TIME_STATIC                 15015
13#define HAL_COMPLETED_STATIC            15016
14
15#ifndef RC_INVOKED
16
17#include "stdAfx.hpp"
18#include "DdxEx.hpp"
19#include "HaliteSortListViewCtrl.hpp"
20#include "HaliteDialogBase.hpp"
21#include "HaliteEditCtrl.hpp"
22#include "halIni.hpp"
23
24#include "halTorrent.hpp"
25#include "halEvent.hpp"
26
27class ui_signal;
28
29class HaliteDialog :
30        public ATL::CDialogImpl<HaliteDialog>,
31        public ATL::CAutoSizeWindow<HaliteDialog, false>,
32        public CWinDataExchangeEx<HaliteDialog>,
33        public CHaliteDialogBase<HaliteDialog>,
34        private boost::noncopyable
35{       
36        typedef HaliteDialog thisClass;
37        typedef ATL::CDialogImpl<thisClass> baseClass;
38        typedef ATL::CAutoSizeWindow<thisClass, false> autosizeClass;
39        typedef CHaliteDialogBase<thisClass> dialogBaseClass;
40               
41        class DialogListView :
42                public CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail>,
43                public hal::IniBase<DialogListView>,
44                private boost::noncopyable
45        {
46        protected:
47                typedef HaliteDialog::DialogListView thisClass;
48                typedef hal::IniBase<thisClass> iniClass;
49                typedef CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail> listClass;
50                typedef const hal::PeerDetail pD;
51       
52                friend class listClass;
53               
54                struct ColumnAdapters
55                {
56               
57                typedef listClass::ColumnAdapter ColAdapter_t;
58               
59                struct SpeedDown : public ColAdapter_t
60                {
61                        virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.first, r.speed.first); }         
62                        virtual std::wstring print(pD& p) 
63                        {
64                                return (hal::wform(L"%1$.2fkb/s") % (p.speed.first/1024)).str(); 
65                        }               
66                };
67               
68                struct SpeedUp : public ColAdapter_t
69                {
70                        virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.second, r.speed.second); }               
71                        virtual std::wstring print(pD& p) 
72                        {
73                                return (hal::wform(L"%1$.2fkb/s") % (p.speed.second/1024)).str(); 
74                        }               
75                };
76               
77                };
78       
79        public: 
80                enum { 
81                        LISTVIEW_ID_MENU = 0,
82                        LISTVIEW_ID_COLUMNNAMES = HAL_DIALOGPEER_LISTVIEW_COS,
83                        LISTVIEW_ID_COLUMNWIDTHS = HAL_DIALOGPEER_LISTVIEW_COS_DEFAULTS
84                };
85       
86                BEGIN_MSG_MAP_EX(thisClass)
87                        MSG_WM_DESTROY(OnDestroy)
88                        CHAIN_MSG_MAP(listClass)
89                        DEFAULT_REFLECTION_HANDLER()
90                END_MSG_MAP()
91       
92                DialogListView() :
93                        iniClass("listviews/dialog", "DialogPeersList")
94                {}
95               
96                void saveSettings()
97                {
98                        GetListViewDetails();
99                        save_to_ini();
100                }
101               
102                bool SubclassWindow(HWND hwnd)
103                {
104                        if(!parentClass::SubclassWindow(hwnd))
105                                return false;
106                               
107                        WTL::CMenuHandle menu;
108                        BOOL menu_created = menu.LoadMenu(LISTVIEW_ID_MENU);
109                        InitialSetup(menu);     
110
111                        std::vector<wstring> names;     
112                        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
113
114                        // "Peer;Country;Download;Upload;Type;Client"
115                        boost::split(names, column_names, boost::is_any_of(L";"));
116                       
117                        array<int, 6> widths = {100,20,70,70,70,100};
118                        array<int, 6> order = {0,1,2,3,4,5};
119                        array<bool, 6> visible = {true,true,true,true,true,true};
120
121                        for (int i=0, e=6; i < e; ++i)
122                        {
123                                AddColumn(names[i].c_str(), i, visible[i], widths[i]);
124                        }       
125                       
126                        load_from_ini();
127                       
128                        SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
129                        SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
130                               
131                        return true;
132                }
133               
134                void OnDestroy()
135                {
136                        saveSettings();
137                }
138               
139                friend class boost::serialization::access;
140                template<class Archive>
141                void serialize(Archive& ar, const unsigned int version)
142                {
143                        ar & boost::serialization::make_nvp("listview", 
144                                boost::serialization::base_object<listClass>(*this));
145                }
146               
147                pD CustomItemConversion(LVCompareParam* param, int iSortCol)
148                {                       
149                        return peerDetails_[param->dwItemData];
150                }               
151               
152                void uiUpdate(const hal::torrent_details_manager& tD);
153               
154        private:
155                hal::PeerDetails peerDetails_;
156        };
157       
158public:
159        enum { IDD = HAL_HALITEDLG };
160
161        HaliteDialog(HaliteWindow& HalWindow);
162        BOOL PreTranslateMessage(MSG* pMsg)     { return this->IsDialogMessage(pMsg); }
163
164        void saveStatus();
165
166        BEGIN_MSG_MAP_EX(thisClass)
167                MSG_WM_INITDIALOG(OnInitDialog)
168                MSG_WM_CLOSE(OnClose)
169                MESSAGE_HANDLER_EX(WM_USER_HAL_EDITCHANGED, OnHalEditChanged)
170               
171                if(uMsg == WM_FORWARDMSG)
172                        if(PreTranslateMessage((LPMSG)lParam)) return TRUE;
173
174                COMMAND_ID_HANDLER_EX(BTNPAUSE, OnPause)
175                COMMAND_ID_HANDLER_EX(BTNREANNOUNCE, OnReannounce)
176                COMMAND_ID_HANDLER_EX(BTNREMOVE, OnRemove)
177
178                CHAIN_MSG_MAP(dialogBaseClass)
179                CHAIN_MSG_MAP(autosizeClass)
180                REFLECT_NOTIFICATIONS()
181        END_MSG_MAP()
182
183        BEGIN_DDX_MAP(thisClass)
184    END_DDX_MAP()
185
186        static CWindowMapStruct* GetWindowMap();
187       
188        void uiUpdate(const hal::torrent_details_manager& allTorrents); 
189        void focusChanged(const hal::torrent_details_ptr pT);
190       
191protected:
192        LRESULT OnInitDialog(HWND, LPARAM);
193        void OnClose();
194
195        void OnPause(UINT, int, HWND);
196        void OnReannounce(UINT, int, HWND);
197        void OnRemove(UINT, int, HWND);
198
199        LRESULT OnCltColor(HDC hDC, HWND hWnd); 
200        LRESULT OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam);
201
202private:
203        WTL::CButton m_btn_start;
204        DialogListView m_list;
205        WTL::CProgressBarCtrl m_prog;
206       
207        CHaliteEditCtrl<int> totalConnections_;
208        CHaliteEditCtrl<int> uploadConnections_;
209        CHaliteEditCtrl<float> downloadRate_;
210        CHaliteEditCtrl<float> uploadRate_;
211       
212        string current_torrent_name_;
213};
214
215#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.