source: trunk/src/TimePickerDlg.hpp @ 762

Revision 762, 6.6 KB checked in by Eoin, 10 years ago (diff)

Created the time picker dialog. Have only implemented pausing and exit action so far.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2009.
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 ID_TIME_DLG_BEGIN                                       13900
10#define HAL_TIME_DLG                                            13901
11
12#define HAL_TIME_PICKER                         ID_TIME_DLG_BEGIN + 2
13#define HAL_TIME_DATE_PICKER                    ID_TIME_DLG_BEGIN + 3
14#define HAL_TIME_EDITABOUT                      ID_TIME_DLG_BEGIN + 4
15#define HAL_TIME_TIMEOUT_DISPLAY                ID_TIME_DLG_BEGIN + 5
16#define HAL_TIME_TIME_REMAINING         ID_TIME_DLG_BEGIN + 6
17#define HAL_TIME_ACTIONS                        ID_TIME_DLG_BEGIN + 7
18#define HAL_TIME_ACTION_PAUSEALL                ID_TIME_DLG_BEGIN + 8
19#define HAL_TIME_ACTION_EXIT                    ID_TIME_DLG_BEGIN + 9
20#define HAL_TIME_ACTION_LOGOFF          ID_TIME_DLG_BEGIN + 10
21#define HAL_TIME_ACTION_SHUTDOWN                ID_TIME_DLG_BEGIN + 11
22#define HAL_TIME_SETTEXT                        ID_TIME_DLG_BEGIN + 12
23
24
25#ifndef RC_INVOKED
26
27#include "stdAfx.hpp"
28#include "DdxEx.hpp"
29
30#include "HaliteWindow.hpp"
31#include "UxthemeWrapper.hpp"
32
33#ifndef NDEBUG
34#       include "global/logger.hpp"
35#endif
36
37class DateTimePicker : 
38        public ATL::CWindowImpl<DateTimePicker, WTL::CDateTimePickerCtrl>
39{
40protected:
41        typedef DateTimePicker thisClass;
42        typedef ATL::CWindowImpl<thisClass, WTL::CDateTimePickerCtrl> baseClass;
43
44public:
45        typedef boost::function<void ()> date_time_changed_fn;
46
47        DateTimePicker(date_time_changed_fn dtc) :
48                date_time_changed_(dtc)
49        {}
50
51        BEGIN_MSG_MAP_EX(thisClass)
52                REFLECTED_NOTIFY_CODE_HANDLER_EX(DTN_DATETIMECHANGE, OnDateTimeChange)
53
54                DEFAULT_REFLECTION_HANDLER()
55        END_MSG_MAP()
56
57        LRESULT OnDateTimeChange(LPNMHDR pnmh)
58        {       
59                date_time_changed_();
60               
61                return 0;
62        }
63
64        void Attach(HWND hWndNew)
65        {
66                ATLASSERT(::IsWindow(hWndNew));
67                baseClass::SubclassWindow(hWndNew);
68        }
69
70private:
71        date_time_changed_fn date_time_changed_;
72};
73
74
75class TimePickerDlg :
76        public ATL::CDialogImpl<TimePickerDlg>,
77        public ATL::CAutoSizeWindow<TimePickerDlg, true>
78{
79protected:
80        typedef TimePickerDlg thisClass;
81        typedef ATL::CDialogImpl<thisClass> baseClass;
82        typedef ATL::CAutoSizeWindow<thisClass, true> autosizeClass;
83public:
84        enum { IDD = HAL_TIME_DLG };
85
86        enum timeout_actions
87        {
88                action_pause = 0,
89                action_exit,
90                action_logoff,
91                action_shutdown
92        };
93
94        TimePickerDlg(boost::posix_time::time_duration& time, unsigned& action) :
95                time_ctrl_(bind(&TimePickerDlg::updateTimeoutDisplay, this)),
96                date_ctrl_(bind(&TimePickerDlg::updateTimeoutDisplay, this)),
97                action_time_(time),
98                action_(action)
99        {}
100
101        BOOL PreTranslateMessage(MSG* pMsg)
102        {
103                return this->IsDialogMessage(pMsg);
104        }
105
106        BEGIN_MSG_MAP_EX(thisClass)
107                MSG_WM_INITDIALOG(onInitDialog)
108                MSG_WM_CLOSE(OnClose)   
109
110                COMMAND_ID_HANDLER_EX(IDOK, OnOk)
111                COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
112
113                COMMAND_HANDLER_EX(HAL_TIME_ACTIONS, CBN_SELCHANGE, OnActionChanged)
114
115                if (uMsg == WM_FORWARDMSG)
116                        if (PreTranslateMessage((LPMSG)lParam)) return TRUE;
117
118                CHAIN_MSG_MAP(autosizeClass)
119                REFLECT_NOTIFICATIONS()
120        END_MSG_MAP()
121       
122#define OK_CANCEL_BUTTON_LAYOUT \
123        WMB_HEAD(WMB_COL(_exp), WMB_COL(60), WMB_COL(60)), \
124                WMB_ROW(_auto, 0 , IDOK, IDCANCEL), \
125        WMB_END()
126
127        BEGIN_WINDOW_MAP(thisClass, 6, 6, 3, 3)
128                WMB_HEAD(WMB_COL(80), WMB_COL(_exp), WMB_COL(_exp)),
129                        WMB_ROW(_auto, HAL_TIME_EDITABOUT, HAL_TIME_ACTIONS), 
130                        WMB_ROW(_auto, HAL_TIME_SETTEXT, HAL_TIME_PICKER, HAL_TIME_DATE_PICKER), 
131                        WMB_ROW(_auto, HAL_TIME_TIMEOUT_DISPLAY, _r, _r), 
132                        WMB_ROW(_auto, OK_CANCEL_BUTTON_LAYOUT, _r, _r), 
133                WMB_END()
134        END_WINDOW_MAP()       
135
136        LRESULT onInitDialog(HWND, LPARAM)
137        {
138                WTL::CComboBox action_types;
139
140                action_types.Attach(GetDlgItem(HAL_TIME_ACTIONS));
141               
142                action_types.AddString(hal::app().res_wstr(HAL_TIME_ACTION_PAUSEALL).c_str());
143                action_types.AddString(hal::app().res_wstr(HAL_TIME_ACTION_EXIT).c_str());
144                action_types.AddString(hal::app().res_wstr(HAL_TIME_ACTION_LOGOFF).c_str());
145                action_types.AddString(hal::app().res_wstr(HAL_TIME_ACTION_SHUTDOWN).c_str());
146               
147                action_types.SetCurSel(0);
148                OnActionChanged(0, HAL_TIME_ACTIONS, action_types);
149                //action_ = 0;
150
151                time_ctrl_.Attach(GetDlgItem(HAL_TIME_PICKER));
152                date_ctrl_.Attach(GetDlgItem(HAL_TIME_DATE_PICKER));
153
154                WTL::CRect rect_;;
155                CenterWindow();
156                GetWindowRect(rect_);
157                MoveWindow(rect_.left, rect_.top, rect_.right-rect_.left, rect_.bottom-rect_.top, true);
158
159                return 0;
160        }
161
162        void OnActionChanged(UINT uNotifyCode, int nID, CWindow wndCtl)
163        {       
164                hal::win_c_str<std::wstring> str_buf(MAX_PATH);         
165                wndCtl.GetWindowText(str_buf, str_buf.size());
166               
167                if (str_buf.str() == hal::app().res_wstr(HAL_TIME_ACTION_PAUSEALL))
168                {
169                        action_ = action_pause;
170                }
171                else if (str_buf.str() == hal::app().res_wstr(HAL_TIME_ACTION_EXIT))
172                {
173                        action_ = action_exit;
174                }       
175                else if (str_buf.str() == hal::app().res_wstr(HAL_TIME_ACTION_LOGOFF))
176                {
177                        action_ = action_logoff;
178                }       
179                else if (str_buf.str() == hal::app().res_wstr(HAL_TIME_ACTION_SHUTDOWN))
180                {
181                        action_ = action_shutdown;
182                }               
183        }
184       
185        void OnClose()
186        {
187                action_time_ = boost::posix_time::not_a_date_time;
188
189                EndDialog(0);
190        }
191
192        void OnCancel(UINT uNotifyCode, int nID, ATL::CWindow wndCtl)
193        {               
194                action_time_ = boost::posix_time::not_a_date_time;
195
196                EndDialog(0);
197        }
198
199        void OnOk(UINT uNotifyCode, int nID, ATL::CWindow wndCtl)
200        {
201                EndDialog(1);
202        }
203
204private:
205        void updateTimeoutDisplay()
206        {
207                using namespace boost::posix_time;
208                using namespace boost::gregorian;
209
210                SYSTEMTIME sys_time;
211
212                date_ctrl_.GetSystemTime(&sys_time);
213                boost::gregorian::date date(sys_time.wYear, sys_time.wMonth, sys_time.wDay);
214
215                time_ctrl_.GetSystemTime(&sys_time);
216                boost::posix_time::time_duration duration(sys_time.wHour, sys_time.wMinute, sys_time.wSecond, sys_time.wMilliseconds);
217
218                ptime time(date, duration);
219                ptime now = second_clock::local_time();
220               
221
222                SetDlgItemText(HAL_TIME_TIMEOUT_DISPLAY, hal::from_utf8(to_simple_string(time)).c_str());
223                SetDlgItemText(HAL_TIME_EDITABOUT, hal::from_utf8(to_simple_string(time)).c_str());
224
225                if (time > now)
226                {
227                        time_duration time_left = time - now;
228                       
229                        SetDlgItemText(HAL_TIME_TIMEOUT_DISPLAY, (hal::wform(hal::app().res_wstr(HAL_TIME_TIME_REMAINING)) 
230                                % time_left.hours() % time_left.minutes() % time_left.seconds()).str().c_str());
231
232                        action_time_ = time_left;
233                }
234                else
235                        action_time_ = not_a_date_time;
236
237                hal::event_log().post(shared_ptr<hal::EventDetail>(
238                        new hal::EventMsg(hal::wform(L"updateTimeoutDisplay %1%") % hal::from_utf8(to_simple_string(action_time_)))));
239        }
240
241        DateTimePicker time_ctrl_;
242        DateTimePicker date_ctrl_;
243
244        unsigned& action_;
245        boost::posix_time::time_duration& action_time_;
246};
247
248#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.