From 6bb09706724534c42465f9ecf46a4a7e7ff08c30 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 19 Oct 2004 16:43:53 +0000 Subject: [PATCH] extracted LPITEMIDLIST wrappers in a separate header (also [will be] used by wxStdnardPaths) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30000 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/wrapshl.h | 81 ++++++++++++++++++++++++++++++++++++++++ src/msw/dirdlg.cpp | 58 ++++------------------------ 2 files changed, 89 insertions(+), 50 deletions(-) create mode 100644 include/wx/msw/wrapshl.h diff --git a/include/wx/msw/wrapshl.h b/include/wx/msw/wrapshl.h new file mode 100644 index 0000000000..3a0e143d76 --- /dev/null +++ b/include/wx/msw/wrapshl.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/msw/wrapshl.h +// Purpose: wrapper class for stuff from shell32.dll +// Author: Vadim Zeitlin +// Modified by: +// Created: 2004-10-19 +// RCS-ID: $Id$ +// Copyright: (c) 2004 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_MSW_WRAPSHL_H_ +#define _WX_MSW_WRAPSHL_H_ + +#ifdef __WXWINCE__ + #include + #include + #include +#endif + +#include + +// ---------------------------------------------------------------------------- +// wxItemIdList implements RAII on top of ITEMIDLIST +// ---------------------------------------------------------------------------- + +class wxItemIdList +{ +public: + // ctor takes ownership of the item and will free it + wxItemIdList(LPITEMIDLIST pidl) + { + m_pidl = pidl; + } + + static void Free(LPITEMIDLIST pidl) + { + if ( pidl ) + { + LPMALLOC pMalloc; + SHGetMalloc(&pMalloc); + if ( pMalloc ) + { + pMalloc->Free(pidl); + pMalloc->Release(); + } + else + { + wxLogLastError(wxT("SHGetMalloc")); + } + } + } + + ~wxItemIdList() + { + Free(m_pidl); + } + + // implicit conversion to LPITEMIDLIST + operator LPITEMIDLIST() const { return m_pidl; } + + // get the corresponding path, returns empty string on error + wxString GetPath() const + { + wxString path; + if ( !SHGetPathFromIDList(m_pidl, wxStringBuffer(path, MAX_PATH)) ) + { + wxLogLastError(_T("SHGetPathFromIDList")); + } + + return path; + } + +private: + LPITEMIDLIST m_pidl; + + DECLARE_NO_COPY_CLASS(wxItemIdList) +}; + +#endif // _WX_MSW_WRAPSHL_H_ + diff --git a/src/msw/dirdlg.cpp b/src/msw/dirdlg.cpp index d334ee245e..0bb55362d5 100644 --- a/src/msw/dirdlg.cpp +++ b/src/msw/dirdlg.cpp @@ -41,22 +41,12 @@ #endif #include "wx/msw/private.h" - -#ifdef __WXWINCE__ -#include -#include -#include -#endif -#include // Win95 shell +#include "wx/msw/wrapshl.h" // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- -#ifndef MAX_PATH - #define MAX_PATH 4096 // be generous -#endif - #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif @@ -79,9 +69,6 @@ IMPLEMENT_CLASS(wxDirDialog, wxDialog) // private functions prototypes // ---------------------------------------------------------------------------- -// free the parameter -static void ItemListFree(LPITEMIDLIST pidl); - // the callback proc for the dir dlg static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData); @@ -186,12 +173,9 @@ int wxDirDialog::ShowModal() } // do show the dialog - LPITEMIDLIST pidl = SHBrowseForFolder(&bi); + wxItemIdList pidl(SHBrowseForFolder(&bi)); - if ( bi.pidlRoot ) - { - ItemListFree((LPITEMIDLIST)bi.pidlRoot); - } + wxItemIdList::Free((LPITEMIDLIST)bi.pidlRoot); if ( !pidl ) { @@ -199,18 +183,9 @@ int wxDirDialog::ShowModal() return wxID_CANCEL; } - BOOL ok = SHGetPathFromIDList(pidl, wxStringBuffer(m_path, MAX_PATH)); - - ItemListFree(pidl); - - if ( !ok ) - { - wxLogLastError(wxT("SHGetPathFromIDList")); - - return wxID_CANCEL; - } + m_path = pidl.GetPath(); - return wxID_OK; + return m_path.empty() ? wxID_CANCEL : wxID_OK; } // ---------------------------------------------------------------------------- @@ -222,15 +197,16 @@ BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { switch(uMsg) { +#ifdef BFFM_SETSELECTION case BFFM_INITIALIZED: // sent immediately after initialisation and so we may set the // initial selection here // // wParam = TRUE => lParam is a string and not a PIDL -#ifndef __WXWINCE__ ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); -#endif break; +#endif // BFFM_SETSELECTION + case BFFM_SELCHANGED: // note that this doesn't work with the new style UI (MSDN doesn't @@ -269,24 +245,6 @@ BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) } -static void ItemListFree(LPITEMIDLIST pidl) -{ - if ( pidl ) - { - LPMALLOC pMalloc; - SHGetMalloc(&pMalloc); - if ( pMalloc ) - { - pMalloc->Free(pidl); - pMalloc->Release(); - } - else - { - wxLogLastError(wxT("SHGetMalloc")); - } - } -} - #else #include "../generic/dirdlgg.cpp" #endif // compiler/platform on which the code here compiles -- 2.45.2