diff --git a/inf3.csproj b/inf3.csproj index d71f91a..eb5c186 100644 --- a/inf3.csproj +++ b/inf3.csproj @@ -78,6 +78,8 @@ + + diff --git a/src/Backend.cs b/src/Backend.cs index f42b9e8..433e674 100644 --- a/src/Backend.cs +++ b/src/Backend.cs @@ -12,6 +12,7 @@ namespace WorldOfPeacecraft private TcpClient Client; private Dictionary Dragons; private Dictionary Players; + private LinkedList ChatMessages; private Map Map; private Buffer SenderBuffer; private IGui Gui; @@ -21,6 +22,7 @@ namespace WorldOfPeacecraft Gui = gui; Dragons = new Dictionary (); Players = new Dictionary (); + ChatMessages = new LinkedList (); Client = new TcpClient ("localhost", 9999); Buffer receiverBuffer = new Buffer(10000); SenderBuffer = new Buffer(100); @@ -99,6 +101,16 @@ namespace WorldOfPeacecraft return Map.GetTiles (); } + public void AddChatMessage (Message message) + { + ChatMessages.AddLast (message); + } + + public IEnumerable GetChatMessages () + { + return ChatMessages; + } + public void SendCommand (string command) { SenderBuffer.AddLine (command); diff --git a/src/Gui/ChatOutputBox.cs b/src/Gui/ChatOutputBox.cs new file mode 100644 index 0000000..be05f88 --- /dev/null +++ b/src/Gui/ChatOutputBox.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace WorldOfPeacecraft +{ + public class ChatOutputBox : RichTextBox + { + private IBackend Backend; + private Font MessageFont; + private Font SenderFont; + private Font IregularSenderFont; + + public ChatOutputBox (IBackend backend) + { + Backend = backend; + this.ReadOnly = true; + this.Multiline = true; + MessageFont = this.SelectionFont; + SenderFont = new Font (MessageFont, FontStyle.Bold); + IregularSenderFont = new Font (MessageFont, FontStyle.Bold | FontStyle.Italic); + } + + public void UpdateData () + { + this.SuspendLayout (); + this.Clear (); + IEnumerable chatMessages = Backend.GetChatMessages (); + bool firstline = true; + lock (Backend) { + foreach (IChatMessage message in chatMessages) { + if (firstline) { + firstline = false; + } else { + this.AppendText ("\n"); + } + if (message.IsSenderPlayer ()) { + this.SelectionFont = SenderFont; + } else { + this.SelectionFont = IregularSenderFont; + } + this.AppendText (message.GetSender ()); + this.AppendText (": "); + this.SelectionFont = MessageFont; + this.AppendText (message.GetMessage ()); + } + } + this.ResumeLayout (); + } + } +} + diff --git a/src/Gui/ChatPanel.cs b/src/Gui/ChatPanel.cs index 3a95af3..bcc3e4e 100644 --- a/src/Gui/ChatPanel.cs +++ b/src/Gui/ChatPanel.cs @@ -6,7 +6,7 @@ namespace WorldOfPeacecraft public class ChatPanel : Panel { private ChatInputBox ChatInput; - private TextBox ChatOutput; + private ChatOutputBox ChatOutput; private IBackend Backend; public ChatPanel (IBackend backend) @@ -14,9 +14,7 @@ namespace WorldOfPeacecraft Backend = backend; ChatInput = new ChatInputBox (); ChatInput.ChatMessageSubmitted += OnChatMessageSent; - ChatOutput = new TextBox (); - ChatOutput.ReadOnly = true; - ChatOutput.Multiline = true; + ChatOutput = new ChatOutputBox (backend); this.Controls.Add (ChatInput); this.Controls.Add (ChatOutput); @@ -42,5 +40,10 @@ namespace WorldOfPeacecraft } // TODO Move focus to board? } + + public void UpdateData() + { + ChatOutput.UpdateData (); + } } } diff --git a/src/Gui/Gui.cs b/src/Gui/Gui.cs index 5323578..f8786da 100644 --- a/src/Gui/Gui.cs +++ b/src/Gui/Gui.cs @@ -146,6 +146,7 @@ namespace WorldOfPeacecraft ChatPanel.Size = new Size (ChatWidth, mapHeight); this.ResumeLayout(); this.PerformLayout(); + ChatPanel.UpdateData (); this.Refresh(); })); } diff --git a/src/Gui/IBackend.cs b/src/Gui/IBackend.cs index 1128290..7361313 100644 --- a/src/Gui/IBackend.cs +++ b/src/Gui/IBackend.cs @@ -10,6 +10,8 @@ namespace WorldOfPeacecraft IEnumerable GetDragons(); + IEnumerable GetChatMessages(); + void SendChatMessage (string message); void SendCommand (string command); diff --git a/src/Gui/IChatMessage.cs b/src/Gui/IChatMessage.cs new file mode 100644 index 0000000..69b40ba --- /dev/null +++ b/src/Gui/IChatMessage.cs @@ -0,0 +1,11 @@ +namespace WorldOfPeacecraft +{ + public interface IChatMessage + { + string GetMessage(); + + string GetSender(); + + bool IsSenderPlayer(); + } +} \ No newline at end of file diff --git a/src/Message.cs b/src/Message.cs index 794e6f1..1ee3d99 100644 --- a/src/Message.cs +++ b/src/Message.cs @@ -2,7 +2,7 @@ namespace WorldOfPeacecraft { - public class Message + public class Message : IChatMessage { int sourceID; string source; @@ -14,6 +14,21 @@ namespace WorldOfPeacecraft source = src; text = txt; } + + public string GetMessage() + { + return text; + } + + public string GetSender() + { + return source; + } + + public bool IsSenderPlayer () + { + return true; + } } } diff --git a/src/Parser.cs b/src/Parser.cs index 01d9d09..265ed56 100644 --- a/src/Parser.cs +++ b/src/Parser.cs @@ -216,7 +216,10 @@ namespace WorldOfPeacecraft int srcid = mesBlock.GetIntValue (ValueSourceId); string src = mesBlock.GetStringValue (ValueSource); string txt = mesBlock.GetStringValue (ValueText); - Message m = new Message (srcid, src, txt); + lock (Backend) { + Backend.AddChatMessage (new Message (srcid, src, txt)); + } + Backend.RefreshGui (); } private void ProcessAnswer (Block block)