source: src/DdxEx.hpp @ 268

Revision 268, 2.7 KB checked in by Eoin, 12 years ago (diff)

Added copyright eventually.

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#include <boost/type_traits.hpp>
10#include <atlddx.h>
11
12#define DDX_EX_FLOAT_POSITIVE(nID, var) \
13                if(nCtlID == (UINT)-1 || nCtlID == nID) \
14                { \
15                        if(!DDX_Numeric_Inf<float>(nID, var, bSaveAndValidate)) \
16                                return FALSE; \
17                }
18
19#define DDX_EX_INT_FLOAT_LIMIT(nID, var, lower, include) \
20                if(nCtlID == (UINT)-1 || nCtlID == nID) \
21                { \
22                        if(!DDX_Numeric_Inf<float>(nID, var, bSaveAndValidate, lower, include)) \
23                                return FALSE; \
24                }
25
26#define DDX_EX_INT_POSITIVE_LIMIT(nID, var, lower, include) \
27                if(nCtlID == (UINT)-1 || nCtlID == nID) \
28                { \
29                        if(!DDX_Numeric_Inf<int>(nID, var, bSaveAndValidate, lower, include)) \
30                                return FALSE; \
31                }
32
33#define DDX_EX_INT_POSITIVE(nID, var) \
34                if(nCtlID == (UINT)-1 || nCtlID == nID) \
35                { \
36                        if(!DDX_Numeric_Inf<int>(nID, var, bSaveAndValidate)) \
37                                return FALSE; \
38                }
39
40#define DDX_EX_STDWSTRING(nID, str) \
41                if(nCtlID == (UINT)-1 || nCtlID == nID) \
42                        if(!DDX_StdWString(nID, str, bSaveAndValidate)) \
43                                return FALSE; \
44                       
45template <class T>
46class CWinDataExchangeEx : public CWinDataExchange<T>
47{
48public: 
49
50        BOOL DDX_StdWString(UINT id, wstring& str, BOOL save, const int max_len=MAX_PATH)
51        {
52                T* pT = static_cast<T*>(this);
53                BOOL success = TRUE;
54               
55                if (save)
56                {
57                        std::vector<wchar_t> buffer(max_len);
58                        size_t len = pT->GetDlgItemText(id, &buffer[0], max_len);
59                        str.assign(buffer.begin(), buffer.begin()+len);
60                }
61                else
62                {               
63                        pT->SetDlgItemText(id, str.c_str());
64                }
65               
66                return success;
67        }
68       
69        template <typename N>
70        BOOL DDX_Numeric_Inf(UINT nID, N& nVal, BOOL bSave, N lower_limit = 0, bool include_limit = true, BOOL bValidate = FALSE)
71        {
72                T* pT = static_cast<T*>(this);
73                bool bSuccess = true;
74                const int cchBuff = 128;
75                wchar_t szBuff[cchBuff] = { 0 };
76               
77                if(bSave)
78                {
79                        pT->GetDlgItemText(nID, szBuff, cchBuff);
80                        try
81                        {
82                       
83                        nVal = lexical_cast<N>(szBuff);
84                        if (include_limit)
85                                if (nVal < lower_limit) nVal = -1;
86                        else
87                                if (nVal <= lower_limit) nVal = -1;             
88                       
89                        }       
90                        catch(boost::bad_lexical_cast &)
91                        {
92                        nVal = -1;
93                        }
94                       
95                        if (nVal < 0)
96                                pT->SetDlgItemText(nID, L"∞");
97                }
98                else
99                {
100                        wstring number = L"∞";
101                       
102                        if (include_limit)
103                                if (nVal >= lower_limit) number = lexical_cast<wstring>(nVal);
104                        else
105                                if (nVal > lower_limit) number = lexical_cast<wstring>(nVal);
106                       
107                        pT->SetDlgItemText(nID, number.c_str());
108                }
109               
110                return bSuccess;
111        } 
112};
Note: See TracBrowser for help on using the repository browser.