public override PluginStatus GetStatus() { PluginStatus status = new PluginStatus(); IBPluginState ibPluginState = IBPluginState.Disconnected; if (controller != null) { ibPluginState = controller.GetIBPluginState(); } switch (ibPluginState) { case IBPluginState.Disconnected: status.Status = StatusCode.SevereError; status.Color = System.Drawing.Color.IndianRed; status.ShortMessage = "Off-line"; break; case IBPluginState.Busy: status.Status = StatusCode.OK; status.Color = System.Drawing.Color.Yellow; status.ShortMessage = "Busy"; break; case IBPluginState.Ready: status.Status = StatusCode.OK; status.Color = System.Drawing.Color.ForestGreen; status.ShortMessage = "Ready"; break; } status.LongMessage = LogAndMessage.GetMessages(); // collect and display data issues string failedTickers = controller.GetFailedTickers(); bool dataError = !string.IsNullOrEmpty(failedTickers); if (dataError && ibPluginState != IBPluginState.Disconnected) // if disconnected, data issues are meaningless... { status.ShortMessage += " !"; status.Status = StatusCode.Warning; if (string.IsNullOrEmpty(status.LongMessage)) { status.LongMessage = "Failed tickers: " + failedTickers; } } // if there is no message, we show the short message (Busy, Ok, etc) if (string.IsNullOrEmpty(status.LongMessage)) { status.LongMessage = status.ShortMessage; // save as last shown message to avoid status popup lastLongMessageText = status.ShortMessage; } // if new message we use a new lastLongMessageTime value to cause status popup if (lastLongMessageText != status.LongMessage) { lastLongMessageText = status.LongMessage; lastLongMessageTime = (int)DateTime.Now.TimeOfDay.TotalMilliseconds; } // set status and "timestamp" status.Status = (StatusCode)((int)status.Status + lastLongMessageTime); return(status); }