source: src/advtabs/Debug.hpp @ 307

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