Initial version

git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@5 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
niksedk 2010-10-12 11:15:08 +00:00
parent 2f1a0b6137
commit 0e5c9436a2
8 changed files with 2897 additions and 0 deletions

77
src/Controls/TimeUpDown.Designer.cs generated Normal file
View File

@ -0,0 +1,77 @@
namespace Nikse.SubtitleEdit.Controls
{
partial class TimeUpDown
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
this.SuspendLayout();
//
// maskedTextBox1
//
this.maskedTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.maskedTextBox1.InsertKeyMode = System.Windows.Forms.InsertKeyMode.Overwrite;
this.maskedTextBox1.Location = new System.Drawing.Point(4, 4);
this.maskedTextBox1.Mask = "00:00:00.000";
this.maskedTextBox1.Name = "maskedTextBox1";
this.maskedTextBox1.Size = new System.Drawing.Size(63, 13);
this.maskedTextBox1.TabIndex = 21;
this.maskedTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MaskedTextBox1KeyDown);
//
// numericUpDown1
//
this.numericUpDown1.Location = new System.Drawing.Point(2, 1);
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(84, 20);
this.numericUpDown1.TabIndex = 20;
this.numericUpDown1.TabStop = false;
//
// TimeUpDown
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.Controls.Add(this.maskedTextBox1);
this.Controls.Add(this.numericUpDown1);
this.Name = "TimeUpDown";
this.Size = new System.Drawing.Size(89, 24);
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MaskedTextBox maskedTextBox1;
private System.Windows.Forms.NumericUpDown numericUpDown1;
}
}

121
src/Controls/TimeUpDown.cs Normal file
View File

@ -0,0 +1,121 @@
using System;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Logic;
namespace Nikse.SubtitleEdit.Controls
{
public partial class TimeUpDown : UserControl
{
const int NumericUpDownValue = 50;
public EventHandler TimeCodeChanged;
public TimeUpDown()
{
InitializeComponent();
numericUpDown1.ValueChanged += NumericUpDownValueChanged;
numericUpDown1.Value = NumericUpDownValue;
}
void NumericUpDownValueChanged(object sender, EventArgs e)
{
double? millisecs = GetTotalMilliseconds();
if (millisecs.HasValue)
{
if (numericUpDown1.Value > NumericUpDownValue)
{
SetTotalMilliseconds(millisecs.Value + 100);
}
else if (numericUpDown1.Value < NumericUpDownValue)
{
if (millisecs.Value - 100 > 0)
SetTotalMilliseconds(millisecs.Value - 100);
else if (millisecs.Value > 0)
SetTotalMilliseconds(0);
}
if (TimeCodeChanged != null)
TimeCodeChanged.Invoke(this, e);
}
numericUpDown1.Value = NumericUpDownValue;
}
public MaskedTextBox MaskedTextBox
{
get
{
return maskedTextBox1;
}
}
public void SetTotalMilliseconds(double milliseconds)
{
TimeSpan ts = TimeSpan.FromMilliseconds(milliseconds);
maskedTextBox1.Text = new TimeCode(ts).ToString();
}
public double? GetTotalMilliseconds()
{
TimeCode tc = TimeCode;
if (tc != null)
return tc.TotalMilliseconds;
return null;
}
public TimeCode TimeCode
{
get
{
string startTime = maskedTextBox1.Text;
startTime.Replace(' ', '0');
if (startTime.EndsWith("."))
startTime += "000";
string[] times = startTime.Split(":,.".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
if (times.Length == 4)
{
int hours = 0;
if (Utilities.IsInteger(times[0]))
hours = int.Parse(times[0]);
int minutes = 0;
if (Utilities.IsInteger(times[1]))
minutes = int.Parse(times[1]);
int seconds = 0;
if (Utilities.IsInteger(times[2]))
seconds = int.Parse(times[2]);
int milliSeconds = 0;
if (Utilities.IsInteger(times[3]))
milliSeconds = int.Parse(times[3]);
return new TimeCode(hours, minutes, seconds, milliSeconds);
}
return null;
}
set
{
if (value != null)
maskedTextBox1.Text = value.ToString();
else
maskedTextBox1.Text = new TimeCode(TimeSpan.FromMilliseconds(0)).ToString();
}
}
private void MaskedTextBox1KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
numericUpDown1.UpButton();
e.SuppressKeyPress = true;
}
else if (e.KeyCode == Keys.Down)
{
numericUpDown1.DownButton();
e.SuppressKeyPress = true;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,800 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Logic.VideoPlayers;
namespace Nikse.SubtitleEdit.Controls
{
public sealed class VideoPlayerContainer : Panel
{
public event EventHandler OnButtonClicked;
public Panel PanelPlayer { get; private set; }
private VideoPlayer _videoPlayer;
public VideoPlayer VideoPlayer
{
get { return _videoPlayer; }
set { _videoPlayer = value; }
}
private bool _isMuted;
private double? _muteOldVolume;
private readonly System.ComponentModel.ComponentResourceManager _resources;
private const int ControlsHeight = 47;
private readonly Color _backgroundColor = Color.FromArgb(18, 18, 18);
private Panel _panelcontrols;
private string _totalPositionString;
private PictureBox _pictureBoxBackground;
private PictureBox _pictureBoxReverse;
private PictureBox _pictureBoxFastForward;
private PictureBox _pictureBoxPlay;
private PictureBox _pictureBoxPlayOver;
private PictureBox _pictureBoxPlayDown;
private PictureBox _pictureBoxPause = new PictureBox();
private PictureBox _pictureBoxPauseOver = new PictureBox();
private PictureBox _pictureBoxPauseDown = new PictureBox();
private PictureBox _pictureBoxStop = new PictureBox();
private PictureBox _pictureBoxStopOver = new PictureBox();
private PictureBox _pictureBoxStopDown = new PictureBox();
private PictureBox _pictureBoxMute = new PictureBox();
private PictureBox _pictureBoxMuteOver = new PictureBox();
private PictureBox _pictureBoxMuteDown = new PictureBox();
private PictureBox _pictureBoxProgressbarBackground = new PictureBox();
private PictureBox _pictureBoxProgressBar = new PictureBox();
private PictureBox _pictureBoxVolumeBarBackground = new PictureBox();
private PictureBox _pictureBoxVolumeBar = new PictureBox();
private Label _labelTimeCode = new Label();
public bool ShowStopButton
{
get
{
return _pictureBoxStop.Visible || _pictureBoxStopOver.Visible || _pictureBoxStopDown.Visible;
}
set
{
if (value)
{
_pictureBoxStop.Visible = true;
}
else
{
HideAllStopImages();
}
}
}
public VideoPlayerContainer()
{
_resources = new System.ComponentModel.ComponentResourceManager(typeof(VideoPlayerContainer));
BackColor = _backgroundColor;
Controls.Add(MakePlayerPanel());
Controls.Add(MakeControlsPanel());
HideAllPlayImages();
HideAllPauseImages();
_pictureBoxPlay.Visible = true;
HideAllStopImages();
_pictureBoxStop.Visible = true;
HideAllMuteImages();
_pictureBoxMute.Visible = true;
VideoPlayerContainerResize(this, null);
Resize += VideoPlayerContainerResize;
_pictureBoxProgressBar.Width = 0;
PanelPlayer.MouseDown += PanelPlayer_MouseDown;
}
void PanelPlayer_MouseDown(object sender, MouseEventArgs e)
{
TooglePlayPause();
}
public void InitializeVolume(double defaultVolume)
{
int maxVolume = _pictureBoxVolumeBarBackground.Width - 18;
_pictureBoxVolumeBar.Width = (int)(maxVolume * defaultVolume / 100.0);
}
private Control MakePlayerPanel()
{
PanelPlayer = new Panel { BackColor = _backgroundColor, Left = 0, Top = 0 };
return PanelPlayer;
}
private Control MakeControlsPanel()
{
_panelcontrols = new Panel {Left = 0, Height = ControlsHeight};
_pictureBoxBackground = new PictureBox
{
Image = ((Image) (_resources.GetObject("pictureBoxBar.Image"))),
Location = new Point(0, 0),
Name = "_pictureBoxBackground",
Size = new Size(200, 45),
SizeMode = PictureBoxSizeMode.StretchImage,
TabStop = false
};
_panelcontrols.Controls.Add(_pictureBoxBackground);
_pictureBoxPlay = new PictureBox
{
Image = ((Image) (_resources.GetObject("pictureBoxPlay.Image"))),
Location = new Point(22, 126 - 113),
Name = "_pictureBoxPlay",
Size = new Size(29, 29),
SizeMode = PictureBoxSizeMode.AutoSize,
TabStop = false
};
_pictureBoxPlay.MouseEnter += PictureBoxPlayMouseEnter;
_panelcontrols.Controls.Add(_pictureBoxPlay);
_pictureBoxPlayDown = new PictureBox
{
Image = ((Image) (_resources.GetObject("pictureBoxPlayDown.Image"))),
Location = new Point(22, 127 - 113),
Name = "_pictureBoxPlayDown",
Size = new Size(29, 29),
SizeMode = PictureBoxSizeMode.AutoSize,
TabStop = false
};
_panelcontrols.Controls.Add(_pictureBoxPlayDown);
_pictureBoxPlayOver = new PictureBox
{
Image = ((Image) (_resources.GetObject("pictureBoxPlayOver.Image"))),
Location = new Point(23, 126 - 113),
Name = "_pictureBoxPlayOver",
Size = new Size(29, 29),
SizeMode = PictureBoxSizeMode.AutoSize,
TabStop = false
};
_pictureBoxPlayOver.MouseLeave += PictureBoxPlayOverMouseLeave;
_pictureBoxPlayOver.MouseDown += PictureBoxPlayOverMouseDown;
_pictureBoxPlayOver.MouseUp += PictureBoxPlayOverMouseUp;
_panelcontrols.Controls.Add(_pictureBoxPlayOver);
_pictureBoxPause.Image = ((Image)(_resources.GetObject("pictureBoxPause.Image")));
_pictureBoxPause.Location = new Point(23, 126 - 113);
_pictureBoxPause.Name = "_pictureBoxPause";
_pictureBoxPause.Size = new Size(29, 29);
_pictureBoxPause.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxPause.TabStop = false;
_pictureBoxPause.MouseEnter += PictureBoxPauseMouseEnter;
_panelcontrols.Controls.Add(_pictureBoxPause);
_pictureBoxPauseDown.Image = ((Image)(_resources.GetObject("pictureBoxPauseDown.Image")));
_pictureBoxPauseDown.Location = new Point(22, 127 - 113);
_pictureBoxPauseDown.Name = "_pictureBoxPauseDown";
_pictureBoxPauseDown.Size = new Size(29, 29);
_pictureBoxPauseDown.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxPauseDown.TabStop = false;
_panelcontrols.Controls.Add(_pictureBoxPauseDown);
_pictureBoxPauseOver.Image = ((Image)(_resources.GetObject("pictureBoxPauseOver.Image")));
_pictureBoxPauseOver.Location = new Point(22, 127 - 113);
_pictureBoxPauseOver.Name = "_pictureBoxPauseOver";
_pictureBoxPauseOver.Size = new Size(29, 29);
_pictureBoxPauseOver.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxPauseOver.TabStop = false;
_pictureBoxPauseOver.MouseLeave += PictureBoxPauseOverMouseLeave;
_pictureBoxPauseOver.MouseDown += PictureBoxPauseOverMouseDown;
_pictureBoxPauseOver.MouseUp += PictureBoxPauseOverMouseUp;
_panelcontrols.Controls.Add(_pictureBoxPauseOver);
_pictureBoxStop.Image = ((Image)(_resources.GetObject("pictureBoxStop.Image")));
_pictureBoxStop.Location = new Point(60, 130 - 113);
_pictureBoxStop.Name = "_pictureBoxStop";
_pictureBoxStop.Size = new Size(20, 20);
_pictureBoxStop.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxStop.TabStop = false;
_pictureBoxStop.MouseEnter += PictureBoxStopMouseEnter;
_panelcontrols.Controls.Add(_pictureBoxStop);
_pictureBoxStopDown.Image = ((Image)(_resources.GetObject("pictureBoxStopDown.Image")));
_pictureBoxStopDown.Location = new Point(60, 130 - 113);
_pictureBoxStopDown.Name = "_pictureBoxStopDown";
_pictureBoxStopDown.Size = new Size(20, 20);
_pictureBoxStopDown.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxStopDown.TabStop = false;
_panelcontrols.Controls.Add(_pictureBoxStopDown);
_pictureBoxStopOver.Image = ((Image)(_resources.GetObject("pictureBoxStopOver.Image")));
_pictureBoxStopOver.Location = new Point(60, 130 - 113);
_pictureBoxStopOver.Name = "_pictureBoxStopOver";
_pictureBoxStopOver.Size = new Size(20, 20);
_pictureBoxStopOver.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxStopOver.TabStop = false;
_pictureBoxStopOver.MouseLeave += PictureBoxStopOverMouseLeave;
_pictureBoxStopOver.MouseDown += PictureBoxStopOverMouseDown;
_pictureBoxStopOver.MouseUp += PictureBoxStopOverMouseUp;
_panelcontrols.Controls.Add(_pictureBoxStopOver);
_pictureBoxProgressbarBackground.Anchor = AnchorStyles.Top | AnchorStyles.Left;
_pictureBoxProgressbarBackground.BackColor = Color.Transparent;
_pictureBoxProgressbarBackground.Image = (Image)_resources.GetObject("pictureBoxProgressbarBackground.Image");
_pictureBoxProgressbarBackground.Location = new Point(43, 114 - 113);
_pictureBoxProgressbarBackground.Margin = new Padding(0);
_pictureBoxProgressbarBackground.Name = "_pictureBoxProgressbarBackground";
_pictureBoxProgressbarBackground.Size = new Size(531, 12);
_pictureBoxProgressbarBackground.SizeMode = PictureBoxSizeMode.StretchImage;
_pictureBoxProgressbarBackground.TabStop = false;
_pictureBoxProgressbarBackground.MouseDown += PictureBoxProgressbarBackgroundMouseDown;
_panelcontrols.Controls.Add(_pictureBoxProgressbarBackground);
_pictureBoxProgressBar.Image = (Image)(_resources.GetObject("pictureBoxProgressBar.Image"));
_pictureBoxProgressBar.Location = new Point(47, 118 - 113);
_pictureBoxProgressBar.Name = "_pictureBoxProgressBar";
_pictureBoxProgressBar.Size = new Size(318, 4);
_pictureBoxProgressBar.SizeMode = PictureBoxSizeMode.StretchImage;
_pictureBoxProgressBar.TabStop = false;
_pictureBoxProgressBar.MouseDown += PictureBoxProgressBarMouseDown;
_panelcontrols.Controls.Add(_pictureBoxProgressBar);
_pictureBoxProgressBar.BringToFront();
_pictureBoxMute.Image = ((Image)(_resources.GetObject("pictureBoxMute.Image")));
_pictureBoxMute.Location = new Point(91, 131 - 113);
_pictureBoxMute.Name = "_pictureBoxMute";
_pictureBoxMute.Size = new Size(19, 19);
_pictureBoxMute.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxMute.TabStop = false;
_pictureBoxMute.MouseEnter += PictureBoxMuteMouseEnter;
_panelcontrols.Controls.Add(_pictureBoxMute);
_pictureBoxMuteDown.Image = ((Image)(_resources.GetObject("pictureBoxMuteDown.Image")));
_pictureBoxMuteDown.Location = new Point(91, 131 - 113);
_pictureBoxMuteDown.Name = "_pictureBoxMuteDown";
_pictureBoxMuteDown.Size = new Size(19, 19);
_pictureBoxMuteDown.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxMuteDown.TabStop = false;
_pictureBoxMuteDown.Click += PictureBoxMuteDownClick;
_panelcontrols.Controls.Add(_pictureBoxMuteDown);
_pictureBoxMuteOver.Image = ((Image)(_resources.GetObject("pictureBoxMuteOver.Image")));
_pictureBoxMuteOver.Location = new Point(91, 131 - 113);
_pictureBoxMuteOver.Name = "_pictureBoxMuteOver";
_pictureBoxMuteOver.Size = new Size(19, 19);
_pictureBoxMuteOver.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxMuteOver.TabStop = false;
_pictureBoxMuteOver.MouseLeave += PictureBoxMuteOverMouseLeave;
_pictureBoxMuteOver.MouseDown += PictureBoxMuteOverMouseDown;
_pictureBoxMuteOver.MouseUp += PictureBoxMuteOverMouseUp;
_panelcontrols.Controls.Add(_pictureBoxMuteOver);
_pictureBoxVolumeBarBackground.Image = ((Image)(_resources.GetObject("pictureBoxVolumeBarBackground.Image")));
_pictureBoxVolumeBarBackground.Location = new Point(111, 135 - 113);
_pictureBoxVolumeBarBackground.Name = "_pictureBoxVolumeBarBackground";
_pictureBoxVolumeBarBackground.Size = new Size(82, 13);
_pictureBoxVolumeBarBackground.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxVolumeBarBackground.TabStop = false;
_pictureBoxVolumeBarBackground.MouseDown += PictureBoxVolumeBarBackgroundMouseDown;
_panelcontrols.Controls.Add(_pictureBoxVolumeBarBackground);
_pictureBoxVolumeBar.Image = ((Image)(_resources.GetObject("pictureBoxVolumeBar.Image")));
_pictureBoxVolumeBar.Location = new Point(120, 139 - 113);
_pictureBoxVolumeBar.Name = "_pictureBoxVolumeBar";
_pictureBoxVolumeBar.Size = new Size(48, 4);
_pictureBoxVolumeBar.SizeMode = PictureBoxSizeMode.StretchImage;
_pictureBoxVolumeBar.TabStop = false;
_pictureBoxVolumeBar.MouseDown += PictureBoxVolumeBarMouseDown;
_panelcontrols.Controls.Add(_pictureBoxVolumeBar);
_pictureBoxVolumeBar.BringToFront();
_pictureBoxReverse = new PictureBox();
_pictureBoxReverse.Image = ((Image)(_resources.GetObject("pictureBoxReverse.Image")));
_pictureBoxReverse.Location = new Point(28, 3);
_pictureBoxReverse.Name = "_pictureBoxReverse";
_pictureBoxReverse.Size = new Size(16, 8);
_pictureBoxReverse.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxReverse.TabStop = false;
_panelcontrols.Controls.Add(_pictureBoxReverse);
_pictureBoxFastForward = new PictureBox();
_pictureBoxFastForward.Image = ((Image)(_resources.GetObject("pictureBoxFastForward.Image")));
_pictureBoxFastForward.Location = new Point(570, 1);
_pictureBoxFastForward.Name = "_pictureBoxFastForward";
_pictureBoxFastForward.Size = new Size(18, 13);
_pictureBoxFastForward.SizeMode = PictureBoxSizeMode.AutoSize;
_pictureBoxFastForward.TabStop = false;
_panelcontrols.Controls.Add(_pictureBoxFastForward);
_labelTimeCode.Location = new Point(280, 29);
_labelTimeCode.ForeColor = Color.FromArgb(100, 200, 200);
_labelTimeCode.Font = new System.Drawing.Font(_labelTimeCode.Font.FontFamily, 7);
_labelTimeCode.AutoSize = true;
_panelcontrols.Controls.Add(_labelTimeCode);
_pictureBoxBackground.SendToBack();
_pictureBoxFastForward.BringToFront();
_pictureBoxPlay.BringToFront();
_panelcontrols.BackColor = _backgroundColor;
_labelTimeCode.BringToFront();
return _panelcontrols;
}
public void VideoPlayerContainerResize(object sender, EventArgs e)
{
//_pictureBoxPlay.Left = 22;
//_pictureBoxPlay.Top = 126 - 113;
//_pictureBoxPlayDown.Location = new Point(22, 127 - 113);
//_pictureBoxPlayOver.Location = new Point(23, 126 - 113);
//_pictureBoxPause.Location = new Point(23, 126 - 113);
//_pictureBoxPauseDown.Location = new Point(22, 127 - 113);
//_pictureBoxPauseOver.Location = new Point(22, 127 - 113);
//_pictureBoxStop.Location = new Point(60, 130 - 113);
//_pictureBoxStopDown.Location = new Point(60, 130 - 113);
//_pictureBoxStopOver.Location = new Point(60, 130 - 113);
//_pictureBoxMute.Location = new Point(91, 131 - 113);
//_pictureBoxMuteDown.Location = new Point(91, 131 - 113);
//_pictureBoxMuteOver.Location = new Point(91, 131 - 113);
//_pictureBoxProgressBar.Location = new Point(47, 118 - 113);
//_pictureBoxVolumeBarBackground.Location = new Point(111, 135 - 113);
//_pictureBoxVolumeBar.Location = new Point(120, 139 - 113);
//_pictureBoxProgressbarBackground.Location = new Point(43, 114 - 113);
PanelPlayer.Height = Height - ControlsHeight;
PanelPlayer.Width = Width;
_panelcontrols.Top = Height - ControlsHeight;
_panelcontrols.Width = Width;
_pictureBoxBackground.Width = Width;
_pictureBoxProgressbarBackground.Width = Width - (_pictureBoxProgressbarBackground.Left * 2);
_pictureBoxFastForward.Left = Width - 49;
_labelTimeCode.Left = Width - 170;
}
#region PlayPauseButtons
private void HideAllPlayImages()
{
_pictureBoxPlayOver.Visible = false;
_pictureBoxPlayDown.Visible = false;
_pictureBoxPlay.Visible = false;
}
private void PictureBoxPlayMouseEnter(object sender, EventArgs e)
{
if (_pictureBoxPlay.Visible)
{
HideAllPlayImages();
_pictureBoxPlayOver.Visible = true;
}
}
private void PictureBoxPlayOverMouseLeave(object sender, EventArgs e)
{
if (_pictureBoxPlayOver.Visible)
{
HideAllPlayImages();
_pictureBoxPlay.Visible = true;
}
}
private void PictureBoxPlayOverMouseDown(object sender, MouseEventArgs e)
{
HideAllPlayImages();
_pictureBoxPlayDown.Visible = true;
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxPlayOverMouseUp(object sender, MouseEventArgs e)
{
HideAllPlayImages();
_pictureBoxPause.Visible = true;
Play();
}
private void HideAllPauseImages()
{
_pictureBoxPauseOver.Visible = false;
_pictureBoxPauseDown.Visible = false;
_pictureBoxPause.Visible = false;
}
private void PictureBoxPauseMouseEnter(object sender, EventArgs e)
{
if (_pictureBoxPause.Visible)
{
HideAllPauseImages();
_pictureBoxPauseOver.Visible = true;
}
}
private void PictureBoxPauseOverMouseLeave(object sender, EventArgs e)
{
if (_pictureBoxPauseOver.Visible)
{
HideAllPauseImages();
_pictureBoxPause.Visible = true;
}
}
private void PictureBoxPauseOverMouseDown(object sender, MouseEventArgs e)
{
if (_pictureBoxPauseOver.Visible)
{
HideAllPauseImages();
_pictureBoxPauseDown.Visible = true;
}
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxPauseOverMouseUp(object sender, MouseEventArgs e)
{
HideAllPauseImages();
_pictureBoxPlay.Visible = true;
Pause();
}
#endregion
#region StopButtons
private void HideAllStopImages()
{
_pictureBoxStopOver.Visible = false;
_pictureBoxStopDown.Visible = false;
_pictureBoxStop.Visible = false;
}
private void PictureBoxStopMouseEnter(object sender, EventArgs e)
{
HideAllStopImages();
_pictureBoxStopOver.Visible = true;
}
private void PictureBoxStopOverMouseLeave(object sender, EventArgs e)
{
if (_pictureBoxStopOver.Visible)
{
HideAllStopImages();
_pictureBoxStop.Visible = true;
}
}
private void PictureBoxStopOverMouseDown(object sender, MouseEventArgs e)
{
if (_pictureBoxStopOver.Visible)
{
HideAllStopImages();
_pictureBoxStopDown.Visible = true;
}
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxStopOverMouseUp(object sender, MouseEventArgs e)
{
HideAllStopImages();
_pictureBoxStop.Visible = true;
Stop();
}
#endregion
#region Mute buttons
private void HideAllMuteImages()
{
_pictureBoxMuteOver.Visible = false;
_pictureBoxMuteDown.Visible = false;
_pictureBoxMute.Visible = false;
}
private void PictureBoxMuteMouseEnter(object sender, EventArgs e)
{
HideAllMuteImages();
if (Mute)
_pictureBoxMuteDown.Visible = true;
else
_pictureBoxMuteOver.Visible = true;
}
private void PictureBoxMuteOverMouseLeave(object sender, EventArgs e)
{
if (_pictureBoxMuteOver.Visible)
{
HideAllMuteImages();
_pictureBoxMute.Visible = true;
}
}
private void PictureBoxMuteOverMouseDown(object sender, MouseEventArgs e)
{
if (_pictureBoxMuteOver.Visible)
{
HideAllMuteImages();
_pictureBoxMuteDown.Visible = true;
}
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxMuteOverMouseUp(object sender, MouseEventArgs e)
{
HideAllMuteImages();
Mute = true;
_pictureBoxMuteDown.Visible = true;
}
private void PictureBoxMuteDownClick(object sender, EventArgs e)
{
Mute = false;
HideAllMuteImages();
_pictureBoxMute.Visible = true;
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
#endregion
#region Progress bars
private void SetProgressBarPosition(int mouseX)
{
int max = _pictureBoxProgressbarBackground.Width - 9;
if (mouseX > max)
mouseX = max;
double percent = (mouseX * 100.0) / max;
_pictureBoxProgressBar.Width = (int)(max * percent / 100.0);
double pos = percent * Duration / 100;
CurrentPosition = pos;
}
private void PictureBoxProgressbarBackgroundMouseDown(object sender, MouseEventArgs e)
{
SetProgressBarPosition(e.X - 4);
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxProgressBarMouseDown(object sender, MouseEventArgs e)
{
SetProgressBarPosition(e.X + 2);
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
public void RefreshProgressBar()
{
if (VideoPlayer == null)
{
_pictureBoxProgressBar.Width = 0;
}
else
{
int max = _pictureBoxProgressbarBackground.Width - 9;
double percent = (VideoPlayer.CurrentPosition * 100.0) / VideoPlayer.Duration;
_pictureBoxProgressBar.Width = (int)(max * percent / 100.0);
if (VideoPlayer.Duration == 0)
return;
if (_totalPositionString == null)
{
var sp = TimeSpan.FromSeconds(Duration);
_totalPositionString = string.Format(" / {0:00}:{1:00}:{2:00},{3:000}", sp.Hours, sp.Minutes, sp.Seconds, sp.Milliseconds);
}
var pos = CurrentPosition;
if (pos > 1000000)
{
pos = 0;
}
TimeSpan span = TimeSpan.FromSeconds(pos);
string displayTime = string.Format("{0:00}:{1:00}:{2:00},{3:000}", span.Hours, span.Minutes, span.Seconds, span.Milliseconds);
_labelTimeCode.Text = displayTime + _totalPositionString;
}
}
private void SetVolumeBarPosition(int mouseX)
{
int max = _pictureBoxVolumeBarBackground.Width - 18;
if (mouseX > max)
mouseX = max;
double percent = (mouseX * 100.0) / max;
_pictureBoxVolumeBar.Width = (int)(max * percent / 100.0);
if (_videoPlayer != null)
_videoPlayer.Volume = (int)percent;
}
private void PictureBoxVolumeBarBackgroundMouseDown(object sender, MouseEventArgs e)
{
SetVolumeBarPosition(e.X - 6);
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void PictureBoxVolumeBarMouseDown(object sender, MouseEventArgs e)
{
SetVolumeBarPosition(e.X + 2);
if (OnButtonClicked != null)
OnButtonClicked.Invoke(sender, e);
}
private void RefreshVolumeBar()
{
if (VideoPlayer == null)
{
_pictureBoxVolumeBar.Width = 0;
}
else
{
int max = _pictureBoxVolumeBarBackground.Width - 18;
_pictureBoxVolumeBar.Width = (int)(max * Volume / 100.0);
}
}
#endregion
#region VideoPlayer functions
public void Play()
{
if (VideoPlayer != null)
{
VideoPlayer.Play();
HideAllPlayImages();
_pictureBoxPause.Visible = true;
RefreshProgressBar();
}
if (OnButtonClicked != null)
OnButtonClicked.Invoke(null, null);
}
public void Stop()
{
if (VideoPlayer != null)
{
VideoPlayer.Pause();
CurrentPosition = 0;
HideAllPauseImages();
_pictureBoxPlay.Visible = true;
RefreshProgressBar();
}
if (OnButtonClicked != null)
OnButtonClicked.Invoke(null, null);
}
public void Pause()
{
if (VideoPlayer != null)
{
VideoPlayer.Pause();
HideAllPauseImages();
_pictureBoxPlay.Visible = true;
RefreshProgressBar();
}
}
public void TooglePlayPause()
{
if (VideoPlayer != null)
{
if (VideoPlayer.IsPaused)
Play();
else
Pause();
}
}
public bool IsPaused
{
get
{
if (VideoPlayer != null)
{
return VideoPlayer.IsPaused;
}
return false;
}
}
public double Volume
{
get
{
if (VideoPlayer != null)
return VideoPlayer.Volume;
return 0;
}
set
{
if (VideoPlayer != null)
{
if (value > 0)
_muteOldVolume = null;
if (value > 100)
VideoPlayer.Volume = 100;
else if (value < 0)
VideoPlayer.Volume = 0;
else
VideoPlayer.Volume = (int)value;
RefreshVolumeBar();
}
}
}
/// <summary>
/// Current position in seconds
/// </summary>
public double CurrentPosition
{
get
{
if (VideoPlayer != null)
return VideoPlayer.CurrentPosition;
return 0;
}
set
{
if (VideoPlayer != null)
{
VideoPlayer.CurrentPosition = value;
RefreshProgressBar();
}
}
}
/// <summary>
/// Total duration in seconds
/// </summary>
public double Duration
{
get
{
if (VideoPlayer != null)
return VideoPlayer.Duration;
return 0;
}
}
private bool Mute
{
get
{
if (VideoPlayer != null)
{
return _isMuted;
}
return false;
}
set
{
if (VideoPlayer != null)
{
if (value == false && _muteOldVolume != null)
{
Volume = _muteOldVolume.Value;
}
else if (value)
{
_muteOldVolume = Volume;
Volume = 0;
}
_isMuted = value;
}
}
}
#endregion
}
}

View File

@ -0,0 +1,620 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBoxBar.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAABXgAAAAtCAMAAAAjrvPmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OERER
EhISEhITEhIWEhIXERIcERIdFBorFRssJioxJzBMKDFNPENSPURTPUVUPkZVNUBmNkFnQEdXQUlZQkpb
Q0tdRU1eRk5gR09iSFFkSlNmS1RnTVVpTldrT1htUVpvUltwU1xzVl93WmN8XWaAX2mDXmmFYGqFYWuG
dXyadn2bi5KnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6HRMPQAAAalJREFUeF7t1jVu
RVEQRME2MzMze//rczL+S+ioTvLCkUpXrZdfESBAgEBVIB8iQIAAgapAvqZPESBAgEBFIO8iQIAAgapA
3kSAAAECVYG8igABAgSqAnkRAQIECFQF8iwCBAgQqArkSQQIECBQFcijCBAgQKAqkAcRIECAQFUg9yJA
gACBqkDuRIAAAQJVgdyKAAECBKoCuREBAgQIVAVyLQIECBCoCuRKBAgQIFAVyKUIECBAoCqQCxEgQIBA
VSDnIkCAAIGqQM5EgAABAlWBnIoAAQIEqgI5EQECBAhUBXIoAgQIEKgK5EAECBAgUBXInggQIECgKrD4
490XAQIECFQEsi0CBAgQqApEBAgQIFAWWJ6WRIAAAQIVgfwPry8BAgQIdAQMb8fZFQIECCwEDK/HQIAA
gbKA4S2DO0eAAAHD6w0QIECgLGB4y+DOESBAwPB6AwQIECgLGN4yuHMECBDIyoSCAAECBDoCWZtWRYAA
AQIVgWxM6yJAgACBikC2pk0RIECAQEUgu9OOCBAgQKAikOPpSAQIECBQEcjP9C0CBAgQqAj8AYNKjD+4
WHt6AAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxFastForward.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABIAAAANCAMAAACTkM4rAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFMDQ+Rk5g
SVFnSlJnS1RnSlJoS1NrS1RpTVVpTFRqTVVrTVZqTVZrTVVtTlZsT1htT1hvUFluUVpuUVpvUFhwUFlx
UltwUVpxU1xzVF11Vl93Vl94WF90WWB0XGN3WGF6WGJ5WWJ7WmN8W2R+XGR/XWZ/XWaAX2iBXmiCX2mD
XmmFYGiCYWuGb3aMcHeMdXyPc3qQdn2QgIeagYiYgomZgIibhYych46fkpqrl52tnKGwAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk2TBkgAAAIRJREFUGFdlxtsW
gUAYhuHPEGIYGZJQqVD222a4/wvzM2t1Ms/Bu17sLThaUBpFnRLFZkuy6yGn7HJ6yCwli8/7HFNO8ToF
kpBMtdavCeU+D9GYBWSglLq1KZdRAM//catnxJzqETHhwx9L0ls22dBdUTwJ8cedDjcRAtzo1+HoWtCy
fAFcIBizNgYeHAAAAABJRU5ErkJggg==
</value>
</data>
<data name="pictureBoxMute.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCwsW
DAwRDw8TDQ0UDQ0VDg4UDg4VERESEBATEhISFhcgGxskGxwhHBwjHyAlICAoIyMtICMuICQuJicxJygy
JioxKis2Kyw1LzA6MTI8NDU+NjpGNDtMNjxNNz5OODlBOTpDOT9POj9ROUBPOEBQOEBRO0JSPENSPENT
PERTPURUPURVPkZVPkZWP0ZXREZPQEZXQEhYQUlZQUlaQUlbQkpbQ0tdRExaRUxcRU1eR09dSktUSkxV
SExdSU1eSU1fTlJeU1VdTFBhUFdnUlhmV1lkU1loWWBuX2RxY2ZvYGRzZGd2Yml2ZmhwZ2pycHN7c3V+
bHGAcnWBcnaDcneGgoWOgISPg4aPgYaUi46Yio+Zio+ajJCZlpmilZmkmJylm56nmZ6onqGqoKOsoKSs
oaWyp6qyqa23sbW9srW+tbnBuLzDvb/Hv8HGvsPLwcPJwMPLw8XKwcbNw8fPw8jPx8zTy9DXz9HVzNHY
zdLZz9Pd0NXd0tfe09jf1Nng19zj3d7i3OHo3eLp4ODk4uPm5ebp6urt6+zu5uvz7/T78PHy8/P09fX2
8vX48PX8+vz//f39/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgqUuWQAAARJJREFUKFNjsMIE
DOaYgMEMDExBhIkJhMNgDAL6LvrGxpa+HnpGIB6DIRBoh08M0dFxTuwpctcBchl0dXW1XXsn5alZd0fZ
V3R4aurqMmhrqasWTJrULmvo3dpo19Jmoa3NoKGUkTUBCJRjcp37Cn0mxKtoMGjLdfWDQGhQf2Rav0Nn
tbw2g5hQUzMIRMs0JwU3O+bXCIsxMDDV1oGAk02dV1idRFkmEwMDF3NEbD0QcPslS1WlGtQHMnMxcHGy
MCbU15ey8ynmZItnF/NwAsW4ONlEK+vimPnL/EXTS6TZuEBiXBxsbg22nMwCAeUpImycEDGgSkE2Dg5e
BUlWkBBEjIuTE8jmAJIcIB5EDBVgEwMAxe1P5C1jRZkAAAAASUVORK5CYII=
</value>
</data>
<data name="pictureBoxMuteDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFExMVDBIt
DhQuDxk3DRs9FhouHB8mEBs1FxszEBo4ERw6Fx8/GB45DyA8GiIlFCI7GSA3HSI3GiA7HSI5JiwvIic7
Ji48Dh9CCSBGDyBDDyFEDyJFDyRGCyRMDiZIDCZODyhJDChPDytNBi1dCilRDCpSDy5RDC9YDDNfEiVB
EiZCFyBAFSJHEyZQFjFfBzRmBzhsBzltCzhnDDtqCDxwKDBKLzZLLjVMLzVOITZXLzVQLzVTLjZXLjdc
LzphLztiLztjLzxjMDphMD1kCUB0CUB2DUBxCkh/FUF4OEJYPUdfPkhdPUtiNEd1QkpaRU1dQ09mSU1g
TFlxTFtwV1xsV11vUmB0VmV2WGJzW2R7Wmh6XGp5XGp6YnB/DEyBDVGHEEiGE1mOE1qPEFCQEVmaF2GT
FmGfFmKgG2ymG2ynInatKH2yZXeIZ3mFbnaIa3yJbniKcHeHdXmDeXyGb4CEcYGMcIKOd4iWeYiUeouV
eIqXe4yWmz0ashwMpDAUvDwuvEE0vEM2s1A4slU/q2NIwQUCxwcHwgsIzgAF2QAIwDwy1CEl1Cov3ycu
1y0x2Cow4AYR4TM54zY/3XVz3Xd26GZryoV1gI2XhIiWhYqXgY+YiI+eg5GahJGfh5adhJafiJaejZGb
jZGfkZSdjpWhiZiljZqgk5qlmJ2qmZ+tkqCmlaCmk6GpmaaumaavnqaunaywroaCq4qGqIyHqI2Ip6+2
prC0p7G1rrm/sbrFtr7KtMDEtcHFucTHu8TJzZGY0YuT0Zedw8jQyc7VzNDV0NXd0tfe09jf1Nng19zj
3OHo3eLp7crG8MTD9MbH4+jv6ezw8PX89vf4+vz//vz8/f3+/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc6SIIgAAAV5JREFUKFNj8GPj
E0EGfGx+DGIlu/cig90lYgzRe7Zv2w5CELBt+55ohtgNq1atWrZ6GZCEgA2xDDGr5i2YtfXq+jkLIGDe
qhiG8PmVFdMvXTtSWl29Zse+HWsq54czhJXn5x6+fPlCbNm6g5MmTDq4tiqMIThn566LQBA1d39n79SJ
nQeWBjMEeJ86DQKFS3q6O85d6etfHsDgKXrsOAjMXNg++Wzr2Sltiz0ZzFiPnwCBkKKGxitnauu7is0Y
zDlmLAKJCfhvqmue1lS3MdCcwYKHiXHF8eOH2PkjtrTUtGwOFbJgsOLmZDY9enIlr5amT8HsPC8ubSsG
ax1xSZbI80FyakoKcjLSUuI61gw2urLyshKWKkZuxhrqqorysro2DDZ6yvoGJi5xialJ8e6uhvrKejYM
gr4eCckpaRlZ2VmZ6SnJCR6+ggwMwrZOdvYOjs7Ozo4O9nZOtsIMAJnRonErDmY9AAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxMuteOver.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAMAAABFjsb+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFERIUCAop
CQ03DR9HDxpZDiJNDyxeEylPGytKHStLHS1MGy1VHS9XFjVfHjBYEi5gHytmETFmEjNqEzVqHTRlHTVm
Ezl2Fj1wFDx6Fj55HT14JzRRITZZKDZTLzlULTteNT9YICpmICtoKj5kLD9lF0F1F0R9HUhzH0p0H016
NUFdJkNqKkNtKkpwLE53NUdtPU1sO1F+RU1eR1FtTVRsT1huSVlzS1t1TlhwV2B1Fy+BFy+CE0SNE0WO
HkSKGEmJGUyJGU2PIUCJIEGMJEOJJkSIJESPK0qPLl6DOVqCN1abJ1ekKWSNLGeOLGufLWyYMHCdM3ab
KmynLW+jKGmpKGmqKm6pN3ykM3KzRWeMT2WFWmuKRmenS2yoQGi5UG+qVXKsW3mxX32xZm6CaXSJbHeI
aXiLaXiScXiLcXuJcXyQc3yRPIWmPoqrQpGtd4GUdISSdIWffIaTfoeXfIuYfY+bbom3Vo/Ie5TAfZbB
g4uehIubhY2fgZCcgJOfgJSfiZOfgZWgiZGhjZSkiJijjp6omZ+ukqKrk6Wulaeul6GymaGwn6a0m6mx
mquznKy0na61oKi2oK21oqu8obK5orO6p7C+prS6p7W7qLe9rbS9qri+rbi/rLXBr7rBr73DsbfCsL/E
tL7Etb/FtrzIuL/Kiszfjc/djdDektHdlNLbltXenNXdntjfg8LhiMvgotnescDFvsTOvcbQwsnPxMnO
wcfRw8rTxMrTx83Vyc7XyNHVyNHWy9DXydLWytPXy9LbzdLa0tbb0dbe09jfyN700NXg1Nng19zj29/i
3N7h3N/j3OHo3eLp5Obq5ujr6Ort5+z07O3w7+/x7u/y7/T78PHy8fP09fb38PX89Pb69/j5+Pj5+vz/
/v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYxRxBgAAAW1JREFUKFNjMDIs
q6xAgMoyQyMGw6PXLiODa0cNGZJO7du/f/8eIN63ezeIPJXEkLh14caNs+fM3jh/xqJ5M+dvXLg1kSFh
0ZSpfYvvzZnQ37vl9slJ/VMWJTDET+9ob79z71BL641ZRaev97ZOj2eI7awrPXTv3pWCkoYL5zLPX6rt
jGWIqd+8/S4QpE3blXprb/HduY0xDF5mV2+CQH7WzZrJNy0uHjP3YnCXPnMWBJoUzrZlnDXZdFjWncGV
8/ARELA0PZJcfURu5wIuVwYXnqrm40DAkdKjdXCi8fFsPhcGJxFW5u7jx3ewyxgsXSK/ZBu3qBODk5Qg
v/LBI1282rvSVaZt12eTcmJwtpOQFI4+EaWuoVt4YLKOkJidM4Obt62jg6qepo+vR6SnuJq9jbcbg3V5
RGhYcEB4bl5OoL9fUEhEuRUDU9y69ctWrFy9dsOaVSuXL1u/Lo6JgYGRRUlAQBECBASUWBgZAFBhr6gt
gaHsAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxPause.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
peH+1vvyAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxPauseDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP
DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm
GyMtHSc6Jy00BABGAABPAgRLAgVMBABIBQBOBwdNCQhPAgBRBQBRBQJSAQJbAAhWAA5XChZeGB9dAwdj
Ag5lABViABZuAB9oABpzFhxjFixYHSZfHzRFACVvACN3ACtxADV6GTF0Jy9MIjpJJj9KKDBNKDdLKzlD
KzlEKDlGKjtFKDtGLTtHLD1JMT9MIy1pJS1zMjx3KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS
NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsK1d9O0J2NVVmPlJlO2d4QUhYQUpaQ0tdQ0xeRElY
R0xaRU1eRU5gR09iREt5R1FjRVJkQVRqQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtTlN9WF5tR2V8V2Bv
XmZzAC2AADWFAT6NAESIAkqUAFGeA1uoCWGoBmSxFnKuHHCyGXm1IVmWKGWfKGWgPnymDXnEQ0+IRFaL
SVSGTFeITFyOU1yFTW6GQHGERXOJR3qPTHKLTXeRTHSeS3uTVmONXWGGWGqVWnecYWWHYmaIYmuNam+P
Y2+SY3OWYXabY3iUbXGQbneVb3qXaHuec3aHcXWSdXqVcH6bcX2gP4CdN4KyFY3VLozIIpnaNJnTJaTm
LqvmKa/tM7HoNrnyRoGWSYOdQYOhQoShQ4WnRoWjRYijR4umQ4itSIegTIihSIyoTJGuT5W0UpWxUpe3
UZi5VJu8VZ6+aoGbfICafoScaYWmdYWlc46vfIKjfIeofY2jeo2ofpCnR8v6VdT/dub/goefhoqfhYuq
io+iiYymiY2rg5eqjpGphpiwkpetmZ20jKC2lKG0m6K3nqe7nam8oKK3qrLGtLbGtrvCtLvPwcbNwcLR
xsfVzM3Zz9Tb3eLp6u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAAAAAzAsMkgAAAylJREFUOE9jKASD
goLi0pwgTw8fXx8Pz6Cc0uKCApAwQz4ElOQ4eyQcOXnq1KmTRxI8nHNKwKIMmSCQXxJoNfn03mgvext7
r+i9pydbBZbkA8UZMoAgs8jZ78R6y7RV9548eXJvVarl+hN+zkWZGRkM6UBQ5BR3Jjrk3osnd86fP3/7
0dM7/tFn4pyK0tMZkpOTswP8znhVvXx0bs3qZcuWrV5z7v6Lcq8zfgHZyQxJSSmRVieiq17eXrNs/mwQ
mLdwzfmnldEnrCJTGBITMxwmr498dXvFgoVvX5eVlb1+u3DB8vPPw9dPdshgCEuM8Djp/fD6igUTP/78
+SD2/s+fH8sWLL961eukRwRDWJJLwp68Z2sXzcr6/PPnU/dHP39+zpq4YMXj3D0JLgwhEY67Y85eWzyr
PxYo+8T1AVA2tm/W4otLY3Y7MoSEWh2LurRyzoQed7DsXaCse0/vnJUXoo5ZMYSF+hw3ujC3191N/xPQ
XvXLP39+0ndz7517wei4D4OEhM8xfkMNeTlFqY8/ftxVW/fjx0cpRSUFDVf+Yz4MDFweBwR4+WTlVFTf
f/t2RXvdt+/vVVWUZPl4BQ54MLByxR0w4JVUUtHSfvP160XdlV+/vtHWUlGS5DU4EMfAyha8K4ZPWVPH
xPjVly/rTJd8+fLK2ERHU5kvZlcwAyuj3ZQuGS296hqz5x8+rDSb++HDc7Oaaj0t6a4pdgyszKIVB811
qmvr666/ezejYca7d9fr6murdcwPVogysLKyhk/t0qmtb2xuvzC3qbtp7oX25sb6Wp2uqeGsQFkW0YrD
7TXN3Ru7W9o2bt7Y1gJkNda0H64QZQHpZbaddrS9YePWbdt27Ny5c8e2bVs3NrQfnWbLDNLLysoRPv1o
Z/P2GzdugsCNG9ubO45OD+dghciycoVPO7yhdfONWyBwY3PrhsPTwrmA4gxsYMDpNGnmgQ0bNm3ZsmXT
hg37Z05y4gQJM7BDAJNY/KSZu/fuO7Rv7+7pk+LFmMCiDDxQwM0tFpBXMWnapIq8ADFubogogzAcCAkK
iYiLi4sAaZgYgzUKsLCwQOYDADNYgx+MsDCLAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxPauseOver.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP
DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdEhgoFBkqFRssFx8wGyImGyMtHSc6Jy00Jy9M
Jj9KKDBNKzlEKTtFLTtHLD1JMT9MKENOKkNPLUBMKkZSLEdULUpXLU9dMkFRNURSNkZUN05dPUVTPEZV
OEpZPkhYPkxdMldmO1NlO2Z4QEdXQUlZQkpbQ0tdQ0xeRU1eRU5gR09iR1FjRVJkQVhuSFFkSlJlSlNm
SFRnSlRpS1ZrTFdrTVhtRGR5SWZ+AC7SCiTVDi3TADvNATbXBTbfBjzXADrcDTHXDDPdCD7ZES/OFjXP
GT3RAD3gFDvlP3CEAUbSClXUEkTdHlnOHVLVAEDkAEfpAEjqC0voAlr0GkfmFGrYDGr2DHD2FH33Ik3P
JU7KJVvbJFntLGbQJH7WNGnPMWHdOnfCK2TvJXT4Mm3oO3DoTW6FTm6HRXOJRnmOTXKLTHqSQXPSR3fQ
Rn3jGoT+KIrcNZjcJJP7OKjzRoGWR4KcSoWeSImfRoeiRIetR4qnSIimSI2pS46vQo25T5GvTZK1SpG6
TZS5T5e9bJKrZZW8eJarc5i/QITeRYneTY3fRJrHTZXAQ5LTQpHWRZPVWoHWUZrBT4rkWI3mXZHqTanH
S7nqUbzgZovZbJLGeJnKdJXTf53UfZnYfZjeYYnlY5XlY5TqbJbobZrpd5Tgd5XldZzofp3jeKXrfKDp
fq/vcqX5S8D9Xs3pesD9aeH5cubze+/8hqC5jKTYmazElqzZgKfqh63tjKTmjazpjbLtjbbwkqfnk6jn
lK7rma7ombHum73vorTOp7nZtrvCoLPqorXroLbupbbrpLfvpLrtqbrkq7ztnsf1g/T+ivD/l///qMbz
ptb8tcXjvMnotMTwtMzzs9b3sv//v/L/wcbNz9TbwMvox9HpztboxNX1wdr3zNT1z9j2ztz20djq19z2
2d73yuH4w/r/3eLp2eL46u/26/D3+vz/////AAAAAAAAAAAAAAAAAAAAzS/fsQAAAylJREFUOE9jsAUD
Gxt7J0s1eTlFJUU5eTVLJ3sbG5AwgzUEOFpKy+k39cyYPqOnSV9O2tIRLMpgDgLWDqpiof2zp63ZtHXT
mmmz+0PFVB2sgeIMZkBgbi+t3D1r/tV3nz4CwdvL82d1K0vbm5uZMZgCgZ2U7twpZ769e3jjypUrNx6+
/XhqylxdKTtTUwZjY2MLFeW5Ux59e3jp9MkjR46cOH3xxvuHU+Yqq1gYMxgZmeiIdU959P7a6SOrNmzc
uHHDqiOnrr2+O6VbTMeEwdDQTCJ01rHP105tXvng+pzVc64/WLn56OU3h2eFSpoxGBhqy/bN+3z36NYl
L3/9Olh18Nevl0s2HT37Zl6frDaDppGM/szjj48dWj/nw69f5yv2//r1Yc66rcceHZ6pL8OgoS3ZOPXx
zcOb1la+AurNBsq+qlyw/tDZu1MbJRk0NMU6qx4f27J2AVg2EyRbMX/tlsP3qjrFGAw0FWbk3Nu2tqog
Emjv/vAVQHsjC6oWbLuZM0OBQUREode3IMrbJ9rjxc+fK8KW//z5wiM62D+90LdXgYGBS7bV3cvVMzgm
7P737yvCl3//cT8sNtjT1cu9VZaBlUuvKTDE0ycmPvz816/Lwpd+/Xo+PD7WxzMksEWPgZVNvSHNLy42
Pin83PPnyxKXPn9+LjEpPjYuJK1BnYGVUaIk1y0/Pjkl8cCzZ5OzJj57diAxJTk+3y23RIKBlVnQuSMg
vzqlrmbfhQsTaydeuLCvpi6lOj+gw1mQgZWVVas0129HXX1916QJ0xdNnzCpq76+bodfbqkWK1CWRdCl
OTVj944dixcu3Ll758KFi3fs2J2R2uwiyALSyyxR1hGUd/vW7t179u7du2f37lu384LayiSYQXpZWTm0
yjtSQ3Y9eXIHBJ482RWS2lGuxcEKkWXl0iprzvXL2H7v6Zen97Zn+OU2l2lxAcUZ2MCAU6qovC03KiIh
ISEiKretvEiKEyTMwA4BTEJ6ReVN7a2tre1N5UV6QkxgUQYeKODmFlKxcikuK3axUhHi5oaIMvDDAR8v
n4CwsLAAkIaJMYijAFFRUWQ+AARqaklCCnVoAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxPlay.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw4NDw8O
CgoXDg4SDg4WCQwfEA8PEBAPERERERESEhISEhITEhIXExQUFBUVFRUWEBAbERIdExUZFBUYFhcZFRcb
FhccFxgZFxgbFxgfGBkcGRodBQcuBgc1ChEsEhcnFxkjFRoqFRssGx0gHR8jGiAyICEpISMoIyUrIyYs
JCctJCcuJSkvISU0JysyKy84KzA+LTI8LjM9LzU/MDU/BQVAAwdJBglBAw1OBgtQAwVlBAhwDR5nDS5+
MDVAMTZBMjdCNDlENTtONjxINz1NOD9NLz9zO0FPO0JSPURTPkVWPkZVP0ZWP0ZaP0deL0BuPkZgNEB1
QEdXQUlZQkpbQ0tcREtdRU1eRk1gRk5gRk9hR09iR1BiSFBjSFFkSlJlSlNmS1RnS1RoTVZpTVZqTlds
T1hsBgiIAAyaABOdABySDhafARSgABmgAB6iBRqhBhygCRaqCBiqACmQDiOYADWYFTWXACimCyiyADup
ADywFyO1GzStIi6eJjqIJzyLKjqKLDuWAEWdAECvAE+2AEm7ClSgHkSiB2O8GWutIkmNMkCNKk26K1q3
NUykO1qrOVu4NmCaNnevAFTGAFjHAGHIBWnaCnnYEmPPA3flIVLSLWDYSFemRmS2RWO8RWi+SmKxV2mm
V267VHmiZHK6RWbAS2vEUW3EWW/DU3LHVXbJYHfIYX7MbXzJcX3GGYjWD4vvHJjsGpj0JpPQP5XzLqvq
Kqz2MbX3N7v0O8L7XoSme4yxWZrgVrf3bYLNaInScYbDc4HJcoTOeIPHeoXMcY3TepPVRcv9TND+X+b/
Y9b/Zuv/fPT/kaO8g43Ph5LJgpTUgp7aiZDQjpXTk5nVmqnLkaDXlaPalajdnKPZn6jbhK3oj7LnmLjo
oqbapKzcqa7dqbLAqLPUtrvCtL/YqLzmsbXggNP8ke7/v8bdtsjrwcbNz9Tbxc3hx87rztPj0dfv2Nrw
2uDn2+Lt3OHo3+Pv2+Dy6u/27PH38/X5+vv9+vz/////AAAAAAAAAAAA6kUEYQAAAxhJREFUOE9jSISD
5LTUhMjIyITUtGSYGEMCGMTHJ6WE2msoS0tLK2vYh6YkxceDhBniICApRJNf3c7dL8DP3U6dXzMkCSzK
EA0CsfEmfFpegd1zlqxbMqc70EuLzyQ+FijOEAEE0bHa/K6Bc+5/+PYRCD7cmhPoyq8dGx0RwRAOBDFa
Ur4N17+9e/bg3r1795+9+3CtwVdKKyY8nCEsLDTKkN+34dWHZzevXL506dLlKzcfvHva6MtvGBXKEBIS
5snnXP/03a0r5w4fXLd27cEj5y7ffPW03pnPM4whODhMXd3twqvrFw6ef7Rk0YoVK1avPXTh2qtjburq
YQxBwe58Ln2vblw4tOj9n59X585btnzF6n3Hrr3qc+FzZ/AO1lfxP/b0wqHVC97/+fPn64EJ85YuB0rf
Peqvos/gGaSiX3f34tE1K/tBsn/+vF00ASR98U6dvgqDp4e4fePdY2tWLYPK/vn1aO78lWuO3mm0F2fw
cRd3qr29f9mEnrK3YL1A8OPAhGX7b9c6iTPoafPrpvfU5OfmZb38DQO/SgpqetJ1+RkYGXlZ0gszMvPK
i598B4MfPz4vzMrMKEpn4WXg4jCUsq7OyS2vLH30BQw+7bYtLs/NqbaWMGTgYjPWsKyuKK9qrbz6BgTO
dpVWNleWV1RbahgzcDHq2Mllz6pqndxy9vXr1w8nNrVMmTK5tWpWtpydDtBkEVdRq9kzJk+bevbxw8Vt
HdNnzpw5bfKM2VairiIMXFwMxkZyJVumzZw+aVdn5/qNGzdu2jBz2pYSOSNjBqAsh0SQinnP3k0bN2/e
vHU7EGzbtGlvj6lKkAQHUJaLQcdHyLT31IkdO3YeP3H8+M6dJ071mgr7AG0FyXIxOAQLy5btPXPm9Ekg
OHNmb5mscLADyFKQLAe7Q4gKq1n7nucvXrx4vqfdlFUlxIGdAyjLDQKcjHrRjiJMMhY2NjYWMkyijtF6
jJxAcQYeCGCWdA1311cTExNV03cPd5VkBosyCEKBAIuCgUdoRHREqIeBAosARJRBCQ4U5eUVVVVVQRRM
DACG9nnjnRgGhwAAAABJRU5ErkJggg==
</value>
</data>
<data name="pictureBoxPlayDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8ODxAP
DxEWEBERERIREhISERITEhIXEhQUERQVExcXEBEcERIdAAA0AAA9CBEkCxY1EhgoFBkqFRssFx8wGyIm
GyMtHSc6Jy00BABGAABOAgRLAgVMBQBJBABNBwdNCQhPAgBQAAdWBQFRAQJbAAxWDRtXEQxSGB9dAwtk
ABRjABVuABhvABxzFhtiFixYHildACZpACN3ATh5HCNhGTF0Jy9MIDdHJj9KKDBNKDdLKzlDKzlEKDlG
KjtFKDtGLTtHLD1JMT9MIy5iJS1zIjprLzt4ND14KUNPLUBMJENWJkVYKkZSLUpXLU9dO0BOMkFRNURS
NkZUN05dPkRSPEZVP0ZWOEpZPkhYPk1dK05kKVdsLl14O0J6NVVmP1NnNlN6O2d4QUhYQUpaQ0tdQ0xe
RElYR0xaRU1eRU5gR09iQ0l6R1FjRVJkQ1luSFFkSlJlSlNmSVRoS1RpTFdrTVhtSlB+WF5tR2V8V2Bv
XmZzAC2AADWFADyDAT6NAEaMAkqUAE+cElOLAFSjB1ygA1uoBWCsB2m3Fnq6HHCyKFGCJVeVLWaaKGWg
PnymCHrLQUqCRFSKTFSCTleJTFyOUViBVlyFTW6GQHGERXOJR3qPTHKLTHqSVmONXWGHVmyUWnWdYWWI
Y2uNbG+ZbXCPY3GVY3iUZ3mdbneVbXuYc3aHcXWScXWedXqVcH6be3+ZaX6hP4CdN4KyG4bFE5DcHprh
LozIIpfYNJnTIZ7jJ6bmKq7tMa/pNLbwN7z0RoGWSYOdQYOhQoShQ4WnRYijRoikR4umQ4itSIagSIig
TIihSIyoTJGuT5W0UpWxUpe3UZi5VJu8VZ6+aoGbfYKbfICcfoWeaYWqeYymR8v6VdT/dub/hImfio+i
iJCmiZaqhpiwkpetjKC2lKC0mqC2nqa8nKm8qK++tbvIwcbNwcPUycvXz9Pb39/o2uDn2+Dr3OHo6u/2
7u/z7PH48/P2+vr7+vr9+vz/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAyX1CIwAAAxFJREFUOE9jKASD
goLi0twgTw8fXx8Pz6Dc0uKCApAwQz4ElOQ6eiSeOn/hwoXzpxI9HHNLwKIMWSCQXxJoMePioWgvWytb
r+hDF2dYBJbkA8UZMoEgq8jR79xG8/RVdx8+fHh3VZr5xnN+jkVZmZkMGUBQ5BB3KTrk7pOHd65duXbn
3pM7/tGX4hyKMjIYUlJScgL8LnlVPb13Ze3qJUuWrF67/t6Tcq9LfgE5KQzJyamRFueiq57eWbtk4cJ5
8+YtXLRk7bUnldHnLCJTGZKSMu1mbIx8dm3FoqvPp5VNmjR12rxFK649Dt84wy6TISwpwuO89/17KxdN
ffPjy8Ps7OyySdMWrbhxw+usRwRDWLJT4sG8R+uWzs1+/ePHj7eL3WMnAKVXPog/mOjEEBJhfyDm8o2l
cyfFgmR//Hg1OXbCxLlLbyyLOWDPEBJqcSbqxob5Uya6Q2R/fH06YcKU+cuvR52xYAgL9Tlrfn3BRHcX
Pajsjx+f1rhNXHDd/KwPg4SEzxl+Aw15OUWpV99h4Ju6gokz/xkfBgYujyMCvHySyipKLz6CwefP76fJ
yvLxChzxYGDlijuizwuU1NR6/gEM3l1TU1VRluTVPxLHwMoWvL+LT1lT28jw2RsQeOxqaKiro6nM17U/
mIGV0WZmn4ymbnWN8eOXL18+TzA0Nq6tqdbRlO6bacPAyixaccxUu7quvv7+i+fzjeubm5sb6+uqtU2P
VYgysLKyhs/q06lraG3rWdDU0t4PBO2tDXXafbPCWYGyLKIVJ7pr2vr7Ozo2b9+5c+fWLVv622q6T1aI
soD0MlvPPt3dvGXXrj179wHB3t07tzR2n55tzQzSy8rKET7ndG/77ps3b4HAzZu723tPzwnnYIXIsnKF
zz7R17n95m0QuLm9s+/E7HAuoDgDGxhwOkyfc3TTpm07duzYtmnTkTnTHThBwgzsEMAkFj99zoFDh48f
PnRgzvR4MSawKAMPFHBziwXkVUyfPb0iL0CMmxsiyiAMB0KCQiLi4uIiQBomxmCJAszMzJD5AKC+iMSu
Me5pAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxPlayOver.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="pictureBoxProgressBar.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAT4AAAAECAMAAAAgcKN9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFHB4hHR4i
D0HNGEXCWHiYYnm0a4/ubpb/frjthMX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY
BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxProgressbarBackground.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
R0lGODlhdgEMAPcAABweIR0eIigsNDA0PjY7SEZOYE1VaU5Wa09YbVBYbVBZblFZb1FablFab1JbcFFa
cVNcc1Rdc1RddFRddVVedVZfdlZfd1dgd1hieVhielpjfFtlfVtlfl1mf11mgF5ogl9pg15phWBqhWFq
hgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACwAAAAAdgEMAAAI/wBDCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzarw4oqPHjyBDihxJsqTJkyhT
qlzJsqXLlzBjypxJs6ZMEDhBiNjJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp2KNCcIDx0+gLhQoavX
r2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lty7aCyA+dPCggUMDAQEACB5MuLDhw4gTK17MuLHjx5AjS55M
ubLly5gza24cQEADDhosYBhAYEGC06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv37IXEBiAwQKEBwUo
TJDAvLnz59CjS59Ovbr169iza9/Ovbv37+DDi7wfT/76BAoFHkBw4EBBBgkR4sufT7++/fv48+vfz7+/
//8ABijggAQWaOCBCCbInwQZKMBeAww4sMEIVFVo4YUYZqjhhhx26GFRI2zgAAMNIGAiAg2kqOKKLLbo
4oswxijjjDTWaOONOOao44489ujjj0AGaeOJCBxg5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp
5ZYGhCnmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145mlnQAA7
</value>
</data>
<data name="pictureBoxReverse.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAMAAADHqI+lAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFHB4hSVFn
SlJnSlJoS1NrS1RpTFRqTVVrTVZrTVVtTlZsT1htT1hvUFluUVpvUFhwUFlxUltwU1xzVF11Vl93Vl94
WWB0XGN3WGF6WWJ7WmN8W2R+XGR/XWaAX2iBXmiCX2mDYGiCb3aMcHeMdXyPc3qQdn2QgIeagYiYgomZ
gIibhYych46fkpqrl52tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2/pneQAAAGtJREFUGFc9xO0W
wTAMANDUmE3JJDKbWDHfrPX+jyc4x/1x4fC1/wfBdLvLNnS9FQKobtrjC+r2ZKkqiKxuKaXqaS1FBJjn
5xjj+GqVzAxE3jX3IXPNY8iJCBAXMzda55+miAjeFJOs+OX9G6tUC5z+5pPbAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxStop.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDw8OCgoW
DAwRDw8TDQ0VDw8UEBATEhISHyMtJioxMjdJMzhKNDxNOkFRPENSPENTPURTPURUPkZVP0ZWQEdXQUlZ
QkpbQ0tdRU1eRk5gm56nyszQ09jf1Nng3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHzqB+wAAAHxJREFUKFONzdkO
gjAQheHDVpBFqVVQcOv7v6SclgmJmRi+u386bXFX4KbAqMCgwFWBCzl7iqxj4kzd7KO5Y6K3i3aded8y
0R8X9UfUTDgeNW/RhM0DVS9RMRGkD5GGLql4ioL5Z5hN6/Up2zZNnkS52YalEeGL+OaP/cMvDc4aWeQk
0FYAAAAASUVORK5CYII=
</value>
</data>
<data name="pictureBoxStopDown.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFEBESEhIS
ExMVExMWCBc2CRY3Dxo3CBk5CRo7EhYpEhcuFRoqFhssHB8mEBczExs0FRswFhwxFBw2ERw6Eh48GiIl
GyA3HCAyHSM2HSI3GiA7HSI5JiwvJioyIyk7JCo8Ji48Dh5BDh9CDyFECyRMCydODCZOBi1dCylRCi1X
FyBAFSJHEyZQFjFfBzRmBzltCjRgCzhmKS9BLzZLLjVMLzVOLzVQLzVTLjZXLjdcLzphLztiLztjLzxj
MDphMD1kCUB2Ckh/FUF4N0BVO0JRPENUPERTPkVVP0dXOEJYNEd1QUhZQUlaQkpaQ0tdRU1eQk1hQ05h
Q09mRk5gR1NmTFtwUmB0VmV2XGp5XGp6YXB+Y3F/DVGHEEiGE1qPEFCQEVmaF2GTFmKgG2ynInatKH2y
ZHWFZHWGa36Ob4CEb4GNcoONcIKOeouVeIqXe4yWf42Wgo+YhZObh5adhJafiJaekqCmnaOwnaywprG0
p7G1tMDEtcHFucTH09jf1tre1Nng19zj3eLp8PX8+vz//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsHXsgAAATlJREFUKFNVy+dX
QQEYgPG3SyGyJTTsvZJxqcwWUbj2Di2zMiqU5v/dB+eWfh+fcx7AMCx8Oi+MYXAeWeGtz+OtROBMfDt+
mTe+FUM4Mxk9j/48jyYZOMk/Df97ysNxdtgbPNzfzdw/DHrDLByl++1uc/o9M2122/00HKQ6jVbuC5dr
NTopOEjeXF2nPnGp66ubJBzGE9FY4AMXiEUTcdgIWja31l5xa1ubliDADp9Ko7zhKDQqfwcQ6yqTtfwb
l1nMVSsQbEIGm/6709kMoQ0Idi2Hu/T4PvO4xOVo7UBw6KQyCXmRSCKTiItkiUyqcwAB1cuVSoVaY942
a9QKpVKuRwFBDSqjyesrlC5KBZ/XZFQZUFgQhPzFcqVaq1/Wa9VKuegPCWABETndrt29fY/Hs7+363I7
RcgPYGp9sy9YtQ4AAAAASUVORK5CYII=
</value>
</data>
<data name="pictureBoxStopOver.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDhAWEhIS
EREWERIUERIaCAopCQ03EiA/JCg2DxpZFSVDFidGEiRIHSlFEihSECtXEixVFClQFixSFC9VEy1cFTFW
FTBeHytmEjBgEjFiEjRrFTdsHzlsFjxzFDx6Hj56ITBMIzJOIzVVLz9cICpmICtoIjdhF0B8OUFVOEBW
OkJXOkJYO0NZPUVbP0hdO0liOlB+Q0tdRU1eRE1fQ01iQ0xjRE1hRk5gR1dxSFlyFy+BFy+CE0WOHkSK
HU6HGU2PGk+NHlCCIUCIIECJIEGMJEOJJkSIJESPK0qPIlWDJluDKF6EN1abJ1ekKGmqK2+rMHasNX2s
M3KzVGaARmenS2yoQGi5UG+qVXKsW3mxX32xZHSHOoSsP4ytQ5KudIWSeIuceY2dbom3Vo/Ie5TAfZbB
hZmkh5qlipqliJ2nk6WulKavl6mwm6S1mKiwmquzn6+3obK5orO6prS6sL/EtL7EiszfjtHfk9Pfl9bf
ntjfg8LhiMvgo9rfscDFxMnOytLWytPX09jfyN701Nng3N7h3ODk3eLp7+/x8PHy8PX8+vz//v7/AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAasY1UQAAATxJREFUKFNjMDc3
NzM1QQBTM3NzBiNjg6TUFARITTIwZjA0aO7sQAadzQYMelGtDY3IoKE1ikE3sr6kDhmU1Ecy6ESUFhYV
5OdBQH5BUWFpBINWeHFWdkZbDwS0ZWRnFYczaITmpKXHQ8V6euLT03JCGTRDMhMSo7thIDoxITOEQdsn
2MJSvwsG9C0tgn0YODyUFRR522GAV1FB2YOBwU2Ji5u9CQbYubmU3BhYXNUEhXhaYIBHSFDNlYHFSUZE
jA8uyCcmIuPEwOIsLyUtkQvVnishLSXvzMDiYiunLivJLyAsKizALymrLmfrwsDi7mtj72Dn6Onl7eXp
aOdgb+PrzsBknRzk5x8QGBMbFxsTGODvF5RsxcDIFlZdU1ZeUVlVW1VZUV5WUx3GxsDIzMqpKi6uAgHi
4qqcrMwAl/uGWf27czcAAAAASUVORK5CYII=
</value>
</data>
<data name="pictureBoxVolumeBar.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAT4AAAAECAMAAAAgcKN9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFHB4hHR4i
D0HNGEXCWHiYYnm0a4/ubpb/frjthMX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZ1u+QAAACZJREFUOE9jYGQY
BRSEAAsH5yggOwQYmJlGAfkhwMDKxj4KyA4BANhiFlbMlRkDAAAAAElFTkSuQmCC
</value>
</data>
<data name="pictureBoxVolumeBarBackground.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAFIAAAANCAMAAAANKsmLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFDg0MDw8O
EBAPEREQEREREhISFBQVFRYXFRYYFhcZGBkcGRocIiQpIiQqJSkvJioxKCszLDA5NDpFOUBNO0FPPENS
PUVUPkZVQEdXR09hS1NmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIb5gPgAAAHBJREFUOE/VzjsS
gDAIRdFnFMVPNH6j7n+hFgELW9J4GobmzsOZHWJ2OJQ1/YawJ3FbjbYoKV05N9yacDPLTkyJA/edQc9w
kkKRhMUP3mDwS5AUKBkvuk3oGiWlSVezUe0+SapKo0qKpCv1z3D/kXwApPU2QwRJJE0AAAAASUVORK5C
YII=
</value>
</data>
</root>

56
src/Controls/WaveForm.Designer.cs generated Normal file
View File

@ -0,0 +1,56 @@
namespace Nikse.SubtitleEdit.Controls
{
partial class WaveForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// WaveForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.Name = "WaveForm";
this.Size = new System.Drawing.Size(682, 355);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.WaveForm_Paint);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WaveForm_KeyDown);
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.WaveForm_MouseClick);
this.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.WaveForm_MouseDoubleClick);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.WaveForm_MouseDown);
this.MouseEnter += new System.EventHandler(this.WaveForm_MouseEnter);
this.MouseLeave += new System.EventHandler(this.WaveForm_MouseLeave);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.WaveForm_MouseMove);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.WaveForm_MouseUp);
this.ResumeLayout(false);
}
#endregion
}
}

983
src/Controls/WaveForm.cs Normal file
View File

@ -0,0 +1,983 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using Nikse.SubtitleEdit.Logic;
using System.Collections.Generic;
namespace Nikse.SubtitleEdit.Controls
{
public partial class WaveForm : UserControl
{
private enum MouseDownParagraphType
{
None,
Start,
Whole,
End
}
private const int ClosenessForBorderSelection = 14;
private const int MininumSelectionMilliseconds = 100;
private long _buttonDownTimeTicks = 0;
private int _mouseMoveLastX = -1;
private int _mouseMoveStartX = -1;
private double _moveWholeStartDifferenceMilliseconds = -1;
private int _mouseMoveEndX = -1;
private bool _mouseDown = false;
private Paragraph _mouseDownParagraph = null;
private MouseDownParagraphType _mouseDownParagraphType = MouseDownParagraphType.Start;
private Paragraph _selectedParagraph = null;
private Paragraph _currentParagraph = null;
private List<Paragraph> _previousAndNextParagraphs = new List<Paragraph>();
private double _currentVideoPositionSeconds = -1;
private WavePeakGenerator _wavePeaks = null;
private Subtitle _subtitle = null;
private bool _noClear = false;
public delegate void ParagraphChangedHandler(Paragraph paragraph);
public event ParagraphChangedHandler OnNewSelectionRightClicked;
public event PositionChangedEventHandler OnParagraphRightClicked;
public delegate void PositionChangedEventHandler(double seconds, Paragraph paragraph);
public event PositionChangedEventHandler OnPositionSelected;
public delegate void TimeChangedEventHandler(double seconds, Paragraph paragraph);
public event TimeChangedEventHandler OnTimeChanged;
public event TimeChangedEventHandler OnTimeChangedAndOffsetRest;
public event EventHandler OnTooglePlay;
public event EventHandler OnPause;
public event EventHandler OnZoomedChanged;
public const double ZoomMininum = 0.1;
public const double ZoomMaxinum = 2.5;
private double _zoomFactor = 1.0; // 1.0=no zoom
public double ZoomFactor
{
get
{
return _zoomFactor;
}
set
{
if (value < ZoomMininum)
_zoomFactor = ZoomMininum;
else if (value > ZoomMaxinum)
_zoomFactor = ZoomMaxinum;
else
_zoomFactor = value;
Invalidate();
}
}
private double _startPositionSeconds = 0;
public double StartPositionSeconds
{
get
{
return _startPositionSeconds;
}
set
{
if (value < 0)
_startPositionSeconds = 0;
else
_startPositionSeconds = value;
}
}
public Paragraph NewSelectionParagraph { get; set; }
public Paragraph RightClickedParagraph { get; private set; }
public double RightClickedSeconds { get; private set; }
public string WaveFormNotLoadedText { get; set; }
public Color BackgroundColor { get; set; }
public Color Color { get; set; }
public Color SelectedColor { get; set; }
public Color TextColor { get; set; }
public Color GridColor { get; set; }
public bool DrawGridLines { get; set; }
public bool AllowNewSelection { get; set; }
public double EndPositionSeconds
{
get
{
return XPositionToSeconds(Width);
}
}
public WavePeakGenerator WavePeaks
{
get
{
return _wavePeaks;
}
set
{
_zoomFactor = 1.0;
_wavePeaks = value;
}
}
public void ClearSelection()
{
_mouseDown = false;
_mouseDownParagraph = null;
_mouseMoveStartX = -1;
_mouseMoveEndX = -1;
Invalidate();
}
public WaveForm()
{
InitializeComponent();
SetStyle(System.Windows.Forms.ControlStyles.UserPaint | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint | System.Windows.Forms.ControlStyles.DoubleBuffer, true);
WaveFormNotLoadedText = "Click to add wave form";
this.MouseWheel += new MouseEventHandler(WaveForm_MouseWheel);
BackgroundColor = Color.Black;
Color = Color.GreenYellow;
SelectedColor = Color.Red;
TextColor = Color.Gray;
GridColor = Color.FromArgb(255, 20, 20, 18);
DrawGridLines = true;
AllowNewSelection = true;
}
private void NearestSubtitles(Subtitle subtitle, double currentVideoPositionSeconds, int subtitleIndex)
{
int positionMilliseconds = (int)Math.Round(currentVideoPositionSeconds * 1000.0);
if (_selectedParagraph != null && _selectedParagraph.StartTime.TotalMilliseconds < positionMilliseconds && _selectedParagraph.EndTime.TotalMilliseconds > positionMilliseconds)
{
_currentParagraph = _selectedParagraph;
_previousAndNextParagraphs.Clear();
for (int j = 1; j < 12; j++)
{
Paragraph nextParagraph = subtitle.GetParagraphOrDefault(subtitleIndex - j);
_previousAndNextParagraphs.Add(nextParagraph);
}
for (int j=1; j < 10; j++)
{
Paragraph nextParagraph = subtitle.GetParagraphOrDefault(subtitleIndex + j);
_previousAndNextParagraphs.Add(nextParagraph);
}
}
else
{
for (int i = 0; i < subtitle.Paragraphs.Count; i++)
{
Paragraph p = subtitle.Paragraphs[i];
if (p.EndTime.TotalMilliseconds > positionMilliseconds)
{
_currentParagraph = p;
_previousAndNextParagraphs.Clear();
for (int j = 1; j < 10; j++)
{
Paragraph nextParagraph = subtitle.GetParagraphOrDefault(i - j);
_previousAndNextParagraphs.Add(nextParagraph);
}
for (int j = 1; j < 10; j++)
{
Paragraph nextParagraph = subtitle.GetParagraphOrDefault(i + j);
_previousAndNextParagraphs.Add(nextParagraph);
}
break;
}
}
}
}
public void SetPosition(double startPositionSeconds, Subtitle subtitle, double currentVideoPositionSeconds, int subtitleIndex)
{
StartPositionSeconds = startPositionSeconds;
_subtitle = subtitle;
_currentVideoPositionSeconds = currentVideoPositionSeconds;
_selectedParagraph = _subtitle.GetParagraphOrDefault(subtitleIndex);
NearestSubtitles(subtitle, currentVideoPositionSeconds, subtitleIndex);
Invalidate();
}
private int CalculateHeight(double value, int imageHeight, int maxHeight)
{
double percentage = value / maxHeight;
int result = (int)Math.Round((percentage * imageHeight) + (imageHeight / 2));
return imageHeight - result;
}
private void WaveForm_Paint(object sender, PaintEventArgs e)
{
if (_wavePeaks != null && _wavePeaks.AllSamples != null)
{
if (StartPositionSeconds < 0)
StartPositionSeconds = 0;
if (XPositionToSeconds(Width) > _wavePeaks.Header.LengthInSeconds)
StartPositionSeconds = _wavePeaks.Header.LengthInSeconds - ((((double)Width) / (double)_wavePeaks.Header.SampleRate) / _zoomFactor);
Graphics graphics = e.Graphics;
int begin = SecondsToXPosition(StartPositionSeconds);
int beginNoZoomFactor = (int)Math.Round(StartPositionSeconds * _wavePeaks.Header.SampleRate); // do not use zoom factor here!
int start = -1;
int end = -1;
if (_selectedParagraph != null)
{
start = SecondsToXPosition(_selectedParagraph.StartTime.TotalSeconds);
end = SecondsToXPosition(_selectedParagraph.EndTime.TotalSeconds);
}
int imageHeight = Height;
int maxHeight = (int)(Math.Max(Math.Abs(_wavePeaks.DataMinValue), Math.Abs(_wavePeaks.DataMaxValue)) + 0.5);
Pen pen = new System.Drawing.Pen(System.Drawing.Color.GreenYellow);
DrawBackground(graphics);
int x = 0;
int y = Height / 2;
if (_zoomFactor == 1.0)
{
for (int i = 0; i < _wavePeaks.AllSamples.Count && i < Width; i++)
{
if (begin + i < _wavePeaks.AllSamples.Count)
{
int newY = CalculateHeight(_wavePeaks.AllSamples[begin + i], imageHeight, maxHeight);
graphics.DrawLine(pen, x, y, i, newY);
x = i;
y = newY;
if (begin + i > end || begin + i < start)
pen = new System.Drawing.Pen(Color);
else
pen = new System.Drawing.Pen(SelectedColor); // selected paragraph
}
}
}
else
{
// calculate lines with zoom factor
float x2 = 0;
float x3 = 0;
for (int i = 0; i < _wavePeaks.AllSamples.Count && ((int)Math.Round(x3)) < Width; i++)
{
if (beginNoZoomFactor + i < _wavePeaks.AllSamples.Count)
{
int newY = CalculateHeight(_wavePeaks.AllSamples[beginNoZoomFactor + i], imageHeight, maxHeight);
x3 = (float)(_zoomFactor * i);
graphics.DrawLine(pen, x2, y, x3, newY);
x2 = x3;
y = newY;
if (begin + x2 > end || begin + x2 < start)
pen = new System.Drawing.Pen(Color);
else
pen = new System.Drawing.Pen(SelectedColor); // selected paragraph
}
}
}
DrawTimeLine(StartPositionSeconds, e);
// current video position
if (_currentVideoPositionSeconds > 0)
{
int videoPosition = SecondsToXPosition(_currentVideoPositionSeconds);
videoPosition -= begin;
if (videoPosition > 0 && videoPosition < Width)
{
pen = new Pen(Color.Turquoise);
e.Graphics.DrawLine(pen, videoPosition, 0, videoPosition, Height);
}
}
// mark paragraphs
DrawParagraph(_currentParagraph, e, begin);
foreach (Paragraph p in _previousAndNextParagraphs)
DrawParagraph(p, e, begin);
// current selection
if (NewSelectionParagraph != null)
{
int currentRegionLeft = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds - StartPositionSeconds);
int currentRegionRight = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds - StartPositionSeconds);
int currentRegionWidth = currentRegionRight - currentRegionLeft;
SolidBrush brush = new SolidBrush(Color.FromArgb(128, 255, 255, 255));
if (currentRegionLeft >= 0 && currentRegionLeft <= Width)
{
e.Graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, e.Graphics.VisibleClipBounds.Height);
if (currentRegionWidth > 40)
{
SolidBrush textBrush = new SolidBrush(Color.Turquoise);
Font textFont = new Font(Font.FontFamily, 7);
e.Graphics.DrawString(string.Format("{0:0.###} {1}", (double)((double)currentRegionWidth / _wavePeaks.Header.SampleRate / _zoomFactor),
Configuration.Settings.Language.WaveForm.Seconds),
Font, textBrush, new PointF(currentRegionLeft + 3, Height - 32));
}
}
}
}
else
{
DrawBackground(e.Graphics);
SolidBrush textBrush = new SolidBrush(TextColor);
Font textFont = new Font(Font.FontFamily, 8);
if (Width > 90)
{
e.Graphics.DrawString(WaveFormNotLoadedText, textFont, textBrush, new PointF(Width / 2 - 65, Height / 2 - 10));
}
else
{
StringFormat stringFormat = new StringFormat();
stringFormat.FormatFlags = StringFormatFlags.DirectionVertical;
e.Graphics.DrawString(WaveFormNotLoadedText, textFont, textBrush, new PointF(1, 10), stringFormat);
}
}
}
private void DrawBackground(Graphics graphics)
{
graphics.Clear(BackgroundColor);
if (DrawGridLines)
{
Pen pen = new Pen(new SolidBrush(GridColor));
for (int i = 0; i < Width; i += 10)
{
graphics.DrawLine(pen, i, 0, i, Height);
graphics.DrawLine(pen, 0, i, Width, i);
}
}
}
private void DrawTimeLine(double StartPositionSeconds, PaintEventArgs e)
{
int start = (int)Math.Round(StartPositionSeconds + 0.5);
double seconds = start - StartPositionSeconds;
float position = SecondsToXPosition(seconds);
Pen pen = new Pen(TextColor);
SolidBrush textBrush = new SolidBrush(TextColor);
Font textFont = new Font(Font.FontFamily, 7);
while (position < Width)
{
if (_zoomFactor > 0.3 || (int)Math.Round(StartPositionSeconds + seconds) % 5 == 0)
{
e.Graphics.DrawLine(pen, position, Height, position, Height-10);
e.Graphics.DrawString(GetDisplayTime(StartPositionSeconds + seconds), textFont, textBrush, new PointF(position + 2, Height - 13));
}
seconds += 0.5;
position = SecondsToXPosition(seconds);
if (_zoomFactor > 0.5)
e.Graphics.DrawLine(pen, position, Height, position, Height - 5);
seconds += 0.5;
position = SecondsToXPosition(seconds);
}
}
private string GetDisplayTime(double seconds)
{
TimeSpan ts = TimeSpan.FromSeconds(seconds);
if (ts.Minutes == 0 && ts.Hours == 0)
return ts.Seconds.ToString();
else if (ts.Hours == 0)
return string.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds);
else
return string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
}
private void DrawParagraph(Paragraph paragraph, PaintEventArgs e, int begin)
{
if (paragraph != null)
{
int currentRegionLeft = SecondsToXPosition(paragraph.StartTime.TotalSeconds) - begin;
int currentRegionRight = SecondsToXPosition(paragraph.EndTime.TotalSeconds) - begin;
int currentRegionWidth = currentRegionRight - currentRegionLeft;
SolidBrush brush = new SolidBrush(Color.FromArgb(32, 255, 255, 255));
e.Graphics.FillRectangle(brush, currentRegionLeft, 0, currentRegionWidth, e.Graphics.VisibleClipBounds.Height);
Pen pen = new Pen(new SolidBrush(Color.FromArgb(128, 150, 150, 150)));
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
e.Graphics.DrawLine(pen, currentRegionLeft, 0, currentRegionLeft, e.Graphics.VisibleClipBounds.Height);
pen = new Pen(new SolidBrush(Color.FromArgb(135, 0, 100, 0)));
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
e.Graphics.DrawLine(pen, currentRegionRight, 0, currentRegionRight, e.Graphics.VisibleClipBounds.Height);
SolidBrush textBrush = new SolidBrush(TextColor);
if (_zoomFactor > 0.6)
e.Graphics.DrawString(paragraph.Text.Replace(Environment.NewLine, " "), Font, textBrush, new PointF(currentRegionLeft + 3, 10));
if (_zoomFactor > 0.6)
e.Graphics.DrawString("#" + paragraph.Number + " " + paragraph.StartTime.ToShortString() + " --> " + paragraph.EndTime.ToShortString(), Font, textBrush, new PointF(currentRegionLeft + 3, Height - 32));
else if (_zoomFactor > 0.4)
e.Graphics.DrawString("#" + paragraph.Number + " " + paragraph.StartTime.ToShortString(), Font, textBrush, new PointF(currentRegionLeft + 3, Height - 32));
else if (_zoomFactor > 0.2)
e.Graphics.DrawString("#" + paragraph.Number, Font, textBrush, new PointF(currentRegionLeft + 3, Height - 32));
}
}
private double XPositionToSeconds(double x)
{
return StartPositionSeconds + (x / (double)_wavePeaks.Header.SampleRate) / _zoomFactor;
}
private int SecondsToXPosition(double seconds)
{
return (int)Math.Round(seconds * _wavePeaks.Header.SampleRate * _zoomFactor);
}
private void WaveForm_MouseDown(object sender, MouseEventArgs e)
{
if (_wavePeaks == null)
return;
_mouseDownParagraphType = MouseDownParagraphType.None;
if (e.Button == MouseButtons.Left)
{
_buttonDownTimeTicks = DateTime.Now.Ticks;
Cursor = Cursors.VSplit;
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (SetParagrapBorderHit(milliseconds, NewSelectionParagraph))
{
if (_mouseDownParagraphType == MouseDownParagraphType.Start)
{
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds;
NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds;
_mouseMoveStartX = e.X;
_mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds);
}
else
{
_mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds;
NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds;
_mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds);
_mouseMoveEndX = e.X;
}
}
else if (SetParagrapBorderHit(milliseconds, _selectedParagraph) ||
SetParagrapBorderHit(milliseconds, _currentParagraph) ||
SetParagrapBorderHit(milliseconds, _previousAndNextParagraphs))
{
NewSelectionParagraph = null;
if (_mouseDownParagraphType == MouseDownParagraphType.Start)
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds;
else
_mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds;
}
else
{
Paragraph p = GetParagraphAtMilliseconds(milliseconds);
if (p != null)
{
_mouseDownParagraph = p;
_mouseDownParagraphType = MouseDownParagraphType.Whole;
_moveWholeStartDifferenceMilliseconds = (XPositionToSeconds(e.X) * 1000.0) - p.StartTime.TotalMilliseconds;
Cursor = Cursors.Hand;
}
else if (!AllowNewSelection)
{
Cursor = Cursors.Default;
}
NewSelectionParagraph = null;
_mouseMoveStartX = e.X;
_mouseMoveEndX = e.X;
}
_mouseDown = true;
}
else
{
if (e.Button == MouseButtons.Right)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
double currentRegionLeft = Math.Min(_mouseMoveStartX, _mouseMoveEndX);
double currentRegionRight = Math.Max(_mouseMoveStartX, _mouseMoveEndX);
currentRegionLeft = XPositionToSeconds(currentRegionLeft);
currentRegionRight = XPositionToSeconds(currentRegionRight);
if (OnNewSelectionRightClicked != null && seconds > currentRegionLeft && seconds < currentRegionRight)
{
if (_mouseMoveStartX >= 0 && _mouseMoveEndX >= 0)
{
if (currentRegionRight - currentRegionLeft > 0.1) // not too small subtitles
{
Paragraph paragraph = new Paragraph();
paragraph.StartTime = new TimeCode(TimeSpan.FromSeconds(currentRegionLeft));
paragraph.EndTime = new TimeCode(TimeSpan.FromSeconds(currentRegionRight));
OnNewSelectionRightClicked.Invoke(paragraph);
NewSelectionParagraph = paragraph;
RightClickedParagraph = null;
_noClear = true;
}
}
}
else if (OnParagraphRightClicked != null)
{
NewSelectionParagraph = null;
Paragraph p = GetParagraphAtMilliseconds(milliseconds);
RightClickedParagraph = p;
RightClickedSeconds = seconds;
if (p != null)
OnParagraphRightClicked.Invoke(seconds, p);
}
}
Cursor = Cursors.Default;
}
}
private bool SetParagrapBorderHit(int milliseconds, List<Paragraph> paragraphs)
{
foreach (Paragraph p in paragraphs)
{
bool hit = SetParagrapBorderHit(milliseconds, p);
if (hit)
return true;
}
return false;
}
private Paragraph GetParagraphAtMilliseconds(int milliseconds)
{
Paragraph p = null;
if (IsParagrapHit(milliseconds, _selectedParagraph))
p = _selectedParagraph;
else if (IsParagrapHit(milliseconds, _currentParagraph))
p = _currentParagraph;
if (p == null)
{
foreach (Paragraph pNext in _previousAndNextParagraphs)
{
if (IsParagrapHit(milliseconds, pNext))
{
p = pNext;
break;
}
}
}
return p;
}
private bool SetParagrapBorderHit(int milliseconds, Paragraph paragraph)
{
if (paragraph == null)
return false;
if (Math.Abs(milliseconds - paragraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection)
{
_mouseDownParagraph = paragraph;
_mouseDownParagraphType = MouseDownParagraphType.Start;
return true;
}
else if (Math.Abs(milliseconds - paragraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection)
{
_mouseDownParagraph = paragraph;
_mouseDownParagraphType = MouseDownParagraphType.End;
return true;
}
return false;
}
private void WaveForm_MouseMove(object sender, MouseEventArgs e)
{
if (_wavePeaks == null)
return;
if (e.X < 0 && StartPositionSeconds > 0.1 && _mouseDown)
{
if (e.X < _mouseMoveLastX)
{
StartPositionSeconds -= 0.1;
if (_mouseDownParagraph == null)
{
_mouseMoveEndX = 0;
_mouseMoveStartX += (int)(_wavePeaks.Header.SampleRate * 0.1);
OnPositionSelected.Invoke(StartPositionSeconds, null);
}
}
_mouseMoveLastX = e.X;
Invalidate();
return;
}
else if (e.X > Width && StartPositionSeconds + 0.1 < _wavePeaks.Header.LengthInSeconds && _mouseDown)
{
//if (e.X > _mouseMoveLastX) // not much room for moving mouse cursor, so just scroll right
{
StartPositionSeconds += 0.1;
if (_mouseDownParagraph == null)
{
_mouseMoveEndX = Width;
_mouseMoveStartX -= (int)(_wavePeaks.Header.SampleRate * 0.1);
OnPositionSelected.Invoke(StartPositionSeconds, null);
}
}
_mouseMoveLastX = e.X;
Invalidate();
return;
}
_mouseMoveLastX = e.X;
if (e.X < 0 || e.X > Width)
return;
if (e.Button == MouseButtons.None)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (IsParagrapBorderHit(milliseconds, NewSelectionParagraph))
Cursor = Cursors.VSplit;
else if (IsParagrapBorderHit(milliseconds, _selectedParagraph) ||
IsParagrapBorderHit(milliseconds, _currentParagraph) ||
IsParagrapBorderHit(milliseconds, _previousAndNextParagraphs))
{
Cursor = Cursors.VSplit;
}
else
{
Cursor = Cursors.Default;
}
}
else if (e.Button == MouseButtons.Left)
{
if (_mouseDown)
{
if (_mouseDownParagraph != null)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (_mouseDownParagraphType == MouseDownParagraphType.Start)
{
if (_mouseDownParagraph.EndTime.TotalMilliseconds - milliseconds > MininumSelectionMilliseconds)
{
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds;
if (NewSelectionParagraph != null)
{
NewSelectionParagraph.StartTime.TotalMilliseconds = milliseconds;
_mouseMoveStartX = e.X;
}
else
{
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
}
}
else if (_mouseDownParagraphType == MouseDownParagraphType.End)
{
if (milliseconds - _mouseDownParagraph.StartTime.TotalMilliseconds > MininumSelectionMilliseconds)
{
_mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds;
if (NewSelectionParagraph != null)
{
NewSelectionParagraph.EndTime.TotalMilliseconds = milliseconds;
_mouseMoveEndX = e.X;
}
else
{
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
}
}
else if (_mouseDownParagraphType == MouseDownParagraphType.Whole)
{
double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds;
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds - _moveWholeStartDifferenceMilliseconds;
_mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds;
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
}
else
{
_mouseMoveEndX = e.X;
if (NewSelectionParagraph == null && Math.Abs(_mouseMoveEndX - _mouseMoveStartX) > 2)
{
if (AllowNewSelection)
NewSelectionParagraph = new Paragraph();
}
if (NewSelectionParagraph != null)
{
int start = Math.Min(_mouseMoveStartX, _mouseMoveEndX);
int end = Math.Max(_mouseMoveStartX, _mouseMoveEndX);
NewSelectionParagraph.StartTime.TotalSeconds = XPositionToSeconds(start);
NewSelectionParagraph.EndTime.TotalSeconds = XPositionToSeconds(end);
}
}
Invalidate();
}
}
}
private bool IsParagrapBorderHit(int milliseconds, List<Paragraph> paragraphs)
{
foreach (Paragraph p in paragraphs)
{
bool hit = IsParagrapBorderHit(milliseconds, p);
if (hit)
return true;
}
return false;
}
private bool IsParagrapBorderHit(int milliseconds, Paragraph paragraph)
{
if (paragraph == null)
return false;
return Math.Abs(milliseconds - paragraph.StartTime.TotalMilliseconds) <= ClosenessForBorderSelection ||
Math.Abs(milliseconds - paragraph.EndTime.TotalMilliseconds) <= ClosenessForBorderSelection;
}
private void WaveForm_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_mouseDown)
{
if (_mouseDownParagraph != null)
{
_mouseDownParagraph = null;
}
else
{
_mouseMoveEndX = e.X;
}
_mouseDown = false;
}
}
Cursor = Cursors.Default;
}
private void WaveForm_MouseLeave(object sender, EventArgs e)
{
Cursor = Cursors.Default;
_mouseDown = false;
Invalidate();
}
private void WaveForm_MouseEnter(object sender, EventArgs e)
{
if (_noClear)
{
_noClear = false;
}
else
{
Cursor = Cursors.Default;
_mouseDown = false;
_mouseDownParagraph = null;
_mouseMoveStartX = -1;
_mouseMoveEndX = -1;
Invalidate();
}
if (NewSelectionParagraph != null)
{
_mouseMoveStartX = SecondsToXPosition(NewSelectionParagraph.StartTime.TotalSeconds);
_mouseMoveEndX = SecondsToXPosition(NewSelectionParagraph.EndTime.TotalSeconds);
}
}
private void WaveForm_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (_wavePeaks == null || OnPositionSelected == null)
return;
_mouseDown = false;
_mouseDownParagraph = null;
_mouseMoveStartX = -1;
_mouseMoveEndX = -1;
if (e.Button == MouseButtons.Left)
{
if (OnPause != null)
OnPause.Invoke(sender, null);
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
Paragraph p = null;
if (IsParagrapHit(milliseconds, _selectedParagraph))
p = _selectedParagraph;
else if (IsParagrapHit(milliseconds, _currentParagraph))
p = _currentParagraph;
if (p == null)
{
foreach (Paragraph p2 in _previousAndNextParagraphs)
{
if (IsParagrapHit(milliseconds, p2))
{
p = p2;
break;
}
}
}
if (p != null)
{
seconds = p.StartTime.TotalSeconds;
double endSeconds = p.EndTime.TotalSeconds;
if (seconds < StartPositionSeconds)
{
StartPositionSeconds = (p.StartTime.TotalSeconds) + 0.1; // move earlier - show whole selected paragraph
}
else if (endSeconds > EndPositionSeconds)
{
double newStartPos = StartPositionSeconds + (endSeconds - EndPositionSeconds); // move later, so whole selected paragraph is visible
if (newStartPos < seconds) // but only if visibile screen is wide enough
StartPositionSeconds = newStartPos;
}
}
OnPositionSelected.Invoke(seconds, p);
}
}
private bool IsParagrapHit(int milliseconds, Paragraph paragraph)
{
if (paragraph == null)
return false;
return milliseconds >= paragraph.StartTime.TotalMilliseconds && milliseconds <= paragraph.EndTime.TotalMilliseconds;
}
private void WaveForm_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && OnTooglePlay != null)
{
int diff = Math.Abs(_mouseMoveStartX - e.X);
if (_mouseMoveStartX == -1 || _mouseMoveEndX == -1 || diff < 10 && TimeSpan.FromTicks(DateTime.Now.Ticks - _buttonDownTimeTicks).TotalSeconds < 0.25)
{
if (ModifierKeys == Keys.Shift && _selectedParagraph != null)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole)
{
if (seconds < _selectedParagraph.EndTime.TotalSeconds)
{
_mouseDownParagraph = _selectedParagraph;
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds;
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
}
return;
}
else if (ModifierKeys == Keys.Control && _selectedParagraph != null)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole)
{
if (seconds > _selectedParagraph.StartTime.TotalSeconds)
{
_mouseDownParagraph = _selectedParagraph;
_mouseDownParagraph.EndTime.TotalMilliseconds = milliseconds;
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
}
return;
}
else if (ModifierKeys == (Keys.Control | Keys.Shift) && _selectedParagraph != null)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole)
{
_mouseDownParagraph = _selectedParagraph;
if (OnTimeChangedAndOffsetRest != null)
OnTimeChangedAndOffsetRest.Invoke(seconds, _mouseDownParagraph);
}
return;
}
else if (ModifierKeys == Keys.Alt && _selectedParagraph != null)
{
double seconds = XPositionToSeconds(e.X);
int milliseconds = (int)(seconds * 1000.0);
if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole)
{
_mouseDownParagraph = _selectedParagraph;
double durationMilliseconds = _mouseDownParagraph.Duration.TotalMilliseconds;
_mouseDownParagraph.StartTime.TotalMilliseconds = milliseconds;
_mouseDownParagraph.EndTime.TotalMilliseconds = _mouseDownParagraph.StartTime.TotalMilliseconds + durationMilliseconds;
if (OnTimeChanged != null)
OnTimeChanged.Invoke(seconds, _mouseDownParagraph);
}
return;
}
if (_mouseDownParagraphType == MouseDownParagraphType.None || _mouseDownParagraphType == MouseDownParagraphType.Whole)
OnTooglePlay.Invoke(sender, null);
}
}
}
private void WaveForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Add)
{
ZoomFactor = ZoomFactor + 0.1;
if (OnZoomedChanged != null)
OnZoomedChanged.Invoke(null, null);
}
else if (e.KeyCode == Keys.Subtract)
{
ZoomFactor = ZoomFactor - 0.1;
if (OnZoomedChanged != null)
OnZoomedChanged.Invoke(null, null);
}
else if (e.Control == false && e.KeyCode == Keys.Z)
{
if (StartPositionSeconds > 0.1)
{
StartPositionSeconds -= 0.1;
OnPositionSelected.Invoke(StartPositionSeconds, null);
Invalidate();
e.SuppressKeyPress = true;
}
}
else if (e.Control == false && e.KeyCode == Keys.X)
{
if (StartPositionSeconds + 0.1 < _wavePeaks.Header.LengthInSeconds)
{
StartPositionSeconds += 0.1;
OnPositionSelected.Invoke(StartPositionSeconds, null);
Invalidate();
e.SuppressKeyPress = true;
}
}
}
void WaveForm_MouseWheel(object sender, MouseEventArgs e)
{
int delta = e.Delta;
{
StartPositionSeconds -= delta / 256.0;
if (_currentVideoPositionSeconds < StartPositionSeconds || _currentVideoPositionSeconds >= EndPositionSeconds)
OnPositionSelected.Invoke(StartPositionSeconds, null);
Invalidate();
}
}
}
}

120
src/Controls/WaveForm.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>