Beispiel #1
0
        /// <summary>
        /// Build the layout for this item from the message.
        /// </summary>
        protected override CanvasItemLayout BuildLayout()
        {
            CanvasItemLayout newLayout = new CanvasItemLayout(this, DrawRectangle);
            if (Folder != null)
            {
                // Forum category icon, if one is present. At some point we should
                // replace this with an actual forum icon.
                Image categoryImage = null;

                if (Forum != null)
                {
                    categoryImage = CategoryFolder.IconForCategory(Forum.Cat);
                }
                if (categoryImage == null)
                {
                    categoryImage = Resources.Categories;
                }
                if (categoryImage != null)
                {
                    newLayout.Add(new CanvasImage
                    {
                        ID = ActionID.None,
                        Image = categoryImage,
                        ImageWidth = 50,
                        ImageHeight = 50
                    });
                    newLayout.AddNewColumn();
                }

                // Forum name
                newLayout.Add(new CanvasText
                {
                    ID = ActionID.None,
                    Text = Folder.Name,
                    Font = NameFont,
                    LineHeight = NameFont.Height + 10,
                    ForeColour = UI.System.ForegroundColour
                });
                newLayout.AddNewLine();

                // Forum title.
                if (Forum != null && !string.IsNullOrEmpty(Forum.Title))
                {
                    newLayout.Add(new CanvasHTMLText
                    {
                        ID = ActionID.None,
                        Text = Forum.Title,
                        Font = TitleFont,
                        ForeColour = UI.System.ForegroundColour,
                        SpaceAfter = 15
                    });
                    newLayout.AddNewLine();
                }

                // Forum description.
                if (Forum != null && !string.IsNullOrEmpty(Forum.Desc))
                {
                    newLayout.Add(new CanvasHTMLText
                    {
                        ID = ActionID.None,
                        HTMLText = Forum.Desc,
                        Font = DescriptionFont,
                        ForeColour = UI.System.ForegroundColour,
                        SpaceAfter = 15
                    });
                    newLayout.AddNewLine();
                }

                // If the Join is pending, say so.
                if (Forum != null && Forum.JoinPending)
                {
                    newLayout.Add(new CanvasImage
                    {
                        Image = Resources.Warning,
                        ImageWidth = 16,
                        ImageHeight = 16
                    });

                    newLayout.Add(new CanvasText
                    {
                        ID = ActionID.None,
                        Text = Resources.JoinPending,
                        LineHeight = 16,
                        Margin = new Rectangle(0, 0, 0, 15),
                        Font = Font
                    });
                    newLayout.AddNewLine();
                }

                // If a Resign is pending, say so.
                if (Folder.ResignPending)
                {
                    newLayout.Add(new CanvasImage
                    {
                        Image = Resources.Warning,
                        ImageWidth = 16,
                        ImageHeight = 16
                    });

                    newLayout.Add(new CanvasText
                    {
                        ID = ActionID.None,
                        Text = Resources.ResignPending,
                        LineHeight = 16,
                        Margin = new Rectangle(0, 0, 0, 15),
                        Font = Font,
                    });
                    newLayout.AddNewLine();
                }

                // If the Join failed, say so too.
                if (Folder.Flags.HasFlag(FolderFlags.JoinFailed))
                {
                    newLayout.Add(new CanvasImage
                    {
                        Image = Resources.Error1,
                        ImageWidth = 16,
                        ImageHeight = 16
                    });

                    newLayout.Add(new CanvasText
                    {
                        ID = ActionID.None,
                        Text = Resources.JoinFailure,
                        LineHeight = 16,
                        Font = Font,
                        Margin = new Rectangle(0, 0, 0, 15)
                    });
                    newLayout.AddNewLine();
                }

                // Resign/Join button
                // Don't display if the forum doesn't permit the user to resign it.
                if (Folder.CanResign)
                {
                    if (Folder.IsResigned ||
                        Folder.Flags.HasFlag(FolderFlags.JoinFailed) ||
                        Folder.ResignPending)
                    {
                        newLayout.Add(new CanvasButton
                        {
                            ID = ActionID.JoinForum,
                            Text = Resources.JoinForum,
                            Font = DescriptionFont,
                            ForeColour = UI.System.ForegroundColour,
                            SpaceAfter = 15
                        });
                    }
                    else
                    {
                        newLayout.Add(new CanvasButton
                        {
                            ID = ActionID.ResignForum,
                            Text = Resources.ResignForum,
                            Font = DescriptionFont,
                            ForeColour = UI.System.ForegroundColour,
                            SpaceAfter = 15
                        });
                    }
                }

                // Delete button
                // Offer the option to delete the folder if we're not joined to it
                newLayout.Add(new CanvasButton
                {
                    ID = ActionID.Delete,
                    Text = Resources.DeleteFolder,
                    Font = DescriptionFont,
                    ForeColour = UI.System.ForegroundColour,
                    SpaceAfter = 15
                });

                // Add Participants button
                newLayout.Add(new CanvasButton
                {
                    ID = ActionID.Participants,
                    Text = Resources.Participants,
                    Font = DescriptionFont,
                    ForeColour = UI.System.ForegroundColour,
                    SpaceAfter = 15
                });

                // Refresh button
                newLayout.Add(new CanvasButton
                {
                    ID = ActionID.Refresh,
                    Text = Resources.RefreshText,
                    Font = DescriptionFont,
                    ForeColour = UI.System.ForegroundColour,
                    SpaceAfter = 15
                });

                // Manage Forum button
                if (Forum != null && Forum.IsModerator)
                {
                    newLayout.Add(new CanvasButton
                    {
                        ID = ActionID.ManageForum,
                        Text = Resources.ManageForum,
                        Font = DescriptionFont,
                        ForeColour = UI.System.ForegroundColour,
                        SpaceAfter = 15
                    });
                }
            }
            return newLayout;
        }
Beispiel #2
0
        /// <summary>
        /// Build the layout for this item from the message.
        /// </summary>
        protected override CanvasItemLayout BuildLayout()
        {
            CanvasItemLayout newLayout = new CanvasItemLayout(this, DrawRectangle);

            newLayout.Add(new CanvasImage
            {
                ImageWidth = 100,
                ImageHeight = 100,
                Image = Program.CIXReaderLogo,
                Margin = new Rectangle(0, 0, 10, 0)
            });

            newLayout.AddNewColumn();

            newLayout.Add(new CanvasText
            {
                Text = Resources.WelcomeTitle,
                Font = UI.GetFont(UI.System.font, 20),
                ForeColour = UI.Forums.BodyColour
            });

            newLayout.AddNewLine();

            newLayout.Add(new CanvasHTMLText
            {
                Text = Resources.WelcomeSubtitle,
                Font = _font,
                ForeColour = UI.Forums.BodyColour
            });

            newLayout.AddNewLine();

            if (Threads.Count > 0)
            {
                newLayout.Add(new CanvasText
                {
                    Text = Resources.TopThreads,
                    Font = _headerFont,
                    ForeColour = UI.Forums.BodyColour,
                    Margin = new Rectangle(0, 0, 0, 15)
                });

                newLayout.AddNewLine();
            }
            foreach (CIXThread thread in Threads)
            {
                newLayout.AddBeginSection();

                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.AuthorImage,
                    ImageWidth = 40,
                    ImageHeight = 40,
                    Tag = thread.Author,
                    Margin = new Rectangle(0, 0, 5, 0),
                    Image = Mugshot.MugshotForUser(thread.Author, true).RealImage
                });

                newLayout.AddNewColumn();

                string bodyText = thread.Body ?? string.Empty;
                newLayout.Add(new CanvasText
                {
                    ID = ActionID.GoToSource,
                    Text = bodyText.FirstLine().TruncateByWordWithLimit(80),
                    Font = _font,
                    Tag = thread,
                    Alignment = CanvasTextAlign.Top,
                    LineHeight = _headerLineHeight,
                    ForeColour = UI.Forums.BodyColour
                });

                newLayout.AddNewLine();

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.AuthorImage,
                    Text = string.Format(Resources.StartedBy, thread.Author),
                    Font = _font,
                    Alignment = CanvasTextAlign.Top,
                    Tag = thread.Author,
                    LineHeight = _headerLineHeight,
                    ForeColour = UI.Forums.HeaderFooterColour
                });

                AddSeparatorItem(newLayout, _headerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.GoToSource,
                    Text = string.Format("{0}/{1}", thread.Forum, thread.Topic),
                    Font = _font,
                    Tag = thread,
                    Alignment = CanvasTextAlign.Top,
                    LineHeight = _headerLineHeight,
                    Margin = new Rectangle(0, 0, 0, 15),
                    ForeColour = UI.System.LinkColour
                });

                AddSeparatorItem(newLayout, _headerLineHeight);

                newLayout.Add(new CanvasText
                {
                    Text = string.Format("posted at {0}", thread.Date.FriendlyString(true)),
                    Font = _font,
                    Tag = thread,
                    Alignment = CanvasTextAlign.Top,
                    LineHeight = _headerLineHeight,
                    Margin = new Rectangle(0, 0, 0, 15),
                    ForeColour = UI.Forums.HeaderFooterColour
                });

                newLayout.AddEndSection();
            }

            if (OnlineUsers.Users != null)
            {
                newLayout.Add(new CanvasText
                {
                    Text = Resources.OnlineUsers,
                    Font = _headerFont,
                    ForeColour = UI.Forums.BodyColour,
                    Margin = new Rectangle(0, 0, 0, 15)
                });

                newLayout.AddNewLine();

                foreach (OnlineUser user in OnlineUsers.Users)
                {
                    newLayout.Add(new CanvasImage
                    {
                        ID = ActionID.AuthorImage,
                        Image = Mugshot.MugshotForUser(user.Name, true).RealImage,
                        Text = user.Name,
                        Font = UI.GetFont(UI.System.font, 8),
                        Tag = user.Name,
                        NoWrap = true,
                        ForeColour = UI.System.ForegroundColour,
                        ImageWidth = 80,
                        ImageHeight = 80
                    });

                }
            }
            return newLayout;
        }
Beispiel #3
0
        /// <summary>
        /// Build the layout for this item from the message.
        /// </summary>
        protected override CanvasItemLayout BuildLayout()
        {
            CanvasItemLayout newLayout = new CanvasItemLayout(this, DrawRectangle);
            if (Message != null)
            {
                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.AuthorImage,
                    Image = Image,
                    ImageWidth = 50,
                    ImageHeight = 50
                });
                newLayout.AddNewColumn();

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Profile,
                    Text = Message.Author,
                    Font = _authorFont,
                    LineHeight = _headerLineHeight,
                    ForeColour = UI.Forums.HeaderFooterColour,
                });

                AddSeparatorItem(newLayout, _headerLineHeight);

                newLayout.Add(new CanvasText
                {
                    Text = FullDateString ? Message.Date.ToString("d MMM yyyy") + " " + Message.Date.ToShortTimeString() : Message.Date.FriendlyString(true),
                    Font = _font,
                    LineHeight = _headerLineHeight,
                    ForeColour = UI.Forums.HeaderFooterColour,
                });
                newLayout.AddNewLine();

                newLayout.Add(new CanvasHTMLText
                {
                    Text = Message.Body,
                    Font = _font,
                    ExpandInlineImages = _view.ExpandInlineImages,
                    DisableMarkup = _view.DisableMarkup,
                    ForeColour = ForeColor
                });
                newLayout.AddNewLine();
            }
            return newLayout;
        }
        /// <summary>
        /// Build the layout for this item.
        /// </summary>
        protected override CanvasItemLayout BuildLayout()
        {
            CanvasItemLayout newLayout = new CanvasItemLayout(this, DrawRectangle);
            if (Items != null)
            {
                // Title
                newLayout.Add(new CanvasText
                {
                    ID = ActionID.None,
                    ForeColour = UI.System.ForegroundColour,
                    Alignment = CanvasTextAlign.Top,
                    LineHeight = 30,
                    Font = UI.GetFont(UI.System.font, 12),
                    Text = Title
                });
                newLayout.AddNewLine();

                // Iterate and show an image for every profile.
                foreach (string username in Items)
                {
                    newLayout.Add(new CanvasImage
                    {
                        ID = ActionID.AuthorImage,
                        Image = Mugshot.MugshotForUser(username, true).RealImage,
                        Text = username,
                        Font = UI.GetFont(UI.System.font, 8),
                        Tag = username,
                        NoWrap = SingleLine,
                        ForeColour = UI.System.ForegroundColour,
                        ImageWidth = 80,
                        ImageHeight = 80
                    });
                }
                newLayout.AddNewLine();
            }
            return newLayout;
        }
Beispiel #5
0
        /// <summary>
        /// Build the layout for a full message.
        /// </summary>
        private CanvasItemLayout BuildFullLayout(CanvasItemLayout newLayout, bool canExpandRoot)
        {
            bool isWithdrawn = Message.IsWithdrawn;

            if (Image != null)
            {
                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.AuthorImage,
                    Image = Image,
                    ImageWidth = 50,
                    ImageHeight = 50,
                    Margin = new Rectangle(0, 0, 7, 0)
                });
                newLayout.AddNewColumn();
            }

            if (canExpandRoot)
            {
                if (Message.IsRoot && Message.ChildCount > 0)
                {
                    newLayout.Add(new CanvasImage
                    {
                        ID = ActionID.Expand,
                        Image = Resources.CollapseArrow
                    });
                }

                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.Read,
                    Image = ReadImageForMessage(),
                    LineHeight = _headerLineHeight
                });
            }

            newLayout.Add(new CanvasText
            {
                ID = ActionID.Profile,
                Text = Message.Author,
                Font = _headerFont,
                LineHeight = _headerLineHeight,
                ForeColour = ReadColourForMessage(),
            });

            AddSeparatorItem(newLayout, _headerLineHeight);

            newLayout.Add(new CanvasText
            {
                Text = DateForMessage(),
                Font = _headerFont,
                LineHeight = _headerLineHeight,
                ForeColour = HeaderFooterColour(),
            });

            newLayout.Add(new CanvasImage
            {
                ID = ActionID.Star,
                Image = Message.Starred ? Resources.ActiveStar : Resources.InactiveStar,
                LineHeight = _headerLineHeight
            });

            if (Message.IsDraft)
            {
                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.Edit,
                    Image = Resources.Draft,
                    LineHeight = _headerLineHeight
                });
            }

            newLayout.Add(new CanvasText
            {
                ID = ActionID.Link,
                Text = string.Format(" {0}", !Message.IsPseudo ? Message.RemoteID.ToString(CultureInfo.InvariantCulture) : Resources.DraftText),
                Font = _headerFont,
                ToolTipString = (ShowTooltips) ? Resources.LinkTooltip : null,
                LineHeight = _headerLineHeight,
                ForeColour = HeaderFooterColour(),
            });

            if (!Message.IsRoot)
            {
                AddSeparatorItem(newLayout, _headerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Original,
                    Text = string.Format(Resources.ReplyToMessage, Message.CommentID),
                    Font = _headerFont,
                    LineHeight = _headerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });
            }

            newLayout.AddNewLine();

            if (ShowFolder)
            {
                newLayout.Add(new CanvasImage
                {
                    ID = ActionID.GoToSource,
                    Image = Resources.Topic,
                    LineHeight = _headerLineHeight
                });

                Folder topic = Message.Topic;
                Folder forum = topic.ParentFolder;

                newLayout.Add(new CanvasText
                {
                    Text = string.Format("{0}/{1}", forum.Name, topic.Name),
                    Font = _font,
                    ID = ActionID.GoToSource,
                    LineHeight = _headerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });

                newLayout.AddNewLine();
            }

            string bodyText = Message.Body ?? string.Empty;
            newLayout.Add(new CanvasHTMLText
            {
                Text = bodyText,
                Font = _font,
                ExpandInlineImages = _view.ExpandInlineImages,
                Highlight = Highlight,
                DisableMarkup = _view.DisableMarkup,
                LineHeight = (Level == 0 || Selected) ? 0 : _compactHeight,
                BackColor = Color.Transparent,
                ForeColour = (Message.Ignored || isWithdrawn) ? HeaderFooterColour() : ForeColor,
                SpaceAfter = 5
            });

            newLayout.AddNewLine();

            // Add an e-mail link to contact the author
            newLayout.Add(new CanvasImage
            {
                ID = ActionID.Email,
                Image = Resources.Mail,
                LineHeight = _footerLineHeight
            });

            // The user can only comment on messages which have been synced with the server.
            // Otherwise for draft messages that are not pending, they can edit them as long
            // as the network is offline as otherwise the transition from draft to sync will
            // be too quick.
            Folder folder = Message.Topic;
            Folder forumFolder = folder.ParentFolder;
            DirForum dirforum = CIX.DirectoryCollection.ForumByName(forumFolder.Name);
            bool isModerator = dirforum != null && dirforum.IsModerator;
            bool canReply = !(folder.Flags.HasFlag(FolderFlags.OwnerCommentsOnly) && !Message.IsMine);
            if (folder.IsReadOnly && !isModerator)
            {
                canReply = false;
            }
            if (canReply)
            {
                if (!Message.IsPseudo)
                {
                    AddSeparatorItem(newLayout, _footerLineHeight);

                    newLayout.Add(new CanvasText
                    {
                        ID = ActionID.Reply,
                        Text = Resources.Comment,
                        Font = _footerFont,
                        LineHeight = _footerLineHeight,
                        ForeColour = HeaderFooterColour(),
                    });
                }
                else if (Message.IsDraft)
                {
                    AddSeparatorItem(newLayout, _footerLineHeight);

                    newLayout.Add(new CanvasText
                    {
                        ID = ActionID.Edit,
                        Text = Resources.Edit,
                        Font = _footerFont,
                        LineHeight = _footerLineHeight,
                        ForeColour = HeaderFooterColour(),
                    });
                }
            }

            // Ignore
            if (!Message.IsPseudo)
            {
                AddSeparatorItem(newLayout, _footerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Ignore,
                    Text = Message.Ignored ? Resources.Unignore : Resources.Ignore,
                    Font = _footerFont,
                    LineHeight = _footerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });
                AddSeparatorItem(newLayout, _footerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Priority,
                    Text = Message.Priority ? Resources.Normal : Resources.Priority,
                    Font = _footerFont,
                    LineHeight = _footerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });
            }

            // Allow withdraw if we own this message or we are a moderator
            // of the forum.
            if ((Message.IsMine || isModerator) && !Message.IsPseudo && !isWithdrawn)
            {
                AddSeparatorItem(newLayout, _footerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Withdraw,
                    Text = Resources.Withdraw,
                    Font = _footerFont,
                    LineHeight = _footerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });
            }

            // Allow delete if this is a local draft
            if (Message.IsPseudo)
            {
                AddSeparatorItem(newLayout, _footerLineHeight);

                newLayout.Add(new CanvasText
                {
                    ID = ActionID.Delete,
                    Text = Resources.Delete,
                    Font = _footerFont,
                    LineHeight = _footerLineHeight,
                    ForeColour = HeaderFooterColour(),
                });
            }

            return newLayout;
        }
Beispiel #6
0
        /// <summary>
        /// Build the layout for a collapsed root message.
        /// </summary>
        private CanvasItemLayout BuildCollapsedLayout(CanvasItemLayout newLayout)
        {
            // Need to reset the item colour because the item may have changed from being local
            ItemColour = UI.Forums.CollapsedColour;

            newLayout.Add(new CanvasImage
            {
                ID = ActionID.AuthorImage,
                Image = Image,
                ImageWidth = 50,
                ImageHeight = 50
            });

            newLayout.AddNewColumn();

            newLayout.Add(new CanvasImage
            {
                ID = ActionID.Expand,
                Image = Resources.ExpandArrow,
                LineHeight = _headerLineHeight
            });

            newLayout.Add(new CanvasImage
            {
                ID = ActionID.Read,
                Image = Message.Unread ? Resources.UnreadMessage : Resources.ReadMessage,
                LineHeight = _headerLineHeight
            });

            newLayout.Add(new CanvasText
            {
                ID = ActionID.Profile,
                Text = Message.Author,
                Font = _headerFont,
                LineHeight = _headerLineHeight,
                ForeColour = ReadColourForMessage(),
            });

            AddSeparatorItem(newLayout, _headerLineHeight);

            newLayout.Add(new CanvasText
            {
                Text = DateForMessage(),
                Font = _headerFont,
                LineHeight = _headerLineHeight,
                ForeColour = HeaderFooterColour(),
            });

            newLayout.AddNewLine();

            // First two lines of the message body
            string bodyText = Message.Body ?? string.Empty;
            newLayout.Add(new CanvasText
            {
                Text = bodyText.FirstLine(),
                Font = _headerFont,
                LineHeight = _compactHeight,
                ForeColour = Selected ? UI.System.SelectionTextColour : ForeColor,
            });
            newLayout.AddNewLine();

            // Footer line
            newLayout.Add(new CanvasImage
            {
                ID = ActionID.Expand,
                Image = Resources.Bubble,
                ImageWidth = 14,
                ImageHeight = 14
            });

            newLayout.Add(new CanvasText
            {
                ID = ActionID.Expand,
                Text = (Message.ChildCount > 1) ? string.Format(Resources.ManyReplies, Message.ChildCount) : Resources.OneReply,
                Font = _footerFont,
                LineHeight = _footerLineHeight,
                ForeColour = HeaderFooterColour(),
            });

            AddSeparatorItem(newLayout, _footerLineHeight);

            // Ignore
            newLayout.Add(new CanvasText
            {
                ID = ActionID.Ignore,
                Text = Message.Ignored ? Resources.Unignore : Resources.Ignore,
                Font = _footerFont,
                LineHeight = _footerLineHeight,
                ForeColour = HeaderFooterColour(),
            });

            return newLayout;
        }