diff --git a/GenesisCordonelInterface/UI/MainForm.Designer.cs b/GenesisCordonelInterface/UI/MainForm.Designer.cs index 1185f1038..8176579ce 100644 --- a/GenesisCordonelInterface/UI/MainForm.Designer.cs +++ b/GenesisCordonelInterface/UI/MainForm.Designer.cs @@ -11,20 +11,14 @@ private System.Windows.Forms.ToolStripMenuItem miClearLog; private System.Windows.Forms.ToolStripMenuItem miHelp; private System.Windows.Forms.ToolStripMenuItem miHelpAbout; - - private System.Windows.Forms.Panel pnlLeftMenu; - private System.Windows.Forms.Panel pnlMain; - private System.Windows.Forms.RichTextBox rtbMainLog; - + private System.Windows.Forms.Panel mainHostPanel; private System.Windows.Forms.StatusStrip statusStrip1; private System.Windows.Forms.ToolStripStatusLabel tslStatus; protected override void Dispose(bool disposing) { if (disposing && (components != null)) - { components.Dispose(); - } base.Dispose(disposing); } @@ -38,54 +32,39 @@ this.miClearLog = new System.Windows.Forms.ToolStripMenuItem(); this.miHelp = new System.Windows.Forms.ToolStripMenuItem(); this.miHelpAbout = new System.Windows.Forms.ToolStripMenuItem(); - this.pnlLeftMenu = new System.Windows.Forms.Panel(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.preadjustmentButton = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.btnPulseSetup = new System.Windows.Forms.Button(); - this.btnSetup = new System.Windows.Forms.Button(); - this.btnRegisterStore = new System.Windows.Forms.Button(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.pnlMain = new System.Windows.Forms.Panel(); - this.rtbMainLog = new System.Windows.Forms.RichTextBox(); + this.mainHostPanel = new System.Windows.Forms.Panel(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.tslStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.button1 = new System.Windows.Forms.Button(); + this.menuStrip1.SuspendLayout(); - this.pnlLeftMenu.SuspendLayout(); - this.tabControl1.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.groupBox2.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.tabPage2.SuspendLayout(); - this.pnlMain.SuspendLayout(); this.statusStrip1.SuspendLayout(); - this.groupBox3.SuspendLayout(); this.SuspendLayout(); + // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.miFile, - this.miView, - this.miHelp}); + this.miFile, + this.miView, + this.miHelp + }); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); this.menuStrip1.Size = new System.Drawing.Size(1309, 24); this.menuStrip1.TabIndex = 0; this.menuStrip1.Text = "menuStrip1"; + // // miFile // this.miFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.miExit}); + this.miExit + }); this.miFile.Name = "miFile"; this.miFile.Size = new System.Drawing.Size(37, 20); this.miFile.Text = "File"; + // // miExit // @@ -93,14 +72,17 @@ this.miExit.Size = new System.Drawing.Size(92, 22); this.miExit.Text = "Exit"; this.miExit.Click += new System.EventHandler(this.miExit_Click); + // // miView // this.miView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.miClearLog}); + this.miClearLog + }); this.miView.Name = "miView"; this.miView.Size = new System.Drawing.Size(44, 20); this.miView.Text = "View"; + // // miClearLog // @@ -108,14 +90,17 @@ this.miClearLog.Size = new System.Drawing.Size(124, 22); this.miClearLog.Text = "Clear Log"; this.miClearLog.Click += new System.EventHandler(this.miClearLog_Click); + // // miHelp // this.miHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.miHelpAbout}); + this.miHelpAbout + }); this.miHelp.Name = "miHelp"; this.miHelp.Size = new System.Drawing.Size(44, 20); this.miHelp.Text = "Help"; + // // miHelpAbout // @@ -123,177 +108,44 @@ this.miHelpAbout.Size = new System.Drawing.Size(107, 22); this.miHelpAbout.Text = "About"; this.miHelpAbout.Click += new System.EventHandler(this.miHelpAbout_Click); + // - // pnlLeftMenu + // mainHostPanel // - this.pnlLeftMenu.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pnlLeftMenu.Controls.Add(this.tabControl1); - this.pnlLeftMenu.Dock = System.Windows.Forms.DockStyle.Left; - this.pnlLeftMenu.Location = new System.Drawing.Point(0, 24); - this.pnlLeftMenu.Name = "pnlLeftMenu"; - this.pnlLeftMenu.Size = new System.Drawing.Size(190, 474); - this.pnlLeftMenu.TabIndex = 1; - // - // tabControl1 - // - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Controls.Add(this.tabPage2); - this.tabControl1.Location = new System.Drawing.Point(3, 5); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(186, 464); - this.tabControl1.TabIndex = 4; - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.groupBox2); - this.tabPage1.Controls.Add(this.groupBox1); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Padding = new System.Windows.Forms.Padding(3); - this.tabPage1.Size = new System.Drawing.Size(178, 438); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "Laatzen API"; - this.tabPage1.UseVisualStyleBackColor = true; - // - // groupBox2 - // - this.groupBox2.Controls.Add(this.preadjustmentButton); - this.groupBox2.Location = new System.Drawing.Point(6, 190); - this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(166, 66); - this.groupBox2.TabIndex = 5; - this.groupBox2.TabStop = false; - this.groupBox2.Text = "CordonelPreadjustmentUI"; - // - // preadjustmentButton - // - this.preadjustmentButton.Location = new System.Drawing.Point(6, 19); - this.preadjustmentButton.Name = "preadjustmentButton"; - this.preadjustmentButton.Size = new System.Drawing.Size(153, 35); - this.preadjustmentButton.TabIndex = 3; - this.preadjustmentButton.Text = "Preadjustment"; - this.preadjustmentButton.UseVisualStyleBackColor = true; - this.preadjustmentButton.Click += new System.EventHandler(this.preadjustmentButton_Click); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.btnPulseSetup); - this.groupBox1.Controls.Add(this.btnSetup); - this.groupBox1.Controls.Add(this.btnRegisterStore); - this.groupBox1.Location = new System.Drawing.Point(6, 17); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(166, 153); - this.groupBox1.TabIndex = 4; - this.groupBox1.TabStop = false; - this.groupBox1.Text = "GenesisToolBox"; - // - // btnPulseSetup - // - this.btnPulseSetup.Location = new System.Drawing.Point(7, 101); - this.btnPulseSetup.Name = "btnPulseSetup"; - this.btnPulseSetup.Size = new System.Drawing.Size(153, 35); - this.btnPulseSetup.TabIndex = 2; - this.btnPulseSetup.Text = "Pulse Setup"; - this.btnPulseSetup.UseVisualStyleBackColor = true; - this.btnPulseSetup.Click += new System.EventHandler(this.btnPulseSetup_Click); - // - // btnSetup - // - this.btnSetup.Location = new System.Drawing.Point(7, 19); - this.btnSetup.Name = "btnSetup"; - this.btnSetup.Size = new System.Drawing.Size(153, 35); - this.btnSetup.TabIndex = 0; - this.btnSetup.Text = "Setup"; - this.btnSetup.UseVisualStyleBackColor = true; - this.btnSetup.Click += new System.EventHandler(this.btnSetup_Click); - // - // btnRegisterStore - // - this.btnRegisterStore.Location = new System.Drawing.Point(7, 60); - this.btnRegisterStore.Name = "btnRegisterStore"; - this.btnRegisterStore.Size = new System.Drawing.Size(153, 35); - this.btnRegisterStore.TabIndex = 1; - this.btnRegisterStore.Text = "Register Store"; - this.btnRegisterStore.UseVisualStyleBackColor = true; - this.btnRegisterStore.Click += new System.EventHandler(this.btnRegisterStore_Click); - // - // tabPage2 - // - this.tabPage2.Controls.Add(this.groupBox3); - this.tabPage2.Location = new System.Drawing.Point(4, 22); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Padding = new System.Windows.Forms.Padding(3); - this.tabPage2.Size = new System.Drawing.Size(178, 438); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "GCI API"; - this.tabPage2.UseVisualStyleBackColor = true; - // - // pnlMain - // - this.pnlMain.Controls.Add(this.rtbMainLog); - this.pnlMain.Dock = System.Windows.Forms.DockStyle.Fill; - this.pnlMain.Location = new System.Drawing.Point(190, 24); - this.pnlMain.Name = "pnlMain"; - this.pnlMain.Padding = new System.Windows.Forms.Padding(9); - this.pnlMain.Size = new System.Drawing.Size(1119, 474); - this.pnlMain.TabIndex = 2; - // - // rtbMainLog - // - this.rtbMainLog.Dock = System.Windows.Forms.DockStyle.Fill; - this.rtbMainLog.Font = new System.Drawing.Font("Consolas", 10F); - this.rtbMainLog.Location = new System.Drawing.Point(9, 9); - this.rtbMainLog.Name = "rtbMainLog"; - this.rtbMainLog.ReadOnly = true; - this.rtbMainLog.Size = new System.Drawing.Size(1101, 456); - this.rtbMainLog.TabIndex = 0; - this.rtbMainLog.Text = ""; + this.mainHostPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.mainHostPanel.Location = new System.Drawing.Point(0, 24); + this.mainHostPanel.Name = "mainHostPanel"; + this.mainHostPanel.Padding = new System.Windows.Forms.Padding(0); + this.mainHostPanel.Size = new System.Drawing.Size(1309, 474); + this.mainHostPanel.TabIndex = 1; + // // statusStrip1 // this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.tslStatus}); + this.tslStatus + }); this.statusStrip1.Location = new System.Drawing.Point(0, 498); this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 12, 0); this.statusStrip1.Size = new System.Drawing.Size(1309, 22); - this.statusStrip1.TabIndex = 3; + this.statusStrip1.TabIndex = 2; this.statusStrip1.Text = "statusStrip1"; + // // tslStatus // this.tslStatus.Name = "tslStatus"; this.tslStatus.Size = new System.Drawing.Size(39, 17); this.tslStatus.Text = "Ready"; - // - // groupBox3 - // - this.groupBox3.Controls.Add(this.button1); - this.groupBox3.Location = new System.Drawing.Point(6, 15); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(166, 66); - this.groupBox3.TabIndex = 6; - this.groupBox3.TabStop = false; - this.groupBox3.Text = "GenesisCordonelInterface"; - // - // button1 - // - this.button1.Location = new System.Drawing.Point(6, 19); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(153, 35); - this.button1.TabIndex = 3; - this.button1.Text = "API"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1309, 520); - this.Controls.Add(this.pnlMain); - this.Controls.Add(this.pnlLeftMenu); + this.Controls.Add(this.mainHostPanel); this.Controls.Add(this.statusStrip1); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; @@ -301,33 +153,14 @@ this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Genesis Cordonel Interface"; + this.Load += new System.EventHandler(this.MainForm_Load); + this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); - this.pnlLeftMenu.ResumeLayout(false); - this.tabControl1.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.groupBox2.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - this.pnlMain.ResumeLayout(false); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); - this.groupBox3.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); - } - - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.Button btnSetup; - private System.Windows.Forms.Button preadjustmentButton; - private System.Windows.Forms.Button btnRegisterStore; - private System.Windows.Forms.Button btnPulseSetup; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.GroupBox groupBox3; - private System.Windows.Forms.Button button1; } } \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainForm.cs b/GenesisCordonelInterface/UI/MainForm.cs index 3509b7d64..bba4b6295 100644 --- a/GenesisCordonelInterface/UI/MainForm.cs +++ b/GenesisCordonelInterface/UI/MainForm.cs @@ -1,173 +1,38 @@ -using GenesisCordonelInterface.UI.LaatzenAPI_CordonelPreadjustmentUI; -using GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface; -using System; +using System; using System.Drawing; -using System.Linq; -using System.Text.RegularExpressions; using System.Windows.Forms; -using Xylem.Common.Ui.GenesisToolBox; -using Xylem.Common.Utils.Logging; namespace GenesisCordonelInterface.UI { public partial class MainForm : Form { - private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface"); - private static readonly Regex LogLevelRegex = new Regex(@"\|\s*(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\s*\|", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private MainView mainView; public MainForm() { InitializeComponent(); - /*_logger = logger; - _logger.MessagePublished += OnLogMessagePublished;*/ - UiLogBus.MessageReceived += UiLogBus_MessageReceived; - - //TopRight position on screen - this.StartPosition = FormStartPosition.Manual; - this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - this.Width, 0); - - //black background - rtbMainLog.BackColor = Color.Black; - rtbMainLog.ForeColor = Color.Gainsboro; - rtbMainLog.Font = new Font("Consolas", 9f); - rtbMainLog.ReadOnly = true; - rtbMainLog.HideSelection = false; + StartPosition = FormStartPosition.Manual; + Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - Width, 0); } - private void UiLogBus_MessageReceived(string msg) + private void MainForm_Load(object sender, EventArgs e) { - if (InvokeRequired) - { - BeginInvoke(new Action(UiLogBus_MessageReceived), msg); - return; - } - - string[] lines = msg.Replace("\r\n", "\n").Split('\n'); - - foreach (string originalLine in lines) - { - if (string.IsNullOrWhiteSpace(originalLine)) - continue; - - string line = originalLine; - - // Find header (timestamp|LEVEL|) - Match m = LogLevelRegex.Match(line); - - string indent = ""; - if (m.Success) - { - int indentLength = m.Index + m.Length; - indent = new string(' ', indentLength); - } - - // Split long message manually if needed (optional) - string[] subLines = line.Split(new[] { " - " }, 2, StringSplitOptions.None); - - string firstLine = line; - string rest = null; - - if (subLines.Length == 2 && subLines[1].Length > 120) // heuristic - { - firstLine = subLines[0] + " - " + subLines[1].Substring(0, 120); - rest = subLines[1].Substring(120); - } - - AppendStyledLine(firstLine); - - if (!string.IsNullOrEmpty(rest)) - { - AppendStyledLine(indent + rest); - } - } - } - - private void AppendStyledLine(string line) - { - int start = rtbMainLog.TextLength; - - rtbMainLog.SelectionStart = start; - rtbMainLog.SelectionLength = 0; - rtbMainLog.SelectionColor = Color.Gainsboro; - rtbMainLog.AppendText(line + Environment.NewLine); - - Match m = LogLevelRegex.Match(line); - if (m.Success) - { - rtbMainLog.SelectionStart = start + m.Index; - rtbMainLog.SelectionLength = m.Length; - rtbMainLog.SelectionColor = GetLogLevelColor(m.Groups[1].Value); - } - - HighlightKeywordsInLine(line, start); - } - - private int MeasureTextWidthPx(string text) - { - if (string.IsNullOrEmpty(text)) - return 0; - - return TextRenderer.MeasureText(text, rtbMainLog.Font).Width; - } - - protected override void OnFormClosed(FormClosedEventArgs e) - { - //_logger.MessagePublished -= OnLogMessagePublished; - UiLogBus.MessageReceived -= UiLogBus_MessageReceived; - base.OnFormClosed(e); - } - - private void btnSetup_Click(object sender, EventArgs e) - { - Logger.Trace("FORM: ---------------------------------"); - Logger.Trace("FORM: Setup open"); - - using (FrmSetup frm = new FrmSetup()) - { - frm.ShowDialog(this); - } - - Logger.Trace("FORM: Setup closed."); - } - - private void btnRegisterStore_Click(object sender, EventArgs e) - { - Logger.Trace("FORM: ---------------------------------"); - Logger.Trace("FORM: Register Store open."); - - - using (FrmRegisterStore frm = new FrmRegisterStore()) - { - frm.ShowDialog(this); - } - - Logger.Trace("FORM: Register Store closed."); - } - - private void btnPulseSetup_Click(object sender, EventArgs e) - { - Logger.Trace("FORM: ---------------------------------"); - Logger.Trace("FORM: Pulse Setup open."); - - - using (FrmConfigurations frm = new FrmConfigurations()) - { - frm.ShowDialog(this); - } - - Logger.Trace("FORM: Pulse Setup closed."); + mainView = new MainView(); + mainView.Dock = DockStyle.Fill; + Controls.Add(mainView); + mainView.BringToFront(); } private void miExit_Click(object sender, EventArgs e) { - this.Close(); + Close(); } private void miClearLog_Click(object sender, EventArgs e) { - rtbMainLog.Clear(); - Logger.Trace("Log cleared."); + if (mainView != null) + mainView.ClearLog(); } private void miHelpAbout_Click(object sender, EventArgs e) @@ -178,113 +43,5 @@ namespace GenesisCordonelInterface.UI MessageBoxButtons.OK, MessageBoxIcon.Information); } - - private Color GetLogLevelColor(string level) - { - switch (level.Trim().ToUpperInvariant()) - { - case "TRACE": return Color.Gray; - case "DEBUG": return Color.DeepSkyBlue; - case "INFO": return Color.LimeGreen; - case "WARN": return Color.Orange; - case "ERROR": return Color.Red; - case "FATAL": return Color.Magenta; - default: return Color.Gainsboro; - } - } - - private bool IsSeparatorLine(string text) - { - if (string.IsNullOrWhiteSpace(text)) - return false; - - string trimmed = text.Trim(); - - // Remove spaces and tab-like spacing - string compact = new string(trimmed.Where(c => !char.IsWhiteSpace(c)).ToArray()); - - if (compact.Length < 4) - return false; - - // Count non-letter/non-digit characters - int nonAlnumCount = compact.Count(c => !char.IsLetterOrDigit(c)); - - // Consider it a separator if most characters are non-alphanumeric - // Examples: - // -----CommandToMeter()----- - // ========================== - // ///////// - double ratio = (double)nonAlnumCount / compact.Length; - - return ratio >= 0.6; - } - - /// - /// special string highlighting - /// "TX FINAL" have to go before "TX" - /// else "TX" will highlighted in the middle of "TX FINAL" - /// - private static readonly (Color color, string[] keywords)[] KeywordGroups = - { - (Color.DeepSkyBlue, new[] { "REQUEST" }), - (Color.Lime, new[] { "RESPONSE" }), - //(Color.LightGreen, new[] { "START", "END" }), - //(Color.Cyan, new[] { "TX", "TX FINAL" }), - //(Color.DeepSkyBlue,new[] { "RX", "RX FINAL", "RX CHUNK" }), - (Color.Gold, new[] { "READ-REGISTER-SESSION", "UI-CLICK"}), - //(Color.Violet, new[] { "REGADDR" }), - //(Color.Khaki, new[] { "DEFAULT", "ALIGNED", "STRING" }) - }; - - /// - /// special string highlighting - /// - /// - /// - private void HighlightKeywordsInLine(string line, int lineStartIndex) - { - foreach (var group in KeywordGroups) - { - foreach (var keyword in group.keywords) - { - int index = 0; - - while ((index = line.IndexOf(keyword, index, StringComparison.Ordinal)) >= 0) - { - rtbMainLog.SelectionStart = lineStartIndex + index; - rtbMainLog.SelectionLength = keyword.Length; - rtbMainLog.SelectionColor = group.color; - - index += keyword.Length; - } - } - } - } - - private void preadjustmentButton_Click(object sender, EventArgs e) - { - Logger.Trace("FORM: ---------------------------------"); - Logger.Trace("FORM: Preadjustment open."); - - using (FrmCordonelPreadjustmentUI frm = new FrmCordonelPreadjustmentUI()) - { - frm.ShowDialog(this); - } - - Logger.Trace("FORM: Preadjustment closed."); - } - - private void button1_Click(object sender, EventArgs e) - { - Logger.Trace("FORM: ---------------------------------"); - Logger.Trace("FORM: GCI GUI interface open."); - - using (FrmGCIAPI frm = new FrmGCIAPI()) - { - frm.ShowDialog(this); - } - - Logger.Trace("FORM: GCI GUI interface closed."); - } } } \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainView.Designer.cs b/GenesisCordonelInterface/UI/MainView.Designer.cs new file mode 100644 index 000000000..90adf4f54 --- /dev/null +++ b/GenesisCordonelInterface/UI/MainView.Designer.cs @@ -0,0 +1,187 @@ +namespace GenesisCordonelInterface.UI +{ + partial class MainView + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.Panel pnlLeftMenu; + private System.Windows.Forms.Panel pnlMain; + private System.Windows.Forms.RichTextBox rtbMainLog; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox3; + + private System.Windows.Forms.Button btnSetup; + private System.Windows.Forms.Button btnRegisterStore; + private System.Windows.Forms.Button btnPulseSetup; + private System.Windows.Forms.Button preadjustmentButton; + private System.Windows.Forms.Button button1; + + private void InitializeComponent() + { + this.pnlLeftMenu = new System.Windows.Forms.Panel(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.preadjustmentButton = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnPulseSetup = new System.Windows.Forms.Button(); + this.btnSetup = new System.Windows.Forms.Button(); + this.btnRegisterStore = new System.Windows.Forms.Button(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.button1 = new System.Windows.Forms.Button(); + this.pnlMain = new System.Windows.Forms.Panel(); + this.rtbMainLog = new System.Windows.Forms.RichTextBox(); + + this.pnlLeftMenu.SuspendLayout(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.pnlMain.SuspendLayout(); + this.SuspendLayout(); + + // + // pnlLeftMenu + // + this.pnlLeftMenu.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlLeftMenu.Controls.Add(this.tabControl1); + this.pnlLeftMenu.Dock = System.Windows.Forms.DockStyle.Left; + this.pnlLeftMenu.Location = new System.Drawing.Point(0, 0); + this.pnlLeftMenu.Name = "pnlLeftMenu"; + this.pnlLeftMenu.Size = new System.Drawing.Size(190, 500); + this.pnlLeftMenu.TabIndex = 0; + + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point(0, 0); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(188, 498); + + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox2); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Text = "Laatzen API"; + this.tabPage1.UseVisualStyleBackColor = true; + + // + // groupBox1 (GenesisToolBox) + // + this.groupBox1.Controls.Add(this.btnPulseSetup); + this.groupBox1.Controls.Add(this.btnSetup); + this.groupBox1.Controls.Add(this.btnRegisterStore); + this.groupBox1.Location = new System.Drawing.Point(6, 10); + this.groupBox1.Size = new System.Drawing.Size(166, 150); + this.groupBox1.Text = "GenesisToolBox"; + + // + // btnSetup + // + this.btnSetup.Location = new System.Drawing.Point(7, 20); + this.btnSetup.Size = new System.Drawing.Size(150, 30); + this.btnSetup.Text = "Setup"; + this.btnSetup.Click += new System.EventHandler(this.btnSetup_Click); + + // + // btnRegisterStore + // + this.btnRegisterStore.Location = new System.Drawing.Point(7, 55); + this.btnRegisterStore.Size = new System.Drawing.Size(150, 30); + this.btnRegisterStore.Text = "Register Store"; + this.btnRegisterStore.Click += new System.EventHandler(this.btnRegisterStore_Click); + + // + // btnPulseSetup + // + this.btnPulseSetup.Location = new System.Drawing.Point(7, 90); + this.btnPulseSetup.Size = new System.Drawing.Size(150, 30); + this.btnPulseSetup.Text = "Pulse Setup"; + this.btnPulseSetup.Click += new System.EventHandler(this.btnPulseSetup_Click); + + // + // groupBox2 (Preadjustment) + // + this.groupBox2.Controls.Add(this.preadjustmentButton); + this.groupBox2.Location = new System.Drawing.Point(6, 170); + this.groupBox2.Size = new System.Drawing.Size(166, 70); + this.groupBox2.Text = "CordonelPreadjustmentUI"; + + // + // preadjustmentButton + // + this.preadjustmentButton.Location = new System.Drawing.Point(6, 20); + this.preadjustmentButton.Size = new System.Drawing.Size(150, 30); + this.preadjustmentButton.Text = "Preadjustment"; + this.preadjustmentButton.Click += new System.EventHandler(this.preadjustmentButton_Click); + + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.groupBox3); + this.tabPage2.Text = "GCI API"; + this.tabPage2.UseVisualStyleBackColor = true; + + // + // groupBox3 (GCI API) + // + this.groupBox3.Controls.Add(this.button1); + this.groupBox3.Location = new System.Drawing.Point(6, 10); + this.groupBox3.Size = new System.Drawing.Size(166, 70); + this.groupBox3.Text = "GenesisCordonelInterface"; + + // + // button1 + // + this.button1.Location = new System.Drawing.Point(6, 20); + this.button1.Size = new System.Drawing.Size(150, 30); + this.button1.Text = "API"; + this.button1.Click += new System.EventHandler(this.button1_Click); + + // + // pnlMain + // + this.pnlMain.Controls.Add(this.rtbMainLog); + this.pnlMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlMain.Location = new System.Drawing.Point(190, 0); + this.pnlMain.Padding = new System.Windows.Forms.Padding(5); + + // + // rtbMainLog + // + this.rtbMainLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.rtbMainLog.Font = new System.Drawing.Font("Consolas", 10F); + this.rtbMainLog.ReadOnly = true; + + // + // MainView + // + this.Controls.Add(this.pnlMain); + this.Controls.Add(this.pnlLeftMenu); + this.Name = "MainView"; + this.Size = new System.Drawing.Size(900, 500); + + this.pnlLeftMenu.ResumeLayout(false); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.pnlMain.ResumeLayout(false); + this.ResumeLayout(false); + } + } +} \ No newline at end of file diff --git a/GenesisCordonelInterface/UI/MainView.cs b/GenesisCordonelInterface/UI/MainView.cs new file mode 100644 index 000000000..cc56b6d7f --- /dev/null +++ b/GenesisCordonelInterface/UI/MainView.cs @@ -0,0 +1,221 @@ +using GenesisCordonelInterface.UI.LaatzenAPI_CordonelPreadjustmentUI; +using GenesisCordonelInterface.UI.StaraTuraAPI_GenesisCordonelInterface; +using System; +using System.Drawing; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using Xylem.Common.Ui.GenesisToolBox; +using Xylem.Common.Utils.Logging; + +namespace GenesisCordonelInterface.UI +{ + public partial class MainView : UserControl + { + private static readonly NLog.ILogger Logger = NLog.LogManager.GetLogger("GenesisCordonelInterface"); + private static readonly Regex LogLevelRegex = new Regex(@"\|\s*(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\s*\|", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + public MainView() + { + InitializeComponent(); + + UiLogBus.MessageReceived += UiLogBus_MessageReceived; + + rtbMainLog.BackColor = Color.Black; + rtbMainLog.ForeColor = Color.Gainsboro; + rtbMainLog.Font = new Font("Consolas", 9f); + rtbMainLog.ReadOnly = true; + rtbMainLog.HideSelection = false; + } + + protected override void Dispose(bool disposing) + { + UiLogBus.MessageReceived -= UiLogBus_MessageReceived; + base.Dispose(disposing); + } + + private IWin32Window DialogOwner + { + get + { + Form owner = FindForm(); + return owner ?? (IWin32Window)this; + } + } + + private void btnSetup_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Setup open"); + + using (FrmSetup frm = new FrmSetup()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: Setup closed."); + } + + private void btnRegisterStore_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Register Store open."); + + using (FrmRegisterStore frm = new FrmRegisterStore()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: Register Store closed."); + } + + private void btnPulseSetup_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Pulse Setup open."); + + using (FrmConfigurations frm = new FrmConfigurations()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: Pulse Setup closed."); + } + + private void preadjustmentButton_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: Preadjustment open."); + + using (FrmCordonelPreadjustmentUI frm = new FrmCordonelPreadjustmentUI()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: Preadjustment closed."); + } + + private void button1_Click(object sender, EventArgs e) + { + Logger.Trace("FORM: ---------------------------------"); + Logger.Trace("FORM: GCI GUI interface open."); + + using (FrmGCIAPI frm = new FrmGCIAPI()) + { + frm.ShowDialog(DialogOwner); + } + + Logger.Trace("FORM: GCI GUI interface closed."); + } + + public void ClearLog() + { + rtbMainLog.Clear(); + Logger.Trace("Log cleared."); + } + + private void UiLogBus_MessageReceived(string msg) + { + if (InvokeRequired) + { + BeginInvoke(new Action(UiLogBus_MessageReceived), msg); + return; + } + + string[] lines = msg.Replace("\r\n", "\n").Split('\n'); + + foreach (string originalLine in lines) + { + if (string.IsNullOrWhiteSpace(originalLine)) + continue; + + string line = originalLine; + Match m = LogLevelRegex.Match(line); + + string indent = ""; + if (m.Success) + { + int indentLength = m.Index + m.Length; + indent = new string(' ', indentLength); + } + + string[] subLines = line.Split(new[] { " - " }, 2, StringSplitOptions.None); + + string firstLine = line; + string rest = null; + + if (subLines.Length == 2 && subLines[1].Length > 120) + { + firstLine = subLines[0] + " - " + subLines[1].Substring(0, 120); + rest = subLines[1].Substring(120); + } + + AppendStyledLine(firstLine); + + if (!string.IsNullOrEmpty(rest)) + AppendStyledLine(indent + rest); + } + } + + private void AppendStyledLine(string line) + { + int start = rtbMainLog.TextLength; + + rtbMainLog.SelectionStart = start; + rtbMainLog.SelectionLength = 0; + rtbMainLog.SelectionColor = Color.Gainsboro; + rtbMainLog.AppendText(line + Environment.NewLine); + + Match m = LogLevelRegex.Match(line); + if (m.Success) + { + rtbMainLog.SelectionStart = start + m.Index; + rtbMainLog.SelectionLength = m.Length; + rtbMainLog.SelectionColor = GetLogLevelColor(m.Groups[1].Value); + } + + HighlightKeywordsInLine(line, start); + } + + private Color GetLogLevelColor(string level) + { + switch (level.Trim().ToUpperInvariant()) + { + case "TRACE": return Color.Gray; + case "DEBUG": return Color.DeepSkyBlue; + case "INFO": return Color.LimeGreen; + case "WARN": return Color.Orange; + case "ERROR": return Color.Red; + case "FATAL": return Color.Magenta; + default: return Color.Gainsboro; + } + } + + private static readonly Tuple[] KeywordGroups = + { + Tuple.Create(Color.DeepSkyBlue, new[] { "REQUEST" }), + Tuple.Create(Color.Lime, new[] { "RESPONSE" }), + Tuple.Create(Color.Gold, new[] { "READ-REGISTER-SESSION", "UI-CLICK" }) + }; + + private void HighlightKeywordsInLine(string line, int lineStartIndex) + { + foreach (var group in KeywordGroups) + { + foreach (var keyword in group.Item2) + { + int index = 0; + + while ((index = line.IndexOf(keyword, index, StringComparison.Ordinal)) >= 0) + { + rtbMainLog.SelectionStart = lineStartIndex + index; + rtbMainLog.SelectionLength = keyword.Length; + rtbMainLog.SelectionColor = group.Item1; + + index += keyword.Length; + } + } + } + } + } +} \ No newline at end of file diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs index 60f5dfddc..fc9111e22 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridge.cs @@ -1,14 +1,15 @@ -/// +using log4net; +/// /// Copyright (c) 2015-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; -using log4net; +using System.Windows.Forms; using TBF.Rig.Generic; +using ExternalInterfaceGUIType = GenesisCordonelInterface.UI.MainView; +using ExternalInterfaceType = GenesisCordonelInterface.API.InterfaceOutsideToGCI; using UdsReaderType = TBF.Rig.Input.DataStorage.UniDataStorageReader.Reader; using UdsWriterType = TBF.Rig.Output.DataStorage.UniDataStorageWriter.Writer; -using ExternalInterfaceType = GenesisCordonelInterface.API.InterfaceOutsideToGCI; -using ExternalInterfaceGUIType = GenesisCordonelInterface.UI.MainForm; namespace TBF.Rig.BridgeComponents.GciBridge { @@ -39,6 +40,11 @@ namespace TBF.Rig.BridgeComponents.GciBridge /// ExternalInterfaceGUIType gciGUI; + /// + /// + /// + Form gciGuiHostForm; + /// /// Placeholder for GCI external/public interface. /// Replace object with real GCI interface type later. @@ -99,16 +105,25 @@ namespace TBF.Rig.BridgeComponents.GciBridge { try { - using (gciGUI = new ExternalInterfaceGUIType()) - { - gciGUI.ShowDialog(/*this*/); - } + if (gciGuiHostForm != null && !gciGuiHostForm.IsDisposed) + return; - log.InfoFormat("{0}: GCI GUI initialized.", Name); + gciGUI = new ExternalInterfaceGUIType(); + gciGUI.Dock = DockStyle.Fill; + + gciGuiHostForm = new Form(); + gciGuiHostForm.Text = "Genesis Cordonel Interface"; + gciGuiHostForm.Width = 1300; + gciGuiHostForm.Height = 600; + gciGuiHostForm.StartPosition = FormStartPosition.CenterScreen; + + gciGuiHostForm.Controls.Add(gciGUI); + + log.InfoFormat("{0}: GCI GUI view initialized.", Name); } catch (Exception ex) { - log.Error("Failed to initialize GCI GUI.", ex); + log.Error("Failed to initialize GCI GUI view.", ex); } } @@ -137,11 +152,16 @@ namespace TBF.Rig.BridgeComponents.GciBridge { if (!gciBridgeCfg.EnableGuiAccess) return; - if (!IsGuiInitialized) + if (gciGuiHostForm == null || gciGuiHostForm.IsDisposed) { TryInitializeGui(); } + if (gciGuiHostForm == null) return; + + gciGuiHostForm.Show(); + gciGuiHostForm.BringToFront(); + log.InfoFormat("{0}: ShowGui invoked.", Name); } @@ -151,12 +171,10 @@ namespace TBF.Rig.BridgeComponents.GciBridge public void HideGui() { if (!gciBridgeCfg.EnableGuiAccess) return; - if (!IsGuiInitialized) return; + if (gciGuiHostForm == null || gciGuiHostForm.IsDisposed) return; + + gciGuiHostForm.Hide(); - using (gciGUI) - { - gciGUI.Hide(/*this*/); - } log.InfoFormat("{0}: HideGui invoked.", Name); } diff --git a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs index 68eb84bd2..346669b87 100644 --- a/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs +++ b/TBF/Rig/BridgeComponents/GciBridge/GciBridgeCfgCtrl.cs @@ -172,12 +172,42 @@ namespace TBF.Rig.BridgeComponents.GciBridge private void connectExternalButton_Click(object sender, EventArgs e) { - /// TODO + try + { + GciBridge bridge = TbfComponents.FindComponent(config.Name) as GciBridge; + + if (bridge == null) + { + MessageBox.Show("GciBridge component was not found.", "GCI Bridge"); + return; + } + + bridge.ConnectExternal(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "GCI Bridge error"); + } } private void showGuiButton_Click(object sender, EventArgs e) { - /// TODO + try + { + GciBridge bridge = TbfComponents.FindComponent(config.Name) as GciBridge; + + if (bridge == null) + { + MessageBox.Show("GciBridge component was not found.", "GCI Bridge"); + return; + } + + bridge.ShowGui(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "GCI Bridge error"); + } } } } \ No newline at end of file