private void InitVars()
        {
            IntPtr tempPidl;
            NativeShellAPI.SHFILEINFO info;

            //My Computer
            info = new NativeShellAPI.SHFILEINFO();
            tempPidl = IntPtr.Zero;
            NativeShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, NativeShellAPI.CSIDL.DRIVES, out tempPidl);

            NativeShellAPI.SHGetFileInfo(tempPidl, 0, ref info, NativeShellAPI.cbFileInfo,
                NativeShellAPI.SHGFI.PIDL | NativeShellAPI.SHGFI.DISPLAYNAME | NativeShellAPI.SHGFI.TYPENAME);

            sysfolderName = info.szTypeName;
            mycompName = info.szDisplayName;
            Marshal.FreeCoTaskMem(tempPidl);
            //

            //Dekstop
            tempPidl = IntPtr.Zero;
            NativeShellAPI.SHGetSpecialFolderLocation(IntPtr.Zero, NativeShellAPI.CSIDL.DESKTOP, out tempPidl);
            IntPtr desktopFolderPtr;
            NativeShellAPI.SHGetDesktopFolder(out desktopFolderPtr);
            desktopItem = new ShellItem(this, tempPidl, desktopFolderPtr);
            //

            //My Documents
            uint pchEaten = 0;
            NativeShellAPI.SFGAO pdwAttributes = 0;
            desktopItem.ShellFolder.ParseDisplayName(
                IntPtr.Zero,
                IntPtr.Zero,
                "::{450d8fba-ad25-11d0-98a8-0800361b1103}",
                ref pchEaten,
                out tempPidl,
                ref pdwAttributes);

            info = new NativeShellAPI.SHFILEINFO();
            NativeShellAPI.SHGetFileInfo(tempPidl, 0, ref info, NativeShellAPI.cbFileInfo,
                NativeShellAPI.SHGFI.PIDL | NativeShellAPI.SHGFI.DISPLAYNAME);

            mydocsName = info.szDisplayName;
            Marshal.FreeCoTaskMem(tempPidl);

            StringBuilder path = new StringBuilder(NativeShellAPI.MAX_PATH);
            NativeShellAPI.SHGetFolderPath(
                    IntPtr.Zero, NativeShellAPI.CSIDL.PERSONAL,
                    IntPtr.Zero, NativeShellAPI.SHGFP.TYPE_CURRENT, path);
            mydocsPath = path.ToString();
            //
        }
Beispiel #2
0
        internal ShellItem(ShellBrowserComponent browser, ShellItem parentItem, IntPtr pidl)
        {
            this.browser = browser;

            this.parentItem = parentItem;

            pidlRel = new PIDL(pidl, false);

            SetText(this);
            SetPath(this);
            SetAttributesFile(this);
            SetInfo(this);                        

            sortFlag = MakeSortFlag(this);
        }
Beispiel #3
0
 public static bool GetIStorage(ShellItem item, out IntPtr storagePtr, out IStorage storage)
 {
     if (item.ParentItem.ShellFolder.BindToStorage(
                 item.PIDLRel.Ptr,
                 IntPtr.Zero,
                 ref NativeShellAPI.IID_IStorage,
                 out storagePtr) == NativeShellAPI.S_OK)
     {
         storage = (IStorage)Marshal.GetTypedObjectForIUnknown(storagePtr, typeof(IStorage));
         return true;
     }
     else
     {
         storage = null;
         storagePtr = IntPtr.Zero;
         return false;
     }
 }
Beispiel #4
0
        internal ShellItem(ShellBrowserComponent browser, ShellItem parentItem, IntPtr pidl, IntPtr shellFolderPtr)
        {
            this.browser = browser;

            this.parentItem = parentItem;
            this.shellFolderPtr = shellFolderPtr;
            this.shellFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(shellFolderPtr, typeof(IShellFolder));
            subFiles = new ShellItemCollection(this);
            subFolders = new ShellItemCollection(this);

            pidlRel = new PIDL(pidl, false);

            SetText(this);
            SetPath(this);
            SetAttributesFolder(this);
            SetInfo(this);                       

            sortFlag = MakeSortFlag(this);
        }
Beispiel #5
0
        public bool GetTreeNode(ShellItem shellItem, out TreeNode treeNode)
        {
            ArrayList pathList = new ArrayList();

            while (shellItem.ParentItem != null)
            {
                pathList.Add(shellItem);
                shellItem = shellItem.ParentItem;
            }
            pathList.Add(shellItem);

            pathList.Reverse();

            treeNode = Nodes[0];
            for (int i = 1; i < pathList.Count; i++)
            {
                bool found = false;
                foreach (TreeNode node in treeNode.Nodes)
                {
                    if (node.Tag != null && node.Tag.Equals(pathList[i]))
                    {
                        treeNode = node;
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    treeNode = null;
                    return false;
                }
            }

            return true;
        }
Beispiel #6
0
        public static void UpdateShellFolders(ShellItem item)
        {
            item.UpdateShellFolder = true;

            foreach (ShellItem child in item.SubFolders)
                ShellItem.UpdateShellFolders(child);
        }
Beispiel #7
0
 internal int Add(ShellItem value)
 {
     return items.Add(value);
 }
Beispiel #8
0
        public static string GetRealPath(ShellItem item)
        {
            if (item.Equals(item.browser.DesktopItem))
            {
                return "::{450d8fba-ad25-11d0-98a8-0800361b1103}";
            }
            else if (item.Type == item.Browser.SystemFolderName)
            {
                IntPtr strr = Marshal.AllocCoTaskMem(NativeShellAPI.MAX_PATH * 2 + 4);
                Marshal.WriteInt32(strr, 0, 0);
                StringBuilder buf = new StringBuilder(NativeShellAPI.MAX_PATH);

                if (item.ParentItem.ShellFolder.GetDisplayNameOf(
                                item.PIDLRel.Ptr,
                                NativeShellAPI.SHGNO.FORPARSING,
                                strr) == NativeShellAPI.S_OK)
                {
                    NativeShellAPI.StrRetToBuf(strr, item.PIDLRel.Ptr, buf, NativeShellAPI.MAX_PATH);
                }

                Marshal.FreeCoTaskMem(strr);

                return buf.ToString();
            }
            else
                return item.Path;
        }
Beispiel #9
0
 public int IndexOf(ShellItem value)
 {
     return items.IndexOf(value);
 }
        public int DragEnter(IntPtr pDataObj, NativeShellAPI.MK grfKeyState, NativeShellAPI.POINT pt, ref DragDropEffects pdwEffect)
        {
            mouseButtons = grfKeyState;
            startEffects = pdwEffect;

            br.FileView.Focus();
            br.SelectionChange = false;
            ReleaseCom();

            dropDataObject = pDataObj;

            #region Get DropItem
            Point point = br.FileView.PointToClient(new Point(pt.x, pt.y));
            ListViewHitTestInfo hitTest = br.FileView.HitTest(point);
            if (hitTest.Item != null &&
                (br.FileView.View != View.Details || hitTest.SubItem == null || hitTest.Item.Name == hitTest.SubItem.Name) &&
                (hitTest.Location == ListViewHitTestLocations.Image ||
                 hitTest.Location == ListViewHitTestLocations.Label ||
                 hitTest.Location == ListViewHitTestLocations.StateImage))
            {
                dropListItem = hitTest.Item;

                wasSelected = dropListItem.Selected;
                dropListItem.Selected = true;

                ShellItem item = (ShellItem)dropListItem.Tag;
                parentDropItem = item;

                ShellHelper.GetIDropTarget(item, out dropTargetPtr, out dropTarget);
            }
            else
            {
                dropListItem = null;
                parentDropItem = br.CurrentDirectory;
                ShellHelper.GetIDropTarget(br.CurrentDirectory, out dropTargetPtr, out dropTarget);
            }
            #endregion

            if (dropTarget != null)
                dropTarget.DragEnter(pDataObj, grfKeyState, pt, ref pdwEffect);

            if (dropHelper != null)
                dropHelper.DragEnter(br.Handle, pDataObj, ref pt, pdwEffect);

            return NativeShellAPI.S_OK;
        }
        public int DragOver(NativeShellAPI.MK grfKeyState, NativeShellAPI.POINT pt, ref DragDropEffects pdwEffect)
        {
            bool reset = false;

            #region Get DropItem

            Point point = br.FolderView.PointToClient(new Point(pt.x, pt.y));
            TreeViewHitTestInfo hitTest = br.FolderView.HitTest(point);
            if (!TreeNode.Equals(dropNode, hitTest.Node))
            {
                if (dropTarget != null)
                    dropTarget.DragLeave();

                ReleaseCom();

                dropNode = hitTest.Node;
                br.FolderView.SelectedNode = dropNode;

                if (dropNode == null)
                {
                    pdwEffect = DragDropEffects.None;

                    if (dropHelper != null)
                        dropHelper.DragOver(ref pt, pdwEffect);

                    return NativeShellAPI.S_OK;
                }
                else
                {
                    ShellItem item = (ShellItem)dropNode.Tag;
                    parentDropItem = item;

                    ShellHelper.GetIDropTarget(item, out dropTargetPtr, out dropTarget);
                    reset = true;
                }
            }
            else if (dropNode == null)
            {
                if (dropTarget != null)
                    dropTarget.DragLeave();

                ReleaseCom();

                dropNode = null;
                br.CurrentDirectoryNode = null;

                pdwEffect = DragDropEffects.None;

                if (dropHelper != null)
                    dropHelper.DragOver(ref pt, pdwEffect);

                return NativeShellAPI.S_OK;
            }

            #endregion

            if (dropTarget != null)
            {
                if (reset)
                    dropTarget.DragEnter(dropDataObject, grfKeyState, pt, ref pdwEffect);
                else
                    dropTarget.DragOver(grfKeyState, pt, ref pdwEffect);
            }
            else
                pdwEffect = DragDropEffects.None;

            if (dropHelper != null)
                dropHelper.DragOver(ref pt, pdwEffect);

            return NativeShellAPI.S_OK;
        }
Beispiel #12
0
        private static void SetPath(ShellItem item)
        {
            IntPtr strr = Marshal.AllocCoTaskMem(NativeShellAPI.MAX_PATH * 2 + 4);
            Marshal.WriteInt32(strr, 0, 0);
            StringBuilder buf = new StringBuilder(NativeShellAPI.MAX_PATH);

            if (item.ParentItem.ShellFolder.GetDisplayNameOf(
                            item.PIDLRel.Ptr,
                            NativeShellAPI.SHGNO.FORADDRESSBAR | NativeShellAPI.SHGNO.FORPARSING,
                            strr) == NativeShellAPI.S_OK)
            {
                NativeShellAPI.StrRetToBuf(strr, item.PIDLRel.Ptr, buf, NativeShellAPI.MAX_PATH);
                item.path = buf.ToString();
            }

            Marshal.FreeCoTaskMem(strr);
        }
Beispiel #13
0
        internal bool Expand(bool expandFiles, bool expandFolders, IntPtr winHandle)
        {
            if (((expandFiles && !filesExpanded) || !expandFiles) &&
                ((expandFolders && !foldersExpanded) || !expandFolders) &&
                (expandFiles || expandFolders) && ShellFolder != null && !disposed)
            {
                #region Fields

                IntPtr fileEnumPtr = IntPtr.Zero, folderEnumPtr = IntPtr.Zero;
                IEnumIDList fileEnum = null, folderEnum = null;
                IntPtr pidlSubItem;
                int celtFetched;

                NativeShellAPI.SHCONTF fileFlag =
                        NativeShellAPI.SHCONTF.NONFOLDERS |
                        NativeShellAPI.SHCONTF.INCLUDEHIDDEN;

                NativeShellAPI.SHCONTF folderFlag =
                        NativeShellAPI.SHCONTF.FOLDERS |
                        NativeShellAPI.SHCONTF.INCLUDEHIDDEN;

                #endregion

                try
                {
                    #region Add Files

                    if (expandFiles)
                    {
                        if (this.Equals(browser.DesktopItem) || parentItem.Equals(browser.DesktopItem))
                        {
                            if (ShellFolder.EnumObjects(
                                    winHandle,
                                    fileFlag,
                                    out fileEnumPtr) == NativeShellAPI.S_OK)
                            {
                                fileEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(fileEnumPtr, typeof(IEnumIDList));
                                NativeShellAPI.SFGAO attribs = NativeShellAPI.SFGAO.FOLDER;
                                while (fileEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                                {
                                    ShellFolder.GetAttributesOf(1, new IntPtr[] { pidlSubItem }, ref attribs);

                                    if ((attribs & NativeShellAPI.SFGAO.FOLDER) == 0)
                                    {
                                        ShellItem newItem = new ShellItem(browser, this, pidlSubItem);

                                        if (!subFolders.Contains(newItem.Text))
                                            subFiles.Add(newItem);
                                    }
                                    else
                                        Marshal.FreeCoTaskMem(pidlSubItem);
                                }

                                subFiles.Sort();
                                filesExpanded = true;
                            }
                        }
                        else
                        {
                            if (ShellFolder.EnumObjects(
                                    winHandle,
                                    fileFlag,
                                    out fileEnumPtr) == NativeShellAPI.S_OK)
                            {
                                fileEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(fileEnumPtr, typeof(IEnumIDList));
                                while (fileEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                                {
                                    ShellItem newItem = new ShellItem(browser, this, pidlSubItem);
                                    subFiles.Add(newItem);
                                }

                                subFiles.Sort();
                                filesExpanded = true;
                            }
                        }
                    }

                    #endregion

                    #region Add Folders

                    if (expandFolders)
                    {
                        if (ShellFolder.EnumObjects(
                                    winHandle,
                                    folderFlag,
                                    out folderEnumPtr) == NativeShellAPI.S_OK)
                        {
                            folderEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(folderEnumPtr, typeof(IEnumIDList));
                            while (folderEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                            {
                                IntPtr shellFolderPtr;
                                if (ShellFolder.BindToObject(
                                            pidlSubItem,
                                            IntPtr.Zero,
                                            ref NativeShellAPI.IID_IShellFolder,
                                            out shellFolderPtr) == NativeShellAPI.S_OK)
                                {
                                    ShellItem newItem = new ShellItem(
                                        browser,
                                        this,
                                        pidlSubItem,
                                        shellFolderPtr);
                                    subFolders.Add(newItem);
                                }
                            }

                            subFolders.Sort();
                            foldersExpanded = true;
                        }
                    }

                    #endregion
                }
                catch (Exception) { }
                finally
                {
                    #region Free

                    if (folderEnum != null)
                    {
                        Marshal.ReleaseComObject(folderEnum);
                        Marshal.Release(folderEnumPtr);
                    }

                    if (fileEnum != null)
                    {
                        Marshal.ReleaseComObject(fileEnum);
                        Marshal.Release(fileEnumPtr);
                    }

                    #endregion
                }
            }

            return ((expandFiles == filesExpanded || !expandFiles) && (expandFolders == foldersExpanded || !expandFolders));
        }
Beispiel #14
0
        private static void SetAttributesFile(ShellItem item)
        {
            // file/folder attributes
            NativeShellAPI.SFGAO attribs =
                NativeShellAPI.SFGAO.LINK |
                NativeShellAPI.SFGAO.SHARE | 
                NativeShellAPI.SFGAO.FILESYSTEM |
                NativeShellAPI.SFGAO.HIDDEN |
                NativeShellAPI.SFGAO.CANRENAME |
                NativeShellAPI.SFGAO.STREAM;
            item.ParentItem.ShellFolder.GetAttributesOf(
                1, new IntPtr[] { item.PIDLRel.Ptr }, ref attribs);

            item.isFolder = false;
            item.isLink = (attribs & NativeShellAPI.SFGAO.LINK) != 0;
            item.isShared = (attribs & NativeShellAPI.SFGAO.SHARE) != 0;
            item.isFileSystem = (attribs & NativeShellAPI.SFGAO.FILESYSTEM) != 0;
            item.isHidden = (attribs & NativeShellAPI.SFGAO.HIDDEN) != 0;
            item.hasSubfolder = false;
            item.isBrowsable = false;
            item.canRename = (attribs & NativeShellAPI.SFGAO.CANRENAME) != 0;
            item.canRead = (attribs & NativeShellAPI.SFGAO.STREAM) != 0;

            item.isDisk = false;
        }        
Beispiel #15
0
        private static void SetAttributesFolder(ShellItem item)
        {
            // file/folder attributes
            NativeShellAPI.SFGAO attribs = 
                NativeShellAPI.SFGAO.SHARE |
                NativeShellAPI.SFGAO.FILESYSTEM |
                NativeShellAPI.SFGAO.HIDDEN |
                NativeShellAPI.SFGAO.HASSUBFOLDER |
                NativeShellAPI.SFGAO.BROWSABLE |
                NativeShellAPI.SFGAO.CANRENAME | 
                NativeShellAPI.SFGAO.STORAGE;
            item.ParentItem.ShellFolder.GetAttributesOf(
                1, new IntPtr[] { item.PIDLRel.Ptr }, ref attribs);
            
            item.isFolder = true;
            item.isLink = false;
            item.isShared = (attribs & NativeShellAPI.SFGAO.SHARE) != 0;
            item.isFileSystem = (attribs & NativeShellAPI.SFGAO.FILESYSTEM) != 0;
            item.isHidden = (attribs & NativeShellAPI.SFGAO.HIDDEN) != 0;
            item.hasSubfolder = (attribs & NativeShellAPI.SFGAO.HASSUBFOLDER) != 0;
            item.isBrowsable = (attribs & NativeShellAPI.SFGAO.BROWSABLE) != 0;
            item.canRename = (attribs & NativeShellAPI.SFGAO.CANRENAME) != 0;
            item.canRead = (attribs & NativeShellAPI.SFGAO.STORAGE) != 0;

            item.isDisk = (item.path.Length == 3 && item.path.EndsWith(":\\"));
        }
Beispiel #16
0
 private static void SetAttributesDesktop(ShellItem item)
 {
     item.isFolder = true;
     item.isLink = false;
     item.isShared = false;
     item.isFileSystem = true;
     item.isHidden = false;
     item.hasSubfolder = true;
     item.isBrowsable = true;
     item.canRename = false;
     item.canRead = true;
 }
Beispiel #17
0
        private static void SetInfo(ShellItem item)
        {
            PIDL pidlFull = item.PIDLFull;

            NativeShellAPI.SHFILEINFO info = new NativeShellAPI.SHFILEINFO();
            NativeShellAPI.SHGetFileInfo(pidlFull.Ptr, 0, ref info, NativeShellAPI.cbFileInfo,
                NativeShellAPI.SHGFI.PIDL | NativeShellAPI.SHGFI.TYPENAME | NativeShellAPI.SHGFI.SYSICONINDEX);

            pidlFull.Free();

            ShellImageList.SetIconIndex(item, info.iIcon, false);
            ShellImageList.SetIconIndex(item, info.iIcon, true);

            item.type = info.szTypeName;
        }
Beispiel #18
0
 internal void Remove(ShellItem value)
 {
     items.Remove(value);
 }
Beispiel #19
0
 internal void Insert(int index, ShellItem value)
 {
     items.Insert(index, value);
 }
        internal ShellItem[] GetPath(ShellItem item)
        {
            ArrayList pathList = new ArrayList();
            
            ShellItem currentItem = item;
            while (currentItem.ParentItem != null)
            {
                pathList.Add(currentItem);
                currentItem = currentItem.ParentItem;
            }
            pathList.Add(currentItem);
            pathList.Reverse();

            return (ShellItem[])pathList.ToArray(typeof(ShellItem));
        }
 public ShellItemUpdateEventArgs(
     ShellItem oldItem,
     ShellItem newItem,
     ShellItemUpdateType type)
 {
     this.oldItem = oldItem;
     this.newItem = newItem;
     this.type = type;
 }
Beispiel #22
0
        internal void Update(bool updateFiles, bool updateFolders)
        {
            if (browser.UpdateCondition.ContinueUpdate && (updateFiles || updateFolders) && ShellFolder != null && !disposed)
            {
                lock (browser)
                {
                    #region Fields

                    IntPtr fileEnumPtr = IntPtr.Zero, folderEnumPtr = IntPtr.Zero;
                    IEnumIDList fileEnum = null, folderEnum = null;
                    IntPtr pidlSubItem;
                    int celtFetched;

                    NativeShellAPI.SHCONTF fileFlag =
                            NativeShellAPI.SHCONTF.NONFOLDERS |
                            NativeShellAPI.SHCONTF.INCLUDEHIDDEN;

                    NativeShellAPI.SHCONTF folderFlag =
                            NativeShellAPI.SHCONTF.FOLDERS |
                            NativeShellAPI.SHCONTF.INCLUDEHIDDEN;

                    bool[] fileExists;
                    fileExists = new bool[subFiles.Count];

                    bool[] folderExists;
                    folderExists = new bool[subFolders.Count];

                    int index;

                    #endregion

                    try
                    {
                        #region Update Files

                        if (browser.UpdateCondition.ContinueUpdate && updateFiles)
                        {
                            ShellItemCollection add = new ShellItemCollection(this);
                            ShellItemCollection remove = new ShellItemCollection(this);

                            bool fileEnumCompleted = false;

                            #region Add Files

                            if (this.Equals(browser.DesktopItem) || parentItem.Equals(browser.DesktopItem))
                            {
                                if (ShellFolder.EnumObjects(
                                        IntPtr.Zero,
                                        fileFlag,
                                        out fileEnumPtr) == NativeShellAPI.S_OK)
                                {
                                    fileEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(fileEnumPtr, typeof(IEnumIDList));
                                    NativeShellAPI.SFGAO attribs = NativeShellAPI.SFGAO.FOLDER;
                                    while (browser.UpdateCondition.ContinueUpdate &&
                                           fileEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                                    {
                                        ShellFolder.GetAttributesOf(1, new IntPtr[] { pidlSubItem }, ref attribs);

                                        if ((attribs & NativeShellAPI.SFGAO.FOLDER) == 0)
                                        {
                                            if ((index = subFiles.IndexOf(pidlSubItem)) == -1)
                                            {
                                                ShellItem newItem = new ShellItem(browser, this, pidlSubItem);

                                                if (!subFolders.Contains(newItem.Text))
                                                {
                                                    add.Add(newItem);
                                                }
                                            }
                                            else if (index < fileExists.Length)
                                            {
                                                fileExists[index] = true;
                                                Marshal.FreeCoTaskMem(pidlSubItem);
                                            }
                                        }
                                        else
                                            Marshal.FreeCoTaskMem(pidlSubItem);
                                    }

                                    fileEnumCompleted = true;
                                }
                                    
                            }
                            else
                            {
                                if (ShellFolder.EnumObjects(
                                        IntPtr.Zero,
                                        fileFlag,
                                        out fileEnumPtr) == NativeShellAPI.S_OK)
                                {
                                    fileEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(fileEnumPtr, typeof(IEnumIDList));
                                    while (browser.UpdateCondition.ContinueUpdate &&
                                           fileEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                                    {
                                        if ((index = subFiles.IndexOf(pidlSubItem)) == -1)
                                        {
                                            add.Add(new ShellItem(browser, this, pidlSubItem));
                                        }
                                        else if (index < fileExists.Length)
                                        {
                                            fileExists[index] = true;
                                            Marshal.FreeCoTaskMem(pidlSubItem);
                                        }
                                    }

                                    fileEnumCompleted = true;
                                }
                            }

                            #endregion

                            #region Remove Files

                            for (int i = 0; fileEnumCompleted && browser.UpdateCondition.ContinueUpdate && i < fileExists.Length; i++)
                            {
                                if (!fileExists[i] && subFiles[i] != null)
                                {
                                    remove.Add(subFiles[i]);
                                }
                            }

                            #endregion

                            #region Do Events

                            if (fileEnumCompleted && browser.UpdateCondition.ContinueUpdate)
                            {
                                int newIndex;
                                foreach (ShellItem oldItem in remove)
                                {
                                    if ((newIndex = add.IndexOf(oldItem.Text)) > -1)
                                    {
                                        ShellItem newItem = add[newIndex];
                                        add.Remove(newItem);

                                        oldItem.pidlRel.Free();
                                        oldItem.pidlRel = new PIDL(newItem.pidlRel.Ptr, true);

                                        oldItem.shellFolder = newItem.shellFolder;
                                        oldItem.shellFolderPtr = newItem.shellFolderPtr;

                                        ((IDisposable)newItem).Dispose();

                                        browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(oldItem, oldItem, ShellItemUpdateType.Updated));
                                    }
                                    else
                                    {
                                        subFiles.Remove(oldItem);
                                        browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(oldItem, null, ShellItemUpdateType.Deleted));
                                        ((IDisposable)oldItem).Dispose();
                                    }
                                }

                                foreach (ShellItem newItem in add)
                                {
                                    subFiles.Add(newItem);
                                    browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(null, newItem, ShellItemUpdateType.Created));
                                }

                                subFiles.Capacity = subFiles.Count;
                                subFiles.Sort();

                                filesExpanded = true;
                            }

                            #endregion
                        }

                        #endregion

                        #region Update Folders

                        if (browser.UpdateCondition.ContinueUpdate && updateFolders)
                        {
                            ShellItemCollection add = new ShellItemCollection(this);
                            ShellItemCollection remove = new ShellItemCollection(this);

                            bool folderEnumCompleted = false;

                            #region Add Folders

                            if (ShellFolder.EnumObjects(
                                        IntPtr.Zero,
                                        folderFlag,
                                        out folderEnumPtr) == NativeShellAPI.S_OK)
                            {
                                folderEnum = (IEnumIDList)Marshal.GetTypedObjectForIUnknown(folderEnumPtr, typeof(IEnumIDList));
                                while (browser.UpdateCondition.ContinueUpdate &&
                                       folderEnum.Next(1, out pidlSubItem, out celtFetched) == NativeShellAPI.S_OK && celtFetched == 1)
                                {
                                    if ((index = subFolders.IndexOf(pidlSubItem)) == -1)
                                    {
                                        IntPtr shellFolderPtr;
                                        if (ShellFolder.BindToObject(
                                                    pidlSubItem,
                                                    IntPtr.Zero,
                                                    ref NativeShellAPI.IID_IShellFolder,
                                                    out shellFolderPtr) == NativeShellAPI.S_OK)
                                        {
                                            add.Add(new ShellItem(
                                                browser,
                                                this,
                                                pidlSubItem,
                                                shellFolderPtr));
                                        }
                                    }
                                    else if (index < folderExists.Length)
                                    {
                                        folderExists[index] = true;
                                        Marshal.FreeCoTaskMem(pidlSubItem);
                                    }
                                }

                                folderEnumCompleted = true;
                            }

                            #endregion

                            #region Remove Folders

                            for (int i = 0; folderEnumCompleted && browser.UpdateCondition.ContinueUpdate && i < folderExists.Length; i++)
                            {
                                if (!folderExists[i] && subFolders[i] != null)
                                {
                                    remove.Add(subFolders[i]);
                                }
                            }

                            #endregion

                            #region Do Events

                            if (folderEnumCompleted && browser.UpdateCondition.ContinueUpdate)
                            {
                                int newIndex;
                                foreach (ShellItem oldItem in remove)
                                {
                                    if ((newIndex = add.IndexOf(oldItem.Text)) > -1)
                                    {
                                        ShellItem newItem = add[newIndex];
                                        add.Remove(newItem);

                                        oldItem.pidlRel.Free();
                                        oldItem.pidlRel = new PIDL(newItem.pidlRel, true);

                                        Marshal.ReleaseComObject(oldItem.shellFolder);
                                        Marshal.Release(oldItem.shellFolderPtr);

                                        oldItem.shellFolder = newItem.shellFolder;
                                        oldItem.shellFolderPtr = newItem.shellFolderPtr;

                                        newItem.shellFolder = null;
                                        newItem.shellFolderPtr = IntPtr.Zero;
                                        ((IDisposable)newItem).Dispose();

                                        browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(oldItem, oldItem, ShellItemUpdateType.Updated));
                                    }
                                    else
                                    {
                                        subFolders.Remove(oldItem);
                                        browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(oldItem, null, ShellItemUpdateType.Deleted));
                                        ((IDisposable)oldItem).Dispose();
                                    }
                                }

                                foreach (ShellItem newItem in add)
                                {
                                    subFolders.Add(newItem);

                                    browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(null, newItem, ShellItemUpdateType.Created));
                                }

                                subFolders.Capacity = subFolders.Count;
                                subFolders.Sort();
                                foldersExpanded = true;
                            }

                            #endregion
                        }

                        #endregion
                    }
                    catch (Exception) { }
                    finally
                    {
                        #region Free

                        if (folderEnum != null)
                        {
                            Marshal.ReleaseComObject(folderEnum);
                            Marshal.Release(folderEnumPtr);
                        }

                        if (fileEnum != null)
                        {
                            Marshal.ReleaseComObject(fileEnum);

                            if (!(type == browser.SystemFolderName && string.Compare(text, "Control Panel", true) == 0))
                                Marshal.Release(fileEnumPtr);
                        }

                        #endregion
                    }
                }
            }
        }
        public int DragEnter(IntPtr pDataObj, NativeShellAPI.MK grfKeyState, NativeShellAPI.POINT pt, ref DragDropEffects pdwEffect)
        {
            mouseButtons = grfKeyState;

            br.FolderView.Focus();
            br.SelectionChange = false;
            lastSelectedNode = br.FolderView.SelectedNode;

            ReleaseCom();

            dropDataObject = pDataObj;

            #region Get DropItem

            Point point = br.FolderView.PointToClient(new Point(pt.x, pt.y));
            TreeViewHitTestInfo hitTest = br.FolderView.HitTest(point);

            dropNode = hitTest.Node;
            br.FolderView.SelectedNode = dropNode;

            if (dropNode != null)
            {
                ShellItem item = (ShellItem)dropNode.Tag;
                parentDropItem = item;

                if (ShellHelper.GetIDropTarget(item, out dropTargetPtr, out dropTarget))
                {
                    dropTarget.DragEnter(pDataObj, grfKeyState, pt, ref pdwEffect);
                }
            }

            #endregion

            if (dropHelper != null)
                dropHelper.DragEnter(br.Handle, pDataObj, ref pt, pdwEffect);

            return NativeShellAPI.S_OK;
        }
        /// <summary>
        /// Reset all fields to the default values and release the IDropTarget
        /// </summary>
        private void ResetDrop()
        {
            if (dropListItem != null)
            {
                dropListItem.Selected = wasSelected;
                dropListItem = null;
                parentDropItem = null;
            }

            br.SelectionChange = true;
        }
        /// <summary>
        /// Reset all fields to the default values and release the IDropTarget
        /// </summary>
        private void ResetDrop()
        {
            if (dropNode != null)
            {
                dropNode = null;
                parentDropItem = null;
            }

            if (lastSelectedNode != null)
                br.FolderView.SelectedNode = lastSelectedNode;

            br.SelectionChange = true;
        }
Beispiel #26
0
        internal void RemoveItem(ShellItem item)
        {
            browser.UpdateCondition.ContinueUpdate = false;

            lock (browser)
            {
                try
                {
                    if (item.IsFolder)
                        SubFolders.Remove(item);
                    else
                        SubFiles.Remove(item);

                    Browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(item, null, ShellItemUpdateType.Deleted));
                    ((IDisposable)item).Dispose();
                }
                catch (Exception) { }
            }
        }
        public int DragOver(NativeShellAPI.MK grfKeyState, NativeShellAPI.POINT pt, ref DragDropEffects pdwEffect)
        {
            bool reset = false;

            #region Get DropItem

            Point point = br.FileView.PointToClient(new Point(pt.x, pt.y));
            ListViewHitTestInfo hitTest = br.FileView.HitTest(point);
            if (hitTest.Item != null &&
                (br.FileView.View != View.Details || hitTest.SubItem == null || hitTest.Item.Name == hitTest.SubItem.Name) &&
                (hitTest.Location == ListViewHitTestLocations.Image ||
                 hitTest.Location == ListViewHitTestLocations.Label ||
                 hitTest.Location == ListViewHitTestLocations.StateImage))
            {
                if (!hitTest.Item.Equals(dropListItem))
                {
                    if (dropTarget != null)
                        dropTarget.DragLeave();

                    ReleaseCom();

                    if (dropListItem != null)
                        dropListItem.Selected = wasSelected;

                    dropListItem = hitTest.Item;
                    wasSelected = dropListItem.Selected;
                    dropListItem.Selected = true;

                    ShellItem item = (ShellItem)dropListItem.Tag;
                    parentDropItem = item;

                    ShellHelper.GetIDropTarget(item, out dropTargetPtr, out dropTarget);
                    reset = true;
                }
            }
            else
            {
                if (dropListItem != null)
                {
                    if (dropTarget != null)
                        dropTarget.DragLeave();

                    ReleaseCom();

                    dropListItem.Selected = wasSelected;

                    dropListItem = null;
                    parentDropItem = br.CurrentDirectory;

                    ShellHelper.GetIDropTarget(br.CurrentDirectory, out dropTargetPtr, out dropTarget);
                    reset = true;
                }
            }

            #endregion

            if (dropTarget != null)
            {
                if (reset)
                    dropTarget.DragEnter(dropDataObject, grfKeyState, pt, ref pdwEffect);
                else
                    dropTarget.DragOver(grfKeyState, pt, ref pdwEffect);
            }
            else
                pdwEffect = DragDropEffects.None;

            if (dropHelper != null)
                dropHelper.DragOver(ref pt, pdwEffect);

            return NativeShellAPI.S_OK;
        }
Beispiel #28
0
 public bool Contains(ShellItem value)
 {
     return items.Contains(value);
 }
Beispiel #29
0
        internal static void SetIconIndex(ShellItem item, int index, bool SelectedIcon)
        {
            bool HasOverlay = false; //true if it's an overlay
            int rVal = 0; //The returned Index

            NativeShellAPI.SHGFI dwflag = NativeShellAPI.SHGFI.SYSICONINDEX | NativeShellAPI.SHGFI.PIDL | NativeShellAPI.SHGFI.ICON;
            NativeShellAPI.FILE_ATTRIBUTE dwAttr = 0;
            //build Key into HashTable for this Item
            int Key = index * 256;
            if (item.IsLink)
            {
                Key = Key | 1;
                dwflag = dwflag | NativeShellAPI.SHGFI.LINKOVERLAY;
                HasOverlay = true;
            }
            if (item.IsShared)
            {
                Key = Key | 2;
                dwflag = dwflag | NativeShellAPI.SHGFI.ADDOVERLAYS;
                HasOverlay = true;
            }
            if (SelectedIcon)
            {
                Key = Key | 4;
                dwflag = dwflag | NativeShellAPI.SHGFI.OPENICON;
                HasOverlay = true; //not really an overlay, but handled the same
            }
            
            if (imageTable.ContainsKey(Key))
            {
                rVal = (int)imageTable[Key];
            }
            else if (!HasOverlay && !item.IsHidden) //for non-overlay icons, we already have
            {                
                rVal = (int)System.Math.Floor((double)Key / 256); // the right index -- put in table
                imageTable[Key] = rVal;
            }
            else //don't have iconindex for an overlay, get it.
            {
                if (item.IsFileSystem & !item.IsDisk & !item.IsFolder)
                {
                    dwflag = dwflag | NativeShellAPI.SHGFI.USEFILEATTRIBUTES;
                    dwAttr = dwAttr | NativeShellAPI.FILE_ATTRIBUTE.NORMAL;
                }

                PIDL pidlFull = item.PIDLFull;

                NativeShellAPI.SHFILEINFO shfiSmall = new NativeShellAPI.SHFILEINFO();
                NativeShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiSmall, NativeShellAPI.cbFileInfo, dwflag | NativeShellAPI.SHGFI.SMALLICON);

                NativeShellAPI.SHFILEINFO shfiLarge = new NativeShellAPI.SHFILEINFO();
                NativeShellAPI.SHGetFileInfo(pidlFull.Ptr, dwAttr, ref shfiLarge, NativeShellAPI.cbFileInfo, dwflag | NativeShellAPI.SHGFI.LARGEICON);

                Marshal.FreeCoTaskMem(pidlFull.Ptr);

                lock (imageTable)
                {
                    rVal = NativeShellAPI.ImageList_ReplaceIcon(smallImageListHandle, -1, shfiSmall.hIcon);
                    NativeShellAPI.ImageList_ReplaceIcon(largeImageListHandle, -1, shfiLarge.hIcon);
                }

                NativeShellAPI.DestroyIcon(shfiSmall.hIcon);
                NativeShellAPI.DestroyIcon(shfiLarge.hIcon);
                imageTable[Key] = rVal;
            }

            if (SelectedIcon)
                item.SelectedImageIndex = rVal;
            else
                item.ImageIndex = rVal;
        }
Beispiel #30
0
        internal void AddItem(ShellItem item)
        {
            browser.UpdateCondition.ContinueUpdate = false;
            lock (browser)
            {
                try
                {
                    if (item.IsFolder)
                        SubFolders.Add(item);
                    else
                        SubFiles.Add(item);

                    Browser.OnShellItemUpdate(this, new ShellItemUpdateEventArgs(null, item, ShellItemUpdateType.Created));
                }
                catch (Exception) { }
            }
        }