/// <summary> /// Handler for file or folder created or deleted.</summary> /// <param name="sender"></param> /// <param name="e"></param> private void Watcher_FileChanged(object sender, FileSystemEventArgs e) { IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder == null ? string.Empty : GetNormalizedName(folder.FullPath); string parentDirName = Path.GetDirectoryName(e.FullPath); parentDirName = GetNormalizedName(parentDirName); string itemName = GetNormalizedName(e.FullPath); if ((e.ChangeType & WatcherChangeTypes.Created) == WatcherChangeTypes.Created) { var attr = File.GetAttributes(e.FullPath); bool isDirectory = (attr & FileAttributes.Directory) == FileAttributes.Directory; if (isDirectory) { m_treeControlAdapter.Refresh(m_treeContext.RootFolder); } else if (parentDirName == selectedFolder) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } } else if ((e.ChangeType & WatcherChangeTypes.Deleted) == WatcherChangeTypes.Deleted) { m_treeControlAdapter.Refresh(m_treeContext.RootFolder); if (parentDirName == selectedFolder) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } else if (itemName == selectedFolder) { m_treeContext.Clear(); } } }
private void Watcher_Renamed(object sender, RenamedEventArgs e) { // this function interacts with m_treeControlAdapter in way that // might not be thread safe. We can push this functionality into the // ui thread, so we don't get any race conditions while rendering or // shutting down. if (m_uiThreadContext != SynchronizationContext.Current) { m_uiThreadContext.Post(delegate { Watcher_Renamed(sender, e); }, null); return; } var attr = File.GetAttributes(e.FullPath); bool isDirectory = (attr & FileAttributes.Directory) == FileAttributes.Directory; IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder == null ? string.Empty : GetNormalizedName(folder.FullPath); if (isDirectory) {// m_treeControlAdapter.Refresh(m_treeContext.RootFolder); } else // it is a file { string dirName = Path.GetDirectoryName(e.OldFullPath); dirName = GetNormalizedName(dirName); if (selectedFolder == dirName) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } } }
private void m_watcher_Renamed(object sender, RenamedEventArgs e) { var attr = File.GetAttributes(e.FullPath); bool isDirectory = (attr & FileAttributes.Directory) == FileAttributes.Directory; string rootFolder = Path.GetDirectoryName(((IFileSystemResourceFolder)m_treeContext.RootFolder).FullPath).ToLower(); IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder != null ? (folder.FullPath).ToLower().TrimEnd('\\') : null; if (isDirectory) {// var dirInfo = new DirectoryInfo(e.OldFullPath); string dirName = dirInfo.FullName.ToLower(); string parentDir = dirInfo.Parent.FullName.ToLower(); // renaming root folder if (dirName == rootFolder) { throw new InvalidOperationException("Cannot rename root folder"); } m_treeContext.Reload(); RefreshThumbnails(); } else // it is a file { string dirName = Path.GetDirectoryName(e.OldFullPath).ToLower(); if (selectedFolder == dirName) { RefreshThumbnails(); } } }
/// <summary> /// Handler for file or folder created or deleted.</summary> /// <param name="sender"></param> /// <param name="e"></param> private void Watcher_FileChanged(object sender, FileSystemEventArgs e) { string rootFolder = Path.GetDirectoryName(((IFileSystemResourceFolder)m_treeContext.RootFolder).FullPath).ToLower(); IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder != null ? (folder.FullPath).ToLower().TrimEnd('\\') : null; WatcherChangeTypes createOrDelete = WatcherChangeTypes.Created | WatcherChangeTypes.Deleted; if ((e.ChangeType & createOrDelete) != 0) { // isFile is just a hint, some files don't have ext. bool isFile = !string.IsNullOrWhiteSpace(Path.GetExtension(e.FullPath)); string dirName = Path.GetDirectoryName(e.FullPath).ToLower(); if (dirName == rootFolder || dirName == selectedFolder) { if ((e.ChangeType & WatcherChangeTypes.Deleted) != 0) { m_treeContext.Reload(); RefreshThumbnails(); } else { m_treeControlAdapter.Refresh(folder ?? m_treeContext.RootFolder); } } if (isFile) { RefreshThumbnails(); } } }
/// <summary> /// Sets the root resource folder, registers events and refreshes controls</summary> /// <param name="rootFolder">Resource folder</param> public void SetRootFolder(IResourceFolder rootFolder) { if (m_watcher == null) { m_uiThreadContext = SynchronizationContext.Current; m_watcher = new FileSystemWatcher(); m_watcher.SynchronizingObject = m_mainForm; m_watcher.IncludeSubdirectories = true; m_watcher.EnableRaisingEvents = false; m_watcher.Created += Watcher_FileChanged; m_watcher.Deleted += Watcher_FileChanged; m_watcher.Renamed += Watcher_Renamed; // We need to shut down the watcher before the dispose phase begins // this is because file events can occur while disposing other MEF objects // (eg, flushing out a cached file). When this happens, we can get a // callback that can end up accessing MEF objects that have already // been disposed. Application.ApplicationExit += ShutdownWatcher; } IFileSystemResourceFolder rootDirectory = rootFolder as IFileSystemResourceFolder; if (rootDirectory != null) { m_watcher.Path = rootDirectory.FullPath; m_watcher.EnableRaisingEvents = true; } else { m_watcher.Path = null; m_watcher.EnableRaisingEvents = false; } if (m_treeContext != null) { m_treeContext.SelectionChanged -= TreeSelectionChanged; } m_treeContext = new TreeViewContext(rootFolder); m_treeContext.SelectionChanged += TreeSelectionChanged; m_treeControlAdapter.TreeView = m_treeContext; if (m_listContext != null) { m_listContext.SelectionChanged -= listSelectionContext_SelectionChanged; } m_listContext = new ListViewContext(); m_listContext.SelectionChanged += listSelectionContext_SelectionChanged; m_listViewAdapter.ListView = m_listContext; m_treeControlAdapter.Refresh(rootFolder); }
/// <summary> /// Handler for file or folder created or deleted.</summary> /// <param name="sender"></param> /// <param name="e"></param> private void Watcher_FileChanged(object sender, FileSystemEventArgs e) { // this function interacts with m_treeControlAdapter in way that // might not be thread safe. We can push this functionality into the // ui thread, so we don't get any race conditions while rendering or // shutting down. if (m_uiThreadContext != SynchronizationContext.Current) { m_uiThreadContext.Post(delegate { Watcher_FileChanged(sender, e); }, null); return; } try { IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder == null ? string.Empty : GetNormalizedName(folder.FullPath); string parentDirName = Path.GetDirectoryName(e.FullPath); parentDirName = GetNormalizedName(parentDirName); string itemName = GetNormalizedName(e.FullPath); if ((e.ChangeType & WatcherChangeTypes.Created) == WatcherChangeTypes.Created) { var attr = File.GetAttributes(e.FullPath); bool isDirectory = (attr & FileAttributes.Directory) == FileAttributes.Directory; if (isDirectory) { m_treeControlAdapter.Refresh(m_treeContext.RootFolder); } else if (parentDirName == selectedFolder) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } } else if ((e.ChangeType & WatcherChangeTypes.Deleted) == WatcherChangeTypes.Deleted) { m_treeControlAdapter.Refresh(m_treeContext.RootFolder); if (parentDirName == selectedFolder) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } else if (itemName == selectedFolder) { m_treeContext.Clear(); } } } catch (System.IO.IOException) { // catch and suppress IO exceptions. This can occur often if (for example) we can't access the file because // of sharing priviledges } }
/// <summary> /// Sets the root resource folder, registers events and refreshes controls</summary> /// <param name="rootFolder">Resource folder</param> public void SetRootFolder(IResourceFolder rootFolder) { if (m_watcher == null) { m_watcher = new FileSystemWatcher(); m_watcher.SynchronizingObject = m_mainForm; m_watcher.IncludeSubdirectories = true; m_watcher.EnableRaisingEvents = false; m_watcher.Created += Watcher_FileChanged; m_watcher.Deleted += Watcher_FileChanged; m_watcher.Renamed += Watcher_Renamed; } IFileSystemResourceFolder rootDirectory = rootFolder as IFileSystemResourceFolder; if (rootDirectory != null) { m_watcher.Path = rootDirectory.FullPath; m_watcher.EnableRaisingEvents = true; } else { m_watcher.Path = null; m_watcher.EnableRaisingEvents = false; } if (m_treeContext != null) { m_treeContext.SelectionChanged -= TreeSelectionChanged; } m_treeContext = new TreeViewContext(rootFolder); m_treeContext.SelectionChanged += TreeSelectionChanged; m_treeControlAdapter.TreeView = m_treeContext; if (m_listContext != null) { m_listContext.SelectionChanged -= listSelectionContext_SelectionChanged; } m_listContext = new ListViewContext(); m_listContext.SelectionChanged += listSelectionContext_SelectionChanged; m_listViewAdapter.ListView = m_listContext; m_treeControlAdapter.Refresh(rootFolder); }
private void Watcher_Renamed(object sender, RenamedEventArgs e) { var attr = File.GetAttributes(e.FullPath); bool isDirectory = (attr & FileAttributes.Directory) == FileAttributes.Directory; IFileSystemResourceFolder folder = m_treeContext.GetLastSelected <IFileSystemResourceFolder>(); string selectedFolder = folder == null ? string.Empty : GetNormalizedName(folder.FullPath); if (isDirectory) {// m_treeControlAdapter.Refresh(m_treeContext.RootFolder); } else // it is a file { string dirName = Path.GetDirectoryName(e.OldFullPath); dirName = GetNormalizedName(dirName); if (selectedFolder == dirName) { TreeSelectionChanged(m_treeContext, EventArgs.Empty); } } }