using System; using System.Data; using System.Configuration; using System.Collections; using System.Collections.Generic; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using ScrewTurn.Wiki.PluginFramework; using System.Text; namespace ScrewTurn.Wiki { public partial class PopupWYSIWYG : BasePage { private PageInfo currentPage = null; protected void Page_Load(object sender, EventArgs e) { Literal l = new Literal(); l.Text = Tools.GetIncludes(DetectNamespace()); Page.Header.Controls.AddAt(0, l); if(string.IsNullOrEmpty(Request["Feature"])) return; // Get instance of Current Page, if any if(!string.IsNullOrEmpty(Request["CurrentPage"])) { currentPage = Pages.FindPage(Request["CurrentPage"]); } else currentPage = null; if(!Page.IsPostBack) { // Load FilesStorageProviders IFilesStorageProviderV30[] provs = Collectors.FilesProviderCollector.AllProviders; foreach(IFilesStorageProviderV30 p in provs) { lstProviderFiles.Items.Add(new ListItem(p.Information.Name, p.GetType().FullName)); // Select the default files provider if (p.GetType().FullName == Settings.DefaultFilesProvider) { lstProviderFiles.Items[lstProviderFiles.Items.Count - 1].Selected = true; } lstProviderImages.Items.Add(new ListItem(p.Information.Name, p.GetType().FullName)); // Select the default images provider if (p.GetType().FullName == Settings.DefaultFilesProvider) { lstProviderImages.Items[lstProviderImages.Items.Count - 1].Selected = true; } } // Load namespaces string currentNamespace = DetectNamespace(); if(string.IsNullOrEmpty(currentNamespace)) currentNamespace = ""; lstNamespace.Items.Clear(); lstNamespace.Items.Add(new ListItem("", "")); foreach(NamespaceInfo ns in Pages.GetNamespaces()) { lstNamespace.Items.Add(new ListItem(ns.Name, ns.Name)); } foreach(ListItem itm in lstNamespace.Items) { if(itm.Value == currentNamespace) { itm.Selected = true; break; } } // Enable/disable page attachments feature chkFilesAttachments.Visible = currentPage != null; chkImageAttachments.Visible = currentPage != null; SetupFeature(); } } private string GenerateWindowResizeCode(int width, int height) { return string.Format("window.resizeTo({0}, {1});\r\n", width, height); } private void SetupFeature() { int width = 250, height = 150; string temp = Request["Feature"]; string feature = "", parms = ""; if(temp.Contains("$")) { feature = temp.Substring(0, temp.IndexOf("$")).ToLower(); parms = temp.Substring(temp.IndexOf("$") + 1); } else { feature = temp.ToLower(); } switch(feature) { case "pagelink": mlvPopup.ActiveViewIndex = 0; ctPages.PopulateTree(); width = 300; height = 470; break; case "filelink": mlvPopup.ActiveViewIndex = 1; ctFiles.PopulateTree(); width = 300; height = 510; break; case "externallink": mlvPopup.ActiveViewIndex = 2; width = 310; height = 230; break; case "image": mlvPopup.ActiveViewIndex = 3; cibImages.PopulateBrowser(); width = 640; height = 500; break; case "anchor": mlvPopup.ActiveViewIndex = 4; width = 310; height = 270; // Extract existing anchors from parms string[] anchors = parms.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); lstExistingAnchors.Items.Clear(); foreach(string a in anchors) { lstExistingAnchors.Items.Add(new ListItem(a, a)); } break; } string currentNamespace = DetectNamespace(); if(string.IsNullOrEmpty(currentNamespace)) currentNamespace = ""; StringBuilder sb = new StringBuilder(100); sb.Append("\r\n"); lblStrings.Text = sb.ToString(); } protected void lstNamespace_SelectedIndexChanged(object sender, EventArgs e) { SetupFeature(); } #region PageLink protected List ctPages_Populate(object sender, PopulateEventArgs e) { List result = new List(100); foreach(PageInfo pi in Pages.GetPages(Pages.FindNamespace(lstNamespace.SelectedValue))) { PageContent cont = Content.GetPageContent(pi, true); string formattedTitle = FormattingPipeline.PrepareTitle(cont.Title, false, FormattingContext.Other, pi); string onClickJavascript = "javascript:"; // Populate the page title box if the title is different to the page name if (pi.FullName != cont.Title) { // Supply the page title to the Javascript that sets the page title on the page // We can safely escape the \ character, but the " character is interpreted by the browser even if it is escaped to Javascript, so we can't allow it. // The non-wysiwyg version escapes ' and replaces " with escaped ', but ' breaks the html insertion, so remove it altogether // Similarly, < on it's own is fine, but causes problems when combined with text and > to form a tag. Safest to remove < characters to prevent // breaking the drop-down. onClickJavascript += "SetValue('txtPageTitle', '" + cont.Title.Replace("\\", "\\\\").Replace("'", "").Replace("\"", "").Replace("<", "") + "');"; } else { onClickJavascript += "SetValue('txtPageTitle', '');"; } // Populate the page name onClickJavascript += "return SetValue('txtPageName', '" + pi.FullName + "');"; TreeElement item = new TreeElement(pi.FullName, formattedTitle, onClickJavascript); result.Add(item); } return result; } #endregion #region FileLink protected void chkFilesAttachments_CheckedChanged(object sender, EventArgs e) { ctFiles.PopulateTree(); } protected List ctFiles_Populate(object sender, PopulateEventArgs e) { IFilesStorageProviderV30 p = Collectors.FilesProviderCollector.GetProvider(lstProviderFiles.SelectedValue); return BuildFilesSubTree(p, "/"); } private List BuildFilesSubTree(IFilesStorageProviderV30 provider, string path) { string[] dirs = new string[0]; string[] files = new string[0]; if(chkFilesAttachments.Checked) { // Load page attachments files = provider.ListPageAttachments(currentPage); } else { // Load files dirs = provider.ListDirectories(path); files = provider.ListFiles(path); } List result = new List(100); foreach(string d in dirs) { TreeElement item = new TreeElement(d, Tools.ExtractDirectoryName(d), BuildFilesSubTree(provider, d)); // Do not display empty folders to reduce "noise" if(item.SubItems.Count > 0) { result.Add(item); } } foreach(string f in files) { long size = chkFilesAttachments.Checked ? provider.GetPageAttachmentDetails(currentPage, f).Size : provider.GetFileDetails(f).Size; TreeElement item = new TreeElement(f, f.Substring(f.LastIndexOf("/") + 1) + " (" + Tools.BytesToString(size) + ")", "javascript:return SelectFile('" + (chkFilesAttachments.Checked ? "(" + Tools.UrlEncode(currentPage.FullName) + ")" : "") + "', '" + f.Replace("'", "\\\\\\'") + "');"); result.Add(item); } return result; } protected void lstProviderFiles_SelectedIndexChanged(object sender, EventArgs e) { ctFiles.PopulateTree(); txtFilePath.Text = ""; } #endregion #region Image protected void chkImageAttachments_CheckedChanged(object sender, EventArgs e) { cibImages.PopulateBrowser(); } protected List cibImages_Populate(object sender, PopulateEventArgs e) { IFilesStorageProviderV30 p = Collectors.FilesProviderCollector.GetProvider(lstProviderImages.SelectedValue); return BuildImagesSubTree(p, "/"); } private List BuildImagesSubTree(IFilesStorageProviderV30 provider, string path) { string[] dirs = new string[0]; string[] files = new string[0]; if(chkImageAttachments.Checked) { // Load page attachments files = provider.ListPageAttachments(currentPage); } else { // Load files dirs = provider.ListDirectories(path); files = provider.ListFiles(path); } List result = new List(100); foreach(string d in dirs) { TreeElement item = new TreeElement(d, Tools.ExtractDirectoryName(d), BuildImagesSubTree(provider, d)); // Do not display empty folders to reduce "noise" if(item.SubItems.Count > 0) { result.Add(item); } } foreach(string f in files) { if(IsImage(f)) { string name = provider.GetType().ToString() + "|" + f; TreeElement item = new TreeElement(name, @"" + f.Substring(f.LastIndexOf("/") + 1) + "", "javascript:return SelectImage('" + (chkImageAttachments.Checked ? "(" + Tools.UrlEncode(currentPage.FullName) + ")" : "") + "', '" + f.Replace("'", "\\\\\\'") + "', '" + (chkImageAttachments.Checked ? currentPage.FullName : "") + "');"); result.Add(item); } } return result; } private bool IsImage(string name) { string ext = System.IO.Path.GetExtension(name.ToLower()); return ext == ".jpg" || ext == ".jpeg" || ext == ".gif" || ext == ".png" || ext == ".tif" || ext == ".tiff"; } protected void lstProviderImages_SelectedIndexChanged(object sender, EventArgs e) { cibImages.PopulateBrowser(); txtImagePath.Text = ""; txtImageLink.Text = ""; } #endregion #region Anchor protected void rdoAnchor_CheckedChanged(object sender, EventArgs e) { if(rdoNewAnchor.Checked) { pnlNewAnchor.Visible = true; pnlAnchorLink.Visible = false; } else { pnlNewAnchor.Visible = false; pnlAnchorLink.Visible = true; } } #endregion } }