private void SplitSelectedParagraph(double? splitSeconds, int? textIndex) { string language = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitle); int? alternateTextIndex = null; if (textBoxListViewTextAlternate.Focused) { alternateTextIndex = textIndex; textIndex = null; } if (_subtitle.Paragraphs.Count > 0 && SubtitleListview1.SelectedItems.Count > 0) { SubtitleListview1.SelectedIndexChanged -= SubtitleListview1_SelectedIndexChanged; MakeHistoryForUndo(_language.BeforeSplitLine); int firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index; var currentParagraph = _subtitle.GetParagraphOrDefault(firstSelectedIndex); var newParagraph = new Paragraph(currentParagraph); newParagraph.NewSection = false; currentParagraph.Text = currentParagraph.Text.Replace("< /i>", "</i>"); currentParagraph.Text = currentParagraph.Text.Replace("< i>", "<i>"); string oldText = currentParagraph.Text; var lines = currentParagraph.Text.SplitToLines(); if (textIndex != null && textIndex.Value > 2 && textIndex.Value < oldText.Length - 2) { string a = oldText.Substring(0, textIndex.Value).Trim(); string b = oldText.Substring(textIndex.Value).Trim(); string aTrimmed = a.TrimEnd('"').TrimEnd().TrimEnd('\'').TrimEnd(); string bTrimmed = b.TrimEnd('"').TrimEnd().TrimEnd('\'').TrimEnd(); if (oldText.TrimStart().StartsWith("<i>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</i>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<i>") == 1 && Utilities.CountTagInText(oldText, "</i>") == 1) { a = a + "</i>"; b = "<i>" + b; } else if (oldText.TrimStart().StartsWith("<b>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</b>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<b>") == 1 && Utilities.CountTagInText(oldText, "</b>") == 1) { a = a + "</b>"; b = "<b>" + b; } else if (a.StartsWith('-') && (aTrimmed.EndsWith('.') || aTrimmed.EndsWith('!') || aTrimmed.EndsWith('?')) && b.StartsWith('-') && (bTrimmed.EndsWith('.') || bTrimmed.EndsWith('!') || bTrimmed.EndsWith('?'))) { a = a.TrimStart('-').TrimStart(); b = b.TrimStart('-').TrimStart(); } else if (a.StartsWith("<i>-", StringComparison.Ordinal) && (aTrimmed.EndsWith(".</i>", StringComparison.Ordinal) || aTrimmed.EndsWith("!</i>", StringComparison.Ordinal) || aTrimmed.EndsWith("?</i>", StringComparison.Ordinal)) && b.StartsWith("<i>-", StringComparison.Ordinal) && (bTrimmed.EndsWith(".</i>", StringComparison.Ordinal) || bTrimmed.EndsWith("!</i>", StringComparison.Ordinal) || bTrimmed.EndsWith("?</i>", StringComparison.Ordinal))) { a = a.Remove(3, 1).Replace(" ", " "); b = b.Remove(3, 1).Replace(" ", " "); } else if (a.StartsWith('-') && (aTrimmed.EndsWith('.') || aTrimmed.EndsWith('!') || aTrimmed.EndsWith('?')) && b.StartsWith("<i>-", StringComparison.Ordinal) && (bTrimmed.EndsWith(".</i>", StringComparison.Ordinal) || bTrimmed.EndsWith("!</i>", StringComparison.Ordinal) || bTrimmed.EndsWith("?</i>", StringComparison.Ordinal))) { a = a.TrimStart('-').TrimStart(); b = b.Remove(3, 1).Replace(" ", " ").Trim(); } else if (a.StartsWith("<i>-", StringComparison.Ordinal) && (aTrimmed.EndsWith(".</i>", StringComparison.Ordinal) || aTrimmed.EndsWith("!</i>", StringComparison.Ordinal) || aTrimmed.EndsWith("?</i>", StringComparison.Ordinal)) && b.StartsWith('-') && (bTrimmed.EndsWith('.') || bTrimmed.EndsWith('!') || bTrimmed.EndsWith('?'))) { a = a.Remove(3, 1).Replace(" ", " ").Trim(); b = b.TrimStart('-').TrimStart(); } currentParagraph.Text = Utilities.AutoBreakLine(a, language); newParagraph.Text = Utilities.AutoBreakLine(b, language); } else { var l0 = string.Empty; if (lines.Length > 0) l0 = lines[0].Trim().TrimEnd('"', '\'').TrimEnd(); if (lines.Length == 2 && (l0.EndsWith('.') || l0.EndsWith('!') || l0.EndsWith('?'))) { currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); if (lines[0].Length > 2 && lines[0][0] == '-' && lines[0][1] != '-' && lines[1].Length > 2 && lines[1][0] == '-' && lines[1][1] != '-') { currentParagraph.Text = currentParagraph.Text.TrimStart('-').Trim(); newParagraph.Text = newParagraph.Text.TrimStart('-').Trim(); } if (currentParagraph.Text.StartsWith("<i>", StringComparison.Ordinal) && !currentParagraph.Text.Contains("</i>") && newParagraph.Text.EndsWith("</i>", StringComparison.Ordinal) && !newParagraph.Text.Contains("<i>")) { currentParagraph.Text = currentParagraph.Text + "</i>"; newParagraph.Text = "<i>" + newParagraph.Text; } if (currentParagraph.Text.StartsWith("<b>", StringComparison.Ordinal) && !currentParagraph.Text.Contains("</b>") && newParagraph.Text.EndsWith("</b>", StringComparison.Ordinal) && !newParagraph.Text.Contains("<b>")) { currentParagraph.Text = currentParagraph.Text + "</b>"; newParagraph.Text = "<b>" + newParagraph.Text; } if (currentParagraph.Text.StartsWith("<i>-", StringComparison.Ordinal) && (currentParagraph.Text.EndsWith(".</i>", StringComparison.Ordinal) || currentParagraph.Text.EndsWith("!</i>", StringComparison.Ordinal)) && newParagraph.Text.StartsWith("<i>-", StringComparison.Ordinal) && (newParagraph.Text.EndsWith(".</i>") || newParagraph.Text.EndsWith("!</i>"))) { currentParagraph.Text = currentParagraph.Text.Remove(3, 1); newParagraph.Text = newParagraph.Text.Remove(3, 1); } else if (lines[0].StartsWith('-') && (lines[0].EndsWith('.') || lines[0].EndsWith('!') || lines[0].EndsWith('?')) && lines[1].StartsWith("<i>-", StringComparison.Ordinal) && (lines[1].EndsWith(".</i>", StringComparison.Ordinal) || lines[1].EndsWith("!</i>", StringComparison.Ordinal) || lines[1].EndsWith("?</i>", StringComparison.Ordinal))) { currentParagraph.Text = lines[0].TrimStart('-').TrimStart(); newParagraph.Text = lines[1].Remove(3, 1).Replace(" ", " ").Trim(); } } else if (lines.Length == 2 && (lines[0].EndsWith(".</i>", StringComparison.Ordinal) || lines[0].EndsWith("!</i>", StringComparison.Ordinal) || lines[0].EndsWith("?</i>", StringComparison.Ordinal))) { currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); if (lines[0].Length > 5 && lines[0].StartsWith("<i>-", StringComparison.Ordinal) && lines[0][4] != '-' && lines[1].Length > 5 && lines[1].StartsWith("<i>-", StringComparison.Ordinal) && lines[1][4] != '-') { currentParagraph.Text = currentParagraph.Text.Remove(3, 1); if (currentParagraph.Text[3] == ' ') currentParagraph.Text = currentParagraph.Text.Remove(3, 1); newParagraph.Text = newParagraph.Text.Remove(3, 1); if (newParagraph.Text[3] == ' ') newParagraph.Text = newParagraph.Text.Remove(3, 1); } else if (lines[0].StartsWith('-') && (lines[0].EndsWith('.') || lines[0].EndsWith('!') || lines[0].EndsWith('?')) && lines[1].StartsWith("<i>-", StringComparison.Ordinal) && (lines[1].EndsWith(".</i>", StringComparison.Ordinal) || lines[1].EndsWith("!</i>", StringComparison.Ordinal) || lines[1].EndsWith("?</i>", StringComparison.Ordinal))) { currentParagraph.Text = lines[0].TrimStart('-').TrimStart(); newParagraph.Text = lines[1].Remove(3, 1).Replace(" ", " ").Trim(); } else if (lines[0].StartsWith("<i>-", StringComparison.Ordinal) && (lines[0].EndsWith(".</i>", StringComparison.Ordinal) || lines[0].EndsWith("!</i>", StringComparison.Ordinal) || lines[0].EndsWith("?</i>", StringComparison.Ordinal)) && lines[1].StartsWith('-') && (lines[1].EndsWith('.') || lines[1].EndsWith('!') || lines[1].EndsWith('?'))) { currentParagraph.Text = lines[0].Remove(3, 1).Replace(" ", " ").Trim(); newParagraph.Text = lines[1].TrimStart('-').TrimStart(); } } else { string s = currentParagraph.Text; var arr = HtmlUtil.RemoveHtmlTags(s, true).SplitToLines(); if (arr.Length != 2 || arr[0].Length > Configuration.Settings.General.SubtitleLineMaximumLength || arr[1].Length > Configuration.Settings.General.SubtitleLineMaximumLength) { if (arr.Length == 2 && arr[0].StartsWith('-') && arr[1].StartsWith('-')) { if (lines[0].StartsWith("<i>-", StringComparison.Ordinal)) { lines[0] = "<i>" + lines[0].Remove(0, 4).TrimStart(); } lines[0] = lines[0].TrimStart('-').TrimStart(); lines[1] = lines[1].TrimStart('-').TrimStart(); s = lines[0] + Environment.NewLine + lines[1]; } else { s = Utilities.AutoBreakLine(currentParagraph.Text, 5, Configuration.Settings.Tools.MergeLinesShorterThan, language); } } lines = s.SplitToLines(); if (lines.Length == 1) { s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 20, language); lines = s.SplitToLines(); } if (lines.Length == 1) { s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 18, language); lines = s.SplitToLines(); } if (lines.Length == 1) { s = Utilities.AutoBreakLine(currentParagraph.Text, 3, 15, language); lines = s.SplitToLines(); } if (lines.Length == 2) { if (Utilities.CountTagInText(s, "<i>") == 1 && lines[0].StartsWith("<i>", StringComparison.Ordinal) && lines[1].EndsWith("</i>", StringComparison.Ordinal)) { lines[0] += "</i>"; lines[1] = "<i>" + lines[1]; } currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); newParagraph.Text = Utilities.AutoBreakLine(lines[1], language); } else if (lines.Length == 1) { currentParagraph.Text = Utilities.AutoBreakLine(lines[0], language); newParagraph.Text = string.Empty; } if (currentParagraph.Text.StartsWith("<i>", StringComparison.Ordinal) && !currentParagraph.Text.Contains("</i>", StringComparison.Ordinal) && newParagraph.Text.EndsWith("</i>", StringComparison.Ordinal) && !newParagraph.Text.Contains("<i>", StringComparison.Ordinal)) { currentParagraph.Text = currentParagraph.Text + "</i>"; newParagraph.Text = "<i>" + newParagraph.Text; } if (currentParagraph.Text.StartsWith("<b>", StringComparison.Ordinal) && !currentParagraph.Text.Contains("</b>", StringComparison.Ordinal) && newParagraph.Text.EndsWith("</b>", StringComparison.Ordinal) && !newParagraph.Text.Contains("<b>")) { currentParagraph.Text = currentParagraph.Text + "</b>"; newParagraph.Text = "<b>" + newParagraph.Text; } if (currentParagraph.Text.StartsWith("<i>-", StringComparison.Ordinal) && (currentParagraph.Text.EndsWith(".</i>", StringComparison.Ordinal) || currentParagraph.Text.EndsWith("!</i>", StringComparison.Ordinal)) && newParagraph.Text.StartsWith("<i>-", StringComparison.Ordinal) && (newParagraph.Text.EndsWith(".</i>", StringComparison.Ordinal) || newParagraph.Text.EndsWith("!</i>", StringComparison.Ordinal))) { currentParagraph.Text = currentParagraph.Text.Remove(3, 1); newParagraph.Text = newParagraph.Text.Remove(3, 1); } } } if (currentParagraph.Text.StartsWith("<i> ", StringComparison.Ordinal)) currentParagraph.Text = currentParagraph.Text.Remove(3, 1); if (newParagraph.Text.StartsWith("<i> ", StringComparison.Ordinal)) newParagraph.Text = newParagraph.Text.Remove(3, 1); double middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds / 2); if (!string.IsNullOrWhiteSpace(HtmlUtil.RemoveHtmlTags(oldText))) { var startFactor = (double)HtmlUtil.RemoveHtmlTags(currentParagraph.Text).Length / HtmlUtil.RemoveHtmlTags(oldText).Length; if (startFactor < 0.25) startFactor = 0.25; if (startFactor > 0.75) startFactor = 0.75; middle = currentParagraph.StartTime.TotalMilliseconds + (currentParagraph.Duration.TotalMilliseconds * startFactor); } if (splitSeconds.HasValue && splitSeconds.Value > (currentParagraph.StartTime.TotalSeconds + 0.2) && splitSeconds.Value < (currentParagraph.EndTime.TotalSeconds - 0.2)) middle = splitSeconds.Value * TimeCode.BaseUnit; newParagraph.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; currentParagraph.EndTime.TotalMilliseconds = middle; newParagraph.StartTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds + 1; if (Configuration.Settings.General.MinimumMillisecondsBetweenLines > 0) { var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex + 1); if (next == null || next.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds + Configuration.Settings.General.MinimumMillisecondsBetweenLines + Configuration.Settings.General.MinimumMillisecondsBetweenLines) { newParagraph.StartTime.TotalMilliseconds += Configuration.Settings.General.MinimumMillisecondsBetweenLines; newParagraph.EndTime.TotalMilliseconds += Configuration.Settings.General.MinimumMillisecondsBetweenLines; } else { newParagraph.StartTime.TotalMilliseconds += Configuration.Settings.General.MinimumMillisecondsBetweenLines; } } if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) { var originalCurrent = Utilities.GetOriginalParagraph(firstSelectedIndex, currentParagraph, _subtitleAlternate.Paragraphs); if (originalCurrent != null) { string languageOriginal = LanguageAutoDetect.AutoDetectGoogleLanguage(_subtitleAlternate); originalCurrent.EndTime.TotalMilliseconds = currentParagraph.EndTime.TotalMilliseconds; var originalNew = new Paragraph(newParagraph); originalNew.NewSection = false; lines = originalCurrent.Text.SplitToLines(); oldText = originalCurrent.Text; if (alternateTextIndex != null && alternateTextIndex.Value > 2 && alternateTextIndex.Value < oldText.Length - 2) { originalCurrent.Text = Utilities.AutoBreakLine(oldText.Substring(0, alternateTextIndex.Value).Trim(), language); originalNew.Text = Utilities.AutoBreakLine(oldText.Substring(alternateTextIndex.Value).Trim(), language); if (originalCurrent.Text.StartsWith("<i>", StringComparison.Ordinal) && !originalCurrent.Text.Contains("</i>", StringComparison.Ordinal) && originalNew.Text.EndsWith("</i>", StringComparison.Ordinal) && !originalNew.Text.Contains("<i>", StringComparison.Ordinal)) { originalCurrent.Text = originalCurrent.Text + "</i>"; originalNew.Text = "<i>" + originalNew.Text; } if (originalCurrent.Text.StartsWith("<b>", StringComparison.Ordinal) && !originalCurrent.Text.Contains("</b>") && originalNew.Text.EndsWith("</b>", StringComparison.Ordinal) && !originalNew.Text.Contains("<b>")) { originalCurrent.Text = originalCurrent.Text + "</b>"; originalNew.Text = "<b>" + originalNew.Text; } if (originalCurrent.Text.StartsWith('-') && (originalCurrent.Text.EndsWith('.') || originalCurrent.Text.EndsWith('!')) && originalNew.Text.StartsWith('-') && (originalNew.Text.EndsWith('.') || originalNew.Text.EndsWith('!'))) { originalCurrent.Text = originalCurrent.Text.Remove(0, 1).Trim(); originalNew.Text = originalNew.Text.Remove(0, 1).Trim(); } if (originalCurrent.Text.StartsWith("<i>-", StringComparison.Ordinal) && (originalCurrent.Text.EndsWith(".</i>", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("!</i>", StringComparison.Ordinal)) && originalNew.Text.StartsWith("<i>-", StringComparison.Ordinal) && (originalNew.Text.EndsWith(".</i>", StringComparison.Ordinal) || originalNew.Text.EndsWith("!</i>", StringComparison.Ordinal))) { originalCurrent.Text = originalCurrent.Text.Remove(3, 1); originalNew.Text = originalNew.Text.Remove(3, 1); } if (originalCurrent.Text.StartsWith("<b>-", StringComparison.Ordinal) && (originalCurrent.Text.EndsWith(".</b>", StringComparison.Ordinal) || originalCurrent.Text.EndsWith("!</b>", StringComparison.Ordinal)) && originalNew.Text.StartsWith("<b>-", StringComparison.Ordinal) && (originalNew.Text.EndsWith(".</b>", StringComparison.Ordinal) || originalNew.Text.EndsWith("!</b>", StringComparison.Ordinal))) { originalCurrent.Text = originalCurrent.Text.Remove(3, 1); originalNew.Text = originalNew.Text.Remove(3, 1); } lines = new string[0]; } else if (lines.Length == 2 && (lines[0].EndsWith('.') || lines[0].EndsWith('!') || lines[0].EndsWith('?'))) { string a = lines[0].Trim(); string b = lines[1].Trim(); if (oldText.TrimStart().StartsWith("<i>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</i>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<i>") == 1 && Utilities.CountTagInText(oldText, "</i>") == 1) { a = a + "</i>"; b = "<i>" + b; } if (oldText.TrimStart().StartsWith("<b>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</b>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<b>") == 1 && Utilities.CountTagInText(oldText, "</b>") == 1) { a = a + "</b>"; b = "<b>" + b; } if (a.StartsWith('-') && (a.EndsWith('.') || a.EndsWith('!') || a.EndsWith('?')) && b.StartsWith('-') && (b.EndsWith('.') || b.EndsWith('!') || b.EndsWith('?'))) { a = a.TrimStart('-').TrimStart(); b = b.TrimStart('-').TrimStart(); } if (a.StartsWith("<i>-", StringComparison.Ordinal) && (a.EndsWith(".</i>", StringComparison.Ordinal) || a.EndsWith("!</i>", StringComparison.Ordinal) || a.EndsWith("?</i>", StringComparison.Ordinal)) && b.StartsWith("<i>-", StringComparison.Ordinal) && (b.EndsWith(".</i>", StringComparison.Ordinal) || b.EndsWith("!</i>", StringComparison.Ordinal) || b.EndsWith("?</i>", StringComparison.Ordinal))) { a = a.Remove(3, 1).Replace(" ", " "); b = b.Remove(3, 1).Replace(" ", " "); } lines[0] = a; lines[1] = b; originalCurrent.Text = Utilities.AutoBreakLine(a); originalNew.Text = Utilities.AutoBreakLine(b); } else { string s = Utilities.AutoBreakLine(originalCurrent.Text, 5, Configuration.Settings.Tools.MergeLinesShorterThan, languageOriginal); lines = s.SplitToLines(); } if (lines.Length == 1) { string s = Utilities.AutoBreakLine(lines[0], 3, 20, languageOriginal); lines = s.SplitToLines(); } if (lines.Length == 1) { string s = Utilities.AutoBreakLine(lines[0], 3, 18, languageOriginal); lines = s.SplitToLines(); } if (lines.Length == 1) { string s = Utilities.AutoBreakLine(lines[0], 3, 15, languageOriginal); lines = s.SplitToLines(); } if (lines.Length == 2) { string a = lines[0].Trim(); string b = lines[1].Trim(); if (oldText.TrimStart().StartsWith("<i>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</i>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<i>") == 1 && Utilities.CountTagInText(oldText, "</i>") == 1) { a = a + "</i>"; b = "<i>" + b; } if (oldText.TrimStart().StartsWith("<b>", StringComparison.Ordinal) && oldText.TrimEnd().EndsWith("</b>", StringComparison.Ordinal) && Utilities.CountTagInText(oldText, "<b>") == 1 && Utilities.CountTagInText(oldText, "</b>") == 1) { a = a + "</b>"; b = "<b>" + b; } if (a.StartsWith('-') && (a.EndsWith('.') || a.EndsWith('!') || a.EndsWith('?')) && b.StartsWith('-') && (b.EndsWith('.') || b.EndsWith('!') || b.EndsWith('?'))) { a = a.TrimStart('-').TrimStart(); b = b.TrimStart('-').TrimStart(); } if (a.StartsWith("<i>-", StringComparison.Ordinal) && (a.EndsWith(".</i>", StringComparison.Ordinal) || a.EndsWith("!</i>", StringComparison.Ordinal) || a.EndsWith("?</i>", StringComparison.Ordinal)) && b.StartsWith("<i>-", StringComparison.Ordinal) && (b.EndsWith(".</i>", StringComparison.Ordinal) || b.EndsWith("!</i>", StringComparison.Ordinal) || b.EndsWith("?</i>", StringComparison.Ordinal))) { a = a.Remove(3, 1).Replace(" ", " "); b = b.Remove(3, 1).Replace(" ", " "); } lines[0] = a; lines[1] = b; originalCurrent.Text = Utilities.AutoBreakLine(lines[0]); originalNew.Text = Utilities.AutoBreakLine(lines[1]); } else if (lines.Length == 1) { originalNew.Text = string.Empty; } if (originalCurrent != null && originalNew != null) { if (originalCurrent.Text.StartsWith("<i> ", StringComparison.Ordinal)) originalCurrent.Text = originalCurrent.Text.Remove(3, 1); if (originalNew.Text.StartsWith("<i> ", StringComparison.Ordinal)) originalCurrent.Text = originalCurrent.Text.Remove(3, 1); } _subtitleAlternate.InsertParagraphInCorrectTimeOrder(originalNew); _subtitleAlternate.Renumber(); } } if (_networkSession != null) { _networkSession.TimerStop(); SetDurationInSeconds(currentParagraph.Duration.TotalSeconds); _networkSession.UpdateLine(_subtitle.GetIndex(currentParagraph), currentParagraph); NetworkGetSendUpdates(new List<int>(), firstSelectedIndex + 1, newParagraph); } else { if (GetCurrentSubtitleFormat().IsFrameBased) { if (currentParagraph != null) { currentParagraph.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); currentParagraph.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); } newParagraph.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); newParagraph.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); } _subtitle.Paragraphs.Insert(firstSelectedIndex + 1, newParagraph); _subtitle.Renumber(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); } SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex); ShowSource(); ShowStatus(_language.LineSplitted); SubtitleListview1.SelectedIndexChanged += SubtitleListview1_SelectedIndexChanged; RefreshSelectedParagraph(); SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex, true); } }
private void addParagraphHereToolStripMenuItem_Click(object sender, EventArgs e) { audioVisualizer.ClearSelection(); var newParagraph = new Paragraph(audioVisualizer.NewSelectionParagraph); var format = GetCurrentSubtitleFormat(); bool useExtraForStyle = format.HasStyleSupport; var styles = new List<string>(); if (format.GetType() == typeof(AdvancedSubStationAlpha) || format.GetType() == typeof(SubStationAlpha)) styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); else if (format.GetType() == typeof(TimedText10) || format.GetType() == typeof(ItunesTimedText)) styles = TimedText10.GetStylesFromHeader(_subtitle.Header); else if (format.GetType() == typeof(Sami) || format.GetType() == typeof(SamiModern)) styles = Sami.GetStylesFromHeader(_subtitle.Header); string style = "Default"; if (styles.Count > 0) style = styles[0]; if (useExtraForStyle) newParagraph.Extra = style; mediaPlayer.Pause(); // find index where to insert int index = 0; for (int i = 0; i < _subtitle.Paragraphs.Count; i++) { var p = _subtitle.Paragraphs[i]; if (p.StartTime.TotalMilliseconds > newParagraph.StartTime.TotalMilliseconds && (!p.StartTime.IsMaxTime || !HasSmallerStartTimes(_subtitle, i + 1, newParagraph.StartTime.TotalMilliseconds))) { break; } index++; } MakeHistoryForUndo(_language.BeforeInsertLine); // create and insert if (format.IsFrameBased) { newParagraph.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); newParagraph.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); } if (_networkSession != null) { _networkSession.TimerStop(); NetworkGetSendUpdates(new List<int>(), index, newParagraph); } else { _subtitle.Paragraphs.Insert(index, newParagraph); if (_subtitleAlternate != null && SubtitleListview1.IsAlternateTextColumnVisible && Configuration.Settings.General.AllowEditOfOriginalSubtitle) { _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); _subtitleAlternate.Renumber(); } _subtitleListViewIndex = -1; _subtitle.Renumber(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); } SubtitleListview1.SelectIndexAndEnsureVisible(index); textBoxListViewText.Focus(); audioVisualizer.NewSelectionParagraph = null; ShowStatus(string.Format(_language.VideoControls.NewTextInsertAtX, newParagraph.StartTime.ToShortString())); audioVisualizer.Invalidate(); }
private void InsertAfter() { var format = GetCurrentSubtitleFormat(); bool useExtraForStyle = format.HasStyleSupport; var formatType = format.GetType(); var styles = new List<string>(); if (formatType == typeof(AdvancedSubStationAlpha) || formatType == typeof(SubStationAlpha)) styles = AdvancedSubStationAlpha.GetStylesFromHeader(_subtitle.Header); else if (formatType == typeof(TimedText10) || formatType == typeof(ItunesTimedText)) styles = TimedText10.GetStylesFromHeader(_subtitle.Header); else if (formatType == typeof(Sami) || formatType == typeof(SamiModern)) styles = Sami.GetStylesFromHeader(_subtitle.Header); string style = "Default"; if (styles.Count > 0) style = styles[0]; MakeHistoryForUndo(_language.BeforeInsertLine); int firstSelectedIndex = 0; if (SubtitleListview1.SelectedItems.Count > 0) firstSelectedIndex = SubtitleListview1.SelectedItems[0].Index + 1; var newParagraph = new Paragraph(); if (useExtraForStyle) { newParagraph.Extra = style; if (format.GetType() == typeof(TimedText10) || format.GetType() == typeof(ItunesTimedText)) { if (styles.Count > 0) newParagraph.Style = style; newParagraph.Extra = TimedText10.SetExtra(newParagraph); } } var prev = _subtitle.GetParagraphOrDefault(firstSelectedIndex - 1); var next = _subtitle.GetParagraphOrDefault(firstSelectedIndex); if (prev != null) { int addMilliseconds = Configuration.Settings.General.MinimumMillisecondsBetweenLines; if (addMilliseconds < 1) addMilliseconds = 1; newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + addMilliseconds; newParagraph.EndTime.TotalMilliseconds = newParagraph.StartTime.TotalMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs; if (next != null && newParagraph.EndTime.TotalMilliseconds > next.StartTime.TotalMilliseconds) newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; if (newParagraph.StartTime.TotalMilliseconds > newParagraph.EndTime.TotalMilliseconds) newParagraph.StartTime.TotalMilliseconds = prev.EndTime.TotalMilliseconds + 1; } else if (next != null) { newParagraph.StartTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 2000; newParagraph.EndTime.TotalMilliseconds = next.StartTime.TotalMilliseconds - 1; } else { newParagraph.StartTime.TotalMilliseconds = 1000; newParagraph.EndTime.TotalMilliseconds = 3000; } if (GetCurrentSubtitleFormat().IsFrameBased) { newParagraph.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); newParagraph.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); } if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) { var currentOriginal = Utilities.GetOriginalParagraph(firstSelectedIndex - 1, _subtitle.Paragraphs[firstSelectedIndex - 1], _subtitleAlternate.Paragraphs); if (currentOriginal != null) { _subtitleAlternate.Paragraphs.Insert(_subtitleAlternate.Paragraphs.IndexOf(currentOriginal) + 1, new Paragraph(newParagraph)); } else { _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); } _subtitleAlternate.Renumber(); } if (_networkSession != null) { _networkSession.TimerStop(); NetworkGetSendUpdates(new List<int>(), firstSelectedIndex, newParagraph); } else { _subtitle.Paragraphs.Insert(firstSelectedIndex, newParagraph); _subtitle.Renumber(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); } SubtitleListview1.SelectIndexAndEnsureVisible(firstSelectedIndex); ShowSource(); ShowStatus(_language.LineInserted); }
private Paragraph InsertNewTextAtVideoPosition() { // current movie Position double videoPositionInMilliseconds = mediaPlayer.CurrentPosition * TimeCode.BaseUnit; if (!mediaPlayer.IsPaused) videoPositionInMilliseconds -= Configuration.Settings.General.SetStartEndHumanDelay; var tc = new TimeCode(videoPositionInMilliseconds); MakeHistoryForUndo(_language.BeforeInsertSubtitleAtVideoPosition + " " + tc); // find index where to insert int index = 0; foreach (var p in _subtitle.Paragraphs) { if (p.StartTime.TotalMilliseconds > videoPositionInMilliseconds) break; index++; } // create and insert var newParagraph = new Paragraph(string.Empty, videoPositionInMilliseconds, videoPositionInMilliseconds + Configuration.Settings.General.NewEmptyDefaultMs); if (GetCurrentSubtitleFormat().IsFrameBased) { newParagraph.CalculateFrameNumbersFromTimeCodes(CurrentFrameRate); newParagraph.CalculateTimeCodesFromFrameNumbers(CurrentFrameRate); } if (_networkSession != null) { _networkSession.TimerStop(); NetworkGetSendUpdates(new List<int>(), index, newParagraph); } else { _subtitle.Paragraphs.Insert(index, newParagraph); // check if original is available - and insert new paragraph in the original too if (Configuration.Settings.General.AllowEditOfOriginalSubtitle && _subtitleAlternate != null && _subtitleAlternate.Paragraphs.Count > 0) { _subtitleAlternate.InsertParagraphInCorrectTimeOrder(new Paragraph(newParagraph)); _subtitleAlternate.Renumber(); } _subtitleListViewIndex = -1; _subtitle.Renumber(); SubtitleListview1.Fill(_subtitle, _subtitleAlternate); } SubtitleListview1.SelectIndexAndEnsureVisible(index); return newParagraph; }