using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using TradeIdeas.TIProData.Configuration; using TradeIdeas.TIProData.Interfaces; namespace TradeIdeas.TIProGUI.RealTimeStockRace { public partial class RaceSymbolSetupControl : UserControl { List _symbolList = new List(); public Action HidePopupAction; // This is the symbol list tree view private SymbolListTreeView _tvSymbolList = new SymbolListTreeView(); private ToolStripDropDown _symbolListPopup; private ToolStripControlHost _symbolListHost; private ConfigurationWindowManager _configurationWindowManager; private IConnectionMaster _connectionMaster; private SymbolListsCacheManager _symbolListsCacheManager; private RealTimeStockRaceForm _realTimeStockRaceForm; /// /// The symbol list. /// public List SymbolList { get { return _symbolList; } set { _symbolList = value; } } /// /// Set the displayed message text. /// public string Message { get { return lblMessage.Text; } set { lblMessage.Text = value; } } public RaceSymbolSetupControl(IConnectionMaster connectionMaster, RealTimeStockRaceForm realTimeStockRaceForm) { InitializeComponent(); _connectionMaster = connectionMaster; _realTimeStockRaceForm = realTimeStockRaceForm; lblMessage.Text = ""; // Init the symbol list cache manager. _symbolListsCacheManager = GuiEnvironment.GetSymbolListsCacheManager(_connectionMaster); // Create the event handler for the symbol list treeview. _tvSymbolList.SymbolListChosen += new SymbolListChosen(TvSymbolList_SymbolListChosen); // Symbol List selection popup. _symbolListPopup = new ToolStripDropDown() { AutoSize = false, Margin = Padding.Empty, Padding = Padding.Empty, Size = new Size(this.Width, 100) }; _symbolListHost = new ToolStripControlHost(_tvSymbolList) { AutoSize = false, Margin = Padding.Empty, Padding = Padding.Empty, Size = _symbolListPopup.Size }; _symbolListPopup.Items.Add(_symbolListHost); SetInitialConfig(""); } /// /// Load the symbols into the list and create race symbol controls for them. /// /// public void LoadSymbols(HashSet symbols) { if (_symbolList.Count < _realTimeStockRaceForm.RaceLanes) { int symbolCt = 0; foreach (string symbol in symbols) { if (!_symbolList.Contains(symbol)) { _symbolList.Add(symbol); AddSymbolControl(symbol); // Add to race if it's running. if (_realTimeStockRaceForm.RaceRunning) _realTimeStockRaceForm.GetExtraSymbolRowData(symbol); symbolCt++; } if (_symbolList.Count >= _realTimeStockRaceForm.RaceLanes) { new OkForm("Real Time Stock Race", $"There are {_realTimeStockRaceForm.RaceLanes} race lanes configured. So, you can't add any more symbols.") { TopMost = true }.ShowDialog(); break; } } lblMessage.Text = $"{symbolCt} symbols loaded."; } else { new OkForm("Real Time Stock Race", $"There are {_realTimeStockRaceForm.RaceLanes} race lanes configured. So, you can't add any more symbols.") { TopMost = true }.ShowDialog(); lblMessage.Text = "No symbols loaded."; } } /// /// Add race symbol controls from the symbol list. /// public void AddSymbolControlsFromList() { RemoveAllSymbolControls(); foreach (string symbol in _symbolList) { AddSymbolControl(symbol); } } /// /// Remove race symbol control from panel. /// /// public void RemoveSymbolControl(RaceSymbolControl raceSymbolControl) { raceSymbolControl.symbolSelected -= SymbolSelected; pnlSymbolList.Controls.Remove(raceSymbolControl); if (_symbolList.Contains(raceSymbolControl.Symbol)) { _symbolList.Remove(raceSymbolControl.Symbol); lblMessage.Text = $"{raceSymbolControl.Symbol} Removed."; } raceSymbolControl.Dispose(); FixSymbolControlPositions(); } /// /// Remove all race symbol controls from panel. /// private void RemoveAllSymbolControls() { List toRemove = new List(); foreach (Control control in pnlSymbolList.Controls) { RaceSymbolControl raceSymbolControl = control as RaceSymbolControl; if (raceSymbolControl != null) { raceSymbolControl.symbolSelected -= SymbolSelected; toRemove.Add(raceSymbolControl); } } foreach (RaceSymbolControl raceSymbolControl in toRemove) { pnlSymbolList.Controls.Remove(raceSymbolControl); raceSymbolControl.Dispose(); } } /// /// Fix the positions of the symbol controls after removing one. /// private void FixSymbolControlPositions() { int ct = 0; foreach (Control control in pnlSymbolList.Controls) { control.Location = new Point(0, (ct * control.Height) - pnlSymbolList.VerticalScroll.Value); ct++; } } private void btnAddSymbol_Click(object sender, EventArgs e) { if (pnlSymbolList.Controls.Count < _realTimeStockRaceForm.RaceLanes) AddSymbolControl(""); else new OkForm("Real Time Stock Race", $"There are {_realTimeStockRaceForm.RaceLanes} race lanes configured. So, you can't add any more symbols.") { TopMost = true }.ShowDialog(); lblMessage.Text = ""; } /// /// Add a race symbol control to the panel. /// /// private void AddSymbolControl(string symbol) { RaceSymbolControl raceSymbolControl = new RaceSymbolControl(this); raceSymbolControl.symbolSelected += SymbolSelected; raceSymbolControl.Location = new Point(0, (pnlSymbolList.Controls.Count * raceSymbolControl.Height) - pnlSymbolList.VerticalScroll.Value); pnlSymbolList.Controls.Add(raceSymbolControl); if (!string.IsNullOrEmpty(symbol)) raceSymbolControl.Symbol = symbol; } /// /// Add selected symbol. Return true if successful, false if a duplicate. /// /// /// /// private bool SymbolSelected(string symbol, string lastSymbolValue) { // Remove last symbol value if different. if (!string.IsNullOrEmpty(lastSymbolValue) && symbol != lastSymbolValue) _symbolList.Remove(lastSymbolValue); // Add to symbol list. if (!_symbolList.Contains(symbol)) { _symbolList.Add(symbol); // Add to race if it's running. if (_realTimeStockRaceForm.RaceRunning) _realTimeStockRaceForm.GetExtraSymbolRowData(symbol); return true; } else return false; } private void btnClose_Click(object sender, EventArgs e) { if (HidePopupAction != null) HidePopupAction(); } private void btnLoadFromSymbolList_Click(object sender, EventArgs e) { // Load the symbol lists. _tvSymbolList.ClearSymbolLists(); HashSet lists = new HashSet(_configurationWindowManager.SymbolListsInOrder); // Get rid of any symbol list that aren't personal. HashSet personalLists = new HashSet(lists.Where(x => x.InternalCode.StartsWith("SL_0"))); _tvSymbolList.AddSymbolLists(personalLists); // Show the symbol list popup. _symbolListPopup.Show(this, this.Left, this.Bottom - 1); } /// /// Initialize the configuration window manager. /// /// private void SetInitialConfig(string config) { if (_configurationWindowManager != null) { _configurationWindowManager.Abandon(); } _configurationWindowManager = new ConfigurationWindowManager(); _configurationWindowManager.LoadFromServer(_connectionMaster, ConfigurationType.TopList, OnLoaded, config); } private void OnLoaded(ConfigurationWindowManager configurationWindowManager) { } private void TvSymbolList_SymbolListChosen(SymbolList symbolList) { string strListID = symbolList.InternalCode.Substring(symbolList.InternalCode.LastIndexOf("_") + 1); int listID = 0; if (int.TryParse(strListID, out listID)) { HashSet symbols = _symbolListsCacheManager.GetSymbols(listID); LoadSymbols(symbols); } _symbolListPopup.Hide(); } private void btnClearSymbols_Click(object sender, EventArgs e) { RemoveAllSymbolControls(); _symbolList.Clear(); lblMessage.Text = "Symbols cleared."; } } }