using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using ScrewTurn.Wiki.PluginFramework; namespace ScrewTurn.Wiki { public partial class Editor : System.Web.UI.UserControl { private PageInfo currentPage = null; private bool inWYSIWYG = false; protected void Page_Load(object sender, EventArgs e) { if(!Page.IsPostBack) { NamespaceInfo currentNamespace = Tools.DetectCurrentNamespaceInfo(); string currentNamespaceName = currentNamespace != null ? currentNamespace.Name + "." : ""; StringBuilder sb = new StringBuilder(200); sb.Append(""); lblStrings.Text = sb.ToString(); if(ViewState["ToolbarVisible"] == null) ViewState["ToolbarVisible"] = true; InitToolbar(); } if(mlvEditor.ActiveViewIndex == 1) inWYSIWYG = true; else inWYSIWYG = false; //SelectTab(0); if(ViewState["Tab"] != null) SelectTab((int)ViewState["Tab"]); LoadSnippets(); PrintCustomSpecialTags(); } private void InitToolbar() { if(!ToolbarVisible) { lblToolbarInit.Text = ""; } else lblToolbarInit.Text = ""; } #region Tabs Management /// /// Gets a value indicating whether the editor is in WikiMarkup mode. /// /// true if the editor is in WikiMarkup mode, false otherwise. public bool IsInWikiMarkup() { // Quick and dirty return btnWikiMarkup.CssClass == "tabbuttonactive"; } /// /// Selects the active tab. /// /// The index of the active tab: /// - 0: WikiMarkup /// - 1: Visual /// - 2: Preview. private void SelectTab(int index) { btnWikiMarkup.CssClass = "tabbutton"; btnVisual.CssClass = "tabbutton"; btnPreview.CssClass = "tabbutton"; mlvEditor.ActiveViewIndex = index; switch(index) { case 0: btnWikiMarkup.CssClass = "tabbuttonactive"; break; case 1: btnVisual.CssClass = "tabbuttonactive"; break; case 2: btnPreview.CssClass = "tabbuttonactive"; break; } ViewState["Tab"] = index; if(SelectedTabChanged != null) SelectedTabChanged(this, new SelectedTabChangedEventArgs()); } /// /// Fired when the selected tab changes. /// public event EventHandler SelectedTabChanged; /// /// Gets or sets a value indicating wherher the Visual tab is enabled. /// public bool VisualVisible { get { return btnVisual.Visible; } set { btnVisual.Visible = value; } } /// /// Gets or sets a value indicating whether the Preview tab is enabled. /// public bool PreviewVisible { get { return btnPreview.Visible; } set { btnPreview.Visible = value; } } /// /// Gets or sets a value indicating whether the toolbar is visible. /// public bool ToolbarVisible { get { return (bool)ViewState["ToolbarVisible"]; } set { ViewState["ToolbarVisible"] = value; InitToolbar(); } } protected void btnWikiMarkup_Click(object sender, EventArgs e) { SelectTab(0); //added for WYSIWYG //if last view was WYSIWYG take text from WYSIWYG to Markup if(inWYSIWYG) txtMarkup.Text = ReverseFormatter.ReverseFormat(lblWYSIWYG.Text); //end } protected void btnVisual_Click(object sender, EventArgs e) { SelectTab(1); //added for WYSIWYG //lblWYSIWYG.Text = FormattingPipeline.FormatWithPhase1And2(txtMarkup.Text, null); string[] links = null; lblWYSIWYG.Text = Formatter.Format(txtMarkup.Text.Replace("<", "<").Replace(">", ">"), false, FormattingContext.Unknown, null, out links, true); //end } protected void btnPreview_Click(object sender, EventArgs e) { SelectTab(2); //added for WYSIWYG //if last view was WYSIWYG take text from WYSIWYG to Preview //in both cases I need to synchronize WYSIWYG and Markup view if(inWYSIWYG) { lblPreview.Text = lblWYSIWYG.Text; txtMarkup.Text = ReverseFormatter.ReverseFormat(lblWYSIWYG.Text); } else { lblPreview.Text = FormattingPipeline.FormatWithPhase3(FormattingPipeline.FormatWithPhase1And2(txtMarkup.Text, false, FormattingContext.Unknown, null), FormattingContext.Unknown, null); //lblWYSIWYG.Text = lblPreview.Text; string[] links = null; lblWYSIWYG.Text = Formatter.Format(txtMarkup.Text, false, FormattingContext.Unknown, null, out links, true); } //end } #endregion #region Menus Management /// /// Prints the custom special tags. /// private void PrintCustomSpecialTags() { Dictionary tags = Host.Instance.CustomSpecialTags; StringBuilder sb = new StringBuilder(100); foreach(string key in tags.Keys) { switch(tags[key].Item) { case ToolbarItem.SpecialTag: sb.AppendFormat("{1}", tags[key].Value, key); break; case ToolbarItem.SpecialTagWrap: string[] t = tags[key].Value.Split('|'); sb.AppendFormat("{2}", t[0], t[1], key); break; } } lblCustomSpecialTags.Text = sb.ToString(); } /// /// Loads and prints the snippets. /// private void LoadSnippets() { StringBuilder sb = new StringBuilder(1000); foreach(Snippet s in Snippets.GetSnippets()) { string[] parameters = Snippets.ExtractParameterNames(s); int paramCount = parameters.Length; string label; if(paramCount == 0) { label = s.Name; sb.AppendFormat(@"{0}", label, s.Name); } else { bool isPositional = IsSnippetPositional(parameters); label = string.Format("{0} ({1} {2})", s.Name, paramCount, Properties.Messages.Parameters); sb.AppendFormat(@"{0}", label, s.Name, isPositional ? "" : "\\r\\n", GetParametersPlaceHolders(parameters, isPositional)); } } if(sb.Length == 0) sb.Append("" + Properties.Messages.NoSnippets + ""); lblSnippets.Text = sb.ToString(); } /// /// Determines whether the parameters of a snippet are positional or not. /// /// The parameters. /// true if the parameters are positional, false otherwise. private static bool IsSnippetPositional(string[] parameters) { int dummy; for(int i = 0; i < parameters.Length; i++) { if(!int.TryParse(parameters[i], out dummy)) return false; if(dummy != i + 1) return false; } return true; } /// /// Gets the placeholder for snippet parameters. /// /// The parameters. /// A value indicating whether the snippet parameters are positional. /// The snippet placeholder/template. private static string GetParametersPlaceHolders(string[] parameters, bool isSnippetPositional) { if(parameters.Length == 0) return ""; else { StringBuilder sb = new StringBuilder(20); foreach(string param in parameters) { if(isSnippetPositional) sb.AppendFormat("|PLACE YOUR VALUE HERE ({0})", param); else sb.AppendFormat("| {0} = PLACE YOUR VALUE HERE\\r\\n", param); } /*for(int i = 1; i <= paramCount; i++) { sb.Append("|P"); sb.Append(i.ToString()); }*/ return sb.ToString(); } } #endregion #region Public I/O /// /// Sets the edited content. /// /// The content. /// true if the visual editor must be used, false otherwise. public void SetContent(string content, bool useVisual) { txtMarkup.Text = content; if(useVisual) btnVisual_Click(this, null); else btnWikiMarkup_Click(this, null); /*if(useVisual) { txtMarkup.Text = content; lblWYSIWYG.Text = content; SelectTab(1); } else { txtMarkup.Text = content; SelectTab(0); }*/ } /// /// Gets the edited content. /// /// The content. public string GetContent() { if(inWYSIWYG) return ReverseFormatter.ReverseFormat(lblWYSIWYG.Text); else return txtMarkup.Text; } /// /// Gets or sets the current Page (if any), i.e. the page that is being edited. /// /// This property is used for enabling the "link attachment" feature in the editor. /// If the current Page is null, the feature is disabled. public PageInfo CurrentPage { get { return currentPage; } set { currentPage = value; } } #endregion } /// /// Contains arguments for the Selected Tab Changed event. /// public class SelectedTabChangedEventArgs : EventArgs { } }