public static void ProcessTridionItem(MappingInfo mapping, ItemInfo item, TridionFolderInfo folder)
        {
            //todo: nested path

            if (item == null || folder == null)
                return;

            if (!folder.ScanForItems)
                return;

            if (mapping.ProjectFolders.Any(projectFolder => projectFolder.ExistsTcmId(item.TcmId)))
                return;

            if (folder.TridionRole == TridionRole.PageLayoutContainer || folder.TridionRole == TridionRole.ComponentLayoutContainer)
            {
                TemplateBuildingBlockData tridionItem = ReadItem(mapping, item.TcmId) as TemplateBuildingBlockData;
                if (tridionItem == null || tridionItem.VersionInfo.RevisionDate == null)
                    return;

                ShowMessage(item.Title + "...");

                ProjectDestinationDialogWindow dialog = new ProjectDestinationDialogWindow();
                dialog.Mapping = mapping;
                dialog.TridionRole = folder.TridionRole;
                dialog.TridionTcmId = item.TcmId;
                dialog.TridionTitle = item.Title;
                dialog.TridionContent = tridionItem.Content;

                bool res = dialog.ShowDialog() == true;
                if (res)
                {
                    ProjectFolderInfo projectFolder = dialog.ProjectFolder;
                    ProjectFileInfo projectFile = dialog.ProjectFile;

                    if (projectFolder != null && projectFile != null)
                    {
                        string path = projectFile.FullPath;
                        DateTime tridionDate = (DateTime) tridionItem.VersionInfo.RevisionDate;
                        DateTime tridionLocalDate = tridionDate.GetLocalTime(mapping.TimeZoneId);
                        SaveVSItem(path, tridionItem.Content);
                        File.SetAttributes(path, FileAttributes.Normal);
                        File.SetLastWriteTime(path, tridionLocalDate);
                        WriteSuccessLog(path + " - Saved to Visual Studio");
                    }
                }

                ShowMessage(String.Empty);
            }

            if (folder.TridionRole == TridionRole.MultimediaComponentContainer)
            {
                ComponentData tridionItem = GetComponent(mapping, item.TcmId);
                if (tridionItem == null || tridionItem.VersionInfo.RevisionDate == null)
                    return;

                ShowMessage(item.Title + "...");

                ProjectBinaryDestinationDialogWindow dialog = new ProjectBinaryDestinationDialogWindow();
                dialog.Mapping = mapping;
                dialog.TridionTcmId = item.TcmId;
                dialog.TridionTitle = item.Title;

                bool res = dialog.ShowDialog() == true;
                if (res)
                {
                    ProjectFolderInfo projectFolder = dialog.ProjectFolder;
                    ProjectFileInfo projectFile = dialog.ProjectFile;

                    if (projectFolder != null && projectFile != null)
                    {
                        string path = projectFile.FullPath;
                        DateTime tridionDate = (DateTime)tridionItem.VersionInfo.RevisionDate;
                        DateTime tridionLocalDate = tridionDate.GetLocalTime(mapping.TimeZoneId);
                        SaveVSBinaryItem(mapping, projectFile.TcmId, path);
                        File.SetAttributes(path, FileAttributes.Normal);
                        File.SetLastWriteTime(path, tridionLocalDate);
                        WriteSuccessLog(path + " - Saved to Visual Studio successfully");
                    }
                }

                ShowMessage(String.Empty);
            }
        }
        public static void ProcessTridionFolder(MappingInfo mapping, TridionFolderInfo folder)
        {
            if (!folder.ScanForItems || string.IsNullOrEmpty(folder.TcmId) || (folder.TridionRole != TridionRole.PageLayoutContainer && folder.TridionRole != TridionRole.ComponentLayoutContainer))
                return;

            List<ItemInfo> items = GetTbbsByParentFolder(mapping, folder.TcmId);

            foreach (ItemInfo item in items)
            {
                ProcessTridionItem(mapping, item, folder);
            }

            List<ItemInfo> childFolderItems = GetFoldersByParentFolder(mapping, folder.TcmId);

            if (childFolderItems != null && childFolderItems.Count > 0)
            {
                List<TridionFolderInfo> childFolders = childFolderItems.Select(childFolderItem => new TridionFolderInfo { TcmId = childFolderItem.TcmId, TridionRole = folder.TridionRole, ScanForItems = folder.ScanForItems, ParentFolder = folder }).ToList();

                folder.ChildFolders = childFolders;

                foreach (TridionFolderInfo childFolder in childFolders)
                {
                    ProcessTridionFolder(mapping, childFolder);
                }
            }
        }