source: trunk/src/HaliteDialog.hpp @ 356

Revision 356, 11.7 KB checked in by Eoin, 12 years ago (diff)

Fixed a bug with blocking non-visible uiUpdate connections.

Line 
1
2//         Copyright Eの 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#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 "halIni.hpp"
22
23#include "halTorrent.hpp"
24#include "halEvent.hpp"
25
26class ui_signal;
27
28class HaliteDialog :
29        public CDialogImpl<HaliteDialog>,
30        public CAutoSizeWindow<HaliteDialog, false>,
31        public CWinDataExchangeEx<HaliteDialog>,
32        public CHaliteDialogBase<HaliteDialog>,
33        private boost::noncopyable
34{       
35        typedef HaliteDialog thisClass;
36        typedef CDialogImpl<thisClass> baseClass;
37        typedef CAutoSizeWindow<thisClass, false> autosizeClass;
38        typedef CHaliteDialogBase<thisClass> dialogBaseClass;
39               
40        class DialogListView :
41                public CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail>,
42                public hal::IniBase<DialogListView>,
43                private boost::noncopyable
44        {
45        protected:
46                typedef HaliteDialog::DialogListView thisClass;
47                typedef hal::IniBase<thisClass> iniClass;
48                typedef CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail> listClass;
49                typedef const hal::PeerDetail pD;
50       
51                friend class listClass;
52               
53                struct ColumnAdapters
54                {
55               
56                typedef listClass::ColumnAdapter ColAdapter_t;
57               
58                struct SpeedDown : public ColAdapter_t
59                {
60                        virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.first, r.speed.first); }         
61                        virtual std::wstring print(pD& p) 
62                        {
63                                return (wformat(L"%1$.2fkb/s") % (p.speed.first/1024)).str(); 
64                        }               
65                };
66               
67                struct SpeedUp : public ColAdapter_t
68                {
69                        virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.second, r.speed.second); }               
70                        virtual std::wstring print(pD& p) 
71                        {
72                                return (wformat(L"%1$.2fkb/s") % (p.speed.second/1024)).str(); 
73                        }               
74                };
75               
76                };
77       
78        public: 
79                enum { 
80                        LISTVIEW_ID_MENU = 0,
81                        LISTVIEW_ID_COLUMNNAMES = HAL_DIALOGPEER_LISTVIEW_COS,
82                        LISTVIEW_ID_COLUMNWIDTHS = HAL_DIALOGPEER_LISTVIEW_COS_DEFAULTS
83                };
84       
85                BEGIN_MSG_MAP_EX(thisClass)
86                        MSG_WM_DESTROY(OnDestroy)
87                        CHAIN_MSG_MAP(listClass)
88                        DEFAULT_REFLECTION_HANDLER()
89                END_MSG_MAP()
90       
91                DialogListView() :
92                        iniClass("listviews/dialog", "DialogPeersList"),
93                        listClass(true,false,false)
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               
167                COMMAND_RANGE_CODE_HANDLER_EX(IDC_EDITTLU, IDC_EDITNCU, EN_KILLFOCUS, OnEditKillFocus)
168
169                if(uMsg == WM_FORWARDMSG)
170                        if(PreTranslateMessage((LPMSG)lParam)) return TRUE;
171
172                COMMAND_ID_HANDLER_EX(BTNPAUSE, OnPause)
173                COMMAND_ID_HANDLER_EX(BTNREANNOUNCE, OnReannounce)
174                COMMAND_ID_HANDLER_EX(BTNREMOVE, OnRemove)
175
176                CHAIN_MSG_MAP(dialogBaseClass)
177                CHAIN_MSG_MAP(autosizeClass)
178                REFLECT_NOTIFICATIONS()
179        END_MSG_MAP()
180
181        BEGIN_DDX_MAP(thisClass)
182        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCD, NoConnDown, 2, true)
183        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCU, NoConnUp, 2, true)
184        DDX_EX_INT_FLOAT_LIMIT(IDC_EDITTLD, TranLimitDown, 1, false)
185        DDX_EX_INT_FLOAT_LIMIT(IDC_EDITTLU, TranLimitUp, 1, false)
186    END_DDX_MAP()
187
188        static CWindowMapStruct* GetWindowMap();
189       
190        void uiUpdate(const hal::TorrentDetails& allTorrents); 
191        void focusChanged(const hal::TorrentDetail_ptr pT);
192       
193protected:
194        LRESULT OnInitDialog(HWND, LPARAM);
195        void OnClose();
196
197        void OnPause(UINT, int, HWND);
198        void OnReannounce(UINT, int, HWND);
199        void OnRemove(UINT, int, HWND);
200
201        LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl);
202        LRESULT OnCltColor(HDC hDC, HWND hWnd); 
203
204private:
205        CButton m_btn_start;
206        DialogListView m_list;
207        CContainedWindow m_wndNCD;
208        CProgressBarCtrl m_prog;
209       
210        string current_torrent_name_;
211
212        int NoConnDown, NoConnUp;
213        float TranLimitDown, TranLimitUp;
214};
215
216#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.