public void MatchAndExcludeTest() { var filter = new PostFilterRule { FilterName = "hogehoge", ExFilterSource = "tetete" }; var post = new PostClass { ScreenName = "hogehoge", Source = "tetete" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); }
public void ExcludeOnlyTest() { var filter = new PostFilterRule { ExFilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void EmptyRuleTest() { var filter = new PostFilterRule { }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); }
public void MatchOnlyTest() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); }
public void AddFilter_Test() { var tab = new TabClass(); var filter = new PostFilterRule(); tab.AddFilter(filter); Assert.Equal(new[] { filter }, tab.FilterArray); Assert.True(tab.FilterModified); }
public void RemoveFilter_Test() { var tab = new TabClass(); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.FilterModified = false; tab.RemoveFilter(filter); Assert.Empty(tab.FilterArray); Assert.True(tab.FilterModified); }
public void OnFilterModified_Test() { var tab = new TabClass(); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.FilterModified = false; // TabClass に紐付いているフィルタを変更 filter.FilterSource = "OpenTween"; Assert.True(tab.FilterModified); }
public void OnFilterModified_DetachedTest() { var tab = new TabClass(); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.RemoveFilter(filter); tab.FilterModified = false; // TabClass から既に削除されたフィルタを変更 filter.FilterSource = "OpenTween"; Assert.False(tab.FilterModified); }
public void NullTest() { var filter = new PostFilterRule { FilterName = null, FilterSource = null, ExFilterName = null, ExFilterSource = null, }; var post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); Assert.Throws<ArgumentNullException>(() => filter.FilterBody = null); Assert.Throws<ArgumentNullException>(() => filter.ExFilterBody = null); }
public void FieldNullAwareTest() { var nullPost = new PostClass { Source = null }; // Source が null であっても ArgumentNullException 等を投げない var filter1 = new PostFilterRule { FilterSource = "(hoge){2}", UseRegex = true, }; Assert.Equal(MyCommon.HITRESULT.None, filter1.ExecFilter(nullPost)); // null は空文字列と同じ扱いにする var filter2 = new PostFilterRule { FilterSource = "^$", UseRegex = true, }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter2.ExecFilter(nullPost)); }
public void RemoveFilter(PostFilterRule filter) { lock (this._lockObj) { _filters.Remove(filter); filter.PropertyChanged -= this.OnFilterModified; this.FilterModified = true; } }
public void FilterName_Test() { var filter = new PostFilterRule(); PostClass post; filter.FilterName = "hogehoge"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // FilterName は完全一致 (UseRegex = false の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.CaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.CaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.CopyAndMark, filter.ExecFilter(post)); }
public void SetProperty_Test() { var filter = new PostFilterRule(); string changedPropeyty = null; filter.PropertyChanged += (_, x) => changedPropeyty = x.PropertyName; filter.FilterName = "hogehoge"; Assert.Equal("FilterName", changedPropeyty); Assert.True(filter.IsDirty); }
public void Equals_Test() { var filter1 = new PostFilterRule { FilterName = "name", FilterBody = new[] { "body" }, FilterSource = "source", ExFilterName = "nameEx", ExFilterBody = new[] { "bodyEx" }, ExFilterSource = "sourceEx", }; var filter2 = new PostFilterRule { FilterName = "name", FilterBody = new[] { "body" }, FilterSource = "source", ExFilterName = "nameEx", ExFilterBody = new[] { "bodyEx" }, ExFilterSource = "sourceEx", }; Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }
private void ButtonOK_Click(object sender, EventArgs e) { bool isBlankMatch = false; bool isBlankExclude = false; //入力チェック if (!CheckMatchRule(out isBlankMatch) || !CheckExcludeRule(out isBlankExclude)) { return; } if (isBlankMatch && isBlankExclude) { MessageBox.Show(Properties.Resources.ButtonOK_ClickText1, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } int i = ListFilters.SelectedIndex; PostFilterRule ft; if (_mode == EDITMODE.AddNew) { ft = new PostFilterRule(); } else { ft = (PostFilterRule)this.ListFilters.SelectedItem; } ft.MoveMatches = OptMove.Checked; ft.MarkMatches = CheckMark.Checked; string bdy = ""; if (RadioAND.Checked) { ft.FilterName = UID.Text; TweenMain owner = (TweenMain)this.Owner; int cnt = owner.AtIdSupl.ItemCount; owner.AtIdSupl.AddItem("@" + ft.FilterName); if (cnt != owner.AtIdSupl.ItemCount) { owner.ModifySettingAtId = true; } ft.UseNameField = true; bdy = MSG1.Text; } else { ft.FilterName = ""; ft.UseNameField = false; bdy = MSG2.Text; } ft.FilterSource = TextSource.Text; if (CheckRegex.Checked || CheckLambda.Checked) { ft.FilterBody = new[] { bdy }; } else { ft.FilterBody = bdy.Split(' ', ' ') .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); } ft.UseRegex = CheckRegex.Checked; ft.FilterByUrl = CheckURL.Checked; ft.CaseSensitive = CheckCaseSensitive.Checked; ft.FilterRt = CheckRetweet.Checked; ft.UseLambda = CheckLambda.Checked; bdy = ""; if (RadioExAnd.Checked) { ft.ExFilterName = ExUID.Text; ft.ExUseNameField = true; bdy = ExMSG1.Text; } else { ft.ExFilterName = ""; ft.ExUseNameField = false; bdy = ExMSG2.Text; } ft.ExFilterSource = TextExSource.Text; if (CheckExRegex.Checked || CheckExLambDa.Checked) { ft.ExFilterBody = new[] { bdy }; } else { ft.ExFilterBody = bdy.Split(' ', ' ') .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); } ft.ExUseRegex = CheckExRegex.Checked; ft.ExFilterByUrl = CheckExURL.Checked; ft.ExCaseSensitive = CheckExCaseSensitive.Checked; ft.ExFilterRt = CheckExRetweet.Checked; ft.ExUseLambda = CheckExLambDa.Checked; if (_mode == EDITMODE.AddNew) { if (!_sts.Tabs[ListTabs.SelectedItem.ToString()].AddFilter(ft)) { MessageBox.Show(Properties.Resources.ButtonOK_ClickText4, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Error); } } SetFilters(ListTabs.SelectedItem.ToString()); ListFilters.SelectedIndex = -1; if (_mode == EDITMODE.AddNew) { ListFilters.SelectedIndex = ListFilters.Items.Count - 1; } else { ListFilters.SelectedIndex = i; } _mode = EDITMODE.None; if (_directAdd) { this.Close(); } }
public void ExFilterBodyAndName_RegexTest() { var filter = new PostFilterRule(); PostClass post; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が TextFromApi と ScreenName の両方になる filter.ExUseNameField = false; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { ScreenName = "hoge", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // TextFromApi に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi と RetweetedBy に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", TextFromApi = "bbb", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", TextFromApi = "bbb", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しても部分一致 (ExUseRegex = true の場合) post = new PostClass { ScreenName = "_aaa_", TextFromApi = "bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // TextFromApi に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", TextFromApi = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", TextFromApi = "Bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", TextFromApi = "Bbb", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void ExFilterBody_ByUrlRegexTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { Text = "<a href='http://example.com/AaaBbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void ExFilterBody_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.ExUseRegex = true; filter.ExFilterBody = new[] { "a{3}", "b{3}" }; post = new PostClass { TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 片方だけではマッチしない post = new PostClass { TextFromApi = "aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の文字列が全て含まれている post = new PostClass { TextFromApi = "123aaa456bbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName にはマッチしない (ExUseNameField = true の場合) post = new PostClass { ScreenName = "aaabbb", TextFromApi = "test" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { TextFromApi = "AaaBbb" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public void Disabled_Test() { var filter = new PostFilterRule { FilterName = "hogehoge" }; var post = new PostClass { ScreenName = "hogehoge" }; filter.Enabled = false; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); }
public void ExFilterName_RegexTest() { var filter = new PostFilterRule(); PostClass post; filter.ExUseRegex = true; filter.ExFilterName = "(hoge){2}"; post = new PostClass { ScreenName = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は RetweetedBy にもマッチする post = new PostClass { ScreenName = "foo", RetweetedBy = "hogehoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "foo", RetweetedBy = "bar" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterName は部分一致 (ExUseRegex = true の場合) post = new PostClass { ScreenName = "_hogehoge_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "HogeHoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
public bool AddFilter(PostFilterRule filter) { lock (this._lockObj) { if (_filters.Contains(filter)) return false; filter.PropertyChanged += this.OnFilterModified; _filters.Add(filter); this.FilterModified = true; return true; } }
public void ExFilterBodyAndName_ByUrlTest() { var filter = new PostFilterRule(); PostClass post; // ExFilterByUrl = true の場合は TextFromApi ではなく Text がマッチ対象になる filter.ExFilterByUrl = true; // ExUseNameField = false の場合は ExFilterBody のマッチ対象が Text と ScreenName の両方になる filter.ExUseNameField = false; filter.ExFilterBody = new[] { "aaa", "bbb" }; post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaa'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // ExFilterBody の片方だけではマッチしない post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/123'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に ExFilterBody の文字列が全て含まれている post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/aaabbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // Text と ScreenName に ExFilterBody の文字列がそれぞれ含まれている post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // RetweetedBy が null でなくても依然として ScreenName にはマッチする post = new PostClass { ScreenName = "aaa", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>", RetweetedBy = "hoge" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // ScreenName に対しては完全一致 (ExUseRegex = false の場合) post = new PostClass { ScreenName = "_aaa_", Text = "<a href='http://example.com/bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // Text に対しては ExUseRegex に関わらず常に部分一致 post = new PostClass { ScreenName = "aaa", Text = "_bbb_" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); // 大小文字を区別する filter.ExCaseSensitive = true; post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.None, filter.ExecFilter(post)); // 大小文字を区別しない filter.ExCaseSensitive = false; post = new PostClass { ScreenName = "Aaa", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); post = new PostClass { ScreenName = "hoge", Text = "<a href='http://example.com/Bbb'>t.co/hoge</a>", RetweetedBy = "Aaa" }; Assert.Equal(MyCommon.HITRESULT.Exclude, filter.ExecFilter(post)); }
private void ShowDetail() { if (_directAdd) { return; } if (ListFilters.SelectedIndex > -1) { PostFilterRule fc = (PostFilterRule)ListFilters.SelectedItem; if (fc.UseNameField) { RadioAND.Checked = true; RadioPLUS.Checked = false; UID.Enabled = true; MSG1.Enabled = true; MSG2.Enabled = false; UID.Text = fc.FilterName; UID.SelectAll(); MSG1.Text = string.Join(" ", fc.FilterBody); MSG1.SelectAll(); MSG2.Text = ""; } else { RadioPLUS.Checked = true; RadioAND.Checked = false; UID.Enabled = false; MSG1.Enabled = false; MSG2.Enabled = true; UID.Text = ""; MSG1.Text = ""; MSG2.Text = string.Join(" ", fc.FilterBody); MSG2.SelectAll(); } TextSource.Text = fc.FilterSource; CheckRegex.Checked = fc.UseRegex; CheckURL.Checked = fc.FilterByUrl; CheckCaseSensitive.Checked = fc.CaseSensitive; CheckRetweet.Checked = fc.FilterRt; CheckLambda.Checked = fc.UseLambda; if (fc.ExUseNameField) { RadioExAnd.Checked = true; RadioExPLUS.Checked = false; ExUID.Enabled = true; ExMSG1.Enabled = true; ExMSG2.Enabled = false; ExUID.Text = fc.ExFilterName; ExUID.SelectAll(); ExMSG1.Text = string.Join(" ", fc.ExFilterBody); ExMSG1.SelectAll(); ExMSG2.Text = ""; } else { RadioExPLUS.Checked = true; RadioExAnd.Checked = false; ExUID.Enabled = false; ExMSG1.Enabled = false; ExMSG2.Enabled = true; ExUID.Text = ""; ExMSG1.Text = ""; ExMSG2.Text = string.Join(" ", fc.ExFilterBody); ExMSG2.SelectAll(); } TextExSource.Text = fc.ExFilterSource; CheckExRegex.Checked = fc.ExUseRegex; CheckExURL.Checked = fc.ExFilterByUrl; CheckExCaseSensitive.Checked = fc.ExCaseSensitive; CheckExRetweet.Checked = fc.ExFilterRt; CheckExLambDa.Checked = fc.ExUseLambda; if (fc.MoveMatches) { OptMove.Checked = true; } else { OptCopy.Checked = true; } CheckMark.Checked = fc.MarkMatches; ButtonEdit.Enabled = true; ButtonDelete.Enabled = true; ButtonRuleUp.Enabled = true; ButtonRuleDown.Enabled = true; ButtonRuleCopy.Enabled = true; ButtonRuleMove.Enabled = true; } else { RadioAND.Checked = true; RadioPLUS.Checked = false; UID.Enabled = true; MSG1.Enabled = true; MSG2.Enabled = false; UID.Text = ""; MSG1.Text = ""; MSG2.Text = ""; TextSource.Text = ""; CheckRegex.Checked = false; CheckURL.Checked = false; CheckCaseSensitive.Checked = false; CheckRetweet.Checked = false; CheckLambda.Checked = false; RadioExAnd.Checked = true; RadioExPLUS.Checked = false; ExUID.Enabled = true; ExMSG1.Enabled = true; ExMSG2.Enabled = false; ExUID.Text = ""; ExMSG1.Text = ""; ExMSG2.Text = ""; TextExSource.Text = ""; CheckExRegex.Checked = false; CheckExURL.Checked = false; CheckExCaseSensitive.Checked = false; CheckExRetweet.Checked = false; CheckExLambDa.Checked = false; OptCopy.Checked = true; CheckMark.Checked = true; ButtonEdit.Enabled = false; ButtonDelete.Enabled = false; ButtonRuleUp.Enabled = false; ButtonRuleDown.Enabled = false; ButtonRuleCopy.Enabled = false; ButtonRuleMove.Enabled = false; } }
public void Equals_HasNoMatchConditionsTest() { var filter1 = new PostFilterRule { // マッチ条件 FilterName = "", CaseSensitive = true, // 除外条件 ExFilterName = "nameEx", }; var filter2 = new PostFilterRule { FilterName = "", CaseSensitive = false, ExFilterName = "nameEx", }; // マッチ条件 (≠除外条件) が無いので CaseSensitive 等の差異は無視する Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }
private void ButtonOK_Click(object sender, EventArgs e) { bool isBlankMatch = false; bool isBlankExclude = false; //入力チェック if (!CheckMatchRule(out isBlankMatch) || !CheckExcludeRule(out isBlankExclude)) { return; } if (isBlankMatch && isBlankExclude) { MessageBox.Show(Properties.Resources.ButtonOK_ClickText1, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } int i = ListFilters.SelectedIndex; PostFilterRule ft; ft = new PostFilterRule(); ft.MoveMatches = OptMove.Checked; ft.MarkMatches = CheckMark.Checked; string bdy = ""; if (RadioAND.Checked) { ft.FilterName = UID.Text; TweenMain owner = (TweenMain)this.Owner; int cnt = owner.AtIdSupl.ItemCount; owner.AtIdSupl.AddItem("@" + ft.FilterName); if (cnt != owner.AtIdSupl.ItemCount) { owner.ModifySettingAtId = true; } ft.UseNameField = true; bdy = MSG1.Text; } else { ft.FilterName = ""; ft.UseNameField = false; bdy = MSG2.Text; } ft.FilterSource = TextSource.Text; if (CheckRegex.Checked || CheckLambda.Checked) { ft.FilterBody = new[] { bdy }; } else { ft.FilterBody = bdy.Split(' ', ' ') .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); } ft.UseRegex = CheckRegex.Checked; ft.FilterByUrl = CheckURL.Checked; ft.CaseSensitive = CheckCaseSensitive.Checked; ft.FilterRt = CheckRetweet.Checked; ft.UseLambda = CheckLambda.Checked; bdy = ""; if (RadioExAnd.Checked) { ft.ExFilterName = ExUID.Text; ft.ExUseNameField = true; bdy = ExMSG1.Text; } else { ft.ExFilterName = ""; ft.ExUseNameField = false; bdy = ExMSG2.Text; } ft.ExFilterSource = TextExSource.Text; if (CheckExRegex.Checked || CheckExLambDa.Checked) { ft.ExFilterBody = new[] { bdy }; } else { ft.ExFilterBody = bdy.Split(' ', ' ') .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); } ft.ExUseRegex = CheckExRegex.Checked; ft.ExFilterByUrl = CheckExURL.Checked; ft.ExCaseSensitive = CheckExCaseSensitive.Checked; ft.ExFilterRt = CheckExRetweet.Checked; ft.ExUseLambda = CheckExLambDa.Checked; if (_mode == EDITMODE.AddNew) { if (!_sts.Tabs[ListTabs.SelectedItem.ToString()].AddFilter(ft)) MessageBox.Show(Properties.Resources.ButtonOK_ClickText4, Properties.Resources.ButtonOK_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Error); } else { _sts.Tabs[ListTabs.SelectedItem.ToString()].EditFilter((PostFilterRule)ListFilters.SelectedItem, ft); } SetFilters(ListTabs.SelectedItem.ToString()); ListFilters.SelectedIndex = -1; if (_mode == EDITMODE.AddNew) { ListFilters.SelectedIndex = ListFilters.Items.Count - 1; } else { ListFilters.SelectedIndex = i; } _mode = EDITMODE.None; if (_directAdd) { this.Close(); } }
private void IDRuleMenuItem_Click(object sender, EventArgs e) { string tabName; //未選択なら処理終了 if (_curList.SelectedIndices.Count == 0) return; //タブ選択(or追加) if (!SelectTab(out tabName)) return; bool mv = false; bool mk = false; MoveOrCopy(ref mv, ref mk); List<string> ids = new List<string>(); foreach (int idx in _curList.SelectedIndices) { PostClass post = _statuses[_curTab.Text, idx]; if (!ids.Contains(post.ScreenName)) { PostFilterRule fc = new PostFilterRule(); ids.Add(post.ScreenName); if (post.RetweetedId == null) { fc.FilterName = post.ScreenName; } else { fc.FilterName = post.RetweetedBy; } fc.UseNameField = true; fc.MoveMatches = mv; fc.MarkMatches = mk; fc.UseRegex = false; fc.FilterByUrl = false; _statuses.Tabs[tabName].AddFilter(fc); } } if (ids.Count != 0) { List<string> atids = new List<string>(); foreach (string id in ids) { atids.Add("@" + id); } int cnt = AtIdSupl.ItemCount; AtIdSupl.AddRangeItem(atids.ToArray()); if (AtIdSupl.ItemCount != cnt) _modifySettingAtId = true; } try { this.Cursor = Cursors.WaitCursor; this.PurgeListViewItemCache(); _curPost = null; _curItemIndex = -1; _statuses.FilterAll(); foreach (TabPage tb in ListTab.TabPages) { ((DetailsListView)tb.Tag).VirtualListSize = _statuses.Tabs[tb.Text].AllCount; if (_statuses.ContainsTab(tb.Text)) { if (_statuses.Tabs[tb.Text].UnreadCount > 0) { if (SettingDialog.TabIconDisp) tb.ImageIndex = 0; } else { if (SettingDialog.TabIconDisp) tb.ImageIndex = -1; } } } if (!SettingDialog.TabIconDisp) ListTab.Refresh(); } finally { this.Cursor = Cursors.Default; } SaveConfigsTabs(); }
private void IdFilterAddMenuItem_Click(object sender, EventArgs e) { string name = GetUserId(); if (name != null) { string tabName; //未選択なら処理終了 if (_curList.SelectedIndices.Count == 0) return; //タブ選択(or追加) if (!SelectTab(out tabName)) return; bool mv = false; bool mk = false; MoveOrCopy(ref mv, ref mk); PostFilterRule fc = new PostFilterRule(); fc.FilterName = name; fc.UseNameField = true; fc.MoveMatches = mv; fc.MarkMatches = mk; fc.UseRegex = false; fc.FilterByUrl = false; _statuses.Tabs[tabName].AddFilter(fc); this.ApplyPostFilters(); SaveConfigsTabs(); } }
/// <summary> /// 検索ダイアログを表示し、検索を実行します /// </summary> private void ShowSearchDialog() { // Recentタブの検索時以外では「新規タブに表示」ボタンを無効化する if (this._statuses.Tabs[this._curTab.Text].TabType == MyCommon.TabUsageType.Home) this.SearchDialog.DisableNewTabButton = false; else this.SearchDialog.DisableNewTabButton = true; if (this.SearchDialog.ShowDialog(this) != DialogResult.OK) { this.TopMost = this._cfgCommon.AlwaysTop; return; } this.TopMost = this._cfgCommon.AlwaysTop; var searchOptions = this.SearchDialog.ResultOptions; if (searchOptions.Type == SearchWordDialog.SearchType.Timeline) { if (searchOptions.NewTab) { var tabName = searchOptions.Query; try { tabName = this._statuses.MakeTabName(tabName); } catch (TabException ex) { MessageBox.Show(this, ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } this.AddNewTab(tabName, false, MyCommon.TabUsageType.UserDefined); this._statuses.AddTab(tabName, MyCommon.TabUsageType.UserDefined, null); var filter = new PostFilterRule { FilterBody = new[] { searchOptions.Query }, UseRegex = searchOptions.UseRegex, CaseSensitive = searchOptions.CaseSensitive, }; this._statuses.Tabs[tabName].AddFilter(filter); var tabPage = this.ListTab.TabPages.Cast<TabPage>() .First(x => x.Text == tabName); this.ListTab.SelectedTab = tabPage; this.ListTabSelect(tabPage); this.ApplyPostFilters(); this.SaveConfigsTabs(); } else { this.DoTabSearch( searchOptions.Query, searchOptions.CaseSensitive, searchOptions.UseRegex, SEARCHTYPE.DialogSearch); } } else if (searchOptions.Type == SearchWordDialog.SearchType.Public) { this.AddNewTabForSearch(searchOptions.Query); } }
public void SetProperty_SameValueTest() { var filter = new PostFilterRule(); filter.FilterName = "hogehoge"; filter.Compile(); string changedPropeyty = null; // 値に変化がないので PropertyChanged イベントは発生しない filter.PropertyChanged += (_, x) => changedPropeyty = x.PropertyName; filter.FilterName = "hogehoge"; Assert.Null(changedPropeyty); Assert.False(filter.IsDirty); }
private void IDRuleMenuItem_Click(object sender, EventArgs e) { string tabName; //未選択なら処理終了 if (_curList.SelectedIndices.Count == 0) return; //タブ選択(or追加) if (!SelectTab(out tabName)) return; bool mv = false; bool mk = false; MoveOrCopy(ref mv, ref mk); List<string> ids = new List<string>(); foreach (int idx in _curList.SelectedIndices) { PostClass post = _statuses[_curTab.Text, idx]; if (!ids.Contains(post.ScreenName)) { PostFilterRule fc = new PostFilterRule(); ids.Add(post.ScreenName); if (post.RetweetedId == null) { fc.FilterName = post.ScreenName; } else { fc.FilterName = post.RetweetedBy; } fc.UseNameField = true; fc.MoveMatches = mv; fc.MarkMatches = mk; fc.UseRegex = false; fc.FilterByUrl = false; _statuses.Tabs[tabName].AddFilter(fc); } } if (ids.Count != 0) { List<string> atids = new List<string>(); foreach (string id in ids) { atids.Add("@" + id); } int cnt = AtIdSupl.ItemCount; AtIdSupl.AddRangeItem(atids.ToArray()); if (AtIdSupl.ItemCount != cnt) _modifySettingAtId = true; } this.ApplyPostFilters(); SaveConfigsTabs(); }
private void IdFilterAddMenuItem_Click(object sender, EventArgs e) { string name = GetUserId(); if (name != null) { string tabName; //未選択なら処理終了 if (_curList.SelectedIndices.Count == 0) return; //タブ選択(or追加) if (!SelectTab(out tabName)) return; bool mv = false; bool mk = false; MoveOrCopy(ref mv, ref mk); PostFilterRule fc = new PostFilterRule(); fc.FilterName = name; fc.UseNameField = true; fc.MoveMatches = mv; fc.MarkMatches = mk; fc.UseRegex = false; fc.FilterByUrl = false; _statuses.Tabs[tabName].AddFilter(fc); try { this.Cursor = Cursors.WaitCursor; this.PurgeListViewItemCache(); _curPost = null; _curItemIndex = -1; _statuses.FilterAll(); foreach (TabPage tb in ListTab.TabPages) { ((DetailsListView)tb.Tag).VirtualListSize = _statuses.Tabs[tb.Text].AllCount; if (_statuses.Tabs[tb.Text].UnreadCount > 0) { if (SettingDialog.TabIconDisp) tb.ImageIndex = 0; } else { if (SettingDialog.TabIconDisp) tb.ImageIndex = -1; } } if (!SettingDialog.TabIconDisp) ListTab.Refresh(); } finally { this.Cursor = Cursors.Default; } SaveConfigsTabs(); } }
public void Equals_HasNoExcludeConditionsTest() { var filter1 = new PostFilterRule { // マッチ条件 FilterName = "name", // 除外条件 ExFilterName = "", ExCaseSensitive = true, }; var filter2 = new PostFilterRule { FilterName = "name", ExFilterName = "", ExCaseSensitive = false, }; // 除外条件が無いので ExCaseSensitive 等の差異は無視する Assert.True(filter1.Equals(filter2)); Assert.True(filter2.Equals(filter1)); }