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(); // }
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); }
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; } }
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); }
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; }
public static void UpdateShellFolders(ShellItem item) { item.UpdateShellFolder = true; foreach (ShellItem child in item.SubFolders) ShellItem.UpdateShellFolders(child); }
internal int Add(ShellItem value) { return items.Add(value); }
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; }
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; }
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); }
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)); }
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; }
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(":\\")); }
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; }
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; }
internal void Remove(ShellItem value) { items.Remove(value); }
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; }
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; }
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; }
public bool Contains(ShellItem value) { return items.Contains(value); }
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; }
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) { } } }