public void AddTab_Test() { var tab = new FilterTabModel("MyTab"); var ret = this.tabinfo.AddTab(tab); Assert.True(ret); Assert.Same(tab, this.tabinfo.Tabs[^ 1]);
public void AddTab_Test() { var tab = new FilterTabModel("MyTab"); var ret = this.tabinfo.AddTab(tab); Assert.True(ret); Assert.Same(tab, this.tabinfo.Tabs.Values.Last()); }
public void FilterAll_CopyAndMarkFilterTest() { var homeTab = this.tabinfo.GetTabByType(MyCommon.TabUsageType.Home); var myTab1 = new FilterTabModel("MyTab1"); this.tabinfo.AddTab(myTab1); var filter = new PostFilterRule { FilterName = "aaa", // コピー+マーク MoveMatches = false, MarkMatches = true, }; myTab1.AddFilter(filter); myTab1.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer <long> .Instance); Assert.Equal(new[] { 100L }, myTab1.StatusIds); // フィルタを変更する filter.FilterName = "bbb"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれる // [statusId: 200] は Recent から MyTab1 にコピーされ、マークが付与される // 変更後の振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer <long> .Instance); Assert.Equal(new[] { 200L }, myTab1.StatusIds); // [statusId: 200] は IsMark が true の状態になる Assert.True(this.tabinfo[200L].IsMark); }
public void AddFilter_Test() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.AddFilter(filter); Assert.Equal(new[] { filter }, tab.FilterArray); Assert.True(tab.FilterModified); }
public void FilterAll_MoveFilterTest() { var homeTab = this.tabinfo.HomeTab; var myTab1 = new FilterTabModel("MyTab1"); this.tabinfo.AddTab(myTab1); var filter = new PostFilterRule { FilterName = "aaa", // マッチしたら移動 MoveMatches = true, }; myTab1.AddFilter(filter); myTab1.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 200L, 300L }, homeTab.StatusIds, AnyOrderComparer <long> .Instance); Assert.Equal(new[] { 100L }, myTab1.StatusIds); // フィルタを変更する filter.FilterName = "bbb"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれて Recent に戻される // [statusId: 200] は Recent から MyTab1 に移動される // 変更後の振り分け状態 Assert.Equal(new[] { 100L, 300L }, homeTab.StatusIds, AnyOrderComparer <long> .Instance); Assert.Equal(new[] { 200L }, myTab1.StatusIds); }
public void OnFilterModified_Test() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.FilterModified = false; // TabClass に紐付いているフィルタを変更 filter.FilterSource = "OpenTween"; Assert.True(tab.FilterModified); }
public void RemoveFilter_Test() { var tab = new FilterTabModel("MyTab"); 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_DetachedTest() { var tab = new FilterTabModel("MyTab"); var filter = new PostFilterRule(); tab.FilterArray = new[] { filter }; tab.RemoveFilter(filter); tab.FilterModified = false; // TabClass から既に削除されたフィルタを変更 filter.FilterSource = "OpenTween"; Assert.False(tab.FilterModified); }
public void SetReadHomeTab_ContainsFilterHitTest() { var homeTab = this.tabinfo.Tabs["Recent"]; // Recent に追加するツイート (StatusId: 100, 150, 200; すべて未読) homeTab.UnreadManage = true; this.tabinfo.AddPost(new PostClass { StatusId = 100L, IsRead = false }); this.tabinfo.AddPost(new PostClass { StatusId = 150L, IsRead = false }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, IsRead = false }); // StatusId: 150 だけ FilterTab の振り分けルールにヒットする (PostClass.FilterHit が true になる) var filterTab = new FilterTabModel("FilterTab"); filterTab.AddFilter(TestPostFilterRule.Create(x => x.StatusId == 150L ? MyCommon.HITRESULT.Copy : MyCommon.HITRESULT.None)); this.tabinfo.AddTab(filterTab); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点でのHomeタブの未読件数 Assert.Equal(3, homeTab.UnreadCount); // Recent タブのツイートをすべて未読にする this.tabinfo.SetReadHomeTab(); // FilterHit が true である StatusId: 150 を除いてすべて未読になっている Assert.Equal(1, homeTab.UnreadCount); Assert.Equal(150L, homeTab.NextUnreadId); }
private void LoadConfig() { _cfgCommon = SettingCommon.Load(); SettingCommon.Instance = this._cfgCommon; if (_cfgCommon.UserAccounts == null || _cfgCommon.UserAccounts.Count == 0) { _cfgCommon.UserAccounts = new List<UserAccount>(); if (!string.IsNullOrEmpty(_cfgCommon.UserName)) { UserAccount account = new UserAccount(); account.Username = _cfgCommon.UserName; account.UserId = _cfgCommon.UserId; account.Token = _cfgCommon.Token; account.TokenSecret = _cfgCommon.TokenSecret; _cfgCommon.UserAccounts.Add(account); } } _cfgLocal = SettingLocal.Load(); // v1.2.4 以前の設定には ScaleDimension の項目がないため、現在の DPI と同じとして扱う if (_cfgLocal.ScaleDimension.IsEmpty) _cfgLocal.ScaleDimension = this.CurrentAutoScaleDimensions; var tabsSetting = SettingTabs.Load().Tabs; foreach (var tabSetting in tabsSetting) { TabModel tab; switch (tabSetting.TabType) { case MyCommon.TabUsageType.Home: tab = new HomeTabModel(tabSetting.TabName); break; case MyCommon.TabUsageType.Mentions: tab = new MentionsTabModel(tabSetting.TabName); break; case MyCommon.TabUsageType.DirectMessage: tab = new DirectMessagesTabModel(tabSetting.TabName); break; case MyCommon.TabUsageType.Favorites: tab = new FavoritesTabModel(tabSetting.TabName); break; case MyCommon.TabUsageType.UserDefined: tab = new FilterTabModel(tabSetting.TabName); break; case MyCommon.TabUsageType.UserTimeline: tab = new UserTimelineTabModel(tabSetting.TabName, tabSetting.User); break; case MyCommon.TabUsageType.PublicSearch: tab = new PublicSearchTabModel(tabSetting.TabName) { SearchWords = tabSetting.SearchWords, SearchLang = tabSetting.SearchLang, }; break; case MyCommon.TabUsageType.Lists: tab = new ListTimelineTabModel(tabSetting.TabName, tabSetting.ListInfo); break; case MyCommon.TabUsageType.Mute: tab = new MuteTabModel(tabSetting.TabName); break; default: continue; } tab.UnreadManage = tabSetting.UnreadManage; tab.Protected = tabSetting.Protected; tab.Notify = tabSetting.Notify; tab.SoundFile = tabSetting.SoundFile; if (tab.IsDistributableTabType) { var filterTab = (FilterTabModel)tab; filterTab.FilterArray = tabSetting.FilterArray; filterTab.FilterModified = false; } if (this._statuses.ContainsTab(tab.TabName)) tab.TabName = this._statuses.MakeTabName("MyTab"); this._statuses.AddTab(tab); } if (_statuses.Tabs.Count == 0) { _statuses.AddTab(new HomeTabModel()); _statuses.AddTab(new MentionsTabModel()); _statuses.AddTab(new DirectMessagesTabModel()); _statuses.AddTab(new FavoritesTabModel()); } }
private async void ButtonAddTab_Click(object sender, EventArgs e) { string tabName = null; MyCommon.TabUsageType tabType; using (InputTabName inputName = new InputTabName()) { inputName.TabName = _sts.MakeTabName("MyTab"); inputName.IsShowUsage = true; inputName.ShowDialog(); if (inputName.DialogResult == DialogResult.Cancel) return; tabName = inputName.TabName; tabType = inputName.Usage; } if (!string.IsNullOrEmpty(tabName)) { //List対応 ListElement list = null; if (tabType == MyCommon.TabUsageType.Lists) { try { using (var dialog = new WaitingDialog(Properties.Resources.ListsGetting)) { var cancellationToken = dialog.EnableCancellation(); var task = ((TweenMain)this.Owner).TwitterInstance.GetListsApi(); await dialog.WaitForAsync(this, task); cancellationToken.ThrowIfCancellationRequested(); } } catch (OperationCanceledException) { return; } catch (WebApiException ex) { MessageBox.Show("Failed to get lists. (" + ex.Message + ")"); } using (ListAvailable listAvail = new ListAvailable()) { if (listAvail.ShowDialog(this) == DialogResult.Cancel) return; if (listAvail.SelectedList == null) return; list = listAvail.SelectedList; } } TabModel tab; switch (tabType) { case MyCommon.TabUsageType.UserDefined: tab = new FilterTabModel(tabName); break; case MyCommon.TabUsageType.PublicSearch: tab = new PublicSearchTabModel(tabName); break; case MyCommon.TabUsageType.Lists: tab = new ListTimelineTabModel(tabName, list); break; default: return; } if (!_sts.AddTab(tab) || !((TweenMain)this.Owner).AddNewTab(tab, startup: false)) { string tmp = string.Format(Properties.Resources.AddTabMenuItem_ClickText1, tabName); MessageBox.Show(tmp, Properties.Resources.AddTabMenuItem_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } else { // タブ作成成功 // 末尾のタブを取得する var lastIdx = this.ListTabs.Items.Count - 1; var lastTab = lastIdx != -1 ? this._sts.Tabs[(string)this.ListTabs.Items[lastIdx]] : null; // 末尾がミュートタブであればその手前に追加する if (lastTab != null && lastTab.TabType == MyCommon.TabUsageType.Mute) this.ListTabs.Items.Insert(lastIdx, tabName); else this.ListTabs.Items.Add(tabName); } } }
public void FilterAll_MoveFilterTest2() { var homeTab = this.tabinfo.GetTabByType(MyCommon.TabUsageType.Home); var myTab1 = new FilterTabModel("MyTab1"); var myTab2 = new FilterTabModel("MyTab2"); this.tabinfo.AddTab(myTab1); this.tabinfo.AddTab(myTab2); var filter1 = new PostFilterRule { FilterName = "aaa", // マッチしたら移動 MoveMatches = true, }; myTab1.AddFilter(filter1); myTab1.FilterModified = false; var filter2 = new PostFilterRule { FilterName = "bbb", // マッチしたら移動 MoveMatches = true, }; myTab2.AddFilter(filter2); myTab2.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 300L }, homeTab.StatusIds); Assert.Equal(new[] { 100L }, myTab1.StatusIds); Assert.Equal(new[] { 200L }, myTab2.StatusIds); // MyTab1 のフィルタを変更する filter1.FilterName = "bbb"; // MyTab2 のフィルタを変更する filter2.FilterName = "ccc"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれて Recent に戻される // [statusId: 200] は MyTab1 に移動される // [statusId: 200] は MyTab2 から取り除かれるが MyTab1 に移動されているので Recent には戻さない // [statusId: 300] は Recent から MyTab2 に移動される // 変更後の振り分け状態 Assert.Equal(new[] { 100L }, homeTab.StatusIds); Assert.Equal(new[] { 200L }, myTab1.StatusIds); Assert.Equal(new[] { 300L }, myTab2.StatusIds); }
private bool SelectTab(out string tabName) { do { tabName = null; //振り分け先タブ選択 using (var dialog = new TabsDialog(_statuses)) { if (dialog.ShowDialog(this) == DialogResult.Cancel) return false; var selectedTab = dialog.SelectedTab; tabName = selectedTab == null ? null : selectedTab.TabName; } ListTab.SelectedTab.Focus(); //新規タブを選択→タブ作成 if (tabName == null) { using (InputTabName inputName = new InputTabName()) { inputName.TabName = _statuses.MakeTabName("MyTab"); inputName.ShowDialog(); if (inputName.DialogResult == DialogResult.Cancel) return false; tabName = inputName.TabName; } this.TopMost = this._cfgCommon.AlwaysTop; if (!string.IsNullOrEmpty(tabName)) { var tab = new FilterTabModel(tabName); if (!_statuses.AddTab(tab) || !AddNewTab(tab, startup: false)) { string tmp = string.Format(Properties.Resources.IDRuleMenuItem_ClickText2, tabName); MessageBox.Show(tmp, Properties.Resources.IDRuleMenuItem_ClickText3, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //もう一度タブ名入力 } else { return true; } } } else { //既存タブを選択 return true; } } while (true); }
public void FilterAll_CopyAndMarkFilterTest() { var homeTab = this.tabinfo.GetTabByType(MyCommon.TabUsageType.Home); var myTab1 = new FilterTabModel("MyTab1"); this.tabinfo.AddTab(myTab1); var filter = new PostFilterRule { FilterName = "aaa", // コピー+マーク MoveMatches = false, MarkMatches = true, }; myTab1.AddFilter(filter); myTab1.FilterModified = false; this.tabinfo.AddPost(new PostClass { StatusId = 100L, ScreenName = "aaa" }); this.tabinfo.AddPost(new PostClass { StatusId = 200L, ScreenName = "bbb" }); this.tabinfo.AddPost(new PostClass { StatusId = 300L, ScreenName = "ccc" }); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // この時点での振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 100L }, myTab1.StatusIds); // フィルタを変更する filter.FilterName = "bbb"; // フィルタの変更を反映 this.tabinfo.FilterAll(); this.tabinfo.DistributePosts(); this.tabinfo.SubmitUpdate(); // 期待する動作: // [statusId: 100] は MyTab1 から取り除かれる // [statusId: 200] は Recent から MyTab1 にコピーされ、マークが付与される // 変更後の振り分け状態 Assert.Equal(new[] { 100L, 200L, 300L }, homeTab.StatusIds, AnyOrderComparer<long>.Instance); Assert.Equal(new[] { 200L }, myTab1.StatusIds); // [statusId: 200] は IsMark が true の状態になる Assert.True(this.tabinfo[200L].IsMark); }
private void AddTabMenuItem_Click(object sender, EventArgs e) { string tabName = null; MyCommon.TabUsageType tabUsage; using (InputTabName inputName = new InputTabName()) { inputName.TabName = _statuses.MakeTabName("MyTab"); inputName.IsShowUsage = true; inputName.ShowDialog(); if (inputName.DialogResult == DialogResult.Cancel) return; tabName = inputName.TabName; tabUsage = inputName.Usage; } this.TopMost = this._cfgCommon.AlwaysTop; if (!string.IsNullOrEmpty(tabName)) { //List対応 ListElement list = null; if (tabUsage == MyCommon.TabUsageType.Lists) { using (ListAvailable listAvail = new ListAvailable()) { if (listAvail.ShowDialog(this) == DialogResult.Cancel) return; if (listAvail.SelectedList == null) return; list = listAvail.SelectedList; } } TabModel tab; switch (tabUsage) { case MyCommon.TabUsageType.UserDefined: tab = new FilterTabModel(tabName); break; case MyCommon.TabUsageType.PublicSearch: tab = new PublicSearchTabModel(tabName); break; case MyCommon.TabUsageType.Lists: tab = new ListTimelineTabModel(tabName, list); break; default: return; } if (!_statuses.AddTab(tab) || !AddNewTab(tab, startup: false)) { string tmp = string.Format(Properties.Resources.AddTabMenuItem_ClickText1, tabName); MessageBox.Show(tmp, Properties.Resources.AddTabMenuItem_ClickText2, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { //成功 SaveConfigsTabs(); if (tabUsage == MyCommon.TabUsageType.PublicSearch) { ListTab.SelectedIndex = ListTab.TabPages.Count - 1; ListTab.SelectedTab.Controls["panelSearch"].Controls["comboSearch"].Focus(); } if (tabUsage == MyCommon.TabUsageType.Lists) { ListTab.SelectedIndex = ListTab.TabPages.Count - 1; var listTab = (ListTimelineTabModel)this._statuses.Tabs[this._curTab.Text]; this.GetListTimelineAsync(listTab); } } } }