source: trunk/src/HaliteEditCtrl.hpp @ 390

Revision 390, 2.9 KB checked in by Eoin, 12 years ago (diff)

Adding some WTL:: namespace prefixes.

Line 
1
2//         Copyright Eoin 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_HAL_EDITCHANGED WM_USER + 100
10
11#include "stdAfx.hpp"
12#include <boost/logic/tribool.hpp>
13#include "global/string_conv.hpp"
14
15template<typename T>
16class CHaliteEditCtrl :
17        public CWindowImpl<CHaliteEditCtrl<T>, WTL::CEdit>,
18        private boost::noncopyable
19{
20protected:
21        typedef CHaliteEditCtrl<T> thisClass;
22        typedef CWindowImpl<thisClass, WTL::CEdit> baseClass;
23       
24public:
25        explicit CHaliteEditCtrl(T lwr = 0, bool include = false, bool signal = true) :
26                range_lwr_(lwr),
27                range_inc_(include),
28                unapplied_(false),
29                signal_(signal)
30        {}
31
32    BEGIN_MSG_MAP_EX(thisClass)
33                REFLECTED_COMMAND_CODE_HANDLER_EX(EN_KILLFOCUS, OnKillFocus)
34                REFLECTED_COMMAND_CODE_HANDLER_EX(EN_CHANGE, OnChange)
35                MSG_OCM_CTLCOLOREDIT(OnReflectedCtlColorEdit)
36               
37        DEFAULT_REFLECTION_HANDLER()
38    END_MSG_MAP()
39
40        void Attach(HWND hWndNew)
41        {
42                ATLASSERT(::IsWindow(hWndNew));
43        baseClass::SubclassWindow(hWndNew);
44        }
45       
46        LRESULT OnChange(UINT uNotifyCode, int nID, CWindow wndCtl)
47        {       
48                if (unapplied_)
49                {
50                }
51                else if (!unapplied_)
52                {
53                        unapplied_ = true;
54                        InvalidateRect(0, true);
55                }
56                else
57                {
58                        unapplied_ = false;
59                }
60               
61                return 0;
62        }
63       
64        LRESULT OnKillFocus(UINT uNotifyCode, int nID, CWindow wndCtl)
65        {       
66                const int buffer_size = 512;
67                boost::array<wchar_t, buffer_size> buffer;
68                GetWindowText(buffer.elems, buffer_size);
69               
70                try
71                {
72                value_ = lexical_cast<T>(buffer.elems);
73                       
74                if (range_inc_)
75                {
76                        if (value_ < range_lwr_) value_ = -1;
77                }
78                else
79                {
80                        if (value_ <= range_lwr_) value_ = -1;
81                }
82                       
83                }       
84                catch(boost::bad_lexical_cast &)
85                {
86                value_ = -1;
87                }
88               
89                if (value_ < 0) SetWindowText(hal::app().res_wstr(HAL_INF).c_str());
90               
91                if (signal_)
92                {
93                        ::SendMessage(GetParent(), WM_USER_HAL_EDITCHANGED, 0, 0);
94                        unapplied_ = false;
95                }
96               
97                return 0;
98        }
99       
100        HBRUSH OnReflectedCtlColorEdit(WTL::CDCHandle dc, WTL::CEdit edit)
101        {
102                if (signal_ && unapplied_)
103                {
104                        SetTextColor(dc, RGB(0,0,255));
105                        return GetSysColorBrush(COLOR_3DHILIGHT);
106                }
107                else
108                {
109                        return false;
110                }
111        }
112       
113        T& Value() { return value_; }
114       
115        operator T& () { return Value(); }
116       
117        T& operator=(T val) 
118        {
119                if (!unapplied_) unapplied_ = boost::logic::indeterminate;
120               
121                if (range_inc_)
122                {
123                        if (val < range_lwr_) val = -1;
124                }
125                else
126                {
127                        if (val <= range_lwr_) val = -1;
128                }
129               
130                if (val < 0)   
131                {
132                        value_ = -1;
133                        SetWindowText(hal::app().res_wstr(HAL_INF).c_str());
134                }
135                else
136                {
137                        value_ = val;
138                        SetWindowText((lexical_cast<wstring>(value_)).c_str());
139                }
140               
141                return value_;
142        }               
143       
144private:
145        T value_;
146       
147        T range_lwr_;
148        bool range_inc_;
149       
150        boost::logic::tribool unapplied_;
151        bool signal_;
152};
153
Note: See TracBrowser for help on using the repository browser.