private void GoBackInReplyToPostTree(bool parallel = false, bool isForward = true)
{
if (_curPost == null) return;
TabModel curTabClass = _statuses.Tabs[_curTab.Text];
//Dictionary<long, PostClass> curTabPosts = curTabClass.Posts;
if (parallel)
{
if (_curPost.InReplyToStatusId != null)
{
var posts = from t in _statuses.Tabs
from p in t.Value.Posts
where p.Value.StatusId != _curPost.StatusId && p.Value.InReplyToStatusId == _curPost.InReplyToStatusId
let indexOf = t.Value.IndexOf(p.Value.StatusId)
where indexOf > -1
orderby isForward ? indexOf : indexOf * -1
orderby t.Value != curTabClass
select new {Tab = t.Value, Post = p.Value, Index = indexOf};
try
{
var postList = posts.ToList();
for (int i = postList.Count - 1; i >= 0; i--)
{
int index = i;
if (postList.FindIndex((pst) => { return pst.Post.StatusId == postList[index].Post.StatusId; }) != index)
{
postList.RemoveAt(index);
}
}
var post = postList.FirstOrDefault((pst) => { return pst.Tab == curTabClass && isForward ? pst.Index > _curItemIndex : pst.Index < _curItemIndex; });
if (post == null) post = postList.FirstOrDefault((pst) => { return pst.Tab != curTabClass; });
if (post == null) post = postList.First();
this.ListTab.SelectTab(this.ListTab.TabPages.Cast<TabPage>().First((tp) => { return tp.Text == post.Tab.TabName; }));
DetailsListView listView = (DetailsListView)this.ListTab.SelectedTab.Tag;
SelectListItem(listView, post.Index);
listView.EnsureVisible(post.Index);
}
catch (InvalidOperationException)
{
return;
}
}
}
else
{
if (replyChains == null || replyChains.Count < 1)
{
var posts = from t in _statuses.Tabs
from p in t.Value.Posts
where p.Value.InReplyToStatusId == _curPost.StatusId
let indexOf = t.Value.IndexOf(p.Value.StatusId)
where indexOf > -1
orderby indexOf
orderby t.Value != curTabClass
select new {Tab = t.Value, Index = indexOf};
try
{
var post = posts.First();
this.ListTab.SelectTab(this.ListTab.TabPages.Cast<TabPage>().First((tp) => { return tp.Text == post.Tab.TabName; }));
DetailsListView listView = (DetailsListView)this.ListTab.SelectedTab.Tag;
SelectListItem(listView, post.Index);
listView.EnsureVisible(post.Index);
}
catch (InvalidOperationException)
{
return;
}
}
else
{
ReplyChain chainHead = replyChains.Pop();
if (chainHead.InReplyToId == _curPost.StatusId)
{
int idx = _statuses.Tabs[chainHead.OriginalTab.Text].IndexOf(chainHead.OriginalId);
if (idx == -1)
{
replyChains = null;
}
else
{
try
{
ListTab.SelectTab(chainHead.OriginalTab);
}
catch (Exception)
{
replyChains = null;
}
SelectListItem(_curList, idx);
_curList.EnsureVisible(idx);
}
}
else
{
replyChains = null;
this.GoBackInReplyToPostTree(parallel);
}
}
}
}