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

Revision 697, 6.0 KB checked in by kavika, 11 years ago (diff)

Small tweak to EditHilight? and DdxEx?.hpp.

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       
95        ~LogListViewCtrl()
96        {
97                hal::mutex_t::scoped_lock l(mutex_);
98
99                if (conn_.connected()) conn_.disconnect();
100        }
101
102        void saveSettings()
103        {
104                GetListViewDetails();
105                save_to_ini();
106        }
107
108    friend class boost::serialization::access;
109    template<class Archive>
110    void serialize(Archive& ar, const unsigned int version)
111    {
112                ar & boost::serialization::make_nvp("listview", 
113                        boost::serialization::base_object<listClass>(*this));
114    }
115
116        void operator()(shared_ptr<hal::EventDetail> event)
117        {
118                hal::mutex_t::scoped_lock l(mutex_);
119
120                try
121                {
122                events_.push_back(event);
123               
124                PostMessage(WM_USER_LOGPOST, 0, 0);
125               
126                }
127                catch(...)
128                {}
129        }
130
131        LRESULT OnMessageLogPost(UINT uMsg, WPARAM wParam, LPARAM lParam)
132        {
133                hal::mutex_t::scoped_lock l(mutex_);
134
135                try
136                {
137                shared_ptr<hal::EventDetail> event(*events_.begin());
138
139                wstring timeStamp = lexical_cast<wstring>(event->timeStamp());
140
141                int itemPos = AddItem(0, 0, timeStamp.c_str());
142
143                SetItemText(itemPos, 1, event->msg().c_str());
144
145                SetItemText(itemPos, 2,
146                        hal::event_logger::eventLevelToStr(event->level()).c_str());
147                       
148                if (halite().logListLen() <= GetItemCount())
149                        DeleteItem(halite().logListLen());
150
151                }
152                catch(...)
153                {}
154
155                events_.pop_front();
156
157                return 0;
158        }
159
160        void saveStatus() {}
161        void updateListView() {}
162
163private:
164        void OnAttach()
165        {       
166                hal::mutex_t::scoped_lock l(mutex_);
167       
168                InitialSetup();         
169
170                std::vector<wstring> names;     
171                wstring column_names = hal::app().res_wstr(HAL_DEBUG_LISTVIEW_COLUMNS);
172
173                // "Time;Message;Severity"
174                boost::split(names, column_names, boost::is_any_of(L";"));
175               
176                array<int, 3> widths = {67,419,69};
177                array<int, 3> order = {0,1,2};
178                array<bool, 3> visible = {true,true,true};
179
180                for (int i=0, e=3; i < e; ++i)
181                {
182                        AddColumn(names[i].c_str(), i, visible[i], widths[i]);
183                }       
184       
185                load_from_ini();
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 WTLx::WinDataExchangeEx<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 = HAL_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(HAL_DEBUGFILECHECK, onFileCheck)
233                COMMAND_ID_HANDLER_EX(HAL_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(HAL_DEBUGLISTVIEW, DLSZ_SIZE_X|DLSZ_SIZE_Y)
248                DLGRESIZE_CONTROL(HAL_DEBUGFILECHECK, DLSZ_SIZE_X|DLSZ_MOVE_Y)
249                DLGRESIZE_CONTROL(HAL_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.