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)