source: trunk/src/WTLx/DdxEx.hpp @ 697

Revision 697, 7.1 KB checked in by kavika, 11 years ago (diff)

Small tweak to EditHilight? and DdxEx?.hpp.

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_INF                                                 40203
10
11#include <atlddx.h>
12
13#define DDX_EX_FLOAT_POSITIVE(nID, var) \
14                if(nCtlID == (UINT)-1 || nCtlID == nID) \
15                { \
16                        if(!DDX_Numeric_Inf<float>(nID, var, bSaveAndValidate)) \
17                                return FALSE; \
18                }
19
20#define DDX_EX_INT_FLOAT_LIMIT(nID, var, lower, include) \
21                if(nCtlID == (UINT)-1 || nCtlID == nID) \
22                { \
23                        if(!DDX_Numeric_Inf<float>(nID, var, bSaveAndValidate, lower, include)) \
24                                return FALSE; \
25                }
26
27#define DDX_EX_INT_POSITIVE_LIMIT(nID, var, lower, include) \
28                if(nCtlID == (UINT)-1 || nCtlID == nID) \
29                { \
30                        if(!DDX_Numeric_Inf<int>(nID, var, bSaveAndValidate, lower, include)) \
31                                return FALSE; \
32                }
33
34#define DDX_EX_INT_POSITIVE(nID, var) \
35                if(nCtlID == (UINT)-1 || nCtlID == nID) \
36                { \
37                        if(!DDX_Numeric_Inf<int>(nID, var, bSaveAndValidate)) \
38                                return FALSE; \
39                }
40
41#define DDX_EX_STDWSTRING(nID, str) \
42                if(nCtlID == (UINT)-1 || nCtlID == nID) \
43                        if(!DDX_StdWString(nID, str, bSaveAndValidate)) \
44                                return FALSE; \
45
46#define DDX_WTLx_WSTRING(controlObj, str) \
47                if(nCtlID == (UINT)-1 || nCtlID == controlObj.GetDlgCtrlID()) \
48                        if(!DDX_WTLx_WString(controlObj, str, bSaveAndValidate)) \
49                                return FALSE; \
50
51namespace WTLx
52{
53
54template <class T>
55class WinDataExchangeEx : public WTL::CWinDataExchange<T>
56{
57public: 
58
59        template<class C>
60        bool DDX_WTLx_WString(C& control, std::wstring& str, BOOL save)
61        {       
62                if (save)
63                        str = control;
64                else
65                        control = str;
66
67                return true;
68        }
69
70        BOOL DDX_StdWString(UINT id, std::wstring& str, BOOL save, const int max_len=MAX_PATH)
71        {
72                T* pT = static_cast<T*>(this);
73                BOOL success = TRUE;
74               
75                if (save)
76                {
77                        std::vector<wchar_t> buffer(max_len);
78                        size_t len = pT->GetDlgItemText(id, &buffer[0], buffer.size());
79                        str.assign(buffer.begin(), buffer.begin()+len);
80                }
81                else
82                {               
83                        pT->SetDlgItemText(id, str.c_str());
84                }
85               
86                return success;
87        }
88       
89        template <typename N>
90        BOOL DDX_Numeric_Inf(UINT nID, N& nVal, BOOL bSave, N lower_limit = 0, bool include_limit = true, BOOL bValidate = FALSE)
91        {
92                T* pT = static_cast<T*>(this);
93                bool bSuccess = true;
94                const int cchBuff = 128;
95                wchar_t szBuff[cchBuff] = { 0 };
96               
97                if(bSave)
98                {
99                        pT->GetDlgItemText(nID, szBuff, cchBuff);
100                        try
101                        {
102                       
103                        nVal = lexical_cast<N>(szBuff);
104                                       
105                        if (include_limit)
106                        {
107                                if (nVal < lower_limit) 
108                                        nVal = -1;
109                        }
110                        else
111                        {
112                                if (nVal <= lower_limit) 
113                                        nVal = -1;
114                        }
115                       
116                        }       
117                        catch(boost::bad_lexical_cast &)
118                        {
119                                hal::event_log.post(shared_ptr<hal::EventDetail>(
120                                        new hal::EventMsg(L"Save bad_lexical_cast")));
121                                       
122                                nVal = -1;
123                        }
124                       
125                        if (nVal == -1)
126                                pT->SetDlgItemText(nID, hal::app().res_wstr(HAL_INF).c_str());
127                }
128                else
129                {
130                        wstring number = hal::app().res_wstr(HAL_INF);
131                       
132                        try
133                        {
134                       
135                        if (include_limit)
136                        {
137                                if (nVal >= lower_limit) 
138                                        number = lexical_cast<wstring>(nVal);
139                        }
140                        else
141                        {
142                                if (nVal > lower_limit) 
143                                        number = lexical_cast<wstring>(nVal);
144                        }
145                               
146                        }
147                        catch(boost::bad_lexical_cast &)
148                        {
149                                hal::event_log.post(shared_ptr<hal::EventDetail>(
150                                        new hal::EventMsg(L"Load bad_lexical_cast")));
151                                       
152                                wstring number = hal::app().res_wstr(HAL_INF);
153                        }                       
154                               
155                        pT->SetDlgItemText(nID, number.c_str());
156                }
157               
158                return bSuccess;
159        } 
160};
161
162};
Note: See TracBrowser for help on using the repository browser.