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

Revision 478, 7.1 KB checked in by Eoin, 12 years ago (diff)

Merged 0.3.1 changes into trunk.

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