source: trunk/src/TimePickerDlg.hpp @ 770

Revision 770, 7.9 KB checked in by Eoin, 10 years ago (diff)

Preparing for snapshot release.

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