public RuleEditor(RuleGroup ruleGroup) { InitializeComponent(); _ruleGroup = ruleGroup; }
/// <summary> /// Create a new rule. /// </summary> private void settingsNewRule_Click(object sender, EventArgs e) { RuleGroup newRuleGroup = new RuleGroup { title = "", active = true, type = RuleGroupType.Any, actionCode = RuleActionCodes.Unread | RuleActionCodes.Clear, rule = new[] { new Rule { property = "Subject", value = string.Empty, op = PredicateBuilder.Op.Equals } } }; RuleEditor ruleEditor = new RuleEditor(newRuleGroup); if (ruleEditor.ShowDialog() == DialogResult.OK) { CIX.RuleCollection.AddRule(newRuleGroup); _arrayOfRules = CIX.RuleCollection.AllRules; ReloadRules(0); } }
/// <summary> /// Apply the specified rule group to the message. On completion, the flags /// in the message will be adjusted as per the rule. /// <para> /// The caller must persist both the message and the associated folder back /// to the database if the function returns true since both will likely have /// been altered. /// </para> /// </summary> /// <param name="ruleGroup">Rule group to apply</param> /// <param name="message">CIXMessage to which rule is applied</param> /// <returns>True if the rule changed the message, false otherwise</returns> internal static bool ApplyRule(RuleGroup ruleGroup, CIXMessage message) { bool changed = false; try { Func<CIXMessage, bool> evaluateCriteria = ruleGroup.Criteria.Compile(); if (ruleGroup.active && evaluateCriteria(message)) { bool isUnread = message.Unread; bool isClear = ruleGroup.actionCode.HasFlag(RuleActionCodes.Clear); if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Unread)) { if (!message.ReadLocked) { message.Unread = !isClear; if (isUnread != message.Unread) { message.ReadPending = true; Folder folder = CIX.FolderCollection[message.TopicID]; folder.Unread += message.Unread ? 1 : -1; if (folder.Unread < 0) { folder.Unread = 0; } if (message.Priority) { folder.UnreadPriority += message.Unread ? 1 : -1; if (folder.UnreadPriority < 0) { folder.UnreadPriority = 0; } } folder.MarkReadRangePending = !message.IsPseudo; changed = true; } } } if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Priority)) { bool oldPriority = message.Priority; message.Priority = !isClear; changed = message.Priority != oldPriority; if (changed && message.Unread) { Folder folder = CIX.FolderCollection[message.TopicID]; folder.UnreadPriority += message.Priority ? 1 : -1; if (folder.UnreadPriority < 0) { folder.UnreadPriority = 0; } } } if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Ignored)) { message.Ignored = !isClear; if (message.Ignored && message.Unread) { message.Unread = false; message.ReadPending = true; Folder folder = CIX.FolderCollection[message.TopicID]; folder.Unread -= 1; if (message.Priority) { folder.UnreadPriority -= 1; if (folder.UnreadPriority < 0) { folder.UnreadPriority = 0; } } folder.MarkReadRangePending = true; changed = true; } } if (ruleGroup.actionCode.HasFlag(RuleActionCodes.Flag)) { bool oldStarred = message.Starred; message.Starred = !isClear; if (oldStarred != message.Starred) { message.StarPending = true; changed = true; } } } } catch (Exception e) { LogFile.WriteLine("Error: Exception processing rule \"{0}\" : {1}", ruleGroup.title, e.Message); } return changed; }
/// <summary> /// Delete the specified rule. /// </summary> /// <param name="ruleGroup">Rule to remove</param> public void DeleteRule(RuleGroup ruleGroup) { ruleGroups.Remove(ruleGroup); }
/// <summary> /// Add name to the block list if it is not already present. /// </summary> /// <param name="name">Name of user to block</param> public void Block(string name) { // ReSharper disable once LoopCanBeConvertedToQuery foreach (RuleGroup ruleGroup in ruleGroups) { if (ruleGroup.rule.Any(rule => rule.property == "Author" && rule.value.ToString() == name)) { return; } } RuleGroup newRuleGroup = new RuleGroup { type = RuleGroupType.Any, title = string.Format(Resources.BlockFrom, name), active = true, actionCode = RuleActionCodes.Unread | RuleActionCodes.Clear, rule = new[] { new Rule { property = "Author", value = name, op = PredicateBuilder.Op.Equals } } }; AddRule(newRuleGroup); FolderCollection.ApplyRules(newRuleGroup); }
/// <summary> /// Add the specified rule group to the collection. /// </summary> /// <param name="newRuleGroup">The RuleGroup to add to the collection</param> public void AddRule(RuleGroup newRuleGroup) { ruleGroups.Add(newRuleGroup); CompileRules(); Save(); }