NetIde.Util.Forms.FolderBrowser.ShowNativeDialog C# (CSharp) Method

ShowNativeDialog() private method

private ShowNativeDialog ( IWin32Window owner ) : DialogResult
owner IWin32Window
return DialogResult
        private DialogResult ShowNativeDialog(IWin32Window owner)
        {
            var rootFolder = IntPtr.Zero;

            NativeMethods.SHGetSpecialFolderLocation(owner.Handle, (int)RootFolder, ref rootFolder);

            if (rootFolder == IntPtr.Zero)
            {
                NativeMethods.SHGetSpecialFolderLocation(owner.Handle, (int)Environment.SpecialFolder.Desktop, ref rootFolder);

                if (rootFolder == IntPtr.Zero)
                    throw new InvalidOperationException("Cannot resolve root folder");
            }

            uint options = NativeMethods.BIF_NEWDIALOGSTYLE;
            if (ShowEditBox)
                options |= NativeMethods.BIF_EDITBOX;
            if (!ShowNewFolderButton)
                options |= NativeMethods.BIF_NONEWFOLDERBUTTON;

            var result = IntPtr.Zero;
            var displayName = IntPtr.Zero;
            var selectedPath = IntPtr.Zero;

            try
            {
                var bi = new NativeMethods.BROWSEINFO();

                displayName = Marshal.AllocHGlobal(NativeMethods.MAX_PATH * Marshal.SystemDefaultCharSize);
                selectedPath = Marshal.AllocHGlobal(NativeMethods.MAX_PATH * Marshal.SystemDefaultCharSize);

                bi.pidlRoot = rootFolder;
                bi.hwndOwner = owner.Handle;
                bi.pszDisplayName = displayName;
                bi.lpszTitle = Description;
                bi.ulFlags = options;

                result = NativeMethods.SHBrowseForFolder(bi);

                if (result != IntPtr.Zero)
                {
                    NativeMethods.SHGetPathFromIDList(result, selectedPath);

                    SelectedPath = Marshal.PtrToStringAuto(selectedPath);

                    return DialogResult.OK;
                }

                return DialogResult.Cancel;
            }
            finally
            {
                NativeMethods.CoTaskMemFree(rootFolder);

                if (result != IntPtr.Zero)
                    NativeMethods.CoTaskMemFree(result);

                if (selectedPath != IntPtr.Zero)
                    Marshal.FreeHGlobal(selectedPath);

                if (displayName != IntPtr.Zero)
                    Marshal.FreeHGlobal(displayName);
            }
        }