Statistics
| Branch: | Revision:

root / trunk / Pithos.ShellExtensions / Menus / FileContextMenu.cs @ 5120f3cb

History | View | Annotate | Download (23.9 kB)

1 d78cbf09 Panagiotis Kanavos
using System;
2 d78cbf09 Panagiotis Kanavos
using System.Collections.Generic;
3 d78cbf09 Panagiotis Kanavos
using System.ComponentModel.Composition;
4 d78cbf09 Panagiotis Kanavos
using System.Diagnostics;
5 d78cbf09 Panagiotis Kanavos
using System.Diagnostics.Contracts;
6 5bcf6d70 Panagiotis Kanavos
using System.Drawing;
7 d78cbf09 Panagiotis Kanavos
using System.Linq;
8 d78cbf09 Panagiotis Kanavos
using System.Runtime.InteropServices;
9 d78cbf09 Panagiotis Kanavos
using System.Runtime.InteropServices.ComTypes;
10 d78cbf09 Panagiotis Kanavos
using System.Text;
11 5bcf6d70 Panagiotis Kanavos
using Pithos.ShellExtensions.Properties;
12 d78cbf09 Panagiotis Kanavos
13 d78cbf09 Panagiotis Kanavos
namespace Pithos.ShellExtensions.Menus
14 d78cbf09 Panagiotis Kanavos
{
15 d78cbf09 Panagiotis Kanavos
    [ClassInterface(ClassInterfaceType.None)]
16 d78cbf09 Panagiotis Kanavos
    [Guid("B1F1405D-94A1-4692-B72F-FC8CAF8B8700"), ComVisible(true)]
17 d78cbf09 Panagiotis Kanavos
    public class FileContextMenu : IShellExtInit, IContextMenu
18 d78cbf09 Panagiotis Kanavos
    {
19 d78cbf09 Panagiotis Kanavos
        private const string MenuHandlername = "CSShellExtContextMenuHandler.FileContextMenuExt";
20 d78cbf09 Panagiotis Kanavos
21 d78cbf09 Panagiotis Kanavos
22 d78cbf09 Panagiotis Kanavos
        private readonly Dictionary<string, MenuItem> _items;
23 d78cbf09 Panagiotis Kanavos
24 d78cbf09 Panagiotis Kanavos
25 5bcf6d70 Panagiotis Kanavos
        [Import]
26 5bcf6d70 Panagiotis Kanavos
        public FileContext Context { get; set; }
27 5bcf6d70 Panagiotis Kanavos
28 5bcf6d70 Panagiotis Kanavos
        private IntPtr _gotoBitmap=IntPtr.Zero;
29 5bcf6d70 Panagiotis Kanavos
        private IntPtr _versionBitmap = IntPtr.Zero;
30 7d915c34 Panagiotis Kanavos
        private IntPtr _propertiesBitmap = IntPtr.Zero;
31 d78cbf09 Panagiotis Kanavos
32 d78cbf09 Panagiotis Kanavos
        public FileContextMenu()
33 5bcf6d70 Panagiotis Kanavos
        {                        
34 4d301e8e Panagiotis Kanavos
            _gotoBitmap = GetBitmapPtr(Resources.MenuGoToPithos);
35 4d301e8e Panagiotis Kanavos
            _versionBitmap = GetBitmapPtr(Resources.MenuHistory);
36 7d915c34 Panagiotis Kanavos
            _propertiesBitmap = GetBitmapPtr(Resources.MenuProperties);
37 5bcf6d70 Panagiotis Kanavos
38 5bcf6d70 Panagiotis Kanavos
39 5bcf6d70 Panagiotis Kanavos
            
40 5bcf6d70 Panagiotis Kanavos
41 d78cbf09 Panagiotis Kanavos
            _items = new Dictionary<string, MenuItem>{
42 d78cbf09 Panagiotis Kanavos
                {"gotoPithos",new MenuItem{
43 d78cbf09 Panagiotis Kanavos
                                           MenuText = "&Go to Pithos",
44 d78cbf09 Panagiotis Kanavos
                                            Verb = "gotoPithos",
45 d78cbf09 Panagiotis Kanavos
                                             VerbCanonicalName = "PITHOSGoTo",
46 d78cbf09 Panagiotis Kanavos
                                              VerbHelpText = "Go to Pithos",
47 4d301e8e Panagiotis Kanavos
                                               MenuDisplayId = 1,
48 5bcf6d70 Panagiotis Kanavos
                                               MenuCommand=OnGotoPithos,
49 5bcf6d70 Panagiotis Kanavos
                                               DisplayFlags=DisplayFlags.All,
50 5bcf6d70 Panagiotis Kanavos
                                               MenuBitmap = _gotoBitmap
51 d78cbf09 Panagiotis Kanavos
                                           }},
52 7d915c34 Panagiotis Kanavos
                /*{"showProperties",new MenuItem{
53 7d915c34 Panagiotis Kanavos
                                           MenuText = "&Pithos File Properties",
54 7d915c34 Panagiotis Kanavos
                                            Verb = "showProperties",
55 7d915c34 Panagiotis Kanavos
                                             VerbCanonicalName = "PITHOSProperties",
56 7d915c34 Panagiotis Kanavos
                                              VerbHelpText = "Pithos File Properties",
57 7d915c34 Panagiotis Kanavos
                                               MenuDisplayId = 2,
58 7d915c34 Panagiotis Kanavos
                                               MenuCommand=OnShowProperties,
59 7d915c34 Panagiotis Kanavos
                                               DisplayFlags=DisplayFlags.File,
60 7d915c34 Panagiotis Kanavos
                                               MenuBitmap = _propertiesBitmap
61 7d915c34 Panagiotis Kanavos
                                           }},*/
62 d78cbf09 Panagiotis Kanavos
                {"prevVersions",new MenuItem{
63 d78cbf09 Panagiotis Kanavos
                                           MenuText = "&Show Previous Versions",
64 d78cbf09 Panagiotis Kanavos
                                            Verb = "prevVersions",
65 d78cbf09 Panagiotis Kanavos
                                             VerbCanonicalName = "PITHOSPrevVersions",
66 d78cbf09 Panagiotis Kanavos
                                              VerbHelpText = "Go to Pithos and display previous versions",
67 7d915c34 Panagiotis Kanavos
                                               MenuDisplayId = 3,
68 d78cbf09 Panagiotis Kanavos
                                               MenuCommand=OnVerbDisplayFileName,
69 5bcf6d70 Panagiotis Kanavos
                                               DisplayFlags=DisplayFlags.File,
70 5bcf6d70 Panagiotis Kanavos
                                               MenuBitmap=_versionBitmap
71 d78cbf09 Panagiotis Kanavos
                                           }}
72 d78cbf09 Panagiotis Kanavos
            };
73 d78cbf09 Panagiotis Kanavos
74 5bcf6d70 Panagiotis Kanavos
            IoC.Current.Compose(this);
75 5bcf6d70 Panagiotis Kanavos
76 5bcf6d70 Panagiotis Kanavos
77 5bcf6d70 Panagiotis Kanavos
        }
78 5bcf6d70 Panagiotis Kanavos
79 5bcf6d70 Panagiotis Kanavos
80 5bcf6d70 Panagiotis Kanavos
        ~FileContextMenu()
81 5bcf6d70 Panagiotis Kanavos
        {
82 5bcf6d70 Panagiotis Kanavos
            if (_gotoBitmap != IntPtr.Zero)
83 5bcf6d70 Panagiotis Kanavos
            {
84 5bcf6d70 Panagiotis Kanavos
                NativeMethods.DeleteObject(_gotoBitmap);
85 5bcf6d70 Panagiotis Kanavos
                _gotoBitmap= IntPtr.Zero;
86 5bcf6d70 Panagiotis Kanavos
            }
87 5bcf6d70 Panagiotis Kanavos
            if (_versionBitmap != IntPtr.Zero)
88 5bcf6d70 Panagiotis Kanavos
            {
89 5bcf6d70 Panagiotis Kanavos
                NativeMethods.DeleteObject(_versionBitmap);
90 5bcf6d70 Panagiotis Kanavos
                _versionBitmap = IntPtr.Zero;
91 5bcf6d70 Panagiotis Kanavos
            }
92 7d915c34 Panagiotis Kanavos
            if (_propertiesBitmap != IntPtr.Zero)
93 7d915c34 Panagiotis Kanavos
            {
94 7d915c34 Panagiotis Kanavos
                NativeMethods.DeleteObject(_propertiesBitmap);
95 7d915c34 Panagiotis Kanavos
                _propertiesBitmap = IntPtr.Zero;
96 7d915c34 Panagiotis Kanavos
            }
97 5bcf6d70 Panagiotis Kanavos
98 5bcf6d70 Panagiotis Kanavos
        }
99 5bcf6d70 Panagiotis Kanavos
        private static IntPtr GetBitmapPtr(Bitmap gotoBitmap)
100 5bcf6d70 Panagiotis Kanavos
        {
101 5bcf6d70 Panagiotis Kanavos
            gotoBitmap.MakeTransparent(gotoBitmap.GetPixel(0, 0));
102 5bcf6d70 Panagiotis Kanavos
            var hbitmap = gotoBitmap.GetHbitmap();
103 5bcf6d70 Panagiotis Kanavos
            return hbitmap;
104 d78cbf09 Panagiotis Kanavos
        }
105 d78cbf09 Panagiotis Kanavos
106 7d915c34 Panagiotis Kanavos
        void OnShowProperties(IntPtr hWnd)
107 7d915c34 Panagiotis Kanavos
        {
108 7d915c34 Panagiotis Kanavos
            
109 7d915c34 Panagiotis Kanavos
        }
110 d78cbf09 Panagiotis Kanavos
111 d78cbf09 Panagiotis Kanavos
        void OnVerbDisplayFileName(IntPtr hWnd)
112 d78cbf09 Panagiotis Kanavos
        {
113 d78cbf09 Panagiotis Kanavos
            string message = String.Format("The selected file is {0}\r\n\r\nThe selected Path is {1}",
114 d78cbf09 Panagiotis Kanavos
                                           Context.CurrentFile,
115 d78cbf09 Panagiotis Kanavos
                                           Context.CurrentFolder);
116 d78cbf09 Panagiotis Kanavos
117 d78cbf09 Panagiotis Kanavos
            System.Windows.Forms.MessageBox.Show(
118 d78cbf09 Panagiotis Kanavos
                message,
119 d78cbf09 Panagiotis Kanavos
                "CSShellExtContextMenuHandler");
120 d78cbf09 Panagiotis Kanavos
            NativeMethods.SHChangeNotify(HChangeNotifyEventID.SHCNE_ASSOCCHANGED, HChangeNotifyFlags.SHCNF_IDLIST,
121 d78cbf09 Panagiotis Kanavos
                                             IntPtr.Zero, IntPtr.Zero);
122 d78cbf09 Panagiotis Kanavos
        }
123 5bcf6d70 Panagiotis Kanavos
124 5bcf6d70 Panagiotis Kanavos
        void OnGotoPithos(IntPtr hWnd)
125 5bcf6d70 Panagiotis Kanavos
        {
126 7d915c34 Panagiotis Kanavos
            var settings = Context.Settings;
127 7d915c34 Panagiotis Kanavos
            var activeAccount = settings.Accounts.FirstOrDefault(acc => acc.IsActive);
128 7d915c34 Panagiotis Kanavos
            var address = String.Format("{0}/ui/?token={1}&user={2}",
129 7d915c34 Panagiotis Kanavos
                                        settings.PithosSite,
130 7d915c34 Panagiotis Kanavos
                                        activeAccount.ApiKey,
131 7d915c34 Panagiotis Kanavos
                                        Uri.EscapeUriString(activeAccount.AccountName));
132 7d915c34 Panagiotis Kanavos
133 7d915c34 Panagiotis Kanavos
            settings.Reload();
134 7d915c34 Panagiotis Kanavos
            Process.Start(address);
135 5bcf6d70 Panagiotis Kanavos
        }
136 d78cbf09 Panagiotis Kanavos
        
137 d78cbf09 Panagiotis Kanavos
138 d78cbf09 Panagiotis Kanavos
        #region Shell Extension Registration
139 d78cbf09 Panagiotis Kanavos
140 d78cbf09 Panagiotis Kanavos
        [ComRegisterFunction]
141 d78cbf09 Panagiotis Kanavos
        public static void Register(Type t)
142 d78cbf09 Panagiotis Kanavos
        {
143 d78cbf09 Panagiotis Kanavos
            try
144 d78cbf09 Panagiotis Kanavos
            {
145 d78cbf09 Panagiotis Kanavos
                ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, ".cs",
146 d78cbf09 Panagiotis Kanavos
                    MenuHandlername);
147 d78cbf09 Panagiotis Kanavos
                ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, "Directory",
148 d78cbf09 Panagiotis Kanavos
                    MenuHandlername);
149 d78cbf09 Panagiotis Kanavos
                ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, @"Directory\Background",
150 d78cbf09 Panagiotis Kanavos
                    MenuHandlername);
151 d78cbf09 Panagiotis Kanavos
                ShellExtReg.RegisterShellExtContextMenuHandler(t.GUID, "*",
152 d78cbf09 Panagiotis Kanavos
                    MenuHandlername);
153 d78cbf09 Panagiotis Kanavos
154 d78cbf09 Panagiotis Kanavos
                //ShellExtReg.MarkApproved(t.GUID, MenuHandlername);
155 d78cbf09 Panagiotis Kanavos
            }
156 d78cbf09 Panagiotis Kanavos
            catch (Exception ex)
157 d78cbf09 Panagiotis Kanavos
            {
158 d78cbf09 Panagiotis Kanavos
                Console.WriteLine(ex.Message); // Log the error
159 d78cbf09 Panagiotis Kanavos
                throw;  // Re-throw the exception
160 d78cbf09 Panagiotis Kanavos
            }
161 d78cbf09 Panagiotis Kanavos
        }
162 d78cbf09 Panagiotis Kanavos
163 d78cbf09 Panagiotis Kanavos
        [ComUnregisterFunction]
164 d78cbf09 Panagiotis Kanavos
        public static void Unregister(Type t)
165 d78cbf09 Panagiotis Kanavos
        {
166 d78cbf09 Panagiotis Kanavos
            try
167 d78cbf09 Panagiotis Kanavos
            {
168 d78cbf09 Panagiotis Kanavos
                ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, ".cs", MenuHandlername);
169 d78cbf09 Panagiotis Kanavos
                ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, "Directory", MenuHandlername);
170 d78cbf09 Panagiotis Kanavos
                ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, @"Directory\Background", MenuHandlername);
171 d78cbf09 Panagiotis Kanavos
                ShellExtReg.UnregisterShellExtContextMenuHandler(t.GUID, "*", MenuHandlername);
172 d78cbf09 Panagiotis Kanavos
173 d78cbf09 Panagiotis Kanavos
                //ShellExtReg.RemoveApproved(t.GUID, MenuHandlername);
174 d78cbf09 Panagiotis Kanavos
            }
175 d78cbf09 Panagiotis Kanavos
            catch (Exception ex)
176 d78cbf09 Panagiotis Kanavos
            {
177 d78cbf09 Panagiotis Kanavos
                Console.WriteLine(ex.Message); // Log the error
178 d78cbf09 Panagiotis Kanavos
                throw;  // Re-throw the exception
179 d78cbf09 Panagiotis Kanavos
            }
180 d78cbf09 Panagiotis Kanavos
        }
181 d78cbf09 Panagiotis Kanavos
182 d78cbf09 Panagiotis Kanavos
        #endregion
183 d78cbf09 Panagiotis Kanavos
184 d78cbf09 Panagiotis Kanavos
185 d78cbf09 Panagiotis Kanavos
        #region IShellExtInit Members
186 d78cbf09 Panagiotis Kanavos
187 d78cbf09 Panagiotis Kanavos
        /// <summary>
188 d78cbf09 Panagiotis Kanavos
        /// Initialize the context menu handler.
189 d78cbf09 Panagiotis Kanavos
        /// </summary>
190 d78cbf09 Panagiotis Kanavos
        /// <param name="pidlFolder">
191 d78cbf09 Panagiotis Kanavos
        /// A pointer to an ITEMIDLIST structure that uniquely identifies a folder.
192 d78cbf09 Panagiotis Kanavos
        /// </param>
193 d78cbf09 Panagiotis Kanavos
        /// <param name="pDataObj">
194 d78cbf09 Panagiotis Kanavos
        /// A pointer to an IDataObject interface object that can be used to retrieve 
195 d78cbf09 Panagiotis Kanavos
        /// the objects being acted upon.
196 d78cbf09 Panagiotis Kanavos
        /// </param>
197 d78cbf09 Panagiotis Kanavos
        /// <param name="hKeyProgID">
198 d78cbf09 Panagiotis Kanavos
        /// The registry key for the file object or folder type.
199 d78cbf09 Panagiotis Kanavos
        /// </param>
200 d78cbf09 Panagiotis Kanavos
        public void Initialize(IntPtr pidlFolder, IntPtr pDataObj, IntPtr hKeyProgID)
201 d78cbf09 Panagiotis Kanavos
        {
202 d78cbf09 Panagiotis Kanavos
            
203 d78cbf09 Panagiotis Kanavos
            if(pDataObj == IntPtr.Zero && pidlFolder == IntPtr.Zero)
204 d78cbf09 Panagiotis Kanavos
            {
205 d78cbf09 Panagiotis Kanavos
                throw new ArgumentException("pidlFolder and pDataObj shouldn't be null at the same time");
206 d78cbf09 Panagiotis Kanavos
            }
207 d78cbf09 Panagiotis Kanavos
208 d78cbf09 Panagiotis Kanavos
209 0eea575a Panagiotis Kanavos
            Debug.WriteLine("Initializing", LogCategories.ShellMenu);
210 d78cbf09 Panagiotis Kanavos
211 d78cbf09 Panagiotis Kanavos
            if (pDataObj != IntPtr.Zero)
212 d78cbf09 Panagiotis Kanavos
            {
213 0eea575a Panagiotis Kanavos
                Debug.WriteLine("Got a data object", LogCategories.ShellMenu);
214 d78cbf09 Panagiotis Kanavos
215 d78cbf09 Panagiotis Kanavos
                FORMATETC fe = new FORMATETC();
216 d78cbf09 Panagiotis Kanavos
                fe.cfFormat = (short)CLIPFORMAT.CF_HDROP;
217 d78cbf09 Panagiotis Kanavos
                fe.ptd = IntPtr.Zero;
218 d78cbf09 Panagiotis Kanavos
                fe.dwAspect = DVASPECT.DVASPECT_CONTENT;
219 d78cbf09 Panagiotis Kanavos
                fe.lindex = -1;
220 d78cbf09 Panagiotis Kanavos
                fe.tymed = TYMED.TYMED_HGLOBAL;
221 d78cbf09 Panagiotis Kanavos
                STGMEDIUM stm = new STGMEDIUM();
222 d78cbf09 Panagiotis Kanavos
223 d78cbf09 Panagiotis Kanavos
                // The pDataObj pointer contains the objects being acted upon. In this 
224 d78cbf09 Panagiotis Kanavos
                // example, we get an HDROP handle for enumerating the selected files 
225 d78cbf09 Panagiotis Kanavos
                // and folders.
226 d78cbf09 Panagiotis Kanavos
                IDataObject dataObject = (IDataObject)Marshal.GetObjectForIUnknown(pDataObj);
227 d78cbf09 Panagiotis Kanavos
                dataObject.GetData(ref fe, out stm);
228 d78cbf09 Panagiotis Kanavos
229 d78cbf09 Panagiotis Kanavos
                try
230 d78cbf09 Panagiotis Kanavos
                {
231 d78cbf09 Panagiotis Kanavos
                    // Get an HDROP handle.
232 d78cbf09 Panagiotis Kanavos
                    IntPtr hDrop = stm.unionmember;
233 d78cbf09 Panagiotis Kanavos
                    if (hDrop == IntPtr.Zero)
234 d78cbf09 Panagiotis Kanavos
                    {
235 d78cbf09 Panagiotis Kanavos
                        throw new ArgumentException();
236 d78cbf09 Panagiotis Kanavos
                    }
237 d78cbf09 Panagiotis Kanavos
238 d78cbf09 Panagiotis Kanavos
                    // Determine how many files are involved in this operation.
239 d78cbf09 Panagiotis Kanavos
                    uint nFiles = NativeMethods.DragQueryFile(hDrop, UInt32.MaxValue, null, 0);
240 d78cbf09 Panagiotis Kanavos
241 0eea575a Panagiotis Kanavos
                    Debug.WriteLine(String.Format("Got {0} files", nFiles), LogCategories.ShellMenu);
242 d78cbf09 Panagiotis Kanavos
                    // This code sample displays the custom context menu item when only 
243 d78cbf09 Panagiotis Kanavos
                    // one file is selected. 
244 d78cbf09 Panagiotis Kanavos
                    if (nFiles == 1)
245 d78cbf09 Panagiotis Kanavos
                    {
246 d78cbf09 Panagiotis Kanavos
                        // Get the path of the file.
247 d78cbf09 Panagiotis Kanavos
                        var fileName = new StringBuilder(260);
248 d78cbf09 Panagiotis Kanavos
                        if (0 == NativeMethods.DragQueryFile(hDrop, 0, fileName,
249 d78cbf09 Panagiotis Kanavos
                                                             fileName.Capacity))
250 d78cbf09 Panagiotis Kanavos
                        {
251 d78cbf09 Panagiotis Kanavos
                            Marshal.ThrowExceptionForHR(WinError.E_FAIL);
252 d78cbf09 Panagiotis Kanavos
                        }
253 d78cbf09 Panagiotis Kanavos
                        Context.CurrentFile = fileName.ToString();
254 d78cbf09 Panagiotis Kanavos
                    }
255 d78cbf09 Panagiotis Kanavos
                    /* else
256 d78cbf09 Panagiotis Kanavos
                     {
257 d78cbf09 Panagiotis Kanavos
                         Marshal.ThrowExceptionForHR(WinError.E_FAIL);
258 d78cbf09 Panagiotis Kanavos
                     }*/
259 d78cbf09 Panagiotis Kanavos
260 d78cbf09 Panagiotis Kanavos
                    // [-or-]
261 d78cbf09 Panagiotis Kanavos
262 d78cbf09 Panagiotis Kanavos
                    // Enumerate the selected files and folders.
263 d78cbf09 Panagiotis Kanavos
                    //if (nFiles > 0)
264 d78cbf09 Panagiotis Kanavos
                    //{
265 d78cbf09 Panagiotis Kanavos
                    //    StringCollection selectedFiles = new StringCollection();
266 d78cbf09 Panagiotis Kanavos
                    //    StringBuilder fileName = new StringBuilder(260);
267 d78cbf09 Panagiotis Kanavos
                    //    for (uint i = 0; i < nFiles; i++)
268 d78cbf09 Panagiotis Kanavos
                    //    {
269 d78cbf09 Panagiotis Kanavos
                    //        // Get the next file name.
270 d78cbf09 Panagiotis Kanavos
                    //        if (0 != NativeMethods.DragQueryFile(hDrop, i, fileName,
271 d78cbf09 Panagiotis Kanavos
                    //            fileName.Capacity))
272 d78cbf09 Panagiotis Kanavos
                    //        {
273 d78cbf09 Panagiotis Kanavos
                    //            // Add the file name to the list.
274 d78cbf09 Panagiotis Kanavos
                    //            selectedFiles.Add(fileName.ToString());
275 d78cbf09 Panagiotis Kanavos
                    //        }
276 d78cbf09 Panagiotis Kanavos
                    //    }
277 d78cbf09 Panagiotis Kanavos
                    //
278 d78cbf09 Panagiotis Kanavos
                    //    // If we did not find any files we can work with, throw 
279 d78cbf09 Panagiotis Kanavos
                    //    // exception.
280 d78cbf09 Panagiotis Kanavos
                    //    if (selectedFiles.Count == 0)
281 d78cbf09 Panagiotis Kanavos
                    //    {
282 d78cbf09 Panagiotis Kanavos
                    //        Marshal.ThrowExceptionForHR(WinError.E_FAIL);
283 d78cbf09 Panagiotis Kanavos
                    //    }
284 d78cbf09 Panagiotis Kanavos
                    //}
285 d78cbf09 Panagiotis Kanavos
                    //else
286 d78cbf09 Panagiotis Kanavos
                    //{
287 d78cbf09 Panagiotis Kanavos
                    //    Marshal.ThrowExceptionForHR(WinError.E_FAIL);
288 d78cbf09 Panagiotis Kanavos
                    //}
289 d78cbf09 Panagiotis Kanavos
                }
290 d78cbf09 Panagiotis Kanavos
                finally
291 d78cbf09 Panagiotis Kanavos
                {
292 d78cbf09 Panagiotis Kanavos
                    NativeMethods.ReleaseStgMedium(ref stm);
293 d78cbf09 Panagiotis Kanavos
                }
294 d78cbf09 Panagiotis Kanavos
            }
295 d78cbf09 Panagiotis Kanavos
296 d78cbf09 Panagiotis Kanavos
            if (pidlFolder != IntPtr.Zero)
297 d78cbf09 Panagiotis Kanavos
            {
298 0eea575a Panagiotis Kanavos
                Debug.WriteLine("Got a folder", LogCategories.ShellMenu);
299 d78cbf09 Panagiotis Kanavos
                StringBuilder path = new StringBuilder();
300 d78cbf09 Panagiotis Kanavos
                if (!NativeMethods.SHGetPathFromIDList(pidlFolder, path))
301 d78cbf09 Panagiotis Kanavos
                {
302 d78cbf09 Panagiotis Kanavos
                    int error = Marshal.GetHRForLastWin32Error();
303 d78cbf09 Panagiotis Kanavos
                    Marshal.ThrowExceptionForHR(error);
304 d78cbf09 Panagiotis Kanavos
                }
305 d78cbf09 Panagiotis Kanavos
                Context.CurrentFolder = path.ToString();
306 0eea575a Panagiotis Kanavos
                Debug.WriteLine(String.Format("Folder is {0}", Context.CurrentFolder), LogCategories.ShellMenu);
307 d78cbf09 Panagiotis Kanavos
            }
308 d78cbf09 Panagiotis Kanavos
        }
309 d78cbf09 Panagiotis Kanavos
310 d78cbf09 Panagiotis Kanavos
        #endregion
311 d78cbf09 Panagiotis Kanavos
312 d78cbf09 Panagiotis Kanavos
313 d78cbf09 Panagiotis Kanavos
        #region IContextMenu Members
314 d78cbf09 Panagiotis Kanavos
315 d78cbf09 Panagiotis Kanavos
        /// <summary>
316 d78cbf09 Panagiotis Kanavos
        /// Add commands to a shortcut menu.
317 d78cbf09 Panagiotis Kanavos
        /// </summary>
318 d78cbf09 Panagiotis Kanavos
        /// <param name="hMenu">A handle to the shortcut menu.</param>
319 d78cbf09 Panagiotis Kanavos
        /// <param name="iMenu">
320 d78cbf09 Panagiotis Kanavos
        /// The zero-based position at which to insert the first new menu item.
321 d78cbf09 Panagiotis Kanavos
        /// </param>
322 d78cbf09 Panagiotis Kanavos
        /// <param name="idCmdFirst">
323 d78cbf09 Panagiotis Kanavos
        /// The minimum value that the handler can specify for a menu item ID.
324 d78cbf09 Panagiotis Kanavos
        /// </param>
325 d78cbf09 Panagiotis Kanavos
        /// <param name="idCmdLast">
326 d78cbf09 Panagiotis Kanavos
        /// The maximum value that the handler can specify for a menu item ID.
327 d78cbf09 Panagiotis Kanavos
        /// </param>
328 d78cbf09 Panagiotis Kanavos
        /// <param name="uFlags">
329 d78cbf09 Panagiotis Kanavos
        /// Optional flags that specify how the shortcut menu can be changed.
330 d78cbf09 Panagiotis Kanavos
        /// </param>
331 d78cbf09 Panagiotis Kanavos
        /// <returns>
332 d78cbf09 Panagiotis Kanavos
        /// If successful, returns an HRESULT value that has its severity value set 
333 d78cbf09 Panagiotis Kanavos
        /// to SEVERITY_SUCCESS and its code value set to the offset of the largest 
334 d78cbf09 Panagiotis Kanavos
        /// command identifier that was assigned, plus one.
335 d78cbf09 Panagiotis Kanavos
        /// </returns>
336 d78cbf09 Panagiotis Kanavos
        public int QueryContextMenu(
337 d78cbf09 Panagiotis Kanavos
            IntPtr hMenu,
338 d78cbf09 Panagiotis Kanavos
            uint iMenu,
339 d78cbf09 Panagiotis Kanavos
            uint idCmdFirst,
340 d78cbf09 Panagiotis Kanavos
            uint idCmdLast,
341 d78cbf09 Panagiotis Kanavos
            uint uFlags)
342 d78cbf09 Panagiotis Kanavos
        {
343 0eea575a Panagiotis Kanavos
            Debug.WriteLine("Start qcm", LogCategories.ShellMenu);
344 d78cbf09 Panagiotis Kanavos
            // If uFlags include CMF_DEFAULTONLY then we should not do anything.
345 0eea575a Panagiotis Kanavos
            Debug.WriteLine(String.Format("Flags {0}", uFlags), LogCategories.ShellMenu);
346 d78cbf09 Panagiotis Kanavos
347 d78cbf09 Panagiotis Kanavos
            if (((uint)CMF.CMF_DEFAULTONLY & uFlags) != 0)
348 d78cbf09 Panagiotis Kanavos
            {
349 0eea575a Panagiotis Kanavos
                Debug.WriteLine("Default only flag, returning", LogCategories.ShellMenu);
350 d78cbf09 Panagiotis Kanavos
                return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0);
351 d78cbf09 Panagiotis Kanavos
            }
352 d78cbf09 Panagiotis Kanavos
353 d78cbf09 Panagiotis Kanavos
            if (!Context.IsManaged)
354 d78cbf09 Panagiotis Kanavos
            {
355 0eea575a Panagiotis Kanavos
                Debug.WriteLine("Not a PITHOS folder",LogCategories.ShellMenu);
356 d78cbf09 Panagiotis Kanavos
                return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0);
357 d78cbf09 Panagiotis Kanavos
            }
358 d78cbf09 Panagiotis Kanavos
359 d78cbf09 Panagiotis Kanavos
            /*
360 d78cbf09 Panagiotis Kanavos
                        if (!selectedFolder.ToLower().Contains("pithos"))
361 d78cbf09 Panagiotis Kanavos
                            return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0, 0);
362 d78cbf09 Panagiotis Kanavos
            */
363 d78cbf09 Panagiotis Kanavos
364 d78cbf09 Panagiotis Kanavos
            // Use either InsertMenu or InsertMenuItem to add menu items.
365 d78cbf09 Panagiotis Kanavos
366 d78cbf09 Panagiotis Kanavos
            uint largestID = 0;
367 d78cbf09 Panagiotis Kanavos
368 d78cbf09 Panagiotis Kanavos
            DisplayFlags itemType = (Context.IsFolder) ? DisplayFlags.Folder : DisplayFlags.File;
369 d78cbf09 Panagiotis Kanavos
370 0eea575a Panagiotis Kanavos
            Debug.WriteLine(String.Format("Item Flags {0}", itemType), LogCategories.ShellMenu);
371 d78cbf09 Panagiotis Kanavos
372 4d301e8e Panagiotis Kanavos
            if (!NativeMethods.InsertMenu(hMenu, idCmdFirst, MF.MF_SEPARATOR | MF.MF_BYPOSITION, 0, String.Empty))
373 4d301e8e Panagiotis Kanavos
            {
374 5120f3cb Panagiotis Kanavos
                Log.ErrorFormat("Error adding separator 1\r\n{0}", Marshal.GetLastWin32Error());
375 4d301e8e Panagiotis Kanavos
                return Marshal.GetHRForLastWin32Error();
376 4d301e8e Panagiotis Kanavos
            }
377 4d301e8e Panagiotis Kanavos
378 d78cbf09 Panagiotis Kanavos
            foreach (var menuItem in _items.Values)
379 d78cbf09 Panagiotis Kanavos
            {
380 0eea575a Panagiotis Kanavos
                Debug.WriteLine(String.Format("Menu Flags {0}", menuItem.DisplayFlags), LogCategories.ShellMenu);
381 d78cbf09 Panagiotis Kanavos
                if ((itemType & menuItem.DisplayFlags) != DisplayFlags.None)
382 d78cbf09 Panagiotis Kanavos
                {
383 0eea575a Panagiotis Kanavos
                    Debug.WriteLine("Adding Menu", LogCategories.ShellMenu);
384 d78cbf09 Panagiotis Kanavos
385 d78cbf09 Panagiotis Kanavos
                    MENUITEMINFO mii = menuItem.CreateInfo(idCmdFirst);
386 d78cbf09 Panagiotis Kanavos
                    if (!NativeMethods.InsertMenuItem(hMenu, iMenu, true, ref mii))
387 d78cbf09 Panagiotis Kanavos
                    {
388 5bcf6d70 Panagiotis Kanavos
                        var lastError = Marshal.GetLastWin32Error();
389 5bcf6d70 Panagiotis Kanavos
                        var lastErrorHR = Marshal.GetHRForLastWin32Error();
390 5bcf6d70 Panagiotis Kanavos
                        return lastErrorHR;
391 d78cbf09 Panagiotis Kanavos
                    }
392 d78cbf09 Panagiotis Kanavos
                    if (largestID < menuItem.MenuDisplayId)
393 d78cbf09 Panagiotis Kanavos
                        largestID = menuItem.MenuDisplayId;
394 d78cbf09 Panagiotis Kanavos
                }
395 d78cbf09 Panagiotis Kanavos
            }
396 d78cbf09 Panagiotis Kanavos
397 0eea575a Panagiotis Kanavos
            Debug.Write("Adding Separator 1", LogCategories.ShellMenu);
398 d78cbf09 Panagiotis Kanavos
            // Add a separator.
399 4d301e8e Panagiotis Kanavos
           /* MENUITEMINFO sep = new MENUITEMINFO();
400 d78cbf09 Panagiotis Kanavos
            sep.cbSize = (uint)Marshal.SizeOf(sep);
401 d78cbf09 Panagiotis Kanavos
            sep.fMask = MIIM.MIIM_TYPE;
402 4d301e8e Panagiotis Kanavos
            sep.fType = MFT.MFT_SEPARATOR;*/
403 4d301e8e Panagiotis Kanavos
            if (!NativeMethods.InsertMenu(hMenu, (uint)_items.Values.Count + idCmdFirst+1,MF.MF_SEPARATOR|MF.MF_BYPOSITION, 0, String.Empty))
404 d78cbf09 Panagiotis Kanavos
            {
405 5120f3cb Panagiotis Kanavos
                Log.ErrorFormat("Error adding separator 1\r\n{0}", Marshal.GetLastWin32Error());
406 d78cbf09 Panagiotis Kanavos
                return Marshal.GetHRForLastWin32Error();
407 d78cbf09 Panagiotis Kanavos
            }
408 d78cbf09 Panagiotis Kanavos
409 d78cbf09 Panagiotis Kanavos
410 d78cbf09 Panagiotis Kanavos
411 d78cbf09 Panagiotis Kanavos
412 0eea575a Panagiotis Kanavos
            Debug.WriteLine("Menus added", LogCategories.ShellOverlays);
413 d78cbf09 Panagiotis Kanavos
            // Return an HRESULT value with the severity set to SEVERITY_SUCCESS. 
414 d78cbf09 Panagiotis Kanavos
            // Set the code value to the offset of the largest command identifier 
415 d78cbf09 Panagiotis Kanavos
            // that was assigned, plus one (1).
416 d78cbf09 Panagiotis Kanavos
            return WinError.MAKE_HRESULT(WinError.SEVERITY_SUCCESS, 0,
417 d78cbf09 Panagiotis Kanavos
                largestID + 1);
418 d78cbf09 Panagiotis Kanavos
        }
419 d78cbf09 Panagiotis Kanavos
420 d78cbf09 Panagiotis Kanavos
        /// <summary>
421 d78cbf09 Panagiotis Kanavos
        /// Carry out the command associated with a shortcut menu item.
422 d78cbf09 Panagiotis Kanavos
        /// </summary>
423 d78cbf09 Panagiotis Kanavos
        /// <param name="pici">
424 d78cbf09 Panagiotis Kanavos
        /// A pointer to a CMINVOKECOMMANDINFO or CMINVOKECOMMANDINFOEX structure 
425 d78cbf09 Panagiotis Kanavos
        /// containing information about the command. 
426 d78cbf09 Panagiotis Kanavos
        /// </param>
427 d78cbf09 Panagiotis Kanavos
        public void InvokeCommand(IntPtr pici)
428 d78cbf09 Panagiotis Kanavos
        {
429 d78cbf09 Panagiotis Kanavos
            bool isUnicode = false;
430 d78cbf09 Panagiotis Kanavos
431 d78cbf09 Panagiotis Kanavos
            // Determine which structure is being passed in, CMINVOKECOMMANDINFO or 
432 d78cbf09 Panagiotis Kanavos
            // CMINVOKECOMMANDINFOEX based on the cbSize member of lpcmi. Although 
433 d78cbf09 Panagiotis Kanavos
            // the lpcmi parameter is declared in Shlobj.h as a CMINVOKECOMMANDINFO 
434 d78cbf09 Panagiotis Kanavos
            // structure, in practice it often points to a CMINVOKECOMMANDINFOEX 
435 d78cbf09 Panagiotis Kanavos
            // structure. This struct is an extended version of CMINVOKECOMMANDINFO 
436 d78cbf09 Panagiotis Kanavos
            // and has additional members that allow Unicode strings to be passed.
437 d78cbf09 Panagiotis Kanavos
            CMINVOKECOMMANDINFO ici = (CMINVOKECOMMANDINFO)Marshal.PtrToStructure(
438 d78cbf09 Panagiotis Kanavos
                pici, typeof(CMINVOKECOMMANDINFO));
439 d78cbf09 Panagiotis Kanavos
            CMINVOKECOMMANDINFOEX iciex = new CMINVOKECOMMANDINFOEX();
440 d78cbf09 Panagiotis Kanavos
            if (ici.cbSize == Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX)))
441 d78cbf09 Panagiotis Kanavos
            {
442 d78cbf09 Panagiotis Kanavos
                if ((ici.fMask & CMIC.CMIC_MASK_UNICODE) != 0)
443 d78cbf09 Panagiotis Kanavos
                {
444 d78cbf09 Panagiotis Kanavos
                    isUnicode = true;
445 d78cbf09 Panagiotis Kanavos
                    iciex = (CMINVOKECOMMANDINFOEX)Marshal.PtrToStructure(pici,
446 d78cbf09 Panagiotis Kanavos
                        typeof(CMINVOKECOMMANDINFOEX));
447 d78cbf09 Panagiotis Kanavos
                }
448 d78cbf09 Panagiotis Kanavos
            }
449 d78cbf09 Panagiotis Kanavos
450 d78cbf09 Panagiotis Kanavos
            // Determines whether the command is identified by its offset or verb.
451 d78cbf09 Panagiotis Kanavos
            // There are two ways to identify commands:
452 d78cbf09 Panagiotis Kanavos
            // 
453 d78cbf09 Panagiotis Kanavos
            //   1) The command's verb string 
454 d78cbf09 Panagiotis Kanavos
            //   2) The command's identifier offset
455 d78cbf09 Panagiotis Kanavos
            // 
456 d78cbf09 Panagiotis Kanavos
            // If the high-order word of lpcmi->lpVerb (for the ANSI case) or 
457 d78cbf09 Panagiotis Kanavos
            // lpcmi->lpVerbW (for the Unicode case) is nonzero, lpVerb or lpVerbW 
458 d78cbf09 Panagiotis Kanavos
            // holds a verb string. If the high-order word is zero, the command 
459 d78cbf09 Panagiotis Kanavos
            // offset is in the low-order word of lpcmi->lpVerb.
460 d78cbf09 Panagiotis Kanavos
461 d78cbf09 Panagiotis Kanavos
            // For the ANSI case, if the high-order word is not zero, the command's 
462 d78cbf09 Panagiotis Kanavos
            // verb string is in lpcmi->lpVerb. 
463 d78cbf09 Panagiotis Kanavos
            if (!isUnicode && NativeMethods.HighWord(ici.verb.ToInt32()) != 0)
464 d78cbf09 Panagiotis Kanavos
            {
465 d78cbf09 Panagiotis Kanavos
                // Is the verb supported by this context menu extension?
466 d78cbf09 Panagiotis Kanavos
                string verbAnsi = Marshal.PtrToStringAnsi(ici.verb);
467 d78cbf09 Panagiotis Kanavos
                if (_items.ContainsKey(verbAnsi))
468 d78cbf09 Panagiotis Kanavos
                {
469 d78cbf09 Panagiotis Kanavos
                    _items[verbAnsi].MenuCommand(ici.hwnd);
470 d78cbf09 Panagiotis Kanavos
                }
471 d78cbf09 Panagiotis Kanavos
                else
472 d78cbf09 Panagiotis Kanavos
                {
473 d78cbf09 Panagiotis Kanavos
                    // If the verb is not recognized by the context menu handler, it 
474 d78cbf09 Panagiotis Kanavos
                    // must return E_FAIL to allow it to be passed on to the other 
475 d78cbf09 Panagiotis Kanavos
                    // context menu handlers that might implement that verb.
476 d78cbf09 Panagiotis Kanavos
                    Marshal.ThrowExceptionForHR(WinError.E_FAIL);
477 d78cbf09 Panagiotis Kanavos
                }
478 d78cbf09 Panagiotis Kanavos
            }
479 d78cbf09 Panagiotis Kanavos
480 d78cbf09 Panagiotis Kanavos
                // For the Unicode case, if the high-order word is not zero, the 
481 d78cbf09 Panagiotis Kanavos
            // command's verb string is in lpcmi->lpVerbW. 
482 d78cbf09 Panagiotis Kanavos
            else if (isUnicode && NativeMethods.HighWord(iciex.verbW.ToInt32()) != 0)
483 d78cbf09 Panagiotis Kanavos
            {
484 d78cbf09 Panagiotis Kanavos
                // Is the verb supported by this context menu extension?
485 d78cbf09 Panagiotis Kanavos
                string verbUTF = Marshal.PtrToStringUni(iciex.verbW);
486 d78cbf09 Panagiotis Kanavos
                if (_items.ContainsKey(verbUTF))
487 d78cbf09 Panagiotis Kanavos
                {
488 d78cbf09 Panagiotis Kanavos
                    _items[verbUTF].MenuCommand(ici.hwnd);
489 d78cbf09 Panagiotis Kanavos
                }
490 d78cbf09 Panagiotis Kanavos
                else
491 d78cbf09 Panagiotis Kanavos
                {
492 d78cbf09 Panagiotis Kanavos
                    // If the verb is not recognized by the context menu handler, it 
493 d78cbf09 Panagiotis Kanavos
                    // must return E_FAIL to allow it to be passed on to the other 
494 d78cbf09 Panagiotis Kanavos
                    // context menu handlers that might implement that verb.
495 d78cbf09 Panagiotis Kanavos
                    Marshal.ThrowExceptionForHR(WinError.E_FAIL);
496 d78cbf09 Panagiotis Kanavos
                }
497 d78cbf09 Panagiotis Kanavos
            }
498 d78cbf09 Panagiotis Kanavos
499 d78cbf09 Panagiotis Kanavos
                // If the command cannot be identified through the verb string, then 
500 d78cbf09 Panagiotis Kanavos
            // check the identifier offset.
501 d78cbf09 Panagiotis Kanavos
            else
502 d78cbf09 Panagiotis Kanavos
            {
503 d78cbf09 Panagiotis Kanavos
                // Is the command identifier offset supported by this context menu 
504 d78cbf09 Panagiotis Kanavos
                // extension?
505 d78cbf09 Panagiotis Kanavos
                int menuID = NativeMethods.LowWord(ici.verb.ToInt32());
506 d78cbf09 Panagiotis Kanavos
                var menuItem = _items.FirstOrDefault(item => item.Value.MenuDisplayId == menuID).Value;
507 d78cbf09 Panagiotis Kanavos
                if (menuItem != null)
508 d78cbf09 Panagiotis Kanavos
                {
509 d78cbf09 Panagiotis Kanavos
                    menuItem.MenuCommand(ici.hwnd);
510 d78cbf09 Panagiotis Kanavos
                }
511 d78cbf09 Panagiotis Kanavos
                else
512 d78cbf09 Panagiotis Kanavos
                {
513 d78cbf09 Panagiotis Kanavos
                    // If the verb is not recognized by the context menu handler, it 
514 d78cbf09 Panagiotis Kanavos
                    // must return E_FAIL to allow it to be passed on to the other 
515 d78cbf09 Panagiotis Kanavos
                    // context menu handlers that might implement that verb.
516 d78cbf09 Panagiotis Kanavos
                    Marshal.ThrowExceptionForHR(WinError.E_FAIL);
517 d78cbf09 Panagiotis Kanavos
                }
518 d78cbf09 Panagiotis Kanavos
            }
519 d78cbf09 Panagiotis Kanavos
        }
520 d78cbf09 Panagiotis Kanavos
521 d78cbf09 Panagiotis Kanavos
        /// <summary>
522 d78cbf09 Panagiotis Kanavos
        /// Get information about a shortcut menu command, including the help string 
523 d78cbf09 Panagiotis Kanavos
        /// and the language-independent, or canonical, name for the command.
524 d78cbf09 Panagiotis Kanavos
        /// </summary>
525 d78cbf09 Panagiotis Kanavos
        /// <param name="idCmd">Menu command identifier offset.</param>
526 d78cbf09 Panagiotis Kanavos
        /// <param name="uFlags">
527 d78cbf09 Panagiotis Kanavos
        /// Flags specifying the information to return. This parameter can have one 
528 d78cbf09 Panagiotis Kanavos
        /// of the following values: GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VALIDATEA, 
529 d78cbf09 Panagiotis Kanavos
        /// GCS_VALIDATEW, GCS_VERBA, GCS_VERBW.
530 d78cbf09 Panagiotis Kanavos
        /// </param>
531 d78cbf09 Panagiotis Kanavos
        /// <param name="pReserved">Reserved. Must be IntPtr.Zero</param>
532 d78cbf09 Panagiotis Kanavos
        /// <param name="pszName">
533 d78cbf09 Panagiotis Kanavos
        /// The address of the buffer to receive the null-terminated string being 
534 d78cbf09 Panagiotis Kanavos
        /// retrieved.
535 d78cbf09 Panagiotis Kanavos
        /// </param>
536 d78cbf09 Panagiotis Kanavos
        /// <param name="cchMax">
537 d78cbf09 Panagiotis Kanavos
        /// Size of the buffer, in characters, to receive the null-terminated string.
538 d78cbf09 Panagiotis Kanavos
        /// </param>
539 d78cbf09 Panagiotis Kanavos
        public void GetCommandString(
540 d78cbf09 Panagiotis Kanavos
            UIntPtr idCmd,
541 d78cbf09 Panagiotis Kanavos
            uint uFlags,
542 d78cbf09 Panagiotis Kanavos
            IntPtr pReserved,
543 d78cbf09 Panagiotis Kanavos
            StringBuilder pszName,
544 d78cbf09 Panagiotis Kanavos
            uint cchMax)
545 d78cbf09 Panagiotis Kanavos
        {
546 d78cbf09 Panagiotis Kanavos
            uint menuID = idCmd.ToUInt32();
547 d78cbf09 Panagiotis Kanavos
            var menuItem = _items.FirstOrDefault(item => item.Value.MenuDisplayId == menuID).Value;
548 d78cbf09 Panagiotis Kanavos
            if (menuItem != null)
549 d78cbf09 Panagiotis Kanavos
            {
550 d78cbf09 Panagiotis Kanavos
                switch ((GCS)uFlags)
551 d78cbf09 Panagiotis Kanavos
                {
552 d78cbf09 Panagiotis Kanavos
                    case GCS.GCS_VERBW:
553 d78cbf09 Panagiotis Kanavos
                        if (menuItem.VerbCanonicalName.Length > cchMax - 1)
554 d78cbf09 Panagiotis Kanavos
                        {
555 d78cbf09 Panagiotis Kanavos
                            Marshal.ThrowExceptionForHR(WinError.STRSAFE_E_INSUFFICIENT_BUFFER);
556 d78cbf09 Panagiotis Kanavos
                        }
557 d78cbf09 Panagiotis Kanavos
                        else
558 d78cbf09 Panagiotis Kanavos
                        {
559 d78cbf09 Panagiotis Kanavos
                            pszName.Clear();
560 d78cbf09 Panagiotis Kanavos
                            pszName.Append(menuItem.VerbCanonicalName);
561 d78cbf09 Panagiotis Kanavos
                        }
562 d78cbf09 Panagiotis Kanavos
                        break;
563 d78cbf09 Panagiotis Kanavos
564 d78cbf09 Panagiotis Kanavos
                    case GCS.GCS_HELPTEXTW:
565 d78cbf09 Panagiotis Kanavos
                        if (menuItem.VerbHelpText.Length > cchMax - 1)
566 d78cbf09 Panagiotis Kanavos
                        {
567 d78cbf09 Panagiotis Kanavos
                            Marshal.ThrowExceptionForHR(WinError.STRSAFE_E_INSUFFICIENT_BUFFER);
568 d78cbf09 Panagiotis Kanavos
                        }
569 d78cbf09 Panagiotis Kanavos
                        else
570 d78cbf09 Panagiotis Kanavos
                        {
571 d78cbf09 Panagiotis Kanavos
                            pszName.Clear();
572 d78cbf09 Panagiotis Kanavos
                            pszName.Append(menuItem.VerbHelpText);
573 d78cbf09 Panagiotis Kanavos
                        }
574 d78cbf09 Panagiotis Kanavos
                        break;
575 d78cbf09 Panagiotis Kanavos
                }
576 d78cbf09 Panagiotis Kanavos
            }
577 d78cbf09 Panagiotis Kanavos
        }
578 d78cbf09 Panagiotis Kanavos
579 d78cbf09 Panagiotis Kanavos
        #endregion
580 d78cbf09 Panagiotis Kanavos
    }
581 d78cbf09 Panagiotis Kanavos
}