private void GotoLineNumberToolStripMenuItemClick(object sender, EventArgs e) { ReloadFromSourceView(); if (!IsSubtitleLoaded) { MessageBox.Show(_language.NoSubtitleLoaded, Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var goToLine = new GoToLine(); if (tabControlSubtitle.SelectedIndex == TabControlListView) { goToLine.Initialize(1, SubtitleListview1.Items.Count); } else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) { goToLine.Initialize(1, textBoxSource.Lines.Length); } if (goToLine.ShowDialog(this) == DialogResult.OK) { if (tabControlSubtitle.SelectedIndex == TabControlListView) { SubtitleListview1.SelectNone(); SubtitleListview1.Items[goToLine.LineNumber - 1].Selected = true; SubtitleListview1.Items[goToLine.LineNumber - 1].EnsureVisible(); SubtitleListview1.Items[goToLine.LineNumber - 1].Focused = true; ShowStatus(string.Format(_language.GoToLineNumberX, goToLine.LineNumber)); } else if (tabControlSubtitle.SelectedIndex == TabControlSourceView) { // binary search int start = 0; int end = textBoxSource.Text.Length; while (end - start > 10) { int middle = (end - start) / 2; if (goToLine.LineNumber - 1 >= textBoxSource.GetLineFromCharIndex(start + middle)) start += middle; else end = start + middle; } // go before line, so we can find first char on line start -= 100; if (start < 0) start = 0; for (int i = start; i <= end; i++) { if (textBoxSource.GetLineFromCharIndex(i) == goToLine.LineNumber - 1) { // select line, scroll to line, and focus... textBoxSource.SelectionStart = i; textBoxSource.SelectionLength = textBoxSource.Lines[goToLine.LineNumber - 1].Length; textBoxSource.ScrollToCaret(); ShowStatus(string.Format(_language.GoToLineNumberX, goToLine.LineNumber)); if (textBoxSource.CanFocus) textBoxSource.Focus(); break; } } ShowSourceLineNumber(); } } goToLine.Dispose(); }