#region Using using System; using System.IO; using System.Xml; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using BlogEngine.Core; #endregion public partial class admin_Pages_blogroll : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindSettings(); BindBlogroll(); } btnSaveSettings.Text = Resources.labels.save + " " + Resources.labels.settings.ToLowerInvariant(); btnSave.Click += new EventHandler(btnSave_Click); btnSaveSettings.Click += new EventHandler(btnSaveSettings_Click); Page.Title = Resources.labels.blogroll; btnSave.Text = Resources.labels.add; } #region Event handlers private void btnSaveSettings_Click(object sender, EventArgs e) { BlogSettings.Instance.BlogrollMaxLength = int.Parse(txtMaxLength.Text); BlogSettings.Instance.BlogrollVisiblePosts = int.Parse(ddlVisiblePosts.SelectedValue); BlogSettings.Instance.BlogrollUpdateMinutes = int.Parse(txtUpdateFrequency.Text); BlogSettings.Instance.Save(); Response.Redirect(Request.FilePath, true); } private void btnSave_Click(object sender, EventArgs e) { Page.Validate(); // manually invoke validation to be sure it fires. if (!Page.IsValid) return; AddBlog(); Response.Redirect(Request.FilePath, true); } #endregion #region Methods private void BindBlogroll() { grid.DataKeyNames = new string[] { "Id" }; grid.DataSource = BlogRollItem.BlogRolls; grid.DataBind(); } protected void validateWebUrl(object sender, ServerValidateEventArgs args) { args.IsValid = validateUrl(txtWebUrl.Text.Trim()); } protected void validateFeedUrl(object sender, ServerValidateEventArgs args) { args.IsValid = validateUrl(txtFeedUrl.Text.Trim()); } private bool validateUrl(string url) { if (!string.IsNullOrEmpty(url)) { Uri uri; return Uri.TryCreate(getUrl(url), UriKind.Absolute, out uri); } return true; } private string getUrl(string url) { if (!string.IsNullOrEmpty(url) && !url.Contains("://")) url = "http://" + url; return url; } private void AddBlog() { BlogRollItem br = new BlogRollItem(); br.Title = txtTitle.Text.Replace(@"\", "'"); br.Description = txtDescription.Text; br.BlogUrl = new Uri(getUrl(txtWebUrl.Text)); br.FeedUrl = new Uri(getUrl(txtFeedUrl.Text)); br.Xfn = string.Empty; foreach (ListItem item in cblXfn.Items) { if (item.Selected) br.Xfn += item.Text + " "; } if (br.Xfn.Length > 0) { br.Xfn = br.Xfn.Substring(0, br.Xfn.Length - 1); } int largestSortIndex = -1; foreach (BlogRollItem brExisting in BlogRollItem.BlogRolls) { if (brExisting.SortIndex > largestSortIndex) largestSortIndex = brExisting.SortIndex; } br.SortIndex = largestSortIndex + 1; br.Save(); } private void BindSettings() { txtMaxLength.Text = BlogSettings.Instance.BlogrollMaxLength.ToString(); ddlVisiblePosts.SelectedIndex = BlogSettings.Instance.BlogrollVisiblePosts; txtUpdateFrequency.Text = BlogSettings.Instance.BlogrollUpdateMinutes.ToString(); } #endregion protected void grid_RowCommand(object sender, GridViewCommandEventArgs e) { // Don't want to handle Edit and Delete commands. if (!(e.CommandName.Equals("moveUp", StringComparison.OrdinalIgnoreCase) || e.CommandName.Equals("moveDown", StringComparison.OrdinalIgnoreCase))) return; // If only one item in grid, there's nothing to adjust. if (grid.Rows.Count < 2) return; bool moveUp = e.CommandName.Equals("moveUp", StringComparison.OrdinalIgnoreCase); int rowIndex = Convert.ToInt32(e.CommandArgument); // If already at the top, can't move any higher. if (moveUp && rowIndex == 0) return; // If already at the bottom, can't move any lower. if (!moveUp && rowIndex == (grid.Rows.Count - 1)) return; Guid id = (Guid)grid.DataKeys[rowIndex].Value; BlogRollItem brToMove = BlogRollItem.GetBlogRollItem(id); Guid swapPositionWithId = (Guid)grid.DataKeys[rowIndex + (moveUp ? -1 : 1)].Value; BlogRollItem brToSwapPositionWith = BlogRollItem.GetBlogRollItem(swapPositionWithId); if (brToMove != null && brToSwapPositionWith != null) { int newSortIndex = brToSwapPositionWith.SortIndex; brToSwapPositionWith.SortIndex = brToMove.SortIndex; brToMove.SortIndex = newSortIndex; brToSwapPositionWith.Save(); brToMove.Save(); BlogRollItem.BlogRolls.Sort(); Response.Redirect(Request.RawUrl); } } protected void grid_RowDeleting(object sender, GridViewDeleteEventArgs e) { Guid id = (Guid)grid.DataKeys[e.RowIndex].Value; BlogRollItem br = BlogRollItem.GetBlogRollItem(id); br.Delete(); br.Save(); int sortIndex = -1; // Re-sort remaining items starting from zero to eliminate any possible gaps. // Need to cast BlogRollItem.BlogRolls to an array to // prevent errors with modifying a collection while enumerating it. foreach (BlogRollItem brItem in BlogRollItem.BlogRolls.ToArray()) { brItem.SortIndex = ++sortIndex; brItem.Save(); } Response.Redirect(Request.RawUrl); } }