Ejemplo n.º 1
0
        /// <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();
                }
            }
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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();
                }
            }
        }
Ejemplo n.º 4
0
        /// <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();
                }
            }
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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
            }
        }
Ejemplo n.º 7
0
        /// <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);
        }
Ejemplo n.º 8
0
        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);
                }
            }
        }