diff --git a/src/ui/Forms/JoinSubtitles.Designer.cs b/src/ui/Forms/JoinSubtitles.Designer.cs
index 69208c17e..b04b216ac 100644
--- a/src/ui/Forms/JoinSubtitles.Designer.cs
+++ b/src/ui/Forms/JoinSubtitles.Designer.cs
@@ -28,6 +28,7 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
this.buttonCancel = new System.Windows.Forms.Button();
this.buttonJoin = new System.Windows.Forms.Button();
this.listViewParts = new System.Windows.Forms.ListView();
@@ -45,7 +46,13 @@
this.numericUpDownAddMs = new Nikse.SubtitleEdit.Controls.NikseUpDown();
this.radioButtonJoinAddTime = new System.Windows.Forms.RadioButton();
this.labelAddTime = new Nikse.SubtitleEdit.Controls.NikseLabel();
+ this.contextMenuStripParts = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.moveTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.moveBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.groupBoxPreview.SuspendLayout();
+ this.contextMenuStripParts.SuspendLayout();
this.SuspendLayout();
//
// buttonCancel
@@ -83,6 +90,7 @@
this.columnHeaderStartTime,
this.columnHeaderEndTime,
this.columnHeaderFileName});
+ this.listViewParts.ContextMenuStrip = this.contextMenuStripParts;
this.listViewParts.FullRowSelect = true;
this.listViewParts.HideSelection = false;
this.listViewParts.Location = new System.Drawing.Point(6, 19);
@@ -91,6 +99,7 @@
this.listViewParts.TabIndex = 101;
this.listViewParts.UseCompatibleStateImageBehavior = false;
this.listViewParts.View = System.Windows.Forms.View.Details;
+ this.listViewParts.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewParts_ColumnClick);
this.listViewParts.DragDrop += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragDrop);
this.listViewParts.DragEnter += new System.Windows.Forms.DragEventHandler(this.listViewParts_DragEnter);
//
@@ -252,6 +261,49 @@
this.labelAddTime.TabIndex = 34;
this.labelAddTime.Text = "Add milliseconds after each file";
//
+ // contextMenuStripParts
+ //
+ this.contextMenuStripParts.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.moveUpToolStripMenuItem,
+ this.moveDownToolStripMenuItem,
+ this.moveTopToolStripMenuItem,
+ this.moveBottomToolStripMenuItem});
+ this.contextMenuStripParts.Name = "contextMenuStrip1";
+ this.contextMenuStripParts.Size = new System.Drawing.Size(216, 92);
+ this.contextMenuStripParts.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripParts_Opening);
+ //
+ // moveUpToolStripMenuItem
+ //
+ this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem";
+ this.moveUpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Up)));
+ this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(215, 22);
+ this.moveUpToolStripMenuItem.Text = "Move up";
+ this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click);
+ //
+ // moveDownToolStripMenuItem
+ //
+ this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem";
+ this.moveDownToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Down)));
+ this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(215, 22);
+ this.moveDownToolStripMenuItem.Text = "Move down";
+ this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click);
+ //
+ // moveTopToolStripMenuItem
+ //
+ this.moveTopToolStripMenuItem.Name = "moveTopToolStripMenuItem";
+ this.moveTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Home)));
+ this.moveTopToolStripMenuItem.Size = new System.Drawing.Size(215, 22);
+ this.moveTopToolStripMenuItem.Text = "Move to top";
+ this.moveTopToolStripMenuItem.Click += new System.EventHandler(this.moveTopToolStripMenuItem_Click);
+ //
+ // moveBottomToolStripMenuItem
+ //
+ this.moveBottomToolStripMenuItem.Name = "moveBottomToolStripMenuItem";
+ this.moveBottomToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.End)));
+ this.moveBottomToolStripMenuItem.Size = new System.Drawing.Size(215, 22);
+ this.moveBottomToolStripMenuItem.Text = "Move to bottom";
+ this.moveBottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomToolStripMenuItem_Click);
+ //
// JoinSubtitles
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -279,6 +331,7 @@
this.Resize += new System.EventHandler(this.JoinSubtitles_Resize);
this.groupBoxPreview.ResumeLayout(false);
this.groupBoxPreview.PerformLayout();
+ this.contextMenuStripParts.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -303,5 +356,10 @@
private Nikse.SubtitleEdit.Controls.NikseUpDown numericUpDownAddMs;
private System.Windows.Forms.RadioButton radioButtonJoinAddTime;
private Nikse.SubtitleEdit.Controls.NikseLabel labelAddTime;
+ private System.Windows.Forms.ContextMenuStrip contextMenuStripParts;
+ private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem moveTopToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem moveBottomToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/src/ui/Forms/JoinSubtitles.cs b/src/ui/Forms/JoinSubtitles.cs
index 823bf5d55..79e3b69ae 100644
--- a/src/ui/Forms/JoinSubtitles.cs
+++ b/src/ui/Forms/JoinSubtitles.cs
@@ -30,6 +30,11 @@ namespace Nikse.SubtitleEdit.Forms
listViewParts.Columns[2].Text = LanguageSettings.Current.JoinSubtitles.EndTime;
listViewParts.Columns[3].Text = LanguageSettings.Current.JoinSubtitles.FileName;
+ moveUpToolStripMenuItem.Text = LanguageSettings.Current.DvdSubRip.MoveUp;
+ moveDownToolStripMenuItem.Text = LanguageSettings.Current.DvdSubRip.MoveDown;
+ moveTopToolStripMenuItem.Text = LanguageSettings.Current.MultipleReplace.MoveToTop;
+ moveBottomToolStripMenuItem.Text = LanguageSettings.Current.MultipleReplace.MoveToBottom;
+
buttonAddFile.Text = LanguageSettings.Current.DvdSubRip.Add;
buttonRemoveFile.Text = LanguageSettings.Current.DvdSubRip.Remove;
buttonClear.Text = LanguageSettings.Current.DvdSubRip.Clear;
@@ -388,6 +393,7 @@ namespace Nikse.SubtitleEdit.Forms
{
MessageBox.Show(sb.ToString());
}
+
JoinSubtitles_Resize(sender, e);
}
}
@@ -438,5 +444,203 @@ namespace Nikse.SubtitleEdit.Forms
labelAddTime.Enabled = radioButtonJoinAddTime.Checked;
SortAndLoad();
}
+
+ private void contextMenuStripParts_Opening(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked)
+ {
+ e.Cancel = true;
+ }
+ }
+
+ private void MoveUp(ListView listView)
+ {
+ if (listView.SelectedItems.Count != 1)
+ {
+ return;
+ }
+
+ var idx = listView.SelectedItems[0].Index;
+ if (idx == 0)
+ {
+ return;
+ }
+
+ var item = listView.SelectedItems[0];
+ listView.Items.RemoveAt(idx);
+ var style = _fileNamesToJoin[idx];
+ _fileNamesToJoin.RemoveAt(idx);
+ _fileNamesToJoin.Insert(idx - 1, style);
+
+ idx--;
+ listView.Items.Insert(idx, item);
+ UpdateSelectedIndices(listView, idx);
+ }
+
+ private void MoveDown(ListView listView)
+ {
+ if (listView.SelectedItems.Count != 1)
+ {
+ return;
+ }
+
+ var idx = listView.SelectedItems[0].Index;
+ if (idx >= listView.Items.Count - 1)
+ {
+ return;
+ }
+
+ var item = listView.SelectedItems[0];
+ listView.Items.RemoveAt(idx);
+ var style = _fileNamesToJoin[idx];
+ _fileNamesToJoin.RemoveAt(idx);
+ _fileNamesToJoin.Insert(idx + 1, style);
+
+ idx++;
+ listView.Items.Insert(idx, item);
+ UpdateSelectedIndices(listView, idx);
+ }
+
+ private void MoveToTop(ListView listView)
+ {
+ if (listView.SelectedItems.Count != 1)
+ {
+ return;
+ }
+
+ var idx = listView.SelectedItems[0].Index;
+ if (idx == 0)
+ {
+ return;
+ }
+
+ var item = listView.SelectedItems[0];
+ listView.Items.RemoveAt(idx);
+ var style = _fileNamesToJoin[idx];
+ _fileNamesToJoin.RemoveAt(idx);
+ _fileNamesToJoin.Insert(0, style);
+
+ idx = 0;
+ listView.Items.Insert(idx, item);
+ UpdateSelectedIndices(listView, idx);
+ }
+
+ private void MoveToBottom(ListView listView)
+ {
+ if (listView.SelectedItems.Count != 1)
+ {
+ return;
+ }
+
+ var idx = listView.SelectedItems[0].Index;
+ if (idx == listView.Items.Count - 1)
+ {
+ return;
+ }
+
+ var item = listView.SelectedItems[0];
+ listView.Items.RemoveAt(idx);
+ var style = _fileNamesToJoin[idx];
+ _fileNamesToJoin.RemoveAt(idx);
+ _fileNamesToJoin.Add(style);
+
+ listView.Items.Add(item);
+ UpdateSelectedIndices(listView);
+ }
+
+ private static void UpdateSelectedIndices(ListView listView, int startingIndex = -1, int numberOfSelectedItems = 1)
+ {
+ if (numberOfSelectedItems == 0)
+ {
+ return;
+ }
+
+ if (startingIndex == -1 || startingIndex >= listView.Items.Count)
+ {
+ startingIndex = listView.Items.Count - 1;
+ }
+
+ if (startingIndex - numberOfSelectedItems < -1)
+ {
+ return;
+ }
+
+ listView.SelectedItems.Clear();
+ for (var i = 0; i < numberOfSelectedItems; i++)
+ {
+ listView.Items[startingIndex - i].Selected = true;
+ listView.Items[startingIndex - i].EnsureVisible();
+ listView.Items[startingIndex - i].Focused = true;
+ }
+ }
+
+ private void moveUpToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked)
+ {
+ return;
+ }
+
+ MoveUp(listViewParts);
+ }
+
+ private void moveDownToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked)
+ {
+ return;
+ }
+
+ MoveDown(listViewParts);
+ }
+
+ private void moveTopToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked)
+ {
+ return;
+ }
+
+ MoveToTop(listViewParts);
+ }
+
+ private void moveBottomToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked)
+ {
+ return;
+ }
+
+ MoveToBottom(listViewParts);
+ }
+
+ private void listViewParts_ColumnClick(object sender, ColumnClickEventArgs e)
+ {
+ if (radioButtonJoinPlain.Checked || e.Column != 3)
+ {
+ return;
+ }
+
+ var lv = (ListView)sender;
+ if (!(lv.ListViewItemSorter is ListViewSorter sorter))
+ {
+ sorter = new ListViewSorter
+ {
+ ColumnNumber = e.Column,
+ };
+ lv.ListViewItemSorter = sorter;
+ }
+
+ if (e.Column == sorter.ColumnNumber)
+ {
+ sorter.Descending = !sorter.Descending; // inverse sort direction
+ }
+ else
+ {
+ sorter.ColumnNumber = e.Column;
+ }
+
+ lv.Sort();
+ }
}
}
diff --git a/src/ui/Forms/JoinSubtitles.resx b/src/ui/Forms/JoinSubtitles.resx
index 9bad2f599..55f72738c 100644
--- a/src/ui/Forms/JoinSubtitles.resx
+++ b/src/ui/Forms/JoinSubtitles.resx
@@ -117,6 +117,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 159, 22
+
17, 17
diff --git a/src/ui/Logic/ListViewSorter.cs b/src/ui/Logic/ListViewSorter.cs
index f9c2a8a92..c56b210f5 100644
--- a/src/ui/Logic/ListViewSorter.cs
+++ b/src/ui/Logic/ListViewSorter.cs
@@ -13,7 +13,7 @@ namespace Nikse.SubtitleEdit.Logic
public bool IsDisplayFileSize { get; set; }
public bool Descending { get; set; }
- private Regex _invariantNumber = new Regex(@"\d+\.{1,2}", RegexOptions.Compiled);
+ private readonly Regex _invariantNumber = new Regex(@"\d+\.{1,2}", RegexOptions.Compiled);
public int Compare(object o1, object o2)
{