source: trunk/src/advtabs/Debug.hpp @ 493

Revision 493, 6.1 KB checked in by Eoin, 12 years ago (diff)

Freedom from automatic ATL and/or WTL namespaces.

Line 
1
2//         Copyright Eóin 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 WM_USER_LOGPOST WM_USER + 101
10
11#include "stdAfx.hpp"
12#include "Halite.hpp"
13#include "DdxEx.hpp"
14
15#include "global/string_conv.hpp"
16#include "global/logger.hpp"
17
18#include "../halEvent.hpp"
19#include "../HaliteTabPage.hpp"
20#include "../HaliteListManager.hpp"
21#include "../HaliteDialogBase.hpp"
22#include "../halIni.hpp"
23#include "../HaliteListViewCtrl.hpp"
24
25class LogEdit : public ATL::CWindowImpl<LogEdit, WTL::CEdit>
26{
27public:
28    BEGIN_MSG_MAP_EX(CEditImpl)
29    END_MSG_MAP()
30
31        LogEdit() :
32                editLogger(hal::wlog().attach(bind(&LogEdit::log, this, _1)))
33        {}
34
35        void log(const std::wstring& text)
36        {
37                int len = ::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0);
38                SetSel(len, len);
39                ReplaceSel(text.c_str(), false);
40        }
41
42private:
43        boost::signals::scoped_connection editLogger;
44};
45
46class LogList : public ATL::CWindowImpl<LogList, WTL::CListBox>
47{
48public:
49    BEGIN_MSG_MAP_EX(LogList)
50    END_MSG_MAP()
51
52        LogList() :
53                listLogger(hal::wlog().attach(bind(&LogList::log, this, _1)))
54        {}
55
56        void log(const std::wstring& text)
57        {
58                AddString(text.c_str());
59        }
60
61private:
62        boost::signals::scoped_connection listLogger;
63};
64
65class LogListViewCtrl :
66        public CHaliteSortListViewCtrl<LogListViewCtrl>,
67        public hal::IniBase<LogListViewCtrl>,
68        private boost::noncopyable
69{
70protected:
71        typedef hal::IniBase<LogListViewCtrl> iniClass;
72        typedef CHaliteSortListViewCtrl<LogListViewCtrl> listClass;
73
74        friend class listClass;
75
76public: 
77        enum { 
78                LISTVIEW_ID_MENU = 0,
79                LISTVIEW_ID_COLUMNNAMES = 0,
80                LISTVIEW_ID_COLUMNWIDTHS = 0
81        };
82
83        BEGIN_MSG_MAP_EX(LogListViewCtrl)
84                MSG_WM_DESTROY(OnDestroy)
85                MESSAGE_HANDLER_EX(WM_USER_LOGPOST, OnMessageLogPost)
86
87                CHAIN_MSG_MAP(listClass)
88                DEFAULT_REFLECTION_HANDLER()
89        END_MSG_MAP()
90
91        LogListViewCtrl() :
92                iniClass("listviews/eventLog", "LogListView")
93        {
94                std::vector<wstring> names;     
95                wstring column_names = hal::app().res_wstr(HAL_DEBUG_LISTVIEW_COLUMNS);
96
97                // "Time;Message;Severity"
98                boost::split(names, column_names, boost::is_any_of(L";"));
99               
100                array<int, 3> widths = {67,419,69};
101                array<int, 3> order = {0,1,2};
102                array<bool, 3> visible = {true,true,true};
103               
104                SetDefaults(names, widths, order, visible, true);
105               
106                load_from_ini();
107        }
108       
109        ~LogListViewCtrl()
110        {
111                hal::mutex_t::scoped_lock l(mutex_);
112
113                if (conn_.connected()) conn_.disconnect();
114        }
115
116        void saveSettings()
117        {
118                GetListViewDetails();
119                save_to_ini();
120        }
121
122    friend class boost::serialization::access;
123    template<class Archive>
124    void serialize(Archive& ar, const unsigned int version)
125    {
126                ar & boost::serialization::make_nvp("listview", 
127                        boost::serialization::base_object<listClass>(*this));
128    }
129
130        void operator()(shared_ptr<hal::EventDetail> event)
131        {
132                hal::mutex_t::scoped_lock l(mutex_);
133
134                try
135                {
136                events_.push_back(event);
137               
138                PostMessage(WM_USER_LOGPOST, 0, 0);
139               
140                }
141                catch(...)
142                {}
143        }
144
145        LRESULT OnMessageLogPost(UINT uMsg, WPARAM wParam, LPARAM lParam)
146        {
147                hal::mutex_t::scoped_lock l(mutex_);
148
149                try
150                {
151                shared_ptr<hal::EventDetail> event(*events_.begin());
152
153                wstring timeStamp = lexical_cast<wstring>(event->timeStamp());
154
155                int itemPos = AddItem(0, 0, timeStamp.c_str());
156
157                SetItemText(itemPos, 1, event->msg().c_str());
158
159                SetItemText(itemPos, 2,
160                        hal::event_logger::eventLevelToStr(event->level()).c_str());
161                       
162                if (halite().logListLen() <= GetItemCount())
163                        DeleteItem(halite().logListLen());
164
165                }
166                catch(...)
167                {}
168
169                events_.pop_front();
170
171                return 0;
172        }
173
174        void saveStatus() {}
175        void updateListView() {}
176
177private:
178        void OnAttach()
179        {       
180                hal::mutex_t::scoped_lock l(mutex_);
181       
182                SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
183                SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
184               
185                ApplyDetails();
186               
187                conn_ = hal::event_log.attach(bind(&LogListViewCtrl::operator(), this, _1));
188        }
189
190        void OnDestroy()
191        {
192                hal::mutex_t::scoped_lock l(mutex_);
193
194                conn_.disconnect();
195                saveSettings();
196        }
197
198        mutable hal::mutex_t mutex_;
199        boost::signals::connection conn_;
200        std::deque<shared_ptr<hal::EventDetail> > events_;
201};
202
203class AdvDebugDialog :
204        public CHalTabPageImpl<AdvDebugDialog>,
205        public WTL::CDialogResize<AdvDebugDialog>,
206        public CHaliteDialogBase<AdvDebugDialog>,
207        public CWinDataExchangeEx<AdvDebugDialog>,
208        private boost::noncopyable
209{
210protected:
211        typedef AdvDebugDialog thisClass;
212        typedef CHalTabPageImpl<AdvDebugDialog> baseClass;
213        typedef WTL::CDialogResize<AdvDebugDialog> resizeClass;
214        typedef CHaliteDialogBase<AdvDebugDialog> dialogBaseClass;
215
216public:
217        enum { IDD = IDD_ADVDEBUGLOG };
218
219        AdvDebugDialog(HaliteWindow& halWindow) :
220                dialogBaseClass(halWindow)
221        {}
222       
223        BOOL PreTranslateMessage(MSG* pMsg)
224        {
225                return this->IsDialogMessage(pMsg);
226        }
227
228        BEGIN_MSG_MAP_EX(thisClass)
229                MSG_WM_INITDIALOG(onInitDialog)
230                MSG_WM_CLOSE(onClose)
231
232                COMMAND_ID_HANDLER_EX(IDC_DEBUGFILECHECK, onFileCheck)
233                COMMAND_ID_HANDLER_EX(IDC_DEBUGDEBUGCHECK, onDebugCheck)
234
235                if (uMsg == WM_FORWARDMSG)
236                        if (PreTranslateMessage((LPMSG)lParam)) return TRUE;
237
238                CHAIN_MSG_MAP(dialogBaseClass)
239                CHAIN_MSG_MAP(resizeClass)
240                CHAIN_MSG_MAP(baseClass)
241                REFLECT_NOTIFICATIONS()
242        END_MSG_MAP()
243
244        BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1);
245
246        BEGIN_DLGRESIZE_MAP(thisClass)
247                DLGRESIZE_CONTROL(IDC_DEBUGLISTVIEW, DLSZ_SIZE_X|DLSZ_SIZE_Y)
248                DLGRESIZE_CONTROL(IDC_DEBUGFILECHECK, DLSZ_SIZE_X|DLSZ_MOVE_Y)
249                DLGRESIZE_CONTROL(IDC_DEBUGDEBUGCHECK, DLSZ_MOVE_X|DLSZ_MOVE_Y)
250        END_DLGRESIZE_MAP()
251
252        LRESULT onInitDialog(HWND, LPARAM);
253        void onClose();
254
255        void onLoginCheck(UINT, int, HWND hWnd);
256        void onFileCheck(UINT, int, HWND hWnd) { DoDataExchange(true); }
257        void onDebugCheck(UINT, int, HWND hWnd) { DoDataExchange(true); }
258
259        void onDebugOption(UINT, int, HWND);
260
261protected:
262        LogListViewCtrl logList;
263        int debugLevel;
264};
Note: See TracBrowser for help on using the repository browser.