source: trunk/src/ProgressDialog.hpp @ 564

Revision 564, 2.3 KB checked in by Eoin, 11 years ago (diff)

Added win32_exception class.

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#define HAL_PROGRESS                    15000
10#define ID_PROGRESS_BEGIN                               15001
11
12#define HAL_PROG_DESCP                  ID_PROGRESS_BEGIN + 1
13#define HAL_PROG_CANCEL                 ID_PROGRESS_BEGIN + 2
14#define HAL_PROG_PROGRESS               ID_PROGRESS_BEGIN + 3
15
16#ifndef RC_INVOKED
17
18#include <boost/function.hpp>
19
20#include "Halite.hpp"
21#include "halTorrent.hpp"
22
23class ProgressDialog :
24        public ATL::CDialogImpl<ProgressDialog>
25{
26protected:
27        typedef ProgressDialog thisClass;
28        typedef ATL::CDialogImpl<ProgressDialog> baseClass;
29       
30        typedef boost::function<bool (hal::progress_callback fn)> threadFunction;
31
32public:
33        ProgressDialog(wstring windowText, threadFunction fn) :
34                fn_(fn),
35                windowText_(windowText),
36                stop_(false)
37        {}
38       
39        enum { IDD = HAL_PROGRESS };
40
41    BEGIN_MSG_MAP_EX(ProgressDialog)
42                MSG_WM_INITDIALOG(onInitDialog)
43
44                COMMAND_ID_HANDLER_EX(HAL_PROG_CANCEL, onCancel)
45    END_MSG_MAP()
46       
47        LRESULT onInitDialog(HWND, LPARAM)
48        {
49                CenterWindow();
50                SetWindowText(windowText_.c_str());
51                prog_.Attach(GetDlgItem(HAL_PROG_PROGRESS));
52                prog_.SetRange(0, 100);
53               
54                thread_ptr.reset(new thread(bind(&ProgressDialog::ProgressThread, this)));
55               
56                return TRUE;
57        }
58
59        void ProgressThread()
60        {
61                try
62                {
63
64                int err_code = (fn_(bind(&ProgressDialog::Callback, this, _1, _2)) ? 1 : 0);
65               
66                EndDialog(err_code);
67
68                }
69                catch(std::exception& e)
70                {
71                        hal::event_log.post(shared_ptr<hal::EventDetail>(\
72                                new hal::EventStdException(hal::event_logger::debug, e, L"ProgressThread()")));
73                }
74                catch(...)
75                {
76                        HAL_DEV_MSG(L"ProgressThread() catch all");
77                }
78        }
79       
80        bool Callback(size_t progress, wstring description)
81        {
82                SetDlgItemText(HAL_PROG_DESCP, description.c_str());
83                prog_.SetPos(progress);
84               
85                return stop_;
86        }
87       
88        BOOL PreTranslateMessage(MSG* pMsg)
89        {
90                return this->IsDialogMessage(pMsg);
91        }
92       
93        void onCancel(UINT, int, HWND hWnd)
94        {
95                stop_ = true;
96        }
97       
98private:
99        boost::scoped_ptr<thread> thread_ptr;
100        threadFunction fn_;
101       
102        wstring windowText_;
103        bool stop_;
104        WTL::CProgressBarCtrl prog_;
105};
106
107#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.