private FileAggItem[] FetchAutoAggregatedPageFiles(CmsPage aggregatorPage, int aggIdentifier, CmsLanguage aggLang, RenderParameters renderParams, CmsUrlFormat pageLinkUrlFormat, CmsUrlFormat fileLinkUrlFormat)
        {
            CmsPage rootPageToGatherFrom = aggregatorPage;

            if (renderParams.PageIdToGatherFilesFrom >= 0)
            {
                rootPageToGatherFrom = CmsContext.getPageById(renderParams.PageIdToGatherFilesFrom);
            }

            CmsContext.PageGatheringMode gatherMode = CmsContext.PageGatheringMode.ChildPagesOnly;
            if (renderParams.RecursiveGatherFiles)
            {
                gatherMode = CmsContext.PageGatheringMode.FullRecursion;
            }

            List <string> phTypesToSearchFor = new List <string>();

            phTypesToSearchFor.Add("FileLibraryDetails");
            CmsPage[]   pageFilePages = CmsContext.getAllPagesWithPlaceholder("PageFiles", rootPageToGatherFrom, gatherMode);
            PageFilesDb pageFilesDb   = new PageFilesDb();

            PageFilesItemData[] fileItems = pageFilesDb.getPageFilesItemDatas(pageFilePages, aggLang);

            return(FileAggItem.FromPageFilesItemData(fileItems, pageLinkUrlFormat, fileLinkUrlFormat));
        }
        private string handleAssociateExistingSubmit(CmsPage aggPage, int aggIdentifier, CmsLanguage aggLang, string controlId, List <FileAggItem> filesToShow, CmsUrlFormat pageLinkUrlFormat, CmsUrlFormat fileLinkUrlFormat)
        {
            if (PageUtils.getFromForm(controlId + "action", "") != "associateFile")
            {
                return("");
            }

            int     pageIdToAssociate = PageUtils.getFromForm(controlId + "AssociatePageId", -1);
            CmsPage pageToAssociate   = CmsContext.getPageById(pageIdToAssociate);

            if (pageToAssociate.ID >= 0)
            {
                CmsPlaceholderDefinition[] phDefs = pageToAssociate.getPlaceholderDefinitions("FileLibraryDetails");
                foreach (CmsPlaceholderDefinition phDef in phDefs)
                {
                    bool b = new filelibraryaggregator2Db().AssociateDetailsPageWithAggregator(aggPage, aggIdentifier, aggLang, pageToAssociate, phDef.Identifier, aggLang);
                    if (!b)
                    {
                        return(formatErrorMsg("Error: could not add '" + pageToAssociate.Title + "' to this listing: there was a database error"));
                    }
                } // foreach

                List <FileLibraryDetailsData> arr = db.fetchDetailsData(pageToAssociate);

                filesToShow.AddRange(FileAggItem.FromFileLibraryDetailsData(arr.ToArray(), base.categoryList, pageLinkUrlFormat, fileLinkUrlFormat));
            }
            return("");
        }
            public static bool ArrayContainsFile(FileAggItem[] haystack, FileAggItem fileToFind)
            {
                Dictionary <string, FileAggItem> hash = new Dictionary <string, FileAggItem>();

                foreach (FileAggItem f in haystack)
                {
                    hash.Add(f.GetContentHash(), f);
                }

                return(hash.ContainsKey(fileToFind.GetContentHash()));
            }
        public static string RenderToHtmlList(FileAggItem[] uniqueFilesToShow, RenderParameters renderParams, bool canWrite)
        {
            StringBuilder html = new StringBuilder();

            if (uniqueFilesToShow.Length > 0)
            {
                if (renderParams.ListingTitle != "")
                {
                    html.Append("<div class=\"SimpleFileAggregatorHeader\">" + renderParams.ListingTitle + "</div>");
                }

                if (renderParams.ShowByCategory)
                {
                    string[] categories = FileAggItem.GetAllCategoryNames(uniqueFilesToShow);

                    foreach (string fileCat in categories)
                    {
                        FileAggItem[] filesInCat = FileAggItem.GetAllInCategory(uniqueFilesToShow, fileCat);
                        if (filesInCat.Length > 0)
                        {
                            html.Append("<div class=\"SimpleFileAggregatorCategoryHeader\">" + fileCat + "</div>");
                            html.Append("<ul class=\"SimpleFileAggregator\">");
                            filesInCat = FileAggItem.SortFilesByTitle(filesInCat);
                            foreach (FileAggItem fileToShow in filesInCat)
                            {
                                string htmlLink = fileToShow.getHtmlLink(renderParams, canWrite);
                                html.Append("<li>" + htmlLink + "</li>");
                            } // foreach
                            html.Append("</ul>");
                        }
                    } // foreach category
                }
                else
                {
                    // -- non-categorized display
                    FileAggItem[] sortedFilesToShow = FileAggItem.SortFilesByTitle(uniqueFilesToShow);
                    html.Append("<ul class=\"SimpleFileAggregator\">");
                    foreach (FileAggItem fileToShow in sortedFilesToShow)
                    {
                        string htmlLink = fileToShow.getHtmlLink(renderParams, canWrite);
                        html.Append("<li>" + htmlLink + "</li>");
                    } // foreach
                    html.Append("</ul>");
                }     // if not show by category
            }

            return(html.ToString());
        }
        private FileAggItem[] FetchManuallyLinkedFileLibraryDetails(CmsPage aggregatorPage, int aggIdentifier, CmsLanguage aggLang, RenderParameters renderParams, CmsUrlFormat pageLinkUrlFormat, CmsUrlFormat fileLinkUrlFormat)
        {
            List <CmsPage> pages = new List <CmsPage>();

            int[] linkedPageIds = new filelibraryaggregator2Db().FetchPageIdsAssociatedWithPage(aggregatorPage, aggIdentifier, aggLang);
            foreach (int linkedPageId in linkedPageIds)
            {
                if (!CmsPage.ArrayContainsPageId(pages.ToArray(), linkedPageId))
                {
                    pages.Add(CmsContext.getPageById(linkedPageId));
                }
            } // foreach

            List <FileLibraryDetailsData> filesToShow = db.fetchDetailsData(pages.ToArray(), aggLang);

            return(FileAggItem.FromFileLibraryDetailsData(filesToShow.ToArray(), base.categoryList, pageLinkUrlFormat, fileLinkUrlFormat));
        }
        } // FetchAllFilesToShow

        private string renderAssociateExistingForm(CmsPage page, string controlId, CmsLanguage lang, FileAggItem[] filesAlreadyShown, CmsUrlFormat pageLinkUrlFormat, CmsUrlFormat fileLinkUrlFormat)
        {
            // -- find files to show.
            CmsPage[]           allFilePages    = CmsContext.getAllPagesWithPlaceholder("FileLibraryDetails", CmsContext.HomePage, CmsContext.PageGatheringMode.FullRecursion);
            NameValueCollection dropDownOptions = new NameValueCollection();

            dropDownOptions.Add("-1", "-- select an existing file -- ");

            List <FileLibraryDetailsData> allFileDetailsData = db.fetchDetailsData(allFilePages, lang);

            foreach (FileLibraryDetailsData file in allFileDetailsData)
            {
                if (!FileAggItem.ArrayContainsFile(filesAlreadyShown, FileAggItem.FromFileLibraryDetailsData(file, base.categoryList, pageLinkUrlFormat, fileLinkUrlFormat)))
                {
                    CmsPage p = CmsContext.getPageById(file.DetailsPageId);
                    // this page is not already shown, so add it to the drop down
                    dropDownOptions.Add(file.DetailsPageId.ToString(), p.getTitle(lang));
                }
            } // foreach file

            if (dropDownOptions.Keys.Count <= 1)
            {
                return(""); // do not render anything if there aren't any files already shown.
            }
            // Traditional upload
            StringBuilder html = new StringBuilder();

            html.Append("<p>" + EOL);
            string formId = controlId + "associateFileForm";

            html.Append(page.getFormStartHtml(formId) + EOL);
            html.Append("<div>Add an existing file to this display:</div>" + EOL);
            html.Append("<p>" + EOL);
            html.Append(PageUtils.getDropDownHtml(controlId + "AssociatePageId", controlId + "AssociatePageId", dropDownOptions, ""));
            html.Append("</p>" + EOL);

            html.Append("<p>" + EOL);
            html.Append(PageUtils.getHiddenInputHtml(controlId + "action", "associateFile") + EOL);
            html.Append("</p>" + EOL);
            html.Append("<input type=\"submit\" name=\"" + controlId + "FileUpload\" value=\"Add to listing\" />" + EOL);
            html.Append(page.getFormCloseHtml(formId) + EOL);
            html.Append("</p>" + EOL);
            return(html.ToString());
        }
        /// <summary>
        /// Render the placeholder in ViewMode
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="page"></param>
        /// <param name="identifier"></param>
        /// <param name="langToRenderFor"></param>
        /// <param name="paramList"></param>
        public override void RenderInViewMode(HtmlTextWriter writer, CmsPage page, int identifier, CmsLanguage langToRenderFor, string[] paramList)
        {
            base.categoryList = db.fetchCategoryList(langToRenderFor);

            string           controlId    = "simplefileaggregator_" + page.ID.ToString() + "_" + identifier.ToString() + langToRenderFor.shortCode;
            RenderParameters renderParams = RenderParameters.FromPlaceholderParamList(paramList);

            CmsUrlFormat pageLinkFormat = CmsUrlFormat.RelativeToRoot;
            CmsUrlFormat fileLinkFormat = CmsUrlFormat.RelativeToRoot;

            List <FileAggItem> filesToShow = new List <FileAggItem>(FetchAllFilesToShow(page, identifier, langToRenderFor, renderParams, pageLinkFormat, fileLinkFormat));

            StringBuilder html     = new StringBuilder();
            bool          canWrite = page.currentUserCanWrite;

            if (renderFromEditMode) // don't render forms if we are in Edit Mode.
            {
                canWrite = false;
            }

            if (canWrite)
            {
                html.Append("<p>" + handleAssociateExistingSubmit(page, identifier, langToRenderFor, controlId, filesToShow, pageLinkFormat, fileLinkFormat) + "</p>" + EOL);
                html.Append("<p>" + base.handleUploadSubmit(page, identifier, langToRenderFor, controlId) + "</p>" + EOL);
            }

            FileAggItem[] uniqueFilesToShow = FileAggItem.RemoveDuplicates(filesToShow);

            html.Append(RenderToHtmlList(uniqueFilesToShow, renderParams, canWrite));

            if (canWrite)
            {
                html.Append(renderAssociateExistingForm(page, controlId, langToRenderFor, uniqueFilesToShow, pageLinkFormat, fileLinkFormat));
                html.Append(base.renderUploadForm(page, langToRenderFor, controlId));
            }

            // List<FileLibraryDetailsData> filesToDisplay = FileLibraryDetailsData.FetchDetailsDataForPages(pagesToGetDetailsFrom);

            writer.Write(html.ToString());
        }
        private FileAggItem[] FetchAutoAggregatedFileLibraryDetails(CmsPage aggregatorPage, int aggIdentifier, CmsLanguage aggLang, RenderParameters renderParams, CmsUrlFormat pageLinkUrlFormat, CmsUrlFormat fileLinkUrlFormat)
        {
            CmsPage rootPageToGatherFrom = aggregatorPage;

            if (renderParams.PageIdToGatherFilesFrom >= 0)
            {
                rootPageToGatherFrom = CmsContext.getPageById(renderParams.PageIdToGatherFilesFrom);
            }

            CmsContext.PageGatheringMode gatherMode = CmsContext.PageGatheringMode.ChildPagesOnly;
            if (renderParams.RecursiveGatherFiles)
            {
                gatherMode = CmsContext.PageGatheringMode.FullRecursion;
            }

            List <string> phTypesToSearchFor = new List <string>();

            phTypesToSearchFor.Add("FileLibraryDetails");
            CmsPage[] fileDetailsPages = CmsContext.getAllPagesWithPlaceholder("FileLibraryDetails", rootPageToGatherFrom, gatherMode);
            List <FileLibraryDetailsData> filesToShow = db.fetchDetailsData(fileDetailsPages, aggLang);

            return(FileAggItem.FromFileLibraryDetailsData(filesToShow.ToArray(), base.categoryList, pageLinkUrlFormat, fileLinkUrlFormat));
        }
 private static int CompareFilesByTitle(FileAggItem x, FileAggItem y)
 {
     return(string.Compare(x.Title, y.Title));
 }