private void RefreshBoard() { ActiveThreads.Clear(); PostView.Nodes.Clear(); ThreadMap.Clear(); if (ButtonHigh.Checked && ButtonLow.Checked) { CurrentScope = ScopeType.All; } else if (ButtonHigh.Checked) { CurrentScope = ScopeType.High; } else if (ButtonLow.Checked) { CurrentScope = ScopeType.Low; } else { CurrentScope = ScopeType.None; } HighIDs = Boards.GetBoardRegion(UserID, ProjectID, ScopeType.High); LowIDs = Boards.GetBoardRegion(UserID, ProjectID, ScopeType.Low); Boards.LoadRegion(UserID, ProjectID); List <ulong> localIDs = Boards.GetBoardRegion(UserID, ProjectID, ScopeType.All); foreach (ulong target in localIDs) { OpBoard board = Boards.GetBoard(target); if (board == null) { Boards.LoadHeader(target); // updateinterface called in processheader continue; } // call update for all posts board.Posts.LockReading(delegate() { foreach (OpPost post in board.Posts.Values) { if (post.Header.ProjectID == ProjectID) { Board_PostUpdate(post); } } }); } //SetHeader(""); //PostBody.Rtf = ""; }
void Board_PostUpdate(OpPost post) { if (post == null) { RefreshBoard(); return; } if (post.Header.ProjectID != ProjectID) { return; } if (post.Header.Archived != ArchiveButton.Checked) { return; } ScopeType level = ScopeType.All; bool pass = false; // check if belongs in list if (post.Header.TargetID == UserID) { if ((post.Header.Scope == ScopeType.High && CurrentScope == ScopeType.Low) || (post.Header.Scope == ScopeType.Low && CurrentScope == ScopeType.High)) { return; // pass fail } pass = true; } else if (CurrentScope != ScopeType.None) // use else because local id is in highIDs { if (HighIDs.Contains(post.Header.TargetID) && // high user CurrentScope != ScopeType.Low && // view filter post.Header.Scope != ScopeType.High) // post meant for high user's highers, not us { pass = true; level = ScopeType.High; } else if (LowIDs.Contains(post.Header.TargetID) && // low user CurrentScope != ScopeType.High && // view filter post.Header.Scope != ScopeType.Low) // post meant for low user's lowers, not us { pass = true; level = ScopeType.Low; } } if (!pass) { return; } // parent thread if (post.Header.ParentID == 0) { PostViewNode node = null; if (!ThreadMap.ContainsKey(post.Ident)) { node = new PostViewNode(Boards, post, level, post.Header.Scope); ThreadMap[post.Ident] = node; AddPostNode(PostView.Nodes, node, false); } else { node = ThreadMap[post.Ident]; node.Update(Boards, post); } if (node.Selected) { ShowMessage(post, null); } } // reply - must be on active threads list to show else { OpBoard board = Boards.GetBoard(post.Header.TargetID); if (board == null) { return; } PostUID parentUid = new PostUID(post.Header.TargetID, post.Header.ProjectID, post.Header.ParentID); OpPost parentPost = Boards.GetPost(post.Header.TargetID, parentUid); if (parentPost == null) { return; } int parentIdent = parentPost.Ident; if (!ThreadMap.ContainsKey(parentIdent)) { return; } PostViewNode parent = ThreadMap[parentIdent]; parent.Update(Boards, parentPost); // if post has replies, add an empty item below so it has an expand option if (!ActiveThreads.ContainsKey(parentIdent)) { if (parent.Nodes.Count == 0) { parent.Nodes.Add(new TreeListNode()); } PostView.Invalidate(); return; } // else post is active PostViewNode replyNode = null; if (!ActiveThreads[parentIdent].ContainsKey(post.Ident)) { replyNode = new PostViewNode(Boards, post, ScopeType.All, ScopeType.All); ActiveThreads[parentIdent][post.Ident] = replyNode; AddPostNode(parent.Nodes, replyNode, true); } else { replyNode = ActiveThreads[parentIdent][post.Ident]; replyNode.Update(Boards, post); } if (replyNode.Selected) { ShowMessage(replyNode.Post, parent.Post); } PostView.Invalidate(); } }