source: trunk/src/WTLx/CSSFileDialog.hpp @ 493

Revision 493, 5.1 KB checked in by Eoin, 12 years ago (diff)

Freedom from automatic ATL and/or WTL namespaces.

Line 
1
2#pragma once
3
4/**
5 * @class CSSFileDialog
6 * @brief a WTL implementation of CFileDialog which shows the modern places bar.
7 * @author Simon Steele <s.steele (at) pnotepad . org>
8 *
9 * This code is released into the public domain.
10 */
11
12#include <atldlgs.h>
13
14typedef struct tagOFNEXA {
15   DWORD        lStructSize;
16   HWND         hwndOwner;
17   HINSTANCE    hInstance;
18   LPCSTR       lpstrFilter;
19   LPSTR        lpstrCustomFilter;
20   DWORD        nMaxCustFilter;
21   DWORD        nFilterIndex;
22   LPSTR        lpstrFile;
23   DWORD        nMaxFile;
24   LPSTR        lpstrFileTitle;
25   DWORD        nMaxFileTitle;
26   LPCSTR       lpstrInitialDir;
27   LPCSTR       lpstrTitle;
28   DWORD        Flags;
29   WORD         nFileOffset;
30   WORD         nFileExtension;
31   LPCSTR       lpstrDefExt;
32   LPARAM       lCustData;
33   LPOFNHOOKPROC lpfnHook;
34   LPCSTR       lpTemplateName;
35#ifdef _MAC
36   LPEDITMENU   lpEditInfo;
37   LPCSTR       lpstrPrompt;
38#endif
39   void *       pvReserved;
40   DWORD        dwReserved;
41   DWORD        FlagsEx;
42} OPENFILENAMEEXA, *LPOPENFILENAMEEXA;
43
44typedef struct tagOFNEXW {
45   DWORD        lStructSize;
46   HWND         hwndOwner;
47   HINSTANCE    hInstance;
48   LPCWSTR      lpstrFilter;
49   LPWSTR       lpstrCustomFilter;
50   DWORD        nMaxCustFilter;
51   DWORD        nFilterIndex;
52   LPWSTR       lpstrFile;
53   DWORD        nMaxFile;
54   LPWSTR       lpstrFileTitle;
55   DWORD        nMaxFileTitle;
56   LPCWSTR      lpstrInitialDir;
57   LPCWSTR      lpstrTitle;
58   DWORD        Flags;
59   WORD         nFileOffset;
60   WORD         nFileExtension;
61   LPCWSTR      lpstrDefExt;
62   LPARAM       lCustData;
63   LPOFNHOOKPROC lpfnHook;
64   LPCWSTR      lpTemplateName;
65#ifdef _MAC
66   LPEDITMENU   lpEditInfo;
67   LPCSTR       lpstrPrompt;
68#endif
69   void *       pvReserved;
70   DWORD        dwReserved;
71   DWORD        FlagsEx;
72} OPENFILENAMEEXW, *LPOPENFILENAMEEXW;
73
74#ifdef UNICODE
75typedef OPENFILENAMEEXW OPENFILENAMEEX;
76typedef LPOPENFILENAMEEXW LPOPENFILENAMEEX;
77#else
78typedef OPENFILENAMEEXA OPENFILENAMEEX;
79typedef LPOPENFILENAMEEXA LPOPENFILENAMEEX;
80#endif // UNICODE
81
82class CSSFileDialog : public WTL::CFileDialogImpl<CSSFileDialog>
83{
84public:
85        CSSFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
86                LPCTSTR lpszDefExt = NULL,
87                LPCTSTR lpszFileName = NULL,
88                DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
89                LPCTSTR lpszFilter = NULL,
90                HWND hWndParent = NULL,
91                bool bUsePipeChar = true)
92                : CFileDialogImpl<CSSFileDialog>(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent)
93        { 
94                // Only real change here is to set up the m_ofnex structure
95                memset(&m_ofnex, 0, sizeof(m_ofnex)); // initialize structure to 0/NULL
96                m_bShowPlacesBar = true;
97
98                if(lpszFilter != NULL && bUsePipeChar)
99                {
100                        m_szFilter = new TCHAR[_tcslen(lpszFilter)+1];
101                        _tcscpy(m_szFilter, lpszFilter);
102                       
103                        LPTSTR pch = m_szFilter;
104                        while ((pch = _tcschr(pch, '|')) != NULL)
105                                *pch++ = '\0';
106
107                        m_ofn.lpstrFilter = m_szFilter;
108                }
109                else
110                {
111                        m_szFilter = NULL;
112                        m_ofn.lpstrFilter = lpszFilter;
113                }
114        }
115
116        virtual ~CSSFileDialog()
117        {
118                if(m_szFilter != NULL)
119                        delete [] m_szFilter;
120        }
121
122        bool IsEnhancedWinVer()
123        {
124                OSVERSIONINFO ver;
125                ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
126                if (! ::GetVersionEx(&ver) )
127                {
128                        return false;
129                }
130
131                if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
132                {
133                        if (ver.dwMajorVersion >= 5)
134                                return true;
135                }
136                else
137                {
138                        if ( (ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
139                                 (ver.dwMajorVersion >= 4) &&
140                                 (ver.dwMinorVersion >= 90) )
141                                return true;
142                }
143                return false;
144        }
145
146        INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
147        {
148                ATLASSERT(m_ofn.Flags & OFN_ENABLEHOOK);
149                ATLASSERT(m_ofn.lpfnHook != NULL);      // can still be a user hook
150
151                ATLASSERT(m_ofn.Flags & OFN_EXPLORER);
152
153                if(m_ofn.hwndOwner == NULL)             // set only if not specified before
154                        m_ofn.hwndOwner = hWndParent;
155
156                ATLASSERT(m_hWnd == NULL);
157                _Module.AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBase*)this);
158
159                // This is where we make our changes! If we are in Windows 2000 mode,
160                // we copy the contents of m_ofn into m_ofnex and call GetOpenFileName etc.
161                // with m_ofnex instead of m_ofn.
162
163                BOOL bRet;
164
165                if( IsEnhancedWinVer() && m_bShowPlacesBar )
166                {
167                        // Prepare m_ofnex:
168                        memcpy(&m_ofnex, &m_ofn, sizeof(OPENFILENAMEEX) - (sizeof(DWORD)*2) - sizeof(void *));
169                        m_ofnex.lStructSize = sizeof(OPENFILENAMEEX);
170                        m_ofnex.FlagsEx = 0; // Enable Places Bar...
171
172                        if(m_bOpenFileDialog)
173                                bRet = ::GetOpenFileName((OPENFILENAME*)&m_ofnex);
174                        else
175                                bRet = ::GetSaveFileName((OPENFILENAME*)&m_ofnex);
176
177                        // And now we need to re fill in m_ofn:
178                        memcpy(&m_ofn, &m_ofnex, sizeof(OPENFILENAME));
179                }
180                else
181                {
182                        if (m_bOpenFileDialog)
183                                bRet = ::GetOpenFileName(&m_ofn);
184                        else
185                                bRet = ::GetSaveFileName(&m_ofn);
186                }
187
188                m_hWnd = NULL;
189
190                return bRet ? IDOK : IDCANCEL;
191        }
192
193        // override base class map and references to handlers
194        DECLARE_EMPTY_MSG_MAP()
195
196        bool m_bShowPlacesBar;
197
198protected:
199        TCHAR*                  m_szFilter;
200        OPENFILENAMEEX  m_ofnex;
201};
Note: See TracBrowser for help on using the repository browser.