public bool AddTab(TabModel tab) { lock (this.LockObj) { if (this._tabs.ContainsKey(tab.TabName)) { return(false); } this._tabs.Add(tab.TabName, tab); tab.SetSortMode(this.SortMode, this.SortOrder); return(true); } }
private long? CreatePostsFromJson(TwitterStatus[] items, MyCommon.WORKERTYPE gType, TabModel tab, bool read) { long? minimumId = null; foreach (var status in items) { if (minimumId == null || minimumId.Value > status.Id) minimumId = status.Id; //二重取得回避 lock (LockObj) { if (tab == null) { if (TabInformations.GetInstance().ContainsKey(status.Id)) continue; } else { if (tab.Contains(status.Id)) continue; } } //RT禁止ユーザーによるもの if (gType != MyCommon.WORKERTYPE.UserTimeline && status.RetweetedStatus != null && this.noRTId.Contains(status.User.Id)) continue; var post = CreatePostsFromStatusData(status); post.IsRead = read; if (post.IsMe && !read && _readOwnPost) post.IsRead = true; if (tab != null && tab.IsInnerStorageTabType) tab.AddPostQueue(post); else TabInformations.GetInstance().AddPost(post); } return minimumId; }
public async Task GetStatusApi(bool read, long id, TabModel tab) { var post = await this.GetStatusApi(read, id) .ConfigureAwait(false); //非同期アイコン取得&StatusDictionaryに追加 if (tab != null && tab.IsInnerStorageTabType) tab.AddPostQueue(post); else TabInformations.GetInstance().AddPost(post); }
public bool AddNewTab(TabModel tab, bool startup) { //重複チェック foreach (TabPage tb in ListTab.TabPages) { if (tb.Text == tab.TabName) return false; } //新規タブ名チェック if (tab.TabName == Properties.Resources.AddNewTabText1) return false; var _tabPage = new TabPage(); var _listCustom = new DetailsListView(); int cnt = ListTab.TabPages.Count; ///ToDo:Create and set controls follow tabtypes using (ControlTransaction.Update(_listCustom)) using (ControlTransaction.Layout(this.SplitContainer1.Panel1, false)) using (ControlTransaction.Layout(this.SplitContainer1.Panel2, false)) using (ControlTransaction.Layout(this.SplitContainer1, false)) using (ControlTransaction.Layout(this.ListTab, false)) using (ControlTransaction.Layout(this)) using (ControlTransaction.Layout(_tabPage, false)) { _tabPage.Controls.Add(_listCustom); /// UserTimeline関連 var userTab = tab as UserTimelineTabModel; var listTab = tab as ListTimelineTabModel; var searchTab = tab as PublicSearchTabModel; if (userTab != null || listTab != null) { var label = new Label(); label.Dock = DockStyle.Top; label.Name = "labelUser"; label.TabIndex = 0; if (listTab != null) { label.Text = listTab.ListInfo.ToString(); } else if (userTab != null) { label.Text = userTab.ScreenName + "'s Timeline"; } label.TextAlign = ContentAlignment.MiddleLeft; using (ComboBox tmpComboBox = new ComboBox()) { label.Height = tmpComboBox.Height; } _tabPage.Controls.Add(label); } /// 検索関連の準備 else if (searchTab != null) { var pnl = new Panel(); var lbl = new Label(); var cmb = new ComboBox(); var btn = new Button(); var cmbLang = new ComboBox(); using (ControlTransaction.Layout(pnl, false)) { pnl.Controls.Add(cmb); pnl.Controls.Add(cmbLang); pnl.Controls.Add(btn); pnl.Controls.Add(lbl); pnl.Name = "panelSearch"; pnl.TabIndex = 0; pnl.Dock = DockStyle.Top; pnl.Height = cmb.Height; pnl.Enter += SearchControls_Enter; pnl.Leave += SearchControls_Leave; cmb.Text = ""; cmb.Anchor = AnchorStyles.Left | AnchorStyles.Right; cmb.Dock = DockStyle.Fill; cmb.Name = "comboSearch"; cmb.DropDownStyle = ComboBoxStyle.DropDown; cmb.ImeMode = ImeMode.NoControl; cmb.TabStop = false; cmb.TabIndex = 1; cmb.AutoCompleteMode = AutoCompleteMode.None; cmb.KeyDown += SearchComboBox_KeyDown; cmbLang.Text = ""; cmbLang.Anchor = AnchorStyles.Left | AnchorStyles.Right; cmbLang.Dock = DockStyle.Right; cmbLang.Width = 50; cmbLang.Name = "comboLang"; cmbLang.DropDownStyle = ComboBoxStyle.DropDownList; cmbLang.TabStop = false; cmbLang.TabIndex = 2; cmbLang.Items.Add(""); cmbLang.Items.Add("ja"); cmbLang.Items.Add("en"); cmbLang.Items.Add("ar"); cmbLang.Items.Add("da"); cmbLang.Items.Add("nl"); cmbLang.Items.Add("fa"); cmbLang.Items.Add("fi"); cmbLang.Items.Add("fr"); cmbLang.Items.Add("de"); cmbLang.Items.Add("hu"); cmbLang.Items.Add("is"); cmbLang.Items.Add("it"); cmbLang.Items.Add("no"); cmbLang.Items.Add("pl"); cmbLang.Items.Add("pt"); cmbLang.Items.Add("ru"); cmbLang.Items.Add("es"); cmbLang.Items.Add("sv"); cmbLang.Items.Add("th"); lbl.Text = "Search(C-S-f)"; lbl.Name = "label1"; lbl.Dock = DockStyle.Left; lbl.Width = 90; lbl.Height = cmb.Height; lbl.TextAlign = ContentAlignment.MiddleLeft; lbl.TabIndex = 0; btn.Text = "Search"; btn.Name = "buttonSearch"; btn.UseVisualStyleBackColor = true; btn.Dock = DockStyle.Right; btn.TabStop = false; btn.TabIndex = 3; btn.Click += SearchButton_Click; if (!string.IsNullOrEmpty(searchTab.SearchWords)) { cmb.Items.Add(searchTab.SearchWords); cmb.Text = searchTab.SearchWords; } cmbLang.Text = searchTab.SearchLang; _tabPage.Controls.Add(pnl); } } _tabPage.Tag = _listCustom; this.ListTab.Controls.Add(_tabPage); _tabPage.Location = new Point(4, 4); _tabPage.Name = "CTab" + cnt; _tabPage.Size = new Size(380, 260); _tabPage.TabIndex = 2 + cnt; _tabPage.Text = tab.TabName; _tabPage.UseVisualStyleBackColor = true; _tabPage.AccessibleRole = AccessibleRole.PageTab; _listCustom.AccessibleName = Properties.Resources.AddNewTab_ListView_AccessibleName; _listCustom.TabIndex = 1; _listCustom.AllowColumnReorder = true; _listCustom.ContextMenuStrip = this.ContextMenuOperate; _listCustom.ColumnHeaderContextMenuStrip = this.ContextMenuColumnHeader; _listCustom.Dock = DockStyle.Fill; _listCustom.FullRowSelect = true; _listCustom.HideSelection = false; _listCustom.Location = new Point(0, 0); _listCustom.Margin = new Padding(0); _listCustom.Name = "CList" + Environment.TickCount; _listCustom.ShowItemToolTips = true; _listCustom.Size = new Size(380, 260); _listCustom.UseCompatibleStateImageBehavior = false; _listCustom.View = View.Details; _listCustom.OwnerDraw = true; _listCustom.VirtualMode = true; _listCustom.Font = _fntReaded; _listCustom.BackColor = _clListBackcolor; _listCustom.GridLines = this._cfgCommon.ShowGrid; _listCustom.AllowDrop = true; _listCustom.SmallImageList = _listViewImageList; InitColumns(_listCustom, startup); _listCustom.SelectedIndexChanged += MyList_SelectedIndexChanged; _listCustom.MouseDoubleClick += MyList_MouseDoubleClick; _listCustom.ColumnClick += MyList_ColumnClick; _listCustom.DrawColumnHeader += MyList_DrawColumnHeader; _listCustom.DragDrop += TweenMain_DragDrop; _listCustom.DragEnter += TweenMain_DragEnter; _listCustom.DragOver += TweenMain_DragOver; _listCustom.DrawItem += MyList_DrawItem; _listCustom.MouseClick += MyList_MouseClick; _listCustom.ColumnReordered += MyList_ColumnReordered; _listCustom.ColumnWidthChanged += MyList_ColumnWidthChanged; _listCustom.CacheVirtualItems += MyList_CacheVirtualItems; _listCustom.RetrieveVirtualItem += MyList_RetrieveVirtualItem; _listCustom.DrawSubItem += MyList_DrawSubItem; _listCustom.HScrolled += MyList_HScrolled; } return true; }
private async Task FavRemoveAsyncInternal(IProgress<string> p, CancellationToken ct, IReadOnlyList<long> statusIds, TabModel tab) { if (ct.IsCancellationRequested) return; if (!CheckAccountValid()) throw new WebApiException("Auth error. Check your account"); var successIds = new List<long>(); await Task.Run(async () => { //スレッド処理はしない var allCount = 0; var failedCount = 0; foreach (var statusId in statusIds) { allCount++; var post = tab.Posts[statusId]; p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText17, allCount, statusIds.Count, failedCount)); if (!post.IsFav) continue; try { await this.twitterApi.FavoritesDestroy(post.RetweetedId ?? post.StatusId) .IgnoreResponse() .ConfigureAwait(false); } catch (WebApiException) { failedCount++; continue; } successIds.Add(statusId); post.IsFav = false; // リスト再描画必要 if (this._statuses.ContainsKey(statusId)) { this._statuses[statusId].IsFav = false; } // 検索,リスト,UserTimeline,Relatedの各タブに反映 foreach (var tb in this._statuses.GetTabsInnerStorageType()) { if (tb.Contains(statusId)) tb.Posts[statusId].IsFav = false; } } }); if (ct.IsCancellationRequested) return; var favTab = this._statuses.GetTabByType(MyCommon.TabUsageType.Favorites); foreach (var statusId in successIds) { // ツイートが削除された訳ではないので IsDeleted はセットしない favTab.EnqueueRemovePost(statusId, setIsDeleted: false); } this.RefreshTimeline(); if (this._curList != null && this._curTab != null && this._curTab.Text == tab.TabName) { if (tab.TabType == MyCommon.TabUsageType.Favorites) { // 色変えは不要 } else { using (ControlTransaction.Update(this._curList)) { foreach (var statusId in successIds) { var idx = tab.IndexOf(statusId); if (idx == -1) continue; var post = tab.Posts[statusId]; this.ChangeCacheStyleRead(post.IsRead, idx); } } if (successIds.Contains(this._curPost.StatusId)) await this.DispSelectedPost(true); // 選択アイテム再表示 } } }
private async Task FavRemoveAsync(IReadOnlyList<long> statusIds, TabModel tab) { await this.workerSemaphore.WaitAsync(); try { var progress = new Progress<string>(x => this.StatusLabel.Text = x); await this.FavRemoveAsyncInternal(progress, this.workerCts.Token, statusIds, tab); } catch (WebApiException ex) { this._myStatusError = true; this.StatusLabel.Text = $"Err:{ex.Message}(PostFavRemove)"; } finally { this.workerSemaphore.Release(); } }
private async Task FavAddAsyncInternal(IProgress<string> p, CancellationToken ct, long statusId, TabModel tab) { if (ct.IsCancellationRequested) return; if (!CheckAccountValid()) throw new WebApiException("Auth error. Check your account"); PostClass post; if (!tab.Posts.TryGetValue(statusId, out post)) return; if (post.IsFav) return; await Task.Run(async () => { p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 0, 1, 0)); try { await this.twitterApi.FavoritesCreate(post.RetweetedId ?? post.StatusId) .IgnoreResponse() .ConfigureAwait(false); if (this._cfgCommon.RestrictFavCheck) { var status = await this.twitterApi.StatusesShow(post.RetweetedId ?? post.StatusId) .ConfigureAwait(false); if (status.Favorited != true) throw new WebApiException("NG(Restricted?)"); } this._favTimestamps.Add(DateTime.Now); // TLでも取得済みならfav反映 if (this._statuses.ContainsKey(statusId)) { var postTl = this._statuses[statusId]; postTl.IsFav = true; var favTab = this._statuses.GetTabByType(MyCommon.TabUsageType.Favorites); favTab.AddPostQueue(postTl); } // 検索,リスト,UserTimeline,Relatedの各タブに反映 foreach (var tb in this._statuses.GetTabsInnerStorageType()) { if (tb.Contains(statusId)) tb.Posts[statusId].IsFav = true; } p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 1, 1, 0)); } catch (WebApiException) { p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 1, 1, 1)); throw; } // 時速表示用 var oneHour = DateTime.Now - TimeSpan.FromHours(1); foreach (var i in MyCommon.CountDown(this._favTimestamps.Count - 1, 0)) { if (this._favTimestamps[i] < oneHour) this._favTimestamps.RemoveAt(i); } this._statuses.DistributePosts(); }); if (ct.IsCancellationRequested) return; this.RefreshTimeline(); if (this._curList != null && this._curTab != null && this._curTab.Text == tab.TabName) { using (ControlTransaction.Update(this._curList)) { var idx = tab.IndexOf(statusId); if (idx != -1) this.ChangeCacheStyleRead(post.IsRead, idx); } if (statusId == this._curPost.StatusId) await this.DispSelectedPost(true); // 選択アイテム再表示 } }
/// <summary> /// <see cref="SaveListViewSelection"/> によって保存された選択状態を復元します /// </summary> private void RestoreListViewSelection(DetailsListView listView, TabModel tab, ListViewSelection listSelection) { // status_id から ListView 上のインデックスに変換 int[] selectedIndices = null; if (listSelection.SelectedStatusIds != null) selectedIndices = tab.IndexOf(listSelection.SelectedStatusIds).Where(x => x != -1).ToArray(); var focusedIndex = -1; if (listSelection.FocusedStatusId != null) focusedIndex = tab.IndexOf(listSelection.FocusedStatusId.Value); var selectionMarkIndex = -1; if (listSelection.SelectionMarkStatusId != null) selectionMarkIndex = tab.IndexOf(listSelection.SelectionMarkStatusId.Value); this.SelectListItem(listView, selectedIndices, focusedIndex, selectionMarkIndex); }
/// <summary> /// <see cref="SaveListViewScroll"/> によって保存されたスクロール位置を復元します /// </summary> private void RestoreListViewScroll(DetailsListView listView, TabModel tab, ListViewScroll listScroll) { if (listView.VirtualListSize == 0) return; switch (listScroll.ScrollLockMode) { case ScrollLockMode.FixedToTop: listView.EnsureVisible(0); break; case ScrollLockMode.FixedToBottom: listView.EnsureVisible(listView.VirtualListSize - 1); break; case ScrollLockMode.FixedToItem: var topIndex = listScroll.TopItemStatusId != null ? tab.IndexOf(listScroll.TopItemStatusId.Value) : -1; if (topIndex != -1) listView.TopItem = listView.Items[topIndex]; break; case ScrollLockMode.None: default: break; } }
private long? GetSelectionMarkStatusId(DetailsListView listView, TabModel tab) { var selectionMarkIndex = listView.SelectionMark; return selectionMarkIndex != -1 ? tab.GetStatusIdAt(selectionMarkIndex) : (long?)null; }
private long? GetFocusedStatusId(DetailsListView listView, TabModel tab) { var focusedItem = listView.FocusedItem; return focusedItem != null ? tab.GetStatusIdAt(focusedItem.Index) : (long?)null; }
private long[] GetSelectedStatusIds(DetailsListView listView, TabModel tab) { var selectedIndices = listView.SelectedIndices; if (selectedIndices.Count > 0 && selectedIndices.Count < 61) return tab.GetStatusIdAt(selectedIndices.Cast<int>()); else return null; }
/// <summary> /// <see cref="ListView"/> の選択状態を <see cref="ListViewSelection"/> として返します /// </summary> private ListViewSelection SaveListViewSelection(DetailsListView listView, TabModel tab) { if (listView.VirtualListSize == 0) { return new ListViewSelection { SelectedStatusIds = new long[0], SelectionMarkStatusId = null, FocusedStatusId = null, }; } return new ListViewSelection { SelectedStatusIds = this.GetSelectedStatusIds(listView, tab), FocusedStatusId = this.GetFocusedStatusId(listView, tab), SelectionMarkStatusId = this.GetSelectionMarkStatusId(listView, tab), }; }
/// <summary> /// <see cref="ListView"/> のスクロール位置に関する情報を <see cref="ListViewScroll"/> として返します /// </summary> private ListViewScroll SaveListViewScroll(DetailsListView listView, TabModel tab) { var listScroll = new ListViewScroll { ScrollLockMode = this.GetScrollLockMode(listView), }; if (listScroll.ScrollLockMode == ScrollLockMode.FixedToItem) { var topItem = listView.TopItem; if (topItem != null) listScroll.TopItemStatusId = tab.GetStatusIdAt(topItem.Index); } return listScroll; }
public bool ContainsTab(TabModel ts) { return(_tabs.ContainsValue(ts)); }