MainWindow.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using System;
  2. using Gtk;
  3. using Gdk;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.Text;
  8. using Newtonsoft.Json.Linq;
  9. using Crown.Console;
  10. using Crown.Core;
  11. public partial class MainWindow: Gtk.Window
  12. {
  13. private EntryHistory History = new EntryHistory(256);
  14. private ConsoleClient Client = null;
  15. private ActionGroup Actions = null;
  16. private UIManager UI = new UIManager();
  17. private ScrolledWindow scrolledwindow1;
  18. private TextView textview1;
  19. private Entry entry1;
  20. private string Address = "127.0.0.1";
  21. private int Port = 10001;
  22. public MainWindow (): base (Gtk.WindowType.Toplevel)
  23. {
  24. Build ();
  25. ActionEntry[] entries = new ActionEntry[] {
  26. new ActionEntry("Unpause", null, "Unpause", "<ctrl>U", null, OnUnpause),
  27. new ActionEntry("EngineMenu", null, "_Engine", null, null, null),
  28. new ActionEntry("RebuildAndReload", null, "Rebuild And Reload", null, null, OnRebuildAndReload),
  29. new ActionEntry("ScriptMenu", null, "_Script", null, null, null),
  30. new ActionEntry("Reconnect", null, "Reconnect", "<ctrl>R", null, null),
  31. new ActionEntry("ConnectMenu", null, "_Connect", null, null, null)
  32. };
  33. Actions = new ActionGroup("group");
  34. Actions.Add(entries);
  35. UI.InsertActionGroup(Actions, 0);
  36. UI.AddUiFromResource("Menu.xml");
  37. AddAccelGroup(UI.AccelGroup);
  38. MenuBar menuBar = (MenuBar)UI.GetWidget("/MenuBar");
  39. vbox1.PackStart(menuBar, false, false, 0);
  40. // Create tags for color-formatted text
  41. TextTag tagInfo = new Gtk.TextTag ("info");
  42. tagInfo.BackgroundGdk = new Gdk.Color (255, 255, 255);
  43. TextTag tagWarning = new Gtk.TextTag ("warning");
  44. tagWarning.BackgroundGdk = new Gdk.Color (255, 255, 153);
  45. TextTag tagError = new Gtk.TextTag ("error");
  46. tagError.BackgroundGdk = new Gdk.Color (255, 153, 153);
  47. TextTag tagDebug = new Gtk.TextTag ("debug");
  48. tagDebug.BackgroundGdk = new Gdk.Color (224, 224, 224);
  49. textview1 = new TextView();
  50. textview1.Editable = false;
  51. textview1.CanFocus = false;
  52. TextBuffer textbuffer1 = textview1.Buffer;
  53. textbuffer1.TagTable.Add (tagInfo);
  54. textbuffer1.TagTable.Add (tagWarning);
  55. textbuffer1.TagTable.Add (tagError);
  56. textbuffer1.TagTable.Add (tagDebug);
  57. scrolledwindow1 = new ScrolledWindow();
  58. scrolledwindow1.Add(textview1);
  59. vbox1.PackStart(scrolledwindow1, true, true, 0);
  60. entry1 = new Entry();
  61. entry1.KeyPressEvent += new KeyPressEventHandler(OnEntryKeyPressed);
  62. entry1.Activated += new EventHandler(OnEntryActivated);
  63. vbox1.PackStart(entry1, false, true, 0);
  64. EnableMainMenu(false);
  65. Actions.GetAction("ScriptMenu").Sensitive = false;
  66. Client = new ConsoleClient();
  67. Client.ConnectedEvent += OnConnected;
  68. Client.DisconnectedEvent += OnDisconnected;
  69. Client.MessageReceivedEvent += OnMessageReceived;
  70. Connect(Address, Port);
  71. ShowAll();
  72. }
  73. protected void EnableMainMenu(bool enable)
  74. {
  75. Actions.GetAction("EngineMenu").Sensitive = enable;
  76. // Actions.GetAction("ScriptMenu").Sensitive = enable;
  77. }
  78. protected void OnConnected(object o, ConnectedArgs args)
  79. {
  80. EnableMainMenu(true);
  81. LogInfo("Connected to " + args.Address + ":" + args.Port.ToString() + "\n");
  82. }
  83. protected void OnDisconnected(object o, DisconnectedArgs args)
  84. {
  85. EnableMainMenu(false);
  86. LogInfo("Disconnected\n");
  87. }
  88. protected void Connect(string addr, int port)
  89. {
  90. LogInfo("Trying " + addr + ":" + port.ToString() + "\n");
  91. Client.Connect(addr, port);
  92. }
  93. protected void OnMessageReceived(object o, MessageReceivedArgs args)
  94. {
  95. JObject obj = JObject.Parse(args.Json);
  96. if (obj["type"].ToString() == "message")
  97. {
  98. string severity = obj["severity"].ToString();
  99. string message = obj["message"].ToString();
  100. if (severity == "info") LogInfo(message);
  101. else if (severity == "warning") LogWarning(message);
  102. else if (severity == "error") LogError(message);
  103. else if (severity == "debug") LogDebug(message);
  104. }
  105. }
  106. protected void OnEntryActivated (object sender, EventArgs e)
  107. {
  108. string text = entry1.Text;
  109. text = text.Trim ();
  110. // Do processing only if we have text
  111. if (text.Length > 0)
  112. {
  113. History.Push(text);
  114. Client.SendScript(text);
  115. LogInfo("> " + text + "\n");
  116. }
  117. entry1.Text = "";
  118. }
  119. protected void OnEntryKeyPressed (object o, KeyPressEventArgs args)
  120. {
  121. string text = "";
  122. switch (args.Event.Key)
  123. {
  124. case Gdk.Key.Down: text = History.Next(); break;
  125. case Gdk.Key.Up: text = History.Previous(); break;
  126. default: return; // Ignore other keys
  127. }
  128. entry1.Text = text;
  129. entry1.Position = entry1.Text.Length;
  130. args.RetVal = true;
  131. }
  132. protected void OnUnpause(object o, EventArgs args)
  133. {
  134. Client.Send("{\"type\":\"command\",\"command\":\"unpause\"}");
  135. }
  136. protected void OnRebuildAndReload(object o, EventArgs args)
  137. {
  138. Client.Send("{\"type\":\"command\",\"command\":\"reload\"}");
  139. }
  140. // Logging
  141. private void WriteLog(string text, string tag)
  142. {
  143. Gtk.Application.Invoke (delegate {
  144. TextIter endIter = textview1.Buffer.EndIter;
  145. textview1.Buffer.Insert(ref endIter, text);
  146. endIter.BackwardChars(text.Length);
  147. textview1.Buffer.ApplyTag(textview1.Buffer.TagTable.Lookup(tag), endIter, textview1.Buffer.EndIter);
  148. textview1.ScrollToMark(textview1.Buffer.CreateMark("bottom", textview1.Buffer.EndIter, false), 0, true, 0.0, 1.0);
  149. });
  150. }
  151. private void LogInfo(string text)
  152. {
  153. WriteLog(text, "info");
  154. }
  155. private void LogWarning(string text)
  156. {
  157. WriteLog(text, "warning");
  158. }
  159. private void LogError(string text)
  160. {
  161. WriteLog(text, "error");
  162. }
  163. private void LogDebug(string text)
  164. {
  165. WriteLog(text, "debug");
  166. }
  167. private void OnDeleteEvent (object sender, DeleteEventArgs a)
  168. {
  169. Application.Quit ();
  170. a.RetVal = true;
  171. }
  172. }