1 // Windows/Shell.h
2 
3 #ifndef ZIP7_WINDOWS_SHELL_H
4 #define ZIP7_WINDOWS_SHELL_H
5 
6 #include "../Common/Common.h"
7 #include "../Common/MyWindows.h"
8 #if defined(__MINGW32__) || defined(__MINGW64__)
9 #include <shlobj.h>
10 #else
11 #include <ShlObj.h>
12 #endif
13 
14 #include "../Common/MyString.h"
15 
16 #include "Defs.h"
17 
18 namespace NWindows {
19 namespace NShell {
20 
21 /////////////////////////
22 // CItemIDList
23 #ifndef UNDER_CE
24 
25 class CItemIDList
26 {
27   LPITEMIDLIST m_Object;
28   Z7_CLASS_NO_COPY(CItemIDList)
29 public:
CItemIDList()30   CItemIDList(): m_Object(NULL) {}
31   // CItemIDList(LPCITEMIDLIST itemIDList);
32   // CItemIDList(const CItemIDList& itemIDList);
~CItemIDList()33   ~CItemIDList() { Free(); }
34   void Free();
Attach(LPITEMIDLIST object)35   void Attach(LPITEMIDLIST object)
36   {
37     Free();
38     m_Object = object;
39   }
Detach()40   LPITEMIDLIST Detach()
41   {
42     LPITEMIDLIST object = m_Object;
43     m_Object = NULL;
44     return object;
45   }
operator LPITEMIDLIST()46   operator LPITEMIDLIST() { return m_Object;}
operator LPCITEMIDLIST() const47   operator LPCITEMIDLIST() const { return m_Object;}
operator &()48   LPITEMIDLIST* operator&() { return &m_Object; }
operator ->()49   LPITEMIDLIST operator->() { return m_Object; }
50 
51   // CItemIDList& operator=(LPCITEMIDLIST object);
52   // CItemIDList& operator=(const CItemIDList &object);
53 };
54 
55 /////////////////////////////
56 // CDrop
57 
58 /*
59 class CDrop
60 {
61   HDROP m_Object;
62   bool m_MustBeFinished;
63   bool m_Assigned;
64   void Free();
65 public:
66   CDrop(bool mustBeFinished) : m_MustBeFinished(mustBeFinished), m_Assigned(false) {}
67   ~CDrop() { Free(); }
68 
69   void Attach(HDROP object);
70   operator HDROP() { return m_Object;}
71   bool QueryPoint(LPPOINT point)
72     { return BOOLToBool(::DragQueryPoint(m_Object, point)); }
73   void Finish()
74   {
75     ::DragFinish(m_Object);
76   }
77   UINT QueryFile(UINT fileIndex, LPTSTR fileName, UINT bufSize)
78     { return ::DragQueryFile(m_Object, fileIndex, fileName, bufSize); }
79   #ifndef _UNICODE
80   UINT QueryFile(UINT fileIndex, LPWSTR fileName, UINT bufSize)
81     { return ::DragQueryFileW(m_Object, fileIndex, fileName, bufSize); }
82   #endif
83   UINT QueryCountOfFiles();
84   void QueryFileName(UINT fileIndex, UString &fileName);
85   void QueryFileNames(UStringVector &fileNames);
86 };
87 */
88 #endif
89 
90 struct CFileAttribs
91 {
92   int FirstDirIndex;
93   // DWORD Sum;
94   // DWORD Product;
95   // CRecordVector<DWORD> Vals;
96   // CRecordVector<bool> IsDirVector;
97 
CFileAttribsNWindows::NShell::CFileAttribs98   CFileAttribs()
99   {
100     Clear();
101   }
102 
ClearNWindows::NShell::CFileAttribs103   void Clear()
104   {
105     FirstDirIndex = -1;
106     // Sum = 0;
107     // Product = 0;
108     // IsDirVector.Clear();
109   }
110 };
111 
112 
113 /* read pathnames from HDROP or SHELLIDLIST.
114    The parser can return E_INVALIDARG, if there is some unexpected data in dataObject */
115 HRESULT DataObject_GetData_HDROP_or_IDLIST_Names(IDataObject *dataObject, UStringVector &names);
116 
117 HRESULT DataObject_GetData_FILE_ATTRS(IDataObject *dataObject, CFileAttribs &attribs);
118 
119 bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path);
120 bool BrowseForFolder(LPBROWSEINFO lpbi, CSysString &resultPath);
121 bool BrowseForFolder(HWND owner, LPCTSTR title, LPCTSTR initialFolder, CSysString &resultPath);
122 
123 #ifndef _UNICODE
124 bool GetPathFromIDList(LPCITEMIDLIST itemIDList, UString &path);
125 bool BrowseForFolder(LPBROWSEINFO lpbi, UString &resultPath);
126 bool BrowseForFolder(HWND owner, LPCWSTR title, LPCWSTR initialFolder, UString &resultPath);
127 #endif
128 }}
129 
130 #endif
131