source: branch_0_3_1/src/advtabs/Debug.hpp @ 485

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

Going to release snapshot 0.3.1. Disabled standalone torrent xml files for this release.

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 CWindowImpl<LogEdit, 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 CWindowImpl<LogList, CListBox>
47{
48public:
49    BEGIN_MSG_MAP_EX(CListBox)
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                load_from_ini();
106        }
107       
108        ~LogListViewCtrl()
109        {
110                hal::mutex_t::scoped_lock l(mutex_);
111
112                if (conn_.connected()) conn_.disconnect();
113        }
114
115        void saveSettings()
116        {
117                GetListViewDetails();
118                save_to_ini();
119        }
120
121    friend class boost::serialization::access;
122    template<class Archive>
123    void serialize(Archive& ar, const unsigned int version)
124    {
125                ar & boost::serialization::make_nvp("listview", 
126                        boost::serialization::base_object<listClass>(*this));
127    }
128
129        void operator()(shared_ptr<hal::EventDetail> event)
130        {
131                hal::mutex_t::scoped_lock l(mutex_);
132
133                try
134                {
135                events_.push_back(event);
136               
137                PostMessage(WM_USER_LOGPOST, 0, 0);
138               
139                }
140                catch(...)
141                {}
142        }
143
144        LRESULT OnMessageLogPost(UINT uMsg, WPARAM wParam, LPARAM lParam)
145        {
146                hal::mutex_t::scoped_lock l(mutex_);
147
148                try
149                {
150                shared_ptr<hal::EventDetail> event(*events_.begin());
151
152                wstring timeStamp = lexical_cast<wstring>(event->timeStamp());
153
154                int itemPos = AddItem(0, 0, timeStamp.c_str());
155
156                SetItemText(itemPos, 1, event->msg().c_str());
157
158                SetItemText(itemPos, 2,
159                        hal::event_logger::eventLevelToStr(event->level()).c_str());
160                       
161                if (halite().logListLen() <= GetItemCount())
162                        DeleteItem(halite().logListLen());
163
164                }
165                catch(...)
166                {}
167
168                events_.pop_front();
169
170                return 0;
171        }
172
173        void saveStatus() {}
174        void updateListView() {}
175
176private:
177        void OnAttach()
178        {       
179                hal::mutex_t::scoped_lock l(mutex_);
180       
181                SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
182                SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
183               
184                ApplyDetails();
185               
186                conn_ = hal::event_log.attach(bind(&LogListViewCtrl::operator(), this, _1));
187        }
188
189        void OnDestroy()
190        {
191                hal::mutex_t::scoped_lock l(mutex_);
192
193                conn_.disconnect();
194                saveSettings();
195        }
196
197        mutable hal::mutex_t mutex_;
198        boost::signals::connection conn_;
199        std::deque<shared_ptr<hal::EventDetail> > events_;
200};
201
202class AdvDebugDialog :
203        public CHalTabPageImpl<AdvDebugDialog>,
204        public CDialogResize<AdvDebugDialog>,
205        public CHaliteDialogBase<AdvDebugDialog>,
206        public CWinDataExchangeEx<AdvDebugDialog>,
207        private boost::noncopyable
208{
209protected:
210        typedef AdvDebugDialog thisClass;
211        typedef CHalTabPageImpl<AdvDebugDialog> baseClass;
212        typedef CDialogResize<AdvDebugDialog> resizeClass;
213        typedef CHaliteDialogBase<AdvDebugDialog> dialogBaseClass;
214
215public:
216        enum { IDD = IDD_ADVDEBUGLOG };
217
218        AdvDebugDialog(HaliteWindow& halWindow) :
219                dialogBaseClass(halWindow)
220        {}
221       
222        BOOL PreTranslateMessage(MSG* pMsg)
223        {
224                return this->IsDialogMessage(pMsg);
225        }
226
227        BEGIN_MSG_MAP_EX(thisClass)
228                MSG_WM_INITDIALOG(onInitDialog)
229                MSG_WM_CLOSE(onClose)
230
231                COMMAND_ID_HANDLER_EX(IDC_DEBUGFILECHECK, onFileCheck)
232                COMMAND_ID_HANDLER_EX(IDC_DEBUGDEBUGCHECK, onDebugCheck)
233
234                if (uMsg == WM_FORWARDMSG)
235                        if (PreTranslateMessage((LPMSG)lParam)) return TRUE;
236
237                CHAIN_MSG_MAP(dialogBaseClass)
238                CHAIN_MSG_MAP(resizeClass)
239                CHAIN_MSG_MAP(baseClass)
240                REFLECT_NOTIFICATIONS()
241        END_MSG_MAP()
242
243        BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1);
244
245        BEGIN_DLGRESIZE_MAP(thisClass)
246                DLGRESIZE_CONTROL(IDC_DEBUGLISTVIEW, DLSZ_SIZE_X|DLSZ_SIZE_Y)
247                DLGRESIZE_CONTROL(IDC_DEBUGFILECHECK, DLSZ_SIZE_X|DLSZ_MOVE_Y)
248                DLGRESIZE_CONTROL(IDC_DEBUGDEBUGCHECK, DLSZ_MOVE_X|DLSZ_MOVE_Y)
249        END_DLGRESIZE_MAP()
250
251        LRESULT onInitDialog(HWND, LPARAM);
252        void onClose();
253
254        void onLoginCheck(UINT, int, HWND hWnd);
255        void onFileCheck(UINT, int, HWND hWnd) { DoDataExchange(true); }
256        void onDebugCheck(UINT, int, HWND hWnd) { DoDataExchange(true); }
257
258        void onDebugOption(UINT, int, HWND);
259
260protected:
261        LogListViewCtrl logList;
262        int debugLevel;
263};
Note: See TracBrowser for help on using the repository browser.