private static void Drop([NotNull] object sender, [NotNull] ItemTreeViewItem item, [NotNull] DragEventArgs args)
        {
            Debug.ArgumentNotNull(sender, nameof(sender));
            Debug.ArgumentNotNull(item, nameof(item));
            Debug.ArgumentNotNull(args, nameof(args));

            if (!args.Data.GetDataPresent(@"CF_VSSTGPROJECTITEMS"))
            {
                return;
            }

            var fileName = args.Data.GetData(@"Text") as string ?? string.Empty;

            try
            {
                if (!File.Exists(fileName))
                {
                    return;
                }
            }
            catch
            {
                return;
            }

            var fileItemHandler = FileItemManager.GetFileItemHandler(fileName);

            if (fileItemHandler == null)
            {
                return;
            }

            Project project          = null;
            string  relativeFileName = null;

            foreach (var proj in ProjectManager.Projects)
            {
                relativeFileName = proj.GetRelativeFileName(fileName);
                if (relativeFileName == fileName)
                {
                    continue;
                }

                if (proj.Site != item.ItemUri.Site)
                {
                    continue;
                }

                project = proj;
                break;
            }

            if (project == null)
            {
                return;
            }

            var projectItem = project.GetProjectItem(relativeFileName) as ProjectFileItem;

            if (projectItem != null)
            {
                if (projectItem.Items.Any())
                {
                    return;
                }
            }

            projectItem = ProjectFileItem.Load(project, fileName);
            project.Add(projectItem);
            project.Save();

            var itemPath = Path.Combine(item.GetPath(), Path.GetFileNameWithoutExtension(fileName) ?? string.Empty);

            fileItemHandler.Handle(item.ItemUri.DatabaseName, projectItem, itemPath, (s, e) => item.Refresh());
        }
        public override void Initialize([NotNull] Type type)
        {
            Assert.ArgumentNotNull(type, nameof(type));

            FileItemManager.LoadType(type, this);
        }
        private static void DragOver([NotNull] object sender, [NotNull] ItemTreeViewItem item, [NotNull] DragEventArgs args)
        {
            Debug.ArgumentNotNull(sender, nameof(sender));
            Debug.ArgumentNotNull(item, nameof(item));
            Debug.ArgumentNotNull(args, nameof(args));

            if (!args.Data.GetDataPresent(@"CF_VSSTGPROJECTITEMS"))
            {
                return;
            }

            args.Effects = DragDropEffects.None;

            if ((item.ItemUri.Site.DataService.FeatureCapabilities & DataServiceFeatureCapabilities.Execute) != DataServiceFeatureCapabilities.Execute)
            {
                return;
            }

            var fileName = args.Data.GetData(@"Text") as string ?? string.Empty;

            try
            {
                if (!File.Exists(fileName))
                {
                    return;
                }
            }
            catch
            {
                return;
            }

            var fileItemHandler = FileItemManager.GetFileItemHandler(fileName);

            if (fileItemHandler == null)
            {
                return;
            }

            Project project          = null;
            string  relativeFileName = null;

            foreach (var proj in ProjectManager.Projects)
            {
                relativeFileName = proj.GetRelativeFileName(fileName);
                if (relativeFileName == fileName)
                {
                    continue;
                }

                project = proj;
                break;
            }

            if (project == null)
            {
                return;
            }

            if (project.Site != item.ItemUri.Site)
            {
                return;
            }

            var projectItem = project.GetProjectItem(relativeFileName);

            if (projectItem != null)
            {
                return;
            }

            args.Effects = DragDropEffects.Copy;
        }