Exemplo n.º 1
0
        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 = "";
        }
Exemplo n.º 2
0
        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();
            }
        }