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("",
tags[key].Value, key);
break;
case ToolbarItem.SpecialTagWrap:
string[] t = tags[key].Value.Split('|');
sb.AppendFormat("",
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 {
}
}