source: trunk/src/HaliteDialog.hpp @ 447

Revision 447, 11.9 KB checked in by Eoin, 12 years ago (diff)

Cleaned up the SortListView? class.

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 IDC_NAME_STATIC                 15012
10#define IDC_TRACKER_STATIC              15013
11#define IDC_STATUS_STATIC               15014
12#define IDC_TIME_STATIC                 15015
13#define IDC_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 CDialogImpl<HaliteDialog>,
31        public CAutoSizeWindow<HaliteDialog, false>,
32        public CWinDataExchangeEx<HaliteDialog>,
33        public CHaliteDialogBase<HaliteDialog>,
34        private boost::noncopyable
35{       
36        typedef HaliteDialog thisClass;
37        typedef CDialogImpl<thisClass> baseClass;
38        typedef 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 (wformat(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 (wformat(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                        std::vector<wstring> names;     
96                        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
97
98                        // "Peer;Country;Download;Upload;Type;Client"
99                        boost::split(names, column_names, boost::is_any_of(L";"));
100                       
101                        array<int, 6> widths = {100,20,70,70,70,100};
102                        array<int, 6> order = {0,1,2,3,4,5};
103                        array<bool, 6> visible = {true,true,true,true,true,true};
104                       
105                        SetDefaults(names, widths, order, visible);
106                        Load();
107                }
108               
109                void saveSettings()
110                {
111                        GetListViewDetails();
112                        save();
113                }
114               
115                bool SubclassWindow(HWND hwnd)
116                {
117                        if(!parentClass::SubclassWindow(hwnd))
118                                return false;
119                               
120                        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER);
121                        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
122                       
123                        ApplyDetails();
124                       
125                        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
126                        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
127                               
128                        return true;
129                }
130               
131                void OnDestroy()
132                {
133                        saveSettings();
134                }
135               
136                friend class boost::serialization::access;
137                template<class Archive>
138                void serialize(Archive& ar, const unsigned int version)
139                {
140                        ar & boost::serialization::make_nvp("listview", 
141                                boost::serialization::base_object<listClass>(*this));
142                }
143               
144                pD CustomItemConversion(LVCompareParam* param, int iSortCol)
145                {                       
146                        return peerDetails_[param->dwItemData];
147                }               
148               
149                void uiUpdate(const hal::TorrentDetails& tD);
150               
151        private:
152                hal::PeerDetails peerDetails_;
153        };
154       
155public:
156        enum { IDD = IDD_HALITEDLG };
157
158        HaliteDialog(HaliteWindow& HalWindow);
159        BOOL PreTranslateMessage(MSG* pMsg)     { return this->IsDialogMessage(pMsg); }
160
161        void saveStatus();
162
163        BEGIN_MSG_MAP_EX(thisClass)
164                MSG_WM_INITDIALOG(OnInitDialog)
165                MSG_WM_CLOSE(OnClose)
166                MESSAGE_HANDLER_EX(WM_USER_HAL_EDITCHANGED, OnHalEditChanged)
167               
168                if(uMsg == WM_FORWARDMSG)
169                        if(PreTranslateMessage((LPMSG)lParam)) return TRUE;
170
171                COMMAND_ID_HANDLER_EX(BTNPAUSE, OnPause)
172                COMMAND_ID_HANDLER_EX(BTNREANNOUNCE, OnReannounce)
173                COMMAND_ID_HANDLER_EX(BTNREMOVE, OnRemove)
174
175                CHAIN_MSG_MAP(dialogBaseClass)
176                CHAIN_MSG_MAP(autosizeClass)
177                REFLECT_NOTIFICATIONS()
178        END_MSG_MAP()
179
180        BEGIN_DDX_MAP(thisClass)
181    //    DDX_INT(IDC_EDITNCD, totalConnections_)
182    //    DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCU, NoConnUp, 2, true)
183    //    DDX_EX_INT_FLOAT_LIMIT(IDC_EDITTLD, TranLimitDown, 1, false)
184    //    DDX_EX_INT_FLOAT_LIMIT(IDC_EDITTLU, TranLimitUp, 1, false)
185    END_DDX_MAP()
186
187        static CWindowMapStruct* GetWindowMap();
188       
189        void uiUpdate(const hal::TorrentDetails& allTorrents); 
190        void focusChanged(const hal::TorrentDetail_ptr pT);
191       
192protected:
193        LRESULT OnInitDialog(HWND, LPARAM);
194        void OnClose();
195
196        void OnPause(UINT, int, HWND);
197        void OnReannounce(UINT, int, HWND);
198        void OnRemove(UINT, int, HWND);
199
200        LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl);
201        LRESULT OnCltColor(HDC hDC, HWND hWnd); 
202        LRESULT OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam);
203
204private:
205        CButton m_btn_start;
206        DialogListView m_list;
207        CProgressBarCtrl m_prog;
208       
209        CHaliteEditCtrl<int> totalConnections_;
210        CHaliteEditCtrl<int> uploadConnections_;
211        CHaliteEditCtrl<float> downloadRate_;
212        CHaliteEditCtrl<float> uploadRate_;
213       
214        string current_torrent_name_;
215};
216
217#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.