using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; using TradeIdeas.MiscSupport; using TradeIdeas.TIQ.GUI; using TradeIdeas.TIQData; using TradeIdeas.ServerConnection; using TradeIdeas.XML; // TODO disable the inputs while we are still listening for messages. namespace TradeIdeas.TIQ { public partial class GridMultiTester : Form, ISaveLayout { private readonly ConnectionMaster _connectionMaster; private TalkWithServer.CancelToken _messageId; private Dictionary _lastRequest; private bool _somethingLoaded; private const string FORM_TYPE = "GRID_MULTI_TESTER"; private string _fileNameSaved; public GridMultiTester() { _connectionMaster = GUI.Environment.DefaultConnectionMaster; InitializeComponent(); } private void saveResult(string fileName, string body) //call the new window here--bypass dialog { CsvPreview csvPrev = new CsvPreview(); csvPrev.SuggestedFileName = fileName; csvPrev.SetContents(body); csvPrev.CreateAsWindow(); } private void debugButton_Click(object sender, EventArgs e) { object [] message = new object[] { "command", "flex_command", "subcommand", "prototype_info", "prototype", prototypeEditor1.GetTcl() }; var formatted = TalkWithServer.CreateMessage(message); _connectionMaster.SendManager.SendMessage(formatted, debugResponse); } private void debugResponse(byte[] body, object clientId) { this.BeginInvokeIfRequired((MethodInvoker)delegate { string message; if (null == body) message = "Error"; else message = TalkWithServer.BytesToStr(body); MessageBox.Show(message, "Response to Debug"); }); } private void getDataButton_Click(object sender, EventArgs e) { StringBuilder symbols = new StringBuilder(); foreach (string symbol in symbolsTextBox.Lines) { string t = symbol.Trim(); if (t != "") symbols.LAppend(t); } object[] message = new object[] { "command", "flex_command", "subcommand", "make_and_show", "prototype", prototypeEditor1.GetTcl(), "symbols", symbols.ToString(), "show_errors", showErrorsCheckBox.Checked?"1":null }; _lastRequest = TalkWithServer.CreateMessage(message); sendRequest(); } private void sendRequest() { if (null != _messageId) _connectionMaster.SendManager.CancelMessage(_messageId); _somethingLoaded = false; _messageId = new TalkWithServer.CancelToken(); _connectionMaster.SendManager.SendMessage(_lastRequest, GetDataResponse, streaming: true, clientId: _messageId, cancelToken: _messageId); } private void GetDataResponse(byte[] body, object clientId) { this.BeginInvokeIfRequired((MethodInvoker)delegate { HandleResponseInGuiThread(body, clientId); }); } private void HandleResponseInGuiThread(byte[] body, object clientId) { if (_messageId != clientId) return; if (null == body) { // Disconnected from server. //System.Diagnostics.Debug.WriteLine("null==body, clientId=" + clientId + ", _messageId=" + _messageId); if (null != _messageId) { bool sendAgain; if (_somethingLoaded) sendAgain = MessageBox.Show("Command was not completed. Try again?", "Grid Multi-Tester", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes; else sendAgain = true; if (sendAgain) sendRequest(); } } else { XmlNode message = XmlHelper.Get(body).Node(0); //string m = message.OuterXml; //System.Diagnostics.Debug.Print(m); bool finished; switch (message.Property("type")) // error done result { case "error": MessageBox.Show(message.Text(), "Error in Grid Multi-Tester"); finished = true; break; case "done": finished = true; break; case "result": finished = false; _somethingLoaded = true; string fileName = message.Property("symbol", "result") + ".csv"; saveResult(fileName, message.Text()); break; default: // Normally we'd silently ignore this. But Since we've made so // many recent changes, we should report more errors. finished = false; MessageBox.Show(message.Property("type"), "Unexpected Message Type"); break; } if (finished) { _connectionMaster.SendManager.CancelMessage(_messageId); _messageId = null; _lastRequest = null; } } //else //{ // System.Diagnostics.Debug.WriteLine("Skipping. _messageId=" + _messageId + ", clientId=" + clientId); //} } static public void RegisterLayout() { LayoutManager.Instance().AddRestoreRule(FORM_TYPE, (RestoreLayout)delegate(XmlNode description, bool ignorePosition, bool cascadePosition) { GridMultiTester form = new GridMultiTester(); LayoutManager.RestoreBase(description, form, ignorePosition, cascadePosition); form.prototypeEditor1.GetContents(description); form.GetContents(description); }); } void ISaveLayout.SaveLayout(XmlNode parent) { XmlNode description = LayoutManager.SaveBase(parent, this, FORM_TYPE); SetContents(description); //items for this window prototypeEditor1.SetContents(description); //saving for "embedded" window } private void duplicateButton_Click(object sender, EventArgs e) { LayoutManager.Instance().Duplicate(this); } private void saveButton_Click(object sender, EventArgs e) { saveIt(); } public void saveIt() { LayoutManager layoutManager = LayoutManager.Instance(); SaveFileDialog dialog = new SaveFileDialog(); if (null != layoutManager.Directory) dialog.InitialDirectory = layoutManager.Directory; dialog.Filter = "TIQ Window files|*.WTI|All files|*.*"; dialog.DefaultExt = "*.WTI"; string fileName = ""; if (_fileNameSaved == null) { fileName = "My Grid Tester"; } else { fileName = _fileNameSaved; } dialog.FileName = FileNameMethod.QuoteFileName(fileName); if (dialog.ShowDialog() == DialogResult.OK) { layoutManager.SaveOne(this, dialog.FileName); _fileNameSaved = Path.GetFileName(dialog.FileName); } dialog.Dispose(); } public void SetContents(XmlNode destination) { XmlNode settings = destination.NewNode("SETTINGS"); settings.SetProperty("ERRORS", showErrorsCheckBox.Checked.ToString()); settings.SetProperty("SYMBOLS_TEXT", symbolsTextBox.Text); } public void GetContents(XmlNode parent) { XmlNode description = parent.Node("SETTINGS"); showErrorsCheckBox.Checked = description.Property("ERRORS", false); symbolsTextBox.Text = description.Property("SYMBOLS_TEXT", ""); } private void GridMultiTester_FormClosed(object sender, FormClosedEventArgs e) { if (null != _messageId) _connectionMaster.SendManager.CancelMessage(_messageId); } } }