using System; using System.Windows.Forms; using Nullstack.ClearCanvasEx.DevTools.Logging; namespace Nullstack.ClearCanvasEx.DevTools.View.WinForms { public partial class LogViewerComponentPanel : UserControl { private readonly LogViewerComponent _component; public LogViewerComponentPanel(LogViewerComponent component) { InitializeComponent(); _component = component; if (_component != null) { _component.BufferReset += ComponentBufferReset; _component.BufferAppended += ComponentBufferAppended; } } private bool Search(string subject, int start, bool reverse, bool caseSensitive) { if (string.IsNullOrEmpty(subject)) return false; var rangeStart = !reverse ? start : 0; var rangeEnd = !reverse ? _logPane.TextLength : start; var options = RichTextBoxFinds.None; if (rangeStart > _logPane.TextLength || rangeEnd > _logPane.TextLength) return false; if (caseSensitive) options |= RichTextBoxFinds.MatchCase; if (reverse) options |= RichTextBoxFinds.Reverse; return _logPane.Find(subject, rangeStart, rangeEnd, options) >= 0; } private void ScrollToEnd() { _logPane.Select(_logPane.TextLength, 0); _logPane.ScrollToCaret(); } private void ComponentBufferAppended(object sender, ClearCanvas.Common.Utilities.ItemEventArgs e) { var s = e.Item; _logPane.AppendText(s); ScrollToEnd(); } private void ComponentBufferReset(object sender, EventArgs e) { var s = _component.ReadBuffer(); _logPane.Text = s; ScrollToEnd(); } private void TxtSearchFieldTextChanged(object sender, EventArgs e) { Search(_txtSearchField.Text, 0, false, _chkSearchCaseSensitive.Checked); } private void BtnSearchNextClick(object sender, EventArgs e) { Search(_txtSearchField.Text, _logPane.SelectionStart + 1, false, _chkSearchCaseSensitive.Checked); } private void BtnSearchPreviousClick(object sender, EventArgs e) { Search(_txtSearchField.Text, _logPane.SelectionStart, true, _chkSearchCaseSensitive.Checked); } private void LogPaneKeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.F3 && !string.IsNullOrEmpty(_txtSearchField.Text)) { e.Handled = true; e.SuppressKeyPress = true; Search(_txtSearchField.Text, _logPane.SelectionStart + 1, false, _chkSearchCaseSensitive.Checked); } else if (e.KeyData == Keys.F3 || (e.KeyData == (Keys) (Keys.Control | Keys.F))) { e.Handled = true; e.SuppressKeyPress = true; _lyoSearchPane.Visible = true; _txtSearchField.Focus(); } } private void BtnCloseSearchPaneClick(object sender, EventArgs e) { _lyoSearchPane.Visible = false; } } }