using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
public sealed class TabInformations
{
//個別タブの情報をDictionaryで保持
- private IdComparerClass _sorter;
private Dictionary<string, TabClass> _tabs = new Dictionary<string, TabClass>();
private Dictionary<long, PostClass> _statuses = new Dictionary<long, PostClass>();
private List<long> _addedIds;
private TabInformations()
{
- _sorter = new IdComparerClass();
}
public static TabInformations GetInstance()
if (_tabs.ContainsKey(TabName)) return false;
var tb = new TabClass(TabName, TabType, List);
_tabs.Add(TabName, tb);
- tb.Sorter.Mode = _sorter.Mode;
- tb.Sorter.Order = _sorter.Order;
+ tb.SortMode = this.SortMode;
+ tb.SortOrder = this.SortOrder;
return true;
}
}
}
+ private SortOrder _sortOrder = SortOrder.Ascending;
public SortOrder SortOrder
{
- get
- {
- return _sorter.Order;
- }
+ get { return this._sortOrder; }
set
{
- _sorter.Order = value;
+ this._sortOrder = value;
foreach (var tab in _tabs.Values)
{
- tab.Sorter.Order = value;
+ tab.SortOrder = value;
}
}
}
- public IdComparerClass.ComparerMode SortMode
+ private ComparerMode _sortMode = ComparerMode.Id;
+ public ComparerMode SortMode
{
- get
- {
- return _sorter.Mode;
- }
+ get { return this._sortMode; }
set
{
- _sorter.Mode = value;
+ this._sortMode = value;
foreach (var tab in _tabs.Values)
{
- tab.Sorter.Mode = value;
+ tab.SortMode = value;
}
}
}
- public SortOrder ToggleSortOrder(IdComparerClass.ComparerMode SortMode)
+ public SortOrder ToggleSortOrder(ComparerMode sortMode)
{
- if (_sorter.Mode == SortMode)
+ if (this.SortMode == sortMode)
{
- if (_sorter.Order == SortOrder.Ascending)
+ if (this.SortOrder == SortOrder.Ascending)
{
- _sorter.Order = SortOrder.Descending;
+ this.SortOrder = SortOrder.Descending;
}
else
{
- _sorter.Order = SortOrder.Ascending;
- }
- foreach (var tab in _tabs.Values)
- {
- tab.Sorter.Order = _sorter.Order;
+ this.SortOrder = SortOrder.Ascending;
}
}
else
{
- _sorter.Mode = SortMode;
- _sorter.Order = SortOrder.Ascending;
- foreach (var tab in _tabs.Values)
- {
- tab.Sorter.Mode = SortMode;
- tab.Sorter.Order = SortOrder.Ascending;
- }
+ this.SortMode = sortMode;
+ this.SortOrder = SortOrder.Ascending;
}
+
this.SortPosts();
- return _sorter.Order;
+
+ return this.SortOrder;
}
// public PostClass RetweetSource(long Id)
if (Tab.OldestUnreadId > -1 &&
posts.TryGetValue(Tab.OldestUnreadId, out oldestUnreadPost) &&
oldestUnreadPost.IsRead &&
- _sorter.Mode == IdComparerClass.ComparerMode.Id) //次の未読探索
+ this.SortMode == ComparerMode.Id) //次の未読探索
{
if (Tab.UnreadCount == 0)
{
return null;
IEnumerable<int> searchRange;
- if (this._sorter.Order == SortOrder.Ascending)
+ if (this.SortOrder == SortOrder.Ascending)
{
if (startIdx != null)
searchRange = MyCommon.CountUp(startIdx.Value, tab.AllCount - 1);
//{
// isUserStream = false;
//}
- if (!isUserStream || this.SortMode != IdComparerClass.ComparerMode.Id)
+ if (!isUserStream || this.SortMode != ComparerMode.Id)
{
this.SortPosts();
}
private List<TemporaryId> _tmpIds = new List<TemporaryId>();
private MyCommon.TabUsageType _tabType = MyCommon.TabUsageType.Undefined;
- [NonSerialized]
- private IdComparerClass _sorter = new IdComparerClass();
-
private readonly object _lockObj = new object();
public string User { get; set; }
public void Sort()
{
- if (_sorter.Mode == IdComparerClass.ComparerMode.Id)
+ IEnumerable<long> sortedIds;
+ if (this.SortOrder == SortOrder.Ascending)
{
- _ids.Sort(_sorter.CmpMethod());
- return;
- }
- long[] ar = null;
- if (_sorter.Order == SortOrder.Ascending)
- {
- switch (_sorter.Mode)
+ switch (this.SortMode)
{
- case IdComparerClass.ComparerMode.Data:
- ar = _ids.OrderBy(n => _sorter.posts[n].TextFromApi).ToArray();
+ case ComparerMode.Id:
+ sortedIds = this._ids.OrderBy(x => x);
break;
- case IdComparerClass.ComparerMode.Name:
- ar = _ids.OrderBy(n => _sorter.posts[n].ScreenName).ToArray();
+ case ComparerMode.Data:
+ sortedIds = this._ids.OrderBy(x => this.Posts[x].TextFromApi);
break;
- case IdComparerClass.ComparerMode.Nickname:
- ar = _ids.OrderBy(n => _sorter.posts[n].Nickname).ToArray();
+ case ComparerMode.Name:
+ sortedIds = this._ids.OrderBy(x => this.Posts[x].ScreenName);
break;
- case IdComparerClass.ComparerMode.Source:
- ar = _ids.OrderBy(n => _sorter.posts[n].Source).ToArray();
+ case ComparerMode.Nickname:
+ sortedIds = this._ids.OrderBy(x => this.Posts[x].Nickname);
+ break;
+ case ComparerMode.Source:
+ sortedIds = this._ids.OrderBy(x => this.Posts[x].Source);
break;
+ default:
+ throw new InvalidEnumArgumentException();
}
}
else
{
- switch (_sorter.Mode)
+ switch (this.SortMode)
{
- case IdComparerClass.ComparerMode.Data:
- ar = _ids.OrderByDescending(n => _sorter.posts[n].TextFromApi).ToArray();
+ case ComparerMode.Id:
+ sortedIds = this._ids.OrderByDescending(x => x);
break;
- case IdComparerClass.ComparerMode.Name:
- ar = _ids.OrderByDescending(n => _sorter.posts[n].ScreenName).ToArray();
+ case ComparerMode.Data:
+ sortedIds = this._ids.OrderByDescending(x => this.Posts[x].TextFromApi);
break;
- case IdComparerClass.ComparerMode.Nickname:
- ar = _ids.OrderByDescending(n => _sorter.posts[n].Nickname).ToArray();
+ case ComparerMode.Name:
+ sortedIds = this._ids.OrderByDescending(x => this.Posts[x].ScreenName);
break;
- case IdComparerClass.ComparerMode.Source:
- ar = _ids.OrderByDescending(n => _sorter.posts[n].Source).ToArray();
+ case ComparerMode.Nickname:
+ sortedIds = this._ids.OrderByDescending(x => this.Posts[x].Nickname);
break;
+ case ComparerMode.Source:
+ sortedIds = this._ids.OrderByDescending(x => this.Posts[x].Source);
+ break;
+ default:
+ throw new InvalidEnumArgumentException();
}
}
- _ids = new List<long>(ar);
- }
- public IdComparerClass Sorter
- {
- get
- {
- return _sorter;
- }
+ this._ids = sortedIds.ToList();
}
+ public ComparerMode SortMode { get; set; }
+ public SortOrder SortOrder { get; set; }
+
//無条件に追加
private void Add(long ID, bool Read)
{
if (this._ids.Contains(ID)) return;
- if (this.Sorter.Mode == IdComparerClass.ComparerMode.Id)
+ if (this.SortMode == ComparerMode.Id)
{
- if (this.Sorter.Order == SortOrder.Ascending)
+ if (this.SortOrder == SortOrder.Ascending)
{
this._ids.Add(ID);
}
{
Posts = TabInformations.GetInstance().Posts;
}
- _sorter.posts = Posts;
}
}
}
}
- //ソート比較クラス:ID比較のみ
- public sealed class IdComparerClass : IComparer<long>
+ /// <summary>
+ /// 比較する方法
+ /// </summary>
+ public enum ComparerMode
{
- /// <summary>
- /// 比較する方法
- /// </summary>
- public enum ComparerMode
- {
- Id,
- Data,
- Name,
- Nickname,
- Source,
- }
-
- private SortOrder _order;
- private ComparerMode _mode;
- private Dictionary<long, PostClass> _statuses;
- private Comparison<long> _CmpMethod;
-
- /// <summary>
- /// 昇順か降順か Setの際は同時に比較関数の切り替えを行う
- /// </summary>
- public SortOrder Order
- {
- get
- {
- return _order;
- }
- set
- {
- _order = value;
- SetCmpMethod(_mode, _order);
- }
- }
-
- /// <summary>
- /// 並び替えの方法 Setの際は同時に比較関数の切り替えを行う
- /// </summary>
- public ComparerMode Mode
- {
- get
- {
- return _mode;
- }
- set
- {
- _mode = value;
- SetCmpMethod(_mode, _order);
- }
- }
-
- /// <summary>
- /// ListViewItemComparerクラスのコンストラクタ(引数付は未使用)
- /// </summary>
- /// <param name="col">並び替える列番号</param>
- /// <param name="ord">昇順か降順か</param>
- /// <param name="cmod">並び替えの方法</param>
-
- public IdComparerClass()
- {
- _order = SortOrder.Ascending;
- _mode = ComparerMode.Id;
- SetCmpMethod(_mode, _order);
- }
-
- public Dictionary<long, PostClass> posts
- {
- set
- {
- _statuses = value;
- }
- get
- {
- return _statuses;
- }
- }
-
- // 指定したソートモードとソートオーダーに従い使用する比較関数のアドレスを返す
- public Comparison<long> CmpMethod(ComparerMode _sortmode, SortOrder _sortorder)
- {
- //get
- {
- Comparison<long> _method = null;
- if (_sortorder == SortOrder.Ascending)
- {
- // 昇順
- switch (_sortmode)
- {
- case ComparerMode.Data:
- _method = Compare_ModeData_Ascending;
- break;
- case ComparerMode.Id:
- _method = Compare_ModeId_Ascending;
- break;
- case ComparerMode.Name:
- _method = Compare_ModeName_Ascending;
- break;
- case ComparerMode.Nickname:
- _method = Compare_ModeNickName_Ascending;
- break;
- case ComparerMode.Source:
- _method = Compare_ModeSource_Ascending;
- break;
- }
- }
- else
- {
- // 降順
- switch (_sortmode)
- {
- case ComparerMode.Data:
- _method = Compare_ModeData_Descending;
- break;
- case ComparerMode.Id:
- _method = Compare_ModeId_Descending;
- break;
- case ComparerMode.Name:
- _method = Compare_ModeName_Descending;
- break;
- case ComparerMode.Nickname:
- _method = Compare_ModeNickName_Descending;
- break;
- case ComparerMode.Source:
- _method = Compare_ModeSource_Descending;
- break;
- }
- }
- return _method;
- }
- }
-
- // ソートモードとソートオーダーに従い使用する比較関数のアドレスを返す
- // (overload 現在の使用中の比較関数のアドレスを返す)
- public Comparison<long> CmpMethod()
- {
- //get
- {
- return _CmpMethod;
- }
- }
-
- // ソートモードとソートオーダーに従い比較関数のアドレスを切り替え
- private void SetCmpMethod(ComparerMode mode, SortOrder order)
- {
- _CmpMethod = this.CmpMethod(mode, order);
- }
-
- //xがyより小さいときはマイナスの数、大きいときはプラスの数、
- //同じときは0を返す (こちらは未使用 一応比較関数群呼び出しの形のまま残しておく)
- int IComparer<long>.Compare(long x, long y)
- {
- return _CmpMethod(x, y);
- }
-
- // 比較用関数群 いずれもステータスIDの順序を考慮する
- // 本文比較 昇順
- public int Compare_ModeData_Ascending(long x, long y)
- {
- var result = string.Compare(_statuses[x].TextFromApi, _statuses[y].TextFromApi);
- if (result == 0) result = x.CompareTo(y);
- return result;
- }
-
- // 本文比較 降順
- public int Compare_ModeData_Descending(long x, long y)
- {
- var result = string.Compare(_statuses[y].TextFromApi, _statuses[x].TextFromApi);
- if (result == 0) result = y.CompareTo(x);
- return result;
- }
-
- // ステータスID比較 昇順
- public int Compare_ModeId_Ascending(long x, long y)
- {
- return x.CompareTo(y);
- }
-
- // ステータスID比較 降順
- public int Compare_ModeId_Descending(long x, long y)
- {
- return y.CompareTo(x);
- }
-
- // 表示名比較 昇順
- public int Compare_ModeName_Ascending(long x, long y)
- {
- var result = string.Compare(_statuses[x].ScreenName, _statuses[y].ScreenName);
- if (result == 0) result = x.CompareTo(y);
- return result;
- }
-
- // 表示名比較 降順
- public int Compare_ModeName_Descending(long x, long y)
- {
- var result = string.Compare(_statuses[y].ScreenName, _statuses[x].ScreenName);
- if (result == 0) result = y.CompareTo(x);
- return result;
- }
-
- // ユーザー名比較 昇順
- public int Compare_ModeNickName_Ascending(long x, long y)
- {
- var result = string.Compare(_statuses[x].Nickname, _statuses[y].Nickname);
- if (result == 0) result = x.CompareTo(y);
- return result;
- }
-
- // ユーザー名比較 降順
- public int Compare_ModeNickName_Descending(long x, long y)
- {
- var result = string.Compare(_statuses[y].Nickname, _statuses[x].Nickname);
- if (result == 0) result = y.CompareTo(x);
- return result;
- }
-
- // Source比較 昇順
- public int Compare_ModeSource_Ascending(long x, long y)
- {
- var result = string.Compare(_statuses[x].Source, _statuses[y].Source);
- if (result == 0) result = x.CompareTo(y);
- return result;
- }
-
- // Source比較 降順
- public int Compare_ModeSource_Descending(long x, long y)
- {
- var result = string.Compare(_statuses[y].Source, _statuses[x].Source);
- if (result == 0) result = y.CompareTo(x);
- return result;
- }
+ Id,
+ Data,
+ Name,
+ Nickname,
+ Source,
}
}
int c = 0;
switch (_statuses.SortMode)
{
- case IdComparerClass.ComparerMode.Nickname: //ニックネーム
+ case ComparerMode.Nickname: //ニックネーム
c = 1;
break;
- case IdComparerClass.ComparerMode.Data: //本文
+ case ComparerMode.Data: //本文
c = 2;
break;
- case IdComparerClass.ComparerMode.Id: //時刻=発言Id
+ case ComparerMode.Id: //時刻=発言Id
c = 3;
break;
- case IdComparerClass.ComparerMode.Name: //名前
+ case ComparerMode.Name: //名前
c = 4;
break;
- case IdComparerClass.ComparerMode.Source: //Source
+ case ComparerMode.Source: //Source
c = 7;
break;
}
////////////////////////////////////////////////////////////////////////////////
_statuses.SortOrder = (SortOrder)_cfgCommon.SortOrder;
- IdComparerClass.ComparerMode mode = IdComparerClass.ComparerMode.Id;
+ var mode = ComparerMode.Id;
switch (_cfgCommon.SortColumn)
{
case 0: //0:アイコン,5:未読マーク,6:プロテクト・フィルターマーク
case 5:
case 6:
//ソートしない
- mode = IdComparerClass.ComparerMode.Id; //Idソートに読み替え
+ mode = ComparerMode.Id; //Idソートに読み替え
break;
case 1: //ニックネーム
- mode = IdComparerClass.ComparerMode.Nickname;
+ mode = ComparerMode.Nickname;
break;
case 2: //本文
- mode = IdComparerClass.ComparerMode.Data;
+ mode = ComparerMode.Data;
break;
case 3: //時刻=発言Id
- mode = IdComparerClass.ComparerMode.Id;
+ mode = ComparerMode.Id;
break;
case 4: //名前
- mode = IdComparerClass.ComparerMode.Name;
+ mode = ComparerMode.Name;
break;
case 7: //Source
- mode = IdComparerClass.ComparerMode.Source;
+ mode = ComparerMode.Source;
break;
}
_statuses.SortMode = mode;
long topId = -1;
if (_curList != null && _curTab != null && _curList.VirtualListSize > 0)
{
- if (_statuses.SortMode == IdComparerClass.ComparerMode.Id)
+ if (_statuses.SortMode == ComparerMode.Id)
{
if (_statuses.SortOrder == SortOrder.Ascending)
{
private void MyList_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (this._cfgCommon.SortOrderLock) return;
- IdComparerClass.ComparerMode mode = IdComparerClass.ComparerMode.Id;
+ var mode = ComparerMode.Id;
if (_iconCol)
{
- mode = IdComparerClass.ComparerMode.Id;
+ mode = ComparerMode.Id;
}
else
{
//ソートしない
return;
case 1: //ニックネーム
- mode = IdComparerClass.ComparerMode.Nickname;
+ mode = ComparerMode.Nickname;
break;
case 2: //本文
- mode = IdComparerClass.ComparerMode.Data;
+ mode = ComparerMode.Data;
break;
case 3: //時刻=発言Id
- mode = IdComparerClass.ComparerMode.Id;
+ mode = ComparerMode.Id;
break;
case 4: //名前
- mode = IdComparerClass.ComparerMode.Name;
+ mode = ComparerMode.Name;
break;
case 7: //Source
- mode = IdComparerClass.ComparerMode.Source;
+ mode = ComparerMode.Source;
break;
}
}
if (lst.VirtualListSize > 0 && idx > -1 && lst.VirtualListSize > idx)
{
SelectListItem(lst, idx);
- if (_statuses.SortMode == IdComparerClass.ComparerMode.Id)
+ if (_statuses.SortMode == ComparerMode.Id)
{
if (_statuses.SortOrder == SortOrder.Ascending && lst.Items[idx].Position.Y > lst.ClientSize.Height - _iconSz - 10 ||
_statuses.SortOrder == SortOrder.Descending && lst.Items[idx].Position.Y < _iconSz + 10)
_cfgCommon.SortOrder = (int)_statuses.SortOrder;
switch (_statuses.SortMode)
{
- case IdComparerClass.ComparerMode.Nickname: //ニックネーム
+ case ComparerMode.Nickname: //ニックネーム
_cfgCommon.SortColumn = 1;
break;
- case IdComparerClass.ComparerMode.Data: //本文
+ case ComparerMode.Data: //本文
_cfgCommon.SortColumn = 2;
break;
- case IdComparerClass.ComparerMode.Id: //時刻=発言Id
+ case ComparerMode.Id: //時刻=発言Id
_cfgCommon.SortColumn = 3;
break;
- case IdComparerClass.ComparerMode.Name: //名前
+ case ComparerMode.Name: //名前
_cfgCommon.SortColumn = 4;
break;
- case IdComparerClass.ComparerMode.Source: //Source
+ case ComparerMode.Source: //Source
_cfgCommon.SortColumn = 7;
break;
}